From 0626333610e343551f88778320a04836f2d2b406 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove formal "min" parameter to get_level() --- src/cmd1.cc | 2 +- src/lua_bind.cc | 12 ++++++++- src/lua_bind.hpp | 3 ++- src/object1.cc | 2 +- src/spells3.cc | 81 ++++++++++++++++++++++++++------------------------------ 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index f4066915..0228412f 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -2474,7 +2474,7 @@ void py_attack(int y, int x, int max_blow) /* Melkor can cast curse for you*/ if (praying_to(GOD_MELKOR)) { - int lv = get_level(MELKOR_CURSE, 100, 1); + int lv = get_level_s(MELKOR_CURSE, 100); if (lv >= 10) { diff --git a/src/lua_bind.cc b/src/lua_bind.cc index aa2c3a2a..151ba3b8 100644 --- a/src/lua_bind.cc +++ b/src/lua_bind.cc @@ -185,7 +185,7 @@ s32b spell_chance_book(s32b s) return spell_chance_school(s); } -s32b get_level(s32b s, s32b max, s32b min) +static s32b get_level_full(s32b s, s32b max, s32b min) { auto spell = spell_at(s); /** Ahah shall we use Magic device instead ? */ @@ -196,6 +196,16 @@ s32b get_level(s32b s, s32b max, s32b min) } } +s32b get_level(s32b s, s32b max) +{ + return get_level_full(s, max, 0); +} + +s32b get_level_s(int sp, int max) +{ + return get_level_full(sp, max, 1); +} + /* Level gen */ void get_map_size(const char *name, int *ysize, int *xsize) { diff --git a/src/lua_bind.hpp b/src/lua_bind.hpp index b2a6c9a7..09338949 100644 --- a/src/lua_bind.hpp +++ b/src/lua_bind.hpp @@ -14,7 +14,8 @@ extern s32b spell_chance_book(s32b s); extern s32b lua_get_level(struct spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus); extern int get_mana(s32b s); extern s32b get_power(s32b s); -extern s32b get_level(s32b s, s32b max, s32b min); +extern s32b get_level(s32b s, s32b max); +extern s32b get_level_s(int sp, int max); extern void get_level_school(struct spell_type *spell, s32b max, s32b min, s32b *level, bool_ *na); extern s32b get_level_max_stick; diff --git a/src/object1.cc b/src/object1.cc index 6bbf23e9..17a2d096 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2767,7 +2767,7 @@ static void describe_device(object_type *o_ptr) }); text_out("\nSpell level: "); - sprintf(buf, FMTs32b, get_level(o_ptr->pval2, 50, 0)); + sprintf(buf, FMTs32b, get_level(o_ptr->pval2, 50)); text_out_c(TERM_L_BLUE, buf); text_out("\nMinimum Magic Device level to increase spell level: "); diff --git a/src/spells3.cc b/src/spells3.cc index 35604f7d..b5b69598 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -192,11 +192,6 @@ s32b VARDA_CALL_ALMAREN; s32b VARDA_EVENSTAR; s32b VARDA_STARKINDLER; -static s32b get_level_s(int sp, int max) -{ - return get_level(sp, max, 1); -} - static void find_position(int y, int x, int *yy, int *xx) { int attempts = 500; @@ -628,13 +623,13 @@ casting_result demonology_demon_madness() x2 = p_ptr->px - (x1 - p_ptr->px); result = cplus(result, - project(0, 1 + get_level(DEMON_MADNESS, 4, 0), + project(0, 1 + get_level(DEMON_MADNESS, 4), y1, x1, 20 + get_level_s(DEMON_MADNESS, 200), type, PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL)); result = cplus(result, - project(0, 1 + get_level(DEMON_MADNESS, 4, 0), + project(0, 1 + get_level(DEMON_MADNESS, 4), y2, x2, 20 + get_level_s(DEMON_MADNESS, 200), type, @@ -649,7 +644,7 @@ const char *demonology_demon_madness_info() sprintf(buf, "dam " FMTs32b " rad " FMTs32b, (20 + get_level_s(DEMON_MADNESS, 200)), - (1 + get_level(DEMON_MADNESS, 4, 0))); + (1 + get_level(DEMON_MADNESS, 4))); return buf; } @@ -721,7 +716,7 @@ casting_result demonology_unholy_word() } /* Oops he is angry now */ - if (magik(30 - get_level(UNHOLY_WORD, 25, 0))) + if (magik(30 - get_level(UNHOLY_WORD, 25))) { char buf[128]; monster_desc(buf, m_ptr, 0); @@ -741,7 +736,7 @@ casting_result demonology_unholy_word() msg_format("You consume %s.", buf); heal = (m_ptr->hp * 100) / m_ptr->maxhp; - heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100; + heal = ((30 + get_level(UNHOLY_WORD, 50)) * heal) / 100; hp_player(heal); @@ -761,13 +756,13 @@ const char *demonology_unholy_word_info() static char buf[128]; sprintf(buf, "heal mhp%% of " FMTs32b "%%", - (30 + get_level(UNHOLY_WORD, 50, 0))); + (30 + get_level(UNHOLY_WORD, 50))); return buf; } casting_result demonology_demon_cloak() { - return cast(set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0))); + return cast(set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15))); } const char *demonology_demon_cloak_info() @@ -775,7 +770,7 @@ const char *demonology_demon_cloak_info() static char buf[128]; sprintf(buf, "dur " FMTs32b "+d5", - (5 + get_level(DEMON_CLOAK, 15, 0))); + (5 + get_level(DEMON_CLOAK, 15))); return buf; } @@ -844,10 +839,10 @@ casting_result demonology_discharge_minion() delete_monster_idx(c_ptr->m_idx); dam = m_ptr->hp; - dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100; - if (dam > 100 + get_level(DISCHARGE_MINION, 500, 0)) + dam = (dam * (20 + get_level(DISCHARGE_MINION, 60))) / 100; + if (dam > 100 + get_level(DISCHARGE_MINION, 500)) { - dam = 100 + get_level(DISCHARGE_MINION, 500, 0); + dam = 100 + get_level(DISCHARGE_MINION, 500); } /* We use project instead of fire_ball because we must tell it exactly where to land */ @@ -866,8 +861,8 @@ const char *demonology_discharge_minion_info() static char buf[128]; sprintf(buf, "dam " FMTs32b "%% max " FMTs32b, - (20 + get_level(DISCHARGE_MINION, 60, 0)), - (100 + get_level(DISCHARGE_MINION, 500, 0))); + (20 + get_level(DISCHARGE_MINION, 60)), + (100 + get_level(DISCHARGE_MINION, 500))); return buf; } @@ -963,7 +958,7 @@ casting_result divination_sense_hidden() { casting_result result = NO_CAST; - result = cplus(result, detect_traps(15 + get_level(SENSEHIDDEN, 40, 0))); + result = cplus(result, detect_traps(15 + get_level(SENSEHIDDEN, 40))); if (get_level_s(SENSEHIDDEN, 50) >= 15) { result = cplus(result, set_tim_invis(10 + randint(20) + get_level_s(SENSEHIDDEN, 40))); @@ -996,8 +991,8 @@ const char *divination_sense_hidden_info() casting_result divination_reveal_ways() { casting_result result = NO_CAST; - result = cplus(result, detect_doors(10 + get_level(REVEALWAYS, 40, 0))); - result = cplus(result, detect_stairs(10 + get_level(REVEALWAYS, 40, 0))); + result = cplus(result, detect_doors(10 + get_level(REVEALWAYS, 40))); + result = cplus(result, detect_stairs(10 + get_level(REVEALWAYS, 40))); return result; } @@ -1014,7 +1009,7 @@ casting_result divination_sense_monsters() { casting_result result = NO_CAST; - result = cplus(result, detect_monsters_normal(10 + get_level(SENSEMONSTERS, 40, 0))); + result = cplus(result, detect_monsters_normal(10 + get_level(SENSEMONSTERS, 40))); if (get_level_s(SENSEMONSTERS, 50) >= 30) { result = cplus(result, set_tim_esp(10 + randint(10) + get_level_s(SENSEMONSTERS, 20))); @@ -1250,7 +1245,7 @@ casting_result eru_know_the_music() casting_result eru_lay_of_protection() { - return cast(fire_ball(GF_MAKE_GLYPH, 0, 1, 1 + get_level(ERU_PROT, 2, 0))); + return cast(fire_ball(GF_MAKE_GLYPH, 0, 1, 1 + get_level(ERU_PROT, 2))); } const char *eru_lay_of_protection_info() @@ -1258,7 +1253,7 @@ const char *eru_lay_of_protection_info() static char buf[128]; sprintf(buf, "rad " FMTs32b, - (1 + get_level(ERU_PROT, 2, 0))); + (1 + get_level(ERU_PROT, 2))); return buf; } @@ -1471,7 +1466,7 @@ casting_result geomancy_call_the_elements() fire_ball(GF_ELEMENTAL_GROWTH, dir, 1, - 1 + get_level(CALL_THE_ELEMENTS, 5, 0)); + 1 + get_level(CALL_THE_ELEMENTS, 5)); return CAST_OBVIOUS; } @@ -1481,7 +1476,7 @@ const char *geomancy_call_the_elements_info() static char buf[128]; sprintf(buf, "rad " FMTs32b, - (1 + get_level(CALL_THE_ELEMENTS, 5, 0))); + (1 + get_level(CALL_THE_ELEMENTS, 5))); return buf; } @@ -2108,7 +2103,7 @@ casting_result manwe_call() if (m_idx > 0) { - monster_set_level(m_idx, 20 + get_level(MANWE_CALL, 70, 0)); + monster_set_level(m_idx, 20 + get_level(MANWE_CALL, 70)); return CAST_OBVIOUS; } @@ -3123,7 +3118,7 @@ static int water_ice_storm_damage() static int water_ice_storm_radius() { - return 1 + get_level(ICESTORM, 3, 0); + return 1 + get_level(ICESTORM, 3); } static int water_ice_storm_duration() @@ -3206,7 +3201,7 @@ static int water_vapor_damage() static int water_vapor_radius() { - return 3 + get_level(VAPOR, 9, 0); + return 3 + get_level(VAPOR, 9); } static int water_vapor_duration() @@ -3927,7 +3922,7 @@ int music_clairaudience_lasting() set_tim_esp(5); if (get_level_s(MUSIC_MIND, 50) >= 10) { - fire_ball(GF_IDENTIFY, 0, 1, 1 + get_level(MUSIC_MIND, 3, 0)); + fire_ball(GF_IDENTIFY, 0, 1, 1 + get_level(MUSIC_MIND, 3)); } return get_mana(MUSIC_MIND); } @@ -3945,7 +3940,7 @@ const char *music_clairaudience_info() if (get_level_s(MUSIC_MIND, 50) >= 10) { sprintf(buf, "rad " FMTs32b, - 1 + get_level(MUSIC_MIND, 3, 0)); + 1 + get_level(MUSIC_MIND, 3)); return buf; } else @@ -3958,8 +3953,8 @@ casting_result music_blow_spell() { fire_ball(GF_SOUND, 0, - damroll(2 + get_level(MUSIC_BLOW, 10, 0), 4 + get_level(MUSIC_BLOW, 40, 0)), - 1 + get_level(MUSIC_BLOW, 12, 0)); + damroll(2 + get_level(MUSIC_BLOW, 10), 4 + get_level(MUSIC_BLOW, 40)), + 1 + get_level(MUSIC_BLOW, 12)); return CAST_OBVIOUS; } @@ -3968,9 +3963,9 @@ const char *music_blow_info() static char buf[128]; sprintf(buf, "dam " FMTs32b "d" FMTs32b " rad " FMTs32b, - 2 + get_level(MUSIC_BLOW, 10, 0), - 4 + get_level(MUSIC_BLOW, 40, 0), - 1 + get_level(MUSIC_BLOW, 12, 0)); + 2 + get_level(MUSIC_BLOW, 10), + 4 + get_level(MUSIC_BLOW, 40), + 1 + get_level(MUSIC_BLOW, 12)); return buf; } @@ -3978,8 +3973,8 @@ casting_result music_gush_of_wind_spell() { fire_ball(GF_AWAY_ALL, 0, - 10 + get_level(MUSIC_BLOW, 40, 0), - 1 + get_level(MUSIC_BLOW, 12, 0)); + 10 + get_level(MUSIC_BLOW, 40), + 1 + get_level(MUSIC_BLOW, 12)); return CAST_OBVIOUS; } @@ -3988,8 +3983,8 @@ const char *music_gush_of_wind_info() static char buf[128]; sprintf(buf, "dist " FMTs32b " rad " FMTs32b, - 10 + get_level(MUSIC_BLOW, 40, 0), - 1 + get_level(MUSIC_BLOW, 12, 0)); + 10 + get_level(MUSIC_BLOW, 40), + 1 + get_level(MUSIC_BLOW, 12)); return buf; } @@ -4192,7 +4187,7 @@ casting_result aule_child_spell() if (m_idx) { - monster_set_level(m_idx, 20 + get_level(AULE_CHILD, 70, 0)); + monster_set_level(m_idx, 20 + get_level(AULE_CHILD, 70)); return CAST_OBVIOUS; } else @@ -4295,7 +4290,7 @@ const char *mandos_tale_of_doom_info() int call_to_the_halls_mlev() { - return 20 + get_level(MANDOS_CALL_HALLS, 70, 0); + return 20 + get_level(MANDOS_CALL_HALLS, 70); } casting_result mandos_call_to_the_halls_spell() @@ -4408,7 +4403,7 @@ const char *ulmo_draught_of_ulmonan_info() static int call_of_the_ulumuri_mlev() { - return 30 + get_level(ULMO_CALL_ULUMURI, 70, 0); + return 30 + get_level(ULMO_CALL_ULUMURI, 70); } casting_result ulmo_call_of_the_ulumuri_spell() -- cgit v1.2.3 From 5cecddb28bf224e06fc062ed430dd8322b2d3cff Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Make get_day() return std::string --- src/cmd4.cc | 5 +++-- src/util.cc | 38 ++++++++++++++++++++++++++------------ src/util.hpp | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index 4b6c040c..56728a86 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -4267,9 +4267,10 @@ void do_cmd_time() strcpy(desc, "It is a strange time."); /* Display day */ - u32b days = bst(DAY, turn) + 1; + auto days = bst(DAY, turn) + 1; + auto days_str = get_day(days); msg_format("This is the %s day of your adventure.", - get_day(days)); + days_str.c_str()); /* Message */ msg_format("The time is %d:%02d %s.", diff --git a/src/util.cc b/src/util.cc index 08af0658..8f3374d5 100644 --- a/src/util.cc +++ b/src/util.cc @@ -27,6 +27,7 @@ #include #include +#include #include using boost::algorithm::iequals; @@ -3196,7 +3197,7 @@ void repeat_check(void) * * Allow numbers of any size and save the last keypress. */ -u32b get_number(u32b def, u32b max, int y, int x, char *cmd) +static u32b get_number(u32b def, u32b max, int y, int x, char *cmd) { u32b res = def; @@ -3402,18 +3403,31 @@ s32b bst(s32b what, s32b t) } } -cptr get_day(int day) +std::string get_day(s32b day_no) { - static char buf[20]; - cptr p = "th"; - - if ((day / 10) == 1) ; - else if ((day % 10) == 1) p = "st"; - else if ((day % 10) == 2) p = "nd"; - else if ((day % 10) == 3) p = "rd"; - - sprintf(buf, "%d%s", day, p); - return (buf); + // Convert the number + std::string day(std::to_string(day_no)); + // Suffix + if ((day_no / 10) == 1) + { + return day + "th"; + } + else if ((day_no % 10) == 1) + { + return day + "st"; + } + else if ((day_no % 10) == 2) + { + return day + "nd"; + } + else if ((day_no % 10) == 3) + { + return day + "rd"; + } + else + { + return day + "th"; + } } cptr get_player_race_name(int pr, int ps) diff --git a/src/util.hpp b/src/util.hpp index bb8a64f4..6e7d74fa 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -10,7 +10,7 @@ extern bool_ input_box(cptr text, int y, int x, char *buf, int max); extern void draw_box(int y, int x, int h, int w); extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); extern cptr get_player_race_name(int pr, int ps); -extern cptr get_day(int day); +extern std::string get_day(s32b day); extern s32b bst(s32b what, s32b t); extern errr path_temp(char *buf, int max); extern FILE *my_fopen(cptr file, cptr mode); -- cgit v1.2.3 From 437b72f56737f16356ba61d769d85d85b7e70926 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Make get_player_race_name() return a std::string --- src/birth.cc | 10 ++++++---- src/files.cc | 10 +++++++--- src/notes.cc | 3 ++- src/util.cc | 12 ++++-------- src/util.hpp | 2 +- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index f3897496..db481866 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1927,7 +1927,8 @@ static bool_ player_birth_aux_ask() rmp_ptr = &race_mod_info[p_ptr->pracem]; /* Display */ - c_put_str(TERM_L_BLUE, get_player_race_name(p_ptr->prace, p_ptr->pracem), 4, 9); + auto const race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); + c_put_str(TERM_L_BLUE, race_name.c_str(), 4, 9); } } @@ -2745,8 +2746,8 @@ static bool_ player_birth_aux_auto() c_put_str(TERM_L_BLUE, player_name, 2, 9); c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9); - strnfmt(buf, 80, "%s", get_player_race_name(p_ptr->prace, p_ptr->pracem)); - c_put_str(TERM_L_BLUE, buf, 4, 9); + auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); + c_put_str(TERM_L_BLUE, player_race_name.c_str(), 4, 9); c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9); /* Label stats */ @@ -3512,9 +3513,10 @@ void save_savefile_names() * Save, use '@' intead of ':' as a separator because it cannot exists * in savefiles */ + auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); fprintf(fff, "%s@%c%s@%s, the %s %s is %s\n", game_module, (death) ? '0' : '1', player_base, player_name, - get_player_race_name(p_ptr->prace, p_ptr->pracem), + player_race_name.c_str(), spp_ptr->title, (!death) ? "alive" : "dead"); diff --git a/src/files.cc b/src/files.cc index cc168ba5..09c9f8e7 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2207,9 +2207,12 @@ void display_player(int mode) c_put_str(TERM_L_BLUE, tmp, 3, 9); } else + { c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9); - sprintf(buf, "%s", get_player_race_name(p_ptr->prace, p_ptr->pracem)); - c_put_str(TERM_L_BLUE, buf, 4, 9); + } + + auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); + c_put_str(TERM_L_BLUE, player_race_name.c_str(), 4, 9); c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9); c_put_str(TERM_L_BLUE, r_ptr->name, 6, 9); c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 7, 9); @@ -4788,11 +4791,12 @@ static void display_scores_aux(int highscore_fd, int from, int to, int note, hig for (aged = the_score.turns; isspace(*aged); aged++) /* loop */; /* Dump some info */ + auto const player_race_name = get_player_race_name(pr, ps); sprintf(out_val, "%3d.%9s %s the %s %s, Level %d", place, the_score.pts, the_score.who, - get_player_race_name(pr, ps), + player_race_name.c_str(), class_info[pc].spec[pcs].title, clev); diff --git a/src/notes.cc b/src/notes.cc index 326381c9..69269291 100644 --- a/src/notes.cc +++ b/src/notes.cc @@ -129,9 +129,10 @@ void add_note_type(int note_number) char player[100]; /* Build the string containing the player information */ + auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); sprintf(player, "the %s %s", - get_player_race_name(p_ptr->prace, p_ptr->pracem), + player_race_name.c_str(), class_info[p_ptr->pclass].spec[p_ptr->pspec].title); /* Add in "character start" information */ diff --git a/src/util.cc b/src/util.cc index 8f3374d5..efbd4e38 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3430,27 +3430,23 @@ std::string get_day(s32b day_no) } } -cptr get_player_race_name(int pr, int ps) +std::string get_player_race_name(int pr, int ps) { - static char buf[50]; - if (ps) { if (race_mod_info[ps].place) { - sprintf(buf, "%s %s", race_info[pr].title, race_mod_info[ps].title); + return std::string(race_info[pr].title) + " " + race_mod_info[ps].title; } else { - sprintf(buf, "%s %s", race_mod_info[ps].title, race_info[pr].title); + return std::string(race_mod_info[ps].title) + " " + race_info[pr].title; } } else { - sprintf(buf, "%s", race_info[pr].title); + return std::string(race_info[pr].title); } - - return (buf); } /* diff --git a/src/util.hpp b/src/util.hpp index 6e7d74fa..deddff42 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -9,7 +9,7 @@ extern bool_ input_box(cptr text, int y, int x, char *buf, int max); extern void draw_box(int y, int x, int h, int w); extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); -extern cptr get_player_race_name(int pr, int ps); +extern std::string get_player_race_name(int pr, int ps); extern std::string get_day(s32b day); extern s32b bst(s32b what, s32b t); extern errr path_temp(char *buf, int max); -- cgit v1.2.3 From f099462e0ddb5e3304b06ea1d7727bd01d82453b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove mentions of the borg --- lib/help/command.txt | 4 ++-- lib/mods/theme/help/command.txt | 4 ++-- src/defines.h | 3 --- src/files.cc | 9 --------- 4 files changed, 4 insertions(+), 16 deletions(-) diff --git a/lib/help/command.txt b/lib/help/command.txt index 04a63fd8..d39cc861 100644 --- a/lib/help/command.txt +++ b/lib/help/command.txt @@ -136,7 +136,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*72[, Stay still (with pickup)] ^W (special - wizard mode) *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit] *****command.txt*76[. Run] ^Y (unused) - *****command.txt*77[> Go down staircase] ^Z (special - borg command) + *****command.txt*77[> Go down staircase] ^Z (unused) *****command.txt*79[\ (special - bypass keymap)] *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge] *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help] @@ -197,7 +197,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*76[, Run] ^W (special - wizard mode) *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit] *****command.txt*72[. Stay still (with pickup)] *****command.txt*95[^Y (tunnel - north west)] - *****command.txt*77[> Go down staircase] ^Z (special - borg command) + *****command.txt*77[> Go down staircase] ^Z (unused) *****command.txt*79[\ (special - bypass keymap)] *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge] *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help] diff --git a/lib/mods/theme/help/command.txt b/lib/mods/theme/help/command.txt index 04a63fd8..d39cc861 100644 --- a/lib/mods/theme/help/command.txt +++ b/lib/mods/theme/help/command.txt @@ -136,7 +136,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*72[, Stay still (with pickup)] ^W (special - wizard mode) *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit] *****command.txt*76[. Run] ^Y (unused) - *****command.txt*77[> Go down staircase] ^Z (special - borg command) + *****command.txt*77[> Go down staircase] ^Z (unused) *****command.txt*79[\ (special - bypass keymap)] *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge] *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help] @@ -197,7 +197,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*76[, Run] ^W (special - wizard mode) *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit] *****command.txt*72[. Stay still (with pickup)] *****command.txt*95[^Y (tunnel - north west)] - *****command.txt*77[> Go down staircase] ^Z (special - borg command) + *****command.txt*77[> Go down staircase] ^Z (unused) *****command.txt*79[\ (special - bypass keymap)] *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge] *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help] diff --git a/src/defines.h b/src/defines.h index fc1f61f5..b722d29a 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2062,9 +2062,6 @@ /* xxx */ #define PW_SNAPSHOT 0x00000800L /* Display snap-shot */ /* xxx */ -/* xxx */ -#define PW_BORG_1 0x00004000L /* Display borg messages */ -#define PW_BORG_2 0x00008000L /* Display borg status */ /* jk */ diff --git a/src/files.cc b/src/files.cc index 09c9f8e7..558cfcab 100644 --- a/src/files.cc +++ b/src/files.cc @@ -5095,15 +5095,6 @@ static errr top_twenty(void) goto out; } - /* Borg-mode pre-empts scoring */ - if (noscore & 0x00F0) - { - msg_print("Score not registered for borgs."); - msg_print(NULL); - display_scores_aux(highscore_fd, 0, 10, -1, NULL); - goto out; - } - /* Cheaters are not scored */ if (noscore & 0xFF00) { -- cgit v1.2.3 From 959f8c09f32e6b431bc4f7af8d1a5c296cefdafe Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove unused dungeon_info_type::next --- lib/edit/d_info.txt | 58 +++++++++++++++---------------- lib/mods/theme/edit/d_info.txt | 78 +++++++++++++++++++++--------------------- src/dungeon_info_type.hpp | 1 - src/generate.cc | 22 +----------- src/init1.cc | 7 ++-- 5 files changed, 72 insertions(+), 94 deletions(-) diff --git a/lib/edit/d_info.txt b/lib/edit/d_info.txt index 24526ea2..5c411d7c 100644 --- a/lib/edit/d_info.txt +++ b/lib/edit/d_info.txt @@ -12,7 +12,7 @@ # N:: # D:<3 letter short name>: -# W:::::: +# W::::: # L::<%1>::<%2>::<%3> # A::<%1>::<%2>::<%3>:: # O:<%treasure>:<%combat>:<%magic>:<%tools> @@ -33,7 +33,7 @@ N:0:Wilderness D:Wil:a way to the Wilderness -W:0:0:0:0:14:500 +W:0:0:0:14:500 L:89:80:199:20:1:0 A:96:100:56:0:56:0:57:58 O:20:20:20:20 @@ -44,7 +44,7 @@ R:100:0 N:1:Mirkwood D:Mkw:a way to the Mirkwood Forest. -W:11:33:5:0:14:160 +W:11:33:5:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 @@ -54,7 +54,7 @@ R:100:0 N:2:Mordor D:Mdr:a door to the Land of Mordor. -W:34:66:15:0:14:160 +W:34:66:15:14:160 L:88:67:93:33:1:0 L:0:100:0 A:97:50:56:50:56:0:57:97 @@ -66,7 +66,7 @@ R:100:0 N:3:Angband D:Ang:an entrance to the Pits of Angband. -W:67:127:30:0:14:160 +W:67:127:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 @@ -77,7 +77,7 @@ R:100:0 N:4:Barrow-Downs D:BDw:a way to the Barrow-Downs. -W:1:10:1:0:14:160 +W:1:10:1:14:160 L:88:78:89:18:199:4 L:0:95:5 A:96:34:97:66:56:0:57:97 @@ -95,7 +95,7 @@ R:75:0 # Levels 85-99 N:5:Mount Doom D:MDm:a way to the top of the Mount Doom. -W:85:99:18:0:14:160 +W:85:99:18:14:160 L:86:90:205:10:1:0 A:177:100:0:0:0:0:85:87 O:10:10:30:30 @@ -110,7 +110,7 @@ M:IM_FIRE # guarded by Tik'srvzllat, who has the Ring of Phasing N:6:Nether Realm D:Nth:a magical portal to the Nether Realm. -W:666:696:40:0:14:160 +W:666:696:40:14:160 L:102:80:86:15:85:5 A:85:80:87:20:87:0:57:85 A:50:50:0 @@ -129,7 +129,7 @@ M:RES_NETH | R_CHAR_G | R_CHAR_W | R_CHAR_U # guarded by Ar-Pharazon the Golden, who has the stone "Toris Mejistos". N:7:Submerged Ruins D:Num:a submerged way to the lost land of Numenor. -W:35:50:25:0:14:160 +W:35:50:25:14:160 L:84:95:187:5:1:0 A:187:80:84:10:56:10:57:187 A:60:0:40 @@ -145,7 +145,7 @@ M:AQUATIC | CAN_SWIM | CAN_FLY # Used for astral mode N:8:Halls of Mandos D:HMa:*A BUG*YOU should see this message!* -W:1:98:1:0:14:160 +W:1:98:1:14:160 L:1:100:1:0:1:0 O:20:20:20:20 A:56:100:56:0:56:0:57:58 @@ -159,7 +159,7 @@ M:UNIQUE # guarded by Shelob. N:9:Cirith Ungol D:CUg:an entrance to Cirith Ungol. -W:25:50:10:0:14:160 +W:25:50:10:14:160 L:87:5:88:65:16:30 A:97:90:16:10:56:0:16:58 O:30:30:30:10 @@ -178,7 +178,7 @@ M:ORC | R_CHAR_w | R_CHAR_m | R_CHAR_j # guarded by Golgarach, the Living Rock N:10:Heart of the Earth D:HoE:a passage leading into the very heart of the world. -W:25:36:10:0:14:160 +W:25:36:10:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:40:10:10:20 @@ -195,7 +195,7 @@ R:30:0 # Where Melkor lurks for the final battle! N:11:The Void D:Vod:a jumpgate to the Void -W:128:150:40:0:20:160 +W:128:150:40:20:160 L:183:97:102:3:0:0 A:183:90:102:10:0:0:102:102 A:40:60:0 @@ -212,7 +212,7 @@ M:UNDEAD | DEMON | DRAGON | NONLIVING | SPIRIT # TEST dungeon N:12:Test D:Tst:a way to test dungeon gen -W:1:10:1:0:14:160 +W:1:10:1:14:160 L:88:78:89:18:199:4 L:0:95:5 A:177:100:0:0:0:0:85:87 @@ -228,7 +228,7 @@ G:dungeon2 # Feagwath is there, guarding Doomcaller N:16:Paths of the Dead D:PoD:the entrance to the Paths of the Dead. -W:40:70:18:0:24:100 +W:40:70:18:24:100 L:88:85:84:15:1:0 A:56:75:87:25:56:0:57:58 O:30:30:30:2 @@ -246,7 +246,7 @@ M:UNDEAD | NONLIVING # Guarded by The Glass Golem guarding The Helm of Knowledge N:17:Illusory Castle D:Ill:an entrance to the Illusory Castle. -W:35:52:10:0:24:100 +W:35:52:10:24:100 L:1:98:188:2:1:0 A:56:50:189:50:56:0:57:58 O:50:10:20:20 @@ -265,7 +265,7 @@ S:BR_CONF | BR_CHAO | BA_CHAO | CONF | FORGET | TRAPS | MULTIPLY # Guarded by The Minotaur of the Labyrinth with the Steel Helm of Hammerhand N:18:Maze D:Maz:a small tunnel leading to a maze of twisty little passages, all alike. -W:25:37:15:0:20:160 +W:25:37:15:20:160 L:1:100:1:0:1:0 A:56:98:48:2:56:0:57:58 O:2:40:10:40 @@ -281,7 +281,7 @@ M:R_CHAR_p # There is Azog with the Wand of Thrain at the bottom N:19:Orc Cave D:Orc:a dark tunnel leading to an Orc Cave. -W:10:22:8:0:35:200 +W:10:22:8:35:200 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:5:50:10:25 @@ -299,7 +299,7 @@ M:ORC | R_CHAR_k | R_CHAR_o | R_CHAR_O # There is Glaurung N:20:Erebor D:Ere:a tunnel leading into depths of the Lonely Mountain. -W:60:72:30:0:20:140 +W:60:72:30:20:140 L:88:100:1:0:1:0 A:97:90:87:10:56:0:57:97 O:40:40:40:40 @@ -317,7 +317,7 @@ M:DRAGON | R_CHAR_d # Old Man Willow protects it N:21:The Old Forest D:OFr:a path into the Old Forest. -W:13:25:5:0:15:100 +W:13:25:5:15:100 L:88:76:84:16:199:8 L:68:16:16 A:96:100:56:0:56:0:202:96 @@ -336,7 +336,7 @@ M:UNDEAD | R_CHAR_h # There is Durin's Bane N:22:Moria D:MoM:a stone door leading to the Mines of Moria. -W:30:50:20:0:40:40 +W:30:50:20:40:40 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:30:50:10:5 @@ -358,7 +358,7 @@ R:10:0 # The Necromancer (weak Sauron) at the bottom, with the Ring of Durin N:23:Dol Guldur D:TDG:a gate leading to the tower of Dol Guldur. -W:57:70:34:0:24:160 +W:57:70:34:24:160 L:1:80:174:20:1:0 A:56:100:56:0:56:0:57:58 O:20:1:70:9 @@ -381,7 +381,7 @@ R:10:0 # The Watcher in the Water is at the bottom N:24:The Small Water Cave D:SWC:the entrance to a small water cave. -W:32:34:20:0:14:160 +W:32:34:20:14:160 L:84:100:84:0:84:0 A:97:100:56:0:56:0:57:58 O:10:10:30:30 @@ -403,7 +403,7 @@ M:IM_COLD # Levels 45-70 N:25:The Sacred Land Of Mountains D:LoM:the way to the Sacred Land of Mountains. -W:45:70:20:0:14:160 +W:45:70:20:14:160 L:89:100:89:0:89:0 A:97:100:56:0:56:0:97:97 O:20:20:20:20 @@ -419,7 +419,7 @@ R:40:0 # Guarded by Ulfang the Black, Morgoth's first Easterling follower. N:26:The Land Of Rhun D:LoR:a way to the Land of Rhun. -W:26:40:15:0:14:160 +W:26:40:15:14:160 L:89:100:1:0:1:0 A:89:50:96:25:84:25:57:58 O:20:20:20:20 @@ -436,7 +436,7 @@ R:40:0 # guarded by the Sandworm Queen (and her children), who will drop her armour N:27:The Sandworm lair D:SwL:a sandhole. -W:22:30:12:0:5:200 +W:22:30:12:5:200 L:91:85:94:10:93:5 A:98:100:96:0:84:0:94:94 O:15:5:60:20 @@ -451,7 +451,7 @@ S:MULTIPLY # Used by the death fate N:28:Death fate D:Dth:a fated death. -W:1:1:1:0:30:255 +W:1:1:1:30:255 L:1:100:1:0:1:0 A:1:100:1:0:1:0:1:1 O:1:1:1:1 @@ -464,7 +464,7 @@ R:100:0 # Guarded by the White Balrog N:29:The Helcaraxe D:Ice:the entrance to the Grinding Ice of the Helcaraxe. -W:20:40:10:0:14:160 +W:20:40:10:14:160 L:90:0:88:70:84:30 L:90:0:10 A:95:0:56:100:56:0:57:58 @@ -483,7 +483,7 @@ M:IM_COLD # See god.lua for details N:30:a lost temple D:LTm:the entrance to a lost temple. -W:1:50:1:0:14:160 +W:1:50:1:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 diff --git a/lib/mods/theme/edit/d_info.txt b/lib/mods/theme/edit/d_info.txt index f5d836f6..7a8cbcdc 100644 --- a/lib/mods/theme/edit/d_info.txt +++ b/lib/mods/theme/edit/d_info.txt @@ -12,7 +12,7 @@ # N:: # D:<3 letter short name>: -# W:::::: +# W::::: # L::<%1>::<%2>::<%3> # A::<%1>::<%2>::<%3>:: # O:<%treasure>:<%combat>:<%magic>:<%tools> @@ -33,7 +33,7 @@ N:0:Wilderness D:Wil:a way to the Wilderness -W:0:0:0:0:14:500 +W:0:0:0:14:500 L:89:80:199:20:1:0 A:96:100:56:0:56:0:57:58 O:20:20:20:20 @@ -44,7 +44,7 @@ R:100:0 N:1:Mirkwood D:Mkw:a way to the Mirkwood Forest. -W:11:33:5:0:14:160 +W:11:33:5:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 @@ -54,7 +54,7 @@ R:100:0 N:2:Barad-Dur D:BDr:a door to the tower of Barad-Dur. -W:34:66:15:0:14:160 +W:34:66:15:14:160 L:88:67:93:33:1:0 L:0:100:0 A:97:50:56:50:56:0:57:97 @@ -66,7 +66,7 @@ R:100:0 N:3:Angband D:Ang:an entrance to the Pits of Angband. -W:67:100:30:0:14:160 +W:67:100:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 @@ -77,7 +77,7 @@ R:100:0 N:4:Barrow-Downs D:BDw:a way to the Barrow-Downs. -W:1:10:1:0:14:160 +W:1:10:1:14:160 # Theme adds *fog* (dense mist) on the Barrow-Downs :) #L:88:94:210:2:199:4 L:88:78:89:18:199:4 @@ -96,7 +96,7 @@ R:75:0 # Levels 85-99 N:5:Orodruin D:MDm:a way to the top of the Mount Doom. -W:85:99:18:0:14:160 +W:85:99:18:14:160 L:86:90:205:10:1:0 A:177:100:0:0:0:0:85:87 O:10:10:30:30 @@ -111,7 +111,7 @@ M:IM_FIRE # guarded by Tik'srvzllat, who has the Ring 'Fuin' N:6:Nether Realm D:Nth:a magical portal to the Nether Realm. -W:666:696:40:0:14:160 +W:666:696:40:14:160 L:102:80:86:15:85:5 A:85:80:87:20:87:0:57:85 A:50:50:0 @@ -130,7 +130,7 @@ M:RES_NETH | R_CHAR_G | R_CHAR_W | R_CHAR_U # guarded by Ar-Pharazon the Golden, who has the stone "Coimir". N:7:Submerged Ruins D:Num:a submerged way to the lost land of Numenor. -W:35:50:25:0:14:160 +W:35:50:25:14:160 L:84:95:187:5:1:0 A:187:80:84:10:56:10:57:187 A:60:0:40 @@ -146,7 +146,7 @@ M:AQUATIC | CAN_SWIM | CAN_FLY # Used for astral mode N:8:Halls of Waiting D:HWa:*A BUG*YOU should see this message!* -W:1:98:1:0:14:160 +W:1:98:1:14:160 L:1:100:1:0:1:0 O:20:20:20:20 A:56:100:56:0:56:0:57:58 @@ -161,7 +161,7 @@ M:UNIQUE # Updated for Theme to lead out into Gorgoroth a la Moria N:9:Cirith Ungol D:CUg:an entrance to Cirith Ungol. -W:25:50:10:0:14:160 +W:25:50:10:14:160 L:87:5:88:65:16:30 A:97:90:16:10:56:0:16:58 O:30:30:30:10 @@ -182,7 +182,7 @@ M:ORC | R_CHAR_w | R_CHAR_m | R_CHAR_j # guarded by Golgarach, the Living Rock N:10:Heart of the Earth D:HoE:a passage leading into the very heart of the world. -W:25:36:10:0:14:160 +W:25:36:10:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:40:10:10:20 @@ -199,7 +199,7 @@ R:30:0 # Where Melkor lurks for the final battle! N:11:The Void D:Vod:a jumpgate to the Void -W:128:150:40:0:20:160 +W:128:150:40:20:160 L:183:97:102:3:0:0 A:183:90:102:10:0:0:102:102 A:40:60:0 @@ -216,7 +216,7 @@ M:UNDEAD | DEMON | DRAGON | NONLIVING | SPIRIT # TEST dungeon N:12:Test D:Tst:a way to test dungeon gen -W:1:10:1:0:14:160 +W:1:10:1:14:160 L:88:78:89:18:199:4 L:0:95:5 A:177:100:0:0:0:0:85:87 @@ -232,7 +232,7 @@ G:dungeon2 # Feagwath is there, guarding Doomcaller N:16:Paths of the Dead D:PoD:the entrance to the Paths of the Dead. -W:40:70:18:0:24:100 +W:40:70:18:24:100 L:88:85:84:15:1:0 A:56:75:87:25:56:0:57:58 O:30:30:30:2 @@ -250,7 +250,7 @@ M:UNDEAD | NONLIVING # Guarded by The Glass Golem guarding The Helm of Knowledge N:17:Illusory Castle D:Ill:an entrance to the Illusory Castle. -W:35:52:10:0:24:100 +W:35:52:10:24:100 L:1:98:188:2:1:0 A:56:50:189:50:56:0:57:58 O:50:10:20:20 @@ -269,7 +269,7 @@ S:BR_CONF | BR_CHAO | BA_CHAO | CONF | FORGET | TRAPS | MULTIPLY # Guarded by The Minotaur of the Labyrinth with the Steel Helm of Hammerhand N:18:Maze D:Maz:a small tunnel leading to a maze of twisty little passages, all alike. -W:25:37:15:0:20:160 +W:25:37:15:20:160 L:1:100:1:0:1:0 A:56:98:48:2:56:0:57:58 O:2:40:10:40 @@ -285,7 +285,7 @@ M:R_CHAR_p # There is Azog with the Wand of Thrain at the bottom N:19:Orc Cave D:Orc:a dark tunnel leading to an Orc Cave. -W:10:22:8:0:35:200 +W:10:22:8:35:200 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:5:50:10:25 @@ -305,7 +305,7 @@ M:ORC | R_CHAR_o | R_CHAR_O # There is Glaurung N:20:Erebor D:Ere:a tunnel leading into depths of the Lonely Mountain. -W:60:72:30:0:20:140 +W:60:72:30:20:140 L:88:100:1:0:1:0 A:97:90:87:10:56:0:57:97 O:40:40:40:40 @@ -323,7 +323,7 @@ M:DRAGON | R_CHAR_d # Old Man Willow protects it N:21:The Old Forest D:OFr:a path into the Old Forest. -W:13:25:5:0:15:100 +W:13:25:5:15:100 L:88:76:84:16:199:8 L:68:16:16 A:96:100:56:0:56:0:202:96 @@ -342,7 +342,7 @@ M:UNDEAD | R_CHAR_h | R_CHAR_l # There is Durin's Bane N:22:Moria D:MoM:a stone door leading to the Mines of Moria. -W:30:50:20:0:40:40 +W:30:50:20:40:40 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:30:50:10:5 @@ -364,7 +364,7 @@ R:10:0 # The Necromancer (weak Sauron) at the bottom, with the Ring of Durin N:23:Dol Guldur D:TDG:a gate leading to the tower of Dol Guldur. -W:57:70:34:0:24:160 +W:57:70:34:24:160 L:1:80:174:20:1:0 A:56:100:56:0:56:0:57:58 O:20:1:70:9 @@ -387,7 +387,7 @@ R:10:0 # The Watcher in the Water is at the bottom N:24:The Small Water Cave D:SWC:the entrance to a small water cave. -W:32:34:20:0:14:160 +W:32:34:20:14:160 L:84:100:84:0:84:0 A:97:100:56:0:56:0:57:58 O:10:10:30:30 @@ -409,7 +409,7 @@ M:IM_COLD # Levels 45-70 N:25:The Sacred Land Of Mountains D:LoM:the way to the Sacred Land of Mountains. -W:45:70:20:0:14:160 +W:45:70:20:14:160 L:89:100:89:0:89:0 A:97:100:56:0:56:0:97:97 O:20:20:20:20 @@ -425,7 +425,7 @@ R:40:0 # Guarded by Ulfang the Black, Morgoth's first Easterling follower. N:26:The Land Of Rhun D:LoR:a way to the Land of Rhun. -W:26:40:15:0:14:160 +W:26:40:15:14:160 L:89:100:1:0:1:0 A:89:50:96:25:84:25:57:58 O:20:20:20:20 @@ -442,7 +442,7 @@ R:40:0 # guarded by the Sandworm Queen (and her children), who will drop her armour N:27:The Withered Heath D:SwL:the Withered Heath, from whence came the Great Worms. -W:22:30:12:0:5:200 +W:22:30:12:5:200 L:91:85:94:10:93:5 A:98:100:96:0:84:0:94:94 O:15:5:60:20 @@ -457,7 +457,7 @@ S:MULTIPLY # Used by the death fate N:28:Death fate D:Dth:a fated death. -W:1:1:1:0:30:255 +W:1:1:1:30:255 L:1:100:1:0:1:0 A:1:100:1:0:1:0:1:1 O:1:1:1:1 @@ -470,7 +470,7 @@ R:100:0 # Guarded by Elenwe the Lost N:29:The Helcaraxe D:Ice:the entrance to the Grinding Ice of the Helcaraxe. -W:20:40:10:0:14:160 +W:20:40:10:14:160 L:90:0:88:70:84:30 L:90:0:10 A:95:0:56:100:56:0:57:58 @@ -489,7 +489,7 @@ M:IM_COLD # See god.lua for details N:30:a Lost Temple D:LTm:the entrance to a lost temple. -W:1:50:1:0:14:160 +W:1:50:1:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 @@ -504,7 +504,7 @@ R:100:0 # Guarded by The Hunter N:31:Forodwaith D:NWa:a path leading through the wastelands of the North -W:75:80:40:0:14:160 +W:75:80:40:14:160 # ice, ash, and dirt L:90:20:93:40:88:40 #Ugly - using floor tiles for walls, only rooms have real walls @@ -524,7 +524,7 @@ M:COLD_BLOOD | HURT_LITE | IM_COLD # Guarded by Naugladur, who has Nauglamir N:32:Emyn Luin D:ELu:a path into the depths of the Blue Mountains -W:60:70:30:0:14:160 +W:60:70:30:14:160 # grass, flowers, and dirt L:89:45:81:5:88:50 # blue mountains, granite, hailstones @@ -544,7 +544,7 @@ M:R_CHAR_k | R_CHAR_o #Guarded by Prince Imrahil (yes, he's evil in this game) N:33:Dol Amroth D:DAm:a way to the top of the castle of Dol Amroth -W:25:35:15:0:14:160 +W:25:35:15:14:160 # Vanilla-style L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 @@ -563,7 +563,7 @@ M:SMART | TAKE_ITEM #Guarded by Fuinur, who has Eowyn's sword N:34:Angmar D:WRA:a dark path through the Witch Realm of Angmar -W:80:90:49:0:14:160 +W:80:90:49:14:160 # Tainted, dark, evil L:93:70:174:20:226:10 # Dark mountain chains only @@ -584,7 +584,7 @@ M:RES_DISE | UNDEAD | DEMON | NONLIVING #Guarded by Herumor, who has the heavy crossbow of Umbar N:35:Near Harad D:NHa:a desert path into Near Harad -W:20:25:15:0:14:160 +W:20:25:15:14:160 #It's a desert, so sand and only sand L:91:100:91:0:91:0 #Ugly - using floor tiles for walls, only rooms have real walls @@ -606,7 +606,7 @@ M:WILD_TOO | R_CHAR_p #It ends in a special level with the Palantir of Orthanc and Sharkey N:36:Isengard D:Isg:a passage to the caves beneath Isengard -W:35:40:20:0:14:160 +W:35:40:20:14:160 # Like the Orc caves L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 @@ -624,7 +624,7 @@ M:ORC | R_CHAR_o | R_CHAR_O # Guarded by Marda and the Robe of Belegaer N:37:Tol Eressea D:TEr:a way to the Lonely Isle -W:40:45:40:0:14:160 +W:40:45:40:14:160 # shallow water, lilies L:84:60:222:40:222:0 # Going to have to add walls here to avoid being overly nasty @@ -644,7 +644,7 @@ M:R_CHAR_B #Guarded by no one (yet!) N:38:Utumno D:Utu:an entrance to the depths of Utumno -W:101:127:30:0:14:160 +W:101:127:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 @@ -657,7 +657,7 @@ R:100:0 # just one special level that later becomes a different one, sans princess. N:39:Bilbo's trail D:Btr:a trail left by a fleeing hobbit -W:10:10:1:0:14:160 +W:10:10:1:14:160 L:88:94:210:2:199:4 A:96:80:97:19:57:1:57:97 A:100:0:0 @@ -672,7 +672,7 @@ R:75:0 # just one special level that later becomes a different one, sans princess. N:40:Thorin's trail D:Ttr:a trail left by a purposeful dwarf -W:33:33:15:0:14:160 +W:33:33:15:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index 5f6fc9d0..b7b61a53 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -38,7 +38,6 @@ struct dungeon_info_type s16b maxdepth; /* Maximal depth */ bool_ principal; /* If it's a part of the main dungeon */ - byte next; /* The next part of the main dungeon */ byte min_plev; /* Minimal plev needed to enter -- it's an anti-cheating mesure */ int min_m_alloc_level; /* Minimal number of monsters per level */ diff --git a/src/generate.cc b/src/generate.cc index b5733682..9fc71763 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -419,19 +419,6 @@ static void place_up_stairs(int y, int x) } -/* - * Convert existing terrain type to "down stairs" with dungeon changing. - */ -static void place_magical_stairs(int y, int x, byte next) -{ - cave_type *c_ptr = &cave[y][x]; - - /* Create up stairs */ - cave_set_feat(y, x, FEAT_MORE); - c_ptr->special = next; -} - - /* * Convert existing terrain type to "down stairs" */ @@ -907,14 +894,7 @@ static void place_random_stairs(int y, int x) } else if (dun_level >= d_info[dungeon_type].maxdepth) { - if (d_info[dungeon_type].next) - { - place_magical_stairs(y, x, d_info[dungeon_type].next); - } - else - { - place_up_stairs(y, x); - } + place_up_stairs(y, x); } else if (rand_int(100) < 50) { diff --git a/src/init1.cc b/src/init1.cc index 7083a5f3..9d221c01 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -7876,18 +7876,17 @@ errr init_d_info_txt(FILE *fp) if (buf[0] == 'W') { int min_lev, max_lev; - int min_plev, next; + int min_plev; int min_alloc, max_chance; /* Scan for the values */ - if (6 != sscanf(buf + 2, "%d:%d:%d:%d:%d:%d", - &min_lev, &max_lev, &min_plev, &next, &min_alloc, &max_chance)) return (1); + if (5 != sscanf(buf + 2, "%d:%d:%d:%d:%d", + &min_lev, &max_lev, &min_plev, &min_alloc, &max_chance)) return (1); /* Save the values */ d_ptr->mindepth = min_lev; d_ptr->maxdepth = max_lev; d_ptr->min_plev = min_plev; - d_ptr->next = next; d_ptr->min_m_alloc_level = min_alloc; d_ptr->max_m_alloc_chance = max_chance; -- cgit v1.2.3 From 814b55d60ed50ae3fe6b5ca00129e76f3988b696 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Use explicit cast to avoid warnings --- src/util.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util.cc b/src/util.cc index efbd4e38..b7863f1a 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3456,7 +3456,7 @@ int ask_menu(cptr ask, const std::vector &items) { int ret = -1, i, start = 0; char c; - int size = items.size(); // Convert to int to avoid warnings + int size = static_cast(items.size()); // Convert to int to avoid warnings /* Enter "icky" mode */ character_icky = TRUE; -- cgit v1.2.3 From 372e4083c524f176a790655870464c650f4213aa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove '-n' command line switch --- src/dungeon.cc | 9 +++------ src/dungeon.h | 2 +- src/main.c | 12 +----------- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index 3ec79068..bff82d12 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -5092,12 +5092,8 @@ static void load_all_pref_files(void) /* * Actually play a game - * - * If the "new_game" parameter is true, then, after loading the - * savefile, we will commit suicide, if necessary, to allow the - * player to start a new game. */ -void play_game(bool_ new_game) +void play_game() { int i, tmp_dun; @@ -5129,7 +5125,8 @@ void play_game(bool_ new_game) (void)Term_set_cursor(0); /* Character list */ - if (!new_game && !no_begin_screen) new_game = begin_screen(); + bool_ new_game = FALSE; + if (!no_begin_screen) new_game = begin_screen(); no_begin_screen = FALSE; /* Attempt to load */ diff --git a/src/dungeon.h b/src/dungeon.h index 1ce166d1..43515f9a 100644 --- a/src/dungeon.h +++ b/src/dungeon.h @@ -7,7 +7,7 @@ extern "C" { #endif -extern void play_game(bool_ new_game); +extern void play_game(); #ifdef __cplusplus } // extern "C" diff --git a/src/main.c b/src/main.c index 680e5c5a..f6379624 100644 --- a/src/main.c +++ b/src/main.c @@ -109,8 +109,6 @@ int main(int argc, char *argv[]) bool_ done = FALSE; - bool_ new_game = FALSE; - cptr mstr = NULL; bool_ args = TRUE; @@ -134,13 +132,6 @@ int main(int argc, char *argv[]) /* Analyze option */ switch (argv[i][1]) { - case 'N': - case 'n': - { - new_game = TRUE; - break; - } - case 'W': case 'w': { @@ -236,7 +227,6 @@ usage: printf("\n"); puts("Usage: tome [options] [-- subopts]"); puts(" -h This help"); - puts(" -n Start a new character"); puts(" -w Request wizard mode"); puts(" -o Request original keyset"); puts(" -r Request rogue-like keyset"); @@ -362,7 +352,7 @@ usage: pause_line(23); /* Play the game */ - play_game(new_game); + play_game(); /* Quit */ quit(NULL); -- cgit v1.2.3 From f37c4865eaaa266c5c2857ff3fbdb4efecdbe77f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove '-H' command line switch --- src/files.cc | 312 ----------------------------------------------------------- src/files.h | 1 - src/main.c | 21 ---- 3 files changed, 334 deletions(-) diff --git a/src/files.cc b/src/files.cc index 558cfcab..64112efa 100644 --- a/src/files.cc +++ b/src/files.cc @@ -3501,318 +3501,6 @@ bool_ show_file(cptr name, cptr what, int line, int mode) return (TRUE); } -bool_ txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool_ force, bool_ recur) -{ - int i, x; - - /* Number of "real" lines passed by */ - int next = 0; - - char buf_name[80]; - - /* Color of the next line */ - byte color = TERM_WHITE; - - /* Current help file */ - FILE *fff = NULL; - - /* Current aux file */ - FILE *aux = NULL; - - /* Current html file */ - FILE *htm = NULL; - - cptr file_ext = "html"; - cptr link_prefix = ""; - cptr link_suffix = ""; - - /* Pointer to general buffer in the above */ - char *buf; - - /* Allocate hyperlink data */ - std::unique_ptr h_ptr(new hyperlink_type); - memset(h_ptr.get(), 0, sizeof(hyperlink_type)); - - /* Setup buffer pointer */ - buf = h_ptr->rbuf; - - /* Wipe the links */ - for (i = 0; i < MAX_LINKS; i++) - { - h_ptr->link_x[i] = -1; - } - - sprintf(buf_name, "%s.%s", base, file_ext); - - if ((!force) && file_exist(buf_name)) return FALSE; - - /* Build the filename */ - path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name); - - /* Open the file */ - htm = my_fopen(h_ptr->path, "w"); - - sprintf(buf_name, "%s.%s", base, ext); - - /* h_ptr->caption */ - sprintf(h_ptr->caption, "Help file '%s'", buf_name); - - /* Build the filename */ - path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name); - - /* Open the file */ - fff = my_fopen(h_ptr->path, "r"); - - /* Oops */ - if (!fff || !htm) - { - my_fclose(fff); - my_fclose(htm); - - /* Oops */ - return (TRUE); - } - - /* Build the filename */ - path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, head); - - /* Open the file */ - aux = my_fopen(h_ptr->path, "r"); - - /* Copy the header */ - if (aux) - { - while (TRUE) - { - char *find; - - if (my_fgets(aux, h_ptr->rbuf, 1024)) break; - find = strstr(h_ptr->rbuf, "%t"); - if (find != NULL) - { - *find = '\0'; - find += 2; - fprintf(htm, "%s", h_ptr->rbuf); - fprintf(htm, "%s", base); - fprintf(htm, "%s\n", find); - } - else - fprintf(htm, "%s\n", h_ptr->rbuf); - } - my_fclose(aux); - } - - /* Display the file */ - while (TRUE) - { - bool_ do_color = FALSE; - - /* Skip a line */ - if (my_fgets(fff, h_ptr->rbuf, 1024)) break; - - color = TERM_WHITE; - - { - int print_x; - - /* Get a color */ - if (prefix(h_ptr->rbuf, "#####")) - { - color = color_char_to_attr(h_ptr->rbuf[5]); - do_color = TRUE; - fprintf(htm, "", - angband_color_table[color][1], - angband_color_table[color][2], - angband_color_table[color][3]); - buf = &h_ptr->rbuf[6]; - } - else buf = h_ptr->rbuf; - - /* Count the "real" lines */ - next++; - - /* Skip link colors */ - if (prefix(buf, "|||||")) continue; - - /* Skip tags */ - if (prefix(buf, "~~~~~")) - { - int i; - - for (i = 5; (buf[i] >= '0') && (buf[i] <= '9'); i++) - ; - buf[i] = '\0'; - fprintf(htm, "", buf + 5); - continue; - } - - /* Dump the line */ - print_x = 0; - if (!prefix(buf, "&&&&&")) - { - x = 0; - while (buf[x]) - { - /* Hyperlink ? */ - if (prefix(buf + x, "*****")) - { - int xx = x + 5, z = 0; - char buff[80]; - char link_line[80], *s; - - if (buf[xx] == '/') xx += 2; - - /* Zap the link info */ - while (buf[xx] != '*') - { - buff[z++] = buf[xx]; - xx++; - } - xx++; - buff[z] = '\0'; - - /* Zap the link info */ - z = 0; - while (buf[xx] != '[') - { - link_line[z++] = buf[xx]; - xx++; - } - xx++; - link_line[z] = '\0'; - - /* parse it */ - s = buff; - while (*s != '.') s++; - *s = '\0'; - s++; - if (recur) txt_to_html(head, foot, buff, s, FALSE, recur); - - if (atoi(link_line)) fprintf(htm, "", link_prefix, buff, file_ext, link_suffix, atoi(link_line)); - else fprintf(htm, "", link_prefix, buff, file_ext, link_suffix); - - /* Ok print the link name */ - while (buf[xx] != ']') - { - /* Now we treat the next char as printable */ - if (buf[xx] == '\\') - xx++; - fprintf(htm, "%c", buf[xx]); - xx++; - print_x++; - } - x = xx; - - fprintf(htm, ""); - } - /* Color ? */ - else if (prefix(buf + x, "[[[[[")) - { - int xx = x + 6; - - color = color_char_to_attr(buf[x + 5]); - fprintf(htm, "", - angband_color_table[color][1], - angband_color_table[color][2], - angband_color_table[color][3]); - - /* Ok print the link name */ - while (buf[xx] != ']') - { - /* Now we treat the next char as printable */ - if (buf[xx] == '\\') - xx++; - fprintf(htm, "%c", buf[xx]); - xx++; - print_x++; - } - x++; - x = xx; - - fprintf(htm, ""); - } - /* Hidden HTML tag? */ - else if (prefix(buf + x, "{{{{{")) - { - int xx = x + 5; - - /* Ok output the tag inside */ - while (buf[xx] != '}') - { - fprintf(htm, "%c", buf[xx]); - xx++; - } - x++; - x = xx; - } - else - { - fprintf(htm, "%c", buf[x]); - print_x++; - } - - x++; - } - } - /* Verbatim mode: i.e: acacacac */ - else - { - byte old_color; - - x = 5; - old_color = color_char_to_attr(buf[x]); - fprintf(htm, "", - angband_color_table[color][1], - angband_color_table[color][2], - angband_color_table[color][3]); - while (buf[x]) - { - color = color_char_to_attr(buf[x]); - if (color != old_color) - fprintf(htm, "", - angband_color_table[color][1], - angband_color_table[color][2], - angband_color_table[color][3]); - - fprintf(htm, "%c", buf[x + 1]); - print_x++; - x += 2; - } - fprintf(htm, ""); - } - } - if (do_color) - { - fprintf(htm, ""); - } - fprintf(htm, "\n"); - } - - /* Build the filename */ - path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, foot); - - /* Open the file */ - aux = my_fopen(h_ptr->path, "r"); - - /* Copy the footer */ - if (aux) - { - while (TRUE) - { - if (my_fgets(aux, h_ptr->rbuf, 1024)) break; - fprintf(htm, "%s\n", h_ptr->rbuf); - } - my_fclose(aux); - } - - /* Close the file */ - my_fclose(htm); - my_fclose(fff); - - /* Normal return */ - return (TRUE); -} - static void cmovie_clean_line(int y, char *abuf, char *cbuf) { const byte *ap = Term->scr->a[y]; diff --git a/src/files.h b/src/files.h index e3df5636..0eb99f15 100644 --- a/src/files.h +++ b/src/files.h @@ -7,7 +7,6 @@ extern "C" { #endif -extern bool_ txt_to_html(cptr head, cptr food, cptr base, cptr ext, bool_ force, bool_ recur); extern void process_player_name(bool_ sf); extern void do_cmd_save_game(void); extern void predict_score_gui(bool_ *initialized, bool_ *game_in_progress); diff --git a/src/main.c b/src/main.c index f6379624..15b2966e 100644 --- a/src/main.c +++ b/src/main.c @@ -183,26 +183,6 @@ int main(int argc, char *argv[]) break; } - case 'H': - { - char *s; - int j; - - init_lua_init(); - - for (j = i + 1; j < argc; j++) - { - s = argv[j]; - - while (*s != '.') s++; - *s = '\0'; - s++; - txt_to_html("head.aux", "foot.aux", argv[j], s, FALSE, FALSE); - } - - return 0; - } - case '-': { if (argv[i][2] == 'h' && !strcmp((argv[i] + 2), "help")) @@ -230,7 +210,6 @@ usage: puts(" -w Request wizard mode"); puts(" -o Request original keyset"); puts(" -r Request rogue-like keyset"); - puts(" -H Convert helpfile to html"); puts(" -u Use your savefile"); puts(" -M Use the module"); puts(" -m Force 'main-.c' usage"); -- cgit v1.2.3 From c8bd25efe980a6455fef1f6622fe5c69d1ed7a4d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Inline init_lua_init() --- src/CMakeLists.txt | 1 - src/init2.cc | 21 ++++++++++++++++++--- src/main.c | 1 - src/script.cc | 30 ------------------------------ src/script.h | 12 ------------ 5 files changed, 18 insertions(+), 47 deletions(-) delete mode 100644 src/script.cc delete mode 100644 src/script.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 942946fc..9919485d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,7 +82,6 @@ SET(SRCS_COMMON quest.cc randart.cc range.cc - script.cc skills.cc spell_type.cc spells1.cc diff --git a/src/init2.cc b/src/init2.cc index 338ebf10..f56045b9 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -29,13 +29,16 @@ #include "player_class.hpp" #include "player_race.hpp" #include "player_race_mod.hpp" +#include "q_library.hpp" #include "quark.hpp" #include "randart.hpp" #include "randart_part_type.hpp" -#include "script.h" #include "set_type.hpp" #include "skill_type.hpp" #include "spells3.hpp" +#include "spells4.hpp" +#include "spells5.hpp" +#include "spells6.hpp" #include "squeltch.hpp" #include "store_action_type.hpp" #include "store_info_type.hpp" @@ -1365,8 +1368,20 @@ void init_angband(void) if (init_misc()) quit("Cannot initialise misc. values"); /* Initialise some other arrays */ - note("[Initialising scripting... (script)]"); - init_lua_init(); + { + note("[Initialising scripting... (script)]"); + + /* Initialize schooled spells */ + schools_init(); + school_spells_init(); + init_school_books(); + + /* Post-spell creation initialization */ + initialize_bookable_spells(); + + /* Finish up the corruptions */ + init_corruptions(); + } /* Initialise skills info */ note("[Initialising arrays... (skills)]"); diff --git a/src/main.c b/src/main.c index 15b2966e..9845c21f 100644 --- a/src/main.c +++ b/src/main.c @@ -13,7 +13,6 @@ #include "files.h" #include "init2.h" #include "modules.h" -#include "script.h" #include "util.h" #include "variable.h" diff --git a/src/script.cc b/src/script.cc deleted file mode 100644 index 84f7c3e4..00000000 --- a/src/script.cc +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2001 Dark God - * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. - */ - -#include "script.h" - -#include "init2.hpp" -#include "q_library.hpp" -#include "spells4.hpp" -#include "spells5.hpp" -#include "spells6.hpp" - - -void init_lua_init() -{ - /* Initialize schooled spells */ - schools_init(); - school_spells_init(); - init_school_books(); - - /* Post-spell creation initialization */ - initialize_bookable_spells(); - - /* Finish up the corruptions */ - init_corruptions(); -} diff --git a/src/script.h b/src/script.h deleted file mode 100644 index 3d1a0840..00000000 --- a/src/script.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -// C linkage required for these functions since main-* code uses them. -#ifdef __cplusplus -extern "C" { -#endif - -extern void init_lua_init(void); - -#ifdef __cplusplus -} // extern "C" -#endif -- cgit v1.2.3 From e5bb0921ef06a98b77b3e91d9b2f77caaa1f89a9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Build: Produce multiple independent executables --- CMakeLists.txt | 28 +---- README.md | 7 +- src/.gitignore | 6 +- src/CMakeLists.txt | 64 ++++++---- src/birth.cc | 1 - src/birth.h | 14 --- src/birth.hpp | 1 + src/dungeon.cc | 1 - src/files.h | 1 - src/files.hpp | 1 + src/init2.cc | 35 ------ src/init2.h | 1 - src/main-gcu.c | 18 +-- src/main-gtk2.c | 24 ++-- src/main-sdl.c | 21 +++- src/main-win.c | 8 -- src/main-x11.c | 15 ++- src/main.c | 342 ----------------------------------------------------- src/main.cc | 276 ++++++++++++++++++++++++++++++++++++++++++ src/main.h | 11 ++ src/modules.cc | 1 - src/modules.h | 15 --- src/modules.hpp | 2 + src/util.h | 3 - src/util.hpp | 3 + src/variable.h | 8 -- src/variable.hpp | 8 ++ 27 files changed, 410 insertions(+), 505 deletions(-) delete mode 100644 src/birth.h delete mode 100644 src/main.c create mode 100644 src/main.cc create mode 100644 src/main.h delete mode 100644 src/modules.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9519785a..42d24e38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,23 +69,11 @@ ENDIF() # X11 support (OPTIONAL) # FIND_PACKAGE(X11) -IF(X11_FOUND) - # Add X11 flags/options - ADD_DEFINITIONS(-DUSE_X11) - INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR}) - SET(LIBS ${LIBS} ${X11_LIBRARIES}) -ENDIF() # # GTK2 support (OPTIONAL) # FIND_PACKAGE(GTK2) -IF(GTK2_FOUND) - # Add GTK flags/options - ADD_DEFINITIONS(-DUSE_GTK2) - INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) - SET(LIBS ${LIBS} ${GTK2_LIBRARIES}) -ENDIF() # # SDL support (OPTIONAL) @@ -100,10 +88,7 @@ IF(SDL_FOUND) FIND_PACKAGE(SDL_image) FIND_PACKAGE(SDL_ttf) IF(SDLIMAGE_FOUND AND SDLTTF_FOUND) - # Add SDL flags/options - ADD_DEFINITIONS(-DUSE_SDL) - INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR}) - SET(LIBS ${LIBS} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ${SDL_LIBRARY} m) + # Handled in src/CMakeLists.txt ELSE() # Let user know that (and why) we haven't enabled SDL. IF(SDLIMAGE_FOUND) @@ -122,21 +107,14 @@ ENDIF() # Curses support (OPTIONAL) # FIND_PACKAGE(Curses) -IF(CURSES_FOUND) - # Add Curses flags/options - ADD_DEFINITIONS(-DUSE_GCU) - INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) - SET(LIBS ${LIBS} ${CURSES_LIBRARIES}) -ENDIF() # # Windows support # if(WIN32) - # Add Windows flags/options + # This definition is required for more than just the main-win file, + # so we need to have it here. ADD_DEFINITIONS(-DWINDOWS) - SET(EXECUTABLE_OPTIONS WIN32) - SET(LIBS ${LIBS} winmm wsock32) endif(WIN32) # diff --git a/README.md b/README.md index cdf11c24..b61fd0b1 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,12 @@ To configure for your system, run $ cmake . $ make -You should now be able to run +You should now be able to run one of the executables in ./src +to run ToME. For example, you'd run - $ ./src/tome + $ ./src/tome-x11 -to start ToME. +to start ToME with the X11 frontend. **Important:** The current working directory must be at the root of the source tree for the above command to run -- if it isn't, then diff --git a/src/.gitignore b/src/.gitignore index 098f3b10..485f14c6 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1,3 +1,7 @@ /harness -/tome +/tome-gcu +/tome-gtk2 +/tome-sdl +/tome-x11 +/tome-win *.plist diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9919485d..c984db61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -108,15 +108,6 @@ SET(SRCS_COMMON z-util.c ) -# Sources (PROGRAM) -SET(SRCS_PROGRAM - main-gcu.c - main-gtk2.c - main-sdl.c - main-x11.c - main.c -) - # Sources (TEST) SET(SRCS_TESTS ../tests/get_level_device.cc @@ -128,11 +119,14 @@ ADD_LIBRARY(game ${SRCS_COMMON} ) +ADD_LIBRARY(game_main + main.cc) + # Need a few additional source files for Windows. -if(WIN32) +IF(WIN32) SET(SRCS ${SRCS} main-win.c) # Resource files require a little workaround. - if(MINGW) + IF(MINGW) # Workaround for resource compilation for mingw on CMake. # See http://www.cmake.org/Bug/view.php?id=4068 ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o @@ -140,20 +134,44 @@ if(WIN32) -i${CMAKE_CURRENT_SOURCE_DIR}/angband.rc -o ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o) SET(SRCS ${SRCS} ${CMAKE_CURRENT_BINARY_DIR}/angband_rc.o) - else(MINGW) + ELSE(MINGW) SET(SRCS ${SRCS} angband.rc) - endif(MINGW) -endif(WIN32) + ENDIF(MINGW) + # Executable for Win32 + ADD_EXECUTABLE(tome-win WIN32 main-win.c) + TARGET_LINK_LIBRARIES(tome-win game squelch ${LIBS} winmm wsock32) + INSTALL(TARGETS tome-win RUNTIME DESTINATION bin) +ENDIF(WIN32) + +# tome executables +IF(X11_FOUND) + INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR}) + ADD_EXECUTABLE(tome-x11 main-x11.c) + TARGET_LINK_LIBRARIES(tome-x11 game game_main squelch ${LIBS} ${X11_LIBRARIES}) + INSTALL(TARGETS tome-x11 RUNTIME DESTINATION bin) +ENDIF() -# tome executable -ADD_EXECUTABLE(tome ${EXECUTABLE_OPTIONS} ${SRCS_PROGRAM}) -TARGET_LINK_LIBRARIES(tome game squelch ${LIBS}) +IF(SDL_FOUND AND SDLIMAGE_FOUND AND SDLTTF_FOUND) + INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR}) + ADD_EXECUTABLE(tome-sdl main-sdl.c) + TARGET_LINK_LIBRARIES(tome-sdl game game_main squelch ${LIBS} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ${SDL_LIBRARY} m) + INSTALL(TARGETS tome-sdl RUNTIME DESTINATION bin) +ENDIF() + +IF(CURSES_FOUND) + INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) + ADD_EXECUTABLE(tome-gcu main-gcu.c) + TARGET_LINK_LIBRARIES(tome-gcu game game_main squelch ${LIBS} ${CURSES_LIBRARIES}) + INSTALL(TARGETS tome-gcu RUNTIME DESTINATION bin) +ENDIF() + +IF(GTK2_FOUND) + INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) + ADD_EXECUTABLE(tome-gtk2 main-gtk2.c) + TARGET_LINK_LIBRARIES(tome-gtk2 game game_main squelch ${LIBS} ${GTK2_LIBRARIES}) + INSTALL(TARGETS tome-gtk2 RUNTIME DESTINATION bin) +ENDIF() # test harness executable -ADD_EXECUTABLE(harness ${EXECUTABLE_OPTIONS} ${SRCS_TESTS}) +ADD_EXECUTABLE(harness ${SRCS_TESTS}) TARGET_LINK_LIBRARIES(harness game squelch ${LIBS}) - -# Installation -INSTALL(TARGETS tome - RUNTIME DESTINATION bin -) diff --git a/src/birth.cc b/src/birth.cc index db481866..f8b81e35 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -6,7 +6,6 @@ * included in all such copies. */ #include "birth.hpp" -#include "birth.h" #include "ability_type.hpp" #include "artifact_type.hpp" diff --git a/src/birth.h b/src/birth.h deleted file mode 100644 index 41620bfa..00000000 --- a/src/birth.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "h-basic.h" - -// C linkage required for these functions since main-* code uses them. -#ifdef __cplusplus -extern "C" { -#endif - -extern bool_ no_begin_screen; - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/src/birth.hpp b/src/birth.hpp index fb036ecc..dd5ff850 100644 --- a/src/birth.hpp +++ b/src/birth.hpp @@ -7,3 +7,4 @@ extern void save_savefile_names(void); extern bool_ begin_screen(void); extern void get_height_weight(void); extern void player_birth(void); +extern bool_ no_begin_screen; diff --git a/src/dungeon.cc b/src/dungeon.cc index bff82d12..41aa6bf6 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -10,7 +10,6 @@ #include "dungeon.h" #include "birth.hpp" -#include "birth.h" #include "cave.hpp" #include "cave_type.hpp" #include "cmd1.hpp" diff --git a/src/files.h b/src/files.h index 0eb99f15..951c3c00 100644 --- a/src/files.h +++ b/src/files.h @@ -7,7 +7,6 @@ extern "C" { #endif -extern void process_player_name(bool_ sf); extern void do_cmd_save_game(void); extern void predict_score_gui(bool_ *initialized, bool_ *game_in_progress); diff --git a/src/files.hpp b/src/files.hpp index 52206d12..5979be89 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -25,3 +25,4 @@ extern char *get_line(const char* fname, cptr fdir, char *linbuf, int line); extern void race_legends(void); extern void show_highclass(int building); extern errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output); +extern void process_player_name(bool_ sf); diff --git a/src/init2.cc b/src/init2.cc index f56045b9..da518a57 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -230,41 +230,6 @@ void init_file_paths(char *path) -/* - * Initialize and verify the file paths, and the score file. - * - * Use the ANGBAND_PATH environment var if possible, else use - * DEFAULT_PATH, and in either case, branch off appropriately. - * - * First, we'll look for the ANGBAND_PATH environment variable, - * and then look for the files in there. If that doesn't work, - * we'll try the DEFAULT_PATH constant. So be sure that one of - * these two things works... - * - * We must ensure that the path ends with "PATH_SEP" if needed, - * since the "init_file_paths()" function will simply append the - * relevant "sub-directory names" to the given path. - */ -void init_file_paths_with_env() -{ - char path[1024]; - - cptr tail; - - /* Get the environment variable */ - tail = getenv("TOME_PATH"); - - /* Use the angband_path, or a default */ - strcpy(path, tail ? tail : DEFAULT_PATH); - - /* Hack -- Add a path separator (only if needed) */ - if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP); - - /* Initialize */ - init_file_paths(path); -} - - /* * Hack -- help give useful error messages */ diff --git a/src/init2.h b/src/init2.h index 5697e4ef..ba18f2d7 100644 --- a/src/init2.h +++ b/src/init2.h @@ -6,7 +6,6 @@ extern "C" { #endif extern void init_file_paths(char *path); -extern void init_file_paths_with_env(); extern void init_angband(void); #ifdef __cplusplus diff --git a/src/main-gcu.c b/src/main-gcu.c index c253daf2..ac41272c 100644 --- a/src/main-gcu.c +++ b/src/main-gcu.c @@ -38,12 +38,11 @@ * Consider the use of "savetty()" and "resetty()". XXX XXX XXX */ +#include "main.h" #include "util.h" #include "variable.h" -#ifdef USE_GCU - #include /* @@ -794,7 +793,7 @@ static void hook_quit(cptr str) * * Someone should really check the semantics of "initscr()" */ -errr init_gcu(int argc, char **argv) +int init_gcu(int argc, char **argv) { int i; @@ -1015,7 +1014,12 @@ errr init_gcu(int argc, char **argv) return (0); } - -#endif /* USE_GCU */ - - +int main(int argc, char *argv[]) +{ + return main_real( + argc, + argv, + "gcu", + init_gcu, + " -- -b Requests big screen\n"); +} diff --git a/src/main-gtk2.c b/src/main-gtk2.c index ca3eff60..124802c3 100644 --- a/src/main-gtk2.c +++ b/src/main-gtk2.c @@ -31,16 +31,11 @@ */ #include "files.h" +#include "main.h" #include "util.h" #include "variable.h" -/* - * Activate variant-specific features - */ - -#ifdef USE_GTK2 - /* Force ANSI standard */ /* #define __STRICT_ANSI__ */ @@ -1897,7 +1892,7 @@ static void hook_quit(cptr str) /* * Initialization function */ -errr init_gtk2(int argc, char **argv) +int init_gtk2(int argc, char **argv) { int i; @@ -1974,4 +1969,17 @@ errr init_gtk2(int argc, char **argv) return (0); } -#endif /* USE_GTK2 */ +/** + * Main + */ +int main(int argc, char *argv[]) +{ + return main_real( + argc, + argv, + "gtk2", + init_gtk2, + // Usage: + " -- -n# Number of terms to use\n" + " -- -b Turn off software backing store\n"); +} diff --git a/src/main-sdl.c b/src/main-sdl.c index 9a177cbb..e9aec927 100644 --- a/src/main-sdl.c +++ b/src/main-sdl.c @@ -23,9 +23,8 @@ // in this Software without prior written authorization from the author(s). */ -#ifdef USE_SDL - #include "loadsave.h" +#include "main.h" #include "util.h" #include "variable.h" @@ -1824,7 +1823,7 @@ void dumpWindowSettings(void) /* The main-sdl initialization routine! This routine processes arguments, opens the SDL window, loads fonts, etc. */ -errr init_sdl(int argc, char **argv) +int init_sdl(int argc, char **argv) { int i; char filename[PATH_MAX + 1]; @@ -2097,4 +2096,18 @@ errr init_sdl(int argc, char **argv) return 0; } -#endif +int main(int argc, char *argv[]) +{ + return main_real( + argc, + argv, + "sdl", + init_sdl, + " -- -n # Number of virtual consoles to use\n" + " -- -w # Request screen width in pixels\n" + " -- -h # Request screen height in pixels\n" + " -- -bpp # Request screen color depth in bits\n" + " -- -fs Start with full-screen display\n" + " -- -s # Request font size\n" + " -- -f Request true-type font by name\n"); +} diff --git a/src/main-win.c b/src/main-win.c index a2daffbe..0403dc46 100644 --- a/src/main-win.c +++ b/src/main-win.c @@ -74,9 +74,6 @@ #include "util.h" #include "variable.h" -#ifdef WINDOWS - - /* * Extract the "WIN32" flag from the compiler */ @@ -3349,8 +3346,3 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, /* Paranoia */ return (0); } - - -#endif /* WINDOWS */ - - diff --git a/src/main-x11.c b/src/main-x11.c index b4b242e5..99778c77 100644 --- a/src/main-x11.c +++ b/src/main-x11.c @@ -93,11 +93,10 @@ */ #include "loadsave.h" +#include "main.h" #include "util.h" #include "variable.h" -#ifdef USE_X11 - #ifndef __MAKEDEPEND__ #include #include @@ -2584,5 +2583,13 @@ errr init_x11(int argc, char *argv[]) return (0); } -#endif /* USE_X11 */ - +int main(int argc, char *argv[]) +{ + return main_real( + argc, + argv, + "x11", + init_x11, + " -- -n# Number of terms to use\n" + " -- -d Display to use\n"); +} diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 9845c21f..00000000 --- a/src/main.c +++ /dev/null @@ -1,342 +0,0 @@ -/* File: main.c */ - -/* - * Copyright (c) 1997 Ben Harrison, and others - * - * This software may be copied and distributed for educational, research, - * and not for profit purposes provided that this copyright and statement - * are included in all such copies. - */ - -#include "birth.h" -#include "dungeon.h" -#include "files.h" -#include "init2.h" -#include "modules.h" -#include "util.h" -#include "variable.h" - - - -/* - * Some machines have a "main()" function in their "main-xxx.c" file, - * all the others use this file for their "main()" function. - */ - - -#if !defined(WINDOWS) - - -/* - * A hook for "quit()". - * - * Close down, then fall back into "quit()". - */ -static void quit_hook(cptr s) -{ - int j; - - /* Scan windows */ - for (j = 8 - 1; j >= 0; j--) - { - /* Unused */ - if (!angband_term[j]) continue; - - /* Nuke it */ - term_nuke(angband_term[j]); - } -} - - - -/* - * Check existence of ".ToME/" directory in the user's - * home directory or try to create it if it doesn't exist. - * Returns FALSE if all the attempts fail. - */ -static void init_save_dir(void) -{ - char dirpath[1024]; - char versionpath[1024]; - char savepath[1024]; - - /* Get an absolute path from the filename */ - path_parse(dirpath, 1024, PRIVATE_USER_PATH); - strcpy(versionpath, dirpath); - strcat(versionpath, USER_PATH_VERSION); - strcpy(savepath, versionpath); - strcat(savepath, "/save"); - - if (!private_check_user_directory(dirpath)) - { - quit_fmt("Cannot create directory '%s'", dirpath); - } - - if (!private_check_user_directory(versionpath)) - { - quit_fmt("Cannot create directory '%s'", versionpath); - } - - if (!private_check_user_directory(savepath)) - { - quit_fmt("Cannot create directory '%s'", savepath); - } -} - - -static void init_player_name() -{ - /* Get the user id (?) */ - int player_uid = getuid(); - - /* Acquire the "user name" as a default player name */ - user_name(player_name, player_uid); -} - - - -/* - * Simple "main" function for multiple platforms. - * - * Note the special "--" option which terminates the processing of - * standard options. All non-standard options (if any) are passed - * directly to the "init_xxx()" function. - */ -int main(int argc, char *argv[]) -{ - int i; - - bool_ done = FALSE; - - cptr mstr = NULL; - - bool_ args = TRUE; - - /* Get the file paths */ - init_file_paths_with_env(); - - /* Initialize the player name */ - init_player_name(); - - /* Make sure save directory exists */ - init_save_dir(); - - - /* Process the command line arguments */ - for (i = 1; args && (i < argc); i++) - { - /* Require proper options */ - if (argv[i][0] != '-') goto usage; - - /* Analyze option */ - switch (argv[i][1]) - { - case 'W': - case 'w': - { - arg_wizard = TRUE; - break; - } - - case 'R': - case 'r': - { - arg_force_roguelike = TRUE; - break; - } - - case 'O': - case 'o': - { - arg_force_original = TRUE; - break; - } - - case 'u': - case 'U': - { - if (!argv[i][2]) goto usage; - strcpy(player_name, &argv[i][2]); - strcpy(player_base, &argv[i][2]); - no_begin_screen = TRUE; - break; - } - - case 'm': - { - if (!argv[i][2]) goto usage; - mstr = &argv[i][2]; - break; - } - - case 'M': - { - if (!argv[i][2]) goto usage; - force_module = &argv[i][2]; - break; - } - - case 'h': - { - goto usage; - break; - } - - case '-': - { - if (argv[i][2] == 'h' && !strcmp((argv[i] + 2), "help")) - goto usage; - else - { - argv[i] = argv[0]; - argc = argc - i; - argv = argv + i; - args = FALSE; - break; - } - } - - default: -usage: - { - int j; - - /* Dump usage information */ - for (j = 0; j < argc; j++) printf("%s ", argv[j]); - printf("\n"); - puts("Usage: tome [options] [-- subopts]"); - puts(" -h This help"); - puts(" -w Request wizard mode"); - puts(" -o Request original keyset"); - puts(" -r Request rogue-like keyset"); - puts(" -u Use your savefile"); - puts(" -M Use the module"); - puts(" -m Force 'main-.c' usage"); - -#ifdef USE_GTK2 - puts(" -mgtk2 To use GTK2"); - puts(" -- Sub options"); - puts(" -- -n# Number of terms to use"); - puts(" -- -b Turn off software backing store"); -#endif /* USE_GTK2 */ - -#ifdef USE_X11 - puts(" -mx11 To use X11"); - puts(" -- Sub options"); - puts(" -- -n# Number of terms to use"); - puts(" -- -d Display to use"); -#endif /* USE_X11 */ - -#ifdef USE_GCU - puts(" -mgcu To use curses"); - puts(" -- Sub options"); - puts(" -- -b Requests big screen"); -#endif /* USE_GCU */ - -#ifdef USE_SDL - puts(" -msdl To use SDL"); - puts(" -- Sub options"); - puts(" -- -n # Number of virtual consoles to use"); - puts(" -- -w # Request screen width in pixels"); - puts(" -- -h # Request screen height in pixels"); - puts(" -- -bpp # Request screen color depth in bits"); - puts(" -- -fs Start with full-screen display"); - puts(" -- -s # Request font size"); - puts(" -- -f Request true-type font by name"); -#endif /* USE_SDL */ - - /* Actually abort the process */ - quit(NULL); - } - } - } - - /* Hack -- Forget standard args */ - if (args) - { - argc = 1; - argv[1] = NULL; - } - - - /* Process the player name */ - process_player_name(TRUE); - - - /* Install "quit" hook */ - quit_aux = quit_hook; - - -#ifdef USE_GTK2 - /* Attempt to use the "main-gtk2.c" support */ - if (!done && (!mstr || (streq(mstr, "gtk2")))) - { - extern errr init_gtk2(int, char**); - if (0 == init_gtk2(argc, argv)) - { - ANGBAND_SYS = "gtk2"; - done = TRUE; - } - } -#endif - -#ifdef USE_X11 - /* Attempt to use the "main-x11.c" support */ - if (!done && (!mstr || (streq(mstr, "x11")))) - { - extern errr init_x11(int, char**); - if (0 == init_x11(argc, argv)) - { - ANGBAND_SYS = "x11"; - done = TRUE; - } - } -#endif - -#ifdef USE_GCU - /* Attempt to use the "main-gcu.c" support */ - if (!done && (!mstr || (streq(mstr, "gcu")))) - { - extern errr init_gcu(int, char**); - if (0 == init_gcu(argc, argv)) - { - ANGBAND_SYS = "gcu"; - done = TRUE; - } - } -#endif - -#ifdef USE_SDL - /* Attempt to use the "main-sdl.c" support */ - if (!done && (!mstr || (streq(mstr, "sdl")))) - { - extern errr init_sdl(int, char**); - if (0 == init_sdl(argc, argv)) - { - ANGBAND_SYS = "sdl"; - done = TRUE; - } - } -#endif - - /* Make sure we have a display! */ - if (!done) quit("Unable to prepare any 'display module'!"); - - - /* Initialize */ - init_angband(); - - /* Wait for response */ - pause_line(23); - - /* Play the game */ - play_game(); - - /* Quit */ - quit(NULL); - - /* Exit */ - return (0); -} - -#endif diff --git a/src/main.cc b/src/main.cc new file mode 100644 index 00000000..7badc9bb --- /dev/null +++ b/src/main.cc @@ -0,0 +1,276 @@ +/* + * Copyright (c) 1997 Ben Harrison, and others + * + * This software may be copied and distributed for educational, research, + * and not for profit purposes provided that this copyright and statement + * are included in all such copies. + */ + +#include "main.h" + +#include "birth.hpp" +#include "dungeon.h" +#include "files.hpp" +#include "init2.h" +#include "modules.hpp" +#include "util.h" +#include "util.hpp" +#include "variable.h" +#include "variable.hpp" + + +/* + * A hook for "quit()". + * + * Close down, then fall back into "quit()". + */ +static void quit_hook(cptr s) +{ + int j; + + /* Scan windows */ + for (j = 8 - 1; j >= 0; j--) + { + /* Unused */ + if (!angband_term[j]) continue; + + /* Nuke it */ + term_nuke(angband_term[j]); + } +} + + + +/* + * Check existence of ".ToME/" directory in the user's + * home directory or try to create it if it doesn't exist. + * Returns FALSE if all the attempts fail. + */ +static void init_save_dir(void) +{ + char dirpath[1024]; + char versionpath[1024]; + char savepath[1024]; + + /* Get an absolute path from the filename */ + path_parse(dirpath, 1024, PRIVATE_USER_PATH); + strcpy(versionpath, dirpath); + strcat(versionpath, USER_PATH_VERSION); + strcpy(savepath, versionpath); + strcat(savepath, "/save"); + + if (!private_check_user_directory(dirpath)) + { + quit_fmt("Cannot create directory '%s'", dirpath); + } + + if (!private_check_user_directory(versionpath)) + { + quit_fmt("Cannot create directory '%s'", versionpath); + } + + if (!private_check_user_directory(savepath)) + { + quit_fmt("Cannot create directory '%s'", savepath); + } +} + +static void init_player_name() +{ + /* Get the user id (?) */ + int player_uid = getuid(); + + /* Acquire the "user name" as a default player name */ + user_name(player_name, player_uid); +} + + +/* + * Initialize and verify the file paths, and the score file. + * + * Use the ANGBAND_PATH environment var if possible, else use + * DEFAULT_PATH, and in either case, branch off appropriately. + * + * First, we'll look for the ANGBAND_PATH environment variable, + * and then look for the files in there. If that doesn't work, + * we'll try the DEFAULT_PATH constant. So be sure that one of + * these two things works... + * + * We must ensure that the path ends with "PATH_SEP" if needed, + * since the "init_file_paths()" function will simply append the + * relevant "sub-directory names" to the given path. + */ +static void init_file_paths_with_env() +{ + char path[1024]; + + /* Get the environment variable */ + cptr tail = getenv("TOME_PATH"); + + /* Use the angband_path, or a default */ + strcpy(path, tail ? tail : DEFAULT_PATH); + + /* Hack -- Add a path separator (only if needed) */ + if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP); + + /* Initialize */ + init_file_paths(path); +} + + +/* + * Simple "main" function for multiple platforms. + * + * Note the special "--" option which terminates the processing of + * standard options. All non-standard options (if any) are passed + * directly to the platform initialization function. + */ +int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platform)(int, char *[]), char const *platform_usage) +{ + int i; + + bool_ args = TRUE; + + /* Get the file paths */ + init_file_paths_with_env(); + + /* Initialize the player name */ + init_player_name(); + + /* Make sure save directory exists */ + init_save_dir(); + + + /* Process the command line arguments */ + for (i = 1; args && (i < argc); i++) + { + /* Require proper options */ + if (argv[i][0] != '-') goto usage; + + /* Analyze option */ + switch (argv[i][1]) + { + case 'W': + case 'w': + { + arg_wizard = TRUE; + break; + } + + case 'R': + case 'r': + { + arg_force_roguelike = TRUE; + break; + } + + case 'O': + case 'o': + { + arg_force_original = TRUE; + break; + } + + case 'u': + case 'U': + { + if (!argv[i][2]) goto usage; + strcpy(player_name, &argv[i][2]); + strcpy(player_base, &argv[i][2]); + no_begin_screen = TRUE; + break; + } + + case 'M': + { + if (!argv[i][2]) goto usage; + force_module = &argv[i][2]; + break; + } + + case 'h': + { + goto usage; + } + + case '-': + { + if (argv[i][2] == 'h' && !strcmp((argv[i] + 2), "help")) + { + goto usage; + } + else + { + argv[i] = argv[0]; + argc = argc - i; + argv = argv + i; + args = FALSE; + break; + } + } + + default: +usage: + { + int j; + + /* Dump usage information */ + for (j = 0; j < argc; j++) printf("%s ", argv[j]); + printf("\n"); + puts("Usage: tome [options] [-- subopts]"); + puts(" -h This help"); + puts(" -w Request wizard mode"); + puts(" -o Request original keyset"); + puts(" -r Request rogue-like keyset"); + puts(" -u Use your savefile"); + puts(" -M Use the module"); + + puts(" -- Sub options"); + puts(platform_usage); + + /* Actually abort the process */ + quit(NULL); + } + } + } + + /* Hack -- Forget standard args */ + if (args) + { + argc = 1; + argv[1] = NULL; + } + + + /* Process the player name */ + process_player_name(TRUE); + + + /* Install "quit" hook */ + quit_aux = quit_hook; + + /* Run the platform main initialization */ + if (init_platform(argc, argv)) + { + quit("Unable to prepare any 'display module'!"); + } + else + { + ANGBAND_SYS = platform_sys; + + /* Initialize */ + init_angband(); + + /* Wait for response */ + pause_line(23); + + /* Play the game */ + play_game(); + + /* Quit */ + quit(NULL); + + } + /* Exit */ + return (0); +} diff --git a/src/main.h b/src/main.h new file mode 100644 index 00000000..edc590b3 --- /dev/null +++ b/src/main.h @@ -0,0 +1,11 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platform)(int, char *[]), char const *platform_usage); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/src/modules.cc b/src/modules.cc index c5d065f4..a0014502 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -7,7 +7,6 @@ */ #include "modules.hpp" -#include "modules.h" #include "birth.hpp" #include "cave.hpp" diff --git a/src/modules.h b/src/modules.h deleted file mode 100644 index 8a3b88b0..00000000 --- a/src/modules.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "h-basic.h" - -// C linkage required for these functions since main-* code uses them. -#ifdef __cplusplus -extern "C" { -#endif - -extern bool_ private_check_user_directory(cptr dirpath); -extern cptr force_module; - -#ifdef __cplusplus -} // extern "C" -#endif diff --git a/src/modules.hpp b/src/modules.hpp index d83e3e2e..7a8a055f 100644 --- a/src/modules.hpp +++ b/src/modules.hpp @@ -9,3 +9,5 @@ extern void theme_intro(); extern s16b *theme_race_status(int r_idx); extern void init_hooks_module(); extern int find_module(cptr name); +extern bool_ private_check_user_directory(cptr dirpath); +extern cptr force_module; diff --git a/src/util.h b/src/util.h index 4ae797b9..6d9d4655 100644 --- a/src/util.h +++ b/src/util.h @@ -7,15 +7,12 @@ extern "C" { #endif -extern errr path_parse(char *buf, int max, cptr file); extern errr path_build(char *buf, int max, cptr path, cptr file); extern void bell(void); extern errr macro_add(cptr pat, cptr act); extern sint macro_find_exact(cptr pat); extern char inkey(void); extern void prt(cptr str, int row, int col); -extern void pause_line(int row); -extern void user_name(char *buf, int id); #ifdef __cplusplus } // extern "C" diff --git a/src/util.hpp b/src/util.hpp index deddff42..ebeee8c5 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -72,3 +72,6 @@ extern void get_count(int number, int max); extern bool in_bounds(int y, int x); extern bool in_bounds2(int y, int x); extern bool panel_contains(int y, int x); +extern errr path_parse(char *buf, int max, cptr file); +extern void pause_line(int row); +extern void user_name(char *buf, int id); diff --git a/src/variable.h b/src/variable.h index 7621149a..6d6e5775 100644 --- a/src/variable.h +++ b/src/variable.h @@ -7,10 +7,7 @@ extern "C" { #endif extern cptr ANGBAND_SYS; -extern char *ANGBAND_DIR_MODULES; extern char *ANGBAND_DIR_SAVE; -extern char *ANGBAND_DIR_CORE; -extern char *ANGBAND_DIR_DNGN; extern char *ANGBAND_DIR_DATA; extern char *ANGBAND_DIR_EDIT; extern char *ANGBAND_DIR_FILE; @@ -23,15 +20,10 @@ extern char *ANGBAND_DIR_XTRA; extern term *angband_term[ANGBAND_TERM_MAX]; extern char angband_term_name[ANGBAND_TERM_MAX][80]; extern byte angband_color_table[256][4]; -extern bool_ arg_wizard; -extern bool_ arg_force_original; -extern bool_ arg_force_roguelike; extern bool_ character_generated; extern bool_ character_icky; extern bool_ inkey_flag; extern bool_ msg_flag; -extern char player_name[32]; -extern char player_base[32]; extern char savefile[1024]; #ifdef __cplusplus diff --git a/src/variable.hpp b/src/variable.hpp index ab52f5b6..877a5597 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -190,6 +190,8 @@ extern player_race_mod *rmp_ptr; extern player_class *cp_ptr; extern player_spec *spp_ptr; extern s16b player_hp[PY_MAX_LEVEL]; +extern char player_name[32]; +extern char player_base[32]; extern ability_type *ab_info; extern skill_type *s_info; extern vault_type *v_info; @@ -217,6 +219,9 @@ extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; extern cptr DEFAULT_FEAT_BLOCK; extern char *ANGBAND_DIR; +extern char *ANGBAND_DIR_MODULES; +extern char *ANGBAND_DIR_CORE; +extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); @@ -306,3 +311,6 @@ extern timer_type *gl_timers; extern const char *get_version_string(); extern tval_desc tvals[]; extern hist_type *bg; +extern bool_ arg_wizard; +extern bool_ arg_force_original; +extern bool_ arg_force_roguelike; -- cgit v1.2.3 From 85dd09775c762451703b6cb54d55cc1cded687c6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Use C++14 mode for compilation --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42d24e38..1c805161 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ IF(CMAKE_COMPILER_IS_GNUCC) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") SET(CMAKE_C_FLAGS_RELEASE "-O2") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++11 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++14 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") SET(CMAKE_CXX_FLAGS_RELEASE "-O2") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") ENDIF() @@ -35,7 +35,7 @@ IF("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++11 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++14 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") SET(CMAKE_CXX_FLAGS_RELEASE "-O2") SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") ENDIF() -- cgit v1.2.3 From a5a638ff7b08802ad615b689c74d697fafe4d863 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Add cppformat-2.0.0 vendor library - Include only the necessary format.{cc,h} files to save space. --- src/CMakeLists.txt | 7 +- vendor/cppformat/format.cc | 1385 +++++++++++++++++++ vendor/cppformat/format.h | 3259 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 4650 insertions(+), 1 deletion(-) create mode 100644 vendor/cppformat/format.cc create mode 100644 vendor/cppformat/format.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c984db61..6d942dfe 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,15 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/bandit) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/cppformat) # Add subdirectories ADD_SUBDIRECTORY (squelch) +# Sources (vendor) +SET(SRCS_VENDOR + ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/cppformat/format.cc) + # Sources (common) SET(SRCS_COMMON birth.cc @@ -116,7 +121,7 @@ SET(SRCS_TESTS ) ADD_LIBRARY(game - ${SRCS_COMMON} + ${SRCS_COMMON} ${SRCS_VENDOR} ) ADD_LIBRARY(game_main diff --git a/vendor/cppformat/format.cc b/vendor/cppformat/format.cc new file mode 100644 index 00000000..d17c2d68 --- /dev/null +++ b/vendor/cppformat/format.cc @@ -0,0 +1,1385 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2015, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "format.h" + +#include + +#include +#include +#include +#include +#include +#include // for std::ptrdiff_t + +#if defined(_WIN32) && defined(__MINGW32__) +# include +#endif + +#if FMT_USE_WINDOWS_H +# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) +# include +# else +# define NOMINMAX +# include +# undef NOMINMAX +# endif +#endif + +using fmt::internal::Arg; + +// Check if exceptions are disabled. +#if defined(__GNUC__) && !defined(__EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +#endif +#if defined(_MSC_VER) && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +#endif +#ifndef FMT_EXCEPTIONS +# define FMT_EXCEPTIONS 1 +#endif + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# define FMT_THROW(x) throw x +# else +# define FMT_THROW(x) assert(false) +# endif +#endif + +#ifdef FMT_HEADER_ONLY +# define FMT_FUNC inline +#else +# define FMT_FUNC +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4702) // unreachable code +// Disable deprecation warning for strerror. The latter is not called but +// MSVC fails to detect it. +# pragma warning(disable: 4996) +#endif + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +static inline fmt::internal::Null<> strerror_r(int, char *, ...) { + return fmt::internal::Null<>(); +} +static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { + return fmt::internal::Null<>(); +} + +namespace fmt { +namespace { + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) +# define FMT_SWPRINTF snwprintf +#else +# define FMT_SWPRINTF swprintf +#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) + +// Checks if a value fits in int - used to avoid warnings about comparing +// signed and unsigned integers. +template +struct IntChecker { + template + static bool fits_in_int(T value) { + unsigned max = INT_MAX; + return value <= max; + } + static bool fits_in_int(bool) { return true; } +}; + +template <> +struct IntChecker { + template + static bool fits_in_int(T value) { + return value >= INT_MIN && value <= INT_MAX; + } + static bool fits_in_int(int) { return true; } +}; + +const char RESET_COLOR[] = "\x1b[0m"; + +typedef void (*FormatFunc)(fmt::Writer &, int, fmt::StringRef); + +// Portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +int safe_strerror( + int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); + + class StrError { + private: + int error_code_; + char *&buffer_; + std::size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const StrError &) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + int handle(char *message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + int handle(fmt::internal::Null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? + ERANGE : result; + } + + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(fmt::internal::Null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } + + public: + StrError(int err_code, char *&buf, std::size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { + strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. + return handle(strerror_r(error_code_, buffer_, buffer_size_)); + } + }; + return StrError(error_code, buffer, buffer_size).run(); +} + +void format_error_code(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential + // bad_alloc. + out.clear(); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + fmt::internal::IntTraits::MainType ec_value = error_code; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + error_code_size += fmt::internal::count_digits(ec_value); + if (message.size() <= fmt::internal::INLINE_BUFFER_SIZE - error_code_size) + out << message << SEP; + out << ERROR_STR << error_code; + assert(out.size() <= fmt::internal::INLINE_BUFFER_SIZE); +} + +void report_error(FormatFunc func, + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + fmt::MemoryWriter full_message; + func(full_message, error_code, message); + // Use Writer::data instead of Writer::c_str to avoid potential memory + // allocation. + std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// IsZeroInt::visit(arg) returns true iff arg is a zero integer. +class IsZeroInt : public fmt::internal::ArgVisitor { + public: + template + bool visit_any_int(T value) { return value == 0; } +}; + +// Parses an unsigned integer advancing s to the end of the parsed input. +// This function assumes that the first character of s is a digit. +template +int parse_nonnegative_int(const Char *&s) { + assert('0' <= *s && *s <= '9'); + unsigned value = 0; + do { + unsigned new_value = value * 10 + (*s++ - '0'); + // Check if value wrapped around. + if (new_value < value) { + value = UINT_MAX; + break; + } + value = new_value; + } while ('0' <= *s && *s <= '9'); + if (value > INT_MAX) + FMT_THROW(fmt::FormatError("number is too big")); + return value; +} + +template +inline bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +inline void require_numeric_argument(const Arg &arg, char spec) { + if (arg.type > Arg::LAST_NUMERIC_TYPE) { + std::string message = + fmt::format("format specifier '{}' requires numeric argument", spec); + FMT_THROW(fmt::FormatError(message)); + } +} + +template +void check_sign(const Char *&s, const Arg &arg) { + char sign = static_cast(*s); + require_numeric_argument(arg, sign); + if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) { + FMT_THROW(fmt::FormatError(fmt::format( + "format specifier '{}' requires signed argument", sign))); + } + ++s; +} + +// Checks if an argument is a valid printf width specifier and sets +// left alignment if it is negative. +class WidthHandler : public fmt::internal::ArgVisitor { + private: + fmt::FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); + + public: + explicit WidthHandler(fmt::FormatSpec &spec) : spec_(spec) {} + + void report_unhandled_arg() { + FMT_THROW(fmt::FormatError("width is not integer")); + } + + template + unsigned visit_any_int(T value) { + typedef typename fmt::internal::IntTraits::MainType UnsignedType; + UnsignedType width = value; + if (fmt::internal::is_negative(value)) { + spec_.align_ = fmt::ALIGN_LEFT; + width = 0 - width; + } + if (width > INT_MAX) + FMT_THROW(fmt::FormatError("number is too big")); + return static_cast(width); + } +}; + +class PrecisionHandler : + public fmt::internal::ArgVisitor { + public: + void report_unhandled_arg() { + FMT_THROW(fmt::FormatError("precision is not integer")); + } + + template + int visit_any_int(T value) { + if (!IntChecker::is_signed>::fits_in_int(value)) + FMT_THROW(fmt::FormatError("number is too big")); + return static_cast(value); + } +}; + +// Converts an integer argument to an integral type T for printf. +template +class ArgConverter : public fmt::internal::ArgVisitor, void> { + private: + fmt::internal::Arg &arg_; + wchar_t type_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); + + public: + ArgConverter(fmt::internal::Arg &arg, wchar_t type) + : arg_(arg), type_(type) {} + + void visit_bool(bool value) { + if (type_ != 's') + visit_any_int(value); + } + + template + void visit_any_int(U value) { + bool is_signed = type_ == 'd' || type_ == 'i'; + using fmt::internal::Arg; + if (sizeof(T) <= sizeof(int)) { + // Extra casts are used to silence warnings. + if (is_signed) { + arg_.type = Arg::INT; + arg_.int_value = static_cast(static_cast(value)); + } else { + arg_.type = Arg::UINT; + arg_.uint_value = static_cast( + static_cast::Type>(value)); + } + } else { + if (is_signed) { + arg_.type = Arg::LONG_LONG; + arg_.long_long_value = + static_cast::Type>(value); + } else { + arg_.type = Arg::ULONG_LONG; + arg_.ulong_long_value = + static_cast::Type>(value); + } + } + } +}; + +// Converts an integer argument to char for printf. +class CharConverter : public fmt::internal::ArgVisitor { + private: + fmt::internal::Arg &arg_; + + FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); + + public: + explicit CharConverter(fmt::internal::Arg &arg) : arg_(arg) {} + + template + void visit_any_int(T value) { + arg_.type = Arg::CHAR; + arg_.int_value = static_cast(value); + } +}; +} // namespace + +namespace internal { + +template +class BasicArgFormatter : public ArgVisitor { + private: + BasicWriter &writer_; + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicArgFormatter); + + void write_pointer(const void *p) { + spec_.flags_ = HASH_FLAG; + spec_.type_ = 'x'; + writer_.write_int(reinterpret_cast(p), spec_); + } + + protected: + BasicWriter &writer() { return writer_; } + FormatSpec &spec() { return spec_; } + + void write(bool value) { + const char *str_value = value ? "true" : "false"; + Arg::StringValue str = { str_value, strlen(str_value) }; + writer_.write_str(str, spec_); + } + + void write(const char *value) { + Arg::StringValue str = {value, value != 0 ? strlen(value) : 0}; + writer_.write_str(str, spec_); + } + + public: + BasicArgFormatter(BasicWriter &w, FormatSpec &s) + : writer_(w), spec_(s) {} + + template + void visit_any_int(T value) { writer_.write_int(value, spec_); } + + template + void visit_any_double(T value) { writer_.write_double(value, spec_); } + + void visit_bool(bool value) { + if (spec_.type_) + return visit_any_int(value); + write(value); + } + + void visit_char(int value) { + if (spec_.type_ && spec_.type_ != 'c') { + spec_.flags_ |= CHAR_FLAG; + writer_.write_int(value, spec_); + return; + } + if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) + FMT_THROW(FormatError("invalid format specifier for char")); + typedef typename BasicWriter::CharPtr CharPtr; + Char fill = internal::CharTraits::cast(spec_.fill()); + CharPtr out = CharPtr(); + const unsigned CHAR_WIDTH = 1; + if (spec_.width_ > CHAR_WIDTH) { + out = writer_.grow_buffer(spec_.width_); + if (spec_.align_ == ALIGN_RIGHT) { + std::fill_n(out, spec_.width_ - CHAR_WIDTH, fill); + out += spec_.width_ - CHAR_WIDTH; + } else if (spec_.align_ == ALIGN_CENTER) { + out = writer_.fill_padding(out, spec_.width_, + internal::check(CHAR_WIDTH), fill); + } else { + std::fill_n(out + CHAR_WIDTH, spec_.width_ - CHAR_WIDTH, fill); + } + } else { + out = writer_.grow_buffer(CHAR_WIDTH); + } + *out = internal::CharTraits::cast(value); + } + + void visit_cstring(const char *value) { + if (spec_.type_ == 'p') + return write_pointer(value); + write(value); + } + + void visit_string(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + using ArgVisitor::visit_wstring; + + void visit_wstring(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + void visit_pointer(const void *value) { + if (spec_.type_ && spec_.type_ != 'p') + report_unknown_type(spec_.type_, "pointer"); + write_pointer(value); + } +}; + +// An argument formatter. +template +class ArgFormatter : public BasicArgFormatter, Char> { + private: + BasicFormatter &formatter_; + const Char *format_; + + public: + ArgFormatter(BasicFormatter &f, FormatSpec &s, const Char *fmt) + : BasicArgFormatter, Char>(f.writer(), s), + formatter_(f), format_(fmt) {} + + void visit_custom(Arg::CustomValue c) { + c.format(&formatter_, c.value, &format_); + } +}; + +template +class PrintfArgFormatter : + public BasicArgFormatter, Char> { + + void write_null_pointer() { + this->spec().type_ = 0; + this->write("(nil)"); + } + + typedef BasicArgFormatter, Char> Base; + + public: + PrintfArgFormatter(BasicWriter &w, FormatSpec &s) + : BasicArgFormatter, Char>(w, s) {} + + void visit_bool(bool value) { + FormatSpec &fmt_spec = this->spec(); + if (fmt_spec.type_ != 's') + return this->visit_any_int(value); + fmt_spec.type_ = 0; + this->write(value); + } + + void visit_char(int value) { + const FormatSpec &fmt_spec = this->spec(); + BasicWriter &w = this->writer(); + if (fmt_spec.type_ && fmt_spec.type_ != 'c') + w.write_int(value, fmt_spec); + typedef typename BasicWriter::CharPtr CharPtr; + CharPtr out = CharPtr(); + if (fmt_spec.width_ > 1) { + Char fill = ' '; + out = w.grow_buffer(fmt_spec.width_); + if (fmt_spec.align_ != ALIGN_LEFT) { + std::fill_n(out, fmt_spec.width_ - 1, fill); + out += fmt_spec.width_ - 1; + } else { + std::fill_n(out + 1, fmt_spec.width_ - 1, fill); + } + } else { + out = w.grow_buffer(1); + } + *out = static_cast(value); + } + + void visit_cstring(const char *value) { + if (value) + Base::visit_cstring(value); + else if (this->spec().type_ == 'p') + write_null_pointer(); + else + this->write("(null)"); + } + + void visit_pointer(const void *value) { + if (value) + return Base::visit_pointer(value); + this->spec().type_ = 0; + write_null_pointer(); + } + + void visit_custom(Arg::CustomValue c) { + BasicFormatter formatter(ArgList(), this->writer()); + const Char format_str[] = {'}', 0}; + const Char *format = format_str; + c.format(&formatter, c.value, &format); + } +}; +} // namespace internal +} // namespace fmt + +FMT_FUNC void fmt::SystemError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_system_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +template +int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, value) : + FMT_SNPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, width, value) : + FMT_SNPRINTF(buffer, size, format, width, precision, value); +} + +template +int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, value) : + FMT_SWPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, width, value) : + FMT_SWPRINTF(buffer, size, format, width, precision, value); +} + +template +const char fmt::internal::BasicData::DIGITS[] = + "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, \ + factor * 100, \ + factor * 1000, \ + factor * 10000, \ + factor * 100000, \ + factor * 1000000, \ + factor * 10000000, \ + factor * 100000000, \ + factor * 1000000000 + +template +const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { + 0, FMT_POWERS_OF_10(1) +}; + +template +const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { + 0, + FMT_POWERS_OF_10(1), + FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), + // Multiply several constants instead of using a single long long constant + // to avoid warnings about C++98 not supporting long long. + fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 +}; + +FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { + (void)type; + if (std::isprint(static_cast(code))) { + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '{}' for {}", code, type))); + } + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '\\x{:02x}' for {}", + static_cast(code), type))); +} + +#if FMT_USE_WINDOWS_H + +FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { + static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; + if (s.size() > INT_MAX) + FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); + int s_size = static_cast(s.size()); + int length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_.resize(length + 1); + length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_[length] = 0; +} + +FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { + if (int error_code = convert(s)) { + FMT_THROW(WindowsError(error_code, + "cannot convert string from UTF-16 to UTF-8")); + } +} + +FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { + if (s.size() > INT_MAX) + return ERROR_INVALID_PARAMETER; + int s_size = static_cast(s.size()); + int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); + if (length == 0) + return GetLastError(); + buffer_.resize(length + 1); + length = WideCharToMultiByte( + CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); + if (length == 0) + return GetLastError(); + buffer_[length] = 0; + return 0; +} + +FMT_FUNC void fmt::WindowsError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_windows_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +FMT_FUNC void fmt::internal::format_windows_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + class String { + private: + LPWSTR str_; + + public: + String() : str_() {} + ~String() { LocalFree(str_); } + LPWSTR *ptr() { return &str_; } + LPCWSTR c_str() const { return str_; } + }; + FMT_TRY { + String system_message; + if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, + error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + reinterpret_cast(system_message.ptr()), 0, 0)) { + UTF16ToUTF8 utf8_message; + if (utf8_message.convert(system_message.c_str()) == ERROR_SUCCESS) { + out << message << ": " << utf8_message; + return; + } + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +#endif // FMT_USE_WINDOWS_H + +FMT_FUNC void fmt::internal::format_system_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + char *system_message = &buffer[0]; + int result = safe_strerror(error_code, system_message, buffer.size()); + if (result == 0) { + out << message << ": " << system_message; + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +template +void fmt::internal::ArgMap::init(const ArgList &args) { + if (!map_.empty()) + return; + typedef internal::NamedArg NamedArg; + const NamedArg *named_arg = 0; + bool use_values = + args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; + if (use_values) { + for (unsigned i = 0;/*nothing*/; ++i) { + internal::Arg::Type arg_type = args.type(i); + switch (arg_type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.values_[i].pointer); + map_.insert(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } + return; + } + for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { + internal::Arg::Type arg_type = args.type(i); + if (arg_type == internal::Arg::NAMED_ARG) { + named_arg = static_cast(args.args_[i].pointer); + map_.insert(Pair(named_arg->name, *named_arg)); + } + } + for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { + switch (args.args_[i].type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.args_[i].pointer); + map_.insert(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } +} + +template +void fmt::internal::FixedBuffer::grow(std::size_t) { + FMT_THROW(std::runtime_error("buffer overflow")); +} + +template +template +void fmt::BasicWriter::write_str( + const Arg::StringValue &s, const FormatSpec &spec) { + // Check if StrChar is convertible to Char. + internal::CharTraits::convert(StrChar()); + if (spec.type_ && spec.type_ != 's') + internal::report_unknown_type(spec.type_, "string"); + const StrChar *str_value = s.value; + std::size_t str_size = s.size; + if (str_size == 0) { + if (!str_value) { + FMT_THROW(FormatError("string pointer is null")); + return; + } + } + std::size_t precision = spec.precision_; + if (spec.precision_ >= 0 && precision < str_size) + str_size = spec.precision_; + write_str(str_value, str_size, spec); +} + +template +inline Arg fmt::BasicFormatter::get_arg( + BasicStringRef arg_name, const char *&error) { + if (check_no_auto_index(error)) { + map_.init(args()); + const Arg *arg = map_.find(arg_name); + if (arg) + return *arg; + error = "argument not found"; + } + return Arg(); +} + +template +inline Arg fmt::BasicFormatter::parse_arg_index(const Char *&s) { + const char *error = 0; + Arg arg = *s < '0' || *s > '9' ? + next_arg(error) : get_arg(parse_nonnegative_int(s), error); + if (error) { + FMT_THROW(FormatError( + *s != '}' && *s != ':' ? "invalid format string" : error)); + } + return arg; +} + +template +inline Arg fmt::BasicFormatter::parse_arg_name(const Char *&s) { + assert(is_name_start(*s)); + const Char *start = s; + Char c; + do { + c = *++s; + } while (is_name_start(c) || ('0' <= c && c <= '9')); + const char *error = 0; + Arg arg = get_arg(fmt::BasicStringRef(start, s - start), error); + if (error) + FMT_THROW(fmt::FormatError(error)); + return arg; +} + +FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( + unsigned arg_index, const char *&error) { + Arg arg = args_[arg_index]; + switch (arg.type) { + case Arg::NONE: + error = "argument index out of range"; + break; + case Arg::NAMED_ARG: + arg = *static_cast(arg.pointer); + default: + /*nothing*/; + } + return arg; +} + +inline Arg fmt::internal::FormatterBase::next_arg(const char *&error) { + if (next_arg_index_ >= 0) + return do_get_arg(next_arg_index_++, error); + error = "cannot switch from manual to automatic argument indexing"; + return Arg(); +} + +inline bool fmt::internal::FormatterBase::check_no_auto_index( + const char *&error) { + if (next_arg_index_ > 0) { + error = "cannot switch from automatic to manual argument indexing"; + return false; + } + next_arg_index_ = -1; + return true; +} + +inline Arg fmt::internal::FormatterBase::get_arg( + unsigned arg_index, const char *&error) { + return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); +} + +template +void fmt::internal::PrintfFormatter::parse_flags( + FormatSpec &spec, const Char *&s) { + for (;;) { + switch (*s++) { + case '-': + spec.align_ = ALIGN_LEFT; + break; + case '+': + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '0': + spec.fill_ = '0'; + break; + case ' ': + spec.flags_ |= SIGN_FLAG; + break; + case '#': + spec.flags_ |= HASH_FLAG; + break; + default: + --s; + return; + } + } +} + +template +Arg fmt::internal::PrintfFormatter::get_arg( + const Char *s, unsigned arg_index) { + (void)s; + const char *error = 0; + Arg arg = arg_index == UINT_MAX ? + next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); + if (error) + FMT_THROW(FormatError(!*s ? "invalid format string" : error)); + return arg; +} + +template +unsigned fmt::internal::PrintfFormatter::parse_header( + const Char *&s, FormatSpec &spec) { + unsigned arg_index = UINT_MAX; + Char c = *s; + if (c >= '0' && c <= '9') { + // Parse an argument index (if followed by '$') or a width possibly + // preceded with '0' flag(s). + unsigned value = parse_nonnegative_int(s); + if (*s == '$') { // value is an argument index + ++s; + arg_index = value; + } else { + if (c == '0') + spec.fill_ = '0'; + if (value != 0) { + // Nonzero value means that we parsed width and don't need to + // parse it or flags again, so return now. + spec.width_ = value; + return arg_index; + } + } + } + parse_flags(spec, s); + // Parse width. + if (*s >= '0' && *s <= '9') { + spec.width_ = parse_nonnegative_int(s); + } else if (*s == '*') { + ++s; + spec.width_ = WidthHandler(spec).visit(get_arg(s)); + } + return arg_index; +} + +template +void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, BasicCStringRef format_str) { + const Char *start = format_str.c_str(); + const Char *s = start; + while (*s) { + Char c = *s++; + if (c != '%') continue; + if (*s == c) { + write(writer, start, s); + start = ++s; + continue; + } + write(writer, start, s - 1); + + FormatSpec spec; + spec.align_ = ALIGN_RIGHT; + + // Parse argument index, flags and width. + unsigned arg_index = parse_header(s, spec); + + // Parse precision. + if (*s == '.') { + ++s; + if ('0' <= *s && *s <= '9') { + spec.precision_ = parse_nonnegative_int(s); + } else if (*s == '*') { + ++s; + spec.precision_ = PrecisionHandler().visit(get_arg(s)); + } + } + + Arg arg = get_arg(s, arg_index); + if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) + spec.flags_ &= ~HASH_FLAG; + if (spec.fill_ == '0') { + if (arg.type <= Arg::LAST_NUMERIC_TYPE) + spec.align_ = ALIGN_NUMERIC; + else + spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. + } + + // Parse length and convert the argument to the required type. + switch (*s++) { + case 'h': + if (*s == 'h') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'l': + if (*s == 'l') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'j': + ArgConverter(arg, *s).visit(arg); + break; + case 'z': + ArgConverter(arg, *s).visit(arg); + break; + case 't': + ArgConverter(arg, *s).visit(arg); + break; + case 'L': + // printf produces garbage when 'L' is omitted for long double, no + // need to do the same. + break; + default: + --s; + ArgConverter(arg, *s).visit(arg); + } + + // Parse type. + if (!*s) + FMT_THROW(FormatError("invalid format string")); + spec.type_ = static_cast(*s++); + if (arg.type <= Arg::LAST_INTEGER_TYPE) { + // Normalize type. + switch (spec.type_) { + case 'i': case 'u': + spec.type_ = 'd'; + break; + case 'c': + // TODO: handle wchar_t + CharConverter(arg).visit(arg); + break; + } + } + + start = s; + + // Format argument. + internal::PrintfArgFormatter(writer, spec).visit(arg); + } + write(writer, start, s); +} + +template +const Char *fmt::BasicFormatter::format( + const Char *&format_str, const Arg &arg) { + const Char *s = format_str; + FormatSpec spec; + if (*s == ':') { + if (arg.type == Arg::CUSTOM) { + arg.custom.format(this, arg.custom.value, &s); + return s; + } + ++s; + // Parse fill and alignment. + if (Char c = *s) { + const Char *p = s + 1; + spec.align_ = ALIGN_DEFAULT; + do { + switch (*p) { + case '<': + spec.align_ = ALIGN_LEFT; + break; + case '>': + spec.align_ = ALIGN_RIGHT; + break; + case '=': + spec.align_ = ALIGN_NUMERIC; + break; + case '^': + spec.align_ = ALIGN_CENTER; + break; + } + if (spec.align_ != ALIGN_DEFAULT) { + if (p != s) { + if (c == '}') break; + if (c == '{') + FMT_THROW(FormatError("invalid fill character '{'")); + s += 2; + spec.fill_ = c; + } else ++s; + if (spec.align_ == ALIGN_NUMERIC) + require_numeric_argument(arg, '='); + break; + } + } while (--p >= s); + } + + // Parse sign. + switch (*s) { + case '+': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '-': + check_sign(s, arg); + spec.flags_ |= MINUS_FLAG; + break; + case ' ': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG; + break; + } + + if (*s == '#') { + require_numeric_argument(arg, '#'); + spec.flags_ |= HASH_FLAG; + ++s; + } + + // Parse zero flag. + if (*s == '0') { + require_numeric_argument(arg, '0'); + spec.align_ = ALIGN_NUMERIC; + spec.fill_ = '0'; + ++s; + } + + // Parse width. + if ('0' <= *s && *s <= '9') { + spec.width_ = parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg width_arg = is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (width_arg.type) { + case Arg::INT: + if (width_arg.int_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.int_value; + break; + case Arg::UINT: + value = width_arg.uint_value; + break; + case Arg::LONG_LONG: + if (width_arg.long_long_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = width_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("width is not integer")); + } + if (value > INT_MAX) + FMT_THROW(FormatError("number is too big")); + spec.width_ = static_cast(value); + } + + // Parse precision. + if (*s == '.') { + ++s; + spec.precision_ = 0; + if ('0' <= *s && *s <= '9') { + spec.precision_ = parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg precision_arg = + is_name_start(*s) ? parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (precision_arg.type) { + case Arg::INT: + if (precision_arg.int_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.int_value; + break; + case Arg::UINT: + value = precision_arg.uint_value; + break; + case Arg::LONG_LONG: + if (precision_arg.long_long_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = precision_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("precision is not integer")); + } + if (value > INT_MAX) + FMT_THROW(FormatError("number is too big")); + spec.precision_ = static_cast(value); + } else { + FMT_THROW(FormatError("missing precision specifier")); + } + if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) { + FMT_THROW(FormatError( + fmt::format("precision not allowed in {} format specifier", + arg.type == Arg::POINTER ? "pointer" : "integer"))); + } + } + + // Parse type. + if (*s != '}' && *s) + spec.type_ = static_cast(*s++); + } + + if (*s++ != '}') + FMT_THROW(FormatError("missing '}' in format string")); + + // Format argument. + internal::ArgFormatter(*this, spec, s - 1).visit(arg); + return s; +} + +template +void fmt::BasicFormatter::format(BasicCStringRef format_str) { + const Char *s = format_str.c_str(); + const Char *start = s; + while (*s) { + Char c = *s++; + if (c != '{' && c != '}') continue; + if (*s == c) { + write(writer_, start, s); + start = ++s; + continue; + } + if (c == '}') + FMT_THROW(FormatError("unmatched '}' in format string")); + write(writer_, start, s - 1); + Arg arg = is_name_start(*s) ? parse_arg_name(s) : parse_arg_index(s); + start = s = format(s, arg); + } + write(writer_, start, s); +} + +FMT_FUNC void fmt::report_system_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_system_error, error_code, message); +} + +#if FMT_USE_WINDOWS_H +FMT_FUNC void fmt::report_windows_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_windows_error, error_code, message); +} +#endif + +FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + std::fwrite(w.data(), 1, w.size(), f); +} + +FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { + print(stdout, format_str, args); +} + +FMT_FUNC void fmt::print(std::ostream &os, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + os.write(w.data(), w.size()); +} + +FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { + char escape[] = "\x1b[30m"; + escape[3] = static_cast('0' + c); + std::fputs(escape, stdout); + print(format, args); + std::fputs(RESET_COLOR, stdout); +} + +FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + std::size_t size = w.size(); + return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); +} + +#ifndef FMT_HEADER_ONLY + +template struct fmt::internal::BasicData; + +// Explicit instantiations for char. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template const char *fmt::BasicFormatter::format( + const char *&format_str, const fmt::internal::Arg &arg); + +template void fmt::BasicFormatter::format(CStringRef format); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, CStringRef format); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, long double value); + +// Explicit instantiations for wchar_t. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template const wchar_t *fmt::BasicFormatter::format( + const wchar_t *&format_str, const fmt::internal::Arg &arg); + +template void fmt::BasicFormatter::format( + BasicCStringRef format); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, WCStringRef format); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, long double value); + +#endif // FMT_HEADER_ONLY + +#ifdef _MSC_VER +# pragma warning(pop) +#endif diff --git a/vendor/cppformat/format.h b/vendor/cppformat/format.h new file mode 100644 index 00000000..568123d8 --- /dev/null +++ b/vendor/cppformat/format.h @@ -0,0 +1,3259 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2015, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#if defined _MSC_VER && _MSC_VER <= 1500 +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; +typedef long long intmax_t; +#else +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef FMT_USE_IOSTREAMS +# define FMT_USE_IOSTREAMS 1 +#endif + +#if FMT_USE_IOSTREAMS +# include +#endif + +#ifdef _SECURE_SCL +# define FMT_SECURE_SCL _SECURE_SCL +#else +# define FMT_SECURE_SCL 0 +#endif + +#if FMT_SECURE_SCL +# include +#endif + +#ifdef _MSC_VER +# include // _BitScanReverse, _BitScanReverse64 + +namespace fmt { +namespace internal { +# pragma intrinsic(_BitScanReverse) +inline uint32_t clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) + +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) +} +} +#endif + +#ifdef __GNUC__ +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# define FMT_GCC_EXTENSION __extension__ +# if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic push +// Disable the warning about "long long" which is sometimes reported even +// when using __extension__. +# pragma GCC diagnostic ignored "-Wlong-long" +// Disable the warning about declaration shadowing because it affects too +// many valid cases. +# pragma GCC diagnostic ignored "-Wshadow" +// Disable the warning about implicit conversions that may change the sign of +// an integer; silencing it otherwise would require many explicit casts. +# pragma GCC diagnostic ignored "-Wsign-conversion" +# endif +# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ +# define FMT_HAS_GXX_CXX11 1 +# endif +#else +# define FMT_GCC_EXTENSION +#endif + +#if defined(__clang__) && !defined(__INTEL_COMPILER) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdocumentation" +#endif + +#ifdef __GNUC_LIBSTD__ +# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#ifndef FMT_USE_VARIADIC_TEMPLATES +// Variadic templates are available in GCC since version 4.4 +// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ +// since version 2013. +# define FMT_USE_VARIADIC_TEMPLATES \ + (FMT_HAS_FEATURE(cxx_variadic_templates) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800) +#endif + +#ifndef FMT_USE_RVALUE_REFERENCES +// Don't use rvalue references when compiling with clang and an old libstdc++ +// as the latter doesn't provide std::move. +# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 +# define FMT_USE_RVALUE_REFERENCES 0 +# else +# define FMT_USE_RVALUE_REFERENCES \ + (FMT_HAS_FEATURE(cxx_rvalue_references) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600) +# endif +#endif + +#if FMT_USE_RVALUE_REFERENCES +# include // for std::move +#endif + +// Define FMT_USE_NOEXCEPT to make C++ Format use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + _MSC_VER >= 1900 +# define FMT_NOEXCEPT noexcept +# else +# define FMT_NOEXCEPT throw() +# endif +#endif + +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#ifndef FMT_USE_DELETED_FUNCTIONS +# define FMT_USE_DELETED_FUNCTIONS 0 +#endif + +#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800 +# define FMT_DELETED_OR_UNDEFINED = delete +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + TypeName& operator=(const TypeName&) = delete +#else +# define FMT_DELETED_OR_UNDEFINED +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + TypeName& operator=(const TypeName&) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// All compilers which support UDLs also support variadic templates. This +// makes the fmt::literals implementation easier. However, an explicit check +// for variadic templates is added here just in case. +# define FMT_USE_USER_DEFINED_LITERALS \ + FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ + (FMT_HAS_FEATURE(cxx_user_literals) || \ + (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1900) +#endif + +#ifndef FMT_ASSERT +# define FMT_ASSERT(condition, message) assert((condition) && message) +#endif + +namespace fmt { +namespace internal { +struct DummyInt { + int data[2]; + operator int() const { return 0; } +}; +typedef std::numeric_limits FPUtil; + +// Dummy implementations of system functions such as signbit and ecvt called +// if the latter are not available. +inline DummyInt signbit(...) { return DummyInt(); } +inline DummyInt _ecvt_s(...) { return DummyInt(); } +inline DummyInt isinf(...) { return DummyInt(); } +inline DummyInt _finite(...) { return DummyInt(); } +inline DummyInt isnan(...) { return DummyInt(); } +inline DummyInt _isnan(...) { return DummyInt(); } + +// A helper function to suppress bogus "conditional expression is constant" +// warnings. +template +inline T check(T value) { return value; } +} +} // namespace fmt + +namespace std { +// Standard permits specialization of std::numeric_limits. This specialization +// is used to resolve ambiguity between isinf and std::isinf in glibc: +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 +// and the same for isnan and signbit. +template <> +class numeric_limits : + public std::numeric_limits { + public: + // Portable version of isinf. + template + static bool isinfinity(T x) { + using namespace fmt::internal; + // The resolution "priority" is: + // isinf macro > std::isinf > ::isinf > fmt::internal::isinf + if (check(sizeof(isinf(x)) == sizeof(bool) || + sizeof(isinf(x)) == sizeof(int))) { + return !!isinf(x); + } + return !_finite(static_cast(x)); + } + + // Portable version of isnan. + template + static bool isnotanumber(T x) { + using namespace fmt::internal; + if (check(sizeof(isnan(x)) == sizeof(bool) || + sizeof(isnan(x)) == sizeof(int))) { + return !!isnan(x); + } + return _isnan(static_cast(x)) != 0; + } + + // Portable version of signbit. + static bool isnegative(double x) { + using namespace fmt::internal; + if (check(sizeof(signbit(x)) == sizeof(int))) + return !!signbit(x); + if (x < 0) return true; + if (!isnotanumber(x)) return false; + int dec = 0, sign = 0; + char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. + _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); + return sign != 0; + } +}; +} // namespace std + +namespace fmt { + +// Fix the warning about long long on older versions of GCC +// that don't support the diagnostic pragma. +FMT_GCC_EXTENSION typedef long long LongLong; +FMT_GCC_EXTENSION typedef unsigned long long ULongLong; + +#if FMT_USE_RVALUE_REFERENCES +using std::move; +#endif + +template +class BasicWriter; + +typedef BasicWriter Writer; +typedef BasicWriter WWriter; + +template +class BasicFormatter; + +template +void format(BasicFormatter &f, const Char *&format_str, const T &value); + +/** + \rst + A string reference. It can be constructed from a C string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +------------+-------------------------+ + | Type | Definition | + +============+=========================+ + | StringRef | BasicStringRef | + +------------+-------------------------+ + | WStringRef | BasicStringRef | + +------------+-------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(StringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicStringRef { + private: + const Char *data_; + std::size_t size_; + + public: + /** Constructs a string reference object from a C string and a size. */ + BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + BasicStringRef(const Char *s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicStringRef(const std::basic_string &s) + : data_(s.c_str()), size_(s.size()) {} + + /** + \rst + Converts a string reference to an ``std::string`` object. + \endrst + */ + std::basic_string to_string() const { + return std::basic_string(data_, size_); + } + + /** Returns the pointer to a C string. */ + const Char *data() const { return data_; } + + /** Returns the string size. */ + std::size_t size() const { return size_; } + + // Lexicographically compare this string reference to other. + int compare(BasicStringRef other) const { + std::size_t size = std::min(size_, other.size_); + int result = std::char_traits::compare(data_, other.data_, size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) != 0; + } + friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) >= 0; + } +}; + +typedef BasicStringRef StringRef; +typedef BasicStringRef WStringRef; + +/** + \rst + A reference to a null terminated string. It can be constructed from a C + string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +-------------+--------------------------+ + | Type | Definition | + +=============+==========================+ + | CStringRef | BasicCStringRef | + +-------------+--------------------------+ + | WCStringRef | BasicCStringRef | + +-------------+--------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(CStringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicCStringRef { + private: + const Char *data_; + + public: + /** Constructs a string reference object from a C string. */ + BasicCStringRef(const Char *s) : data_(s) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} + + /** Returns the pointer to a C string. */ + const Char *c_str() const { return data_; } +}; + +typedef BasicCStringRef CStringRef; +typedef BasicCStringRef WCStringRef; + +/** + A formatting error such as invalid format string. +*/ +class FormatError : public std::runtime_error { + public: + explicit FormatError(CStringRef message) + : std::runtime_error(message.c_str()) {} +}; + +namespace internal { +// The number of characters to store in the MemoryBuffer object itself +// to avoid dynamic memory allocation. +enum { INLINE_BUFFER_SIZE = 500 }; + +#if FMT_SECURE_SCL +// Use checked iterator to avoid warnings on MSVC. +template +inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) { + return stdext::checked_array_iterator(ptr, size); +} +#else +template +inline T *make_ptr(T *ptr, std::size_t) { return ptr; } +#endif +} // namespace internal + +/** + \rst + A buffer supporting a subset of ``std::vector``'s operations. + \endrst + */ +template +class Buffer { + private: + FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); + + protected: + T *ptr_; + std::size_t size_; + std::size_t capacity_; + + Buffer(T *ptr = 0, std::size_t capacity = 0) + : ptr_(ptr), size_(0), capacity_(capacity) {} + + /** + \rst + Increases the buffer capacity to hold at least *size* elements updating + ``ptr_`` and ``capacity_``. + \endrst + */ + virtual void grow(std::size_t size) = 0; + + public: + virtual ~Buffer() {} + + /** Returns the size of this buffer. */ + std::size_t size() const { return size_; } + + /** Returns the capacity of this buffer. */ + std::size_t capacity() const { return capacity_; } + + /** + Resizes the buffer. If T is a POD type new elements may not be initialized. + */ + void resize(std::size_t new_size) { + if (new_size > capacity_) + grow(new_size); + size_ = new_size; + } + + /** + \rst + Reserves space to store at least *capacity* elements. + \endrst + */ + void reserve(std::size_t capacity) { + if (capacity > capacity_) + grow(capacity); + } + + void clear() FMT_NOEXCEPT { size_ = 0; } + + void push_back(const T &value) { + if (size_ == capacity_) + grow(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template + void append(const U *begin, const U *end); + + T &operator[](std::size_t index) { return ptr_[index]; } + const T &operator[](std::size_t index) const { return ptr_[index]; } +}; + +template +template +void Buffer::append(const U *begin, const U *end) { + assert(begin <= end); + std::size_t new_size = size_ + (end - begin); + if (new_size > capacity_) + grow(new_size); + std::copy(begin, end, internal::make_ptr(ptr_, capacity_) + size_); + size_ = new_size; +} + +namespace internal { + +// A memory buffer for POD types with the first SIZE elements stored in +// the object itself. +template > +class MemoryBuffer : private Allocator, public Buffer { + private: + T data_[SIZE]; + + // Deallocate memory allocated by the buffer. + void deallocate() { + if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); + } + + protected: + void grow(std::size_t size); + + public: + explicit MemoryBuffer(const Allocator &alloc = Allocator()) + : Allocator(alloc), Buffer(data_, SIZE) {} + ~MemoryBuffer() { deallocate(); } + +#if FMT_USE_RVALUE_REFERENCES + private: + // Move data from other to this buffer. + void move(MemoryBuffer &other) { + Allocator &this_alloc = *this, &other_alloc = other; + this_alloc = std::move(other_alloc); + this->size_ = other.size_; + this->capacity_ = other.capacity_; + if (other.ptr_ == other.data_) { + this->ptr_ = data_; + std::copy(other.data_, + other.data_ + this->size_, make_ptr(data_, this->capacity_)); + } else { + this->ptr_ = other.ptr_; + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.ptr_ = other.data_; + } + } + + public: + MemoryBuffer(MemoryBuffer &&other) { + move(other); + } + + MemoryBuffer &operator=(MemoryBuffer &&other) { + assert(this != &other); + deallocate(); + move(other); + return *this; + } +#endif + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const { return *this; } +}; + +template +void MemoryBuffer::grow(std::size_t size) { + std::size_t new_capacity = + (std::max)(size, this->capacity_ + this->capacity_ / 2); + T *new_ptr = this->allocate(new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::copy(this->ptr_, + this->ptr_ + this->size_, make_ptr(new_ptr, new_capacity)); + std::size_t old_capacity = this->capacity_; + T *old_ptr = this->ptr_; + this->capacity_ = new_capacity; + this->ptr_ = new_ptr; + // deallocate may throw (at least in principle), but it doesn't matter since + // the buffer already uses the new storage and will deallocate it in case + // of exception. + if (old_ptr != data_) + Allocator::deallocate(old_ptr, old_capacity); +} + +// A fixed-size buffer. +template +class FixedBuffer : public fmt::Buffer { + public: + FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} + + protected: + void grow(std::size_t size); +}; + +template +class BasicCharTraits { + public: +#if FMT_SECURE_SCL + typedef stdext::checked_array_iterator CharPtr; +#else + typedef Char *CharPtr; +#endif + static Char cast(wchar_t value) { return static_cast(value); } +}; + +template +class CharTraits; + +template <> +class CharTraits : public BasicCharTraits { + private: + // Conversion from wchar_t to char is not allowed. + static char convert(wchar_t); + + public: + static char convert(char value) { return value; } + + // Formats a floating-point number. + template + static int format_float(char *buffer, std::size_t size, + const char *format, unsigned width, int precision, T value); +}; + +template <> +class CharTraits : public BasicCharTraits { + public: + static wchar_t convert(char value) { return value; } + static wchar_t convert(wchar_t value) { return value; } + + template + static int format_float(wchar_t *buffer, std::size_t size, + const wchar_t *format, unsigned width, int precision, T value); +}; + +// Checks if a number is negative - used to avoid warnings. +template +struct SignChecker { + template + static bool is_negative(T value) { return value < 0; } +}; + +template <> +struct SignChecker { + template + static bool is_negative(T) { return false; } +}; + +// Returns true if value is negative, false otherwise. +// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. +template +inline bool is_negative(T value) { + return SignChecker::is_signed>::is_negative(value); +} + +// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. +template +struct TypeSelector { typedef uint32_t Type; }; + +template <> +struct TypeSelector { typedef uint64_t Type; }; + +template +struct IntTraits { + // Smallest of uint32_t and uint64_t that is large enough to represent + // all values of T. + typedef typename + TypeSelector::digits <= 32>::Type MainType; +}; + +// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. +template +struct MakeUnsigned { typedef T Type; }; + +#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ + template <> \ + struct MakeUnsigned { typedef U Type; } + +FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); +FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); +FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); +FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); + +void report_unknown_type(char code, const char *type); + +// Static data is placed in this class template to allow header-only +// configuration. +template +struct BasicData { + static const uint32_t POWERS_OF_10_32[]; + static const uint64_t POWERS_OF_10_64[]; + static const char DIGITS[]; +}; + +typedef BasicData<> Data; + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline unsigned count_digits(uint64_t n) { + // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. + unsigned t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return t - (n < Data::POWERS_OF_10_64[t]) + 1; +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline unsigned count_digits(uint64_t n) { + unsigned count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline unsigned count_digits(uint32_t n) { + uint32_t t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return t - (n < Data::POWERS_OF_10_32[t]) + 1; +} +#endif + +// Formats a decimal unsigned integer value writing into buffer. +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) { + buffer += num_digits; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer = Data::DIGITS[index + 1]; + *--buffer = Data::DIGITS[index]; + } + if (value < 10) { + *--buffer = static_cast('0' + value); + return; + } + unsigned index = static_cast(value * 2); + *--buffer = Data::DIGITS[index + 1]; + *--buffer = Data::DIGITS[index]; +} + +#ifndef _WIN32 +# define FMT_USE_WINDOWS_H 0 +#elif !defined(FMT_USE_WINDOWS_H) +# define FMT_USE_WINDOWS_H 1 +#endif + +// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. +// All the functionality that relies on it will be disabled too. +#if FMT_USE_WINDOWS_H +// A converter from UTF-8 to UTF-16. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF8ToUTF16 { + private: + MemoryBuffer buffer_; + + public: + explicit UTF8ToUTF16(StringRef s); + operator WStringRef() const { return WStringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const wchar_t *c_str() const { return &buffer_[0]; } + std::wstring str() const { return std::wstring(&buffer_[0], size()); } +}; + +// A converter from UTF-16 to UTF-8. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF16ToUTF8 { + private: + MemoryBuffer buffer_; + + public: + UTF16ToUTF8() {} + explicit UTF16ToUTF8(WStringRef s); + operator StringRef() const { return StringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const char *c_str() const { return &buffer_[0]; } + std::string str() const { return std::string(&buffer_[0], size()); } + + // Performs conversion returning a system error code instead of + // throwing exception on conversion error. This method may still throw + // in case of memory allocation error. + int convert(WStringRef s); +}; + +void format_windows_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; +#endif + +void format_system_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; + +// A formatting argument value. +struct Value { + template + struct StringValue { + const Char *value; + std::size_t size; + }; + + typedef void (*FormatFunc)( + void *formatter, const void *arg, void *format_str_ptr); + + struct CustomValue { + const void *value; + FormatFunc format; + }; + + union { + int int_value; + unsigned uint_value; + LongLong long_long_value; + ULongLong ulong_long_value; + double double_value; + long double long_double_value; + const void *pointer; + StringValue string; + StringValue sstring; + StringValue ustring; + StringValue wstring; + CustomValue custom; + }; + + enum Type { + NONE, NAMED_ARG, + // Integer types should go first, + INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, + // followed by floating-point types. + DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, + CSTRING, STRING, WSTRING, POINTER, CUSTOM + }; +}; + +// A formatting argument. It is a POD type to allow storage in +// internal::MemoryBuffer. +struct Arg : Value { + Type type; +}; + +template +struct NamedArg; + +template +struct Null {}; + +// A helper class template to enable or disable overloads taking wide +// characters and strings in MakeValue. +template +struct WCharHelper { + typedef Null Supported; + typedef T Unsupported; +}; + +template +struct WCharHelper { + typedef T Supported; + typedef Null Unsupported; +}; + +typedef char Yes[1]; +typedef char No[2]; + +// These are non-members to workaround an overload resolution bug in bcc32. +Yes &convert(fmt::ULongLong); +Yes &convert(std::ostream &); +No &convert(...); + +template +T &get(); + +struct DummyStream : std::ostream { + // Hide all operator<< overloads from std::ostream. + void operator<<(Null<>); +}; + +No &operator<<(std::ostream &, int); + +template +struct ConvertToIntImpl { + enum { value = false }; +}; + +template +struct ConvertToIntImpl { + // Convert to int only if T doesn't have an overloaded operator<<. + enum { + value = sizeof(convert(get() << get())) == sizeof(No) + }; +}; + +template +struct ConvertToIntImpl2 { + enum { value = false }; +}; + +template +struct ConvertToIntImpl2 { + enum { + // Don't convert numeric types. + value = ConvertToIntImpl::is_specialized>::value + }; +}; + +template +struct ConvertToInt { + enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; + enum { value = ConvertToIntImpl2::value }; +}; + +#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ + template <> \ + struct ConvertToInt { enum { value = 0 }; } + +// Silence warnings about convering float to int. +FMT_DISABLE_CONVERSION_TO_INT(float); +FMT_DISABLE_CONVERSION_TO_INT(double); +FMT_DISABLE_CONVERSION_TO_INT(long double); + +template +struct EnableIf {}; + +template +struct EnableIf { typedef T type; }; + +template +struct Conditional { typedef T type; }; + +template +struct Conditional { typedef F type; }; + +// For bcc32 which doesn't understand ! in template arguments. +template +struct Not { enum { value = 0 }; }; + +template<> +struct Not { enum { value = 1 }; }; + +// Makes an Arg object from any type. +template +class MakeValue : public Arg { + private: + // The following two methods are private to disallow formatting of + // arbitrary pointers. If you want to output a pointer cast it to + // "void *" or "const void *". In particular, this forbids formatting + // of "[const] volatile char *" which is printed as bool by iostreams. + // Do not implement! + template + MakeValue(const T *value); + template + MakeValue(T *value); + + // The following methods are private to disallow formatting of wide + // characters and strings into narrow strings as in + // fmt::format("{}", L"test"); + // To fix this, use a wide format string: fmt::format(L"{}", L"test"). +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Unsupported); +#endif + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + + void set_string(StringRef str) { + string.value = str.data(); + string.size = str.size(); + } + + void set_string(WStringRef str) { + wstring.value = str.data(); + wstring.size = str.size(); + } + + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg( + void *formatter, const void *arg, void *format_str_ptr) { + format(*static_cast*>(formatter), + *static_cast(format_str_ptr), + *static_cast(arg)); + } + + public: + MakeValue() {} + +#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ + MakeValue(Type value) { field = rhs; } \ + static uint64_t type(Type) { return Arg::TYPE; } + +#define FMT_MAKE_VALUE(Type, field, TYPE) \ + FMT_MAKE_VALUE_(Type, field, TYPE, value) + + FMT_MAKE_VALUE(bool, int_value, BOOL) + FMT_MAKE_VALUE(short, int_value, INT) + FMT_MAKE_VALUE(unsigned short, uint_value, UINT) + FMT_MAKE_VALUE(int, int_value, INT) + FMT_MAKE_VALUE(unsigned, uint_value, UINT) + + MakeValue(long value) { + // To minimize the number of types we need to deal with, long is + // translated either to int or to long long depending on its size. + if (check(sizeof(long) == sizeof(int))) + int_value = static_cast(value); + else + long_long_value = value; + } + static uint64_t type(long) { + return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; + } + + MakeValue(unsigned long value) { + if (check(sizeof(unsigned long) == sizeof(unsigned))) + uint_value = static_cast(value); + else + ulong_long_value = value; + } + static uint64_t type(unsigned long) { + return sizeof(unsigned long) == sizeof(unsigned) ? + Arg::UINT : Arg::ULONG_LONG; + } + + FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) + FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) + FMT_MAKE_VALUE(float, double_value, DOUBLE) + FMT_MAKE_VALUE(double, double_value, DOUBLE) + FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) + FMT_MAKE_VALUE(signed char, int_value, INT) + FMT_MAKE_VALUE(unsigned char, uint_value, UINT) + FMT_MAKE_VALUE(char, int_value, CHAR) + +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Supported value) { + int_value = value; + } + static uint64_t type(wchar_t) { return Arg::CHAR; } +#endif + +#define FMT_MAKE_STR_VALUE(Type, TYPE) \ + MakeValue(Type value) { set_string(value); } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_VALUE(char *, string.value, CSTRING) + FMT_MAKE_VALUE(const char *, string.value, CSTRING) + FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) + FMT_MAKE_STR_VALUE(const std::string &, STRING) + FMT_MAKE_STR_VALUE(StringRef, STRING) + FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) + +#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ + MakeValue(typename WCharHelper::Supported value) { \ + set_string(value); \ + } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) + FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) + + FMT_MAKE_VALUE(void *, pointer, POINTER) + FMT_MAKE_VALUE(const void *, pointer, POINTER) + + template + MakeValue(const T &value, + typename EnableIf::value>::value, int>::type = 0) { + custom.value = &value; + custom.format = &format_custom_arg; + } + + template + MakeValue(const T &value, + typename EnableIf::value, int>::type = 0) { + int_value = value; + } + + template + static uint64_t type(const T &) { + return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; + } + + // Additional template param `Char_` is needed here because make_type always + // uses MakeValue. + template + MakeValue(const NamedArg &value) { pointer = &value; } + + template + static uint64_t type(const NamedArg &) { return Arg::NAMED_ARG; } +}; + +template +struct NamedArg : Arg { + BasicStringRef name; + + template + NamedArg(BasicStringRef argname, const T &value) + : Arg(MakeValue(value)), name(argname) { + type = static_cast(MakeValue::type(value)); + } +}; + +#define FMT_DISPATCH(call) static_cast(this)->call + +// An argument visitor. +// To use ArgVisitor define a subclass that implements some or all of the +// visit methods with the same signatures as the methods in ArgVisitor, +// for example, visit_int(int). +// Specify the subclass name as the Impl template parameter. Then calling +// ArgVisitor::visit for some argument will dispatch to a visit method +// specific to the argument type. For example, if the argument type is +// double then visit_double(double) method of a subclass will be called. +// If the subclass doesn't contain a method with this signature, then +// a corresponding method of ArgVisitor will be called. +// +// Example: +// class MyArgVisitor : public ArgVisitor { +// public: +// void visit_int(int value) { print("{}", value); } +// void visit_double(double value) { print("{}", value ); } +// }; +// +// ArgVisitor uses the curiously recurring template pattern: +// http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern +template +class ArgVisitor { + public: + void report_unhandled_arg() {} + + Result visit_unhandled_arg() { + FMT_DISPATCH(report_unhandled_arg()); + return Result(); + } + + Result visit_int(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + Result visit_long_long(LongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + Result visit_uint(unsigned value) { + return FMT_DISPATCH(visit_any_int(value)); + } + Result visit_ulong_long(ULongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + Result visit_bool(bool value) { + return FMT_DISPATCH(visit_any_int(value)); + } + Result visit_char(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + template + Result visit_any_int(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + Result visit_double(double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + Result visit_long_double(long double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + template + Result visit_any_double(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + Result visit_cstring(const char *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + Result visit_string(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + Result visit_wstring(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + Result visit_pointer(const void *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + Result visit_custom(Arg::CustomValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + Result visit(const Arg &arg) { + switch (arg.type) { + default: + FMT_ASSERT(false, "invalid argument type"); + return Result(); + case Arg::INT: + return FMT_DISPATCH(visit_int(arg.int_value)); + case Arg::UINT: + return FMT_DISPATCH(visit_uint(arg.uint_value)); + case Arg::LONG_LONG: + return FMT_DISPATCH(visit_long_long(arg.long_long_value)); + case Arg::ULONG_LONG: + return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); + case Arg::BOOL: + return FMT_DISPATCH(visit_bool(arg.int_value != 0)); + case Arg::CHAR: + return FMT_DISPATCH(visit_char(arg.int_value)); + case Arg::DOUBLE: + return FMT_DISPATCH(visit_double(arg.double_value)); + case Arg::LONG_DOUBLE: + return FMT_DISPATCH(visit_long_double(arg.long_double_value)); + case Arg::CSTRING: + return FMT_DISPATCH(visit_cstring(arg.string.value)); + case Arg::STRING: + return FMT_DISPATCH(visit_string(arg.string)); + case Arg::WSTRING: + return FMT_DISPATCH(visit_wstring(arg.wstring)); + case Arg::POINTER: + return FMT_DISPATCH(visit_pointer(arg.pointer)); + case Arg::CUSTOM: + return FMT_DISPATCH(visit_custom(arg.custom)); + } + } +}; + +class RuntimeError : public std::runtime_error { + protected: + RuntimeError() : std::runtime_error("") {} +}; + +template +class BasicArgFormatter; + +template +class PrintfArgFormatter; + +template +class ArgMap; +} // namespace internal + +/** An argument list. */ +class ArgList { + private: + // To reduce compiled code size per formatting function call, types of first + // MAX_PACKED_ARGS arguments are passed in the types_ field. + uint64_t types_; + union { + // If the number of arguments is less than MAX_PACKED_ARGS, the argument + // values are stored in values_, otherwise they are stored in args_. + // This is done to reduce compiled code size as storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const internal::Value *values_; + const internal::Arg *args_; + }; + + internal::Arg::Type type(unsigned index) const { + unsigned shift = index * 4; + uint64_t mask = 0xf; + return static_cast( + (types_ & (mask << shift)) >> shift); + } + + template + friend class internal::ArgMap; + + public: + // Maximum number of arguments with packed types. + enum { MAX_PACKED_ARGS = 16 }; + + ArgList() : types_(0) {} + + ArgList(ULongLong types, const internal::Value *values) + : types_(types), values_(values) {} + ArgList(ULongLong types, const internal::Arg *args) + : types_(types), args_(args) {} + + /** Returns the argument at specified index. */ + internal::Arg operator[](unsigned index) const { + using internal::Arg; + Arg arg; + bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; + if (index < MAX_PACKED_ARGS) { + Arg::Type arg_type = type(index); + internal::Value &val = arg; + if (arg_type != Arg::NONE) + val = use_values ? values_[index] : args_[index]; + arg.type = arg_type; + return arg; + } + if (use_values) { + // The index is greater than the number of arguments that can be stored + // in values, so return a "none" argument. + arg.type = Arg::NONE; + return arg; + } + for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) { + if (args_[i].type == Arg::NONE) + return args_[i]; + } + return args_[index]; + } +}; + +struct FormatSpec; + +namespace internal { + +template +class ArgMap { + private: + typedef std::map, internal::Arg> MapType; + typedef typename MapType::value_type Pair; + + MapType map_; + + public: + void init(const ArgList &args); + + const internal::Arg* find(const fmt::BasicStringRef &name) const { + typename MapType::const_iterator it = map_.find(name); + return it != map_.end() ? &it->second : 0; + } +}; + +class FormatterBase { + private: + ArgList args_; + int next_arg_index_; + + // Returns the argument with specified index. + Arg do_get_arg(unsigned arg_index, const char *&error); + + protected: + const ArgList &args() const { return args_; } + + explicit FormatterBase(const ArgList &args) { + args_ = args; + next_arg_index_ = 0; + } + + // Returns the next argument. + Arg next_arg(const char *&error); + + // Checks if manual indexing is used and returns the argument with + // specified index. + Arg get_arg(unsigned arg_index, const char *&error); + + bool check_no_auto_index(const char *&error); + + template + void write(BasicWriter &w, const Char *start, const Char *end) { + if (start != end) + w << BasicStringRef(start, end - start); + } +}; + +// A printf formatter. +template +class PrintfFormatter : private FormatterBase { + private: + void parse_flags(FormatSpec &spec, const Char *&s); + + // Returns the argument with specified index or, if arg_index is equal + // to the maximum unsigned value, the next argument. + Arg get_arg(const Char *s, + unsigned arg_index = (std::numeric_limits::max)()); + + // Parses argument index, flags and width and returns the argument index. + unsigned parse_header(const Char *&s, FormatSpec &spec); + + public: + explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} + void format(BasicWriter &writer, BasicCStringRef format_str); +}; +} // namespace internal + +// A formatter. +template +class BasicFormatter : private internal::FormatterBase { + private: + BasicWriter &writer_; + internal::ArgMap map_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); + + using internal::FormatterBase::get_arg; + + // Checks if manual indexing is used and returns the argument with + // specified name. + internal::Arg get_arg(BasicStringRef arg_name, const char *&error); + + // Parses argument index and returns corresponding argument. + internal::Arg parse_arg_index(const Char *&s); + + // Parses argument name and returns corresponding argument. + internal::Arg parse_arg_name(const Char *&s); + + public: + BasicFormatter(const ArgList &args, BasicWriter &w) + : internal::FormatterBase(args), writer_(w) {} + + BasicWriter &writer() { return writer_; } + + void format(BasicCStringRef format_str); + + const Char *format(const Char *&format_str, const internal::Arg &arg); +}; + +enum Alignment { + ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC +}; + +// Flags. +enum { + SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, + CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. +}; + +// An empty format specifier. +struct EmptySpec {}; + +// A type specifier. +template +struct TypeSpec : EmptySpec { + Alignment align() const { return ALIGN_DEFAULT; } + unsigned width() const { return 0; } + int precision() const { return -1; } + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } + char fill() const { return ' '; } +}; + +// A width specifier. +struct WidthSpec { + unsigned width_; + // Fill is always wchar_t and cast to char if necessary to avoid having + // two specialization of WidthSpec and its subclasses. + wchar_t fill_; + + WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} + + unsigned width() const { return width_; } + wchar_t fill() const { return fill_; } +}; + +// An alignment specifier. +struct AlignSpec : WidthSpec { + Alignment align_; + + AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) + : WidthSpec(width, fill), align_(align) {} + + Alignment align() const { return align_; } + + int precision() const { return -1; } +}; + +// An alignment and type specifier. +template +struct AlignTypeSpec : AlignSpec { + AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} + + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } +}; + +// A full format specifier. +struct FormatSpec : AlignSpec { + unsigned flags_; + int precision_; + char type_; + + FormatSpec( + unsigned width = 0, char type = 0, wchar_t fill = ' ') + : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} + + bool flag(unsigned f) const { return (flags_ & f) != 0; } + int precision() const { return precision_; } + char type() const { return type_; } +}; + +// An integer format specifier. +template , typename Char = char> +class IntFormatSpec : public SpecT { + private: + T value_; + + public: + IntFormatSpec(T val, const SpecT &spec = SpecT()) + : SpecT(spec), value_(val) {} + + T value() const { return value_; } +}; + +// A string format specifier. +template +class StrFormatSpec : public AlignSpec { + private: + const Char *str_; + + public: + template + StrFormatSpec(const Char *str, unsigned width, FillChar fill) + : AlignSpec(width, fill), str_(str) { + internal::CharTraits::convert(FillChar()); + } + + const Char *str() const { return str_; } +}; + +/** + Returns an integer format specifier to format the value in base 2. + */ +IntFormatSpec > bin(int value); + +/** + Returns an integer format specifier to format the value in base 8. + */ +IntFormatSpec > oct(int value); + +/** + Returns an integer format specifier to format the value in base 16 using + lower-case letters for the digits above 9. + */ +IntFormatSpec > hex(int value); + +/** + Returns an integer formatter format specifier to format in base 16 using + upper-case letters for the digits above 9. + */ +IntFormatSpec > hexu(int value); + +/** + \rst + Returns an integer format specifier to pad the formatted argument with the + fill character to the specified width using the default (right) numeric + alignment. + + **Example**:: + + MemoryWriter out; + out << pad(hex(0xcafe), 8, '0'); + // out.str() == "0000cafe" + + \endrst + */ +template +IntFormatSpec, Char> pad( + int value, unsigned width, Char fill = ' '); + +#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ +inline IntFormatSpec > bin(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'b'>()); \ +} \ + \ +inline IntFormatSpec > oct(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'o'>()); \ +} \ + \ +inline IntFormatSpec > hex(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'x'>()); \ +} \ + \ +inline IntFormatSpec > hexu(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'X'>()); \ +} \ + \ +template \ +inline IntFormatSpec > pad( \ + IntFormatSpec > f, unsigned width) { \ + return IntFormatSpec >( \ + f.value(), AlignTypeSpec(width, ' ')); \ +} \ + \ +/* For compatibility with older compilers we provide two overloads for pad, */ \ +/* one that takes a fill character and one that doesn't. In the future this */ \ +/* can be replaced with one overload making the template argument Char */ \ +/* default to char (C++11). */ \ +template \ +inline IntFormatSpec, Char> pad( \ + IntFormatSpec, Char> f, \ + unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + f.value(), AlignTypeSpec(width, fill)); \ +} \ + \ +inline IntFormatSpec > pad( \ + TYPE value, unsigned width) { \ + return IntFormatSpec >( \ + value, AlignTypeSpec<0>(width, ' ')); \ +} \ + \ +template \ +inline IntFormatSpec, Char> pad( \ + TYPE value, unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + value, AlignTypeSpec<0>(width, fill)); \ +} + +FMT_DEFINE_INT_FORMATTERS(int) +FMT_DEFINE_INT_FORMATTERS(long) +FMT_DEFINE_INT_FORMATTERS(unsigned) +FMT_DEFINE_INT_FORMATTERS(unsigned long) +FMT_DEFINE_INT_FORMATTERS(LongLong) +FMT_DEFINE_INT_FORMATTERS(ULongLong) + +/** + \rst + Returns a string formatter that pads the formatted argument with the fill + character to the specified width using the default (left) string alignment. + + **Example**:: + + std::string s = str(MemoryWriter() << pad("abc", 8)); + // s == "abc " + + \endrst + */ +template +inline StrFormatSpec pad( + const Char *str, unsigned width, Char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +inline StrFormatSpec pad( + const wchar_t *str, unsigned width, char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +// Generates a comma-separated list with results of applying f to +// numbers 0..n-1. +# define FMT_GEN(n, f) FMT_GEN##n(f) +# define FMT_GEN1(f) f(0) +# define FMT_GEN2(f) FMT_GEN1(f), f(1) +# define FMT_GEN3(f) FMT_GEN2(f), f(2) +# define FMT_GEN4(f) FMT_GEN3(f), f(3) +# define FMT_GEN5(f) FMT_GEN4(f), f(4) +# define FMT_GEN6(f) FMT_GEN5(f), f(5) +# define FMT_GEN7(f) FMT_GEN6(f), f(6) +# define FMT_GEN8(f) FMT_GEN7(f), f(7) +# define FMT_GEN9(f) FMT_GEN8(f), f(8) +# define FMT_GEN10(f) FMT_GEN9(f), f(9) +# define FMT_GEN11(f) FMT_GEN10(f), f(10) +# define FMT_GEN12(f) FMT_GEN11(f), f(11) +# define FMT_GEN13(f) FMT_GEN12(f), f(12) +# define FMT_GEN14(f) FMT_GEN13(f), f(13) +# define FMT_GEN15(f) FMT_GEN14(f), f(14) + +namespace internal { +inline uint64_t make_type() { return 0; } + +template +inline uint64_t make_type(const T &arg) { return MakeValue::type(arg); } + +template +struct ArgArray { + // Computes the argument array size by adding 1 to N, which is the number of + // arguments, if N is zero, because array of zero size is invalid, or if N + // is greater than ArgList::MAX_PACKED_ARGS to accommodate for an extra + // argument that marks the end of the list. + enum { SIZE = N + (N == 0 || N >= ArgList::MAX_PACKED_ARGS ? 1 : 0) }; + + typedef typename Conditional< + (N < ArgList::MAX_PACKED_ARGS), Value, Arg>::type Type[SIZE]; +}; + +#if FMT_USE_VARIADIC_TEMPLATES +template +inline uint64_t make_type(const Arg &first, const Args & ... tail) { + return make_type(first) | (make_type(tail...) << 4); +} + +inline void do_set_types(Arg *) {} + +template +inline void do_set_types(Arg *args, const T &arg, const Args & ... tail) { + args->type = static_cast(MakeValue::type(arg)); + do_set_types(args + 1, tail...); +} + +template +inline void set_types(Arg *array, const Args & ... args) { + if (check(sizeof...(Args) > ArgList::MAX_PACKED_ARGS)) + do_set_types(array, args...); + array[sizeof...(Args)].type = Arg::NONE; +} + +template +inline void set_types(Value *, const Args & ...) { + // Do nothing as types are passed separately from values. +} + +template +inline void store_args(Value *) {} + +template +inline void store_args(Arg *args, const T &arg, const Args & ... tail) { + // Assign only the Value subobject of Arg and don't overwrite type (if any) + // that is assigned by set_types. + Value &value = *args; + value = MakeValue(arg); + store_args(args + 1, tail...); +} + +template +ArgList make_arg_list(typename ArgArray::Type array, + const Args & ... args) { + if (check(sizeof...(Args) >= ArgList::MAX_PACKED_ARGS)) + set_types(array, args...); + store_args(array, args...); + return ArgList(make_type(args...), array); +} +#else + +struct ArgType { + uint64_t type; + + ArgType() : type(0) {} + + template + ArgType(const T &arg) : type(make_type(arg)) {} +}; + +# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() + +inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { + return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | + (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | + (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | + (t12.type << 48) | (t13.type << 52) | (t14.type << 56); +} +#endif + +template +class FormatBuf : public std::basic_streambuf { + private: + typedef typename std::basic_streambuf::int_type int_type; + typedef typename std::basic_streambuf::traits_type traits_type; + + Buffer &buffer_; + Char *start_; + + public: + FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { + this->setp(start_, start_ + buffer_.capacity()); + } + + int_type overflow(int_type ch = traits_type::eof()) { + if (!traits_type::eq_int_type(ch, traits_type::eof())) { + size_t size = this->pptr() - start_; + buffer_.resize(size); + buffer_.reserve(size * 2); + + start_ = &buffer_[0]; + start_[size] = traits_type::to_char_type(ch); + this->setp(start_+ size + 1, start_ + size * 2); + } + return ch; + } + + size_t size() const { + return this->pptr() - start_; + } +}; +} // namespace internal + +# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n +# define FMT_MAKE_ARG_TYPE(n) T##n +# define FMT_MAKE_ARG(n) const T##n &v##n +# define FMT_ASSIGN_char(n) arr[n] = fmt::internal::MakeValue(v##n) +# define FMT_ASSIGN_wchar_t(n) arr[n] = fmt::internal::MakeValue(v##n) + +#if FMT_USE_VARIADIC_TEMPLATES +// Defines a variadic function returning void. +# define FMT_VARIADIC_VOID(func, arg_type) \ + template \ + void func(arg_type arg0, const Args & ... args) { \ + typename fmt::internal::ArgArray::Type array; \ + func(arg0, fmt::internal::make_arg_list(array, args...)); \ + } + +// Defines a variadic constructor. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ + typename fmt::internal::ArgArray::Type array; \ + func(arg0, arg1, fmt::internal::make_arg_list(array, args...)); \ + } + +#else + +# define FMT_MAKE_REF(n) fmt::internal::MakeValue(v##n) +# define FMT_MAKE_REF2(n) v##n + +// Defines a wrapper for a function taking one argument of type arg_type +// and n additional arguments of arbitrary types. +# define FMT_WRAP1(func, arg_type, n) \ + template \ + inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic function returning void on a pre-C++11 compiler. +# define FMT_VARIADIC_VOID(func, arg_type) \ + inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ + FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ + FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ + FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ + FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ + FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) + +# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg0, arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic constructor on a pre-C++11 compiler. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) +#endif + +// Generates a comma-separated list with results of applying f to pairs +// (argument, index). +#define FMT_FOR_EACH1(f, x0) f(x0, 0) +#define FMT_FOR_EACH2(f, x0, x1) \ + FMT_FOR_EACH1(f, x0), f(x1, 1) +#define FMT_FOR_EACH3(f, x0, x1, x2) \ + FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) +#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ + FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) +#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ + FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) +#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ + FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) +#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ + FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) +#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ + FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) +#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ + FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) +#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) + +/** + An error returned by an operating system or a language runtime, + for example a file opening error. +*/ +class SystemError : public internal::RuntimeError { + private: + void init(int err_code, CStringRef format_str, ArgList args); + + protected: + int error_code_; + + typedef char Char; // For FMT_VARIADIC_CTOR. + + SystemError() {} + + public: + /** + \rst + Constructs a :class:`fmt::SystemError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is + the system message corresponding to the error code. + *error_code* is a system error code as given by ``errno``. + If *error_code* is not a valid error code such as -1, the system message + may look like "Unknown error -1" and is platform-dependent. + + **Example**:: + + // This throws a SystemError with the description + // cannot open file 'madeup': No such file or directory + // or similar (system message may vary). + const char *filename = "madeup"; + std::FILE *file = std::fopen(filename, "r"); + if (!file) + throw fmt::SystemError(errno, "cannot open file '{}'", filename); + \endrst + */ + SystemError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) + + int error_code() const { return error_code_; } +}; + +/** + \rst + This template provides operations for formatting and writing data into + a character stream. The output is stored in a buffer provided by a subclass + such as :class:`fmt::BasicMemoryWriter`. + + You can use one of the following typedefs for common character types: + + +---------+----------------------+ + | Type | Definition | + +=========+======================+ + | Writer | BasicWriter | + +---------+----------------------+ + | WWriter | BasicWriter | + +---------+----------------------+ + + \endrst + */ +template +class BasicWriter { + private: + // Output buffer. + Buffer &buffer_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); + + typedef typename internal::CharTraits::CharPtr CharPtr; + +#if FMT_SECURE_SCL + // Returns pointer value. + static Char *get(CharPtr p) { return p.base(); } +#else + static Char *get(Char *p) { return p; } +#endif + + // Fills the padding around the content and returns the pointer to the + // content area. + static CharPtr fill_padding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); + + // Grows the buffer by n characters and returns a pointer to the newly + // allocated area. + CharPtr grow_buffer(std::size_t n) { + std::size_t size = buffer_.size(); + buffer_.resize(size + n); + return internal::make_ptr(&buffer_[size], n); + } + + // Writes an unsigned decimal integer. + template + Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) { + unsigned num_digits = internal::count_digits(value); + Char *ptr = get(grow_buffer(prefix_size + num_digits)); + internal::format_decimal(ptr + prefix_size, value, num_digits); + return ptr; + } + + // Writes a decimal integer. + template + void write_decimal(Int value) { + typename internal::IntTraits::MainType abs_value = value; + if (internal::is_negative(value)) { + abs_value = 0 - abs_value; + *write_unsigned_decimal(abs_value, 1) = '-'; + } else { + write_unsigned_decimal(abs_value, 0); + } + } + + // Prepare a buffer for integer formatting. + CharPtr prepare_int_buffer(unsigned num_digits, + const EmptySpec &, const char *prefix, unsigned prefix_size) { + unsigned size = prefix_size + num_digits; + CharPtr p = grow_buffer(size); + std::copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + + template + CharPtr prepare_int_buffer(unsigned num_digits, + const Spec &spec, const char *prefix, unsigned prefix_size); + + // Formats an integer. + template + void write_int(T value, Spec spec); + + // Formats a floating-point number (double or long double). + template + void write_double(T value, const FormatSpec &spec); + + // Writes a formatted string. + template + CharPtr write_str( + const StrChar *s, std::size_t size, const AlignSpec &spec); + + template + void write_str( + const internal::Arg::StringValue &str, const FormatSpec &spec); + + // This following methods are private to disallow writing wide characters + // and strings to a char stream. If you want to print a wide string as a + // pointer as std::ostream does, cast it to const void*. + // Do not implement! + void operator<<(typename internal::WCharHelper::Unsupported); + void operator<<( + typename internal::WCharHelper::Unsupported); + + // Appends floating-point length specifier to the format string. + // The second argument is only used for overload resolution. + void append_float_length(Char *&format_ptr, long double) { + *format_ptr++ = 'L'; + } + + template + void append_float_length(Char *&, T) {} + + template + friend class internal::BasicArgFormatter; + + friend class internal::PrintfArgFormatter; + + protected: + /** + Constructs a ``BasicWriter`` object. + */ + explicit BasicWriter(Buffer &b) : buffer_(b) {} + + public: + /** + \rst + Destroys a ``BasicWriter`` object. + \endrst + */ + virtual ~BasicWriter() {} + + /** + Returns the total number of characters written. + */ + std::size_t size() const { return buffer_.size(); } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const Char *c_str() const { + std::size_t size = buffer_.size(); + buffer_.reserve(size + 1); + buffer_[size] = '\0'; + return &buffer_[0]; + } + + /** + \rst + Returns the content of the output buffer as an `std::string`. + \endrst + */ + std::basic_string str() const { + return std::basic_string(&buffer_[0], buffer_.size()); + } + + /** + \rst + Writes formatted data. + + *args* is an argument list representing arbitrary arguments. + + **Example**:: + + MemoryWriter out; + out.write("Current point:\n"); + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + Current point: + (-3.140000, +3.140000) + + The output can be accessed using :func:`data()`, :func:`c_str` or + :func:`str` methods. + + See also :ref:`syntax`. + \endrst + */ + void write(BasicCStringRef format, ArgList args) { + BasicFormatter(args, *this).format(format); + } + FMT_VARIADIC_VOID(write, BasicCStringRef) + + BasicWriter &operator<<(int value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(long value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned long value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(LongLong value) { + write_decimal(value); + return *this; + } + + /** + \rst + Formats *value* and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(ULongLong value) { + return *this << IntFormatSpec(value); + } + + BasicWriter &operator<<(double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + \rst + Formats *value* using the general format for floating-point numbers + (``'g'``) and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(long double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + Writes a character to the stream. + */ + BasicWriter &operator<<(char value) { + buffer_.push_back(value); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + buffer_.push_back(value); + return *this; + } + + /** + \rst + Writes *value* to the stream. + \endrst + */ + BasicWriter &operator<<(fmt::BasicStringRef value) { + const Char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + const char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + template + BasicWriter &operator<<(IntFormatSpec spec) { + internal::CharTraits::convert(FillChar()); + write_int(spec.value(), spec); + return *this; + } + + template + BasicWriter &operator<<(const StrFormatSpec &spec) { + const StrChar *s = spec.str(); + write_str(s, std::char_traits::length(s), spec); + return *this; + } + + void clear() FMT_NOEXCEPT { buffer_.clear(); } +}; + +template +template +typename BasicWriter::CharPtr BasicWriter::write_str( + const StrChar *s, std::size_t size, const AlignSpec &spec) { + CharPtr out = CharPtr(); + if (spec.width() > size) { + out = grow_buffer(spec.width()); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.align() == ALIGN_RIGHT) { + std::fill_n(out, spec.width() - size, fill); + out += spec.width() - size; + } else if (spec.align() == ALIGN_CENTER) { + out = fill_padding(out, spec.width(), size, fill); + } else { + std::fill_n(out + size, spec.width() - size, fill); + } + } else { + out = grow_buffer(size); + } + std::copy(s, s + size, out); + return out; +} + +template +typename BasicWriter::CharPtr + BasicWriter::fill_padding( + CharPtr buffer, unsigned total_size, + std::size_t content_size, wchar_t fill) { + std::size_t padding = total_size - content_size; + std::size_t left_padding = padding / 2; + Char fill_char = internal::CharTraits::cast(fill); + std::fill_n(buffer, left_padding, fill_char); + buffer += left_padding; + CharPtr content = buffer; + std::fill_n(buffer + content_size, padding - left_padding, fill_char); + return content; +} + +template +template +typename BasicWriter::CharPtr + BasicWriter::prepare_int_buffer( + unsigned num_digits, const Spec &spec, + const char *prefix, unsigned prefix_size) { + unsigned width = spec.width(); + Alignment align = spec.align(); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.precision() > static_cast(num_digits)) { + // Octal prefix '0' is counted as a digit, so ignore it if precision + // is specified. + if (prefix_size > 0 && prefix[prefix_size - 1] == '0') + --prefix_size; + unsigned number_size = prefix_size + spec.precision(); + AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); + if (number_size >= width) + return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); + buffer_.reserve(width); + unsigned fill_size = width - number_size; + if (align != ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::fill(p, p + fill_size, fill); + } + CharPtr result = prepare_int_buffer( + num_digits, subspec, prefix, prefix_size); + if (align == ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::fill(p, p + fill_size, fill); + } + return result; + } + unsigned size = prefix_size + num_digits; + if (width <= size) { + CharPtr p = grow_buffer(size); + std::copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + CharPtr p = grow_buffer(width); + CharPtr end = p + width; + if (align == ALIGN_LEFT) { + std::copy(prefix, prefix + prefix_size, p); + p += size; + std::fill(p, end, fill); + } else if (align == ALIGN_CENTER) { + p = fill_padding(p, width, size, fill); + std::copy(prefix, prefix + prefix_size, p); + p += size; + } else { + if (align == ALIGN_NUMERIC) { + if (prefix_size != 0) { + p = std::copy(prefix, prefix + prefix_size, p); + size -= prefix_size; + } + } else { + std::copy(prefix, prefix + prefix_size, end - size); + } + std::fill(p, end - size, fill); + p = end; + } + return p - 1; +} + +template +template +void BasicWriter::write_int(T value, Spec spec) { + unsigned prefix_size = 0; + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType abs_value = value; + char prefix[4] = ""; + if (internal::is_negative(value)) { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } else if (spec.flag(SIGN_FLAG)) { + prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; + ++prefix_size; + } + switch (spec.type()) { + case 0: case 'd': { + unsigned num_digits = internal::count_digits(abs_value); + CharPtr p = prepare_int_buffer( + num_digits, spec, prefix, prefix_size) + 1 - num_digits; + internal::format_decimal(get(p), abs_value, num_digits); + break; + } + case 'x': case 'X': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 4) != 0); + Char *p = get(prepare_int_buffer( + num_digits, spec, prefix, prefix_size)); + n = abs_value; + const char *digits = spec.type() == 'x' ? + "0123456789abcdef" : "0123456789ABCDEF"; + do { + *p-- = digits[n & 0xf]; + } while ((n >>= 4) != 0); + break; + } + case 'b': case 'B': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 1) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 1)); + } while ((n >>= 1) != 0); + break; + } + case 'o': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + prefix[prefix_size++] = '0'; + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 3) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 7)); + } while ((n >>= 3) != 0); + break; + } + default: + internal::report_unknown_type( + spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); + break; + } +} + +template +template +void BasicWriter::write_double( + T value, const FormatSpec &spec) { + // Check type. + char type = spec.type(); + bool upper = false; + switch (type) { + case 0: + type = 'g'; + break; + case 'e': case 'f': case 'g': case 'a': + break; + case 'F': +#ifdef _MSC_VER + // MSVC's printf doesn't support 'F'. + type = 'f'; +#endif + // Fall through. + case 'E': case 'G': case 'A': + upper = true; + break; + default: + internal::report_unknown_type(type, "double"); + break; + } + + char sign = 0; + // Use isnegative instead of value < 0 because the latter is always + // false for NaN. + if (internal::FPUtil::isnegative(static_cast(value))) { + sign = '-'; + value = -value; + } else if (spec.flag(SIGN_FLAG)) { + sign = spec.flag(PLUS_FLAG) ? '+' : ' '; + } + + if (internal::FPUtil::isnotanumber(value)) { + // Format NaN ourselves because sprintf's output is not consistent + // across platforms. + std::size_t nan_size = 4; + const char *nan = upper ? " NAN" : " nan"; + if (!sign) { + --nan_size; + ++nan; + } + CharPtr out = write_str(nan, nan_size, spec); + if (sign) + *out = sign; + return; + } + + if (internal::FPUtil::isinfinity(value)) { + // Format infinity ourselves because sprintf's output is not consistent + // across platforms. + std::size_t inf_size = 4; + const char *inf = upper ? " INF" : " inf"; + if (!sign) { + --inf_size; + ++inf; + } + CharPtr out = write_str(inf, inf_size, spec); + if (sign) + *out = sign; + return; + } + + std::size_t offset = buffer_.size(); + unsigned width = spec.width(); + if (sign) { + buffer_.reserve(buffer_.size() + (std::max)(width, 1u)); + if (width > 0) + --width; + ++offset; + } + + // Build format string. + enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg + Char format[MAX_FORMAT_SIZE]; + Char *format_ptr = format; + *format_ptr++ = '%'; + unsigned width_for_sprintf = width; + if (spec.flag(HASH_FLAG)) + *format_ptr++ = '#'; + if (spec.align() == ALIGN_CENTER) { + width_for_sprintf = 0; + } else { + if (spec.align() == ALIGN_LEFT) + *format_ptr++ = '-'; + if (width != 0) + *format_ptr++ = '*'; + } + if (spec.precision() >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + + append_float_length(format_ptr, value); + *format_ptr++ = type; + *format_ptr = '\0'; + + // Format using snprintf. + Char fill = internal::CharTraits::cast(spec.fill()); + for (;;) { + std::size_t buffer_size = buffer_.capacity() - offset; +#ifdef _MSC_VER + // MSVC's vsnprintf_s doesn't work with zero size, so reserve + // space for at least one extra character to make the size non-zero. + // Note that the buffer's capacity will increase by more than 1. + if (buffer_size == 0) { + buffer_.reserve(offset + 1); + buffer_size = buffer_.capacity() - offset; + } +#endif + Char *start = &buffer_[offset]; + int n = internal::CharTraits::format_float( + start, buffer_size, format, width_for_sprintf, spec.precision(), value); + if (n >= 0 && offset + n < buffer_.capacity()) { + if (sign) { + if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || + *start != ' ') { + *(start - 1) = sign; + sign = 0; + } else { + *(start - 1) = fill; + } + ++n; + } + if (spec.align() == ALIGN_CENTER && + spec.width() > static_cast(n)) { + width = spec.width(); + CharPtr p = grow_buffer(width); + std::copy(p, p + n, p + (width - n) / 2); + fill_padding(p, spec.width(), n, fill); + return; + } + if (spec.fill() != ' ' || sign) { + while (*start == ' ') + *start++ = fill; + if (sign) + *(start - 1) = sign; + } + grow_buffer(n); + return; + } + // If n is negative we ask to increase the capacity by at least 1, + // but as std::vector, the buffer grows exponentially. + buffer_.reserve(n >= 0 ? offset + n + 1 : buffer_.capacity() + 1); + } +} + +/** + \rst + This class template provides operations for formatting and writing data + into a character stream. The output is stored in a memory buffer that grows + dynamically. + + You can use one of the following typedefs for common character types + and the standard allocator: + + +---------------+-----------------------------------------------------+ + | Type | Definition | + +===============+=====================================================+ + | MemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + | WMemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + + **Example**:: + + MemoryWriter out; + out << "The answer is " << 42 << "\n"; + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42 + (-3.140000, +3.140000) + + The output can be converted to an ``std::string`` with ``out.str()`` or + accessed as a C string with ``out.c_str()``. + \endrst + */ +template > +class BasicMemoryWriter : public BasicWriter { + private: + internal::MemoryBuffer buffer_; + + public: + explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) + : BasicWriter(buffer_), buffer_(alloc) {} + +#if FMT_USE_RVALUE_REFERENCES + /** + \rst + Constructs a :class:`fmt::BasicMemoryWriter` object moving the content + of the other object to it. + \endrst + */ + BasicMemoryWriter(BasicMemoryWriter &&other) + : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) { + } + + /** + \rst + Moves the content of the other ``BasicMemoryWriter`` object to this one. + \endrst + */ + BasicMemoryWriter &operator=(BasicMemoryWriter &&other) { + buffer_ = std::move(other.buffer_); + return *this; + } +#endif +}; + +typedef BasicMemoryWriter MemoryWriter; +typedef BasicMemoryWriter WMemoryWriter; + +/** + \rst + This class template provides operations for formatting and writing data + into a fixed-size array. For writing into a dynamically growing buffer + use :class:`fmt::BasicMemoryWriter`. + + Any write method will throw ``std::runtime_error`` if the output doesn't fit + into the array. + + You can use one of the following typedefs for common character types: + + +--------------+---------------------------+ + | Type | Definition | + +==============+===========================+ + | ArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + | WArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + \endrst + */ +template +class BasicArrayWriter : public BasicWriter { + private: + internal::FixedBuffer buffer_; + + public: + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + given size. + \endrst + */ + BasicArrayWriter(Char *array, std::size_t size) + : BasicWriter(buffer_), buffer_(array, size) {} + + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + size known at compile time. + \endrst + */ + template + explicit BasicArrayWriter(Char (&array)[SIZE]) + : BasicWriter(buffer_), buffer_(array, SIZE) {} +}; + +typedef BasicArrayWriter ArrayWriter; +typedef BasicArrayWriter WArrayWriter; + +// Formats a value. +template +void format(BasicFormatter &f, const Char *&format_str, const T &value) { + internal::MemoryBuffer buffer; + + internal::FormatBuf format_buf(buffer); + std::basic_ostream output(&format_buf); + output << value; + + BasicStringRef str(&buffer[0], format_buf.size()); + internal::Arg arg = internal::MakeValue(str); + arg.type = static_cast( + internal::MakeValue::type(str)); + format_str = f.format(format_str, arg); +} + +// Reports a system error without throwing an exception. +// Can be used to report errors from destructors. +void report_system_error(int error_code, StringRef message) FMT_NOEXCEPT; + +#if FMT_USE_WINDOWS_H + +/** A Windows error. */ +class WindowsError : public SystemError { + private: + void init(int error_code, CStringRef format_str, ArgList args); + + public: + /** + \rst + Constructs a :class:`fmt::WindowsError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is the + system message corresponding to the error code. + *error_code* is a Windows error code as given by ``GetLastError``. + If *error_code* is not a valid error code such as -1, the system message + will look like "error -1". + + **Example**:: + + // This throws a WindowsError with the description + // cannot open file 'madeup': The system cannot find the file specified. + // or similar (system message may vary). + const char *filename = "madeup"; + LPOFSTRUCT of = LPOFSTRUCT(); + HFILE file = OpenFile(filename, &of, OF_READ); + if (file == HFILE_ERROR) { + throw fmt::WindowsError(GetLastError(), + "cannot open file '{}'", filename); + } + \endrst + */ + WindowsError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) +}; + +// Reports a Windows error without throwing an exception. +// Can be used to report errors from destructors. +void report_windows_error(int error_code, StringRef message) FMT_NOEXCEPT; + +#endif + +enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; + +/** + Formats a string and prints it to stdout using ANSI escape sequences + to specify color (experimental). + Example: + print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); + */ +void print_colored(Color c, CStringRef format, ArgList args); + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = format("The answer is {}", 42); + \endrst +*/ +inline std::string format(CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +inline std::wstring format(WCStringRef format_str, ArgList args) { + WMemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + print(stderr, "Don't {}!", "panic"); + \endrst + */ +void print(std::FILE *f, CStringRef format_str, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +void print(CStringRef format_str, ArgList args); + +template +void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { + internal::PrintfFormatter(args).format(w, format); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = fmt::sprintf("The answer is %d", 42); + \endrst +*/ +inline std::string sprintf(CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + return w.str(); +} + +inline std::wstring sprintf(WCStringRef format, ArgList args) { + WMemoryWriter w; + printf(w, format, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + fmt::fprintf(stderr, "Don't %s!", "panic"); + \endrst + */ +int fprintf(std::FILE *f, CStringRef format, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + fmt::printf("Elapsed time: %.2f seconds", 1.23); + \endrst + */ +inline int printf(CStringRef format, ArgList args) { + return fprintf(stdout, format, args); +} + +/** + Fast integer formatter. + */ +class FormatInt { + private: + // Buffer should be large enough to hold all digits (digits10 + 1), + // a sign and a null character. + enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; + mutable char buffer_[BUFFER_SIZE]; + char *str_; + + // Formats value in reverse and returns the number of digits. + char *format_decimal(ULongLong value) { + char *buffer_end = buffer_ + BUFFER_SIZE - 1; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + } + if (value < 10) { + *--buffer_end = static_cast('0' + value); + return buffer_end; + } + unsigned index = static_cast(value * 2); + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + return buffer_end; + } + + void FormatSigned(LongLong value) { + ULongLong abs_value = static_cast(value); + bool negative = value < 0; + if (negative) + abs_value = 0 - abs_value; + str_ = format_decimal(abs_value); + if (negative) + *--str_ = '-'; + } + + public: + explicit FormatInt(int value) { FormatSigned(value); } + explicit FormatInt(long value) { FormatSigned(value); } + explicit FormatInt(LongLong value) { FormatSigned(value); } + explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} + explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} + explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} + + /** + Returns the number of characters written to the output buffer. + */ + std::size_t size() const { return buffer_ - str_ + BUFFER_SIZE - 1; } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const char *data() const { return str_; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const char *c_str() const { + buffer_[BUFFER_SIZE - 1] = '\0'; + return str_; + } + + /** + \rst + Returns the content of the output buffer as an ``std::string``. + \endrst + */ + std::string str() const { return std::string(str_, size()); } +}; + +// Formats a decimal integer value writing into buffer and returns +// a pointer to the end of the formatted string. This function doesn't +// write a terminating null character. +template +inline void format_decimal(char *&buffer, T value) { + typename internal::IntTraits::MainType abs_value = value; + if (internal::is_negative(value)) { + *buffer++ = '-'; + abs_value = 0 - abs_value; + } + if (abs_value < 100) { + if (abs_value < 10) { + *buffer++ = static_cast('0' + abs_value); + return; + } + unsigned index = static_cast(abs_value * 2); + *buffer++ = internal::Data::DIGITS[index]; + *buffer++ = internal::Data::DIGITS[index + 1]; + return; + } + unsigned num_digits = internal::count_digits(abs_value); + internal::format_decimal(buffer, abs_value, num_digits); + buffer += num_digits; +} + +/** + \rst + Returns a named argument for formatting functions. + + **Example**:: + + print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); + + \endrst + */ +template +inline internal::NamedArg arg(StringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +template +inline internal::NamedArg arg(WStringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +// The following two functions are deleted intentionally to disable +// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. +template +void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +template +void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +} + +#if FMT_GCC_VERSION +// Use the system_header pragma to suppress warnings about variadic macros +// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't +// work. It is used at the end because we want to suppress as little warnings +// as possible. +# pragma GCC system_header +#endif + +// This is used to work around VC++ bugs in handling variadic macros. +#define FMT_EXPAND(args) args + +// Returns the number of arguments. +// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. +#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) +#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) +#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define FMT_CONCAT(a, b) a##b +#define FMT_FOR_EACH_(N, f, ...) \ + FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) +#define FMT_FOR_EACH(f, ...) \ + FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) + +#define FMT_ADD_ARG_NAME(type, index) type arg##index +#define FMT_GET_ARG_NAME(type, index) arg##index + +#if FMT_USE_VARIADIC_TEMPLATES +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + template \ + ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + const Args & ... args) { \ + typename fmt::internal::ArgArray::Type array; \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ + fmt::internal::make_arg_list(array, args...)); \ + } +#else +// Defines a wrapper for a function taking __VA_ARGS__ arguments +// and n additional arguments of arbitrary types. +# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ + template \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + FMT_GEN(n, FMT_MAKE_ARG)) { \ + fmt::internal::ArgArray::Type arr; \ + FMT_GEN(n, FMT_ASSIGN_##Char); \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ + } + +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ + } \ + FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) +#endif // FMT_USE_VARIADIC_TEMPLATES + +/** + \rst + Defines a variadic function with the specified return type, function name + and argument types passed as variable arguments to this macro. + + **Example**:: + + void print_error(const char *file, int line, const char *format, + fmt::ArgList args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args); + } + FMT_VARIADIC(void, print_error, const char *, int, const char *) + + ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that + don't implement variadic templates. You don't have to use this macro if + you don't need legacy compiler support and can use variadic templates + directly:: + + template + void print_error(const char *file, int line, const char *format, + const Args & ... args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args...); + } + \endrst + */ +#define FMT_VARIADIC(ReturnType, func, ...) \ + FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_VARIADIC_W(ReturnType, func, ...) \ + FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) + +#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) + +/** + \rst + Convenient macro to capture the arguments' names and values into several + ``fmt::arg(name, value)``. + + **Example**:: + + int x = 1, y = 2; + print("point: ({x}, {y})", FMT_CAPTURE(x, y)); + // same as: + // print("point: ({x}, {y})", arg("x", x), arg("y", y)); + + \endrst + */ +#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) + +#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) + +namespace fmt { +FMT_VARIADIC(std::string, format, CStringRef) +FMT_VARIADIC_W(std::wstring, format, WCStringRef) +FMT_VARIADIC(void, print, CStringRef) +FMT_VARIADIC(void, print, std::FILE *, CStringRef) + +FMT_VARIADIC(void, print_colored, Color, CStringRef) +FMT_VARIADIC(std::string, sprintf, CStringRef) +FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) +FMT_VARIADIC(int, printf, CStringRef) +FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) + +#if FMT_USE_IOSTREAMS +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + print(cerr, "Don't {}!", "panic"); + \endrst + */ +void print(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(void, print, std::ostream &, CStringRef) +#endif +} // namespace fmt + +#if FMT_USE_USER_DEFINED_LITERALS +namespace fmt { +namespace internal { + +template +struct UdlFormat { + const Char *str; + + template + auto operator()(Args && ... args) const + -> decltype(format(str, std::forward(args)...)) { + return format(str, std::forward(args)...); + } +}; + +template +struct UdlArg { + const Char *str; + + template + NamedArg operator=(T &&value) const { + return {str, std::forward(value)}; + } +}; + +} // namespace internal + +inline namespace literals { + +/** + \rst + C++11 literal equivalent of :func:`fmt::format`. + + **Example**:: + + using namespace fmt::literals; + std::string message = "The answer is {}"_format(42); + \endrst + */ +inline internal::UdlFormat +operator"" _format(const char *s, std::size_t) { return {s}; } +inline internal::UdlFormat +operator"" _format(const wchar_t *s, std::size_t) { return {s}; } + +/** + \rst + C++11 literal equivalent of :func:`fmt::arg`. + + **Example**:: + + using namespace fmt::literals; + print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); + \endrst + */ +inline internal::UdlArg +operator"" _a(const char *s, std::size_t) { return {s}; } +inline internal::UdlArg +operator"" _a(const wchar_t *s, std::size_t) { return {s}; } + +} // inline namespace literals +} // namespace fmt +#endif // FMT_USE_USER_DEFINED_LITERALS + +// Restore warnings. +#if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic pop +#endif + +#if defined(__clang__) && !defined(__INTEL_COMPILER) +# pragma clang diagnostic pop +#endif + +#ifdef FMT_HEADER_ONLY +# include "format.cc" +#endif + +#endif // FMT_FORMAT_H_ -- cgit v1.2.3 From 5fd7124695ff1a3f8a6e019dc301ed48e5e067d4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Use cppformat for q_god's "temple directions" --- src/q_god.cc | 112 ++++++++++++++++++++++------------------------------------- 1 file changed, 42 insertions(+), 70 deletions(-) diff --git a/src/q_god.cc b/src/q_god.cc index 0a3b07e7..de58bfe7 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -20,6 +20,7 @@ #include "z-rand.hpp" #include +#include #define cquest (quest[QUEST_GOD]) #define cquest_quests_given (cquest.data[0]) @@ -41,13 +42,9 @@ * the return value will be one of the following: north, south, * east, west, north-east, south-east, south-west, north-west, * or "close" if it is within 2 tiles. - * - * The returned string is allocated with strdup(). */ -static char *compass(int y, int x, int y2, int x2) +static std::string compass(int y, int x, int y2, int x2) { - char compass_dir[64]; - // is it close to the north/south meridian? int y_diff = y2 - y; @@ -85,20 +82,25 @@ static char *compass(int y, int x, int y2, int x2) } // Maybe it is very close - if ((!x_axis) && (!y_axis)) { strcpy(compass_dir, "close"); } + if ((!x_axis) && (!y_axis)) { + return ""; // Handled specially by caller + } // Maybe it is (almost) due N/S - else if (!x_axis) { strcpy(compass_dir, y_axis); } + else if (!x_axis) { + return y_axis; + } // Maybe it is (almost) due E/W - else if (!y_axis) { strcpy(compass_dir, x_axis); } + else if (!y_axis) { + return x_axis; + } // or if it is neither - else { sprintf(compass_dir, "%s-%s", y_axis, x_axis); } - - /* Return a copy */ - return strdup(compass_dir); + else { + return fmt::format("{}-{}", y_axis, x_axis); + } } /* Returns a relative approximation of the 'distance' of y2, x2 from y, x. */ -static cptr approximate_distance(int y, int x, int y2, int x2) +static std::string approximate_distance(int y, int x, int y2, int x2) { // how far to away to the north/south? int y_diff = abs(y2 - y); @@ -222,93 +224,62 @@ static void get_home_coordinates(int *home1_y, int *home1_x, const char **home1, } } -/* Print using cmsg_print. */ -static void print_using_cmsg(cptr line, void *dummy) -{ - cmsg_print(TERM_YELLOW, line); -} - -/* Print using print_hook. */ -static void print_using_print_hook(cptr line, void *f_) -{ - FILE *f = (FILE *) f_; - fprintf(f, "%s\n", line); -} - -/* Show directions */ -static void print_directions(bool_ feel_it, void (*pfunc)(cptr, void *), void *pfdata) +static std::string make_directions(bool feel_it) { int home1_y, home1_x; int home2_y, home2_x; const char *home1 = NULL; const char *home2 = NULL; - char *home1_axis = NULL; - char *home2_axis = NULL; - cptr home1_distance = NULL; - cptr home2_distance = NULL; cptr feel_it_str = feel_it ? ", I can feel it.'" : "."; - char buf[256]; get_home_coordinates( &home1_y, &home1_x, &home1, &home2_y, &home2_x, &home2); - home1_axis = compass(home1_y, home1_x, cquest_dung_y, cquest_dung_x); - home2_axis = compass(home2_y, home2_x, cquest_dung_y, cquest_dung_x); - - home1_distance = approximate_distance(home1_y, home1_x, cquest_dung_y, cquest_dung_x); - home2_distance = approximate_distance(home2_y, home2_x, cquest_dung_y, cquest_dung_x); + auto home1_axis = compass(home1_y, home1_x, cquest_dung_y, cquest_dung_x); + auto home2_axis = compass(home2_y, home2_x, cquest_dung_y, cquest_dung_x); /* Build the message */ - if (!streq(home1_axis, "close")) + if (home1_axis.empty()) { - snprintf(buf, sizeof(buf), - "The temple lies %s to the %s of %s, ", - home1_distance, - home1_axis, - home1); - pfunc(buf, pfdata); + return fmt::format("The temple lies very close to {}, ", + home1); } else { - snprintf(buf, sizeof(buf), - "The temple lies very close to %s, ", - home1); - pfunc(buf, pfdata); + auto home1_distance = approximate_distance(home1_y, home1_x, cquest_dung_y, cquest_dung_x); + return fmt::format("The temple lies {} to the {} of {}, ", + home1_distance, + home1_axis, + home1); } - if (!streq(home2_axis, "close")) + if (home2_axis.empty()) { - snprintf(buf, sizeof(buf), - "and %s to the %s of %s%s", - home2_distance, - home2_axis, - home2, - feel_it_str); - pfunc(buf, pfdata); + return fmt::format("and very close to {}{}", + home2, + feel_it_str); } else { - snprintf(buf, sizeof(buf), - "and very close to %s%s", - home2, - feel_it_str); - pfunc(buf, pfdata); + auto home2_distance = approximate_distance(home2_y, home2_x, cquest_dung_y, cquest_dung_x); + return fmt::format("and {} to the {} of {}{}", + home2_distance, + home2_axis, + home2, + feel_it_str); } - - /* Free dyanmically allocated strings */ - free(home1_axis); - free(home2_axis); } bool_ quest_god_describe(FILE *fff) { if (cquest.status == QUEST_STATUS_TAKEN) { + auto directions = make_directions(false); fprintf(fff, "#####yGod quest " FMTs32b "!\n", cquest_quests_given); fprintf(fff, "Thou art to find the lost temple of thy God and\n"); fprintf(fff, "to retrieve the lost part of the relic for thy God! \n"); - print_directions(FALSE, print_using_print_hook, fff); + fprintf(fff, "%s\n", directions.c_str()); fprintf(fff, "\n"); } @@ -978,6 +949,8 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *) quest_god_place_rand_dung(); /* God issues instructions */ + auto directions = make_directions(true); + cmsg_format(TERM_L_BLUE, "The voice of %s booms in your head:", deity_info[p_ptr->pgod].name); cmsg_print(TERM_YELLOW, "'I have a task for thee."); @@ -986,9 +959,8 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *) cmsg_print(TERM_YELLOW, "Thou art to find my lost temple and retrieve a piece of the relic."); cmsg_print(TERM_YELLOW, "When thy task is done, thou art to lift it in the air and call upon my name."); cmsg_print(TERM_YELLOW, "I shall then come to reclaim what is mine!"); - - print_directions(TRUE, print_using_cmsg, NULL); - + cmsg_print(TERM_YELLOW, directions.c_str()); + /* Prepare depth of dungeon. If this was * generated in set_god_dungeon_attributes(), * then we'd have trouble if someone levelled -- cgit v1.2.3 From b1a9e6028d66a47a5205225401db312c929b089c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove path_temp in favor of boost::fs::unique_path() This gets rid of one #ifdef WINDOWS hack at least. --- src/cmd3.cc | 11 ++--- src/cmd4.cc | 138 +++++++++++++++++++--------------------------------------- src/status.cc | 12 ++--- src/util.cc | 38 ---------------- src/util.hpp | 1 - 5 files changed, 54 insertions(+), 146 deletions(-) diff --git a/src/cmd3.cc b/src/cmd3.cc index 59e61719..98d8acf3 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -40,6 +40,7 @@ #include #include +#include #include #include @@ -2011,16 +2012,12 @@ void do_cmd_cli_help() { int i, j; - FILE *fff; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); for (i = 0, j = -1; i < cli_total; i++) { diff --git a/src/cmd4.cc b/src/cmd4.cc index 56728a86..712af79f 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -37,11 +37,12 @@ #include "xtra1.hpp" #include "z-rand.hpp" +#include +#include #include #include #include #include -#include /* * Hack -- redraw the screen @@ -3013,17 +3014,14 @@ void do_cmd_knowledge_artifacts(void) { int i, k, z, x, y; - FILE *fff; - - char file_name[1024]; - char base_name[80]; /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Scan the artifacts */ std::unique_ptr okay(new bool_[max_a_idx]); @@ -3244,26 +3242,18 @@ void do_cmd_knowledge_artifacts(void) */ void do_cmd_knowledge_traps(void) { - int k; - - FILE *fff; - - trap_type *t_ptr; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Scan the traps */ - for (k = 0; k < max_t_idx; k++) + for (int k = 0; k < max_t_idx; k++) { /* Get the trap */ - t_ptr = &t_info[k]; + trap_type *t_ptr = &t_info[k]; /* Skip "empty" traps */ if (!t_ptr->name) continue; @@ -3306,22 +3296,16 @@ static bool compare_monster_level(int r_idx1, int r_idx2) { */ static void do_cmd_knowledge_uniques(void) { - int k; - - FILE *fff; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); // Extract the unique race indexes. std::vector unique_r_idxs; - for (k = 1; k < max_r_idx; k++) + for (int k = 1; k < max_r_idx; k++) { monster_race *r_ptr = &r_info[k]; @@ -3478,8 +3462,6 @@ static void do_cmd_knowledge_pets(void) { int i; - FILE *fff; - monster_type *m_ptr; int t_friends = 0; @@ -3490,14 +3472,12 @@ static void do_cmd_knowledge_pets(void) int upkeep_divider = 20; - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); if (has_ability(AB_PERFECT_CASTING)) upkeep_divider = 15; @@ -3561,20 +3541,14 @@ static void do_cmd_knowledge_pets(void) */ static void do_cmd_knowledge_kill_count(void) { - int k; - - FILE *fff; - - char file_name[1024]; - s32b Total = 0; - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); { /* Monsters slain */ @@ -3622,7 +3596,7 @@ static void do_cmd_knowledge_kill_count(void) Total = 0; /* Scan the monster races */ - for (k = 0; k < max_r_idx; k++) + for (int k = 0; k < max_r_idx; k++) { monster_race *r_ptr = &r_info[k]; @@ -3686,23 +3660,15 @@ static void do_cmd_knowledge_kill_count(void) */ static void do_cmd_knowledge_objects(void) { - int k; - - FILE *fff; - - char o_name[80]; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Scan the object kinds */ - for (k = 1; k < max_k_idx; k++) + for (int k = 1; k < max_k_idx; k++) { object_kind *k_ptr = &k_info[k]; @@ -3712,6 +3678,7 @@ static void do_cmd_knowledge_objects(void) /* List known flavored objects */ if (k_ptr->flavor && k_ptr->aware) { + char o_name[80]; object_type *i_ptr; object_type object_type_body; @@ -3745,21 +3712,18 @@ static void do_cmd_knowledge_objects(void) */ static void do_cmd_knowledge_dungeons(void) { - int y; - char file_name[1024]; - FILE *fff; - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Oops */ if (fff == NULL) return; /* Scan all dungeons */ - for (y = 1; y < max_d_idx; y++) + for (int y = 1; y < max_d_idx; y++) { /* The dungeon has a valid recall depth set */ if (max_dlv[y]) @@ -3788,26 +3752,23 @@ static void do_cmd_knowledge_dungeons(void) */ void do_cmd_knowledge_towns(void) { - int i, j; - char file_name[1024]; - FILE *fff; - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Oops */ if (fff == NULL) return; /* Scan all dungeons */ - for (i = 0; i < max_d_idx; i++) + for (int i = 0; i < max_d_idx; i++) { dungeon_info_type *d_ptr = &d_info[i]; /* Scan all dungeon town slots */ - for (j = 0; j < TOWN_DUNGEON; j++) + for (int j = 0; j < TOWN_DUNGEON; j++) { int town_idx = d_ptr->t_idx[j]; @@ -3841,16 +3802,12 @@ void do_cmd_knowledge_towns(void) */ static void do_cmd_knowledge_corruptions(void) { - FILE *fff; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Dump the corruptions to file */ if (fff) @@ -3907,10 +3864,6 @@ static void insert_sort_quest(int *order, int *num, int q_idx) */ static void do_cmd_knowledge_quests(void) { - FILE *fff; - - char file_name[1024]; - int order[MAX_Q_IDX] = { }; int num = 0; @@ -3919,10 +3872,11 @@ static void do_cmd_knowledge_quests(void) /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); for (i = 0; i < MAX_Q_IDX; i++) { @@ -3982,16 +3936,12 @@ static void do_cmd_knowledge_quests(void) */ static void do_cmd_knowledge_fates(void) { - FILE *fff; - - char file_name[1024]; - - /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); dump_fates(fff); diff --git a/src/status.cc b/src/status.cc index 0a3977c7..67c23468 100644 --- a/src/status.cc +++ b/src/status.cc @@ -27,6 +27,9 @@ #include "variable.hpp" #include "xtra1.hpp" +#include +#include + static void row_trival(const char*, s16b, u32b, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); static void row_bival(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); static void row_npval(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); @@ -722,17 +725,14 @@ static void status_companion(void) { int i; - FILE *fff; - - char file_name[1024]; - Term_clear(); /* Temporary file */ - if (path_temp(file_name, 1024)) return; + auto const file_name_p = boost::filesystem::unique_path(); + auto const file_name = file_name_p.c_str(); /* Open a new file */ - fff = my_fopen(file_name, "w"); + FILE *fff = my_fopen(file_name, "w"); /* Calculate companions */ /* Process the monsters (backwards) */ diff --git a/src/util.cc b/src/util.cc index b7863f1a..8bdd532d 100644 --- a/src/util.cc +++ b/src/util.cc @@ -71,8 +71,6 @@ void user_name(char *buf, int id) * to assume that all filenames are "Unix" filenames, and explicitly "extract" * such filenames if needed (by "path_parse()", or perhaps "path_canon()"). * -* Note that "path_temp" should probably return a "canonical" filename. -* * Note that "my_fopen()" and "my_open()" and "my_make()" and "my_kill()" * and "my_move()" and "my_copy()" should all take "canonical" filenames. * @@ -169,42 +167,6 @@ errr path_parse(char *buf, int max, cptr file) #endif /* SET_UID */ -/* -* Hack -- acquire a "temporary" file name if possible -* -* This filename is always in "system-specific" form. -*/ -errr path_temp(char *buf, int max) -{ -#ifdef WINDOWS - static u32b tmp_counter; - static char valid_characters[] = - "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - char rand_ext[4]; - - rand_ext[0] = valid_characters[rand_int(sizeof (valid_characters))]; - rand_ext[1] = valid_characters[rand_int(sizeof (valid_characters))]; - rand_ext[2] = valid_characters[rand_int(sizeof (valid_characters))]; - rand_ext[3] = '\0'; - strnfmt(buf, max, "%s/t_%ud.%s", ANGBAND_DIR_XTRA, tmp_counter, rand_ext); - tmp_counter++; -#else - cptr s; - - /* Temp file */ - s = tmpnam(NULL); - - /* Oops */ - if (!s) return ( -1); - - /* Format to length */ - strnfmt(buf, max, "%s", s); -#endif - /* Success */ - return (0); -} - - /* * Create a new path by appending a file (or directory) to a path * diff --git a/src/util.hpp b/src/util.hpp index ebeee8c5..06832a41 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -12,7 +12,6 @@ extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int extern std::string get_player_race_name(int pr, int ps); extern std::string get_day(s32b day); extern s32b bst(s32b what, s32b t); -extern errr path_temp(char *buf, int max); extern FILE *my_fopen(cptr file, cptr mode); extern errr my_fgets(FILE *fff, char *buf, huge n); extern errr my_fclose(FILE *fff); -- cgit v1.2.3 From 55de8a9e74778af190a944c9fe0805f07aaa9980 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Remove #ifdef WINDOWS hack --- src/files.cc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/files.cc b/src/files.cc index 64112efa..aa63c462 100644 --- a/src/files.cc +++ b/src/files.cc @@ -3759,13 +3759,6 @@ void process_player_name(bool_ sf) } -#if defined(WINDOWS) - - /* Hack -- max length */ - if (k > 8) k = 8; - -#endif - /* Terminate */ tmp[k] = '\0'; sprintf(player_base, "%s", tmp); -- cgit v1.2.3 From 9baafaff5ead3056dbd3ae531d1560faf02e50b7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Simplify show_file function signature --- src/bldg.cc | 4 ++-- src/cmd3.cc | 2 +- src/cmd4.cc | 22 +++++++++++----------- src/cmd6.cc | 2 +- src/files.cc | 15 ++++++++++----- src/files.hpp | 2 +- src/help.cc | 2 +- src/notes.cc | 2 +- src/squeltch.cc | 4 ++-- src/status.cc | 2 +- 10 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/bldg.cc b/src/bldg.cc index 7095e8c3..dc82f4ac 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -332,7 +332,7 @@ static bool_ gamble_comm(int cmd) if (cmd == BACT_GAMBLE_RULES) { /* Peruse the gambling help file */ - (void)show_file("gambling.txt", NULL, 0, 0); + show_file("gambling.txt", NULL); } else { @@ -760,7 +760,7 @@ static void town_history(void) screen_save(); /* Peruse the building help file */ - (void)show_file("bldg.txt", NULL, 0, 0); + show_file("bldg.txt", NULL); /* Load screen */ screen_load(); diff --git a/src/cmd3.cc b/src/cmd3.cc index 98d8acf3..d6ede5a8 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -2040,7 +2040,7 @@ void do_cmd_cli_help() Term_save(); /* Display the file contents */ - show_file(file_name, "Command line help", 0, 0); + show_file(file_name, "Command line help"); /* Restore the screen */ Term_load(); diff --git a/src/cmd4.cc b/src/cmd4.cc index 712af79f..48fc279b 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3230,7 +3230,7 @@ void do_cmd_knowledge_artifacts(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Artifacts Seen", 0, 0); + show_file(file_name, "Artifacts Seen"); /* Remove the file */ fd_kill(file_name); @@ -3269,7 +3269,7 @@ void do_cmd_knowledge_traps(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Traps known", 0, 0); + show_file(file_name, "Traps known"); /* Remove the file */ fd_kill(file_name); @@ -3359,7 +3359,7 @@ static void do_cmd_knowledge_uniques(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Known Uniques", 0, 0); + show_file(file_name, "Known Uniques"); /* Remove the file */ fd_kill(file_name); @@ -3526,7 +3526,7 @@ static void do_cmd_knowledge_pets(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Current Pets", 0, 0); + show_file(file_name, "Current Pets"); /* Remove the file */ fd_kill(file_name); @@ -3648,7 +3648,7 @@ static void do_cmd_knowledge_kill_count(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Kill Count", 0, 0); + show_file(file_name, "Kill Count"); /* Remove the file */ fd_kill(file_name); @@ -3700,7 +3700,7 @@ static void do_cmd_knowledge_objects(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Known Objects", 0, 0); + show_file(file_name, "Known Objects"); /* Remove the file */ fd_kill(file_name); @@ -3740,7 +3740,7 @@ static void do_cmd_knowledge_dungeons(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Recall Depths", 0, 0); + show_file(file_name, "Recall Depths"); /* Remove the file */ fd_kill(file_name); @@ -3790,7 +3790,7 @@ void do_cmd_knowledge_towns(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Dungeon Towns", 0, 0); + show_file(file_name, "Dungeon Towns"); /* Remove the file */ fd_kill(file_name); @@ -3819,7 +3819,7 @@ static void do_cmd_knowledge_corruptions(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Corruptions", 0, 0); + show_file(file_name, "Corruptions"); /* Remove the file */ fd_kill(file_name); @@ -3924,7 +3924,7 @@ static void do_cmd_knowledge_quests(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Quest status", 0, 0); + show_file(file_name, "Quest status"); /* Remove the file */ fd_kill(file_name); @@ -3949,7 +3949,7 @@ static void do_cmd_knowledge_fates(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Fate status", 0, 0); + show_file(file_name, "Fate status"); /* Remove the file */ fd_kill(file_name); diff --git a/src/cmd6.cc b/src/cmd6.cc index 0a5595fa..1752d9a8 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -3586,7 +3586,7 @@ void do_cmd_read_scroll(void) cptr q = format("book-%d.txt", o_ptr->sval); /* Peruse the help file */ - (void)show_file(q, NULL, 0, 0); + show_file(q, NULL); /* Load screen */ screen_load(); diff --git a/src/files.cc b/src/files.cc index aa63c462..ab5421b5 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2920,7 +2920,7 @@ struct hyperlink typedef struct hyperlink hyperlink_type; -bool_ show_file(cptr name, cptr what, int line, int mode) +static bool_ show_file_aux(cptr name, cptr what, int line) { int i, k, x; @@ -3418,7 +3418,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode) strcpy(tmp, "help.hlp"); if (askfor_aux(tmp, 80)) { - if (!show_file(tmp, NULL, 0, mode)) k = ESCAPE; + if (!show_file_aux(tmp, NULL, 0)) k = ESCAPE; } } @@ -3472,7 +3472,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode) if (h_ptr->link_x[cur_link] != -1) { /* Recurse on that file */ - if (!show_file(h_ptr->link[cur_link], NULL, h_ptr->link_line[cur_link], mode)) k = ESCAPE; + if (!show_file_aux(h_ptr->link[cur_link], NULL, h_ptr->link_line[cur_link])) k = ESCAPE; } } @@ -3485,7 +3485,7 @@ bool_ show_file(cptr name, cptr what, int line, int mode) if (h_ptr->link_key[i] == k) { /* Recurse on that file */ - if (!show_file(h_ptr->link[i], NULL, h_ptr->link_line[i], mode)) k = ESCAPE; + if (!show_file_aux(h_ptr->link[i], NULL, h_ptr->link_line[i])) k = ESCAPE; break; } } @@ -3501,6 +3501,11 @@ bool_ show_file(cptr name, cptr what, int line, int mode) return (TRUE); } +void show_file(cptr name, cptr what, int line) +{ + show_file_aux(name, what, line); +} + static void cmovie_clean_line(int y, char *abuf, char *cbuf) { const byte *ap = Term->scr->a[y]; @@ -3698,7 +3703,7 @@ void do_cmd_help(void) screen_save(); /* Peruse the main help file */ - (void)show_file("help.hlp", NULL, 0, 0); + show_file("help.hlp", NULL); /* Load screen */ screen_load(); diff --git a/src/files.hpp b/src/files.hpp index 5979be89..d61415f6 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -13,7 +13,7 @@ extern cptr describe_player_location(void); extern errr file_character(cptr name, bool_ full); extern errr process_pref_file_aux(char *buf); extern errr process_pref_file(cptr name); -extern bool_ show_file(cptr name, cptr what, int line, int mode); +extern void show_file(cptr name, cptr what, int line = 0); extern void do_cmd_help(void); extern void process_player_base(void); extern void get_name(void); diff --git a/src/help.cc b/src/help.cc index a6d83079..e8eec115 100644 --- a/src/help.cc +++ b/src/help.cc @@ -674,7 +674,7 @@ static void show_context_help(context_help_type *context_help) screen_save(); - show_file(context_help->file_name, 0, -context_help->anchor, 0); + show_file(context_help->file_name, 0, -context_help->anchor); screen_load(); } diff --git a/src/notes.cc b/src/notes.cc index 69269291..8804509e 100644 --- a/src/notes.cc +++ b/src/notes.cc @@ -37,7 +37,7 @@ void show_notes_file(void) sprintf(caption, "Note file %s", basename); /* Invoke show_file */ - (void)show_file(buf, caption, 0, 0); + show_file(buf, caption); /* Done */ return; diff --git a/src/squeltch.cc b/src/squeltch.cc index bab1e5c0..69c25dfd 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -301,7 +301,7 @@ void do_cmd_automatizer() if (c == '?') { screen_save(); - show_file("automat.txt", "Automatizer help", 0, 0); + show_file("automat.txt", "Automatizer help"); screen_load(); } else if (c == '8') @@ -375,7 +375,7 @@ void do_cmd_automatizer() if (c == '?') { screen_save(); - show_file("automat.txt", "Automatizer help", 0, 0); + show_file("automat.txt", "Automatizer help"); screen_load(); } else if (c == '8') diff --git a/src/status.cc b/src/status.cc index 67c23468..1886e5a6 100644 --- a/src/status.cc +++ b/src/status.cc @@ -776,7 +776,7 @@ static void status_companion(void) my_fclose(fff); /* Display the file contents */ - show_file(file_name, "Companion List", 0, 0); + show_file(file_name, "Companion List"); /* Remove the file */ fd_kill(file_name); -- cgit v1.2.3 From 8f967e4cfcd5710c82a26e878397afac81c6af64 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Fix multiple potential underflows in plural_aux --- src/cmd4.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index 48fc279b..ab9e4281 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3422,29 +3422,29 @@ static void plural_aux(char *name) } /* Broken plurals are, well, broken */ - else if (name[name_len - 1] == 'y') + else if (name_len >= 1 && name[name_len - 1] == 'y') { strcpy(&name[name_len - 1], "ies"); } - else if (streq(&name[name_len - 4], "ouse")) + else if (name_len >= 4 && streq(&name[name_len - 4], "ouse")) { strcpy(&name[name_len - 4], "ice"); } - else if (streq(&name[name_len - 6], "kelman")) + else if (name_len >= 6 && streq(&name[name_len - 6], "kelman")) { strcpy(&name[name_len - 6], "kelmen"); } - else if (streq(&name[name_len - 2], "ex")) + else if (name_len >= 2 && streq(&name[name_len - 2], "ex")) { strcpy(&name[name_len - 2], "ices"); } - else if (streq(&name[name_len - 3], "olf")) + else if (name_len >= 3 && streq(&name[name_len - 3], "olf")) { strcpy(&name[name_len - 3], "olves"); } /* Now begins sane cases */ - else if ((streq(&name[name_len - 2], "ch")) || (name[name_len - 1] == 's')) + else if ((name_len >= 2 && streq(&name[name_len - 2], "ch")) || (name_len >= 1 && name[name_len - 1] == 's')) { strcpy(&name[name_len], "es"); } -- cgit v1.2.3 From 59b27fb6541811842a4d7e30daa6229c821d7d42 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Fix bad function declaration for magik() Fixes #1 --- src/z-rand.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/z-rand.cc b/src/z-rand.cc index c06b7893..e2960a55 100644 --- a/src/z-rand.cc +++ b/src/z-rand.cc @@ -351,7 +351,7 @@ s32b maxroll(s16b num, s16b sides) return (num * sides); } -bool magik(int p) { +bool magik(s32b p) { return rand_int(100) < p; } -- cgit v1.2.3 From 36a0eb00994b1347de5fbac13b6a3901f755ec27 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Fri, 5 Feb 2016 19:22:46 +0100 Subject: Clean up load_player() a little --- src/loadsave.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 1806d7c8..4c313901 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2727,8 +2727,6 @@ static errr rd_savefile(void) */ bool_ load_player(void) { - int fd = -1; - errr err = 0; cptr what = "generic"; @@ -2761,13 +2759,16 @@ bool_ load_player(void) if (!err) { /* Open the savefile */ - fd = fd_open(savefile, O_RDONLY); + int fd = fd_open(savefile, O_RDONLY); /* No file */ if (fd < 0) err = -1; /* Message (below) */ if (err) what = "Cannot open savefile"; + + /* Close the file */ + if (!err) fd_close(fd); } /* Process file */ @@ -2777,18 +2778,13 @@ bool_ load_player(void) /* Open the file XXX XXX XXX XXX Should use Angband file interface */ fff = my_fopen(savefile, "rb"); -/* fff = fdopen(fd, "r"); */ /* Read the first four bytes */ do_u32b(&vernum, ls_flag_t::LOAD); do_byte(&tmp8u, ls_flag_t::LOAD); // For comatibility with old savefiles - /* XXX XXX XXX XXX Should use Angband file interface */ my_fclose(fff); - /* fclose(fff) */ - /* Close the file */ - fd_close(fd); } /* Process file */ -- cgit v1.2.3 From 21492108b4af3dd3e31228e4e15d440e8cf147ed Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 13 Feb 2016 13:56:52 +0100 Subject: Replace ang_sort() with std::stable_sort() --- src/xtra2.cc | 186 ++++++++++------------------------------------------------- 1 file changed, 30 insertions(+), 156 deletions(-) diff --git a/src/xtra2.cc b/src/xtra2.cc index 096f8966..a7690d42 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3706,81 +3706,6 @@ static cptr look_mon_desc(int m_idx) -/* - * Current "comp" function for ang_sort() - */ -static bool_ (*ang_sort_comp)(vptr u, vptr v, int a, int b) = nullptr; - -/* - * Current "swap" function for ang_sort() - */ -static void (*ang_sort_swap)(vptr u, vptr v, int a, int b) = nullptr; - - - -/* - * Angband sorting algorithm -- quick sort in place - * - * Note that the details of the data we are sorting is hidden, - * and we rely on the "ang_sort_comp()" and "ang_sort_swap()" - * function hooks to interact with the data, which is given as - * two pointers, and which may have any user-defined form. - */ -static void ang_sort_aux(vptr u, vptr v, int p, int q) -{ - int z, a, b; - - /* Done sort */ - if (p >= q) return; - - /* Pivot */ - z = p; - - /* Begin */ - a = p; - b = q; - - /* Partition */ - while (TRUE) - { - /* Slide i2 */ - while (!(*ang_sort_comp)(u, v, b, z)) b--; - - /* Slide i1 */ - while (!(*ang_sort_comp)(u, v, z, a)) a++; - - /* Done partition */ - if (a >= b) break; - - /* Swap */ - (*ang_sort_swap)(u, v, a, b); - - /* Advance */ - a++, b--; - } - - /* Recurse left side */ - ang_sort_aux(u, v, p, b); - - /* Recurse right side */ - ang_sort_aux(u, v, b + 1, q); -} - - -/* - * Angband sorting algorithm -- quick sort in place - * - * Note that the details of the data we are sorting is hidden, - * and we rely on the "ang_sort_comp()" and "ang_sort_swap()" - * function hooks to interact with the data, which is given as - * two pointers, and which may have any user-defined form. - */ -static void ang_sort(vptr u, vptr v, int n) -{ - /* Sort the array */ - ang_sort_aux(u, v, 0, n - 1); -} - /*** Targetting Code ***/ @@ -3865,72 +3790,6 @@ bool_ target_okay(void) -/* - * Sorting hook -- comp function -- by "distance to player" - * - * We use "u" and "v" to point to arrays of "x" and "y" positions, - * and sort the arrays by double-distance to the player. - */ -static bool_ ang_sort_comp_distance(vptr u, vptr v, int a, int b) -{ - byte *x = (byte*)(u); - byte *y = (byte*)(v); - - int da, db, kx, ky; - - /* Absolute distance components */ - kx = x[a]; - kx -= p_ptr->px; - kx = ABS(kx); - ky = y[a]; - ky -= p_ptr->py; - ky = ABS(ky); - - /* Approximate Double Distance to the first point */ - da = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); - - /* Absolute distance components */ - kx = x[b]; - kx -= p_ptr->px; - kx = ABS(kx); - ky = y[b]; - ky -= p_ptr->py; - ky = ABS(ky); - - /* Approximate Double Distance to the first point */ - db = ((kx > ky) ? (kx + kx + ky) : (ky + ky + kx)); - - /* Compare the distances */ - return (da <= db); -} - - -/* - * Sorting hook -- swap function -- by "distance to player" - * - * We use "u" and "v" to point to arrays of "x" and "y" positions, - * and sort the arrays by distance to the player. - */ -static void ang_sort_swap_distance(vptr u, vptr v, int a, int b) -{ - byte *x = (byte*)(u); - byte *y = (byte*)(v); - - byte temp; - - /* Swap "x" */ - temp = x[a]; - x[a] = x[b]; - x[b] = temp; - - /* Swap "y" */ - temp = y[a]; - y[a] = y[b]; - y[b] = temp; -} - - - /* * Hack -- help "select" a location (see below) */ @@ -4050,37 +3909,52 @@ static bool_ target_set_accept(int y, int x) */ static void target_set_prepare(int mode) { - int y, x; - - /* Reset "temp" array */ + // Reset "temp" array temp_n = 0; - /* Scan the current panel */ - for (y = panel_row_min; y <= panel_row_max; y++) + // Scan the current panel + for (int y = panel_row_min; y <= panel_row_max; y++) { - for (x = panel_col_min; x <= panel_col_max; x++) + for (int x = panel_col_min; x <= panel_col_max; x++) { cave_type *c_ptr = &cave[y][x]; - /* Require "interesting" contents */ + // Require "interesting" contents if (!target_set_accept(y, x)) continue; - /* Require target_able monsters for "TARGET_KILL" */ + // Require target_able monsters for "TARGET_KILL" if ((mode & (TARGET_KILL)) && !target_able(c_ptr->m_idx)) continue; - /* Save the location */ + // Save the location temp_x[temp_n] = x; temp_y[temp_n] = y; temp_n++; } } - /* Set the sort hooks */ - ang_sort_comp = ang_sort_comp_distance; - ang_sort_swap = ang_sort_swap_distance; - - /* Sort the positions */ - ang_sort(temp_x, temp_y, temp_n); + // Sort the positions by distance to player; we'll + // use a stable sort to avoid equidistant targets + // "swapping" priorities. Note that we're actually + // sorting the _indexes_ of the positions for later + // swap-into-place. + std::size_t temp_i[TEMP_MAX]; + std::iota(temp_i, temp_i + temp_n, 0); + std::stable_sort(temp_i, temp_i + temp_n, [](std::size_t i, std::size_t j) -> bool { + auto di = distance(p_ptr->py, p_ptr->px, temp_y[i], temp_x[i]); + auto dj = distance(p_ptr->py, p_ptr->px, temp_y[j], temp_x[j]); + return di < dj; + }); + + // Swap all the positions into their place. Note that + // we go only up to the middle of the array -- otherwise + // everything would be swapped _back_ into its original + // place. We do not need to care about the middle element + // since it's automatically at the correct position once + // we reach it. + for (s16b i = 0; i < temp_n / 2; i++) { + std::swap(temp_x[temp_i[i]], temp_x[i]); + std::swap(temp_y[temp_i[i]], temp_y[i]); + } } -- cgit v1.2.3 From f13c5091e4864e957c83a35621365c8b510b80ba Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 13 Feb 2016 13:56:52 +0100 Subject: Inline a lambda --- src/cmd4.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index ab9e4281..664645d8 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3285,10 +3285,6 @@ static int monster_get_race_level(int r_idx) { return r_info[r_idx].level; } -static bool compare_monster_level(int r_idx1, int r_idx2) { - return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2); -} - /* * Display known uniques * @@ -3321,7 +3317,9 @@ static void do_cmd_knowledge_uniques(void) // Sort races by level. std::sort(std::begin(unique_r_idxs), std::end(unique_r_idxs), - compare_monster_level); + [](int r_idx1, int r_idx2) -> bool { + return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2); + }); /* Scan the monster races */ for (int r_idx : unique_r_idxs) -- cgit v1.2.3 From 4d237a87eb76eb4c6bcc5d8cbf7544a8f3184f30 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 13 Feb 2016 13:56:52 +0100 Subject: Reduce file-open/close boilerplate and simplify formatting - We introduce a show_string() which will allow us to go without actually writing a file if we want to later. - Use cppformat to simplify the output formatting. --- src/cmd3.cc | 31 ++--- src/cmd4.cc | 346 ++++++++++++++--------------------------------------- src/cmd6.cc | 4 +- src/corrupt.cc | 23 ++-- src/corrupt.hpp | 4 +- src/files.cc | 25 +++- src/files.hpp | 4 + src/q_bounty.cc | 14 +-- src/q_bounty.hpp | 4 +- src/q_fireprof.cc | 36 +++--- src/q_fireprof.hpp | 4 +- src/q_god.cc | 15 +-- src/q_god.hpp | 4 +- src/q_library.cc | 23 ++-- src/q_library.hpp | 4 +- src/q_rand.cc | 41 ++++--- src/q_rand.hpp | 4 +- src/quest_type.hpp | 4 +- src/status.cc | 50 +++----- src/xtra1.cc | 48 ++++---- src/xtra1.hpp | 6 +- 21 files changed, 276 insertions(+), 418 deletions(-) diff --git a/src/cmd3.cc b/src/cmd3.cc index d6ede5a8..ef0dfa28 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -40,7 +40,7 @@ #include #include -#include +#include #include #include @@ -2010,29 +2010,23 @@ void do_cmd_cli(void) */ void do_cmd_cli_help() { - int i, j; - - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); + fmt::MemoryWriter w; + for (int i = 0, j = -1; i < cli_total; i++) + { + if (j < i - 1) + { + w << "/"; + } - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); + w.write("[[[[[G{}]", cli_info[i].comm); - for (i = 0, j = -1; i < cli_total; i++) - { - if (j < i - 1) fprintf(fff, "/"); - fprintf(fff, "[[[[[G%s]", cli_info[i].comm); if (cli_info[i].descrip != cli_info[i + 1].descrip) { - fprintf(fff, " %s\n", cli_info[i].descrip); + w.write(" {}\n", cli_info[i].descrip); j = i; } } - /* Close the file */ - my_fclose(fff); - /* Enter "icky" mode */ character_icky = TRUE; @@ -2040,16 +2034,13 @@ void do_cmd_cli_help() Term_save(); /* Display the file contents */ - show_file(file_name, "Command line help"); + show_string(w.c_str(), "Command line help"); /* Restore the screen */ Term_load(); /* Leave "icky" mode */ character_icky = FALSE; - - /* Remove the file */ - fd_kill(file_name); } diff --git a/src/cmd4.cc b/src/cmd4.cc index 664645d8..9a8a3a65 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -38,8 +38,8 @@ #include "z-rand.hpp" #include -#include #include +#include #include #include #include @@ -3016,13 +3016,6 @@ void do_cmd_knowledge_artifacts(void) char base_name[80]; - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - /* Scan the artifacts */ std::unique_ptr okay(new bool_[max_a_idx]); for (k = 0; k < max_a_idx; k++) @@ -3155,6 +3148,9 @@ void do_cmd_knowledge_artifacts(void) } } + /* Output buffer */ + fmt::MemoryWriter w; + /* Scan the artifacts */ for (k = 0; k < max_a_idx; k++) { @@ -3195,7 +3191,7 @@ void do_cmd_knowledge_artifacts(void) } /* Hack -- Build the artifact name */ - fprintf(fff, " The %s\n", base_name); + w.write(" The {}\n", base_name); } for (k = 0; k < max_k_idx; k++) @@ -3223,17 +3219,11 @@ void do_cmd_knowledge_artifacts(void) } /* Hack -- Build the artifact name */ - fprintf(fff, " The %s\n", base_name); + w.write(" The {}\n", base_name); } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Artifacts Seen"); - - /* Remove the file */ - fd_kill(file_name); + /* Display */ + show_string(w.c_str(), "Artifacts Seen"); } @@ -3242,13 +3232,7 @@ void do_cmd_knowledge_artifacts(void) */ void do_cmd_knowledge_traps(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - + fmt::MemoryWriter w; /* Scan the traps */ for (int k = 0; k < max_t_idx; k++) { @@ -3262,17 +3246,11 @@ void do_cmd_knowledge_traps(void) if (!t_ptr->ident) continue; /* Hack -- Build the trap name */ - fprintf(fff, " %s\n", t_ptr->name); + w.write(" {}\n", t_ptr->name); } - /* Close the file */ - my_fclose(fff); - /* Display the file contents */ - show_file(file_name, "Traps known"); - - /* Remove the file */ - fd_kill(file_name); + show_string(w.c_str(), "Traps known"); } @@ -3287,18 +3265,9 @@ static int monster_get_race_level(int r_idx) { /* * Display known uniques - * - * Note that the player ghosts are ignored. XXX XXX XXX */ static void do_cmd_knowledge_uniques(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - // Extract the unique race indexes. std::vector unique_r_idxs; for (int k = 1; k < max_r_idx; k++) @@ -3321,7 +3290,8 @@ static void do_cmd_knowledge_uniques(void) return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2); }); - /* Scan the monster races */ + // Scan the monster races + fmt::MemoryWriter w; for (int r_idx : unique_r_idxs) { monster_race *r_ptr = &r_info[r_idx]; @@ -3337,30 +3307,24 @@ static void do_cmd_knowledge_uniques(void) /* Print a message */ if (dead) { - fprintf(fff, "[[[[[%c%c] [[[[[R%-68s is dead]\n", - conv_color[r_ptr->d_attr], - r_ptr->d_char, + w.write("[[[[[{}{}] [[[[[R{:<68} is dead]\n", + static_cast(conv_color[r_ptr->d_attr]), + static_cast(r_ptr->d_char), r_ptr->name); } else { - fprintf(fff, "[[[[[%c%c] [[[[[w%-68s is alive]\n", - conv_color[r_ptr->d_attr], - r_ptr->d_char, + w.write("[[[[[{}{}] [[[[[w{:<68} is alive]\n", + static_cast(conv_color[r_ptr->d_attr]), + static_cast(r_ptr->d_char), r_ptr->name); } } } } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Known Uniques"); - - /* Remove the file */ - fd_kill(file_name); + // Display + show_string(w.c_str(), "Known Uniques"); } @@ -3458,32 +3422,17 @@ static void plural_aux(char *name) */ static void do_cmd_knowledge_pets(void) { - int i; - - monster_type *m_ptr; - int t_friends = 0; - int t_levels = 0; - int show_upkeep = 0; - - int upkeep_divider = 20; - - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - if (has_ability(AB_PERFECT_CASTING)) upkeep_divider = 15; + // Buffer + fmt::MemoryWriter w; /* Process the monsters (backwards) */ - for (i = m_max - 1; i >= 1; i--) + for (int i = m_max - 1; i >= 1; i--) { /* Access the monster */ - m_ptr = &m_list[i]; + monster_type *m_ptr = &m_list[i]; /* Ignore "dead" monsters */ if (!m_ptr->r_idx) continue; @@ -3499,13 +3448,17 @@ static void do_cmd_knowledge_pets(void) char pet_name[80]; monster_desc(pet_name, m_ptr, 0x88); - fprintf(fff, "%s%s (%s)\n", - (r_ptr->flags1 & RF1_UNIQUE) ? "#####G" : "", - pet_name, - (m_ptr->status < MSTATUS_COMPANION) ? "pet" : "companion"); + w.write("{}{} ({})\n", + (r_ptr->flags1 & RF1_UNIQUE) ? "#####G" : "", + pet_name, + (m_ptr->status < MSTATUS_COMPANION) ? "pet" : "companion"); } } + // Calculate upkeep + int show_upkeep = 0; + int upkeep_divider = has_ability(AB_PERFECT_CASTING) ? 15 : 20; + if (t_friends > 1 + (p_ptr->lev / (upkeep_divider))) { show_upkeep = (t_levels); @@ -3514,80 +3467,58 @@ static void do_cmd_knowledge_pets(void) else if (show_upkeep < 10) show_upkeep = 10; } + // Summary + w.write("----------------------------------------------\n"); + w.write(" Total: {} pet{}.\n", t_friends, (t_friends == 1 ? "" : "s")); + w.write(" Upkeep: {}% mana.\n", show_upkeep); - fprintf(fff, "----------------------------------------------\n"); - fprintf(fff, " Total: %d pet%s.\n", t_friends, (t_friends == 1 ? "" : "s")); - fprintf(fff, " Upkeep: %d%% mana.\n", show_upkeep); - - - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Current Pets"); - - /* Remove the file */ - fd_kill(file_name); + // Display + show_string(w.c_str(), "Current Pets"); } /* * Total kill count - * - * Note that the player ghosts are ignored. XXX XXX XXX */ static void do_cmd_knowledge_kill_count(void) { s32b Total = 0; - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); + // Buffer + fmt::MemoryWriter w; + // Summary of monsters slain { - /* Monsters slain */ - int kk; - /* For all monsters */ - for (kk = 1; kk < max_r_idx; kk++) + for (int kk = 1; kk < max_r_idx; kk++) { monster_race *r_ptr = &r_info[kk]; if (r_ptr->flags1 & (RF1_UNIQUE)) { - bool_ dead = (r_ptr->max_num == 0); - - if (dead) + if (r_ptr->max_num == 0) { Total++; } } else { - s16b This = r_ptr->r_pkills; - - if (This > 0) - { - Total += This; - } + Total += std::max(r_ptr->r_pkills, 0); } } if (Total < 1) { - fprintf(fff, "You have defeated no enemies yet.\n\n"); + w.write("You have defeated no enemies yet.\n\n"); } else if (Total == 1) { - fprintf(fff, "You have defeated one enemy.\n\n"); + w.write("You have defeated one enemy.\n\n"); } else { - fprintf(fff, "You have defeated " FMTs32b " enemies.\n\n", Total); + w.write("You have defeated {} enemies.\n\n", Total); } } @@ -3605,7 +3536,7 @@ static void do_cmd_knowledge_kill_count(void) if (dead) { /* Print a message */ - fprintf(fff, " %s\n", r_ptr->name); + w.write(" {}\n", r_ptr->name); Total++; } } @@ -3619,11 +3550,11 @@ static void do_cmd_knowledge_kill_count(void) { if (strstr(r_ptr->name, "coins")) { - fprintf(fff, " 1 pile of %s\n", r_ptr->name); + w.write(" 1 pile of {}\n", r_ptr->name); } else { - fprintf(fff, " 1 %s\n", r_ptr->name); + w.write(" 1 {}\n", r_ptr->name); } } else @@ -3631,7 +3562,7 @@ static void do_cmd_knowledge_kill_count(void) char to_plural[80]; strcpy(to_plural, r_ptr->name); plural_aux(to_plural); - fprintf(fff, " %d %s\n", This, to_plural); + w.write(" {} {}\n", This, to_plural); } Total += This; @@ -3639,17 +3570,11 @@ static void do_cmd_knowledge_kill_count(void) } } - fprintf(fff, "----------------------------------------------\n"); - fprintf(fff, " Total: " FMTs32b " creature%s killed.\n", Total, (Total == 1 ? "" : "s")); - - /* Close the file */ - my_fclose(fff); + w.write("----------------------------------------------\n"); + w.write(" Total: {} creature{} killed.\n", Total, (Total == 1 ? "" : "s")); /* Display the file contents */ - show_file(file_name, "Kill Count"); - - /* Remove the file */ - fd_kill(file_name); + show_string(w.c_str(), "Kill Count"); } @@ -3658,12 +3583,7 @@ static void do_cmd_knowledge_kill_count(void) */ static void do_cmd_knowledge_objects(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); + fmt::MemoryWriter w; /* Scan the object kinds */ for (int k = 1; k < max_k_idx; k++) @@ -3676,32 +3596,25 @@ static void do_cmd_knowledge_objects(void) /* List known flavored objects */ if (k_ptr->flavor && k_ptr->aware) { - char o_name[80]; - object_type *i_ptr; object_type object_type_body; /* Get local object */ - i_ptr = &object_type_body; + object_type *i_ptr = &object_type_body; /* Create fake object */ object_prep(i_ptr, k); /* Describe the object */ + char o_name[80]; object_desc_store(o_name, i_ptr, FALSE, 0); /* Print a message */ - fprintf(fff, " %s\n", o_name); + w.write(" {}\n", o_name); } } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Known Objects"); - - /* Remove the file */ - fd_kill(file_name); + // Display + show_string(w.c_str(), "Known Objects"); } @@ -3710,15 +3623,7 @@ static void do_cmd_knowledge_objects(void) */ static void do_cmd_knowledge_dungeons(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - /* Oops */ - if (fff == NULL) return; + fmt::MemoryWriter w; /* Scan all dungeons */ for (int y = 1; y < max_d_idx; y++) @@ -3727,21 +3632,15 @@ static void do_cmd_knowledge_dungeons(void) if (max_dlv[y]) { /* Describe the recall depth */ - fprintf(fff, " %c%s: Level %d (%d')\n", - (p_ptr->recall_dungeon == y) ? '*' : ' ', + w.write(" {}{}: Level {} ({}')\n", + (p_ptr->recall_dungeon == y) ? '*' : ' ', d_info[y].name, - max_dlv[y], 50 * (max_dlv[y])); + max_dlv[y], 50 * (max_dlv[y])); } } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Recall Depths"); - - /* Remove the file */ - fd_kill(file_name); + // Display + show_string(w.c_str(), "Recall Depths"); } @@ -3750,15 +3649,7 @@ static void do_cmd_knowledge_dungeons(void) */ void do_cmd_knowledge_towns(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - /* Oops */ - if (fff == NULL) return; + fmt::MemoryWriter w; /* Scan all dungeons */ for (int i = 0; i < max_d_idx; i++) @@ -3777,21 +3668,15 @@ void do_cmd_knowledge_towns(void) if (!(town_info[town_idx].flags & (TOWN_KNOWN))) continue; /* Describe the dungeon town */ - fprintf(fff, " %s: Level %d (%d')\n", + w.write(" {}: Level {} ({}')\n", d_ptr->name, - d_ptr->t_level[j], - 50 * d_ptr->t_level[j]); + d_ptr->t_level[j], + 50 * d_ptr->t_level[j]); } } - /* Close the file */ - my_fclose(fff); - /* Display the file contents */ - show_file(file_name, "Dungeon Towns"); - - /* Remove the file */ - fd_kill(file_name); + show_string(w.c_str(), "Dungeon Towns"); } @@ -3800,27 +3685,7 @@ void do_cmd_knowledge_towns(void) */ static void do_cmd_knowledge_corruptions(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - /* Dump the corruptions to file */ - if (fff) - { - dump_corruptions(fff, TRUE, FALSE); - } - - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Corruptions"); - - /* Remove the file */ - fd_kill(file_name); + show_string(dump_corruptions(true, false).c_str(), "Corruptions"); } @@ -3862,35 +3727,28 @@ static void insert_sort_quest(int *order, int *num, int q_idx) */ static void do_cmd_knowledge_quests(void) { + /* Figure out display order of quests */ int order[MAX_Q_IDX] = { }; int num = 0; - - int i, j, z; - - - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - for (i = 0; i < MAX_Q_IDX; i++) + for (int i = 0; i < MAX_Q_IDX; i++) { insert_sort_quest(order, &num, i); } - for (z = 0; z < MAX_Q_IDX; z++) + /* Write */ + fmt::MemoryWriter w; + for (int z = 0; z < MAX_Q_IDX; z++) { - i = order[z]; + int const i = order[z]; /* Dynamic descriptions */ if (quest[i].gen_desc != NULL) { - if (!quest[i].gen_desc(fff)) + auto s = quest[i].gen_desc(); + if (!s.empty()) { - continue; + w.write("{}\n\n", s); } } @@ -3900,32 +3758,26 @@ static void do_cmd_knowledge_quests(void) if (quest[i].status == QUEST_STATUS_TAKEN) { /* Print the quest info */ - fprintf(fff, "#####y%s (Danger level: %d)\n", + w.write("#####y{} (Danger level: {})\n", quest[i].name, quest[i].level); - j = 0; + int j = 0; while ((j < 10) && (quest[i].desc[j][0] != '\0')) { - fprintf(fff, "%s\n", quest[i].desc[j++]); + w.write("{}\n", quest[i].desc[j++]); } - fprintf(fff, "\n"); + w.write("\n"); } else if (quest[i].status == QUEST_STATUS_COMPLETED) { - fprintf(fff , "#####G%s Completed - Unrewarded\n", quest[i].name); - fprintf(fff, "\n"); + w.write("#####G{} Completed - Unrewarded\n", quest[i].name); + w.write("\n"); } } } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Quest status"); - - /* Remove the file */ - fd_kill(file_name); + /* Display */ + show_string(w.c_str(), "Quest status"); } @@ -3934,23 +3786,7 @@ static void do_cmd_knowledge_quests(void) */ static void do_cmd_knowledge_fates(void) { - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); - - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - dump_fates(fff); - - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Fate status"); - - /* Remove the file */ - fd_kill(file_name); + show_string(dump_fates().c_str(), "Fate status"); } diff --git a/src/cmd6.cc b/src/cmd6.cc index 1752d9a8..fce71215 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -2995,7 +2995,6 @@ void do_cmd_read_scroll(void) case SV_SCROLL_DIVINATION: { int i, count = 0; - char buf[120]; while (count < 1000) { @@ -3007,8 +3006,7 @@ void do_cmd_read_scroll(void) msg_print("A message appears on the scroll. It says:"); msg_print(NULL); - fate_desc(buf, i); - msg_format("%s", buf); + msg_format("%s", fate_desc(i).c_str()); msg_print(NULL); msg_print("The scroll disappears in a puff of smoke!"); diff --git a/src/corrupt.cc b/src/corrupt.cc index f182a9e2..47d79d53 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -12,6 +12,7 @@ #include "z-rand.hpp" #include +#include /** * Corruptions @@ -944,20 +945,18 @@ void lose_corruption() /* * Dump the corruption list */ -void dump_corruptions(FILE *fff, bool_ color, bool_ header) +std::string dump_corruptions(bool color, bool header) { - int i; - - assert(fff != NULL); + fmt::MemoryWriter w; - for (i = 0; i < CORRUPTIONS_MAX; i++) + for (int i = 0; i < CORRUPTIONS_MAX; i++) { - corruption_type *c_ptr = &corruptions[i]; + corruption_type const *c_ptr = &corruptions[i]; if (header) { - fprintf(fff, "\n Corruption list:\n"); - header = FALSE; + w.write("\nCorruption list:\n\n"); + header = false; } if (p_ptr->corruptions[i]) @@ -966,16 +965,18 @@ void dump_corruptions(FILE *fff, bool_ color, bool_ header) if (color) { - fprintf(fff, "#####%c%s:\n", conv_color[c], c_ptr->name); + w.write("#####{}{}:\n", static_cast(conv_color[c]), c_ptr->name); } else { - fprintf(fff, "%s:\n", c_ptr->name); + w.write("{}:\n", c_ptr->name); } - fprintf(fff, "%s\n", c_ptr->desc); + w.write("{}\n\n", c_ptr->desc); } } + + return w.str(); } /* diff --git a/src/corrupt.hpp b/src/corrupt.hpp index c200762e..d7ab2e97 100644 --- a/src/corrupt.hpp +++ b/src/corrupt.hpp @@ -1,7 +1,9 @@ #include "h-basic.h" +#include + extern void gain_random_corruption(); -extern void dump_corruptions(FILE *OutFile, bool_ color, bool_ header); +extern std::string dump_corruptions(bool color, bool header); extern void lose_corruption(); extern bool_ player_has_corruption(int corruption_idx); extern void player_gain_corruption(int corruption_idx); diff --git a/src/files.cc b/src/files.cc index ab5421b5..be1e208a 100644 --- a/src/files.cc +++ b/src/files.cc @@ -54,7 +54,10 @@ #include "xtra1.hpp" #include "z-rand.hpp" +#include #include +#include +#include #include /* @@ -2784,7 +2787,7 @@ errr file_character(cptr name, bool_ full) file_character_print_grid(fff, FALSE, FALSE); /* Dump corruptions */ - dump_corruptions(fff, FALSE, TRUE); + fprintf(fff, "\n%s\n", dump_corruptions(false, true).c_str()); /* Dump skills */ dump_skills(fff); @@ -2806,7 +2809,7 @@ errr file_character(cptr name, bool_ full) if ((fates[i].fate) && (fates[i].know)) { fprintf(fff, "\n\n [Fates]\n\n"); - dump_fates(fff); + fprintf(fff, "%s", dump_fates().c_str()); break; } } @@ -3501,6 +3504,24 @@ static bool_ show_file_aux(cptr name, cptr what, int line) return (TRUE); } +void show_string(const char *lines, const char *title, int line) +{ + // Temporary file + auto const file_name = boost::filesystem::unique_path().string(); + + // Open a new file + std::ofstream ofs(file_name); + ofs.exceptions(std::ofstream::failbit); + ofs << lines; + ofs.close(); + + // Display the file contents + show_file_aux(file_name.c_str(), title, line); + + // Remove the file + fd_kill(file_name.c_str()); +} + void show_file(cptr name, cptr what, int line) { show_file_aux(name, what, line); diff --git a/src/files.hpp b/src/files.hpp index d61415f6..d90f6660 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -3,6 +3,9 @@ #include "h-basic.h" #include "monster_type_fwd.hpp" +#include +#include + extern void html_screenshot(cptr name); extern void help_file_screenshot(cptr name); extern void player_flags(u32b* f1, u32b* f2, u32b* f3, u32b* f4, u32b* f5, u32b* esp); @@ -13,6 +16,7 @@ extern cptr describe_player_location(void); extern errr file_character(cptr name, bool_ full); extern errr process_pref_file_aux(char *buf); extern errr process_pref_file(cptr name); +extern void show_string(const char *lines, const char *title, int line = 0); extern void show_file(cptr name, cptr what, int line = 0); extern void do_cmd_help(void); extern void process_player_base(void); diff --git a/src/q_bounty.cc b/src/q_bounty.cc index bb84d48d..7af282bf 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -11,6 +11,8 @@ #include "util.hpp" #include "variable.hpp" +#include + #define cquest (quest[QUEST_BOUNTY]) #define bounty_quest_monster (cquest.data[0]) @@ -151,20 +153,18 @@ bool_ quest_bounty_get_item() return FALSE; } -bool_ quest_bounty_describe(FILE *fff) +std::string quest_bounty_describe() { char mdesc[512]; + fmt::MemoryWriter w; if (cquest.status == QUEST_STATUS_TAKEN) { monster_race_desc(mdesc, bounty_quest_monster, 0); - fprintf(fff, "#####yBounty quest!\n"); - fprintf(fff, "You must bring back %s corpse to the beastmaster.\n", mdesc); - fprintf(fff, "\n"); - - return TRUE; + w.write("#####yBounty quest!\n"); + w.write("You must bring back {} corpse to the beastmaster.", mdesc); } - return FALSE; + return w.str(); } diff --git a/src/q_bounty.hpp b/src/q_bounty.hpp index 234c036d..450ca8bd 100644 --- a/src/q_bounty.hpp +++ b/src/q_bounty.hpp @@ -2,7 +2,9 @@ #include "h-basic.h" +#include + extern bool_ quest_bounty_init_hook(int q_idx); extern bool_ quest_bounty_drop_item(); extern bool_ quest_bounty_get_item(); -extern bool_ quest_bounty_describe(FILE *fff); +extern std::string quest_bounty_describe(); diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 021cf2fb..0942a71c 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -17,11 +17,10 @@ #include "z-rand.hpp" #include +#include #define cquest (quest[QUEST_FIREPROOF]) -#define print_hook(fmt,...) do { fprintf(hook_file, fmt, ##__VA_ARGS__); } while (0) - /* * Per-module "settings" */ @@ -427,7 +426,7 @@ static bool_ fireproof_stair_hook(void *, void *, void *) } } -bool_ quest_fireproof_describe(FILE *hook_file) +std::string quest_fireproof_describe() { fireproof_settings const *settings = fireproof_get_settings(); int num_books, num_staff, num_scroll; @@ -437,37 +436,34 @@ bool_ quest_fireproof_describe(FILE *hook_file) num_staff = get_item_points_remaining() / FIREPROOF_STAFF_POINTS; num_scroll = get_item_points_remaining() / FIREPROOF_SCROLL_POINTS; + fmt::MemoryWriter w; + if (status == QUEST_STATUS_TAKEN) { /* Quest taken */ - print_hook("#####yAn Old Mages Quest!\n"); - print_hook("Retrieve the strange %s for the old mage " - "in Lothlorien.\n", settings->tval_name); - print_hook("\n"); + w.write("#####yAn Old Mages Quest!\n"); + w.write("Retrieve the strange {} for the old mage in Lothlorien.", settings->tval_name); } else if (status == QUEST_STATUS_COMPLETED) { /* essence retrieved, not taken to mage */ - print_hook("#####yAn Old Mages Quest!\n"); - print_hook("You have retrieved the %s for the old " - "mage in Lothlorien. Perhaps you \n", settings->tval_name); - print_hook("should see about a reward.\n"); - print_hook("\n"); + w.write("#####yAn Old Mages Quest!\n"); + w.write("You have retrieved the {} for the old mage in Lothlorien.\n", settings->tval_name); + w.write("Perhaps you should see about a reward."); } else if ((status == QUEST_STATUS_FINISHED) && (get_item_points_remaining() > 0)) { /* essence returned, not all books fireproofed */ - print_hook("#####yAn Old Mages Quest!\n"); - print_hook("You have retrieved the %s for the old " - "mage in Lothlorien. He will still \n", settings->tval_name); - print_hook("fireproof %d book(s) or %d staff/staves " - "or %d scroll(s) for you.\n", - num_books, num_staff, num_scroll); - print_hook("\n"); + w.write("#####yAn Old Mages Quest!\n"); + w.write("You have retrieved the {} for the old " + "mage in Lothlorien. He will still\n", settings->tval_name); + w.write("fireproof {} book(s) or {} staff/staves " + "or {} scroll(s) for you.", + num_books, num_staff, num_scroll); } - return TRUE; + return w.str(); } static bool_ fireproof_gen_hook(void *, void *, void *) diff --git a/src/q_fireprof.hpp b/src/q_fireprof.hpp index 53d368b0..48175ce9 100644 --- a/src/q_fireprof.hpp +++ b/src/q_fireprof.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include + extern void quest_fireproof_building(bool_ *paid, bool_ *recreate); extern bool_ quest_fireproof_init_hook(int q); -extern bool_ quest_fireproof_describe(FILE *fff); +extern std::string quest_fireproof_describe(); diff --git a/src/q_god.cc b/src/q_god.cc index de58bfe7..79213146 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -271,19 +271,20 @@ static std::string make_directions(bool feel_it) } } -bool_ quest_god_describe(FILE *fff) +std::string quest_god_describe() { + fmt::MemoryWriter w; + if (cquest.status == QUEST_STATUS_TAKEN) { auto directions = make_directions(false); - fprintf(fff, "#####yGod quest " FMTs32b "!\n", cquest_quests_given); - fprintf(fff, "Thou art to find the lost temple of thy God and\n"); - fprintf(fff, "to retrieve the lost part of the relic for thy God! \n"); - fprintf(fff, "%s\n", directions.c_str()); - fprintf(fff, "\n"); + w.write("#####yGod quest {}!\n", cquest_quests_given); + w.write("Thou art to find the lost temple of thy God and\n"); + w.write("to retrieve the lost part of the relic for thy God!\n"); + w.write("{}", directions.c_str()); } - return TRUE; + return w.str(); } static void quest_god_place_rand_dung() diff --git a/src/q_god.hpp b/src/q_god.hpp index d9513bdb..d5a993fa 100644 --- a/src/q_god.hpp +++ b/src/q_god.hpp @@ -2,5 +2,7 @@ #include "h-basic.h" -bool_ quest_god_describe(FILE *); +#include + +std::string quest_god_describe(); bool_ quest_god_init_hook(int q); diff --git a/src/q_library.cc b/src/q_library.cc index 52a67291..48c9d0cf 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -18,11 +18,10 @@ #include "z-rand.hpp" #include +#include #define cquest (quest[QUEST_LIBRARY]) -#define print_hook(fmt,...) do { fprintf(hook_file, fmt, ##__VA_ARGS__); } while (0) - #define MONSTER_LICH 518 #define MONSTER_MONASTIC_LICH 611 #define MONSTER_FLESH_GOLEM 256 @@ -482,25 +481,23 @@ void quest_library_building(bool_ *paid, bool_ *recreate) } } -bool_ quest_library_describe(FILE *hook_file) +std::string quest_library_describe() { + fmt::MemoryWriter w; + if (cquest.status == QUEST_STATUS_TAKEN) { - print_hook("#####yAn Old Mages Quest! (Danger Level: 35)\n"); - print_hook("Make the library safe for the old mage in Minas Anor.\n"); - print_hook("\n"); + w.write("#####yAn Old Mages Quest! (Danger Level: 35)\n"); + w.write("Make the library safe for the old mage in Minas Anor."); } else if (cquest.status == QUEST_STATUS_COMPLETED) { - /* Quest done, book not gotten yet */ - print_hook("#####yAn Old Mages Quest!\n"); - print_hook("You have made the library safe for the old mage in Minas Anor.\n"); - print_hook("Perhaps you should see about a reward.\n"); - print_hook("\n"); + w.write("#####yAn Old Mages Quest!\n"); + w.write("You have made the library safe for the old mage in Minas Anor.\n"); + w.write("Perhaps you should see about a reward."); } - /* Normal processing */ - return TRUE; + return w.str(); } bool_ quest_library_init_hook(int q) diff --git a/src/q_library.hpp b/src/q_library.hpp index 8150893e..4c085472 100644 --- a/src/q_library.hpp +++ b/src/q_library.hpp @@ -2,7 +2,9 @@ #include "h-basic.h" +#include + bool_ quest_library_init_hook(int q); -bool_ quest_library_describe(FILE *fff); +std::string quest_library_describe(); void quest_library_building(bool_ *paid, bool_ *recreate); void initialize_bookable_spells(); diff --git a/src/q_rand.cc b/src/q_rand.cc index 4ef79928..8fb49b34 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -28,6 +28,7 @@ #include "z-rand.hpp" #include +#include static int randquest_hero[] = { 20, 13, 15, 16, 9, 17, 18, 8, -1 }; @@ -615,31 +616,37 @@ static bool_ quest_random_dump_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_random_describe(FILE *fff) +std::string quest_random_describe() { - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return FALSE; - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return FALSE; - if (!random_quests[dun_level].type) return FALSE; - if (random_quests[dun_level].done) return FALSE; - if (p_ptr->inside_quest) return FALSE; - if (!dun_level) return FALSE; + // Only emit description if we're actually on a + // random quest level. + if (!(dungeon_flags1 & DF1_PRINCIPAL)) return ""; + if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return ""; + if (!random_quests[dun_level].type) return ""; + if (random_quests[dun_level].done) return ""; + if (p_ptr->inside_quest) return ""; + if (!dun_level) return ""; + + fmt::MemoryWriter w; if (!is_randhero(dun_level)) { - fprintf(fff, "#####yCaptured princess!\n"); - fprintf(fff, "A princess is being held prisoner and tortured here!\n"); - fprintf(fff, "Save her from the horrible %s.\n", r_info[random_quests[dun_level].r_idx].name); + w.write("#####yCaptured princess!\n"); + w.write("A princess is being held prisoner and tortured here!\n"); + w.write("Save her from the horrible {}.\n", r_info[random_quests[dun_level].r_idx].name); } else { - fprintf(fff, "#####yLost sword!\n"); - fprintf(fff, "An adventurer lost his sword to a bunch of %s!\n", r_info[random_quests[dun_level].r_idx].name); - fprintf(fff, "Kill them all to get it back.\n"); + w.write("#####yLost sword!\n"); + w.write("An adventurer lost his sword to a bunch of {}!\n", r_info[random_quests[dun_level].r_idx].name); + w.write("Kill them all to get it back.\n"); } - fprintf(fff, "Number: %d, Killed: %ld.\n", - random_quests[dun_level].type, (long int) quest[QUEST_RANDOM].data[0]); - fprintf(fff, "\n"); - return TRUE; + + w.write("Number: {}, Killed: {}.", + random_quests[dun_level].type, + quest[QUEST_RANDOM].data[0]); + + return w.str(); } bool_ quest_random_init_hook(int q_idx) diff --git a/src/q_rand.hpp b/src/q_rand.hpp index fe87289b..0aa9ccc8 100644 --- a/src/q_rand.hpp +++ b/src/q_rand.hpp @@ -2,7 +2,9 @@ #include "h-basic.h" +#include + void initialize_random_quests(int n); bool_ is_randhero(int level); bool_ quest_random_init_hook(int q_idx); -bool_ quest_random_describe(FILE *fff); +std::string quest_random_describe(); diff --git a/src/quest_type.hpp b/src/quest_type.hpp index aa99f40a..19d9cc87 100644 --- a/src/quest_type.hpp +++ b/src/quest_type.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include + /** * Quest descriptor and runtime data. */ @@ -23,5 +25,5 @@ struct quest_type s32b data[9]; /* Various datas used by the quests */ - bool_ (*gen_desc)(FILE *fff); /* Function for generating description. */ + std::string (*gen_desc)(); /* Function for generating description. */ }; diff --git a/src/status.cc b/src/status.cc index 1886e5a6..c175fd7d 100644 --- a/src/status.cc +++ b/src/status.cc @@ -28,6 +28,7 @@ #include "xtra1.hpp" #include +#include #include static void row_trival(const char*, s16b, u32b, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); @@ -723,20 +724,12 @@ static void row_hd_bon(int which, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIEL static void status_companion(void) { - int i; - Term_clear(); - /* Temporary file */ - auto const file_name_p = boost::filesystem::unique_path(); - auto const file_name = file_name_p.c_str(); + fmt::MemoryWriter w; - /* Open a new file */ - FILE *fff = my_fopen(file_name, "w"); - - /* Calculate companions */ /* Process the monsters (backwards) */ - for (i = m_max - 1; i >= 1; i--) + for (int i = m_max - 1; i >= 1; i--) { /* Access the monster */ monster_type *m_ptr = &m_list[i]; @@ -744,40 +737,35 @@ static void status_companion(void) if (m_ptr->status == MSTATUS_COMPANION) { char m_name[80]; - int b, y = 0; - - /* Extract monster name */ monster_desc(m_name, m_ptr, 0x80); - fprintf(fff, "#####BCompanion: %s\n", m_name); + std::string exp_for_next_level = (m_ptr->level < MONSTER_LEVEL_MAX) + ? std::to_string(monster_exp(m_ptr->level + 1)) + : "****"; - fprintf(fff, " Lev/Exp : [[[[[G%d / %ld]\n", m_ptr->level, (long int) m_ptr->exp); - if (m_ptr->level < MONSTER_LEVEL_MAX) fprintf(fff, " Next lvl: [[[[[G%ld]\n", (long int) monster_exp(m_ptr->level + 1)); - else fprintf(fff, " Next lvl: [[[[[G****]\n"); + w.write("#####BCompanion: {}\n", m_name); - fprintf(fff, " HP : [[[[[G%ld / %ld]\n", (long int) m_ptr->hp, (long int) m_ptr->maxhp); - fprintf(fff, " AC : [[[[[G%d]\n", m_ptr->ac); - fprintf(fff, " Speed : [[[[[G%d]\n", m_ptr->mspeed - 110); + w.write(" Lev/Exp : [[[[[G{} / {}]\n", m_ptr->level, m_ptr->exp); + w.write(" Next lvl: [[[[[G{}]\n", exp_for_next_level); - for (b = 0; b < 4; b++) + w.write(" HP : [[[[[G{} / {}]\n", m_ptr->hp, m_ptr->maxhp); + w.write(" AC : [[[[[G{}]\n", m_ptr->ac); + w.write(" Speed : [[[[[G{}]\n", m_ptr->mspeed - 110); + + int y = 0; + for (int b = 0; b < 4; b++) { if (!m_ptr->blow[b].d_dice) continue; if (!m_ptr->blow[b].d_side) continue; - fprintf(fff, " Blow %1d : [[[[[G%dd%d]\n", y + 1, m_ptr->blow[b].d_dice, m_ptr->blow[b].d_side); + w.write(" Blow {} : [[[[[G{}d{}]\n", y + 1, m_ptr->blow[b].d_dice, m_ptr->blow[b].d_side); y++; } - fprintf(fff, "\n"); + w.write("\n"); } } - /* Close the file */ - my_fclose(fff); - - /* Display the file contents */ - show_file(file_name, "Companion List"); - - /* Remove the file */ - fd_kill(file_name); + /* Display */ + show_string(w.c_str(), "Companion List"); } diff --git a/src/xtra1.cc b/src/xtra1.cc index fd4a11fd..ab521c61 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -50,6 +50,7 @@ #include "z-rand.hpp" #include +#include /* * Converts stat num into a six-char (right justified) string @@ -4529,18 +4530,19 @@ void gain_fate(byte fate) } } -void fate_desc(char *desc, int fate) +std::string fate_desc(int fate) { - char buf[120]; + fmt::MemoryWriter w; if (fates[fate].serious) { - strcpy(desc, "You are fated to "); + w.write("You are fated to "); } else { - strcpy(desc, "You may "); + w.write("You may "); } + switch (fates[fate].fate) { case FATE_FIND_O: @@ -4552,8 +4554,7 @@ void fate_desc(char *desc, int fate) object_prep(o_ptr, fates[fate].o_idx); object_desc_store(o_name, o_ptr, 1, 0); - sprintf(buf, "find %s on level %d.", o_name, fates[fate].level); - strcat(desc, buf); + w.write("find {} on level {}.", o_name, fates[fate].level); break; } case FATE_FIND_A: @@ -4605,54 +4606,55 @@ void fate_desc(char *desc, int fate) object_desc_store(o_name, q_ptr, 1, 0); } - sprintf(buf, "find %s on level %d.", o_name, fates[fate].level); - strcat(desc, buf); + w.write("find {} on level {}.", o_name, fates[fate].level); break; } case FATE_FIND_R: { char m_name[80]; - monster_race_desc(m_name, fates[fate].r_idx, 0); - sprintf(buf, "meet %s on level %d.", m_name, fates[fate].level); - strcat(desc, buf); + + w.write("meet {} on level {}.", m_name, fates[fate].level); break; } case FATE_DIE: { - sprintf(buf, "die on level %d.", fates[fate].level); - strcat(desc, buf); + w.write("die on level {}.", fates[fate].level); break; } case FATE_NO_DIE_MORTAL: { - strcat(desc, "never to die by the hand of a mortal being."); + w.write("never to die by the hand of a mortal being."); break; } } + + return w.str(); } -void dump_fates(FILE *outfile) +std::string dump_fates() { - int i; - char buf[120]; bool_ pending = FALSE; - if (!outfile) return; + fmt::MemoryWriter w; - for (i = 0; i < MAX_FATES; i++) + for (int i = 0; i < MAX_FATES; i++) { if ((fates[i].fate) && (fates[i].know)) { - fate_desc(buf, i); - fprintf(outfile, "%s\n", buf); + w.write("{}\n", fate_desc(i)); } - if ((fates[i].fate) && !(fates[i].know)) pending = TRUE; + + // Pending gets set if there's at least one fate we don't know + pending |= ((fates[i].fate) && !(fates[i].know)); } + if (pending) { - fprintf(outfile, "You do not know all of your fate.\n"); + w.write("You do not know all of your fate.\n"); } + + return w.str(); } /* diff --git a/src/xtra1.hpp b/src/xtra1.hpp index df2592ac..e2a41b13 100644 --- a/src/xtra1.hpp +++ b/src/xtra1.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include + extern void fix_message(void); extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); extern int luck(int min, int max); @@ -18,7 +20,7 @@ extern void handle_stuff(void); extern bool_ monk_heavy_armor(void); extern void calc_bonuses(bool_ silent); extern void gain_fate(byte fate); -extern void fate_desc(char *desc, int fate); -extern void dump_fates(FILE *OutFile); +extern std::string fate_desc(int fate); +extern std::string dump_fates(); extern bool race_flags1_p(u32b flags1_mask); extern bool race_flags2_p(u32b flags2_mask); -- cgit v1.2.3 From 37eecbadf90ec9635f8c75ca36d32f6bdcee28c1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 13 Feb 2016 13:56:52 +0100 Subject: Remove insert_sort_quest() --- src/cmd4.cc | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index 9a8a3a65..9df90887 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3689,52 +3689,17 @@ static void do_cmd_knowledge_corruptions(void) } -/* - * Helper function for do_cmd_knowledge_quests - */ -static void insert_sort_quest(int *order, int *num, int q_idx) -{ - int i, j; - - quest_type *q_ptr = &quest[q_idx]; - - int level = q_ptr->level; - - - /* Find the place */ - for (i = 0; i < *num; i++) - { - quest_type *q2_ptr = &quest[order[i]]; - int level2 = q2_ptr->level; - - if (level < level2) break; - } - - /* Move the remaining items */ - for (j = *num - 1; j >= i; j--) - { - order[j + 1] = order[j]; - } - - /* Insert it */ - order[i] = q_idx; - (*num)++; -} - - /* * Print quest status of all active quests */ static void do_cmd_knowledge_quests(void) { /* Figure out display order of quests */ - int order[MAX_Q_IDX] = { }; - - int num = 0; - for (int i = 0; i < MAX_Q_IDX; i++) - { - insert_sort_quest(order, &num, i); - } + int order[MAX_Q_IDX]; + std::iota(order, order + MAX_Q_IDX, 0); // Start with order of definition + std::sort(order, order + MAX_Q_IDX, [](int qi, int qj) -> bool { + return (quest[qi].level < quest[qj].level); + }); /* Write */ fmt::MemoryWriter w; -- cgit v1.2.3 From e3c212aa016a0b6393ecef58e4a32c31805249e1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 13 Feb 2016 14:01:07 +0100 Subject: Remove stray FIXMEs --- lib/edit/k_info.txt | 2 -- src/object2.cc | 1 - 2 files changed, 3 deletions(-) diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 612bdc5c..5937dca7 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -4811,8 +4811,6 @@ P:0:1d1:0:0:0 # Amulet of Nothing -# FIXME: Could remove "of Nothing" (amulets, rings, rods) - N:572:Nothing G:":d I:40:16:0 diff --git a/src/object2.cc b/src/object2.cc index 620037a3..c9853932 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -4376,7 +4376,6 @@ static bool kind_is_theme(int k_idx) prob = match_theme.combat; break; case TV_HAFTED: - // FIXME: These cases can be shortened drastically prob = match_theme.combat; break; case TV_POLEARM: -- cgit v1.2.3 From 203182fafb1abe281b63cd9ebcca9728383660f2 Mon Sep 17 00:00:00 2001 From: miramor Date: Sat, 5 Mar 2016 16:59:43 -0500 Subject: Fix the far-reaching attack skill --- src/skills.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skills.cc b/src/skills.cc index 3a14a6ce..eef3b77c 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1114,7 +1114,7 @@ void do_cmd_activate_skill() int dir, dy, dx, targetx, targety, max_blows, flags; o_ptr = get_object(INVEN_WIELD); - if (o_ptr->tval == TV_POLEARM) + if (o_ptr->tval != TV_POLEARM) { msg_print("You will need a long polearm for this!"); return; -- cgit v1.2.3 From ea91fcd36198086ea21d167e27a1e5fef7185f88 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Change CHECK_FIRST() from macro to function --- src/object1.cc | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 17a2d096..04faa90b 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2546,8 +2546,16 @@ static bool_ grab_tval_desc(int tval) return TRUE; } -#define CHECK_FIRST(txt, first) \ -if ((first)) { (first) = FALSE; text_out((txt)); } else text_out(", "); +static void check_first(bool_ *first) +{ + if (*first) { + *first = FALSE; + } + else + { + text_out(", "); + } +} /* * Display the damage done with a multiplier @@ -2559,7 +2567,7 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai dam = (o_ptr->dd + (o_ptr->dd * o_ptr->ds)) * 5 * mult; dam += (o_ptr->to_d + p_ptr->to_d + p_ptr->to_d_melee) * 10; dam *= p_ptr->num_blow; - CHECK_FIRST("", *first); + check_first(first); if (dam > 0) { if (dam % 10) @@ -2576,7 +2584,7 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai dam = (o_ptr->dd + (o_ptr->dd * o_ptr->ds)) * 5 * mult2; dam += (o_ptr->to_d + p_ptr->to_d + p_ptr->to_d_melee) * 10; dam *= p_ptr->num_blow; - CHECK_FIRST("", *first); + check_first(first); if (dam > 0) { if (dam % 10) @@ -2656,7 +2664,7 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr dam *= tmul; if (!is_boomerang) dam += (p_ptr->to_d_ranged) * 10; dam *= mult; - CHECK_FIRST("", *first); + check_first(first); if (dam > 0) { if (dam % 10) @@ -2676,7 +2684,7 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr dam *= tmul; if (!is_boomerang) dam += (p_ptr->to_d_ranged) * 10; dam *= mult2; - CHECK_FIRST("", *first); + check_first(first); if (dam > 0) { if (dam % 10) @@ -2829,14 +2837,10 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait { u32b f1, f2, f3, f4, f5, esp; - const char *txt; - cptr vp[64]; byte vc[64]; int vn; - bool_ first = TRUE; - /* Extract the flags */ if ((!(o_ptr->ident & (IDENT_MENTAL))) && (!fff)) { @@ -2907,13 +2911,12 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait else if (count_bits(o_ptr->pval3) > 1) text_out("It is sentient and can have access to the realms of "); else text_out("It is sentient and can have access to the realm of "); - first = TRUE; - txt = ""; + bool_ first = TRUE; for (j = 0; j < MAX_FLAG_GROUP; j++) { if (BIT(j) & o_ptr->pval3) { - CHECK_FIRST(txt, first); + check_first(&first); text_out_c(flags_groups[j].color, flags_groups[j].name); } } -- cgit v1.2.3 From c6bb51bd11891177b20bdeecc6baa77f0261e45e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Use std::string for object_desc --- src/object1.cc | 632 ++++++++++++++++++++------------------------------------ src/object1.hpp | 1 + src/xtra2.cc | 2 +- 3 files changed, 223 insertions(+), 412 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 04faa90b..096cadc5 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -52,7 +52,12 @@ #include "xtra1.hpp" #include "z-rand.hpp" +#include +#include #include +#include + +using boost::starts_with; static bool_ apply_flags_set(s16b a_idx, s16b set_idx, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); @@ -1075,119 +1080,16 @@ void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, } - - - -/* - * Print a char "c" into a string "t", as if by sprintf(t, "%c", c), - * and return a pointer to the terminator (t + 1). - */ -static char *object_desc_chr(char *t, char c) -{ - /* Copy the char */ - *t++ = c; - - /* Terminate */ - *t = '\0'; - - /* Result */ - return (t); -} - - -/* - * Print a string "s" into a string "t", as if by strcpy(t, s), - * and return a pointer to the terminator. - */ -static char *object_desc_str(char *t, cptr s) -{ - /* Copy the string */ - while (*s) *t++ = *s++; - - /* Terminate */ - *t = '\0'; - - /* Result */ - return (t); -} - -/* - * Do the actual conversion of a number for object_desc_num() and - * object_desc_int(). - */ -static char *convert_number(char *result, u32b num) -{ - char *tp; - char temp[11]; - - tp = temp; - *tp = '0' + (num % 10); - for (num /= 10; num != 0; num /= 10) - { - *++tp = '0' + (num % 10); - } - - while (tp != temp) - { - *result++ = *tp--; - } - *result++ = *tp; - *result = '\0'; - - return result; -} - -/* - * Print a nnumber "n" into a string "t", as if by - * sprintf(t, "%u", n), and return a pointer to the terminator. +/** + * Calculate amount of EXP needed for the given object to + * level, assuming it's a sentient object. */ -static char *object_desc_num(char *result, s32b num) +s32b calc_object_need_exp(object_type const *o_ptr) { - u32b n; - - if (num < 0) - { - *result++ = '-'; - n = -num; - } - else - n = num; - - /* Result */ - return convert_number(result, n); + return (player_exp[o_ptr->elevel - 1] * 5 / 2); } -/* - * Print an signed number "num" into a string "result", as if by - * sprintf(t, "%+d", n), and return a pointer to the terminator. - * Note that we always print a sign, either "+" or "-". - */ -static char *object_desc_int(char *result, s32b num) -{ - u32b n; - /* Negative */ - if (num < 0) - { - /* Take the absolute value */ - n = -num; - - /* Use a "minus" sign */ - *result++ = '-'; - } - /* Positive (or zero) */ - else - { - /* Use the actual number */ - n = num; - - /* Use a "plus" sign */ - *result++ = '+'; - } - - /* Result */ - return convert_number(result, n); -} /* * Creates a description of the item "o_ptr", and stores it in "out_val". @@ -1234,11 +1136,9 @@ static char *object_desc_int(char *result, s32b num) * 2 -- The Cloak of Death [1,+3] (+2 to Stealth) * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty} */ -void object_desc(char *buf, object_type *o_ptr, int pref, int mode) +std::string object_desc_aux(object_type *o_ptr, int pref, int mode) { bool_ hack_name = FALSE; - cptr basenm, modstr; - int indexx; bool_ aware = FALSE; bool_ known = FALSE; @@ -1248,24 +1148,10 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) bool_ show_weapon = FALSE; bool_ show_armour = FALSE; - cptr s, u; - char *t; - - char p1 = '(', p2 = ')'; - char b1 = '[', b2 = ']'; - char c1 = '{', c2 = '}'; - - char tmp_val[160]; - char tmp_val2[90]; - - s32b power; - u32b f1, f2, f3, f4, f5, esp; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - cptr str; - /* Extract some flags */ + u32b f1, f2, f3, f4, f5, esp; object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); @@ -1276,13 +1162,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (object_known_p(o_ptr)) known = TRUE; /* Hack -- Extract the sub-type "indexx" */ - indexx = o_ptr->sval; + auto const indexx = o_ptr->sval; /* Extract default "base" string */ - basenm = k_ptr->name; + std::string basenm(k_ptr->name); /* Assume no "modifier" string */ - modstr = ""; + std::string modstr; /* Analyze the object */ switch (o_ptr->tval) @@ -1530,8 +1416,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Hack -- Gold/Gems */ case TV_GOLD: { - strcpy(buf, basenm); - return; + return basenm; } case TV_CORPSE: @@ -1539,9 +1424,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) monster_race* r_ptr = &r_info[o_ptr->pval2]; modstr = basenm; if (r_ptr->flags1 & RF1_UNIQUE) - basenm = format("& %s's #~", r_ptr->name); + { + basenm = fmt::format("& {}'s #~", r_ptr->name); + } else - basenm = format("& %s #~", r_ptr->name); + { + basenm = fmt::format("& {} #~", r_ptr->name); + } break; } @@ -1549,8 +1438,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) { monster_race* r_ptr = &r_info[o_ptr->pval2]; modstr = basenm; - - basenm = format("& %s #~", r_ptr->name); + basenm = fmt::format("& {} #~", r_ptr->name); break; } @@ -1559,24 +1447,23 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* We print hit points further down. --dsb */ monster_race* r_ptr = &r_info[o_ptr->pval]; modstr = basenm; - basenm = format("& %s~", r_ptr->name); + basenm = fmt::format("& {}~", r_ptr->name); break; } case TV_TOTEM: { - char name[80]; monster_type monster; - monster.r_idx = o_ptr->pval; monster.ego = o_ptr->pval2; monster.ml = TRUE; monster.status = MSTATUS_ENEMY; + char name[80]; monster_desc(name, &monster, 0x188); modstr = basenm; - basenm = format("& #~ of %s", name); + basenm = fmt::format("& #~ of {}", name); break; } @@ -1625,10 +1512,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Used in the "inventory" routine */ default: - { - strcpy(buf, "(nothing)"); - return; - } + return "(nothing)"; } /* Mega Hack */ @@ -1637,18 +1521,26 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) basenm = k_ptr->name; } + /* Copy of the base string _without_ a prefix */ + std::string s; /* Start dumping the result */ - t = tmp_val; + std::string t; /* The object "expects" a "number" */ - if (basenm[0] == '&') + if (starts_with(basenm, "&")) { - monster_race* r_ptr; cptr ego = NULL; - if (o_ptr->tval == TV_CORPSE) r_ptr = &r_info[o_ptr->pval2]; - else r_ptr = &r_info[o_ptr->pval]; + monster_race* r_ptr; + if (o_ptr->tval == TV_CORPSE) + { + r_ptr = &r_info[o_ptr->pval2]; + } + else + { + r_ptr = &r_info[o_ptr->pval]; + } /* Grab any ego-item name */ if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) @@ -1667,7 +1559,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) } /* Skip the ampersand (and space) */ - s = basenm + 2; + s = basenm.substr(2); /* No prefix */ if (pref <= 0) @@ -1678,14 +1570,14 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Hack -- None left */ else if (o_ptr->number <= 0) { - t = object_desc_str(t, "no more "); + t += "no more "; } /* Extract the number */ else if (o_ptr->number > 1) { - t = object_desc_num(t, o_ptr->number); - t = object_desc_chr(t, ' '); + t += std::to_string(o_ptr->number); + t += ' '; } else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE)) @@ -1698,37 +1590,37 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Hack -- The only one of its kind */ else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) { - t = object_desc_str(t, "The "); + t += "The "; } else if (ego != NULL) { if (is_a_vowel(ego[0])) { - t = object_desc_str(t, "an "); + t += "an "; } else { - t = object_desc_str(t, "a "); + t += "a "; } } /* A single one, with a vowel in the modifier */ - else if ((*s == '#') && (is_a_vowel(modstr[0]))) + else if ((s[0] == '#') && (is_a_vowel(modstr[0]))) { - t = object_desc_str(t, "an "); + t += "an "; } /* A single one, with a vowel */ - else if (is_a_vowel(*s)) + else if (is_a_vowel(s[0])) { - t = object_desc_str(t, "an "); + t += "an "; } /* A single one, without a vowel */ else { - t = object_desc_str(t, "a "); + t += "a "; } /* Grab any ego-item name */ @@ -1739,13 +1631,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (e_ptr->before) { - t = object_desc_str(t, e_ptr->name); - t = object_desc_chr(t, ' '); + t += e_ptr->name; + t += ' '; } if (e2_ptr->before) { - t = object_desc_str(t, e2_ptr->name); - t = object_desc_chr(t, ' '); + t += e2_ptr->name; + t += ' '; } } @@ -1755,13 +1647,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (o_ptr->note) { - str = strchr(quark_str(o_ptr->note), '%'); + cptr str = strchr(quark_str(o_ptr->note), '%'); /* Add the false name */ if (str) { - t = object_desc_str(t, &str[1]); - t = object_desc_chr(t, ' '); + t += &str[1]; + t += ' '; } } @@ -1782,14 +1674,14 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Hack -- all gone */ else if (o_ptr->number <= 0) { - t = object_desc_str(t, "no more "); + t += "no more "; } /* Prefix a number if required */ else if (o_ptr->number > 1) { - t = object_desc_num(t, o_ptr->number); - t = object_desc_chr(t, ' '); + t += std::to_string(o_ptr->number); + t += ' '; } else if (o_ptr->tval == TV_RANDART) @@ -1800,7 +1692,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Hack -- The only one of its kind */ else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) { - t = object_desc_str(t, "The "); + t += "The "; } /* Hack -- single items get no prefix */ @@ -1817,95 +1709,86 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (e_ptr->before) { - t = object_desc_str(t, e_ptr->name); - t = object_desc_chr(t, ' '); + t += e_ptr->name; + t += ' '; } if (e2_ptr->before) { - t = object_desc_str(t, e2_ptr->name); - t = object_desc_chr(t, ' '); + t += e2_ptr->name; + t += ' '; } } } - /* Paranoia -- skip illegal tildes */ - /* while (*s == '~') s++; */ - /* Copy the string */ - for (; *s; s++) + for (auto const c: s) { /* Pluralizer */ - if (*s == '~') + if (c == '~') { /* Add a plural if needed */ if ((o_ptr->number != 1) && (pref >= 0)) { - char k = t[ -1]; + assert(t.size() > 0); + char k = t[t.size() - 1]; /* XXX XXX XXX Mega-Hack */ /* Hack -- "Cutlass-es" and "Torch-es" */ - if ((k == 's') || (k == 'h')) *t++ = 'e'; + if ((k == 's') || (k == 'h')) { + t += "e"; + } /* Add an 's' */ - *t++ = 's'; + t += "s"; } } /* Modifier */ - else if (*s == '#') + else if (c == '#') { /* Grab any ego-item name */ if (o_ptr->tval == TV_ROD_MAIN) { - t = object_desc_chr(t, ' '); + t += ' '; if (known && o_ptr->name2) { ego_item_type *e_ptr = &e_info[o_ptr->name2]; - t = object_desc_str(t, e_ptr->name); + t += e_ptr->name; } } /* Insert the modifier */ - for (u = modstr; *u; u++) *t++ = *u; + t += modstr; } /* Normal */ else { /* Copy */ - *t++ = *s; + t += c; } } - /* Terminate */ - *t = '\0'; - - /* Append the "kind name" to the "base name" */ if ((append_name) && (!artifact_p(o_ptr))) { - t = object_desc_str(t, " of "); + t += " of "; if (((o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_STAFF))) { - t = object_desc_str(t, spell_type_name(spell_at(o_ptr->pval2))); + t += spell_type_name(spell_at(o_ptr->pval2)); if (mode >= 1) { s32b bonus = o_ptr->pval3 & 0xFFFF; s32b max = o_ptr->pval3 >> 16; - - t = object_desc_chr(t, '['); - t = object_desc_num(t, bonus); - t = object_desc_chr(t, '|'); - t = object_desc_num(t, max); - t = object_desc_chr(t, ']'); + t += fmt::format("[{:d}|{:d}]", bonus, max); } } else { - t = object_desc_str(t, k_ptr->name); + t += k_ptr->name; } } @@ -1918,22 +1801,21 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) * Dagger of Smell {@w0} */ if (o_ptr->note) { - str = strchr(quark_str(o_ptr->note), '#'); + cptr str = strchr(quark_str(o_ptr->note), '#'); /* Add the false name */ if (str) { - t = object_desc_chr(t, ' '); - t = object_desc_str(t, &str[1]); + t += ' '; + t += &str[1]; } } /* Is it a new random artifact ? */ if (o_ptr->art_name) { - t = object_desc_chr(t, ' '); - - t = object_desc_str(t, quark_str(o_ptr->art_name)); + t += ' '; + t += quark_str(o_ptr->art_name); } @@ -1945,8 +1827,8 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Unique corpses don't require another name */ if (o_ptr->tval != TV_CORPSE) { - t = object_desc_chr(t, ' '); - t = object_desc_str(t, a_ptr->name); + t += ' '; + t += a_ptr->name; } } @@ -1958,13 +1840,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (o_ptr->name2 && !e_ptr->before) { - t = object_desc_chr(t, ' '); - t = object_desc_str(t, e_ptr->name); + t += ' '; + t += e_ptr->name; } if (o_ptr->name2b && !e2_ptr->before) { - t = object_desc_chr(t, ' '); - t = object_desc_str(t, e2_ptr->name); + t += ' '; + t += e2_ptr->name; } } } @@ -1972,37 +1854,28 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* It contains a spell */ if ((known) && (f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 != -1)) { - t = object_desc_str(t, format(" [%s]", spell_type_name(spell_at(o_ptr->pval2)))); + t += fmt::format(" [{}]", spell_type_name(spell_at(o_ptr->pval2))); } /* Add symbiote hp here, after the "fake-artifact" name. --dsb */ if (o_ptr->tval == TV_HYPNOS) { - t = object_desc_str(t, " ("); - t = object_desc_num(t, o_ptr->pval2); - t = object_desc_str(t, " hp)"); + t += fmt::format(" ({:d} hp)", o_ptr->pval2); } /* No more details wanted */ - if (mode < 1) goto copyback; + if (mode < 1) + { + return t; + } /* Hack -- Some objects can have an exp level */ if ((f4 & TR4_LEVELS) && known) { - t = object_desc_str(t, " (E:"); - if (o_ptr->elevel < PY_MAX_LEVEL) - { - /* Formula from check_experience_obj(). */ - s32b need = player_exp[o_ptr->elevel - 1] * 5 / 2; - t = object_desc_num(t, need - o_ptr->exp); - } - else - { - t = object_desc_str(t, "*****"); - } - t = object_desc_str(t, ", L:"); - t = object_desc_num(t, o_ptr->elevel); - t = object_desc_chr(t, ')'); + auto need_exp = (o_ptr->elevel < PY_MAX_LEVEL) + ? std::to_string(calc_object_need_exp(o_ptr) - o_ptr->exp) + : "*****"; + t += fmt::format(" (E:{}, L:{})", need_exp, o_ptr->elevel); } /* Hack -- Chests must be described in detail */ @@ -2017,29 +1890,24 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* May be "empty" */ else if (!o_ptr->pval) { - t = object_desc_str(t, " (empty)"); + t += " (empty)"; } /* May be "disarmed" */ else if (o_ptr->pval < 0) { - t = object_desc_str(t, " (disarmed)"); + t += " (disarmed)"; } /* Describe the traps, if any */ else { /* Describe the traps */ - t = object_desc_str(t, " ("); - if (t_info[o_ptr->pval].ident) - { - t = object_desc_str(t, t_info[o_ptr->pval].name); - } - else - { - t = object_desc_str(t, "trapped"); - } - t = object_desc_str(t, ")"); + auto trap_name = (t_info[o_ptr->pval].ident) + ? t_info[o_ptr->pval].name + : "trapped"; + + t += fmt::format(" ({})", trap_name); } } @@ -2062,7 +1930,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) case TV_ARROW: /* Exploding arrow? */ if (o_ptr->pval2 != 0) - t = object_desc_str(t, " (exploding)"); + t += " (exploding)"; /* No break, we want to continue the description */ case TV_BOOMERANG: @@ -2076,12 +1944,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) break; /* Append a "damage" string */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_num(t, o_ptr->dd); - t = object_desc_chr(t, 'd'); - t = object_desc_num(t, o_ptr->ds); - t = object_desc_chr(t, p2); + t += fmt::format(" ({:d}d{:d})", o_ptr->dd, o_ptr->ds); /* All done */ break; @@ -2089,19 +1952,14 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Bows get a special "damage string" */ case TV_BOW: - /* Mega-Hack -- Extract the "base power" */ - power = (o_ptr->sval % 10); + s32b power = (o_ptr->sval % 10); /* Apply the "Extra Might" flag */ if (f3 & (TR3_XTRA_MIGHT)) power += o_ptr->pval; /* Append a special "damage" string */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_chr(t, 'x'); - t = object_desc_num(t, power); - t = object_desc_chr(t, p2); + t += fmt::format(" (x{:d})", power); /* All done */ break; @@ -2114,34 +1972,29 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Show the tohit/todam on request */ if (show_weapon) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_h); - t = object_desc_chr(t, ','); - t = object_desc_int(t, o_ptr->to_d); - t = object_desc_chr(t, p2); + t += fmt::format(" ({:+d},{:+d})", o_ptr->to_h, o_ptr->to_d); } /* Show the tohit if needed */ else if (o_ptr->to_h) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_h); + t += fmt::format(" ({:+d}", o_ptr->to_h); if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name) - t = object_desc_str(t, " to accuracy"); - t = object_desc_chr(t, p2); + { + t += " to accuracy"; + } + t += ')'; } /* Show the todam if needed */ else if (o_ptr->to_d) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_int(t, o_ptr->to_d); + t += fmt::format(" ({:+d}", o_ptr->to_d); if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name) - t = object_desc_str(t, " to damage"); - t = object_desc_chr(t, p2); + { + t += " to damage"; + } + t += ')'; } } @@ -2152,49 +2005,37 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Show the armor class info */ if (show_armour) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_num(t, o_ptr->ac); - t = object_desc_chr(t, ','); - t = object_desc_int(t, o_ptr->to_a); - t = object_desc_chr(t, b2); + t += fmt::format(" [{:d},{:+d}]", o_ptr->ac, o_ptr->to_a); } /* No base armor, but does increase armor */ else if (o_ptr->to_a) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_int(t, o_ptr->to_a); - t = object_desc_chr(t, b2); + t += fmt::format(" [{:+d}]", o_ptr->to_a); } } /* Hack -- always show base armor */ else if (show_armour) { - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, b1); - t = object_desc_num(t, o_ptr->ac); - t = object_desc_chr(t, b2); + t += fmt::format(" [{:d}]", o_ptr->ac); } if ((f1 & TR1_MANA) && (known) && (o_ptr->pval > 0)) { - t = object_desc_chr(t, '('); - t = object_desc_num(t, 100 * o_ptr->pval / 5); - t = object_desc_str(t, "%)"); + t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5); } if ((known) && (f2 & TR2_LIFE) ) /* Can disp neg now -- Improv */ { - t = object_desc_chr(t, '('); - t = object_desc_num(t, 100 * o_ptr->pval / 5); - t = object_desc_str(t, "%)"); + t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5); } /* No more details wanted */ - if (mode < 2) goto copyback; + if (mode < 2) + { + return t; + } /* Hack -- Wands and Staffs have charges */ @@ -2202,13 +2043,8 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) ((o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND))) { - /* Dump " (N charges)" */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - t = object_desc_num(t, o_ptr->pval); - t = object_desc_str(t, " charge"); - if (o_ptr->pval != 1) t = object_desc_chr(t, 's'); - t = object_desc_chr(t, p2); + auto plural = (o_ptr->pval != 1) ? "s" : ""; + t += fmt::format(" ({:d} charge{})", o_ptr->pval, plural); } /* @@ -2216,12 +2052,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) */ else if (known && (o_ptr->tval == TV_ROD_MAIN)) { - /* Display prettily. */ - t = object_desc_str(t, " ("); - t = object_desc_num(t, o_ptr->timeout); - t = object_desc_chr(t, '/'); - t = object_desc_num(t, o_ptr->pval2); - t = object_desc_chr(t, ')'); + t += fmt::format(" ({:d}/{:d})", o_ptr->timeout, o_ptr->pval2); } /* @@ -2229,20 +2060,13 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) */ else if (known && (o_ptr->tval == TV_ROD)) { - /* Display prettily. */ - t = object_desc_str(t, " ("); - t = object_desc_num(t, o_ptr->pval); - t = object_desc_str(t, " Mana to cast"); - t = object_desc_chr(t, ')'); + t += fmt::format(" ({:d} Mana to cast)", o_ptr->pval); } /* Hack -- Process Lanterns/Torches */ else if ((o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE)) { - /* Hack -- Turns of light for normal lites */ - t = object_desc_str(t, " (with "); - t = object_desc_num(t, o_ptr->timeout); - t = object_desc_str(t, " turns of light)"); + t += fmt::format(" (with {:d} turns of light)", o_ptr->timeout); } @@ -2250,11 +2074,7 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) if (known && ((f1 & (TR1_PVAL_MASK)) || (f5 & (TR5_PVAL_MASK)))) { /* Start the display */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, p1); - - /* Dump the "pval" itself */ - t = object_desc_int(t, o_ptr->pval); + t += fmt::format(" ({:+d}", o_ptr->pval); /* Do not display the "pval" flags */ if (f3 & (TR3_HIDE_TYPE)) @@ -2265,46 +2085,41 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) /* Speed */ else if (f1 & (TR1_SPEED)) { - /* Dump " to speed" */ - t = object_desc_str(t, " to speed"); + t += " to speed"; } /* Attack speed */ else if (f1 & (TR1_BLOWS)) { - /* Add " attack" */ - t = object_desc_str(t, " attack"); - - /* Add "attacks" */ - if (ABS(o_ptr->pval) != 1) t = object_desc_chr(t, 's'); + t += " attack"; + if (ABS(o_ptr->pval) != 1) + { + t += 's'; + } } /* Critical chance */ else if (f5 & (TR5_CRIT)) { - /* Add " attack" */ - t = object_desc_str(t, "% of critical hits"); + t += "% of critical hits"; } /* Stealth */ else if (f1 & (TR1_STEALTH)) { - /* Dump " to stealth" */ - t = object_desc_str(t, " to stealth"); + t += " to stealth"; } /* Search */ else if (f1 & (TR1_SEARCH)) { - /* Dump " to searching" */ - t = object_desc_str(t, " to searching"); + t += " to searching"; } /* Infravision */ else if (f1 & (TR1_INFRA)) { - /* Dump " to infravision" */ - t = object_desc_str(t, " to infravision"); + t += " to infravision"; } /* Tunneling */ @@ -2314,116 +2129,111 @@ void object_desc(char *buf, object_type *o_ptr, int pref, int mode) } /* Finish the display */ - t = object_desc_chr(t, p2); + t += ')'; } /* Indicate "charging" artifacts XXX XXX XXX */ if (known && (f3 & TR3_ACTIVATE) && o_ptr->timeout) { - if(o_ptr->tval == TV_EGG) - /* Hack -- Dump " (stopped)" if relevant */ - t = object_desc_str(t, " (stopped)"); + if (o_ptr->tval == TV_EGG) + { + t += " (stopped)"; + } else - /* Hack -- Dump " (charging)" if relevant */ - t = object_desc_str(t, " (charging)"); + { + t += " (charging)"; + } } /* Indicate "charging" Mage Staffs XXX XXX XXX */ if (known && o_ptr->timeout && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))) { - /* Hack -- Dump " (charging spell1)" if relevant */ - t = object_desc_str(t, " (charging spell1)"); + t += " (charging spell1)"; } if (known && o_ptr->xtra2 && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))) { - /* Hack -- Dump " (charging spell2)" if relevant */ - t = object_desc_str(t, " (charging spell2)"); + t += " (charging spell2)"; } /* No more details wanted */ - if (mode < 3) goto copyback; - - - /* No inscription yet */ - tmp_val2[0] = '\0'; - - /* Sensed stuff */ - if (o_ptr->ident & (IDENT_SENSE)) + if (mode < 3) { - strcpy(tmp_val2, sense_desc[o_ptr->sense]); + return t; } - /* Hack - Note "cursed" if the item is 'known' and cursed */ - if (cursed_p(o_ptr) && (known) && (!tmp_val2[0])) - { - if (tmp_val2[0]) strcat(tmp_val2, ", "); - strcat(tmp_val2, "cursed"); - } - /* Use the standard inscription if available */ - if (o_ptr->note) + /* Inscribe */ { - char *u = tmp_val2; - - if (tmp_val2[0]) strcat(tmp_val2, ", "); - - strcat(tmp_val2, quark_str(o_ptr->note)); + std::vector inscrip; - for (; *u && (*u != '#') && (*u != '%'); u++); - - *u = '\0'; - } + /* Sensed stuff */ + if ((o_ptr->ident & (IDENT_SENSE)) && sense_desc[o_ptr->sense] && sense_desc[o_ptr->sense][0] != '\0') + { + inscrip.push_back(sense_desc[o_ptr->sense]); + } - /* Mega-Hack -- note empty wands/staffs */ - if (!known && (o_ptr->ident & (IDENT_EMPTY))) - { - if (tmp_val2[0]) strcat(tmp_val2, ", "); - strcat(tmp_val2, "empty"); - } + /* Hack - Note "cursed" if the item is 'known' and cursed */ + if (cursed_p(o_ptr) && known && inscrip.empty()) + { + inscrip.push_back("cursed"); + } - /* Note "tried" if the object has been tested unsuccessfully */ - if (!aware && object_tried_p(o_ptr)) - { - if (tmp_val2[0]) strcat(tmp_val2, ", "); - strcpy(tmp_val2, "tried"); - } + /* Use the standard inscription if available */ + if (o_ptr->note) + { + // Chop at '#' or '%' if present. The suffix of the + // '%' or '#' is handled elsewhere in this function. + std::string note = quark_str(o_ptr->note); + auto const pos = note.find_first_of("%#"); + if (pos > 0) + { + inscrip.push_back(note.substr(0, pos)); + } + } - /* Note the discount, if any */ - if ((o_ptr->discount) && (!tmp_val2[0])) - { - object_desc_num(tmp_val2, o_ptr->discount); - strcat(tmp_val2, "% off"); - } + /* Mega-Hack -- note empty wands/staffs */ + if (!known && (o_ptr->ident & (IDENT_EMPTY))) + { + inscrip.push_back("empty"); + } - /* Append the inscription, if any */ - if (tmp_val2[0]) - { - int n; + /* Note "tried" if the object has been tested unsuccessfully */ + if (!aware && object_tried_p(o_ptr)) + { + inscrip.push_back("tried"); + } - /* Hack -- How much so far */ - n = (t - tmp_val); + /* Note the discount, if any */ + if ((o_ptr->discount) && inscrip.empty()) + { + inscrip.push_back(fmt::format("{:d}% off", o_ptr->discount)); + } - /* Paranoia -- do not be stupid */ - if (n > 75) n = 75; + /* Append the inscription, if any */ + if (!inscrip.empty()) + { + auto inscrip_str = boost::algorithm::join(inscrip, ", "); - /* Hack -- shrink the inscription */ - tmp_val2[75 - n] = '\0'; + /* Make sure we don't exceed 75 characters */ + t.resize(std::min(t.size(), 75)); - /* Append the inscription */ - t = object_desc_chr(t, ' '); - t = object_desc_chr(t, c1); - t = object_desc_str(t, tmp_val2); - t = object_desc_chr(t, c2); + /* Append the inscription */ + t += fmt::format(" {{{}}}", inscrip_str); + } } -copyback: - /* Here's where we dump the built string into buf. */ - tmp_val[79] = '\0'; - t = tmp_val; - while ((*(buf++) = *(t++))); /* copy the string over */ + + return t; } +void object_desc(char *buf, object_type *o_ptr, int pref, int mode) +{ + auto s = object_desc_aux(o_ptr, pref, mode); + auto n = std::min(s.size(), 79); + s.copy(buf, n); + buf[n] = '\0'; +} /* * Hack -- describe an item currently in a store's inventory diff --git a/src/object1.hpp b/src/object1.hpp index ec8f9367..e5a17813 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -20,6 +20,7 @@ extern int object_power(object_type *o_ptr); extern bool_ object_flags_no_set; extern void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); extern void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); +extern s32b calc_object_need_exp(object_type const *o_ptr); extern void object_desc(char *buf, object_type *o_ptr, int pref, int mode); extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode); extern bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it); diff --git a/src/xtra2.cc b/src/xtra2.cc index a7690d42..a65ec7db 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2067,7 +2067,7 @@ void check_experience_obj(object_type *o_ptr) /* Gain levels while possible */ while ((o_ptr->elevel < PY_MAX_LEVEL) && - (o_ptr->exp >= (player_exp[o_ptr->elevel - 1] * 5 / 2))) + (o_ptr->exp >= calc_object_need_exp(o_ptr))) { char buf[100]; -- cgit v1.2.3 From 61f456f2079a75f17e8a6ec031c6f61282001b27 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Theme: Add Ring of Unmagic --- lib/mods/theme/edit/k_info.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index c8a78082..21db38f0 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -6478,6 +6478,16 @@ D:This valuable ring protects the wearer's intellect and intuition, as well as D:guarding him from most mental attacks. From time to time, the wearer can D:even purge himself of insanity. +N:843:Unmagic +G:=:d +I:45:10:2 +W:50:0:2:3000 +A:50/1 +F:ANTIMAGIC_50 +f:ANTIMAGIC_50 +D:This valuable ring projects an aura of anti-magic around its wearer. + + ### New scroll ### N:846:Sterilise G:?:d -- cgit v1.2.3 From 66cb5538460d08241d384a5fc04d8628726abd43 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Fix a missing include --- src/player_race_mod.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 72f975ce..ed48356e 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -2,6 +2,7 @@ #include "body.hpp" #include "h-basic.h" +#include "player_defs.hpp" #include "skills_defs.hpp" struct player_race_mod -- cgit v1.2.3 From f6812b19be995ddd26a318391a0f5311e4de11a6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Rework scroll title generator to use std::string --- src/object1.cc | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 096cadc5..cb935973 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -596,48 +596,37 @@ void flavor_init(void) /* Get a new title */ while (TRUE) { - char buf[80]; - - bool_ okay; - - /* Start a new title */ - buf[0] = '\0'; + std::string buf; /* Collect words until done */ while (1) { - int q, s; - - char tmp[80]; - - /* Start a new word */ - tmp[0] = '\0'; - /* Choose one or two syllables */ - s = ((rand_int(100) < 30) ? 1 : 2); + int s = ((rand_int(100) < 30) ? 1 : 2); /* Add a one or two syllable word */ - for (q = 0; q < s; q++) + std::string tmp; + for (int q = 0; q < s; q++) { - /* Add the syllable */ - strcat(tmp, syllables[rand_int(MAX_SYLLABLES)]); + tmp += syllables[rand_int(MAX_SYLLABLES)]; } /* Stop before getting too long */ - if (strlen(buf) + 1 + strlen(tmp) > 15) break; - - /* Add a space */ - strcat(buf, " "); + if (buf.size() + tmp.size() + 1 > 15) + { + break; + } - /* Add the word */ - strcat(buf, tmp); + /* Add the word with separator */ + buf += " "; + buf += tmp; } /* Save the title */ - strcpy(scroll_adj[i], buf + 1); + strcpy(scroll_adj[i], buf.c_str()); /* Assume okay */ - okay = TRUE; + bool_ okay = TRUE; /* Check for "duplicate" scroll titles */ for (j = 0; j < i; j++) -- cgit v1.2.3 From a343ccf6b05df1d889cb4302a3e9e21c4816c048 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Remove player gender, age, height, etc. --- lib/edit/p_info.txt | 33 ------ lib/edit/tr_info.txt | 35 ------- lib/mods/theme/edit/p_info.txt | 52 ---------- lib/mods/theme/edit/tr_info.txt | 35 ------- lib/mods/theme/pref/trap-xxx.prf | 9 -- lib/pref/trap-xxx.prf | 9 -- src/birth.cc | 213 ++++----------------------------------- src/birth.hpp | 1 - src/birther.hpp | 6 -- src/cmd5.cc | 24 +---- src/defines.h | 22 +--- src/dungeon.cc | 6 -- src/files.cc | 45 ++------- src/hiscore.hpp | 1 - src/init1.cc | 48 --------- src/loadsave.cc | 25 ----- src/player_race.hpp | 13 --- src/player_race_mod.hpp | 13 --- src/player_sex.hpp | 17 ---- src/player_sex_fwd.hpp | 3 - src/player_type.hpp | 7 -- src/q_main.cc | 2 +- src/tables.cc | 23 ----- src/tables.hpp | 2 - src/traps.cc | 80 --------------- src/variable.cc | 1 - src/variable.hpp | 2 - 27 files changed, 36 insertions(+), 691 deletions(-) delete mode 100644 src/player_sex.hpp delete mode 100644 src/player_sex_fwd.hpp diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index c02e765a..e313ffa3 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -826,7 +826,6 @@ C:a:O:23:16:1d1 # R:S:str:int:wis:dex:con:chr:luck # R:K:dis:dev:sav:stl:srh:fos:thn:thb # R:P:hitdie:xp%:infra:history chart -# R:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt # R:E:weapons:torso:arms:finger:head:legs # R:C:allowed classes # R:G:race flags @@ -844,7 +843,6 @@ R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 -R:M:14:6:72:6:180:25:66:4:150:20 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster @@ -853,7 +851,6 @@ R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 -R:M:24:16:66:6:130:15:62:6:100:10 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster R:G:ELF @@ -872,7 +869,6 @@ R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE | @@ -892,7 +888,6 @@ R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 -R:M:21:12:36:3:60:3:33:3:50:3 R:E:1:1:1:2:1:1 R:Z:create food R:G:RESIST_BLACK_BREATH | XTRA_MIGHT_SLING | @@ -914,7 +909,6 @@ R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 R:K:10:12:12:3:6:13:-8:12 R:P:8:135:4:13 -R:M:50:40:42:3:90:6:39:3:75:3 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 @@ -934,7 +928,6 @@ R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 R:K:2:9:10:-1:7:10:15:0 R:P:11:125:5:16 -R:M:35:15:48:3:150:10:46:3:120:10 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 @@ -954,7 +947,6 @@ R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 R:K:-3:-3:-3:-1:0:7:12:-5 R:P:10:110:3:25 -R:M:11:4:66:1:150:5:62:1:120:5 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 @@ -974,7 +966,6 @@ R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 R:K:-5:-8:-8:-2:-1:5:20:-10 R:P:12:137:3:22 -R:M:20:10:96:10:250:50:84:8:225:40 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 @@ -996,7 +987,6 @@ R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 -R:M:50:50:82:5:190:20:78:6:180:15 R:E:1:1:1:2:1:1 R:R:1:0 R:F:SUST_CON | REGEN | @@ -1016,7 +1006,6 @@ R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 -R:M:100:30:90:10:190:20:82:10:180:15 R:E:1:1:1:2:1:1 R:R:1:0 R:F:SEE_INVIS | @@ -1037,7 +1026,6 @@ R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 R:K:-3:-5:-5:-2:-1:5:20:0 R:P:12:130:3:74 -R:M:40:10:92:10:255:60:80:8:235:60 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 @@ -1057,7 +1045,6 @@ R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 R:K:-6:-8:-6:-2:-1:5:25:5 R:P:12:150:3:75 -R:M:40:10:100:10:255:65:80:10:240:64 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 @@ -1079,7 +1066,6 @@ R:D:A weaker kind of goblin, related to orcs. R:S:1:-1:0:1:0:-4:0 R:K:-2:-3:-2:-1:1:8:10:-8 R:P:9:125:3:82 -R:M:11:3:60:1:130:5:55:1:100:5 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 @@ -1099,7 +1085,6 @@ R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 R:K:3:5:10:1:5:10:9:0 R:P:11:135:5:87 -R:M:40:12:43:3:92:6:40:3:78:3 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 @@ -1120,7 +1105,6 @@ R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 R:K:5:15:20:3:8:12:-5:10 R:P:9:150:5:69 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 @@ -1144,7 +1128,6 @@ R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 -R:M:255:70:72:6:100:25:66:4:100:20 R:E:1:1:1:2:1:1 R:Z:grow trees R:G:NO_STUN | NO_FOOD | @@ -1175,7 +1158,6 @@ R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 R:K:10:5:5:-8:1:1:5:5 R:P:10:220:0:84 -R:M:20:3:60:3:80:4:54:3:70:4 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 @@ -1213,7 +1195,6 @@ R:D:They carry the power of wind and thunder. R:S:6:2:1:1:3:8:2 R:K:6:0:10:-16:30:10:15:5 R:P:12:400:0:89 -R:M:14:6:180:6:255:25:150:4:230:20 R:E:1:1:1:2:1:1 R:Z:Thunderlord's Powers R:R:1:0 @@ -1247,7 +1228,6 @@ R:D:power than an average race. R:S:10:0:10:0:10:-15:-5 R:K:15:-5:15:25:0:10:25:25 R:P:15:250:10:100 -R:M:5:15:10:1:50:1:10:1:50:1 R:E:1:1:1:4:0:0 R:Z:Death Mold's Powers R:G:EXPERIMENTAL @@ -1269,7 +1249,6 @@ R:D:The weakest of all the races, bad at everything except gaining levels quickl R:S:-5:-5:-5:-5:-5:-5:-5 R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 -R:M:10:4:40:5:50:10:35:4:45:10 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster R:k:-500:+000:Disarming @@ -1286,7 +1265,6 @@ R:D:Wood elves live in the great forests of Middle-earth. R:S:-3:2:1:5:-4:1:0 R:K:5:6:6:5:8:12:-25:40 R:P:7:130:4:5 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW | R:R:1:1 @@ -1309,7 +1287,6 @@ R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:91 -R:M:14:6:72:6:180:25:66:4:150:20 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:1:0 @@ -1352,7 +1329,6 @@ R:k:+000:+000:Archery # S:S:str:int:wis:dex:con:chr:luck:mana # S:K:dis:dev:sav:stl:srh:fos:thn:thb # S:P:hitdie:xp%:infra -# S:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt # S:E:weapons:torso:arms:finger:head:legs # S:A:allowed races # S:C:'A'llow/'F'orbid:allowed/forbiden classes @@ -1370,7 +1346,6 @@ S:D:A:A normal member of the race. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | @@ -1385,7 +1360,6 @@ S:D:B:sunlight and cannot easily satiate their hunger. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Hobbit | Gnome | Dwarf | Orc | S:A:Troll | Dunadan | Half-Ogre | Beorning | Kobold | Petty-Dwarf | @@ -1400,7 +1374,6 @@ S:D:B:pass through walls. They are somewhat physically weak. S:S:-5:1:1:2:-3:-6:-3:105 S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 -S:M:50:15:0:0:-10:-5:0:0:-10:-5 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | @@ -1425,7 +1398,6 @@ S:D:B:to sharp things. S:S:0:-2:-2:0:1:-4:-3:70 S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 -S:M:50:15:0:0:-10:-5:0:0:-10:-5 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | @@ -1450,7 +1422,6 @@ S:D:B:Strong and dumb is a zombie. S:S:2:-6:-6:1:4:-5:-4:70 S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 -S:M:50:15:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | @@ -1476,7 +1447,6 @@ S:D:A:Hardy members of their race, they are strong fighters but poor spellcaster S:S:2:-3:-2:1:1:-3:1:50 S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Dwarf | Orc | Troll | Half-Ogre | Beorning | S:C:F:Mage @@ -1496,7 +1466,6 @@ S:D:A:reserves but at the cost of an increased physical weakness. S:S:-3:1:1:-3:-3:1:0:120 S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Dunadan | High-Elf | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | @@ -1515,7 +1484,6 @@ S:D:A:In some very rare occasions souls can come back from the Halls of Mandos. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:G:ASTRAL | NO_SUBRACE_CHANGE S:R:1:0 @@ -1533,7 +1501,6 @@ S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 diff --git a/lib/edit/tr_info.txt b/lib/edit/tr_info.txt index 0643f1ab..65721013 100644 --- a/lib/edit/tr_info.txt +++ b/lib/edit/tr_info.txt @@ -679,41 +679,6 @@ I:8:50:0:8:20:0d0:y D:A sudden sound startles you and you drop everything! F:FLOOR | CHEST | DOOR -#-SC- -N:150:Trap of Femininity -I:4:30:5:0:10:2d8:r -D:You feel like a new woman! -F:FLOOR | CHEST | DOOR - -N:151:Trap of Masculinity -I:4:30:5:0:10:2d8:r -D:You feel like a new man! -F:FLOOR | CHEST | DOOR - -N:152:Trap of Neutrality -I:4:30:5:0:10:2d8:r -D:You feel like a new woman... erm, a new man... er, WHAT did you say??? -F:FLOOR | CHEST | DOOR - -N:153:Trap of Aging -I:5:50:5:0:15:1d8:r -D:You suddenly age very fast! -F:CHEST | DOOR - -N:154:Trap of Growing -I:3:75:5:0:5:1d8:r -D:You begin to grow! -F:FLOOR | CHEST | DOOR - -N:155:Trap of Shrinking -I:3:75:5:0:5:1d8:r -D:You begin to shrink! -F:FLOOR | CHEST | DOOR - -#N:156: UNUSED - -#N:157: UNUSED - N:158:Trap of Divine Anger I:6:100:5:0:15:0d0:G D:A voice booms out "Have a care, mortal!" diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 89d335ab..2e615e3a 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -1064,7 +1064,6 @@ C:a:O:23:16:1d1 # R:S:str:int:wis:dex:con:chr:luck # R:K:dis:dev:sav:stl:srh:fos:thn:thb # R:P:hitdie:xp%:infra:history chart -# R:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt # R:E:weapons:torso:arms:finger:head:legs # R:C:allowed classes # R:G:race flags @@ -1082,7 +1081,6 @@ R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 -R:M:14:6:72:6:180:25:66:4:150:20 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist @@ -1091,7 +1089,6 @@ R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 -R:M:24:16:66:6:130:15:62:6:100:10 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist R:G:ELF @@ -1110,7 +1107,6 @@ R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE | @@ -1130,7 +1126,6 @@ R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 -R:M:21:12:36:3:60:3:33:3:50:3 R:E:1:1:1:2:1:0 R:Z:create food R:G:RESIST_BLACK_BREATH | XTRA_MIGHT_SLING | @@ -1152,7 +1147,6 @@ R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 R:K:10:12:12:3:6:13:-8:12 R:P:8:135:4:13 -R:M:50:40:42:3:90:6:39:3:75:3 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 @@ -1172,7 +1166,6 @@ R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 R:K:2:9:10:-1:7:10:15:0 R:P:11:125:5:16 -R:M:35:15:48:3:150:10:46:3:120:10 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 @@ -1192,7 +1185,6 @@ R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 R:K:-3:-3:-3:-1:0:7:12:-5 R:P:10:110:3:25 -R:M:11:4:66:1:150:5:62:1:120:5 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 @@ -1212,7 +1204,6 @@ R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 R:K:-5:-8:-8:-2:-1:5:20:-10 R:P:12:137:3:22 -R:M:20:10:96:10:250:50:84:8:225:40 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 @@ -1235,7 +1226,6 @@ R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 -R:M:50:50:82:5:190:20:78:6:180:15 R:E:1:1:1:2:1:1 R:R:1:0 R:F:SUST_CON | REGEN | @@ -1255,7 +1245,6 @@ R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 -R:M:100:30:90:10:190:20:82:10:180:15 R:E:1:1:1:2:1:1 R:R:1:0 R:F:SEE_INVIS | @@ -1276,7 +1265,6 @@ R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 R:K:-3:-5:-5:-2:-1:5:20:0 R:P:12:130:3:74 -R:M:40:10:92:10:255:60:80:8:235:60 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 @@ -1296,7 +1284,6 @@ R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 R:K:-6:-8:-6:-2:-1:5:25:5 R:P:12:150:3:75 -R:M:40:10:100:10:255:65:80:10:240:64 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 @@ -1322,7 +1309,6 @@ R:D:Not as pretty as their common human cousins, but sturdier. R:S:-2:-3:2:3:2:-2:1 R:K:5:0:0:5:15:15:0:5 R:P:9:115:0:82 -R:M:14:6:65:6:162:25:58:4:145:20 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 @@ -1343,7 +1329,6 @@ R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 R:K:3:5:10:1:5:10:9:0 R:P:11:135:5:87 -R:M:40:12:43:3:92:6:40:3:78:3 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 @@ -1364,7 +1349,6 @@ R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 R:K:5:15:20:3:8:12:-5:10 R:P:9:150:5:69 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 @@ -1388,7 +1372,6 @@ R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 -R:M:255:70:72:6:100:25:66:4:100:20 R:E:1:1:1:2:1:1 R:Z:grow trees R:G:NO_STUN | NO_FOOD | @@ -1419,7 +1402,6 @@ R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 R:K:10:5:5:-8:1:1:5:5 R:P:10:220:0:84 -R:M:20:3:60:3:80:4:54:3:70:4 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 @@ -1459,7 +1441,6 @@ R:D:They have been given many gifts from their master. R:S:6:2:1:-2:3:6:4 R:K:6:0:10:-16:30:10:0:0 R:P:12:300:5:89 -R:M:14:6:180:6:255:25:150:4:230:20 R:E:0:1:0:4:1:1 R:R:1:0 R:F:FEATHER | FLY @@ -1497,8 +1478,6 @@ R:D:They cannot play instruments or wield weapons. R:S:3:2:2:-2:2:-5:-2 R:K:5:5:5:-10:5:5:5:-20 R:P:9:250:5:100 -R:M:50:150:200:-200:80:120:54:-50:100:60 -# R:E:weapons:torso:arms:finger:head:legs R:E:0:1:0:6:1:1 R:R:1:0 R:k:=0:=0:Weaponmastery @@ -1518,7 +1497,6 @@ R:D:The weakest of all the races, bad at everything except gaining levels quickl R:S:-5:-5:-5:-5:-5:-5:-5 R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 -R:M:10:4:40:5:50:10:35:4:45:10 R:E:1:1:1:2:1:1 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist R:k:-500:+000:Disarming @@ -1538,7 +1516,6 @@ R:D:They are more dangerous but less wise than High Elves. R:S:2:2:-3:5:0:1:0 R:K:5:6:6:5:8:12:-5:40 R:P:7:130:4:5 -R:M:75:75:60:4:100:6:54:4:80:6 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW | R:R:1:1 @@ -1563,7 +1540,6 @@ R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:91 -R:M:14:6:72:6:180:25:66:4:150:20 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:20:0 @@ -1603,7 +1579,6 @@ R:D:Fanatical warriors, they do not trust magic. R:S:2:-2:-2:-2:2:-1:-1 R:K:0:-5:-1:0:0:10:5:5 R:P:10:140:0:105 -R:M:14:6:72:6:180:25:66:4:150:20 R:E:1:1:1:2:1:1 R:C:Warrior | Archer R:G:XTRA_MIGHT_XBOW | NO_STUN @@ -1637,7 +1612,6 @@ R:S:0:0:0:0:0:-1:0 # Again, here everything depends on subrace R:K:0:0:0:0:0:0:0:0 R:P:10:170:3:109 -R:M:14:6:72:6:180:25:66:4:150:20 # Everything at zero here, depends on type of demon. R:E:0:0:0:0:0:0 R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster @@ -1662,7 +1636,6 @@ R:k:+000:+000:Archery # S:S:str:int:wis:dex:con:chr:luck:mana # S:K:dis:dev:sav:stl:srh:fos:thn:thb # S:P:hitdie:xp%:infra -# S:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt # S:E:weapons:torso:arms:finger:head:legs # S:A:allowed races # S:C:'A'llow/'F'orbid:allowed/forbiden classes @@ -1680,7 +1653,6 @@ S:D:A:A normal member of the race. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | @@ -1695,7 +1667,6 @@ S:D:B:sunlight and cannot easily satiate their hunger. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Hobbit | Gnome | Dwarf | Orc | S:A:Troll | Dunadan | Half-Ogre | Beorning | Druadan | Petty-Dwarf | @@ -1710,7 +1681,6 @@ S:D:B:pass through walls. They are somewhat physically weak. S:S:-5:1:1:2:-3:-6:-3:105 S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 -S:M:50:15:0:0:-10:-5:0:0:-10:-5 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | @@ -1735,7 +1705,6 @@ S:D:B:to sharp things. S:S:0:-2:-2:0:1:-4:-3:70 S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 -S:M:50:15:0:0:-10:-5:0:0:-10:-5 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | @@ -1760,7 +1729,6 @@ S:D:B:Strong and dumb is a zombie. S:S:2:-6:-6:1:4:-5:-4:70 S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 -S:M:50:15:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | @@ -1786,7 +1754,6 @@ S:D:A:Hardy members of their race, they are strong fighters but poor spellcaster S:S:2:-3:-2:1:1:-3:1:50 S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Dwarf | Orc | Troll | Half-Ogre | Beorning | Druadan | Easterling S:C:F:Mage @@ -1806,7 +1773,6 @@ S:D:A:reserves but at the cost of an increased physical weakness. S:S:-3:1:1:-3:-3:1:0:120 S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | S:A:Dunadan | High-Elf | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | @@ -1825,7 +1791,6 @@ S:D:A:In some very rare occasions souls can come back from the Halls of Mandos. S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:G:ASTRAL | NO_SUBRACE_CHANGE S:R:1:0 @@ -1841,7 +1806,6 @@ S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 ### Dragon subraces added for Theme @@ -1854,7 +1818,6 @@ S:D:B:dragons and can prevent attacks from sapping their strength. S:S:3:0:0:0:0:0:0:100 S:K:0:0:0:0:-2:2:5:0 S:P:0:0:1 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Warrior | Archer @@ -1888,7 +1851,6 @@ S:D:B:beautiful than other dragons and are expert at protecting that. S:S:0:0:0:0:0:3:0:100 S:K:2:0:1:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Archer | Warrior @@ -1922,7 +1884,6 @@ S:D:B:than other dragons and are not as susceptible to diseases. S:S:0:0:0:0:3:0:0:100 S:K:0:0:2:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Archer | Warrior @@ -1953,7 +1914,6 @@ S:D:B:is not sapped easily. S:S:0:0:0:3:0:0:0:100 S:K:3:0:0:2:1:0:0:0 S:P:0:0:1 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Archer | Warrior @@ -1986,7 +1946,6 @@ S:D:B:and attacks against their intelligence are unlikely to succeed. S:S:0:3:0:0:0:0:0:100 S:K:0:2:0:0:0:0:0:0 S:P:0:0:0 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Archer | Warrior @@ -2020,7 +1979,6 @@ S:D:B:very effective against them. S:S:0:0:3:0:0:0:0:100 S:K:0:0:1:5:2:2:0:0 S:P:0:0:3 -S:M:0:0:0:0:0:0:0:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon S:C:F:Archer | Warrior @@ -2054,7 +2012,6 @@ S:D:A:but sly, cunning, and agile. S:S:-1:1:1:1:-1:-2:0:100 S:K:2:0:1:2:2:20:0:0 S:P:1:20:1 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest @@ -2087,7 +2044,6 @@ S:D:A:so that they believe they'd never seen anything so beautiful. S:S:-2:0:0:0:0:+3:0:100 S:K:0:0:1:-2:0:10:0:0 S:P:1:0:1 -S:M:14:6:72:6:180:25:66:4:150:20 # R:E:weapons:torso:arms:finger:head:legs S:E:0:1:2:4:1:1 S:A:Demon @@ -2117,7 +2073,6 @@ S:D:A:increases with experience. S:S:-1:0:0:0:-1:0:0:100 S:K:2:0:2:0:5:30:0:0 S:P:0:-10:2 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest @@ -2157,7 +2112,6 @@ S:S:2:-1:-2:-2:2:-1:0:100 # S:K:dis:dev:sav:stl:srh:fos:thn:thb S:K:-1:0:0:-8:-2:-10:5:0 S:P:2:20:0 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest | Mage @@ -2191,7 +2145,6 @@ S:S:-1:2:1:0:0:-3:0:100 # S:K:dis:dev:sav:stl:srh:fos:thn:thb S:K:0:0:1:-10:2:10:0:0 S:P:2:10:0 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Archer | Priest @@ -2222,7 +2175,6 @@ S:D:A:unstealthy. S:S:1:1:1:1:1:-1:0:100 S:K:2:0:2:-20:5:30:0:0 S:P:0:-20:2 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest @@ -2268,7 +2220,6 @@ S:D:A:abilities, stealth, and cunning are legendary. S:S:-3:5:5:5:-1:-6:0:200 S:K:5:5:5:10:5:50:0:0 S:P:2:40:3 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:0:1:0:1:1:0 S:A:Demon S:C:F:Warrior | Archer | Priest | Rogue @@ -2330,7 +2281,6 @@ S:S:-2:1:1:3:-1:-1:2:150 # S:K:dis:dev:sav:stl:srh:fos:thn:thb S:K:2:2:2:2:2:30:0:0 S:P:1:50:2 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest @@ -2358,7 +2308,6 @@ S:D:A:encounter them and are afraid of nothing. S:S:2:1:1:-1:2:1:1:100 S:K:0:0:4:-3:0:10:10:10 S:P:2:30:0 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest | Mage @@ -2386,7 +2335,6 @@ S:D:A:forms of true Balrogs. S:S:1:1:1:1:1:1:0:150 S:K:1:1:1:1:1:20:15:10 S:P:3:50:2 -S:M:14:6:72:6:180:25:66:4:150:20 S:E:1:1:1:2:1:1 S:A:Demon S:C:F:Priest | Loremaster | Rogue diff --git a/lib/mods/theme/edit/tr_info.txt b/lib/mods/theme/edit/tr_info.txt index 7f9e4df9..7a5eb3b7 100644 --- a/lib/mods/theme/edit/tr_info.txt +++ b/lib/mods/theme/edit/tr_info.txt @@ -679,41 +679,6 @@ I:8:50:0:8:20:0d0:y D:A sudden sound startles you and you drop everything! F:FLOOR | CHEST | DOOR -#-SC- -N:150:Trap of Femininity -I:4:30:5:0:10:2d8:r -D:You feel like a new woman! -F:FLOOR | CHEST | DOOR - -N:151:Trap of Masculinity -I:4:30:5:0:10:2d8:r -D:You feel like a new man! -F:FLOOR | CHEST | DOOR - -N:152:Trap of Neutrality -I:4:30:5:0:10:2d8:r -D:You feel like a new woman... erm, a new man... er, WHAT did you say??? -F:FLOOR | CHEST | DOOR - -N:153:Trap of Aging -I:5:50:5:0:15:1d8:r -D:You suddenly age very fast! -F:CHEST | DOOR - -N:154:Trap of Growing -I:3:75:5:0:5:1d8:r -D:You begin to grow! -F:FLOOR | CHEST | DOOR - -N:155:Trap of Shrinking -I:3:75:5:0:5:1d8:r -D:You begin to shrink! -F:FLOOR | CHEST | DOOR - -#N:156: UNUSED - -#N:157: UNUSED - N:158:Trap of Divine Anger I:6:100:5:0:15:0d0:G D:A voice booms out "Have a care, mortal!" diff --git a/lib/mods/theme/pref/trap-xxx.prf b/lib/mods/theme/pref/trap-xxx.prf index f4d699a0..7fb0c9c8 100644 --- a/lib/mods/theme/pref/trap-xxx.prf +++ b/lib/mods/theme/pref/trap-xxx.prf @@ -352,15 +352,6 @@ G:T:141:0xA2:0x92 # Trap of Drop Everything G:T:142:0xA2:0x92 -# Trap of Femininity -G:T:150:0xA2:0x8B - -# Trap of Masculinity -G:T:151:0xA2:0x8B - -# Trap of Neutrality -G:T:152:0xA2:0x8B - # Trap of Aging G:T:153:0xA2:0x8B diff --git a/lib/pref/trap-xxx.prf b/lib/pref/trap-xxx.prf index f4d699a0..7fb0c9c8 100644 --- a/lib/pref/trap-xxx.prf +++ b/lib/pref/trap-xxx.prf @@ -352,15 +352,6 @@ G:T:141:0xA2:0x92 # Trap of Drop Everything G:T:142:0xA2:0x92 -# Trap of Femininity -G:T:150:0xA2:0x8B - -# Trap of Masculinity -G:T:151:0xA2:0x8B - -# Trap of Neutrality -G:T:152:0xA2:0x8B - # Trap of Aging G:T:153:0xA2:0x8B diff --git a/src/birth.cc b/src/birth.cc index f8b81e35..4c9ff06a 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -204,7 +204,6 @@ static void save_prev_data(void) /*** Save the current data ***/ /* Save the data */ - previous_char.sex = p_ptr->psex; previous_char.race = p_ptr->prace; previous_char.rmod = p_ptr->pracem; previous_char.pclass = p_ptr->pclass; @@ -215,10 +214,6 @@ static void save_prev_data(void) previous_char.god = p_ptr->pgod; previous_char.grace = p_ptr->grace; - previous_char.age = p_ptr->age; - previous_char.wt = p_ptr->wt; - previous_char.ht = p_ptr->ht; - previous_char.sc = p_ptr->sc; previous_char.au = p_ptr->au; /* Save the stats */ @@ -249,10 +244,6 @@ static void load_prev_data(bool_ save) /*** Save the current data ***/ /* Save the data */ - temp.age = p_ptr->age; - temp.wt = p_ptr->wt; - temp.ht = p_ptr->ht; - temp.sc = p_ptr->sc; temp.au = p_ptr->au; /* Save the stats */ @@ -272,10 +263,6 @@ static void load_prev_data(bool_ save) /*** Load the previous data ***/ /* Load the data */ - p_ptr->age = previous_char.age; - p_ptr->wt = previous_char.wt; - p_ptr->ht = previous_char.ht; - p_ptr->sc = previous_char.sc; p_ptr->au = previous_char.au; /* Load the stats */ @@ -298,10 +285,6 @@ static void load_prev_data(bool_ save) if (!save) return; /* Save the data */ - previous_char.age = temp.age; - previous_char.wt = temp.wt; - previous_char.ht = temp.ht; - previous_char.sc = temp.sc; previous_char.au = temp.au; /* Save the stats */ @@ -518,7 +501,7 @@ static void get_extra(void) */ static void get_history(void) { - int i, n, chart, roll, social_class; + int i, n, chart, roll; char *s, *t; @@ -531,9 +514,6 @@ static void get_history(void) /* Clear the history text */ buf[0] = '\0'; - /* Initial social class */ - social_class = randint(4); - /* Starting place */ chart = rp_ptr->chart; @@ -553,23 +533,10 @@ static void get_history(void) /* Acquire the textual history */ (void)strcat(buf, bg[i].info); - /* Add in the social class */ - social_class += (int)(bg[i].bonus) - 50; - /* Enter the next chart */ chart = bg[i].next; } - - - /* Verify social class */ - if (social_class > 100) social_class = 100; - else if (social_class < 1) social_class = 1; - - /* Save the social class */ - p_ptr->sc = social_class; - - /* Skip leading spaces */ for (s = buf; *s == ' '; s++) /* loop */; @@ -655,89 +622,17 @@ static errr init_randart(void) } -/* - * A helper function for get_ahw(), also called by polymorph code - */ -void get_height_weight(void) -{ - int h_mean, h_stddev; - - int w_mean, w_stddev; - - - /* Extract mean and standard deviation -- Male */ - if (p_ptr->psex == SEX_MALE) - { - h_mean = rp_ptr->m_b_ht + rmp_ptr->m_b_ht; - h_stddev = rp_ptr->m_m_ht + rmp_ptr->m_m_ht; - - w_mean = rp_ptr->m_b_wt + rmp_ptr->m_b_wt; - w_stddev = rp_ptr->m_m_wt + rmp_ptr->m_m_wt; - } - - /* Female */ - else if (p_ptr->psex == SEX_FEMALE) - { - h_mean = rp_ptr->f_b_ht + rmp_ptr->f_b_ht; - h_stddev = rp_ptr->f_m_ht + rmp_ptr->f_m_ht; - - w_mean = rp_ptr->f_b_wt + rmp_ptr->f_b_wt; - w_stddev = rp_ptr->f_m_wt + rmp_ptr->f_m_wt; - } - - /* Neuter XXX */ - else - { - h_mean = (rp_ptr->m_b_ht + rmp_ptr->m_b_ht + - rp_ptr->f_b_ht + rmp_ptr->f_b_ht) / 2, - h_stddev = (rp_ptr->m_m_ht + rmp_ptr->m_m_ht + - rp_ptr->f_m_ht + rmp_ptr->f_m_ht) / 2; - - w_mean = (rp_ptr->m_b_wt + rmp_ptr->m_b_wt + - rp_ptr->f_b_wt + rmp_ptr->f_b_wt) / 2, - w_stddev = (rp_ptr->m_m_wt + rmp_ptr->m_m_wt + - rp_ptr->f_m_wt + rmp_ptr->f_m_wt) / 2; - } - - /* Calculate height/weight */ - p_ptr->ht = randnor(h_mean, h_stddev); - p_ptr->wt = randnor(w_mean, w_stddev); - - /* Weight/height shouldn't be negative */ - if (p_ptr->ht < 1) p_ptr->ht = 1; - if (p_ptr->wt < 1) p_ptr->wt = 1; -} - - -/* - * Computes character's age, height, and weight - */ -static void get_ahw(void) -{ - /* Calculate the age */ - p_ptr->age = rp_ptr->b_age + rmp_ptr->b_age + - randint(rp_ptr->m_age + rmp_ptr->m_age); - - /* Calculate the height/weight */ - get_height_weight(); -} - - - /* * Get the player's starting money */ static void get_money(void) { - int i, gold; - - - /* Social Class determines starting gold */ - gold = (p_ptr->sc * 6) + randint(100) + 300; + /* Starting gold */ + int gold = randint(100) + 300; /* Process the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { /* Mega-Hack -- reduce gold for high stats */ if (stat_use[i] >= 18 + 50) gold -= 300; @@ -1583,11 +1478,13 @@ static bool_ player_birth_aux_ask() char c; - char p2 = ')'; - char buf[200]; char inp[200]; + int const NAME_ROW = 2; + int const RACE_ROW = 3; + int const CLASS_ROW = 4; + s16b *class_types; /*** Intro ***/ @@ -1596,14 +1493,12 @@ static bool_ player_birth_aux_ask() Term_clear(); /* Title everything */ - put_str("Name :", 2, 1); - put_str("Sex :", 3, 1); - put_str("Race :", 4, 1); - put_str("Class :", 5, 1); + put_str("Name :", NAME_ROW, 1); + c_put_str(TERM_L_BLUE, player_name, NAME_ROW, 9); - /* Dump the default name */ - c_put_str(TERM_L_BLUE, player_name, 2, 9); + put_str("Race :", RACE_ROW, 1); + put_str("Class :", CLASS_ROW, 1); /*** Instructions ***/ @@ -1649,63 +1544,6 @@ static bool_ player_birth_aux_ask() /* Clean up */ clear_from(15); - /*** Player sex ***/ - - if (do_quick_start) - { - k = previous_char.sex; - } - else - { - /* Extra info */ - Term_putstr(5, 15, -1, TERM_WHITE, - "Your 'sex' does not have any significant gameplay effects."); - - /* Prompt for "Sex" */ - for (n = 0; n < MAX_SEXES; n++) - { - /* Analyze */ - p_ptr->psex = n; - sp_ptr = &sex_info[p_ptr->psex]; - - /* Display */ - strnfmt(buf, 200, "%c%c %s", I2A(n), p2, sp_ptr->title); - put_str(buf, 21 + (n / 5), 2 + 15 * (n % 5)); - } - - /* Choose */ - while (1) - { - strnfmt(buf, 200, "Choose a sex (%c-%c), * for random, = for options: ", I2A(0), I2A(n - 1)); - put_str(buf, 20, 2); - c = inkey(); - if (c == 'Q') quit(NULL); - if (c == 'S') return (FALSE); - if (c == '*') - { - k = rand_int(MAX_SEXES); - break; - } - k = (islower(c) ? A2I(c) : -1); - if ((k >= 0) && (k < n)) break; - if (c == '?') do_cmd_help(); - else if (c == '=') - { - screen_save(); - do_cmd_options_aux(6, "Startup Options", FALSE); - screen_load(); - } - else bell(); - } - } - - /* Set sex */ - p_ptr->psex = k; - sp_ptr = &sex_info[p_ptr->psex]; - - /* Display */ - c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9); - /* Clean up */ clear_from(15); @@ -1798,13 +1636,13 @@ static bool_ player_birth_aux_ask() rp_ptr = &race_info[p_ptr->prace]; /* Display */ - c_put_str(TERM_L_BLUE, rp_ptr->title, 4, 9); + c_put_str(TERM_L_BLUE, rp_ptr->title, RACE_ROW, 9); /* Get a random name */ if (!do_quick_start) create_random_name(p_ptr->prace, player_name); /* Display */ - c_put_str(TERM_L_BLUE, player_name, 2, 9); + c_put_str(TERM_L_BLUE, player_name, NAME_ROW, 9); /* Clean up */ clear_from(12); @@ -1927,7 +1765,7 @@ static bool_ player_birth_aux_ask() /* Display */ auto const race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); - c_put_str(TERM_L_BLUE, race_name.c_str(), 4, 9); + c_put_str(TERM_L_BLUE, race_name.c_str(), RACE_ROW, 9); } } @@ -2152,7 +1990,7 @@ static bool_ player_birth_aux_ask() spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; /* Display */ - c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9); + c_put_str(TERM_L_BLUE, spp_ptr->title, CLASS_ROW, 9); /* Clean up */ clear_from(15); @@ -2485,9 +2323,6 @@ static bool_ player_birth_aux_point(void) /* Roll for base hitpoints */ get_extra(); - /* Roll for age/height/weight */ - get_ahw(); - /* Roll for social class */ get_history(); @@ -2739,15 +2574,14 @@ static bool_ player_birth_aux_auto() Term_clear(); put_str("Name :", 2, 1); - put_str("Sex :", 3, 1); - put_str("Race :", 4, 1); - put_str("Class:", 5, 1); - c_put_str(TERM_L_BLUE, player_name, 2, 9); - c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9); + + put_str("Race :", 3, 1); auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); - c_put_str(TERM_L_BLUE, player_race_name.c_str(), 4, 9); - c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9); + c_put_str(TERM_L_BLUE, player_race_name.c_str(), 3, 9); + + put_str("Class:", 4, 1); + c_put_str(TERM_L_BLUE, spp_ptr->title, 4, 9); /* Label stats */ put_str("STR:", 2 + A_STR, 61); @@ -2839,9 +2673,6 @@ static bool_ player_birth_aux_auto() /* Roll for base hitpoints */ get_extra(); - /* Roll for age/height/weight */ - get_ahw(); - /* Roll for social class */ get_history(); diff --git a/src/birth.hpp b/src/birth.hpp index dd5ff850..af361499 100644 --- a/src/birth.hpp +++ b/src/birth.hpp @@ -5,6 +5,5 @@ extern void print_desc_aux(cptr txt, int y, int x); extern void save_savefile_names(void); extern bool_ begin_screen(void); -extern void get_height_weight(void); extern void player_birth(void); extern bool_ no_begin_screen; diff --git a/src/birther.hpp b/src/birther.hpp index f517fb9d..566bcb42 100644 --- a/src/birther.hpp +++ b/src/birther.hpp @@ -7,7 +7,6 @@ */ struct birther { - s16b sex; s16b race; s16b rmod; s16b pclass; @@ -19,11 +18,6 @@ struct birther s32b grace; s32b god_favor; - s16b age; - s16b wt; - s16b ht; - s16b sc; - s32b au; s16b stat[6]; diff --git a/src/cmd5.cc b/src/cmd5.cc index a1dd5cbf..9870f116 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -298,25 +298,6 @@ void do_poly_self(void) /* Some form of racial polymorph... */ power -= 10; - if ((power > rand_int(5)) && (rand_int(4) == 0)) - { - /* sex change */ - power -= 2; - - if (p_ptr->psex == SEX_MALE) - { - p_ptr->psex = SEX_FEMALE; - sp_ptr = &sex_info[p_ptr->psex]; - strcpy(effect_msg, "female"); - } - else - { - p_ptr->psex = SEX_MALE; - sp_ptr = &sex_info[p_ptr->psex]; - strcpy(effect_msg, "male"); - } - } - if ((power > rand_int(30)) && (rand_int(5) == 0)) { int tmp = 0; @@ -398,10 +379,7 @@ void do_poly_self(void) /* Experience factor */ p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp; - /* Calculate the height/weight */ - get_height_weight(); - - + /* Level up if necessary */ check_experience(); p_ptr->max_plv = p_ptr->lev; diff --git a/src/defines.h b/src/defines.h index b722d29a..5309023f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -130,11 +130,6 @@ #define STORE_GENERAL 0 #define STORE_HOME 7 -/* - * Maximum number of player "sex" types (see "table.c", etc) - */ -#define MAX_SEXES 3 - /* Number of Random Artifacts */ #define MAX_RANDARTS 84 #define MAX_T_ACT 51 @@ -383,14 +378,6 @@ #define MAX_STACK_SIZE 100 -/* - * Player sex constants (hard-coded by save-files, arrays, etc) - */ -#define SEX_FEMALE 0 -#define SEX_MALE 1 -#define SEX_NEUTER 2 - - /* Race flags */ #define PR1_EXPERIMENTAL 0x00000001L /* Is still under developemnt */ /* XXX */ @@ -2234,15 +2221,8 @@ #define TRAP_OF_DROP_ALL_ITEMS 141 #define TRAP_OF_DROP_EVERYTHING 142 -/* -SC- */ -#define TRAP_OF_FEMINITY 150 -#define TRAP_OF_MASCULINITY 151 -#define TRAP_OF_NEUTRALITY 152 -#define TRAP_OF_AGING 153 -#define TRAP_OF_GROWING 154 -#define TRAP_OF_SHRINKING 155 #define TRAP_OF_ELDRITCH_HORROR 156 -/* XXX */ + #define TRAP_OF_DIVINE_ANGER 158 #define TRAP_OF_DIVINE_WRATH 159 #define TRAP_OF_HALLUCINATION 160 diff --git a/src/dungeon.cc b/src/dungeon.cc index 41aa6bf6..bf14926e 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -5460,12 +5460,6 @@ void play_game() { cheat_death = TRUE; - /* Mark social class, reset age, if needed */ - if (p_ptr->sc) p_ptr->sc = p_ptr->age = 0; - - /* Increase age */ - p_ptr->age++; - /* Mark savefile */ noscore |= 0x0001; msg_print("You invoke wizard mode and cheat death."); diff --git a/src/files.cc b/src/files.cc index be1e208a..576b8143 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2190,41 +2190,20 @@ void display_player(int mode) /* Name, Sex, Race, Class */ put_str("Name :", 2, 1); - put_str("Sex :", 3, 1); - put_str("Race :", 4, 1); - put_str("Class :", 5, 1); - put_str("Body :", 6, 1); - put_str("God :", 7, 1); c_put_str(TERM_L_BLUE, player_name, 2, 9); - if (p_ptr->body_monster != 0) - { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; - char tmp[12]; - - if ((r_ptr->flags1 & RF1_MALE) != 0) - strcpy(tmp, "Male"); - else if ((r_ptr->flags1 & RF1_FEMALE) != 0) - strcpy(tmp, "Female"); - else - strcpy(tmp, "Neuter"); - c_put_str(TERM_L_BLUE, tmp, 3, 9); - } - else - { - c_put_str(TERM_L_BLUE, sp_ptr->title, 3, 9); - } + put_str("Race :", 3, 1); auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); - c_put_str(TERM_L_BLUE, player_race_name.c_str(), 4, 9); - c_put_str(TERM_L_BLUE, spp_ptr->title, 5, 9); - c_put_str(TERM_L_BLUE, r_ptr->name, 6, 9); - c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 7, 9); + c_put_str(TERM_L_BLUE, player_race_name.c_str(), 3, 9); + + put_str("Class :", 4, 1); + c_put_str(TERM_L_BLUE, spp_ptr->title, 4, 9); + + put_str("Body :", 5, 1); + c_put_str(TERM_L_BLUE, r_ptr->name, 5, 9); - /* Age, Height, Weight, Social */ - prt_num("Age ", (int)p_ptr->age + bst(YEAR, turn), 2, 32, TERM_L_BLUE, " "); - prt_num("Height ", (int)p_ptr->ht, 3, 32, TERM_L_BLUE, " "); - prt_num("Weight ", (int)p_ptr->wt, 4, 32, TERM_L_BLUE, " "); - prt_num("Social Class ", (int)p_ptr->sc, 5, 32, TERM_L_BLUE, " "); + put_str("God :", 6, 1); + c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 6, 9); /* Display the stats */ for (i = 0; i < 6; i++) @@ -4858,7 +4837,6 @@ static errr top_twenty(void) sprintf(the_score.who, "%-.15s", player_name); /* Save the player info XXX XXX XXX */ - sprintf(the_score.sex, "%c", (p_ptr->psex ? 'm' : 'f')); sprintf(the_score.p_r, "%2d", p_ptr->prace); sprintf(the_score.p_s, "%2d", p_ptr->pracem); sprintf(the_score.p_c, "%2d", p_ptr->pclass); @@ -4959,7 +4937,6 @@ static errr predict_score(void) sprintf(the_score.who, "%-.15s", player_name); /* Save the player info XXX XXX XXX */ - sprintf(the_score.sex, "%c", (p_ptr->psex ? 'm' : 'f')); sprintf(the_score.p_r, "%2d", p_ptr->prace); sprintf(the_score.p_s, "%2d", p_ptr->pracem); sprintf(the_score.p_c, "%2d", p_ptr->pclass); @@ -5106,7 +5083,7 @@ static void kingly(void) /* Display a message */ put_str("Veni, Vidi, Vici!", 15, 26); put_str("I came, I saw, I conquered!", 16, 21); - put_str(format("All Hail the Mighty %s!", sp_ptr->winner), 17, 22); + put_str(format("All Hail the Mighty %s!", player_name), 17, 22); /* Flush input */ flush(); diff --git a/src/hiscore.hpp b/src/hiscore.hpp index 0b1b713d..990c91aa 100644 --- a/src/hiscore.hpp +++ b/src/hiscore.hpp @@ -36,7 +36,6 @@ struct high_score char unused_1[8]; /* Kept for compatibility only */ - char sex[2]; /* Player Sex (string) */ char p_r[3]; /* Player Race (number) */ char p_s[3]; /* Player Subrace (number) */ char p_c[3]; /* Player Class (number) */ diff --git a/src/init1.cc b/src/init1.cc index 9d221c01..31e8c55a 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2026,30 +2026,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'M' for "Mods" */ - if ((buf[0] == 'R') && (buf[2] == 'M')) - { - int s[10]; - - /* Scan for the values */ - if (10 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9])) return (1); - - rp_ptr->b_age = s[0]; - rp_ptr->m_age = s[1]; - rp_ptr->m_b_ht = s[2]; - rp_ptr->m_m_ht = s[3]; - rp_ptr->m_b_wt = s[4]; - rp_ptr->m_m_wt = s[5]; - rp_ptr->f_b_ht = s[6]; - rp_ptr->f_m_ht = s[7]; - rp_ptr->f_b_wt = s[8]; - rp_ptr->f_m_wt = s[9]; - - /* Next... */ - continue; - } - /* Process 'P' for "xtra" */ if ((buf[0] == 'R') && (buf[2] == 'P')) { @@ -2392,30 +2368,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'M' for "Mods" */ - if ((buf[0] == 'S') && (buf[2] == 'M')) - { - int s[10]; - - /* Scan for the values */ - if (10 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9])) return (1); - - rmp_ptr->b_age = s[0]; - rmp_ptr->m_age = s[1]; - rmp_ptr->m_b_ht = s[2]; - rmp_ptr->m_m_ht = s[3]; - rmp_ptr->m_b_wt = s[4]; - rmp_ptr->m_m_wt = s[5]; - rmp_ptr->f_b_ht = s[6]; - rmp_ptr->f_m_ht = s[7]; - rmp_ptr->f_b_wt = s[8]; - rmp_ptr->f_m_wt = s[9]; - - /* Next... */ - continue; - } - /* Process 'P' for "xtra" */ if ((buf[0] == 'S') && (buf[2] == 'P')) { diff --git a/src/loadsave.cc b/src/loadsave.cc index 4c313901..d358e271 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -259,7 +259,6 @@ static void do_quick_start(ls_flag_t flag) u32b tmp32u; int i; - do_s16b(&previous_char.sex, flag); do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); do_s16b(&previous_char.pclass, flag); @@ -267,10 +266,6 @@ static void do_quick_start(ls_flag_t flag) do_byte(&previous_char.quests, flag); do_byte(&previous_char.god, flag); do_s32b(&previous_char.grace, flag); - do_s16b(&previous_char.age, flag); - do_s16b(&previous_char.wt, flag); - do_s16b(&previous_char.ht, flag); - do_s16b(&previous_char.sc, flag); do_s32b(&previous_char.au, flag); for (i = 0; i < 6; i++) do_s16b(&(previous_char.stat[i]), flag); @@ -334,19 +329,6 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->r_mhp, flag); do_s16b(&sr_ptr->r_exp, flag); - do_byte((byte*)&sr_ptr->b_age, flag); - do_byte((byte*)&sr_ptr->m_age, flag); - - do_byte((byte*)&sr_ptr->m_b_ht, flag); - do_byte((byte*)&sr_ptr->m_m_ht, flag); - do_byte((byte*)&sr_ptr->f_b_ht, flag); - do_byte((byte*)&sr_ptr->f_m_ht, flag); - - do_byte((byte*)&sr_ptr->m_b_wt, flag); - do_byte((byte*)&sr_ptr->m_m_wt, flag); - do_byte((byte*)&sr_ptr->f_b_wt, flag); - do_byte((byte*)&sr_ptr->f_m_wt, flag); - do_byte((byte*)&sr_ptr->infra, flag); for (i = 0; i < 4; i++) @@ -513,7 +495,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->pracem, flag); do_byte(&p_ptr->pclass, flag); do_byte(&p_ptr->pspec, flag); - do_byte(&p_ptr->psex, flag); do_u16b(&tmp16b, flag); do_u16b(&tmp16b, flag); do_byte(&p_ptr->mimic_form, flag); @@ -523,10 +504,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->hitdie, flag); do_u16b(&p_ptr->expfact, flag); - do_s16b(&p_ptr->age, flag); - do_s16b(&p_ptr->ht, flag); - do_s16b(&p_ptr->wt, flag); - /* Dump the stats (maximum and current) */ for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); @@ -696,7 +673,6 @@ static bool_ do_extra(ls_flag_t flag) /* More info */ tmp16s = 0; - do_s16b(&p_ptr->sc, flag); do_s16b(&p_ptr->blind, flag); do_s16b(&p_ptr->paralyzed, flag); do_s16b(&p_ptr->confused, flag); @@ -2261,7 +2237,6 @@ static void junkinit(void) static void morejunk(void) { - sp_ptr = &sex_info[p_ptr->psex]; /* Sex */ rp_ptr = &race_info[p_ptr->prace]; /* Raceclass */ rmp_ptr = &race_mod_info[p_ptr->pracem]; cp_ptr = &class_info[p_ptr->pclass]; diff --git a/src/player_race.hpp b/src/player_race.hpp index edb304f2..3be39bdf 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -29,19 +29,6 @@ struct player_race byte r_mhp; /* Race hit-dice modifier */ u16b r_exp; /* Race experience factor */ - byte b_age; /* base age */ - byte m_age; /* mod age */ - - byte m_b_ht; /* base height (males) */ - byte m_m_ht; /* mod height (males) */ - byte m_b_wt; /* base weight (males) */ - byte m_m_wt; /* mod weight (males) */ - - byte f_b_ht; /* base height (females) */ - byte f_m_ht; /* mod height (females) */ - byte f_b_wt; /* base weight (females) */ - byte f_m_wt; /* mod weight (females) */ - byte infra; /* Infra-vision range */ u32b choice[2]; /* Legal class choices */ diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index ed48356e..9f21b253 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -29,19 +29,6 @@ struct player_race_mod char r_mhp; /* (+) Race mod hit-dice modifier */ s16b r_exp; /* (+) Race mod experience factor */ - char b_age; /* (+) base age */ - char m_age; /* (+) mod age */ - - char m_b_ht; /* (+) base height (males) */ - char m_m_ht; /* (+) mod height (males) */ - char m_b_wt; /* (+) base weight (males) */ - char m_m_wt; /* (+) mod weight (males) */ - - char f_b_ht; /* (+) base height (females) */ - char f_m_ht; /* (+) mod height (females) */ - char f_b_wt; /* (+) base weight (females) */ - char f_m_wt; /* (+) mod weight (females) */ - char infra; /* (+) Infra-vision range */ u32b choice[2]; /* Legal race choices */ diff --git a/src/player_sex.hpp b/src/player_sex.hpp deleted file mode 100644 index 5722f1a4..00000000 --- a/src/player_sex.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -/** - * Player sex descriptor. - */ -struct player_sex -{ - /** - * Type of sex. - */ - char const *title; - - /** - * Winner title. - */ - char const *winner; -}; diff --git a/src/player_sex_fwd.hpp b/src/player_sex_fwd.hpp deleted file mode 100644 index eabea488..00000000 --- a/src/player_sex_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct player_sex; diff --git a/src/player_type.hpp b/src/player_type.hpp index d9410dcb..4caa1e7b 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -32,7 +32,6 @@ struct player_type s16b py; /* Player location */ s16b px; /* Player location */ - byte psex; /* Sex index */ byte prace; /* Race index */ byte pracem; /* Race Mod index */ byte pclass; /* Class index */ @@ -50,12 +49,6 @@ struct player_type byte special; /* Special levels */ byte allow_one_death; /* Blood of life */ - s16b age; /* Characters age */ - s16b ht; /* Height */ - s16b wt; /* Weight */ - s16b sc; /* Social Class */ - - s32b au; /* Current Gold */ s32b max_exp; /* Max experience */ diff --git a/src/q_main.cc b/src/q_main.cc index ed11b9dc..b81ba9b3 100644 --- a/src/q_main.cc +++ b/src/q_main.cc @@ -105,7 +105,7 @@ static bool_ quest_morgoth_dump_hook(void *, void *in_, void *) if (quest[QUEST_MORGOTH].status >= QUEST_STATUS_COMPLETED) { if (quest[QUEST_ONE].status == QUEST_STATUS_FINISHED) - fprintf(f, "\n You saved Arda and became a famed %s.", sp_ptr->winner); + fprintf(f, "\n You saved Arda and became a famed hero."); else fprintf(f, "\n You became a new force of darkness and enslaved all free people."); } diff --git a/src/tables.cc b/src/tables.cc index 09e6c18c..24328ac9 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -1143,29 +1143,6 @@ s32b player_exp[PY_MAX_LEVEL] = }; -/* - * Player Sexes - * - * Title, - * Winner - */ -player_sex sex_info[MAX_SEXES] = -{ - { - "Female", - "Queen" - }, - -{ -"Male", -"King" -}, -{ -"Neuter", -"Ruler" -} -}; - /* * Hack -- the "basic" color names (see "TERM_xxx") */ diff --git a/src/tables.hpp b/src/tables.hpp index 4a3e33d6..aee776bd 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -15,7 +15,6 @@ #include "move_info_type.hpp" #include "option_type.hpp" #include "player_defs.hpp" -#include "player_sex.hpp" #include "power_type.hpp" #include "powers.hpp" #include "quest_type.hpp" @@ -49,7 +48,6 @@ extern byte adj_con_mhp[]; extern byte blows_table[12][12]; extern byte extract_energy[300]; extern s32b player_exp[PY_MAX_LEVEL]; -extern player_sex sex_info[MAX_SEXES]; extern cptr color_names[16]; extern cptr stat_names[6]; extern cptr stat_names_reduced[6]; diff --git a/src/traps.cc b/src/traps.cc index 99428cf9..9c9f2b64 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -460,16 +460,6 @@ static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap) return (ident); } -/* - * This function damages the player by a trap - */ -static void trap_hit(s16b trap) -{ - trap_type *t_ptr = &t_info[trap]; - s16b dam = damroll(t_ptr->dd, t_ptr->ds); - take_hit(dam, t_ptr->name); -} - /* * this function activates one trap type, and returns * a bool_ indicating if this trap is now identified @@ -1823,76 +1813,6 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) ident = player_handle_breath_trap(3, GF_GRAVITY, TRAP_OF_GRAVITY_BALL); break; - /* -SC- */ - case TRAP_OF_FEMINITY: - { - msg_print("Gas sprouts out... you feel yourself transmute."); - p_ptr->psex = SEX_FEMALE; - sp_ptr = &sex_info[p_ptr->psex]; - ident = TRUE; - trap_hit(trap); - break; - } - - case TRAP_OF_MASCULINITY: - { - msg_print("Gas sprouts out... you feel yourself transmute."); - p_ptr->psex = SEX_MALE; - sp_ptr = &sex_info[p_ptr->psex]; - ident = TRUE; - trap_hit(trap); - break; - } - - case TRAP_OF_NEUTRALITY: - { - msg_print("Gas sprouts out... you feel yourself transmute."); - p_ptr->psex = SEX_NEUTER; - sp_ptr = &sex_info[p_ptr->psex]; - ident = TRUE; - trap_hit(trap); - break; - } - - case TRAP_OF_AGING: - { - msg_print("Colors are scintillating around you. " - "You see your past running before your eyes."); - p_ptr->age += randint((rp_ptr->b_age + rmp_ptr->b_age) / 2); - ident = TRUE; - trap_hit(trap); - break; - } - - case TRAP_OF_GROWING: - { - s16b tmp; - - msg_print("Heavy fumes sprout out... you feel yourself transmute."); - if (p_ptr->psex == SEX_FEMALE) tmp = rp_ptr->f_b_ht + rmp_ptr->f_b_ht; - else tmp = rp_ptr->m_b_ht + rmp_ptr->m_b_ht; - - p_ptr->ht += randint(tmp / 4); - ident = TRUE; - trap_hit(trap); - break; - } - - case TRAP_OF_SHRINKING: - { - s16b tmp; - - msg_print("Heavy fumes sprout out... you feel yourself transmute."); - if (p_ptr->psex == SEX_FEMALE) tmp = rp_ptr->f_b_ht + rmp_ptr->f_b_ht; - else tmp = rp_ptr->m_b_ht + rmp_ptr->m_b_ht; - - p_ptr->ht -= randint(tmp / 4); - if (p_ptr->ht <= tmp / 4) p_ptr->ht = tmp / 4; - ident = TRUE; - trap_hit(trap); - break; - } - /* Trap of Divine Anger */ case TRAP_OF_DIVINE_ANGER: { diff --git a/src/variable.cc b/src/variable.cc index f0d18111..98d2c1c0 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -469,7 +469,6 @@ player_type *p_ptr = nullptr; * Pointer to the player tables * (sex, race, race mod, class, magic) */ -player_sex *sp_ptr; player_race *rp_ptr; player_race_mod *rmp_ptr; player_class *cp_ptr; diff --git a/src/variable.hpp b/src/variable.hpp index 877a5597..3723a8fb 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -24,7 +24,6 @@ #include "player_defs.hpp" #include "player_race_fwd.hpp" #include "player_race_mod_fwd.hpp" -#include "player_sex_fwd.hpp" #include "player_spec_fwd.hpp" #include "player_type_fwd.hpp" #include "randart_gen_type_fwd.hpp" @@ -184,7 +183,6 @@ extern byte tval_to_attr[128]; extern char tval_to_char[128]; extern char *keymap_act[KEYMAP_MODES][256]; extern player_type *p_ptr; -extern player_sex *sp_ptr; extern player_race *rp_ptr; extern player_race_mod *rmp_ptr; extern player_class *cp_ptr; -- cgit v1.2.3 From ac4ab3a025f2e90c7a6d754207a25cc968375e58 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Introduce "point" class and use in xtra2 instead of temp_{x,y,n} --- src/point.hpp | 24 ++++++++++++++++ src/xtra2.cc | 90 +++++++++++++++++++++++------------------------------------ 2 files changed, 59 insertions(+), 55 deletions(-) create mode 100644 src/point.hpp diff --git a/src/point.hpp b/src/point.hpp new file mode 100644 index 00000000..c0c12f58 --- /dev/null +++ b/src/point.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +struct point { + +private: + std::uint8_t m_x; + std::uint8_t m_y; + +public: + point(std::uint8_t x, std::uint8_t y) + : m_x(x), m_y(y) { + } + + std::uint8_t x() const { + return m_x; + } + + std::uint8_t y() const { + return m_y; + } + +}; diff --git a/src/xtra2.cc b/src/xtra2.cc index a65ec7db..707005cd 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -37,6 +37,7 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" +#include "point.hpp" #include "quark.hpp" #include "randart.hpp" #include "skill_type.hpp" @@ -3793,40 +3794,35 @@ bool_ target_okay(void) /* * Hack -- help "select" a location (see below) */ -static s16b target_pick(int y1, int x1, int dy, int dx) +static s16b target_pick(point p, int dy, int dx, std::vector const &points) { - int i, v; - - int x2, y2, x3, y3, x4, y4; - int b_i = -1, b_v = 9999; - /* Scan the locations */ - for (i = 0; i < temp_n; i++) + for (std::size_t i = 0; i < points.size(); i++) { /* Point 2 */ - x2 = temp_x[i]; - y2 = temp_y[i]; + int x2 = points[i].x(); + int y2 = points[i].y(); /* Directed distance */ - x3 = (x2 - x1); - y3 = (y2 - y1); + int x3 = (x2 - p.x()); + int y3 = (y2 - p.y()); /* Verify quadrant */ if (dx && (x3 * dx <= 0)) continue; if (dy && (y3 * dy <= 0)) continue; /* Absolute distance */ - x4 = ABS(x3); - y4 = ABS(y3); + int x4 = ABS(x3); + int y4 = ABS(y3); /* Verify quadrant */ if (dy && !dx && (x4 > y4)) continue; if (dx && !dy && (y4 > x4)) continue; /* Approximate Double Distance */ - v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4)); + int v = ((x4 > y4) ? (x4 + x4 + y4) : (y4 + y4 + x4)); /* XXX XXX XXX Penalize location */ @@ -3907,10 +3903,9 @@ static bool_ target_set_accept(int y, int x) * * Return the number of target_able monsters in the set. */ -static void target_set_prepare(int mode) +static std::vector target_set_prepare(int mode) { - // Reset "temp" array - temp_n = 0; + std::vector points; // Scan the current panel for (int y = panel_row_min; y <= panel_row_max; y++) @@ -3926,35 +3921,24 @@ static void target_set_prepare(int mode) if ((mode & (TARGET_KILL)) && !target_able(c_ptr->m_idx)) continue; // Save the location - temp_x[temp_n] = x; - temp_y[temp_n] = y; - temp_n++; + points.push_back(point(x,y)); } } - // Sort the positions by distance to player; we'll + // Sort the points by distance to player; we'll // use a stable sort to avoid equidistant targets - // "swapping" priorities. Note that we're actually - // sorting the _indexes_ of the positions for later - // swap-into-place. - std::size_t temp_i[TEMP_MAX]; - std::iota(temp_i, temp_i + temp_n, 0); - std::stable_sort(temp_i, temp_i + temp_n, [](std::size_t i, std::size_t j) -> bool { - auto di = distance(p_ptr->py, p_ptr->px, temp_y[i], temp_x[i]); - auto dj = distance(p_ptr->py, p_ptr->px, temp_y[j], temp_x[j]); - return di < dj; - }); - - // Swap all the positions into their place. Note that - // we go only up to the middle of the array -- otherwise - // everything would be swapped _back_ into its original - // place. We do not need to care about the middle element - // since it's automatically at the correct position once - // we reach it. - for (s16b i = 0; i < temp_n / 2; i++) { - std::swap(temp_x[temp_i[i]], temp_x[i]); - std::swap(temp_y[temp_i[i]], temp_y[i]); - } + // "swapping" priorities. + std::stable_sort( + std::begin(points), + std::end(points), + [](point i, point j) -> bool { + auto di = distance(p_ptr->py, p_ptr->px, i.y(), i.x()); + auto dj = distance(p_ptr->py, p_ptr->px, j.y(), j.x()); + return di < dj; + } + ); + + return points; } @@ -4498,7 +4482,7 @@ bool_ target_set(int mode) /* Prepare the "temp" array */ - target_set_prepare(mode); + std::vector points = target_set_prepare(mode); /* Start near the player */ m = 0; @@ -4507,10 +4491,10 @@ bool_ target_set(int mode) while (!done) { /* Interesting grids */ - if (flag && temp_n) + if (flag && points.size()) { - y = temp_y[m]; - x = temp_x[m]; + y = points[m].y(); + x = points[m].x(); /* Access */ c_ptr = &cave[y][x]; @@ -4570,7 +4554,7 @@ bool_ target_set(int mode) case '*': case '+': { - if (++m == temp_n) + if (++m == points.size()) { m = 0; } @@ -4581,7 +4565,7 @@ bool_ target_set(int mode) { if (m-- == 0) { - m = temp_n - 1; + m = points.size() - 1; } break; } @@ -4637,7 +4621,7 @@ bool_ target_set(int mode) if (d) { /* Find a new monster */ - i = target_pick(temp_y[m], temp_x[m], ddy[d], ddx[d]); + i = target_pick(points[m], ddy[d], ddx[d], points); /* Scroll to find interesting grid */ if (i < 0) @@ -4651,14 +4635,13 @@ bool_ target_set(int mode) /* Note panel change */ if (change_panel(dy, dx)) { - int ty = temp_y[m]; - int tx = temp_x[m]; + auto const t = points[m]; /* Recalculate interesting grids */ target_set_prepare(mode); /* Find a new monster */ - i = target_pick(ty, tx, dy, dx); + i = target_pick(t, dy, dx, points); /* Restore panel if needed */ if (i < 0) @@ -4810,9 +4793,6 @@ bool_ target_set(int mode) } } - /* Forget */ - temp_n = 0; - /* Clear the top line */ prt("", 0, 0); -- cgit v1.2.3 From 4632374161221b21423b2cf5c88f3bc4e7d7afe6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Use std::vector for vault data --- src/generate.cc | 396 +++++++++++++++++++++++++++-------------------------- src/init1.cc | 2 +- src/init2.cc | 2 +- src/vault_type.hpp | 19 +-- 4 files changed, 213 insertions(+), 206 deletions(-) diff --git a/src/generate.cc b/src/generate.cc index 9fc71763..250686fd 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -3512,264 +3512,270 @@ static void build_type6(int by0, int bx0) /* * Hack -- fill in "vault" rooms */ -static void build_vault(int yval, int xval, int ymax, int xmax, cptr data) +static void build_vault(int yval, int xval, int ymax, int xmax, std::string const &data) { - int dx, dy, x, y, bwy[8], bwx[8], i; - - cptr t; - - cave_type *c_ptr; + int bwy[8], bwx[8]; /* Clean the between gates arrays */ - for (i = 0; i < 8; i++) + for (std::size_t i = 0; i < 8; i++) { bwy[i] = bwx[i] = 9999; } /* Place dungeon features and objects */ - for (t = data, dy = 0; dy < ymax; dy++) { - for (dx = 0; dx < xmax; dx++, t++) + std::size_t t = 0; + for (int dy = 0; dy < ymax; dy++) { - /* Extract the location */ - x = xval - (xmax / 2) + dx; - y = yval - (ymax / 2) + dy; + for (int dx = 0; dx < xmax; dx++, t++) + { + auto d = data[t]; - /* Hack -- skip "non-grids" */ - if (*t == ' ') continue; + /* Hack -- skip "non-grids" */ + if (d == ' ') continue; - /* Access the grid */ - c_ptr = &cave[y][x]; + /* Extract the location */ + int x = xval - (xmax / 2) + dx; + int y = yval - (ymax / 2) + dy; - /* Lay down a floor */ - place_floor(y, x); + /* Access the grid */ + auto c_ptr = &cave[y][x]; - /* Part of a vault */ - c_ptr->info |= (CAVE_ROOM | CAVE_ICKY); + /* Lay down a floor */ + place_floor(y, x); - /* Analyze the grid */ - switch (*t) - { - /* Granite wall (outer) */ - case '%': - { - cave_set_feat(y, x, FEAT_WALL_OUTER); - break; - } + /* Part of a vault */ + c_ptr->info |= (CAVE_ROOM | CAVE_ICKY); - /* Granite wall (inner) */ - case '#': + /* Analyze the grid */ + switch (d) { - cave_set_feat(y, x, FEAT_WALL_INNER); - break; - } + /* Granite wall (outer) */ + case '%': + { + cave_set_feat(y, x, FEAT_WALL_OUTER); + break; + } - /* Permanent wall (inner) */ - case 'X': - { - cave_set_feat(y, x, FEAT_PERM_INNER); - break; - } + /* Granite wall (inner) */ + case '#': + { + cave_set_feat(y, x, FEAT_WALL_INNER); + break; + } - /* Treasure/trap */ - case '*': - { - if (rand_int(100) < 75) + /* Permanent wall (inner) */ + case 'X': { - place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT); + cave_set_feat(y, x, FEAT_PERM_INNER); + break; } - else + + /* Treasure/trap */ + case '*': { - place_trap(y, x); + if (rand_int(100) < 75) + { + place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT); + } + else + { + place_trap(y, x); + } + break; } - break; - } - /* Secret doors */ - case '+': - { - place_secret_door(y, x); - break; - } + /* Secret doors */ + case '+': + { + place_secret_door(y, x); + break; + } - /* Trap */ - case '^': - { - place_trap(y, x); - break; - } + /* Trap */ + case '^': + { + place_trap(y, x); + break; + } - /* Glass wall */ - case 'G': - { - cave_set_feat(y, x, FEAT_GLASS_WALL); - break; - } + /* Glass wall */ + case 'G': + { + cave_set_feat(y, x, FEAT_GLASS_WALL); + break; + } - /* Illusion wall */ - case 'I': - { - cave_set_feat(y, x, FEAT_ILLUS_WALL); - break; + /* Illusion wall */ + case 'I': + { + cave_set_feat(y, x, FEAT_ILLUS_WALL); + break; + } } } } } /* Place dungeon monsters and objects */ - for (t = data, dy = 0; dy < ymax; dy++) { - for (dx = 0; dx < xmax; dx++, t++) + std::size_t t = 0; + for (int dy = 0; dy < ymax; dy++) { - /* Extract the grid */ - x = xval - (xmax / 2) + dx; - y = yval - (ymax / 2) + dy; - - /* Hack -- skip "non-grids" */ - if (*t == ' ') continue; - - /* Access the grid */ - c_ptr = &cave[y][x]; - - /* Analyze the symbol */ - switch (*t) + for (int dx = 0; dx < xmax; dx++, t++) { - /* Monster */ - case '&': - { - monster_level = dun_level + 5; - place_monster(y, x, TRUE, TRUE); - monster_level = dun_level; - break; - } + auto d = data[t]; - /* Meaner monster */ - case '@': - { - monster_level = dun_level + 11; - place_monster(y, x, TRUE, TRUE); - monster_level = dun_level; - break; - } + /* Hack -- skip "non-grids" */ + if (d == ' ') continue; - /* Meaner monster, plus treasure */ - case '9': - { - monster_level = dun_level + 9; - place_monster(y, x, TRUE, TRUE); - monster_level = dun_level; - object_level = dun_level + 7; - place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT); - object_level = dun_level; - break; - } + /* Extract the grid */ + int x = xval - (xmax / 2) + dx; + int y = yval - (ymax / 2) + dy; - /* Nasty monster and treasure */ - case '8': - { - monster_level = dun_level + 40; - place_monster(y, x, TRUE, TRUE); - monster_level = dun_level; - object_level = dun_level + 20; - place_object(y, x, TRUE, TRUE, OBJ_FOUND_VAULT); - object_level = dun_level; - break; - } + /* Access the grid */ + auto c_ptr = &cave[y][x]; - /* Monster and/or object */ - case ',': + /* Analyze the symbol */ + switch (d) { - if (rand_int(100) < 50) + /* Monster */ + case '&': { - monster_level = dun_level + 3; + monster_level = dun_level + 5; place_monster(y, x, TRUE, TRUE); monster_level = dun_level; + break; } - if (rand_int(100) < 50) + + /* Meaner monster */ + case '@': + { + monster_level = dun_level + 11; + place_monster(y, x, TRUE, TRUE); + monster_level = dun_level; + break; + } + + /* Meaner monster, plus treasure */ + case '9': { + monster_level = dun_level + 9; + place_monster(y, x, TRUE, TRUE); + monster_level = dun_level; object_level = dun_level + 7; - place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT); + place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT); object_level = dun_level; + break; } - break; - } - case 'p': - { - cave_set_feat(y, x, FEAT_PATTERN_START); - break; - } + /* Nasty monster and treasure */ + case '8': + { + monster_level = dun_level + 40; + place_monster(y, x, TRUE, TRUE); + monster_level = dun_level; + object_level = dun_level + 20; + place_object(y, x, TRUE, TRUE, OBJ_FOUND_VAULT); + object_level = dun_level; + break; + } - case 'a': - { - cave_set_feat(y, x, FEAT_PATTERN_1); - break; - } + /* Monster and/or object */ + case ',': + { + if (rand_int(100) < 50) + { + monster_level = dun_level + 3; + place_monster(y, x, TRUE, TRUE); + monster_level = dun_level; + } + if (rand_int(100) < 50) + { + object_level = dun_level + 7; + place_object(y, x, FALSE, FALSE, OBJ_FOUND_VAULT); + object_level = dun_level; + } + break; + } - case 'b': - { - cave_set_feat(y, x, FEAT_PATTERN_2); - break; - } + case 'p': + { + cave_set_feat(y, x, FEAT_PATTERN_START); + break; + } - case 'c': - { - cave_set_feat(y, x, FEAT_PATTERN_3); - break; - } + case 'a': + { + cave_set_feat(y, x, FEAT_PATTERN_1); + break; + } - case 'd': - { - cave_set_feat(y, x, FEAT_PATTERN_4); - break; - } + case 'b': + { + cave_set_feat(y, x, FEAT_PATTERN_2); + break; + } - case 'P': - { - cave_set_feat(y, x, FEAT_PATTERN_END); - break; - } + case 'c': + { + cave_set_feat(y, x, FEAT_PATTERN_3); + break; + } - case 'B': - { - cave_set_feat(y, x, FEAT_PATTERN_XTRA1); - break; - } + case 'd': + { + cave_set_feat(y, x, FEAT_PATTERN_4); + break; + } - case 'A': - { - object_level = dun_level + 12; - place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT); - object_level = dun_level; - break; - } + case 'P': + { + cave_set_feat(y, x, FEAT_PATTERN_END); + break; + } + case 'B': + { + cave_set_feat(y, x, FEAT_PATTERN_XTRA1); + break; + } - /* Between gates */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - /* Not found before */ - if (bwy[*t - '0'] == 9999) + case 'A': { - cave_set_feat(y, x, FEAT_BETWEEN); - bwy[*t - '0'] = y; - bwx[*t - '0'] = x; + object_level = dun_level + 12; + place_object(y, x, TRUE, FALSE, OBJ_FOUND_VAULT); + object_level = dun_level; + break; } - /* The second time */ - else + + + /* Between gates */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': { - cave_set_feat(y, x, FEAT_BETWEEN); - c_ptr->special = bwx[*t - '0'] + (bwy[*t - '0'] << 8); - cave[bwy[*t - '0']][bwx[*t - '0']].special = x + (y << 8); + /* Not found before */ + if (bwy[d - '0'] == 9999) + { + cave_set_feat(y, x, FEAT_BETWEEN); + bwy[d - '0'] = y; + bwx[d - '0'] = x; + } + /* The second time */ + else + { + cave_set_feat(y, x, FEAT_BETWEEN); + c_ptr->special = bwx[d - '0'] + (bwy[d - '0'] << 8); + cave[bwy[d - '0']][bwx[d - '0']].special = x + (y << 8); + } + break; } - break; } } } diff --git a/src/init1.cc b/src/init1.cc index 31e8c55a..323a0c7f 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3275,7 +3275,7 @@ errr init_v_info_txt(FILE *fp) s = buf + 2; /* Append data */ - strappend(&v_ptr->data, s); + v_ptr->data += s; /* Next... */ continue; diff --git a/src/init2.cc b/src/init2.cc index da518a57..ea85cb29 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -532,7 +532,7 @@ namespace { static void allocate() { - v_info = make_array(max_v_idx); + v_info = new vault_type[max_v_idx]; } static errr parse(FILE *fp) diff --git a/src/vault_type.hpp b/src/vault_type.hpp index 650599cb..9d407d8f 100644 --- a/src/vault_type.hpp +++ b/src/vault_type.hpp @@ -1,24 +1,25 @@ #pragma once #include "h-basic.h" +#include /** * Vault descriptors. */ struct vault_type { - char *data; /* Vault data */ + std::string data; /* Vault data */ - byte typ; /* Vault type */ + byte typ = 0; /* Vault type */ - byte rat; /* Vault rating */ + byte rat = 0; /* Vault rating */ - byte hgt; /* Vault height */ - byte wid; /* Vault width */ + byte hgt = 0; /* Vault height */ + byte wid = 0; /* Vault width */ - s16b lvl; /* level of special (if any) */ - byte dun_type; /* Dungeon type where the level will show up */ + s16b lvl = 0; /* level of special (if any) */ + byte dun_type = 0; /* Dungeon type where the level will show up */ - s16b mon[10]; /* special monster */ - int item[3]; /* number of item (usually artifact) */ + s16b mon[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* special monster */ + int item[3] = { 0, 0, 0 }; /* number of item (usually artifact) */ }; -- cgit v1.2.3 From 018bfc6f736dd95dbf3315e5a2ba71204555ffdc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Refactor use_symbiotic_power() to use std::vector --- src/cmd5.cc | 76 +++++++++++++++++++++++++++++++++------------------------ src/cmd5.hpp | 3 +++ src/cmd7.cc | 6 ++--- src/defines.h | 5 ++++ src/monster3.cc | 37 +++++----------------------- src/tables.hpp | 2 +- 6 files changed, 61 insertions(+), 68 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 9870f116..9ca22adf 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -616,68 +616,80 @@ cptr symbiote_name(bool_ capitalize) } /* - * Use a power of the monster in symbiosis + * Extract powers */ -int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost) +std::vector extract_monster_powers(monster_race const *r_ptr, bool great) { - int power = -1; - - int num = 0, dir = 0 , i; - - int powers[96]; - - bool_ flag; - - int ask, plev = p_ptr->lev; - - char choice; - - char out_val[160]; - - monster_race *r_ptr = &r_info[r_idx]; - - int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); - - int x = p_ptr->px, y = p_ptr->py, k; - - int rad; - - int label; - + std::vector powers; + powers.reserve(MONSTER_POWERS_MAX); /* List the monster powers -- RF4_* */ - for (i = 0; i < 32; i++) + for (std::size_t i = 0; i < 32; i++) { if (r_ptr->flags4 & BIT(i)) { if (monster_powers[i].great && (!great)) continue; if (!monster_powers[i].power) continue; - powers[num++] = i; + powers.push_back(i); } } /* List the monster powers -- RF5_* */ - for (i = 0; i < 32; i++) + for (std::size_t i = 0; i < 32; i++) { if (r_ptr->flags5 & BIT(i)) { if (monster_powers[i + 32].great && (!great)) continue; if (!monster_powers[i + 32].power) continue; - powers[num++] = i + 32; + powers.push_back(i + 32); } } /* List the monster powers -- RF6_* */ - for (i = 0; i < 32; i++) + for (std::size_t i = 0; i < 32; i++) { if (r_ptr->flags6 & BIT(i)) { if (monster_powers[i + 64].great && (!great)) continue; if (!monster_powers[i + 64].power) continue; - powers[num++] = i + 64; + powers.push_back(i + 64); } } + return powers; +} + +/* + * Use a power of the monster in symbiosis + */ +int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost) +{ + int power = -1; + + int dir = 0 , i; + + bool_ flag; + + int ask, plev = p_ptr->lev; + + char choice; + + char out_val[160]; + + monster_race *r_ptr = &r_info[r_idx]; + + int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); + + int x = p_ptr->px, y = p_ptr->py, k; + + int rad; + + int label; + + /* Extract available monster powers */ + std::vector powers = extract_monster_powers(r_ptr, great); + int const num = powers.size(); // Avoid signed/unsigned warnings + if (!num) { msg_print("You have no powers you can use."); diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 1b3b062a..892b57f4 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" #include "object_type_fwd.hpp" +#include "monster_race_fwd.hpp" +#include extern bool_ is_magestaff(void); extern void do_cmd_browse_aux(object_type *o_ptr); @@ -14,3 +16,4 @@ extern bool_ is_ok_spell(s32b spell_idx, s32b pval); extern s32b get_school_spell(cptr do_what, s16b force_book); extern void do_cmd_copy_spell(void); extern void cast_school_spell(void); +extern std::vector extract_monster_powers(monster_race const *r_ptr, bool great); diff --git a/src/cmd7.cc b/src/cmd7.cc index 2317f8b9..aa053a48 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1831,8 +1831,6 @@ void do_cmd_possessor() if (ext == 1) { - bool_ use_great = FALSE; - if (p_ptr->disembodied) { msg_print("You don't currently own a body to use."); @@ -1840,9 +1838,9 @@ void do_cmd_possessor() } /* Do we have access to all the powers ? */ - if (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level) - use_great = TRUE; + bool_ use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level); + /* Select power */ use_symbiotic_power(p_ptr->body_monster, use_great, FALSE, FALSE); if (p_ptr->csp < 0) diff --git a/src/defines.h b/src/defines.h index 5309023f..224f5bd9 100644 --- a/src/defines.h +++ b/src/defines.h @@ -124,6 +124,11 @@ #define MAX_SPELLS 100 #define MAX_RUNES 100 +/* + * Total number of monster powers + */ +#define MONSTER_POWERS_MAX 96 + /* * Total number of stores (see "store.c", etc) */ diff --git a/src/monster3.cc b/src/monster3.cc index 0d26538c..75227699 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -10,6 +10,7 @@ #include "cave_type.hpp" #include "cmd2.hpp" +#include "cmd5.hpp" #include "gods.hpp" #include "melee2.hpp" #include "monster2.hpp" @@ -418,8 +419,7 @@ bool_ do_control_drop(void) bool_ do_control_magic(void) { int power = -1; - int num = 0, i; - int powers[96]; + int i; bool_ flag, redraw; int ask; char choice; @@ -437,36 +437,11 @@ bool_ do_control_magic(void) return TRUE; } - /* List the monster powers -- RF4_* */ - for (i = 0; i < 32; i++) - { - if (r_ptr->flags4 & BIT(i)) - { - if (!monster_powers[i].power) continue; - powers[num++] = i; - } - } - - /* List the monster powers -- RF5_* */ - for (i = 0; i < 32; i++) - { - if (r_ptr->flags5 & BIT(i)) - { - if (!monster_powers[i + 32].power) continue; - powers[num++] = i + 32; - } - } - - /* List the monster powers -- RF6_* */ - for (i = 0; i < 32; i++) - { - if (r_ptr->flags6 & BIT(i)) - { - if (!monster_powers[i + 64].power) continue; - powers[num++] = i + 64; - } - } + /* Extract available monster powers */ + std::vector powers = extract_monster_powers(r_ptr, true); + int const num = powers.size(); // Avoid signed/unsigned warnings + /* Are any powers available? */ if (!num) { msg_print("You have no powers you can use."); diff --git a/src/tables.hpp b/src/tables.hpp index aee776bd..c643d97e 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -67,7 +67,7 @@ extern cptr sense_desc[]; extern flags_group flags_groups[MAX_FLAG_GROUP]; extern power_type powers_type[POWER_MAX]; extern cptr artifact_names_list; -extern monster_power monster_powers[96]; +extern monster_power monster_powers[MONSTER_POWERS_MAX]; extern tval_desc tval_descs[]; extern between_exit between_exits[MAX_BETWEEN_EXITS]; extern int month_day[9]; -- cgit v1.2.3 From 583450263b633c958e33b3da0dcbfc56e80da65e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Remove unused parameter from use_symbiotic_power() --- src/cmd5.cc | 4 +--- src/cmd5.hpp | 2 +- src/cmd7.cc | 8 ++++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 9ca22adf..848be2e6 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -662,7 +662,7 @@ std::vector extract_monster_powers(monster_race const *r_ptr, bool great) /* * Use a power of the monster in symbiosis */ -int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost) +int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) { int power = -1; @@ -696,8 +696,6 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost return (0); } - if (only_number) return (num); - /* Nothing chosen yet */ flag = FALSE; diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 892b57f4..4ec84593 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -11,7 +11,7 @@ extern void do_cmd_browse(void); extern void fetch(int dir, int wgt, bool_ require_los); extern void do_poly_self(void); extern cptr symbiote_name(bool_ capitalize); -extern int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost); +extern int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost); extern bool_ is_ok_spell(s32b spell_idx, s32b pval); extern s32b get_school_spell(cptr do_what, s16b force_book); extern void do_cmd_copy_spell(void); diff --git a/src/cmd7.cc b/src/cmd7.cc index aa053a48..ffb136cb 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1841,7 +1841,7 @@ void do_cmd_possessor() bool_ use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level); /* Select power */ - use_symbiotic_power(p_ptr->body_monster, use_great, FALSE, FALSE); + use_symbiotic_power(p_ptr->body_monster, use_great, FALSE); if (p_ptr->csp < 0) { @@ -4268,7 +4268,7 @@ void do_cmd_symbiotic(void) break; } - if (0 > use_symbiotic_power(o_ptr->pval, FALSE, FALSE, TRUE)) + if (0 > use_symbiotic_power(o_ptr->pval, FALSE, TRUE)) return; break; @@ -4307,7 +4307,7 @@ void do_cmd_symbiotic(void) break; } - if(0 > use_symbiotic_power(o_ptr->pval, TRUE, FALSE, TRUE)) + if(0 > use_symbiotic_power(o_ptr->pval, TRUE, TRUE)) return; break; @@ -4335,7 +4335,7 @@ void do_cmd_symbiotic(void) if (!c_ptr->m_idx) break; m_ptr = &m_list[c_ptr->m_idx]; - use_symbiotic_power(m_ptr->r_idx, TRUE, FALSE, TRUE); + use_symbiotic_power(m_ptr->r_idx, TRUE, TRUE); break; } -- cgit v1.2.3 From 4b9e1335dc6ddcdd4b6fc0722493404311779e6d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Reduce local variable scopes in use_symbiotic_power() --- src/cmd5.cc | 146 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 95 insertions(+), 51 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 848be2e6..6f93da8c 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -664,27 +664,7 @@ std::vector extract_monster_powers(monster_race const *r_ptr, bool great) */ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) { - int power = -1; - - int dir = 0 , i; - - bool_ flag; - - int ask, plev = p_ptr->lev; - - char choice; - - char out_val[160]; - - monster_race *r_ptr = &r_info[r_idx]; - - int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); - - int x = p_ptr->px, y = p_ptr->py, k; - - int rad; - - int label; + monster_race const *r_ptr = &r_info[r_idx]; /* Extract available monster powers */ std::vector powers = extract_monster_powers(r_ptr, great); @@ -696,14 +676,12 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) return (0); } - /* Nothing chosen yet */ - flag = FALSE; - /* Get the last label */ - label = (num <= 26) ? I2A(num - 1) : I2D(num - 1 - 26); + int label = (num <= 26) ? I2A(num - 1) : I2D(num - 1 - 26); /* Build a prompt (accept all spells) */ /* Mega Hack -- if no_cost is false, we're actually a Possessor -dsb */ + char out_val[160]; strnfmt(out_val, 78, "(Powers a-%c, ESC=exit) Use which power of your %s? ", label, (no_cost ? "symbiote" : "body")); @@ -713,6 +691,8 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) Term_save(); /* Get a spell from the user */ + int power = -1; // Selected power + bool_ flag = FALSE; // Nothing chosen yet while (!flag) { /* Show the list */ @@ -769,6 +749,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) } } + char choice; if (!get_com(out_val, &choice)) { flag = FALSE; @@ -780,6 +761,8 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) choice = 'a'; } + int i; + int ask; if (isalpha(choice)) { /* Note verify */ @@ -836,16 +819,16 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) return -1; } - /* 'Powerful' monsters have wider radii */ - if (r_ptr->flags2 & RF2_POWERFUL) - { - rad = 1 + (p_ptr->lev / 15); - } - else - { - rad = 1 + (p_ptr->lev / 20); - } + /* Shorthand */ + int const x = p_ptr->px; + int const y = p_ptr->py; + int const plev = p_ptr->lev; + int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); + /* 'Powerful' monsters have wider radii */ + int rad = (r_ptr->flags2 & RF2_POWERFUL) + ? 1 + (p_ptr->lev / 15) + : 1 + (p_ptr->lev / 20); /* Analyse power */ switch (power) @@ -879,6 +862,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ROCKET */ case 3: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_ROCKET, dir, p_ptr->lev * 12, 1 + (p_ptr->lev / 20)); @@ -889,6 +873,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ARROW_1 */ case 4: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ARROW, dir, damroll(1, 6)); @@ -899,6 +884,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ARROW_2 */ case 5: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ARROW, dir, damroll(3, 6)); @@ -909,6 +895,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ARROW_3 */ case 6: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ARROW, dir, damroll(5, 6)); @@ -919,6 +906,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ARROW_4 */ case 7: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ARROW, dir, damroll(7, 6)); @@ -929,6 +917,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_ACID */ case 8: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_ACID, dir, p_ptr->lev * 5, rad); @@ -939,6 +928,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_ELEC */ case 9: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_ELEC, dir, p_ptr->lev * 5, rad); @@ -949,6 +939,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_FIRE */ case 10: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_FIRE, dir, p_ptr->lev * 5, rad); @@ -959,6 +950,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_COLD */ case 11: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_COLD, dir, p_ptr->lev * 5, rad); @@ -969,6 +961,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_POIS */ case 12: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_POIS, dir, p_ptr->lev * 5, rad); @@ -979,6 +972,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_NETH */ case 13: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_NETHER, dir, p_ptr->lev * 5, rad); @@ -989,6 +983,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_LITE */ case 14: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_LITE, dir, p_ptr->lev * 8, rad); @@ -999,6 +994,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_DARK */ case 15: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_DARK, dir, p_ptr->lev * 8, rad); @@ -1009,6 +1005,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_CONF */ case 16: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_CONFUSION, dir, p_ptr->lev * 8, rad); @@ -1019,6 +1016,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_SOUN */ case 17: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_SOUND, dir, p_ptr->lev * 8, rad); @@ -1029,6 +1027,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_CHAO */ case 18: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_CHAOS, dir, p_ptr->lev * 7, rad); @@ -1039,6 +1038,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_DISE */ case 19: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_DISENCHANT, dir, p_ptr->lev * 7, rad); @@ -1049,6 +1049,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_NEXU */ case 20: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_NEXUS, dir, p_ptr->lev * 5, rad); @@ -1059,6 +1060,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_TIME */ case 21: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_TIME, dir, p_ptr->lev * 3, rad); @@ -1069,6 +1071,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_INER */ case 22: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_INERTIA, dir, p_ptr->lev * 4, rad); @@ -1079,6 +1082,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_GRAV */ case 23: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_GRAVITY, dir, p_ptr->lev * 4, rad); @@ -1089,6 +1093,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_SHAR */ case 24: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_SHARDS, dir, p_ptr->lev * 8, rad); @@ -1099,6 +1104,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_PLAS */ case 25: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_PLASMA, dir, p_ptr->lev * 3, rad); @@ -1109,6 +1115,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_WALL */ case 26: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_FORCE, dir, p_ptr->lev * 4, rad); @@ -1119,6 +1126,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_MANA */ case 27: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_MANA, dir, p_ptr->lev * 5, rad); @@ -1129,6 +1137,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_NUKE */ case 28: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_NUKE, dir, p_ptr->lev * 8, 1 + (p_ptr->lev / 20)); @@ -1139,6 +1148,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_NUKE */ case 29: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_NUKE, dir, p_ptr->lev * 8, 1 + (p_ptr->lev / 20)); @@ -1149,6 +1159,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_CHAO */ case 30: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_CHAOS, dir, p_ptr->lev * 4, 2); @@ -1159,6 +1170,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BR_DISI */ case 31: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_DISINTEGRATE, dir, p_ptr->lev * 5, 1 + (p_ptr->lev / 20)); @@ -1172,6 +1184,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_ACID */ case 32: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_ACID, dir, randint(p_ptr->lev * 6) + 20, 2); @@ -1182,6 +1195,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_ELEC */ case 33: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_ELEC, dir, randint(p_ptr->lev * 3) + 20, 2); @@ -1192,6 +1206,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_FIRE */ case 34: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_FIRE, dir, randint(p_ptr->lev * 7) + 20, 2); @@ -1202,6 +1217,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_COLD */ case 35: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_COLD, dir, randint(p_ptr->lev * 3) + 20, 2); @@ -1212,6 +1228,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_POIS */ case 36: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_POIS, dir, damroll(12, 2), 2); @@ -1222,6 +1239,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_NETH */ case 37: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_NETHER, dir, randint(p_ptr->lev * 4) + 20, 2); @@ -1232,6 +1250,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_WATE */ case 38: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_WATER, dir, randint(p_ptr->lev * 4) + 20, 2); @@ -1242,6 +1261,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_MANA */ case 39: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_MANA, dir, randint(p_ptr->lev * 3) + 20, 2); @@ -1252,6 +1272,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BA_DARK */ case 40: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_DARK, dir, randint(p_ptr->lev * 3) + 20, 2); @@ -1268,6 +1289,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* CAUSE_1 */ case 44: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(3, 8)); @@ -1278,6 +1300,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* CAUSE_2 */ case 45: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(8, 8)); @@ -1288,6 +1311,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* CAUSE_3 */ case 46: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(10, 15)); @@ -1298,6 +1322,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* CAUSE_4 */ case 47: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(15, 15)); @@ -1308,6 +1333,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_ACID */ case 48: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ACID, dir, damroll(7, 8) + (p_ptr->lev / 3)); @@ -1318,6 +1344,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_ELEC */ case 49: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ELEC, dir, damroll(4, 8) + (p_ptr->lev / 3)); @@ -1328,6 +1355,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_FIRE */ case 50: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_FIRE, dir, damroll(9, 8) + (p_ptr->lev / 3)); @@ -1338,6 +1366,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_COLD */ case 51: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_COLD, dir, damroll(6, 8) + (p_ptr->lev / 3)); @@ -1348,6 +1377,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_POIS */ case 52: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_POIS, dir, damroll(7, 8) + (p_ptr->lev / 3)); @@ -1358,6 +1388,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_NETH */ case 53: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_NETHER, dir, damroll(5, 5) + (p_ptr->lev / 3)); @@ -1368,6 +1399,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_WATE */ case 54: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_WATER, dir, damroll(10, 10) + (p_ptr->lev / 3)); @@ -1378,6 +1410,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_MANA */ case 55: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(3, 8) + (p_ptr->lev / 3)); @@ -1388,6 +1421,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_PLAS */ case 56: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_PLASMA, dir, damroll(8, 8) + (p_ptr->lev / 3)); @@ -1398,6 +1432,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BO_ICEE */ case 57: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_ICE, dir, damroll(6, 6) + (p_ptr->lev / 3)); @@ -1408,6 +1443,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* MISSILE */ case 58: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MISSILE, dir, damroll(2, 6) + (p_ptr->lev / 3)); @@ -1418,6 +1454,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* SCARE */ case 59: { + int dir; if (!get_aim_dir(&dir)) break; fear_monster(dir, plev); @@ -1428,6 +1465,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* BLIND */ case 60: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_CONFUSION, dir, damroll(1, 8) + (p_ptr->lev / 3)); @@ -1438,6 +1476,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* CONF */ case 61: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_CONFUSION, dir, damroll(7, 8) + (p_ptr->lev / 3)); @@ -1448,6 +1487,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* SLOW */ case 62: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_OLD_SLOW, dir, damroll(6, 8) + (p_ptr->lev / 3)); @@ -1458,6 +1498,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* HOLD */ case 63: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_OLD_SLEEP, dir, damroll(5, 8) + (p_ptr->lev / 3)); @@ -1486,6 +1527,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* HAND_DOOM */ case 65: { + int dir; if (!get_aim_dir(&dir)) break; fire_bolt(GF_MANA, dir, damroll(10, 8) + (p_ptr->lev)); @@ -1504,7 +1546,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_ANIMALS */ case 67: { - for (k = 0; k < 4; k++) + for (int k = 0; k < 4; k++) { summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE); } @@ -1579,6 +1621,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) break; } + int dir; if (!get_aim_dir(&dir)) break; (void)fire_beam(GF_AWAY_ALL, dir, plev); @@ -1625,6 +1668,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* ANIM_DEAD -- Use the same code as the nether spell */ case 76: { + int dir; if (!get_aim_dir(&dir)) break; fire_ball(GF_RAISE, dir, 1, 0); @@ -1639,7 +1683,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_THUNDERLORD */ case 79: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_THUNDERLORD, TRUE); } @@ -1653,7 +1697,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* Big hack */ summon_kin_type = r_ptr->d_char; - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, SUMMON_KIN, TRUE); } @@ -1664,7 +1708,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_HI_DEMON */ case 81: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_HI_DEMON, TRUE); } @@ -1675,7 +1719,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_MONSTER */ case 82: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, 0, TRUE); } @@ -1686,7 +1730,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_MONSTERS */ case 83: { - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, 0, TRUE); } @@ -1697,7 +1741,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_ANT */ case 84: { - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, SUMMON_ANT, TRUE); } @@ -1708,7 +1752,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_SPIDER */ case 85: { - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, SUMMON_SPIDER, TRUE); } @@ -1719,7 +1763,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_HOUND */ case 86: { - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, SUMMON_HOUND, TRUE); } @@ -1730,7 +1774,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_HYDRA */ case 87: { - for (k = 0; k < 6; k++) + for (int k = 0; k < 6; k++) { summon_specific_friendly(y, x, rlev, SUMMON_HYDRA, TRUE); } @@ -1741,7 +1785,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_ANGEL */ case 88: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_ANGEL, TRUE); } @@ -1752,7 +1796,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_DEMON */ case 89: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_DEMON, TRUE); } @@ -1763,7 +1807,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_UNDEAD */ case 90: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_UNDEAD, TRUE); } @@ -1774,7 +1818,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_DRAGON */ case 91: { - for (k = 0; k < 1; k++) + for (int k = 0; k < 1; k++) { summon_specific_friendly(y, x, rlev, SUMMON_DRAGON, TRUE); } @@ -1785,7 +1829,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_HI_UNDEAD */ case 92: { - for (k = 0; k < 8; k++) + for (int k = 0; k < 8; k++) { summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE); } @@ -1796,7 +1840,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_HI_DRAGON */ case 93: { - for (k = 0; k < 8; k++) + for (int k = 0; k < 8; k++) { summon_specific_friendly(y, x, rlev, SUMMON_HI_DRAGON_NO_UNIQUES, TRUE); } @@ -1807,7 +1851,7 @@ int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) /* S_WRAITH */ case 94: { - for (k = 0; k < 8; k++) + for (int k = 0; k < 8; k++) { summon_specific_friendly(y, x, rlev, SUMMON_WRAITH, TRUE); } -- cgit v1.2.3 From eb6b8414383d35eb8bef0e565adcf2c68a87ef7d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Use proper "bool" for use_symbiotic_power() parameters --- src/cmd5.cc | 2 +- src/cmd5.hpp | 2 +- src/cmd7.cc | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 6f93da8c..9bb12421 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -662,7 +662,7 @@ std::vector extract_monster_powers(monster_race const *r_ptr, bool great) /* * Use a power of the monster in symbiosis */ -int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost) +int use_symbiotic_power(int r_idx, bool great, bool no_cost) { monster_race const *r_ptr = &r_info[r_idx]; diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 4ec84593..1b436f0d 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -11,7 +11,7 @@ extern void do_cmd_browse(void); extern void fetch(int dir, int wgt, bool_ require_los); extern void do_poly_self(void); extern cptr symbiote_name(bool_ capitalize); -extern int use_symbiotic_power(int r_idx, bool_ great, bool_ no_cost); +extern int use_symbiotic_power(int r_idx, bool great, bool no_cost); extern bool_ is_ok_spell(s32b spell_idx, s32b pval); extern s32b get_school_spell(cptr do_what, s16b force_book); extern void do_cmd_copy_spell(void); diff --git a/src/cmd7.cc b/src/cmd7.cc index ffb136cb..711bf2ca 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1838,10 +1838,10 @@ void do_cmd_possessor() } /* Do we have access to all the powers ? */ - bool_ use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level); + bool use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level); /* Select power */ - use_symbiotic_power(p_ptr->body_monster, use_great, FALSE); + use_symbiotic_power(p_ptr->body_monster, use_great, false); if (p_ptr->csp < 0) { @@ -4268,7 +4268,7 @@ void do_cmd_symbiotic(void) break; } - if (0 > use_symbiotic_power(o_ptr->pval, FALSE, TRUE)) + if (0 > use_symbiotic_power(o_ptr->pval, false, true)) return; break; @@ -4307,7 +4307,7 @@ void do_cmd_symbiotic(void) break; } - if(0 > use_symbiotic_power(o_ptr->pval, TRUE, TRUE)) + if(0 > use_symbiotic_power(o_ptr->pval, true, true)) return; break; @@ -4335,7 +4335,7 @@ void do_cmd_symbiotic(void) if (!c_ptr->m_idx) break; m_ptr = &m_list[c_ptr->m_idx]; - use_symbiotic_power(m_ptr->r_idx, TRUE, TRUE); + use_symbiotic_power(m_ptr->r_idx, true, true); break; } -- cgit v1.2.3 From 4aea81f876e35625e1cd762ba91ea67913d8edb6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Split "choice" from "action" in use_symbiotic_power() --- src/cmd5.cc | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 9bb12421..df1eb5ad 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -659,13 +659,11 @@ std::vector extract_monster_powers(monster_race const *r_ptr, bool great) return powers; } -/* - * Use a power of the monster in symbiosis +/** + * Choose a monster power */ -int use_symbiotic_power(int r_idx, bool great, bool no_cost) +static std::tuple choose_monster_power(monster_race const *r_ptr, bool great, bool no_cost) { - monster_race const *r_ptr = &r_info[r_idx]; - /* Extract available monster powers */ std::vector powers = extract_monster_powers(r_ptr, great); int const num = powers.size(); // Avoid signed/unsigned warnings @@ -673,7 +671,7 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) if (!num) { msg_print("You have no powers you can use."); - return (0); + return std::make_tuple(0, num); } /* Get the last label */ @@ -815,6 +813,30 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) /* Abort if needed */ if (!flag) { + return std::make_tuple(-1, num); + } + + return std::make_tuple(power, num); +} + + +/* + * Use a power of the monster in symbiosis + */ +int use_symbiotic_power(int r_idx, bool great, bool no_cost) +{ + monster_race const *r_ptr = &r_info[r_idx]; + + int power; + int num; + std::tie(power, num) = choose_monster_power(r_ptr, great, no_cost); + + // Early exit? + if (power == 0) { + // No powers available + return 0; + } else if (power < 0) { + // Canceled by user energy_use = 0; return -1; } -- cgit v1.2.3 From 7af6bc9b2ec5326181fee27dad9e465992b2b8a8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Split out "apply effect" from use_symbiotic_power() --- src/cmd5.cc | 59 +++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index df1eb5ad..120e2e96 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -821,25 +821,12 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool /* - * Use a power of the monster in symbiosis + * Apply the effect of a monster power */ -int use_symbiotic_power(int r_idx, bool great, bool no_cost) +static void apply_monster_power(monster_race const *r_ptr, int power) { - monster_race const *r_ptr = &r_info[r_idx]; - - int power; - int num; - std::tie(power, num) = choose_monster_power(r_ptr, great, no_cost); - - // Early exit? - if (power == 0) { - // No powers available - return 0; - } else if (power < 0) { - // Canceled by user - energy_use = 0; - return -1; - } + assert(power >= 0); + assert(power < MONSTER_POWERS_MAX); /* Shorthand */ int const x = p_ptr->px; @@ -1622,8 +1609,8 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) p_ptr->energy -= 60 - plev; if (!cave_empty_bold(ij, ii) || - (cave[ij][ii].info & CAVE_ICKY) || - (distance(ij, ii, p_ptr->py, p_ptr->px) > plev * 20 + 2)) + (cave[ij][ii].info & CAVE_ICKY) || + (distance(ij, ii, p_ptr->py, p_ptr->px) > plev * 20 + 2)) { msg_print("You fail to show the destination correctly!"); p_ptr->energy -= 100; @@ -1669,7 +1656,7 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) case 73: { (void)project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK, - PROJECT_GRID | PROJECT_KILL); + PROJECT_GRID | PROJECT_KILL); /* Unlite the room */ unlite_room(p_ptr->py, p_ptr->px); @@ -1883,14 +1870,38 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) /* 95 S_UNIQUE -- Not available */ } +} + + +/* + * Use a power of the monster in symbiosis + */ +int use_symbiotic_power(int r_idx, bool great, bool no_cost) +{ + monster_race const *r_ptr = &r_info[r_idx]; + + int power; + int num; + std::tie(power, num) = choose_monster_power(r_ptr, great, no_cost); + + // Early exit? + if (power == 0) { + // No powers available + return 0; + } else if (power < 0) { + // Canceled by user + energy_use = 0; + return -1; + } + + /* Apply the effect */ + apply_monster_power(r_ptr, power); /* Take some SP */ if (!no_cost) { - int chance, pchance; - - chance = (monster_powers[power].mana + r_ptr->level); - pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION); + int chance = (monster_powers[power].mana + r_ptr->level); + int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION); if (rand_int(chance) >= pchance) { -- cgit v1.2.3 From 8915788267bb1036c110195eb0a8826b6592cbd5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Split use_symbiotic_power() into two separate functions This split makes it much clearer which functionality is being used at call sites. We also eliminate a little bit of duplicate code. --- src/cmd5.cc | 79 +++++++++++++++++++++++++++++++++++++----------------------- src/cmd5.hpp | 3 ++- src/cmd7.cc | 15 +++++------- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 120e2e96..a7589e6c 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -659,10 +659,21 @@ std::vector extract_monster_powers(monster_race const *r_ptr, bool great) return powers; } +/** + * Calculate mana required for a given monster power. + */ +static int calc_monster_spell_mana(monster_power const *mp_ptr) +{ + int mana = mp_ptr->mana / 10; + if (mana > p_ptr->msp) mana = p_ptr->msp; + if (!mana) mana = 1; + return mana; +} + /** * Choose a monster power */ -static std::tuple choose_monster_power(monster_race const *r_ptr, bool great, bool no_cost) +static std::tuple choose_monster_power(monster_race const *r_ptr, bool great, bool symbiosis) { /* Extract available monster powers */ std::vector powers = extract_monster_powers(r_ptr, great); @@ -682,7 +693,7 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool char out_val[160]; strnfmt(out_val, 78, "(Powers a-%c, ESC=exit) Use which power of your %s? ", - label, (no_cost ? "symbiote" : "body")); + label, (symbiosis ? "symbiote" : "body")); /* Save the screen */ character_icky = TRUE; @@ -706,16 +717,12 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool while (ctr < num) { monster_power *mp_ptr = &monster_powers[powers[ctr]]; - int mana = mp_ptr->mana / 10; - - if (mana > p_ptr->msp) mana = p_ptr->msp; - - if (!mana) mana = 1; label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26); - if (!no_cost) + if (!symbiosis) { + int mana = calc_monster_spell_mana(mp_ptr); strnfmt(dummy, 80, " %c) %2d %s", label, mana, mp_ptr->name); } @@ -1874,15 +1881,13 @@ static void apply_monster_power(monster_race const *r_ptr, int power) /* - * Use a power of the monster in symbiosis + * Use a monster power and call the given callback. */ -int use_symbiotic_power(int r_idx, bool great, bool no_cost) +static int use_monster_power_aux(monster_race const *r_ptr, bool great, bool symbiosis, std::function f) { - monster_race const *r_ptr = &r_info[r_idx]; - int power; int num; - std::tie(power, num) = choose_monster_power(r_ptr, great, no_cost); + std::tie(power, num) = choose_monster_power(r_ptr, great, symbiosis); // Early exit? if (power == 0) { @@ -1894,25 +1899,11 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) return -1; } - /* Apply the effect */ + // Apply the effect apply_monster_power(r_ptr, power); - /* Take some SP */ - if (!no_cost) - { - int chance = (monster_powers[power].mana + r_ptr->level); - int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION); - - if (rand_int(chance) >= pchance) - { - int m = monster_powers[power].mana / 10; - - if (m > p_ptr->msp) m = p_ptr->msp; - if (!m) m = 1; - - p_ptr->csp -= m; - } - } + // Post-processing + f(&monster_powers[power]); /* Redraw mana */ p_ptr->redraw |= (PR_FRAME); @@ -1923,6 +1914,34 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost) return (num); } +/** + * Use a power of the monster in symbiosis + */ +int use_symbiotic_power(int r_idx, bool great) +{ + monster_race const *r_ptr = &r_info[r_idx]; + return use_monster_power_aux(r_ptr, great, true, [](monster_power const *) { + // Don't need to do anything post-cast. + }); +} + +/** + * Use a power of a possessed body. + */ +void use_monster_power(int r_idx, bool great) +{ + monster_race const *r_ptr = &r_info[r_idx]; + use_monster_power_aux(r_ptr, great, false, [r_ptr](monster_power const *power) { + // Sometimes give a free cast. + int chance = (power->mana + r_ptr->level); + int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION); + if (rand_int(chance) >= pchance) + { + p_ptr->csp -= calc_monster_spell_mana(power); + } + }); +} + /* * Schooled magic */ diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 1b436f0d..4b116596 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -11,7 +11,8 @@ extern void do_cmd_browse(void); extern void fetch(int dir, int wgt, bool_ require_los); extern void do_poly_self(void); extern cptr symbiote_name(bool_ capitalize); -extern int use_symbiotic_power(int r_idx, bool great, bool no_cost); +extern int use_symbiotic_power(int r_idx, bool great); +extern void use_monster_power(int r_idx, bool great); extern bool_ is_ok_spell(s32b spell_idx, s32b pval); extern s32b get_school_spell(cptr do_what, s16b force_book); extern void do_cmd_copy_spell(void); diff --git a/src/cmd7.cc b/src/cmd7.cc index 711bf2ca..a27d7e4b 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1841,7 +1841,7 @@ void do_cmd_possessor() bool use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level); /* Select power */ - use_symbiotic_power(p_ptr->body_monster, use_great, false); + use_monster_power(p_ptr->body_monster, use_great); if (p_ptr->csp < 0) { @@ -4268,7 +4268,7 @@ void do_cmd_symbiotic(void) break; } - if (0 > use_symbiotic_power(o_ptr->pval, false, true)) + if (0 > use_symbiotic_power(o_ptr->pval, false)) return; break; @@ -4307,7 +4307,7 @@ void do_cmd_symbiotic(void) break; } - if(0 > use_symbiotic_power(o_ptr->pval, true, true)) + if(0 > use_symbiotic_power(o_ptr->pval, true)) return; break; @@ -4325,17 +4325,14 @@ void do_cmd_symbiotic(void) case 8: { int y, x; - cave_type *c_ptr; - monster_type *m_ptr; - if (!tgt_pt(&x, &y)) return; - c_ptr = &cave[y][x]; + cave_type *c_ptr = &cave[y][x]; if (!c_ptr->m_idx) break; - m_ptr = &m_list[c_ptr->m_idx]; - use_symbiotic_power(m_ptr->r_idx, true, true); + monster_type *m_ptr = &m_list[c_ptr->m_idx]; + use_symbiotic_power(m_ptr->r_idx, true); break; } -- cgit v1.2.3 From e0063a85b00ce615387ef637e1a3c6d542594338 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Don't allow Possessors to cast "too expensive" spells This fixes the utter stupidity that is "system shock", aka. the ever so clever "always-check-SP-before-casting-or-die" mechanic. --- src/cmd5.cc | 19 ++++++++++++++++--- src/cmd7.cc | 17 +---------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index a7589e6c..986ed18f 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -709,7 +709,6 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool byte y = 1, x = 0; int ctr = 0; char dummy[80]; - strcpy(dummy, ""); prt ("", y++, x); @@ -720,11 +719,16 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26); + byte color = TERM_L_GREEN; if (!symbiosis) { int mana = calc_monster_spell_mana(mp_ptr); strnfmt(dummy, 80, " %c) %2d %s", label, mana, mp_ptr->name); + // Gray out if player doesn't have enough mana to cast. + if (mana > p_ptr->csp) { + color = TERM_L_DARK; + } } else { @@ -734,11 +738,11 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool if (ctr < 17) { - prt(dummy, y + ctr, x); + c_prt(color, dummy, y + ctr, x); } else { - prt(dummy, y + ctr - 17, x + 40); + c_prt(color, dummy, y + ctr - 17, x + 40); } ctr++; @@ -797,6 +801,15 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool /* Save the spell index */ power = powers[i]; + /* Make sure it's actually possible for the player to cast */ + if (!symbiosis) { + if (p_ptr->csp < calc_monster_spell_mana(&monster_powers[power])) + { + bell(); + continue; + } + } + /* Verify it */ if (ask) { diff --git a/src/cmd7.cc b/src/cmd7.cc index a27d7e4b..7b6cd8d2 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1842,22 +1842,7 @@ void do_cmd_possessor() /* Select power */ use_monster_power(p_ptr->body_monster, use_great); - - if (p_ptr->csp < 0) - { - msg_print("You lose control of your body!"); - if (!do_cmd_leave_body(FALSE)) - { - cmsg_print(TERM_VIOLET, - "You are forced back into your body by your cursed items, " - "you suffer a system shock!"); - - p_ptr->chp = 1; - - /* Display the hitpoints */ - p_ptr->redraw |= (PR_FRAME); - } - } + assert(p_ptr->csp >= 0); // Sanity check } else if (ext == 2) { -- cgit v1.2.3 From 8a7e17e88e60c841f4086be30f8a090aa651a722 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Remove unused code --- src/init1.cc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 323a0c7f..e908a470 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1668,16 +1668,6 @@ static errr grab_one_race_kind_flag(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b } } - /* Check flags2 -- traps*/ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - (*f3) |= (1L << i); - return (0); - } - } - /* Check flags3 */ for (i = 0; i < 32; i++) { -- cgit v1.2.3 From 0ca77d2bb98db0dda428d2c10014b40c151078cd Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Fix edge condition preventing errors from being displayed --- src/util.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/util.cc b/src/util.cc index 8bdd532d..f5b3e09c 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1869,7 +1869,10 @@ void cmsg_print(byte color, cptr msg) /* if (character_generated) message_add(t); */ /* Window stuff */ - p_ptr->window |= (PW_MESSAGE); + if (p_ptr) + { + p_ptr->window |= (PW_MESSAGE); + } /* Remember the message */ msg_flag = TRUE; -- cgit v1.2.3 From 6c007b95bdb3658da6dc0fef74a4c798a8d558f2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Remove massive amounts of boilerplate in init1.cc --- src/init1.cc | 1233 +++++++++++++--------------------------------------------- 1 file changed, 270 insertions(+), 963 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index e908a470..2a8c8c3c 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -927,7 +927,6 @@ static cptr d_info_flags2[] = "XXX1", "XXX1", "XXX1", - "XXX1", "XXX1" }; @@ -1006,7 +1005,6 @@ static cptr st_info_flags1[] = "XXX1", "XXX1", "XXX1", - "XXX1", "XXX1" }; @@ -1085,7 +1083,6 @@ cptr rp_info_flags2[] = "XXX1", "XXX1", "XXX1", - "XXX1", "XXX1" }; @@ -1123,10 +1120,83 @@ static cptr s_info_flags1[] = "XXX1", "XXX1", "XXX1", - "XXX1", "XXX1" }; + +/* + * Helpers for looking up flags in the above arrays + * and extracting "bitmasks" from them. + */ + +namespace { // anonymous + +namespace detail { + +/** + * A "tie" (see e.g. std::tuple) between a "flags" value pointer and its + * corresponding array of text strings. Implementation detail. + */ +template struct flag_tie_impl { +private: + u32b *m_mask; + cptr (&m_flags)[N]; +public: + flag_tie_impl(u32b *mask, cptr (&flags)[N]): m_mask(mask), m_flags(flags) { + // Empty + } + + bool match(cptr flag) { + for (unsigned int i = 0; i < N; i++) + { + if (streq(flag, m_flags[i])) + { + *m_mask |= (1L << i); + return true; + } + } + return false; + } +}; + +} // namespace detail + +/** + * Tie a flags value pointer and its corresponding array + * of text strings. + */ +template detail::flag_tie_impl flag_tie(u32b *mask, cptr (&flags)[N]) { + static_assert(N <= 32, "Array too large to represent result"); + return detail::flag_tie_impl(mask, flags); +} + +/** + * Look up flag in array of flags. + */ +template bool lookup_flags(cptr) +{ + // Base case: No match + return false; +} + +/** + * Look up flag in array of flags. + */ +template bool lookup_flags(cptr flag, detail::flag_tie_impl tie, Pairs&&...rest) { + // Inductive case: Check against current "tie" + if (tie.match(flag)) { + // Match + return true; + } else { + // No match; check against rest of the array of flags + return lookup_flags(flag, rest...); + } +} + +} // namespace anonymous + + + /* * Dungeon effect types (used in E:damage:frequency:type entry in d_info.txt) */ @@ -1573,16 +1643,9 @@ static errr grab_one_race_allow_flag(u32b *choice, cptr what) */ static errr grab_one_skill_flag(u32b *f1, cptr what) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, flag_tie(f1, s_info_flags1))) { - if (streq(what, s_info_flags1[i])) - { - (*f1) |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -1596,26 +1659,11 @@ static errr grab_one_skill_flag(u32b *f1, cptr what) */ static errr grab_one_player_race_flag(u32b *f1, u32b *f2, cptr what) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, rp_info_flags1[i])) - { - (*f1) |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(f1, rp_info_flags1), + flag_tie(f2, rp_info_flags2))) { - if (streq(what, rp_info_flags2[i])) - { - (*f2) |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -1646,66 +1694,15 @@ static int get_activation(char *activation) */ static errr grab_one_race_kind_flag(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp, cptr what) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags1[i])) - { - (*f1) |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - (*f2) |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - (*f3) |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - (*f4) |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags5[i])) - { - (*f5) |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) + 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 (streq(what, esp_flags[i])) - { - (*esp) |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -3340,22 +3337,15 @@ errr init_v_info_txt(FILE *fp) /* * Grab one flag in an feature_type from a textual string */ -static errr grab_one_feature_flag(feature_type *f_ptr, cptr what) +static errr grab_one_feature_flag(u32b *f1, cptr what) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, flag_tie(f1, f_info_flags1))) { - if (streq(what, f_info_flags1[i])) - { - f_ptr->flags1 |= (1L << i); - return (0); - } + return (0); } /* Oops */ - msg_format("Unknown object flag '%s'.", what); + msg_format("Unknown feature flag '%s'.", what); /* Error */ return (1); @@ -3604,7 +3594,7 @@ errr init_f_info_txt(FILE *fp) } /* Parse this entry */ - if (0 != grab_one_feature_flag(f_ptr, s)) return (5); + if (0 != grab_one_feature_flag(&f_ptr->flags1, s)) return (5); /* Start the next entry */ s = t; @@ -3630,97 +3620,25 @@ errr init_f_info_txt(FILE *fp) */ static errr grab_one_kind_flag(object_kind *k_ptr, cptr what, bool_ obvious) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags1[i])) - { - if (obvious) - k_ptr->oflags1 |= (1L << i); - else - k_ptr->flags1 |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - if (obvious) - k_ptr->oflags2 |= (1L << i); - else - k_ptr->flags2 |= (1L << i); - return (0); - } - } - - /* Check flags2 -- traps*/ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - if (obvious) - k_ptr->oflags2 |= (1L << i); - else - k_ptr->flags2 |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - if (obvious) - k_ptr->oflags3 |= (1L << i); - else - k_ptr->flags3 |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - if (obvious) - k_ptr->oflags4 |= (1L << i); - else - k_ptr->flags4 |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags5[i])) - { - if (obvious) - k_ptr->oflags5 |= (1L << i); - else - k_ptr->flags5 |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) + /* 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))) { - if (streq(what, esp_flags[i])) - { - if (obvious) - k_ptr->oesp |= (1L << i); - else - k_ptr->esp |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -4086,97 +4004,25 @@ errr init_k_info_txt(FILE *fp) */ static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool_ obvious) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags1[i])) - { - if (obvious) - a_ptr->oflags1 |= (1L << i); - else - a_ptr->flags1 |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - if (obvious) - a_ptr->oflags2 |= (1L << i); - else - a_ptr->flags2 |= (1L << i); - return (0); - } - } - - /* Check flags2 -- traps*/ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - if (obvious) - a_ptr->oflags2 |= (1L << i); - else - a_ptr->flags2 |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - if (obvious) - a_ptr->oflags3 |= (1L << i); - else - a_ptr->flags3 |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - if (obvious) - a_ptr->oflags4 |= (1L << i); - else - a_ptr->flags4 |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags5[i])) - { - if (obvious) - a_ptr->oflags5 |= (1L << i); - else - a_ptr->flags5 |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) + /* 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))) { - if (streq(what, esp_flags[i])) - { - if (obvious) - a_ptr->oesp |= (1L << i); - else - a_ptr->esp |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -5236,108 +5082,29 @@ errr init_ab_info_txt(FILE *fp) */ static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool_ obvious) { - int i; assert(n < FLAG_RARITY_MAX); - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags1[i])) - { - if (obvious) - e_ptr->oflags1[n] |= (1L << i); - else - e_ptr->flags1[n] |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - if (obvious) - e_ptr->oflags2[n] |= (1L << i); - else - e_ptr->flags2[n] |= (1L << i); - return (0); - } - } - - /* Check flags2 -- traps */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - if (obvious) - e_ptr->oflags2[n] |= (1L << i); - else - e_ptr->flags2[n] |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - if (obvious) - e_ptr->oflags3[n] |= (1L << i); - else - e_ptr->flags3[n] |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - if (obvious) - e_ptr->oflags4[n] |= (1L << i); - else - e_ptr->flags4[n] |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags5[i])) - { - if (obvious) - e_ptr->oflags5[n] |= (1L << i); - else - e_ptr->flags5[n] |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) - { - if (streq(what, esp_flags[i])) - { - if (obvious) - e_ptr->oesp[n] |= (1L << i); - else - e_ptr->esp[n] |= (1L << i); - return (0); - } - } - - /* Check ego_flags */ - for (i = 0; i < 32; i++) + /* 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))) { - if (streq(what, ego_flags[i])) - { - e_ptr->fego[n] |= (1L << i); - return (0); - } + return (0); } /* Oops */ @@ -5349,97 +5116,25 @@ static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bool_ need) { - int i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) + /* 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))) { - if (streq(what, k_info_flags1[i])) - { - if (need) - e_ptr->need_flags1 |= (1L << i); - else - e_ptr->forbid_flags1 |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - if (need) - e_ptr->need_flags2 |= (1L << i); - else - e_ptr->forbid_flags2 |= (1L << i); - return (0); - } - } - - /* Check flags2 -- traps */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - if (need) - e_ptr->need_flags2 |= (1L << i); - else - e_ptr->forbid_flags2 |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - if (need) - e_ptr->need_flags3 |= (1L << i); - else - e_ptr->forbid_flags3 |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - if (need) - e_ptr->need_flags4 |= (1L << i); - else - e_ptr->forbid_flags4 |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags5[i])) - { - if (need) - e_ptr->need_flags5 |= (1L << i); - else - e_ptr->forbid_flags5 |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) - { - if (streq(what, esp_flags[i])) - { - if (need) - e_ptr->need_esp |= (1L << i); - else - e_ptr->forbid_esp |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -5813,108 +5508,35 @@ errr init_e_info_txt(FILE *fp) */ static bool_ grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, char c) { - int i; - u32b *f1, *f2, *f3, *f4, *f5, *esp; - - if (c == 'F') - { - f1 = &ra_ptr->flags1; - f2 = &ra_ptr->flags2; - f3 = &ra_ptr->flags3; - f4 = &ra_ptr->flags4; - f5 = &ra_ptr->flags5; - esp = &ra_ptr->esp; - } - else - { - f1 = &ra_ptr->aflags1; - f2 = &ra_ptr->aflags2; - f3 = &ra_ptr->aflags3; - f4 = &ra_ptr->aflags4; - f5 = &ra_ptr->aflags5; - esp = &ra_ptr->aesp; - } - - /* Check flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags1[i])) - { - *f1 |= (1L << i); - return (0); - } - } - - /* Check flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2[i])) - { - *f2 |= (1L << i); - return (0); - } - } - - /* Check flags2 -- traps */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags2_trap[i])) - { - *f2 |= (1L << i); - return (0); - } - } - - /* Check flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags3[i])) - { - *f3 |= (1L << i); - return (0); - } - } - - /* Check flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, k_info_flags4[i])) - { - *f4 |= (1L << i); - return (0); - } - } - - /* Check flags5 */ - for (i = 0; i < 32; i++) + 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))) { - if (streq(what, k_info_flags5[i])) - { - *f5 |= (1L << i); - return (0); - } - } - - /* Check esp_flags */ - for (i = 0; i < 32; i++) - { - if (streq(what, esp_flags[i])) - { - *esp |= (1L << i); - return (0); - } + return 0; } /* Check ego_flags */ - if (c == 'F') + if (regular) { - for (i = 0; i < 32; i++) + if (lookup_flags(what, flag_tie(&ra_ptr->fego, ego_flags))) { - if (streq(what, ego_flags[i])) - { - ra_ptr->fego |= (1L << i); - return (0); - } + return 0; } } @@ -6185,66 +5807,15 @@ errr init_ra_info_txt(FILE *fp) */ static errr grab_one_basic_flag(monster_race *r_ptr, cptr what) { - int i; - - /* Scan flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags1[i])) - { - r_ptr->flags1 |= (1L << i); - return (0); - } - } - - /* Scan flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags2[i])) - { - r_ptr->flags2 |= (1L << i); - return (0); - } - } - - /* Scan flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags3[i])) - { - r_ptr->flags3 |= (1L << i); - return (0); - } - } - - /* Scan flags7 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags7[i])) - { - r_ptr->flags7 |= (1L << i); - return (0); - } - } - - /* Scan flags8 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags8[i])) - { - r_ptr->flags8 |= (1L << i); - return (0); - } - } - - /* Scan flags9 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(&r_ptr->flags1, r_info_flags1), + flag_tie(&r_ptr->flags2, r_info_flags2), + flag_tie(&r_ptr->flags3, r_info_flags3), + flag_tie(&r_ptr->flags7, r_info_flags7), + flag_tie(&r_ptr->flags8, r_info_flags8), + flag_tie(&r_ptr->flags9, r_info_flags9))) { - if (streq(what, r_info_flags9[i])) - { - r_ptr->flags9 |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -6260,36 +5831,12 @@ static errr grab_one_basic_flag(monster_race *r_ptr, cptr what) */ static errr grab_one_spell_flag(monster_race *r_ptr, cptr what) { - int i; - - /* Scan flags4 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(&r_ptr->flags4, r_info_flags4), + flag_tie(&r_ptr->flags5, r_info_flags5), + flag_tie(&r_ptr->flags6, r_info_flags6))) { - if (streq(what, r_info_flags4[i])) - { - r_ptr->flags4 |= (1L << i); - return (0); - } - } - - /* Scan flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags5[i])) - { - r_ptr->flags5 |= (1L << i); - return (0); - } - } - - /* Scan flags6 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags6[i])) - { - r_ptr->flags6 |= (1L << i); - return (0); - } + return (0); } /* Oops */ @@ -6664,84 +6211,24 @@ errr init_r_info_txt(FILE *fp) */ static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) { - int i; - - /* Scan flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags1[i])) - { - if (add) - re_ptr->mflags1 |= (1L << i); - else - re_ptr->nflags1 |= (1L << i); - return (0); - } - } - - /* Scan flags2 */ - for (i = 0; i < 32; i++) + /* Dispatch to correct set of flags */ + u32b *f1 = add ? &re_ptr->mflags1 : &re_ptr->nflags1; + u32b *f2 = add ? &re_ptr->mflags2 : &re_ptr->nflags2; + u32b *f3 = add ? &re_ptr->mflags3 : &re_ptr->nflags3; + u32b *f7 = add ? &re_ptr->mflags7 : &re_ptr->nflags7; + u32b *f8 = add ? &re_ptr->mflags8 : &re_ptr->nflags8; + u32b *f9 = add ? &re_ptr->mflags9 : &re_ptr->nflags9; + + /* Lookup */ + if (lookup_flags(what, + flag_tie(f1, r_info_flags1), + flag_tie(f2, r_info_flags2), + flag_tie(f3, r_info_flags3), + flag_tie(f7, r_info_flags7), + flag_tie(f8, r_info_flags8), + flag_tie(f9, r_info_flags9))) { - if (streq(what, r_info_flags2[i])) - { - if (add) - re_ptr->mflags2 |= (1L << i); - else - re_ptr->nflags2 |= (1L << i); - return (0); - } - } - - /* Scan flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags3[i])) - { - if (add) - re_ptr->mflags3 |= (1L << i); - else - re_ptr->nflags3 |= (1L << i); - return (0); - } - } - - /* Scan flags7 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags7[i])) - { - if (add) - re_ptr->mflags7 |= (1L << i); - else - re_ptr->nflags7 |= (1L << i); - return (0); - } - } - - /* Scan flags8 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags8[i])) - { - if (add) - re_ptr->mflags8 |= (1L << i); - else - re_ptr->nflags8 |= (1L << i); - return (0); - } - } - - /* Scan flags9 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags9[i])) - { - if (add) - re_ptr->mflags9 |= (1L << i); - else - re_ptr->nflags9 |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -6757,45 +6244,18 @@ static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) */ static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) { - int i; - - /* Scan flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags4[i])) - { - if (add) - re_ptr->mflags4 |= (1L << i); - else - re_ptr->nflags4 |= (1L << i); - return (0); - } - } - - /* Scan flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags5[i])) - { - if (add) - re_ptr->mflags5 |= (1L << i); - else - re_ptr->nflags5 |= (1L << i); - return (0); - } - } + /* Dispatch to correct set of flags */ + u32b *f4 = add ? &re_ptr->mflags4 : &re_ptr->nflags4; + u32b *f5 = add ? &re_ptr->mflags5 : &re_ptr->nflags5; + u32b *f6 = add ? &re_ptr->mflags6 : &re_ptr->nflags6; - /* Scan flags6 */ - for (i = 0; i < 32; i++) + /* Lookup */ + if (lookup_flags(what, + flag_tie(f4, r_info_flags4), + flag_tie(f5, r_info_flags5), + flag_tie(f6, r_info_flags6))) { - if (streq(what, r_info_flags6[i])) - { - if (add) - re_ptr->mflags6 |= (1L << i); - else - re_ptr->nflags6 |= (1L << i); - return (0); - } + return (0); } /* Oops */ @@ -6810,72 +6270,24 @@ static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) */ static errr grab_one_ego_flag(monster_ego *re_ptr, cptr what, bool_ must) { - int i; - - /* Scan flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags1[i])) - { - if (must) re_ptr->flags1 |= (1L << i); - else re_ptr->hflags1 |= (1L << i); - return (0); - } - } - - /* Scan flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags2[i])) - { - if (must) re_ptr->flags2 |= (1L << i); - else re_ptr->hflags2 |= (1L << i); - return (0); - } - } - - /* Scan flags3 */ - for (i = 0; i < 32; i++) + /* Dispatch to correct set of flags */ + u32b *f1 = must ? &re_ptr->flags1 : &re_ptr->hflags1; + u32b *f2 = must ? &re_ptr->flags2 : &re_ptr->hflags2; + u32b *f3 = must ? &re_ptr->flags3 : &re_ptr->hflags3; + u32b *f7 = must ? &re_ptr->flags7 : &re_ptr->hflags7; + u32b *f8 = must ? &re_ptr->flags8 : &re_ptr->hflags8; + u32b *f9 = must ? &re_ptr->flags9 : &re_ptr->hflags9; + + /* Lookup */ + if (lookup_flags(what, + flag_tie(f1, r_info_flags1), + flag_tie(f2, r_info_flags2), + flag_tie(f3, r_info_flags3), + flag_tie(f7, r_info_flags7), + flag_tie(f8, r_info_flags8), + flag_tie(f9, r_info_flags9))) { - if (streq(what, r_info_flags3[i])) - { - if (must) re_ptr->flags3 |= (1L << i); - else re_ptr->hflags3 |= (1L << i); - return (0); - } - } - - /* Scan flags7 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags7[i])) - { - if (must) re_ptr->flags7 |= (1L << i); - else re_ptr->hflags7 |= (1L << i); - return (0); - } - } - - /* Scan flags8 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags8[i])) - { - if (must) re_ptr->flags8 |= (1L << i); - else re_ptr->hflags8 |= (1L << i); - return (0); - } - } - - /* Scan flags9 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags9[i])) - { - if (must) re_ptr->flags9 |= (1L << i); - else re_ptr->hflags9 |= (1L << i); - return (0); - } + return (0); } /* Oops */ @@ -7360,17 +6772,11 @@ errr init_re_info_txt(FILE *fp) */ static errr grab_one_trap_type_flag(trap_type *t_ptr, cptr what) { - s16b i; - - /* Check flags1 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, flag_tie(&t_ptr->flags, t_info_flags))) { - if (streq(what, t_info_flags[i])) - { - t_ptr->flags |= (1L << i); - return (0); - } + return (0); } + /* Oops */ msg_format("Unknown trap_type flag '%s'.", what); @@ -7537,28 +6943,13 @@ errr init_t_info_txt(FILE *fp) /* * Grab one flag for a dungeon type from a textual string */ -errr grab_one_dungeon_flag(u32b *flags1, u32b *flags2, cptr what) +errr grab_one_dungeon_flag(u32b *f1, u32b *f2, cptr what) { - int i; - - /* Scan flags1 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(f1, d_info_flags1), + flag_tie(f2, d_info_flags2))) { - if (streq(what, d_info_flags1[i])) - { - *flags1 |= (1L << i); - return (0); - } - } - - /* Scan flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, d_info_flags2[i])) - { - *flags2 |= (1L << i); - return (0); - } + return (0); } /* Oops */ @@ -7573,66 +6964,15 @@ errr grab_one_dungeon_flag(u32b *flags1, u32b *flags2, cptr what) */ static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule) { - int i; - - /* Scan flags1 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags1[i])) - { - d_ptr->rules[rule].mflags1 |= (1L << i); - return (0); - } - } - - /* Scan flags2 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags2[i])) - { - d_ptr->rules[rule].mflags2 |= (1L << i); - return (0); - } - } - - /* Scan flags3 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags3[i])) - { - d_ptr->rules[rule].mflags3 |= (1L << i); - return (0); - } - } - - /* Scan flags7 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(&d_ptr->rules[rule].mflags1, r_info_flags1), + flag_tie(&d_ptr->rules[rule].mflags2, r_info_flags2), + flag_tie(&d_ptr->rules[rule].mflags3, r_info_flags3), + flag_tie(&d_ptr->rules[rule].mflags7, r_info_flags7), + flag_tie(&d_ptr->rules[rule].mflags8, r_info_flags8), + flag_tie(&d_ptr->rules[rule].mflags9, r_info_flags9))) { - if (streq(what, r_info_flags7[i])) - { - d_ptr->rules[rule].mflags7 |= (1L << i); - return (0); - } - } - - /* Scan flags8 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags8[i])) - { - d_ptr->rules[rule].mflags8 |= (1L << i); - return (0); - } - } - - /* Scan flags9 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags9[i])) - { - d_ptr->rules[rule].mflags9 |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -7648,36 +6988,12 @@ static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byt */ static errr grab_one_spell_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule) { - int i; - - /* Scan flags4 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags4[i])) - { - d_ptr->rules[rule].mflags4 |= (1L << i); - return (0); - } - } - - /* Scan flags5 */ - for (i = 0; i < 32; i++) - { - if (streq(what, r_info_flags5[i])) - { - d_ptr->rules[rule].mflags5 |= (1L << i); - return (0); - } - } - - /* Scan flags6 */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, + flag_tie(&d_ptr->rules[rule].mflags4, r_info_flags4), + flag_tie(&d_ptr->rules[rule].mflags5, r_info_flags5), + flag_tie(&d_ptr->rules[rule].mflags6, r_info_flags6))) { - if (streq(what, r_info_flags6[i])) - { - d_ptr->rules[rule].mflags6 |= (1L << i); - return (0); - } + return 0; } /* Oops */ @@ -8229,9 +7545,6 @@ errr init_d_info_txt(FILE *fp) */ static errr grab_one_race_flag(owner_type *ow_ptr, int state, cptr what) { - /* int i; - cptr s; */ - /* Scan race flags */ unknown_shut_up = TRUE; if (!grab_one_race_allow_flag(ow_ptr->races[state], what)) @@ -8260,16 +7573,10 @@ static errr grab_one_race_flag(owner_type *ow_ptr, int state, cptr what) */ static errr grab_one_store_flag(store_info_type *st_ptr, cptr what) { - int i; - /* Scan store flags */ - for (i = 0; i < 32; i++) + if (lookup_flags(what, flag_tie(&st_ptr->flags1, st_info_flags1))) { - if (streq(what, st_info_flags1[i])) - { - st_ptr->flags1 |= (1L << i); - return (0); - } + return 0; } /* Oops */ -- cgit v1.2.3 From 2a2527a68ff4fb909e8ad8a07c6e548d329e8588 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Make ?*Remove Curse* show a message like ?Remove Curse --- src/cmd6.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cmd6.cc b/src/cmd6.cc index fce71215..16756331 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -3172,9 +3172,11 @@ void do_cmd_read_scroll(void) case SV_SCROLL_STAR_REMOVE_CURSE: { - remove_all_curse(); - - ident = TRUE; + if (remove_all_curse()) + { + msg_print("You feel as if someone is watching over you."); + ident = TRUE; + } break; } -- cgit v1.2.3 From faae2becd29ef9fac880b9932781fc41b996459d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Remove dead code --- src/melee1.cc | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/melee1.cc b/src/melee1.cc index bb4c06d1..fb2b1749 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -1353,7 +1353,7 @@ bool_ make_attack_normal(int m_idx, byte divis) int ap_cnt; int i, j, k, tmp, ac, rlev; - int do_cut, do_stun, do_vampire; + int do_cut, do_stun; s32b gold; @@ -1615,7 +1615,7 @@ bool_ make_attack_normal(int m_idx, byte divis) } /* Assume no cut or stun */ - do_cut = do_stun = do_vampire = 0; + do_cut = do_stun = 0; /* Describe the attack method */ switch (method) @@ -1668,8 +1668,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "bites you."; do_cut = 1; - if (magik(5) && iequals(r_ptr->name, "vampire")) - do_vampire = TRUE; touched = TRUE; sound(SOUND_BITE); break; @@ -2855,14 +2853,6 @@ bool_ make_attack_normal(int m_idx, byte divis) if (k) (void)set_stun(p_ptr->stun + k); } - /* Do vampiric thingies */ - if (do_vampire) - { - /* Change to resist(but never total protection) */ -/* if (magik(3) || (magik(m_ptr->level - (p_ptr->lev / 2)))) - gain_corruption("Vampire");*/ - } - if (explode) { sound(SOUND_EXPLODE); -- cgit v1.2.3 From 5adeda8d795191c8d8741795f1961cbe070828cb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Fix potential NPE when hallucinating --- src/monster2.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monster2.cc b/src/monster2.cc index 3debb27a..4649f446 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1252,7 +1252,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { hallu_race = &r_info[randint(max_r_idx - 2)]; } - while (hallu_race->flags1 & RF1_UNIQUE); + while ((hallu_race->flags1 & RF1_UNIQUE) && (hallu_race->name != nullptr)); strcpy(silly_name, hallu_race->name); } -- cgit v1.2.3 From c999ae0630fbdc08b3e95f4d9987a69315f9713b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Tidy up variable initialization in object_desc_aux --- src/object1.cc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index cb935973..78206f68 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1129,9 +1129,6 @@ std::string object_desc_aux(object_type *o_ptr, int pref, int mode) { bool_ hack_name = FALSE; - bool_ aware = FALSE; - bool_ known = FALSE; - bool_ append_name = FALSE; bool_ show_weapon = FALSE; @@ -1143,12 +1140,11 @@ std::string object_desc_aux(object_type *o_ptr, int pref, int mode) u32b f1, f2, f3, f4, f5, esp; object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - /* See if the object is "aware" */ - if (object_aware_p(o_ptr)) aware = TRUE; + bool_ aware = object_aware_p(o_ptr); /* See if the object is "known" */ - if (object_known_p(o_ptr)) known = TRUE; + bool_ known = object_known_p(o_ptr); /* Hack -- Extract the sub-type "indexx" */ auto const indexx = o_ptr->sval; -- cgit v1.2.3 From 197f36984724433a51343d299f4f3d31173f89aa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Theme: Fix final guardian artifact for LoM From comments in the files it seems that the intention was to use 'Curunuir', so switch from the non-existent RoF to that. --- lib/mods/theme/edit/d_info.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mods/theme/edit/d_info.txt b/lib/mods/theme/edit/d_info.txt index 7a8cbcdc..bfdf6142 100644 --- a/lib/mods/theme/edit/d_info.txt +++ b/lib/mods/theme/edit/d_info.txt @@ -414,7 +414,7 @@ L:89:100:89:0:89:0 A:97:100:56:0:56:0:97:97 O:20:20:20:20 F:RANDOM_TOWNS | FLAT | NO_STREAMERS -F:FINAL_GUARDIAN_789 | FINAL_ARTIFACT_228 +F:FINAL_GUARDIAN_789 | FINAL_ARTIFACT_193 F:FILL_METHOD_0 R:60:3 M:CAN_FLY -- cgit v1.2.3 From f271b4a96b231b6a399d93d2d36bf397c18a42e2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Fix missing newlines in k_info description texts --- src/init1.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 2a8c8c3c..5decdfaa 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3735,8 +3735,14 @@ errr init_k_info_txt(FILE *fp) /* Acquire the text */ s = buf + 2; - /* Append description */ - strappend(&k_ptr->text, s); + if (!k_ptr->text) + { + k_ptr->text = my_strdup(s); + } + else + { + strappend(&k_ptr->text, format("\n%s", s)); + } /* Next... */ continue; -- cgit v1.2.3 From da6a80380dfdc4c6c6a3021cbd76e5b54fad842c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Add a file to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a052f12e..c3a196db 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ lib*.a *.#* CMakeFiles CMakeCache.txt +CMakeLists.txt.user cmake_install.cmake install_manifest.txt Makefile -- cgit v1.2.3 From 443761e4649390291d5e06bb9dba2540ac5e9fd9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Fix occasional overflow when monster speaks --- src/melee2.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/melee2.cc b/src/melee2.cc index b3aa5c61..5a643132 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -6330,7 +6330,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (player_has_los_bold(oy, ox) && (r_ptr->flags2 & RF2_CAN_SPEAK)) { char m_name[80]; - char monmessage[80]; + char monmessage[1024]; /* Acquire the monster name/poss */ if (m_ptr->ml) -- cgit v1.2.3 From 03f2aa05b89e8f5c5e360f1b2000ac572deae65e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Fix typos in r_info.txt --- lib/edit/r_info.txt | 2 +- lib/mods/theme/edit/r_info.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 5c93f1f6..afb225c1 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -15750,7 +15750,7 @@ B:BITE:HURT:4d6 B:BITE:HURT:4d6 B:BITE:HURT:4d6 F:FORCE_SLEEP | AQUATIC | COLD_BLOOD | -F:ANIMAL MORTAL | BASEANGBAND +F:ANIMAL | MORTAL | BASEANGBAND D:A very large carnivorous fish. N:899:Aquatic golem diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index 18bf6643..d5696b9b 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -9985,7 +9985,7 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:DROP_1D2 DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_MOUNTAIN | +F:DROP_1D2 | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_MOUNTAIN | F:BASH_DOOR | F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI S:1_IN_9 | @@ -15734,7 +15734,7 @@ B:BITE:HURT:4d6 B:BITE:HURT:4d6 B:BITE:HURT:4d6 F:FORCE_SLEEP | AQUATIC | COLD_BLOOD | -F:ANIMAL MORTAL | BASEANGBAND +F:ANIMAL | MORTAL | BASEANGBAND D:A very large carnivorous fish. N:899:Aquatic golem @@ -19006,4 +19006,4 @@ F:NO_FEAR | NO_STUN | NO_CUT | NO_SLEEP | NO_CONF | RES_TELE F:RES_NETH | AURA_FIRE | STUPID | EMPTY_MIND | NONLIVING F:SPECIAL_GENE | FORCE_DEPTH | SUSCEP_COLD D:An ensorcelled machine of Saruman's creation, this gnarled -D:totem of blackened steel defends Orthanc from intruders. \ No newline at end of file +D:totem of blackened steel defends Orthanc from intruders. -- cgit v1.2.3 From 17b80947b08764700c4162e443fc6956b758486d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Reformat flags in *.txt files to be more tool-friendly This means we have a *lot* of added lines, but on the upside it's much simpler to use simple text-based tools and we get rid of a lot of purely boilerplate code --- lib/edit/a_info.txt | 2764 +++- lib/edit/d_info.txt | 265 +- lib/edit/e_info.txt | 888 +- lib/edit/f_info.txt | 781 +- lib/edit/k_info.txt | 1028 +- lib/edit/ow_info.txt | 607 +- lib/edit/p_info.txt | 478 +- lib/edit/r_info.txt | 25919 ++++++++++++++++++++++++++++--------- lib/edit/ra_info.txt | 6 +- lib/edit/re_info.txt | 238 +- lib/edit/s_info.txt | 3 +- lib/edit/set_info.txt | 35 +- lib/edit/st_info.txt | 69 +- lib/edit/tr_info.txt | 607 +- lib/mods/theme/edit/a_info.txt | 3326 ++++- lib/mods/theme/edit/d_info.txt | 397 +- lib/mods/theme/edit/e_info.txt | 1614 ++- lib/mods/theme/edit/f_info.txt | 1054 +- lib/mods/theme/edit/k_info.txt | 1314 +- lib/mods/theme/edit/ow_info.txt | 2137 ++- lib/mods/theme/edit/p_info.txt | 780 +- lib/mods/theme/edit/r_info.txt | 24914 +++++++++++++++++++++++++++-------- lib/mods/theme/edit/ra_info.txt | 11 +- lib/mods/theme/edit/re_info.txt | 238 +- lib/mods/theme/edit/s_info.txt | 3 +- lib/mods/theme/edit/set_info.txt | 139 +- lib/mods/theme/edit/st_info.txt | 75 +- lib/mods/theme/edit/tr_info.txt | 607 +- src/init1.cc | 878 +- 29 files changed, 54800 insertions(+), 16375 deletions(-) diff --git a/lib/edit/a_info.txt b/lib/edit/a_info.txt index 2e9c38b2..a586b5ff 100644 --- a/lib/edit/a_info.txt +++ b/lib/edit/a_info.txt @@ -32,8 +32,12 @@ N:1:of Galadriel I:39:100:4 W:20:10:10:10000 P:0:1d1:0:0:0 -F:ACTIVATE | SEARCH | LITE3 | LUCK -F:INSTA_ART | HIDE_TYPE +F:ACTIVATE +F:HIDE_TYPE +F:INSTA_ART +F:LITE3 +F:LUCK +F:SEARCH a:LIGHT D:A small crystal phial, with the light of Earendil's Star contained inside. D:Its light is imperishable, and near it darkness cannot endure. @@ -45,8 +49,14 @@ N:2:of Elendil I:39:101:1 W:30:25:5:32500 P:0:1d1:0:0:0 -F:ACTIVATE | SEE_INVIS | HOLD_LIFE | -F:INSTA_ART | SPEED | LITE3 | LITE1 | HIDE_TYPE +F:ACTIVATE +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:LITE1 +F:LITE3 +F:SEE_INVIS +F:SPEED a:MAP_LIGHT Z:detect curses D:The shining Star of the West, a famed heirloom of Elendil's house. @@ -59,8 +69,18 @@ N:3:of Thrain I:39:102:3 W:50:50:5:50000 P:0:1d1:0:0:0 -F:ACTIVATE | SEE_INVIS | HOLD_LIFE | RES_CHAOS | HIDE_TYPE | LUCK -F:INSTA_ART | SPEED | RES_LITE | RES_DARK | ESP_ORC | LITE3 +F:ACTIVATE +F:ESP_ORC +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:LITE3 +F:LUCK +F:RES_CHAOS +F:RES_DARK +F:RES_LITE +F:SEE_INVIS +F:SPEED a:THRAIN D:A great globe seemingly filled with moonlight, the famed Heart of the D:Mountain, which splinters the light that falls upon it into a thousand @@ -72,9 +92,11 @@ D:glowing shards. N:4:of Carlammas I:40:10:2 W:50:10:3:60000 -F:CON | HIDE_TYPE | -F:ACTIVATE | RES_FIRE | +F:ACTIVATE +F:CON +F:HIDE_TYPE F:INSTA_ART +F:RES_FIRE a:PROT_EVIL D:A fiery circle of bronze, with mighty spells to ward off evil. @@ -84,10 +106,19 @@ D:A fiery circle of bronze, with mighty spells to ward off evil. N:5:of Ingwe I:40:11:3 W:65:30:3:90000 -F:INT | WIS | CHR | SEARCH | INFRA | HIDE_TYPE | -F:SEE_INVIS | FREE_ACT | ACTIVATE | -F:RES_ACID | RES_COLD | RES_ELEC | +F:ACTIVATE +F:CHR +F:FREE_ACT +F:HIDE_TYPE +F:INFRA F:INSTA_ART +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:SEARCH +F:SEE_INVIS +F:WIS a:DISP_EVIL D:The ancient heirloom of Ingwe, high lord of the Vanyar, against whom nothing D:of evil could stand. @@ -98,9 +129,18 @@ D:of evil could stand. N:6:'Nauglamir' I:40:12:3 W:70:50:3:75000 -F:STR | CON | DEX | INFRA | HIDE_TYPE | RES_FEAR | -F:SEE_INVIS | FREE_ACT | REGEN | LITE3 | SPEED | +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:INFRA F:INSTA_ART +F:LITE3 +F:REGEN +F:RES_FEAR +F:SEE_INVIS +F:SPEED +F:STR D:A carencet of gold, set with a multitude of shining gems of D:Valinor. Despite its size, its weight seems as that of gossamer. @@ -112,10 +152,17 @@ D:Valinor. Despite its size, its weight seems as that of gossamer. N:7:of Flare I:45:52:3 W:50:35:2:75000 -F:STR | CON | CHR | HIDE_TYPE | -F:IM_FIRE | ACTIVATE | SEARCH | -F:ESP_THUNDERLORD | SEE_INVIS | FLY | +F:ACTIVATE +F:CHR +F:CON +F:ESP_THUNDERLORD +F:FLY +F:HIDE_TYPE +F:IM_FIRE F:INSTA_ART +F:SEARCH +F:SEE_INVIS +F:STR a:DIM_DOOR Z:swap position D:The mighty ring of the Thunderlord Flare that makes the wearer @@ -129,9 +176,20 @@ D:of Thunderlords. N:8:of Barahir I:45:32:1 W:50:25:2:75000 -F:STR | INT | WIS | DEX | CON | CHR | STEALTH | HIDE_TYPE | -F:RES_POIS | RES_DARK | ACTIVATE | SEE_INVIS | SEARCH | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:HIDE_TYPE F:INSTA_ART +F:INT +F:RES_DARK +F:RES_POIS +F:SEARCH +F:SEE_INVIS +F:STEALTH +F:STR +F:WIS a:BARAHIR D:A ring shaped into twinned serpents with eyes of emerald meeting beneath D:a crown of flowers, an ancient treasure of Isildur's house. @@ -142,9 +200,14 @@ D:a crown of flowers, an ancient treasure of Isildur's house. N:9:of Tulkas I:45:33:4 W:70:50:2:175000 -F:STR | DEX | CON | HIDE_TYPE | -F:ACTIVATE | SPEED | ESP_EVIL | +F:ACTIVATE +F:CON +F:DEX +F:ESP_EVIL +F:HIDE_TYPE F:INSTA_ART +F:SPEED +F:STR a:TULKAS D:The treasure of Tulkas, most fleet and wrathful of the Valar. @@ -155,11 +218,28 @@ N:10:of Power 'Narya' I:45:34:1 W:70:30:2:100000 P:0:1d1:6:6:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | FREE_ACT | SEE_INVIS | -F:SUST_STR | SUST_CON | SUST_WIS | SUST_CHR | SPECIAL_GENE | -F:IM_FIRE | RES_NETHER | RES_FEAR | REGEN | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IM_FIRE F:INSTA_ART +F:INT +F:LUCK +F:REGEN +F:RES_FEAR +F:RES_NETHER +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_STR +F:SUST_WIS +F:WIS a:NARYA D:The Ring of Fire, set with a ruby that glows like flame. Narya is one D:of the three Rings of Power created by the Elves and hidden by them from @@ -172,11 +252,27 @@ N:11:of Power 'Nenya' I:45:35:2 W:80:40:2:200000 P:0:1d1:9:9:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | -F:SUST_INT | SUST_WIS | SUST_CHR | -F:IM_COLD | RES_BLIND | STEALTH | ESP_ALL | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:ESP_ALL +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_COLD F:INSTA_ART +F:INT +F:LUCK +F:RES_BLIND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:STR +F:SUST_CHR +F:SUST_INT +F:SUST_WIS +F:WIS a:NENYA D:The Ring of Adamant, with a pure white stone as centrepiece. Nenya is one D:of the three Rings of Power created by the Elves and hidden by them from @@ -189,12 +285,29 @@ N:12:of Power 'Vilya' I:45:36:3 W:90:50:2:300000 P:0:1d1:12:12:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | -F:FEATHER | SLOW_DIGEST | REGEN | -F:SUST_STR | SUST_DEX | SUST_CON | -F:IM_ELEC | RES_POIS | RES_DISEN | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_ELEC F:INSTA_ART +F:INT +F:LUCK +F:REGEN +F:RES_DISEN +F:RES_POIS +F:SEE_INVIS +F:SLOW_DIGEST +F:SPEED +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR +F:WIS a:VILYA D:The Ring of Sapphire, with clear blue gems that shine like stars, D:glittering untouchable despite all that Sauron ever wrought. Vilya is @@ -208,15 +321,45 @@ N:13:of Power 'The One Ring' I:45:37:5 W:100:100:2:5000000 P:0:1d1:15:15:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | -F:ACTIVATE | AUTO_CURSE | HEAVY_CURSE | INVIS | SPELL | MANA | -F:SEE_INVIS | REGEN | FREE_ACT | CURSED | CURSE_NO_DROP | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | PERMA_CURSE | -F:SUST_STR | SUST_DEX | SUST_CON | -F:SUST_INT | SUST_WIS | SUST_CHR | -F:RES_BLIND | RES_POIS | RES_DISEN | RES_NETHER | ESP_ALL | -F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP | +F:ACTIVATE +F:AUTO_CURSE +F:CHR +F:CON +F:CURSED +F:CURSE_NO_DROP +F:DEX +F:DRAIN_EXP +F:DRAIN_HP +F:DRAIN_MANA +F:ESP_ALL +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE F:INSTA_ART +F:INT +F:INVIS +F:MANA +F:PERMA_CURSE +F:REGEN +F:RES_BLIND +F:RES_DISEN +F:RES_NETHER +F:RES_POIS +F:SEE_INVIS +F:SPEED +F:SPELL +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:WIS a:POWER Z:change the world D:"Ash nazg durbatuluk, ash nazg gimbatul, ash nazg thrakatuluk agh @@ -231,7 +374,8 @@ N:14:of Space-Time I:39:105:0 W:30:12:15:50000 P:0:1d1:0:0:0 -F:INSTA_ART | LITE1 +F:INSTA_ART +F:LITE1 D:A powerful stone that provides a strong light for any who D:wields it. It is rumoured that it may even protect the wearer from D:the passing of time. @@ -246,8 +390,11 @@ N:15:of Lore I:39:106:0 W:15:12:15:20000 P:0:1d1:0:0:0 -F:ACTIVATE | SPECIAL_GENE | EASY_USE | LITE1 | +F:ACTIVATE +F:EASY_USE F:INSTA_ART +F:LITE1 +F:SPECIAL_GENE a:STONE_LORE D:A great emerald that fills your mind with images of knowledge and dreadful D:understanding as you stare into its depths. @@ -259,10 +406,19 @@ N:16:'Razorback' I:38:6:0 W:90:9:500:400000 P:30:2d4:-4:0:25 -F:FREE_ACT | IM_ELEC | SPECIAL_GENE | -F:RES_FIRE | RES_COLD | RES_POIS | RES_LITE | RES_DARK | -F:LITE1 | SEE_INVIS | AGGRAVATE | ESP_DRAGON F:ACTIVATE +F:AGGRAVATE +F:ESP_DRAGON +F:FREE_ACT +F:IM_ELEC +F:LITE1 +F:RES_COLD +F:RES_DARK +F:RES_FIRE +F:RES_LITE +F:RES_POIS +F:SEE_INVIS +F:SPECIAL_GENE a:RAZORBACK D:A massive suit of heavy dragon scales deeply saturated with many colours. D:It throbs with angry energies, and you feel the raw elemental might of @@ -276,12 +432,33 @@ N:17:of Eternity I:38:30:0 W:100:16:600:500000 P:50:2d4:-8:0:35 -F:HOLD_LIFE | REGEN | ESP_DRAGON | -F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FEATHER | FLY | -F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK | ULTIMATE | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_BLIND | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SPECIAL_GENE F:ACTIVATE +F:ESP_DRAGON +F:FEATHER +F:FLY +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_BLIND +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:RES_SHARDS +F:RES_SOUND +F:SPECIAL_GENE +F:ULTIMATE a:BLADETURNER D:A suit of adamant, set with scales of every colour, surrounded in a nimbus D:of perfectly untramelled yet inextricably intermingled and utterly mastered @@ -294,9 +471,20 @@ N:18:of Melkor I:22:2:-4 W:65:45:200:100000 P:0:4d6:12:24:0 -F:STEALTH | WIS | CURSED | HEAVY_CURSE | TY_CURSE | ESP_GOOD | -F:DRAIN_MANA | DRAIN_HP | -F:RES_DARK | RES_BLIND | RES_LITE | RES_NETHER | BRAND_POIS | RES_CONF +F:BRAND_POIS +F:CURSED +F:DRAIN_HP +F:DRAIN_MANA +F:ESP_GOOD +F:HEAVY_CURSE +F:RES_BLIND +F:RES_CONF +F:RES_DARK +F:RES_LITE +F:RES_NETHER +F:STEALTH +F:TY_CURSE +F:WIS D:The mighty spear used once by Melkor to slay the trees of Valinor. @@ -306,10 +494,19 @@ N:19:'Soulkeeper' I:37:30:2 W:75:9:420:300000 P:40:2d4:-4:0:20 -F:CON | -F:HOLD_LIFE | SUST_CON | ESP_UNDEAD | RES_CONF | RES_FEAR | -F:RES_ACID | RES_COLD | RES_DARK | RES_NETHER | RES_NEXUS | RES_CHAOS | F:ACTIVATE +F:CON +F:ESP_UNDEAD +F:HOLD_LIFE +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_FEAR +F:RES_NETHER +F:RES_NEXUS +F:SUST_CON a:CURE_1000 D:A suit of imperishable adamant, with unconquerable strength to endure evil D:and disruptive magics, that protects the life force of its wearer as @@ -322,9 +519,14 @@ N:20:of Isildur I:37:15:1 W:30:3:300:50000 P:25:2d4:0:0:25 -F:CON | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_SOUND | RES_CONF | RES_NEXUS +F:CON +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FIRE +F:RES_NEXUS +F:RES_SOUND D:A gleaming steel suit covering the wearer from neck to foot, with runes of D:warding and stability deeply engraved into its surface. @@ -335,8 +537,17 @@ N:21:of the Rohirrim I:37:9:2 W:30:3:200:30000 P:19:1d4:0:0:15 -F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_CONF | RES_SOUND +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_SOUND +F:SPEED +F:STR D:A stiff suit of armour composed of small metal plates sewn to an D:inner layer of heavy canvas, and covered with a second layer of D:cloth. Within it is the spirit of Eorl the Young, matchless in combat. @@ -348,11 +559,19 @@ N:22:'Belegennon' I:37:20:4 W:40:10:150:135000 P:28:1d4:-1:0:20 -F:STEALTH | WIS | INT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:HOLD_LIFE | RES_DARK | RES_FEAR | -F:SEE_INVIS | F:ACTIVATE +F:HOLD_LIFE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SEE_INVIS +F:STEALTH +F:WIS a:BELEGENNON D:This wondrous suit of fine-linked chain shimmers as though of pure silver. D:It stands untouched amidst the fury of the elements, and a power of @@ -365,9 +584,17 @@ N:23:of Celeborn I:37:25:4 W:40:3:250:150000 P:35:2d4:-3:0:25 -F:STR | CHR | HIDE_TYPE | ESP_ORC -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK | -F:RES_DISEN | ACTIVATE +F:ACTIVATE +F:CHR +F:ESP_ORC +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:STR a:GENOCIDE D:A shimmering suit of true-silver, forged long ago by dwarven smiths of D:legend. It gleams with purest white as you gaze upon it, and mighty are @@ -380,8 +607,15 @@ N:24:of Arvedui I:37:4:2 W:20:3:220:32000 P:14:1d4:-2:0:15 -F:STR | CHR | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SHARDS | RES_NEXUS +F:CHR +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_NEXUS +F:RES_SHARDS +F:STR D:A hauberk, leggings, and sleeves of interlocking steel rings, well padded D:with leather. You feel strong and tall as Arvedui, last king of Arnor, D:as you put it on. @@ -393,8 +627,14 @@ N:25:of Caspanion I:37:6:3 W:25:9:270:40000 P:16:1d4:-2:0:20 -F:INT | WIS | CON | HIDE_TYPE | -F:RES_ACID | RES_POIS | RES_CONF | ACTIVATE +F:ACTIVATE +F:CON +F:HIDE_TYPE +F:INT +F:RES_ACID +F:RES_CONF +F:RES_POIS +F:WIS a:DEST_DOOR D:A hauberk, leggings, and sleeves of interlocking steel rings, strategically D:reinforced at vital locations with a second layer of chain. Magics to @@ -407,11 +647,28 @@ N:26:of Marda I:36:16:5 W:70:3:80:80000 P:9:0d0:0:0:25 -F:FREE_ACT | RES_BLIND | RES_CONF | RES_FEAR | DRAIN_MANA | -F:REFLECT | RES_NEXUS | SH_FIRE | SUST_INT | SUST_CON | SUST_CHR | -F:ESP_THUNDERLORD | CON | CHR | INT | -F:RES_ACID | RES_ELEC | IM_COLD | RES_COLD | AGGRAVATE | HEAVY_CURSE | +F:AGGRAVATE +F:CHR +F:CON F:CURSED +F:DRAIN_MANA +F:ESP_THUNDERLORD +F:FREE_ACT +F:HEAVY_CURSE +F:IM_COLD +F:INT +F:REFLECT +F:RES_ACID +F:RES_BLIND +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FEAR +F:RES_NEXUS +F:SH_FIRE +F:SUST_CHR +F:SUST_CON +F:SUST_INT D:The flying suit of Marda, very powerful armour that protects D:the wearer from cold. Wonderful as this mighty D:armour is, beware wearing it, for it has been cursed by a @@ -425,9 +682,20 @@ N:27:of Trone I:36:16:4 W:30:3:80:65000 P:9:0d0:0:0:20 -F:REFLECT | RES_NEXUS | SH_FIRE | FLY | SPECIAL_GENE | -F:STEALTH | ESP_THUNDERLORD | CON | INT | SPEED | -F:RES_ACID | RES_ELEC | IM_FIRE | RES_COLD +F:CON +F:ESP_THUNDERLORD +F:FLY +F:IM_FIRE +F:INT +F:REFLECT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_NEXUS +F:SH_FIRE +F:SPECIAL_GENE +F:SPEED +F:STEALTH D:The flying suit of Trone. It protects the user from fire and D:imps are said to be less annoying with this on. @@ -438,8 +706,12 @@ N:28:'Thalkettoth' I:36:11:3 W:20:3:60:25000 P:11:1d1:-1:0:25 -F:DEX | SPEED | HIDE_TYPE | SPECIAL_GENE | -F:RES_ACID | RES_SHARDS +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_SHARDS +F:SPECIAL_GENE +F:SPEED D:A tunic and skirt sewn with thick, overlapping scales of hardened D:leather whose wearer moves with agility and assurance. @@ -450,8 +722,19 @@ N:29:of Wormtongue I:30:2:3 W:40:20:20:50000 P:2:1d1:-10:-10:10 -F:INT | DEX | CHR | STEALTH | SEARCH | SPEED | HIDE_TYPE | -F:FREE_ACT | FEATHER | RES_DARK | RES_LITE | ESP_GOOD | ESP_UNIQUE +F:CHR +F:DEX +F:ESP_GOOD +F:ESP_UNIQUE +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:RES_DARK +F:RES_LITE +F:SEARCH +F:SPEED +F:STEALTH Z:panic hit D:The pair of boots used by Grima son of Galmod, also named the Wormtongue: D:a treacherous but persuasive counsellor, ever ready to betray, sneak, @@ -464,9 +747,14 @@ N:30:of Thorin I:34:3:4 W:30:6:65:60000 P:3:1d2:0:0:25 -F:STR | CON | HIDE_TYPE | -F:FREE_ACT | IM_ACID | RES_SOUND | -F:RES_CHAOS | ESP_ORC +F:CON +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:IM_ACID +F:RES_CHAOS +F:RES_SOUND +F:STR D:Invoking the strength and endurance of Thorin, King under the Mountain, D:this little metal shield is proof against the Element of Earth. @@ -477,7 +765,12 @@ N:31:of Celegorm I:34:4:0 W:30:3:60:12000 P:4:1d2:0:0:20 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_DARK +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:RES_LITE D:This shield emblazoned with a multitude of creatures not seen for ages D:once protected Celegorm, lord of Himlad; around it lies a mystic balance D:that contains the conflicts of the elements. @@ -489,8 +782,17 @@ N:32:of Anarion I:34:5:0 W:40:9:120:160000 P:5:1d3:0:0:20 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SUST_STR | SUST_INT | -F:SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | ESP_EVIL +F:ESP_EVIL +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS D:The great metal-bound shield of Anarion, son of Elendil, who Sauron found D:himself powerless to wither or diminish. @@ -501,9 +803,19 @@ N:33:of Hurin I:22:10:3 W:20:15:180:90000 P:0:2d6:12:20:0 -F:STR | CON | HIDE_TYPE | BRAND_ACID | RES_ACID | LITE1 | DRAIN_MANA | -F:SLAY_ORC | KILL_DEMON | SLAY_TROLL | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_ACID +F:CON +F:DRAIN_MANA +F:HIDE_TYPE +F:KILL_DEMON +F:LITE1 F:MUST2H +F:RES_ACID +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STR f:MUST2H a:HURIN D:Wielded by Hurin Thalion in the Fifth Battle of Beleriand, this @@ -516,12 +828,32 @@ N:34:of Morgoth I:33:50:125 W:100:1:20:10000000 P:0:1d1:0:0:0 -F:STR | INT | WIS | DEX | CON | CHR | INFRA | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:RES_LITE | RES_DARK | RES_CONF | RES_NEXUS | RES_NETHER | -F:LITE1 | SEE_INVIS | ESP_ALL | -F:CURSED | HEAVY_CURSE | PERMA_CURSE | -F:INSTA_ART | SPECIAL_GENE +F:CHR +F:CON +F:CURSED +F:DEX +F:ESP_ALL +F:HEAVY_CURSE +F:HIDE_TYPE +F:INFRA +F:INSTA_ART +F:INT +F:LITE1 +F:PERMA_CURSE +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:SEE_INVIS +F:SPECIAL_GENE +F:STR +F:WIS D:Two Silmarils of Feanor blaze from the thunderous crown of twisted D:iron. The corrupted metal feels at once as infernal as hellfire D:and as chilling as the Outer Darkness. One protrusion from the @@ -534,9 +866,18 @@ N:35:of Beruthiel I:33:10:-5 W:40:12:20:0 P:0:1d1:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | -F:FREE_ACT | SEE_INVIS | ESP_ANIMAL | ESP_EVIL | ESP_NONLIVING | ESP_ALL | -F:CURSED | AUTO_CURSE +F:AUTO_CURSE +F:CON +F:CURSED +F:DEX +F:ESP_ALL +F:ESP_ANIMAL +F:ESP_EVIL +F:ESP_NONLIVING +F:FREE_ACT +F:HIDE_TYPE +F:SEE_INVIS +F:STR D:The midnight-hued steel circlet of the sorceress-queen Beruthiel, which D:grants extraordinary powers of sight and awareness at a terrible physical D:cost. @@ -548,8 +889,13 @@ N:36:of Thranduil I:32:2:2 W:20:2:15:50000 P:2:0d0:0:0:10 -F:INT | WIS | HIDE_TYPE | -F:RES_BLIND | ESP_ORC | ESP_EVIL | ESP_TROLL +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:HIDE_TYPE +F:INT +F:RES_BLIND +F:WIS D:The hunting cap of King Thranduil, to whose ears come all the secrets of D:his forest domain. @@ -560,7 +906,11 @@ N:37:of Thengel I:32:3:3 W:10:2:20:22000 P:3:1d1:0:0:12 -F:WIS | CHR | RES_CONF | HIDE_TYPE | LUCK +F:CHR +F:HIDE_TYPE +F:LUCK +F:RES_CONF +F:WIS D:A ridged helmet made of steel, and embossed with scenes of valour in fine- D:engraved silver. It grants the wearer nobility, clarity of thought and D:understanding. @@ -572,9 +922,20 @@ N:38:of Hammerhand I:32:6:3 W:20:2:60:45000 P:6:1d3:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | SPECIAL_GENE | RES_FEAR | -F:SUST_STR | SUST_DEX | SUST_CON | -F:RES_ACID | RES_NEXUS | RES_COLD | RES_DARK | SLOW_DIGEST | +F:CON +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_FEAR +F:RES_NEXUS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR Z:berserk D:A great helm as steady as the heroes of the Westdike. Mighty were the D:blows of Helm, the Hammerhand! @@ -586,9 +947,21 @@ N:39:of Dor-Lomin I:32:7:4 W:40:12:75:300000 P:8:1d3:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_BLIND | -F:LITE1 | SEE_INVIS | ESP_DRAGON | ESP_THUNDERLORD | ACTIVATE +F:ACTIVATE +F:CON +F:DEX +F:ESP_DRAGON +F:ESP_THUNDERLORD +F:HIDE_TYPE +F:LITE1 +F:RES_ACID +F:RES_BLIND +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:SEE_INVIS +F:STR a:GORLIM D:The legendary dragon helm of Turin Turambar, an object of dread to the D:servants of Morgoth. @@ -599,8 +972,13 @@ N:40:'Holhenneth' I:32:5:2 W:20:5:75:100000 P:5:1d3:0:0:10 -F:INT | WIS | SEARCH | HIDE_TYPE | -F:RES_BLIND | SEE_INVIS | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:INT +F:RES_BLIND +F:SEARCH +F:SEE_INVIS +F:WIS a:DETECT_ALL D:A famous helm of forged iron granting extraordinary powers of mind and D:awareness. @@ -612,11 +990,26 @@ N:41:of Gorlim I:32:5:-5 W:20:5:75:0 P:5:1d3:25:25:10 -F:INT | WIS | SEARCH | HIDE_TYPE | SHOW_MODS | -F:SEE_INVIS | NO_MAGIC | HEAVY_CURSE | TY_CURSE -F:RES_DISEN | RES_FEAR | FREE_ACT | RES_ACID | RES_FIRE | RES_POIS | -F:IM_COLD | ACTIVATE | DRAIN_HP | -F:TELEPORT | CURSED +F:ACTIVATE +F:CURSED +F:DRAIN_HP +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_COLD +F:INT +F:NO_MAGIC +F:RES_ACID +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:TELEPORT +F:TY_CURSE +F:WIS a:GORLIM D:A headpiece, gaudy and barbaric, that betrayed a warrior when he most D:needed succor. @@ -628,9 +1021,23 @@ N:42:of Gondor I:33:11:3 W:40:40:30:125000 P:0:1d1:0:0:15 -F:STR | WIS | CON | HIDE_TYPE | SPEED | RES_CONF | RES_SOUND | -F:RES_COLD | RES_FIRE | RES_LITE | RES_BLIND | RES_ELEC | RES_CHAOS | -F:LITE1 | SEE_INVIS | REGEN | ACTIVATE +F:ACTIVATE +F:CON +F:HIDE_TYPE +F:LITE1 +F:REGEN +F:RES_BLIND +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STR +F:WIS a:CURE_700 D:The shining winged circlet brought by Elendil from dying Numenor, emblem of D:Gondor through an age of the world. @@ -643,10 +1050,23 @@ N:43:of Numenor I:33:12:3 W:60:30:40:50000 P:0:1d1:0:0:18 -F:INT | DEX | CHR | SEARCH | SPEED | HIDE_TYPE | -F:SEE_INVIS | FREE_ACT | RES_DARK | RES_BLIND | -F:RES_SHARDS | RES_SOUND | RES_LITE | RES_COLD | -F:LITE1 | ACTIVATE | DRAIN_MANA +F:ACTIVATE +F:CHR +F:DEX +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:LITE1 +F:RES_BLIND +F:RES_COLD +F:RES_DARK +F:RES_LITE +F:RES_SHARDS +F:RES_SOUND +F:SEARCH +F:SEE_INVIS +F:SPEED a:NUMENOR D:A crown of massive gold, set with wondrous jewels of thought and warding, D:worn by the kings of ancient Numenor. Its wearer may go into battle @@ -660,7 +1080,13 @@ N:44:'Colluin' I:35:1:0 W:5:45:10:40000 P:1:0d0:0:0:20 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | ACTIVATE | ESP_GOOD +F:ACTIVATE +F:ESP_GOOD +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS a:COLLUIN D:A cape worn by a hero from Valinor, a land utterly beyond the strife D:of Elements. @@ -672,8 +1098,13 @@ N:45:'Holcolleth' I:35:1:2 W:5:25:10:13000 P:1:0d0:0:0:4 -F:INT | WIS | SPEED | STEALTH | HIDE_TYPE | -F:RES_ACID | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:INT +F:RES_ACID +F:SPEED +F:STEALTH +F:WIS a:SLEEP D:This elven-grey mantle possesses great powers of tranquility and of D:concealment, and grants the wearer the knowledge and understanding of @@ -686,8 +1117,14 @@ N:46:of Thingol I:35:1:3 W:10:50:10:35000 P:1:0d0:0:0:18 -F:DEX | CHR | HIDE_TYPE | -F:FREE_ACT | RES_ACID | RES_FIRE | RES_COLD | ACTIVATE +F:ACTIVATE +F:CHR +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_FIRE a:RECHARGE D:A sable-hued cloak, with glowing elven-runes to restore magic showing calm D:and clear as moonlight on still water. @@ -699,7 +1136,10 @@ N:47:of Thorongil I:35:1:0 W:5:10:10:8000 P:1:0d0:0:0:10 -F:FREE_ACT | RES_ACID | SEE_INVIS | RES_FEAR +F:FREE_ACT +F:RES_ACID +F:RES_FEAR +F:SEE_INVIS D:A cloak of shimmering green and brown that grants sight beyond sight and D:shakes off holding magics, worn by Aragorn son of Arathorn in his youth D:as he adventured under the name of Thorongil. @@ -711,8 +1151,11 @@ N:48:'Colannon' I:35:1:3 W:5:20:10:11000 P:1:0d0:0:0:15 -F:STEALTH | SPEED | RES_NEXUS | -F:RES_ACID | ACTIVATE +F:ACTIVATE +F:RES_ACID +F:RES_NEXUS +F:SPEED +F:STEALTH a:TELEPORT D:A crystal-blue cape of fine silk worn by a silent messenger of D:the forces of Law. Somehow, its wearer is always able to escape @@ -725,8 +1168,21 @@ N:49:of Luthien I:35:6:2 W:40:40:5:55000 P:6:0d0:0:0:20 -F:INT | WIS | CHR | HIDE_TYPE | SPEED | STEALTH | INVIS | LUCK -F:RES_ACID | RES_FIRE | RES_COLD | SPECIAL_GENE | ACTIVATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:INT +F:INVIS +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_FIRE +F:SPECIAL_GENE +F:SPEED +F:SPELL_CONTAIN +F:STEALTH +F:WIELD_CAST +F:WIS a:REST_LIFE D:The opaque midnight folds, inset with a multitude of tiny diamonds, of D:this cloak swirl around you and you feel a hint, a fragment of the @@ -740,8 +1196,15 @@ N:50:of Tuor I:35:6:4 W:40:40:5:35000 P:6:0d0:0:0:12 -F:STEALTH | DEX | HIDE_TYPE | INVIS | WATER_BREATH -F:FREE_ACT | IM_ACID | SEE_INVIS | CLIMB +F:CLIMB +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IM_ACID +F:INVIS +F:SEE_INVIS +F:STEALTH +F:WATER_BREATH D:From the ruin of Gondolin did Tuor escape, through secret ways and travail, D:shielded by his cloak from a multitude of hostile eyes. @@ -751,7 +1214,10 @@ N:51:of Azaghal I:23:5:0 W:15:30:30:40000 P:0:2d5:12:14:0 -F:KILL_DRAGON | IM_FIRE | ESP_DRAGON | RES_FEAR +F:ESP_DRAGON +F:IM_FIRE +F:KILL_DRAGON +F:RES_FEAR D:The weapon of Azaghal when he wounded Glaurung. It is deadly D:when fighting dragons and is said to make the breaths of fire D:completely harmless. @@ -763,8 +1229,11 @@ N:52:'Cambeleg' I:31:1:2 W:10:6:5:36000 P:1:0d0:8:8:15 -F:STR | CON | HIDE_TYPE | -F:FREE_ACT | SHOW_MODS +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:SHOW_MODS +F:STR D:A hero's handgear that lends great prowess in battle. @@ -774,8 +1243,12 @@ N:53:'Cammithrim' I:31:1:0 W:10:3:5:30000 P:1:0d0:0:0:10 -F:FREE_ACT | RES_LITE | SUST_CON | LITE1 | ACTIVATE +F:ACTIVATE +F:FREE_ACT +F:LITE1 +F:RES_LITE F:SPECIAL_GENE +F:SUST_CON a:BO_MISS_1 D:These gloves glow so brightly as to light the way for their owner and cast D:magical bolts with great frequency. @@ -787,7 +1260,10 @@ N:54:'Paurhach' I:31:2:0 W:10:5:25:15000 P:2:1d1:0:0:15 -F:RES_FIRE | ACTIVATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:RES_FIRE +F:SPELL_CONTAIN +F:WIELD_CAST a:BO_FIRE_1 D:A fiery set of gauntlets that can even shoot fire from the user's D:hands. @@ -799,8 +1275,13 @@ N:55:'Paurnimmen' I:31:2:4 W:10:5:25:33000 P:2:1d1:0:0:15 -F:RES_COLD | ACTIVATE -F:SUST_CON | CON | REGEN | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CON +F:REGEN +F:RES_COLD +F:SPELL_CONTAIN +F:SUST_CON +F:WIELD_CAST a:BO_COLD_1 D:A set of handgear so icy as to be able to fire frost bolts. @@ -811,7 +1292,10 @@ N:56:'Pauraegen' I:31:2:0 W:10:5:25:11000 P:2:1d1:0:0:15 -F:RES_ELEC | ACTIVATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:RES_ELEC +F:SPELL_CONTAIN +F:WIELD_CAST a:BO_ELEC_1 D:A set of handgear with sparks surrounding it, able to fire D:bolts of electricity. @@ -823,7 +1307,10 @@ N:57:'Paurnen' I:31:2:0 W:10:5:25:12000 P:2:1d1:0:0:15 -F:RES_ACID | ACTIVATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:RES_ACID +F:SPELL_CONTAIN +F:WIELD_CAST a:BO_ACID_1 D:A set of handgear so corrosive that it may fire bolts of acid. @@ -834,9 +1321,22 @@ N:58:'Camlost' I:31:2:-3 W:10:20:25:0 P:2:1d1:-11:-12:0 -F:STR | DEX | HIDE_TYPE | DRAIN_MANA | -F:RES_POIS | IM_FIRE | IM_COLD | RES_DISEN | RES_NETHER | FREE_ACT | -F:AGGRAVATE | SHOW_MODS | HEAVY_CURSE | TY_CURSE | TELEPORT | CURSED +F:AGGRAVATE +F:CURSED +F:DEX +F:DRAIN_MANA +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_COLD +F:IM_FIRE +F:RES_DISEN +F:RES_NETHER +F:RES_POIS +F:SHOW_MODS +F:STR +F:TELEPORT +F:TY_CURSE D:A pair of gauntlets that sap combat ability, named after the empty hand D:of Beren that once clasped a Silmaril. @@ -847,8 +1347,13 @@ N:59:of Fingolfin I:31:5:4 W:40:15:40:110000 P:5:1d1:10:10:20 -F:DEX | HIDE_TYPE | LUCK -F:FREE_ACT | RES_ACID | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:RES_ACID +F:SHOW_MODS a:BO_MISS_2 Z:magic missile D:The hand-sheathing of Fingolfin, warrior-king of Elves and Men, who gave @@ -861,8 +1366,10 @@ N:60:of Feanor I:30:3:15 W:40:120:40:300000 P:3:1d1:0:0:20 -F:SPEED | HIDE_TYPE | -F:RES_NEXUS | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:RES_NEXUS +F:SPEED a:SPEED D:This wondrous pair of leather boots once sped Feanor, creator of the D:Silmarils and the mightiest of the Eldar, along the Grinding Ice and to @@ -875,9 +1382,16 @@ N:61:'Dal-i-thalion' I:30:2:5 W:10:25:20:40000 P:2:1d1:0:0:15 -F:DEX | HIDE_TYPE | CHR | SUST_CHR | -F:ACTIVATE | FREE_ACT | -F:RES_NETHER | RES_CHAOS | RES_CONF | SUST_CON +F:ACTIVATE +F:CHR +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_CHAOS +F:RES_CONF +F:RES_NETHER +F:SUST_CHR +F:SUST_CON a:CURE_POISON D:A pair of high-laced shoes, strong against the powers of corruption and D:withering, that grant the wearer extraordinary agility. @@ -889,7 +1403,12 @@ N:62:of Thror I:30:6:3 W:30:25:80:15000 P:6:1d1:0:0:20 -F:STR | CON | HIDE_TYPE | SPEED | RES_FEAR | CLIMB +F:CLIMB +F:CON +F:HIDE_TYPE +F:RES_FEAR +F:SPEED +F:STR D:Sturdy footwear of leather and steel as enduring as the long-suffering D:Dwarven King-in-exile who wore them. Of dwarven make, these boots will D:make their wearer completely at home in the mountains. @@ -907,9 +1426,20 @@ N:63:of Bard I:17:2:0 W:55:30:2:50000 P:0:8d4:20:15:0 -F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | KILL_DRAGON | -F:BRAND_ACID | BRAND_ELEC | BRAND_FIRE | BRAND_COLD | BRAND_POIS +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:KILL_DRAGON +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD D:Deadliest of arrows, imbued with elemental strength, this shaft is D:feared especially by the wyrmkin. @@ -920,8 +1450,16 @@ N:64:of Maedhros I:23:5:3 W:15:30:30:22500 P:0:2d5:12:15:0 -F:INT | DEX | HIDE_TYPE | SPEED | SPECIAL_GENE -F:SLAY_TROLL | SLAY_GIANT | FREE_ACT | SEE_INVIS | SHOW_MODS +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_TROLL +F:SPECIAL_GENE +F:SPEED D:A short thrusting blade with a large guard worn by Maedhros the Tall, D:eldest son of Feanor, and wielded with his left hand after the loss of D:his right hand in the pits of Thangorodrim. @@ -933,10 +1471,20 @@ N:65:'Angrist' I:23:4:4 W:20:80:12:125000 P:0:2d4:10:15:5 -F:DEX | HIDE_TYPE | STEALTH | SEARCH | BRAND_POIS | -F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | BRAND_ACID | -F:FREE_ACT | RES_DARK | SUST_DEX | SEE_INVIS | +F:BRAND_ACID +F:BRAND_POIS +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_DARK +F:SEARCH +F:SEE_INVIS F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH +F:SUST_DEX D:Forged from meteoric iron, this long chopping dagger slices through D:ordinary metal as easily as its title, "Iron Cleaver", suggests. @@ -947,7 +1495,12 @@ N:66:'Narthanc' I:23:4:0 W:4:100:12:12000 P:0:1d4:4:6:0 -F:BRAND_FIRE | RES_FIRE | ACTIVATE | SHOW_MODS | LITE1 | LEVELS +F:ACTIVATE +F:BRAND_FIRE +F:LEVELS +F:LITE1 +F:RES_FIRE +F:SHOW_MODS a:BO_FIRE_1 D:A fiery dagger finely balanced for deadly throws. @@ -958,7 +1511,11 @@ N:67:'Nimthanc' I:23:4:0 W:3:100:12:11000 P:0:1d4:4:6:0 -F:BRAND_COLD | RES_COLD | ACTIVATE | SHOW_MODS | LEVELS +F:ACTIVATE +F:BRAND_COLD +F:LEVELS +F:RES_COLD +F:SHOW_MODS a:BO_COLD_1 D:A frosty dagger finely balanced for deadly throws. @@ -969,7 +1526,11 @@ N:68:'Dethanc' I:23:4:0 W:5:100:12:13000 P:0:1d4:4:6:0 -F:BRAND_ELEC | RES_ELEC | ACTIVATE | SHOW_MODS | LEVELS +F:ACTIVATE +F:BRAND_ELEC +F:LEVELS +F:RES_ELEC +F:SHOW_MODS a:BO_ELEC_1 D:A dagger covered in sparks and finely balanced for deadly throws. @@ -980,7 +1541,12 @@ N:69:of Rilia I:23:4:0 W:5:40:12:35000 P:0:2d4:4:3:0 -F:SLAY_ORC | RES_POIS | RES_DISEN | ACTIVATE | SHOW_MODS | BRAND_POIS +F:ACTIVATE +F:BRAND_POIS +F:RES_DISEN +F:RES_POIS +F:SHOW_MODS +F:SLAY_ORC a:BA_POIS_1 D:A large stiletto dagger that glistens with odourless poison, to which the D:wearer seems oddly immune. @@ -992,10 +1558,18 @@ N:70:'Belangil' I:23:4:2 W:10:40:12:50000 P:0:2d4:6:9:0 -F:DEX | HIDE_TYPE | SPEED | BLOWS | -F:BRAND_COLD | RES_COLD | -F:SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS | BRAND_POIS +F:ACTIVATE +F:BLOWS +F:BRAND_COLD +F:BRAND_POIS +F:DEX +F:HIDE_TYPE +F:REGEN +F:RES_COLD +F:SEE_INVIS +F:SHOW_MODS +F:SLOW_DIGEST +F:SPEED a:BELANGIL D:A frosty dagger surrounded in a nimbus of ice with a hilt of elk horn and D:an edge to wound the wind. @@ -1007,11 +1581,22 @@ N:71:'Calris' I:23:21:5 W:30:15:140:100000 P:0:5d4:-20:20:0 -F:CON | HIDE_TYPE | DRAIN_HP | -F:KILL_DRAGON | SLAY_EVIL | SLAY_DEMON | SLAY_TROLL | RES_DISEN | -F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | ESP_DRAGON | ESP_DEMON +F:AGGRAVATE F:AUTO_CURSE +F:CON F:COULD2H +F:CURSED +F:DRAIN_HP +F:ESP_DEMON +F:ESP_DRAGON +F:HEAVY_CURSE +F:HIDE_TYPE +F:KILL_DRAGON +F:RES_DISEN +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL f:COULD2H D:This sword has runes of power incised on its ornate hilt and a single D:blood channel that gleams coldly blue as you grasp this mighty weapon of @@ -1024,13 +1609,28 @@ N:72:'Aranruth' I:23:16:4 W:20:45:150:125000 P:0:3d5:20:12:0 -F:STR | DEX | CON | SUST_CON | SUST_STR -F:REGEN | FREE_ACT | SEE_INVIS | -F:RES_CHAOS | RES_NETHER | HOLD_LIFE | RES_FEAR | -F:RES_COLD | -F:SLAY_DEMON | SLAY_EVIL | SLAY_DRAGON | SLAY_UNDEAD | -F:BRAND_COLD | -F:SLOW_DIGEST | SHOW_MODS | HIDE_TYPE | BLESSED +F:BLESSED +F:BRAND_COLD +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:REGEN +F:RES_CHAOS +F:RES_COLD +F:RES_FEAR +F:RES_NETHER +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:STR +F:SUST_CON +F:SUST_STR D:The beautiful sword of Thingol with a hilt of gold and silver inlay, D:glistening icily enough to freeze the hearts of demons. You feel supple D:and lightfooted as you hold it. @@ -1042,9 +1642,20 @@ N:73:'Glamdring' I:23:16:1 W:20:20:150:40000 P:0:2d5:10:15:0 -F:SEARCH | HIDE_TYPE | BLESSED | SLAY_DEMON | -F:SLAY_EVIL | BRAND_FIRE | SLAY_ORC | RES_FIRE | RES_LITE | LITE1 | -F:SLOW_DIGEST | SHOW_MODS | ESP_ORC | SPECIAL_GENE | +F:BLESSED +F:BRAND_FIRE +F:ESP_ORC +F:HIDE_TYPE +F:LITE1 +F:RES_FIRE +F:RES_LITE +F:SEARCH +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_ORC +F:SLOW_DIGEST +F:SPECIAL_GENE D:This fiery, shining blade earned its sobriquet "Foe-Hammer" from dying orcs D:who dared to come near hidden Gondolin. @@ -1055,10 +1666,23 @@ N:74:'Aeglin' I:23:16:4 W:20:90:150:95000 P:0:2d5:12:16:0 -F:SEARCH | BLESSED | LITE1 | HIDE_TYPE | -F:BRAND_ELEC | SLAY_ORC | SLAY_GIANT | SLAY_TROLL | RES_FEAR | -F:RES_ELEC | RES_FIRE | RES_BLIND | ESP_ORC | ESP_GIANT | ESP_TROLL | -F:SLOW_DIGEST | SHOW_MODS +F:BLESSED +F:BRAND_ELEC +F:ESP_GIANT +F:ESP_ORC +F:ESP_TROLL +F:HIDE_TYPE +F:LITE1 +F:RES_BLIND +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:SEARCH +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLOW_DIGEST D:Like unto Orcrist and Glamdring, and like them long lost, this sword is D:continually coved in tiny arcs of captive lightning that flash and dance D:eerily in the globe of light they create. @@ -1070,9 +1694,20 @@ N:75:'Orcrist' I:23:16:3 W:20:20:150:40000 P:0:2d5:10:15:0 -F:SEARCH | ESP_ORC | SLAY_DRAGON | ESP_DRAGON | RES_COLD | HIDE_TYPE | -F:SLAY_EVIL | BRAND_COLD | SLAY_ORC | RES_COLD | LITE1 | RES_DARK | -F:SLOW_DIGEST | SHOW_MODS +F:BRAND_COLD +F:ESP_DRAGON +F:ESP_ORC +F:HIDE_TYPE +F:LITE1 +F:RES_COLD +F:RES_COLD +F:RES_DARK +F:SEARCH +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_ORC +F:SLOW_DIGEST D:This coldly gleaming blade is called simply "Biter", by orcs who came to D:know its power all too well. @@ -1083,10 +1718,22 @@ N:76:'Gurthang' I:23:25:2 W:30:30:200:100000 P:0:3d6:13:17:0 -F:STR | HIDE_TYPE | VORPAL | ESP_DRAGON | DRAIN_HP | -F:RES_FIRE | RES_POIS | BRAND_FIRE | BRAND_POIS | -F:KILL_DRAGON | SLAY_TROLL | FREE_ACT | SLOW_DIGEST | REGEN | SHOW_MODS +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_HP +F:ESP_DRAGON +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DRAGON F:MUST2H +F:REGEN +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS +F:SLAY_TROLL +F:SLOW_DIGEST +F:STR +F:VORPAL f:MUST2H D:A giant sword once wielded by mighty Turin, and a great dragonbane which D:bathed in Glaurung's blood: but beware, it will drink the blood of those @@ -1099,11 +1746,28 @@ N:77:'Zarcuthra' I:23:25:4 W:30:180:250:205000 P:0:4d6:19:21:0 -F:STR | CHR | INFRA | HIDE_TYPE | VORPAL | DRAIN_MANA | -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_FIRE | -F:SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | -F:RES_FIRE | RES_CHAOS | FREE_ACT | SEE_INVIS | AGGRAVATE | SHOW_MODS +F:AGGRAVATE +F:BRAND_FIRE +F:CHR +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:INFRA +F:KILL_DRAGON F:MUST2H +F:RES_CHAOS +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD +F:STR +F:VORPAL f:MUST2H D:Dark and deadly runes stand stark against the naked steel of this awesome D:weapon, and you feel a stunning power of slaying and rending as you @@ -1116,10 +1780,25 @@ N:78:'Mormegil' I:23:33:2 W:30:15:250:0 P:0:6d7:0:0:-20 -F:SPEED | IM_FIRE | RES_FIRE | BRAND_FIRE | RES_DISEN | RES_FEAR | -F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | LEVELS | TY_CURSE | -F:BLOWS | SLAY_DRAGON | RES_CHAOS | ANTIMAGIC_50 | -F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP +F:AGGRAVATE +F:ANTIMAGIC_50 +F:BLOWS +F:BRAND_FIRE +F:CURSED +F:DRAIN_EXP +F:DRAIN_HP +F:DRAIN_MANA +F:HEAVY_CURSE +F:IM_FIRE +F:LEVELS +F:RES_CHAOS +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:SHOW_MODS +F:SLAY_DRAGON +F:SPEED +F:TY_CURSE D:A foul, twisted sword with blackened spines and knobs, whose very name is a D:curse upon the lips of Elves and Men. @@ -1130,9 +1809,17 @@ N:79:'Gondricam' I:23:12:3 W:20:8:110:28000 P:0:1d7:10:11:0 -F:DEX | STEALTH | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | FEATHER | -F:SEE_INVIS | REGEN | SHOW_MODS +F:DEX +F:FEATHER +F:HIDE_TYPE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:STEALTH D:Famed sea-defender of Lebennin. A short, slightly curved chopping blade D:with a perfect edge shining cleanly in the sun, an object of hate to the D:men of Umbar who met it in combat. @@ -1144,9 +1831,18 @@ N:80:'Crisdurian' I:23:28:0 W:40:15:260:111000 P:0:4d5:18:19:0 -F:SLAY_DRAGON | SLAY_EVIL | SLAY_UNDEAD | SLAY_TROLL | SLAY_GIANT | -F:SLAY_ORC | SEE_INVIS | SHOW_MODS | VORPAL | BRAND_POIS | WOUNDING +F:BRAND_POIS F:MUST2H +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD +F:VORPAL +F:WOUNDING f:MUST2H D:A giant's weapon, with a long blade tall and straight thrusting out from a D:massive double-pronged hilt. On its blade are written doomspells against @@ -1159,9 +1855,13 @@ N:81:'Aglarang' I:23:20:5 W:35:25:50:40000 P:0:8d4:0:0:0 -F:DEX | TUNNEL | SPEED | HIDE_TYPE | -F:SUST_DEX | SHOW_MODS F:COULD2H +F:DEX +F:HIDE_TYPE +F:SHOW_MODS +F:SPEED +F:SUST_DEX +F:TUNNEL f:COULD2H D:An utterly perfect, cleanly chiselled sword, with a edge that effortlessly D:slices rock and bone, and spells to render the wearer lithe and nimble. It @@ -1174,10 +1874,24 @@ N:82:'Ringil' I:23:17:10 W:20:120:130:300000 P:0:4d5:22:25:0 -F:SPEED | HIDE_TYPE | RES_FEAR | BLESSED | -F:SLAY_EVIL | BRAND_COLD | SLAY_UNDEAD | KILL_DEMON | SLAY_TROLL | -F:FREE_ACT | RES_COLD | RES_LITE | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DEMON +F:LITE1 +F:REGEN +F:RES_COLD +F:RES_FEAR +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPEED a:BA_COLD_2 D:The weapon of Fingolfin, High King of the Noldor; it shines like a column D:of ice lit by light unquenchable. Morgoth came but unwillingly to meet it @@ -1190,10 +1904,26 @@ N:83:'Anduril' I:23:17:4 W:20:40:130:100000 P:0:3d5:10:15:5 -F:STR | DEX | HIDE_TYPE | RES_FEAR | FREE_ACT | BLESSED | LUCK -F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_FIRE | SUST_DEX | SEE_INVIS | ACTIVATE | SHOW_MODS | LITE1 -F:RES_DISEN | SPECIAL_GENE +F:ACTIVATE +F:BLESSED +F:BRAND_FIRE +F:DEX +F:FREE_ACT +F:FREE_ACT +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE +F:STR +F:SUST_DEX a:BA_FIRE_1 D:The famed "Flame of the West", the sword that was broken and is forged D:again. It glows with the essence of fire, its wearer is mighty in combat, @@ -1207,10 +1937,23 @@ N:84:'Anguirel' I:23:17:2 W:20:30:130:40000 P:0:2d5:8:12:0 -F:STR | CON | SPEED | HIDE_TYPE | -F:SLAY_EVIL | BRAND_ELEC | SLAY_DEMON | FREE_ACT | RES_ELEC | -F:RES_LITE | RES_DARK | SEE_INVIS | SHOW_MODS | VORPAL | WOUNDING -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:BRAND_ELEC +F:CON +F:CURSED +F:FREE_ACT +F:HIDE_TYPE +F:RES_DARK +F:RES_ELEC +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SPEED +F:STR +F:VORPAL +F:WOUNDING D:Forged of black galvorn by the Dark-Elven smith Eol, this blade has the D:living lightning trapped inside. @@ -1221,8 +1964,17 @@ N:85:'Elvagil' I:23:17:2 W:20:8:130:20000 P:0:2d5:5:7:0 -F:DEX | CHR | STEALTH | HIDE_TYPE | ESP_ORC | ESP_TROLL -F:SLAY_TROLL | SLAY_ORC | FEATHER | SEE_INVIS | SHOW_MODS +F:CHR +F:DEX +F:ESP_ORC +F:ESP_TROLL +F:FEATHER +F:HIDE_TYPE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH D:The "Singing Blade", whose wearer can slay Orcs and Trolls in the hidden D:and secret places of the earth. @@ -1233,7 +1985,11 @@ N:86:'Forasgil' I:23:7:0 W:15:8:40:15000 P:0:1d6:12:19:0 -F:SLAY_ANIMAL | BRAND_COLD | RES_COLD | RES_LITE | SHOW_MODS +F:BRAND_COLD +F:RES_COLD +F:RES_LITE +F:SHOW_MODS +F:SLAY_ANIMAL D:A slender, tapered blade whose wielder strikes icy blows with deadly D:accuracy. @@ -1244,9 +2000,17 @@ N:87:'Careth Asdriag' I:23:11:2 W:15:8:50:25000 P:0:2d7:6:8:0 -F:DEX | BLOWS | SPEED | CON | -F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_TROLL | SLAY_GIANT | -F:SLAY_ORC | SHOW_MODS | ESP_ANIMAL +F:BLOWS +F:CON +F:DEX +F:ESP_ANIMAL +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SPEED D:An heirloom of the Lords of Rhun far to the east, and a name of D:dismay to creatures natural and unnatural. @@ -1257,10 +2021,24 @@ N:88:'Sting' I:23:8:2 W:20:205:75:100000 P:0:1d6:7:8:0 -F:STR | DEX | CON | BLOWS | SPEED | LEVELS | -F:ESP_ORC | ESP_UNDEAD | ESP_SPIDER | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_ORC | SLAY_ANIMAL | LITE1 | -F:FREE_ACT | RES_LITE | SEE_INVIS | SHOW_MODS | +F:BLOWS +F:CON +F:DEX +F:ESP_ORC +F:ESP_SPIDER +F:ESP_UNDEAD +F:FREE_ACT +F:LEVELS +F:LITE1 +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_UNDEAD +F:SPEED +F:STR D:"I will give you a name, and I shall call you Sting." The perfect size D:for Bilbo, and stamped forever by the courage he found in Mirkwood, this D:sturdy little blade grants the wearer combat prowess and survival @@ -1273,11 +2051,20 @@ N:89:'Haradekket' I:23:18:2 W:20:8:130:111111 P:0:2d5:9:11:0 -F:INT | WIS | BLOWS | -F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DRAGON | SLAY_DEMON | -F:RES_CHAOS | RES_DISEN | RES_NEXUS | -F:SEE_INVIS | BLESSED | +F:BLESSED +F:BLOWS +F:INT +F:RES_CHAOS +F:RES_DISEN +F:RES_NEXUS +F:SEE_INVIS F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:WIS D:A damascened scimitar that seems wondrously easy to hold. Famed in song as D:the "Sickle of Harad", and a deadly foe to the undead. @@ -1288,8 +2075,14 @@ N:90:'Gilettar' I:23:10:2 W:20:8:80:35000 P:0:1d7:3:7:0 -F:BLOWS | HIDE_TYPE | -F:SLAY_ANIMAL | SLOW_DIGEST | REGEN | SHOW_MODS | SEE_INVIS | RES_DISEN +F:BLOWS +F:HIDE_TYPE +F:REGEN +F:RES_DISEN +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLOW_DIGEST D:A stubby blade worn by Beren, whose horn sounded of old in the glades of D:Brethil. @@ -1300,10 +2093,27 @@ N:91:'Doomcaller' I:23:30:0 W:70:25:180:250000 P:0:6d5:18:28:-50 -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_COLD | SLAY_TROLL | -F:SLAY_ORC | FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_CHAOS | SEE_INVIS | ESP_EVIL | AGGRAVATE | SHOW_MODS | -F:CHAOTIC | VORPAL | BRAND_FIRE | BRAND_POIS | SPECIAL_GENE +F:AGGRAVATE +F:BRAND_COLD +F:BRAND_FIRE +F:BRAND_POIS +F:CHAOTIC +F:ESP_EVIL +F:FREE_ACT +F:KILL_DRAGON +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE +F:VORPAL D:This weapon of wrath, cursed with a violent anger, dives hungrily D:into the flesh of its enemies. It gathers shadows of death into its D:owner as they inflict wounds that will never heal. @@ -1315,8 +2125,16 @@ N:92:'Vorpal Blade' I:23:17:2 W:50:30:150:250000 P:0:5d5:32:32:0 -F:VORPAL | SLAY_EVIL | WOUNDING -F:FREE_ACT | SEE_INVIS | SLOW_DIGEST | REGEN | SPEED | STR | DEX +F:DEX +F:FREE_ACT +F:REGEN +F:SEE_INVIS +F:SLAY_EVIL +F:SLOW_DIGEST +F:SPEED +F:STR +F:VORPAL +F:WOUNDING D:"One, two! One, two! And through, and through, the vorpal blade D:went snicker-snack!" @@ -1327,8 +2145,15 @@ N:93:of Theoden I:22:10:3 W:20:15:180:40000 P:0:2d6:8:10:0 -F:WIS | CON | HIDE_TYPE | -F:SLAY_DRAGON | ESP_EVIL | ESP_UNDEAD | SLOW_DIGEST | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:CON +F:ESP_EVIL +F:ESP_UNDEAD +F:HIDE_TYPE +F:SHOW_MODS +F:SLAY_DRAGON +F:SLOW_DIGEST +F:WIS a:DRAIN_2 D:The narrow axe head of this weapon, finely balanced by a crow's beak, D:would pierce even the armour of Smaug, and its wielder becomes aware of @@ -1341,8 +2166,10 @@ N:94:of Pain I:22:13:0 W:30:155:190:50000 P:0:9d6:0:30:0 -F:SHOW_MODS | LEVELS | DRAIN_MANA F:COULD2H +F:DRAIN_MANA +F:LEVELS +F:SHOW_MODS f:COULD2H D:The massive chopper that crowns this glaive glows blood-red and black; D:fell spells of annihilation swirl and dance as you swing death's myrmidon @@ -1355,10 +2182,18 @@ N:95:'Osondir' I:22:15:3 W:20:8:190:22000 P:0:3d5:6:9:0 -F:CHR | HIDE_TYPE | -F:BRAND_FIRE | SLAY_UNDEAD | SLAY_GIANT | RES_FIRE | RES_SOUND | -F:FEATHER | SEE_INVIS | SHOW_MODS | ESP_GIANT +F:BRAND_FIRE +F:CHR F:COULD2H +F:ESP_GIANT +F:FEATHER +F:HIDE_TYPE +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_UNDEAD f:COULD2H D:Lordly and tall did Osondir stand against the wrath of giants, and D:clear-eyed in barrows fell, wielding a halberd glowing ruby red. @@ -1370,10 +2205,20 @@ N:96:'Til-i-arc' I:22:8:2 W:20:15:160:32000 P:0:2d5:10:12:10 -F:INT | HIDE_TYPE | -F:BRAND_COLD | BRAND_FIRE | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | ESP_GIANT -F:RES_FIRE | RES_COLD | SUST_INT | SLOW_DIGEST | SHOW_MODS | +F:BRAND_COLD +F:BRAND_FIRE F:COULD2H +F:ESP_GIANT +F:HIDE_TYPE +F:INT +F:RES_COLD +F:RES_FIRE +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_GIANT +F:SLAY_TROLL +F:SLOW_DIGEST +F:SUST_INT f:COULD2H D:Within this long thrusting spear lie the spirits of frost giants and fire D:demons, who war forever, trapped by magely spells. @@ -1385,11 +2230,24 @@ N:97:'Aeglos' I:22:2:4 W:15:45:50:180000 P:0:3d6:15:25:5 -F:DEX | WIS | HIDE_TYPE | -F:BRAND_COLD | BRAND_ELEC | LITE1 | -F:SLAY_TROLL | SLAY_ORC | SLAY_GIANT | KILL_UNDEAD | -F:FREE_ACT | RES_COLD | RES_ELEC | RES_LITE | -F:SLOW_DIGEST | ACTIVATE | BLESSED | SHOW_MODS | +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:KILL_UNDEAD +F:LITE1 +F:RES_COLD +F:RES_ELEC +F:RES_LITE +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLOW_DIGEST +F:WIS a:BA_ELEC_2 D:The mighty spear of Gil-galad, famed as "Snow-point" in the songs of D:Elves, against which all the foul corruptions of Sauron dashed in vain. @@ -1401,13 +2259,29 @@ N:98:of Orome I:22:2:4 W:15:45:50:77777 P:0:4d6:15:15:0 -F:INT | WIS | SPEED | TUNNEL | INFRA | HIDE_TYPE | SEARCH | -F:BRAND_FIRE | -F:SLAY_GIANT | SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD | SLAY_DRAGON | -F:RES_FIRE | RES_LITE | HOLD_LIFE | RES_FEAR | -F:FEATHER | ESP_GIANT -F:SEE_INVIS | -F:ACTIVATE | BLESSED | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_FIRE +F:ESP_GIANT +F:FEATHER +F:HIDE_TYPE +F:HOLD_LIFE +F:INFRA +F:INT +F:RES_FEAR +F:RES_FIRE +F:RES_LITE +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_UNDEAD +F:SPEED +F:TUNNEL +F:WIS a:STONE_MUD D:The thrusting spear of wise Orome the Vala, strong against giants of frost, D:which can melt rock or flesh with ease. @@ -1419,8 +2293,16 @@ N:99:'Nimloth' I:22:2:3 W:15:12:50:30000 P:0:1d6:11:13:0 -F:STEALTH | RES_DARK | INFRA | SPEED | BLESSED | -F:BRAND_COLD | SLAY_UNDEAD | RES_COLD | SEE_INVIS | SHOW_MODS +F:BLESSED +F:BRAND_COLD +F:INFRA +F:RES_COLD +F:RES_DARK +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_UNDEAD +F:SPEED +F:STEALTH D:A thin spike of thrice-forged steel caps a straight sylvan shaft cut from D:a legendary tree; spells to break the will of the undead and strike cold D:fear into the hearts of foes lie on this perfectly balanced spear. @@ -1432,9 +2314,17 @@ N:100:of Eorlingas I:22:20:2 W:20:23:360:55000 P:0:3d8:3:21:0 -F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR | -F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | SEE_INVIS | SHOW_MODS +F:DEX +F:HIDE_TYPE F:MUST2H +F:RES_FEAR +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPEED +F:STR f:MUST2H D:"Forth Eorlingas!" To the field of Cormallen came Eorl the Young D:to save beleaguered Gondor, and from his lance fled massive trolls @@ -1447,11 +2337,26 @@ N:101:of Durin I:24:25:3 W:30:90:230:150000 P:0:4d4:10:20:15 -F:STR | CON | TUNNEL | HIDE_TYPE | ESP_EVIL | RES_FEAR | -F:SLAY_DRAGON | KILL_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_ACID | RES_FIRE | RES_LITE | RES_DARK | RES_CHAOS | SHOW_MODS | -F:BRAND_ACID | BRAND_FIRE +F:BRAND_ACID +F:BRAND_FIRE +F:CON +F:ESP_EVIL +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DEMON F:MUST2H +F:RES_ACID +F:RES_CHAOS +F:RES_DARK +F:RES_FEAR +F:RES_FIRE +F:RES_LITE +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_ORC +F:SLAY_TROLL +F:STR +F:TUNNEL f:MUST2H D:The twin massive axe heads of this ancient demon's dread gleam with D:mithril inlay, which tell sagas of endurance, invoking the powers of @@ -1464,10 +2369,25 @@ N:102:of Eonwe I:24:25:2 W:30:120:230:200000 P:0:4d4:15:18:8 -F:STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE | -F:SLAY_EVIL | BRAND_COLD | KILL_DEMON | SLAY_UNDEAD | ESP_NONLIVING -F:SLAY_ORC | FREE_ACT | IM_COLD | SEE_INVIS | ACTIVATE | -F:BLESSED | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:CHR +F:CON +F:DEX +F:ESP_NONLIVING +F:FREE_ACT +F:HIDE_TYPE +F:IM_COLD +F:INT +F:KILL_DEMON +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_UNDEAD +F:STR +F:WIS a:MASS_GENO D:The axe of Eonwe, leader of the Hosts of the West before the gates of D:Thangorodrim, strikes with icy wrath at the undead, disperses hosts of @@ -1480,11 +2400,25 @@ N:103:of Balli Stonehand I:22:22:3 W:30:15:170:90000 P:0:3d8:8:11:5 -F:STR | CON | STEALTH | HIDE_TYPE | ESP_NONLIVING -F:SLAY_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_BLIND | FEATHER | -F:SEE_INVIS | REGEN | SHOW_MODS +F:CON F:COULD2H +F:ESP_NONLIVING +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:REGEN +F:RES_ACID +F:RES_BLIND +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH +F:STR f:COULD2H D:The twin blades of this weapon were forged in Belegost, and powerful forces D:to resist and endure lie ready for he who shall wield it once more. @@ -1496,8 +2430,13 @@ N:104:'Lotharang' I:22:22:1 W:30:15:170:21000 P:0:2d8:4:3:0 -F:STR | DEX | HIDE_TYPE | -F:SLAY_TROLL | SLAY_ORC | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:DEX +F:HIDE_TYPE +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STR a:CURE_MW D:A superbly crafted double-bladed axe that slays the creatures of earth and D:allows rapid recovery from their blows. @@ -1509,10 +2448,18 @@ N:105:of the Dwarves I:22:28:10 W:30:8:250:80000 P:0:3d8:12:17:0 -F:SLAY_EVIL | TUNNEL | INFRA | SEARCH | SLAY_GIANT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_FEAR | -F:SHOW_MODS F:COULD2H +F:INFRA +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:SEARCH +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_GIANT +F:TUNNEL f:COULD2H D:A massive axe with twin razor-sharp heads, so large that it usually D:requires two hands to wield, intricately engraved in gold with spells @@ -1525,10 +2472,15 @@ N:106:'Barukkheled' I:24:11:3 W:20:8:160:50000 P:0:2d6:13:19:0 -F:CON | HIDE_TYPE | -F:SLAY_EVIL | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | -F:SEE_INVIS | SHOW_MODS +F:CON F:COULD2H +F:HIDE_TYPE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL f:COULD2H D:A royal heirloom of the southern coast, strong in combat against evil D:creatures of the earth. @@ -1540,10 +2492,19 @@ N:107:of Wrath I:22:5:2 W:15:35:300:90000 P:0:3d8:16:18:0 -F:STR | DEX | HIDE_TYPE | CHAOTIC | DRAIN_MANA | -F:SLAY_EVIL | KILL_UNDEAD | RES_LITE | RES_DARK | SEE_INVIS | -F:BLESSED | SHOW_MODS +F:BLESSED +F:CHAOTIC F:COULD2H +F:DEX +F:DRAIN_MANA +F:HIDE_TYPE +F:KILL_UNDEAD +F:RES_DARK +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:STR f:COULD2H D:A massive triple-pronged spear, so great it normally requires two hands to D:wield, evoking the spirit of Osse who with it pierced legions of @@ -1556,10 +2517,21 @@ N:108:of Ulmo I:22:5:4 W:30:90:70:120000 P:0:4d8:15:19:0 -F:DEX | HIDE_TYPE | -F:SLAY_DRAGON | SLAY_ANIMAL | FREE_ACT | HOLD_LIFE | IM_ACID | -F:RES_NETHER | SEE_INVIS | SLOW_DIGEST | REGEN | ACTIVATE | -F:BLESSED | SHOW_MODS | WATER_BREATH +F:ACTIVATE +F:BLESSED +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_ACID +F:REGEN +F:RES_NETHER +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLOW_DIGEST +F:WATER_BREATH a:TELE_AWAY D:The awesome weapon of the Vala Ulmo, Lord of Waters. Mightiest of all the D:powers of good save Manwe himself, Ulmo laughs in scorn at the dread powers @@ -1572,10 +2544,19 @@ N:109:'Avavir' I:22:17:3 W:40:8:250:18000 P:0:5d3:8:8:10 -F:DEX | CHR | HIDE_TYPE | -F:BRAND_COLD | BRAND_FIRE | FREE_ACT | RES_FIRE | RES_COLD | -F:RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_COLD +F:BRAND_FIRE +F:CHR F:COULD2H +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_COLD +F:RES_FIRE +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS f:COULD2H a:RECALL D:With elemental powers whose struggles turn this weapon red and purest @@ -1589,9 +2570,25 @@ N:110:of the Dawn I:23:17:3 W:40:160:130:250000 P:0:3d5:20:20:0 -F:ACTIVATE | BRAND_FIRE | FREE_ACT | RES_FIRE | INFRA | LEVELS | -F:SLAY_EVIL | SLAY_DRAGON | SLAY_UNDEAD | SLAY_DEMON | VORPAL | CLONE | -F:CHR | SUST_CHR | RES_FEAR | RES_LITE | RES_BLIND | REGEN | SHOW_MODS +F:ACTIVATE +F:BRAND_FIRE +F:CHR +F:CLONE +F:FREE_ACT +F:INFRA +F:LEVELS +F:REGEN +F:RES_BLIND +F:RES_FEAR +F:RES_FIRE +F:RES_LITE +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SUST_CHR +F:VORPAL a:DAWN D:Forged in the farthest East by a race of mighty spellcasters, this D:shiny pale sword gleams with the rays of rising sun as you invoke @@ -1604,11 +2601,28 @@ N:111:'Grond' I:21:50:2 W:100:1:1000:500000 P:0:9d9:25:25:10 -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | KILL_UNDEAD | NO_MAGIC | -F:KILL_DEMON | SLAY_TROLL | SLAY_ORC | RES_ACID | RES_ELEC | RES_FIRE | -F:RES_COLD | SEE_INVIS | ESP_ALL | AGGRAVATE | SHOW_MODS | INSTA_ART | -F:LEVELS | ACTIVATE | SPECIAL_GENE +F:ACTIVATE +F:AGGRAVATE +F:ESP_ALL +F:IMPACT +F:INSTA_ART +F:KILL_DEMON +F:KILL_DRAGON +F:KILL_UNDEAD +F:LEVELS F:MUST2H +F:NO_MAGIC +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE f:MUST2H a:GROND D:The mighty Hammer of the Underworld, blackened by doomspells of shattering, @@ -1621,10 +2635,15 @@ N:112:'Totila' I:21:13:2 W:20:8:150:55000 P:0:3d6:6:8:0 -F:STEALTH | -F:SLAY_EVIL | BRAND_FIRE | RES_FIRE | RES_CONF | ACTIVATE | -F:SHOW_MODS | LITE1 +F:ACTIVATE +F:BRAND_FIRE F:COULD2H +F:LITE1 +F:RES_CONF +F:RES_FIRE +F:SHOW_MODS +F:SLAY_EVIL +F:STEALTH f:COULD2H a:CONFUSE D:A flail whose head befuddles those who stare as you whirl it around, and @@ -1637,10 +2656,20 @@ N:113:'Thunderfist' I:21:18:4 W:45:38:300:160000 P:0:3d6:5:18:0 -F:STR | CON | HIDE_TYPE | RES_FEAR | -F:SLAY_ANIMAL | BRAND_FIRE | BRAND_ELEC | SLAY_TROLL | SLAY_ORC | -F:RES_ELEC | RES_FIRE | RES_DARK | SHOW_MODS | +F:BRAND_ELEC +F:BRAND_FIRE +F:CON +F:HIDE_TYPE F:MUST2H +F:RES_DARK +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_ORC +F:SLAY_TROLL +F:STR f:MUST2H D:The long-lost weapon of Kzurin, Dwarven champion of ancient Belegost, D:with runes of strength in its handle, and flames and sparks that roar and @@ -1653,9 +2682,15 @@ N:114:'Bloodspike' I:21:12:4 W:20:30:150:30000 P:0:2d6:8:22:0 -F:STR | HIDE_TYPE | BRAND_POIS | -F:SLAY_ANIMAL | SLAY_TROLL | SLAY_ORC | RES_NEXUS | SEE_INVIS | +F:BRAND_POIS +F:HIDE_TYPE +F:RES_NEXUS +F:SEE_INVIS F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_ORC +F:SLAY_TROLL +F:STR D:You feel strong and firm of foot as you whip the chain-suspended spiked orb D:around - and bathe it in the blood of your foes. @@ -1666,7 +2701,11 @@ N:115:'Firestar' I:21:12:0 W:20:100:150:35000 P:0:2d6:5:7:2 -F:BRAND_FIRE | IM_FIRE | ACTIVATE | SHOW_MODS | LITE1 +F:ACTIVATE +F:BRAND_FIRE +F:IM_FIRE +F:LITE1 +F:SHOW_MODS a:FIRESTAR D:A famed battle-lord of old, with a ruddy head, coloured as embers are that D:can yet rise up in wrath. @@ -1678,8 +2717,12 @@ N:116:'Taratol' I:21:5:0 W:20:15:200:50000 P:0:3d4:12:12:0 -F:KILL_DRAGON | BRAND_ELEC | IM_ELEC | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_ELEC F:COULD2H +F:IM_ELEC +F:KILL_DRAGON +F:SHOW_MODS f:COULD2H a:SPEED D:A great ridged mace that calls around you a nimbus of living lightning; @@ -1693,11 +2736,24 @@ N:117:of Aule I:21:8:4 W:40:75:120:250000 P:0:9d3:19:21:5 -F:WIS | TUNNEL | HIDE_TYPE | RES_FEAR | -F:KILL_DRAGON | SLAY_EVIL | BRAND_ELEC | SLAY_UNDEAD | SLAY_DEMON | -F:FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_NEXUS | -F:SEE_INVIS | SHOW_MODS +F:BRAND_ELEC F:COULD2H +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DRAGON +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_NEXUS +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:TUNNEL +F:WIS f:COULD2H D:The wondrous hammer of Aule, creator of the wise Dwarven lords of old. D:It bears magics of demolishing that no serpent or demon can withstand, and @@ -1710,9 +2766,13 @@ N:118:'Nar-i-vagil' I:21:3:3 W:20:18:150:70000 P:0:1d9:10:20:0 -F:INT | HIDE_TYPE | -F:SLAY_ANIMAL | BRAND_FIRE | RES_FIRE | SHOW_MODS +F:BRAND_FIRE F:COULD2H +F:HIDE_TYPE +F:INT +F:RES_FIRE +F:SHOW_MODS +F:SLAY_ANIMAL f:COULD2H D:Named for a fiery star and set with gems of great worth binding mystic D:virtues of protection and thought. @@ -1724,8 +2784,17 @@ N:119:'Eriril' I:21:3:4 W:20:18:150:20000 P:0:1d9:3:5:0 -F:INT | WIS | HIDE_TYPE | ESP_EVIL | SPELL_CONTAIN | WIELD_CAST -F:SLAY_EVIL | RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:ESP_EVIL +F:HIDE_TYPE +F:INT +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SPELL_CONTAIN +F:WIELD_CAST +F:WIS a:ID_PLAIN D:The radiant golden staff of an Istari of legend, this wizard's companion D:grants keen sight and the knowledge of many hidden things. @@ -1737,9 +2806,24 @@ N:120:of Olorin I:21:3:4 W:30:105:150:140000 P:0:2d9:10:13:0 -F:INT | WIS | CHR | HIDE_TYPE | SEARCH | BRAND_FIRE | -F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | SPELL_CONTAIN | WIELD_CAST -F:HOLD_LIFE | RES_FIRE | RES_NETHER | SEE_INVIS | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_FIRE +F:BRAND_FIRE +F:CHR +F:HIDE_TYPE +F:HOLD_LIFE +F:INT +F:RES_FIRE +F:RES_NETHER +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPELL_CONTAIN +F:WIELD_CAST +F:WIS a:DETECT_XTRA D:A staff tall and sturdy, with rough-hewn runes that invoke the element of D:Earth, and which strikes down all creatures who live in the shadow of @@ -1752,11 +2836,25 @@ N:121:'Deathwreaker' I:21:20:6 W:80:38:400:444444 P:0:7d8:18:18:0 -F:STR | TUNNEL | HIDE_TYPE | NO_TELE | DRAIN_MANA | -F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_EVIL | KILL_UNDEAD | BRAND_FIRE | -F:IM_FIRE | RES_DARK | RES_CHAOS | RES_DISEN | AGGRAVATE | -F:SHOW_MODS | BRAND_POIS | VAMPIRIC +F:AGGRAVATE +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_MANA +F:HIDE_TYPE +F:IM_FIRE +F:KILL_UNDEAD F:MUST2H +F:NO_TELE +F:RES_CHAOS +F:RES_DARK +F:RES_DISEN +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLAY_EVIL +F:STR +F:TUNNEL +F:VAMPIRIC f:MUST2H D:A weapon so massive it seems beyond the strength of mortals, yet you feel D:the might of giants within you as you heft it. As you grip the handle @@ -1771,10 +2869,20 @@ N:122:'Turmil' I:21:10:4 W:20:15:120:30000 P:0:2d5:10:6:8 -F:WIS | INFRA | HIDE_TYPE | -F:BRAND_COLD | SLAY_ORC | RES_COLD | RES_LITE | REGEN | -F:ACTIVATE | SHOW_MODS | ESP_ORC | ESP_TROLL | ESP_GIANT +F:ACTIVATE +F:BRAND_COLD F:COULD2H +F:ESP_GIANT +F:ESP_ORC +F:ESP_TROLL +F:HIDE_TYPE +F:INFRA +F:REGEN +F:RES_COLD +F:RES_LITE +F:SHOW_MODS +F:SLAY_ORC +F:WIS f:COULD2H a:TURMIL D:Wielded by the High Priest of Meneltarma, this great mace gleams coldly as @@ -1788,11 +2896,26 @@ N:123:of Gothmog I:21:2:-2 W:20:15:120:100000 P:0:3d6:15:16:0 -F:INT | DEX | INFRA | HIDE_TYPE | DRAIN_HP | -F:HEAVY_CURSE | CURSED | AGGRAVATE | -F:BRAND_FIRE | SLAY_ANIMAL | SLAY_DEMON | RES_FIRE | ESP_SPIDER -F:VORPAL | RES_LITE | LITE1 | REGEN | ESP_DEMON | WOUNDING +F:AGGRAVATE +F:BRAND_FIRE +F:CURSED +F:DEX +F:DRAIN_HP +F:ESP_DEMON +F:ESP_SPIDER +F:HEAVY_CURSE +F:HIDE_TYPE +F:INFRA +F:INT +F:LITE1 +F:REGEN +F:RES_FIRE +F:RES_LITE F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:VORPAL +F:WOUNDING D:With this unbearably bright whip of flame, the Balrog Gothmog has become D:known for never having lost in combat. @@ -1803,8 +2926,12 @@ N:124:'Belthronding' I:19:13:3 W:40:20:40:35000 P:0:0d0:20:22:0 -F:DEX | STEALTH | HIDE_TYPE | -F:RES_DISEN | XTRA_SHOTS | SHOW_MODS +F:DEX +F:HIDE_TYPE +F:RES_DISEN +F:SHOW_MODS +F:STEALTH +F:XTRA_SHOTS D:The great bow of Beleg, made of black yew and strung with elven hair that D:faintly shines a pale clear gold. @@ -1815,8 +2942,13 @@ N:125:of Bard I:19:13:2 W:30:20:40:20000 P:0:0d0:17:19:0 -F:DEX | HIDE_TYPE | ESP_DRAGON | LUCK -F:FREE_ACT | XTRA_MIGHT | SHOW_MODS +F:DEX +F:ESP_DRAGON +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:SHOW_MODS +F:XTRA_MIGHT D:The great yew bow of grim-faced Bard, who shot the mightiest arrow that D:songs record. @@ -1827,8 +2959,11 @@ N:126:'Cubragol' I:19:23:10 W:50:25:110:50000 P:0:0d0:10:14:0 -F:SPEED | HIDE_TYPE | -F:RES_FIRE | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:HIDE_TYPE +F:RES_FIRE +F:SHOW_MODS +F:SPEED a:CUBRAGOL D:A crossbow that grants fiery speed to he who finds it, and from which D:shoot bolts that blaze with flame unquenchable. @@ -1842,11 +2977,29 @@ N:127:of Eternity I:6:1:12 W:127:220:20:9000000 P:0:1d4:-19:-19:0 -F:INT | CHR | WIS | MANA | SPELL | ACTIVATE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | LUCK | SPECIAL_GENE -F:SEE_INVIS | ESP_EVIL | ESP_DEMON | NEVER_BLOW | INFRA -F:PRECOGNITION | IM_FIRE | ULTIMATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CHR F:COULD2H +F:ESP_DEMON +F:ESP_EVIL +F:IM_FIRE +F:INFRA +F:INT +F:LUCK +F:MANA +F:NEVER_BLOW +F:PRECOGNITION +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SPECIAL_GENE +F:SPELL +F:SPELL_CONTAIN +F:ULTIMATE +F:WIELD_CAST +F:WIS f:COULD2H a:GANDALF D:A simple, wooden wizard's staff. Unremarkable in all aspects... @@ -1860,8 +3013,12 @@ N:128:of Beor I:15:4:4 W:20:10:20:40000 P:0:4d5:8:12:0 -F:DEX | SPEED | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD +F:DEX +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SPEED D:Beor's boomerang makes its wielder as agile as the winds, D:and as hard to harm. @@ -1872,8 +3029,20 @@ N:129:'Glimdrir' I:15:4:3 W:40:20:20:60000 P:0:5d5:15:16:0 -F:DEX | SPEED | FREE_ACT | BRAND_POIS | SLAY_EVIL | SLAY_UNDEAD | REGEN -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SOUND | NO_TELE | CURSED +F:BRAND_POIS +F:CURSED +F:DEX +F:FREE_ACT +F:NO_TELE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SPEED D:A powerful boomerang that makes one agile and fast, with a thirst for D:evil and undead creatures, but demands its wielder not teleport, for fear D:of desertion. @@ -1885,9 +3054,20 @@ N:130:of Incanus I:36:2:3 W:30:20:20:60000 P:2:0d0:0:0:20 -F:INT | WIS | SEARCH | HIDE_TYPE | SPELL_CONTAIN | WIELD_CAST -F:SUST_INT | SUST_WIS | FREE_ACT | SEE_INVIS | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEARCH +F:SEE_INVIS +F:SPELL_CONTAIN +F:SUST_INT +F:SUST_WIS +F:WIELD_CAST +F:WIS Z:weigh magic D:Gandalf's long, flowing robe. It provides insight and allows the D:wearer to see things not seen by all. @@ -1899,8 +3079,13 @@ N:131:of the Thain I:19:2:4 W:40:20:40:35000 P:0:0d0:15:15:0 -F:HIDE_TYPE | DEX | CON -F:RES_NETHER | XTRA_SHOTS | XTRA_MIGHT | SHOW_MODS +F:CON +F:DEX +F:HIDE_TYPE +F:RES_NETHER +F:SHOW_MODS +F:XTRA_MIGHT +F:XTRA_SHOTS D:This sling was crafted by Faramir I, Thain of the Shire, just in case D:the nasties of his father's stories ever dare to enter the Shire again. @@ -1911,9 +3096,16 @@ N:134:'Lasher' I:21:2:3 W:20:5:30:50000 P:0:1d6:12:15:0 -F:DEX | BLOWS | HIDE_TYPE | -F:SLAY_ANIMAL | SLAY_ORC | BRAND_POIS | VORPAL | -F:RES_POIS | FREE_ACT | ESP_ORC +F:BLOWS +F:BRAND_POIS +F:DEX +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:RES_POIS +F:SLAY_ANIMAL +F:SLAY_ORC +F:VORPAL D:A powerful whip that is deadly against orcs. It poisons your foes D:and is said to go "snicker snack". @@ -1924,9 +3116,19 @@ N:135:'Bullseye' I:17:2:0 W:45:1:2:50000 P:0:7d4:20:15:0 -F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | KILL_DEMON | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | -F:BRAND_ACID | BRAND_ELEC | BRAND_FIRE | BRAND_COLD | BRAND_POIS +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:KILL_DEMON +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD D:A powerful arrow that is feared by even the mightiest demons. @@ -1936,7 +3138,11 @@ N:136:'Travak' I:16:0:0 W:5:1:2:5000 P:0:3d6:8:5:0 -F:BRAND_ACID | BRAND_ELEC | BRAND_FIRE | BRAND_COLD | BRAND_POIS +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS D:A rounded pebble imbued with the powers of the elements. @@ -1946,8 +3152,19 @@ N:137:of Maglor I:14:59:3 W:60:10:20:100000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | ESP_UNIQUE | WIELD_CAST +F:CHR +F:ESP_UNIQUE +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:WIELD_CAST +F:WIS D:This harp that once belonged to Maglor makes those who use it seem D:more forceful and convincing. It is also said that those who have D:used it found themselves walking faster, as if to an unheard beat. @@ -1959,8 +3176,18 @@ N:138:of the Sky I:14:58:2 W:40:10:15:80000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | WIELD_CAST +F:CHR +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:WIELD_CAST +F:WIS D:The drum is decorated with the images of the stars, the clouds, the D:Sun guided by Arien and the Moon with Tilion. It imparts to the D:wearer an echo of the beauty of the sky, and protects him from the @@ -1974,8 +3201,17 @@ N:139:of Daeron I:14:59:1 W:20:10:10:50000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | WIELD_CAST +F:CHR +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SPEED +F:STEALTH +F:WIELD_CAST +F:WIS D:A pretty harp that makes those who play it beautiful, wise and D:fast. @@ -1986,8 +3222,16 @@ N:140:of Erebor I:20:6:5 W:50:15:200:55000 P:0:3d4:0:0:0 -F:STR | TUNNEL | SUST_STR | HIDE_TYPE | LITE1 | ACTIVATE | CLIMB -F:RES_CHAOS | RES_LITE | RES_DARK +F:ACTIVATE +F:CLIMB +F:HIDE_TYPE +F:LITE1 +F:RES_CHAOS +F:RES_DARK +F:RES_LITE +F:STR +F:SUST_STR +F:TUNNEL a:EREBOR D:A pick that provides a magical light by which to see while tunnelling. @@ -1998,7 +3242,13 @@ N:141:of the Druedain I:14:58:4 W:19:10:15:10000 P:0:3d4:0:0:0 -F:ACTIVATE | STEALTH | SEARCH | INFRA | RES_POIS | RES_DARK | WIELD_CAST +F:ACTIVATE +F:INFRA +F:RES_DARK +F:RES_POIS +F:SEARCH +F:STEALTH +F:WIELD_CAST a:DRUEDAIN D:The fabled Drum of the Druedain that will protect those who play it D:from darkness and poison attacks. It also aids in the seeing of @@ -2011,7 +3261,11 @@ N:142:of Rohan I:14:60:2 W:14:10:15:80000 P:0:3d4:0:0:0 -F:ACTIVATE | CHR | WIS | ESP_DRAGON | WIELD_CAST +F:ACTIVATE +F:CHR +F:ESP_DRAGON +F:WIELD_CAST +F:WIS a:ROHAN D:A horn carved from the bones of the Dragon of Ered-Mithrin, this D:heirloom of the House of Eorl bestows to its user the gifts of @@ -2024,7 +3278,13 @@ N:143:of Helm I:14:60:2 W:16:10:15:15000 P:0:3d4:0:0:0 -F:ACTIVATE | STR | CON | IM_COLD | RES_NETHER | RES_FEAR | WIELD_CAST +F:ACTIVATE +F:CON +F:IM_COLD +F:RES_FEAR +F:RES_NETHER +F:STR +F:WIELD_CAST a:HELM D:Heedless of cold, fearless of darkness -- besiegers fled at the wind D:of the solitary coming of King Helm Hammerhand, proclaimed by a single @@ -2037,7 +3297,13 @@ N:144:of Boromir I:14:60:3 W:18:10:15:18000 P:0:3d4:0:0:0 -F:ACTIVATE | STR | CON | RES_FEAR | RES_FIRE | AGGRAVATE | WIELD_CAST +F:ACTIVATE +F:AGGRAVATE +F:CON +F:RES_FEAR +F:RES_FIRE +F:STR +F:WIELD_CAST a:BOROMIR D:Boromir's horn gives courage and endurance to the wearer, provided he does D:not wish to travel in secrecy: for it must always sound when its wielder @@ -2051,7 +3317,13 @@ N:145:of Gothmog I:22:28:-4 W:30:8:250:30000 P:0:3d8:14:19:0 -F:BRAND_FIRE | IM_FIRE | CHR | ACTIVATE | SHOW_MODS | CURSED | TY_CURSE +F:ACTIVATE +F:BRAND_FIRE +F:CHR +F:CURSED +F:IM_FIRE +F:SHOW_MODS +F:TY_CURSE a:AXE_GOTHMOG D:The black axe of Gothmog, which struck Fingon at Nirnaeth. Mighty D:spells of evil make it unsafe in any hands but those of its original wielder. @@ -2063,7 +3335,8 @@ N:146:of Gondor I:17:2:0 W:20:5:3:25000 P:0:10d8:10:20:0 -F:SLAY_EVIL | SLAY_DEMON +F:SLAY_DEMON +F:SLAY_EVIL D:An arrow that was created to rid the world of demons. @@ -2074,13 +3347,40 @@ N:147:of Eternity I:23:17:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:LIFE | CON | CHR | LUCK -F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | -F:BRAND_FIRE | BRAND_COLD | BRAND_ELEC | VORPAL | IM_COLD | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_DEMON | -F:FREE_ACT | RES_FIRE | RES_DARK | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS | BLESSED | -F:PRECOGNITION | NO_MAGIC | ULTIMATE | SPECIAL_GENE +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:A warm light bathes this translucent blade. The power of the fates are D:at the command of its wielder as the weapon passes Supreme Judgment on @@ -2093,8 +3393,11 @@ N:148:of Great Luck I:36:2:60 W:50:120:20:60000 P:-30:0d0:0:0:-20 -F:LUCK | HIDE_TYPE | -F:FREE_ACT | DRAIN_HP | DRAIN_MANA +F:DRAIN_HP +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:LUCK D:A powerful wizard once created this robe to grant him incredible luck.... D:It seems he forgot to wear it. @@ -2105,8 +3408,13 @@ N:149:of Farmer Maggot I:19:2:2 W:10:10:5:20000 P:0:0d0:20:0:0 -F:INFRA | SEARCH | HIDE_TYPE | -F:XTRA_SHOTS | SHOW_MODS | ACTIVATE | SPECIAL_GENE +F:ACTIVATE +F:HIDE_TYPE +F:INFRA +F:SEARCH +F:SHOW_MODS +F:SPECIAL_GENE +F:XTRA_SHOTS a:MAGGOT D:This ordinary seeming leather sling has been raised to legendary D:status amongst generations of hobbit children. Farmer Maggot's @@ -2123,10 +3431,25 @@ N:150:of Angmar I:23:17:-10 W:20:40:130:30000 P:0:4d5:-22:-25:0 -F:SPEED | STR | WIS | CHR | ESP_UNDEAD -F:BRAND_FIRE | SEE_INVIS | SLOW_DIGEST | FREE_ACT | -F:VAMPIRIC | NO_TELE | AGGRAVATE | WRAITH | INVIS | -F:CURSED | HEAVY_CURSE | DG_CURSE | SHOW_MODS | CLONE | +F:AGGRAVATE +F:BRAND_FIRE +F:CHR +F:CLONE +F:CURSED +F:DG_CURSE +F:ESP_UNDEAD +F:FREE_ACT +F:HEAVY_CURSE +F:INVIS +F:NO_TELE +F:SEE_INVIS +F:SHOW_MODS +F:SLOW_DIGEST +F:SPEED +F:STR +F:VAMPIRIC +F:WIS +F:WRAITH D:Dark flames wreath the naked steel of the Witch-King of Angmar. D:A mighty curse to all those who wield it apart from its master, D:the torture of the wraithworld awaits those who dare. @@ -2138,9 +3461,19 @@ N:151:of Feanor I:18:2:0 W:127:220:130:100000 P:0:5d5:5:6:0 -F:BRAND_COLD | BRAND_FIRE | BRAND_ELEC | BRAND_ACID | BRAND_POIS | -F:SLAY_DRAGON | SLAY_GIANT | SLAY_TROLL | KILL_UNDEAD | SLAY_ORC | -F:SLAY_DEMON | SLAY_EVIL | SPECIAL_GENE +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:KILL_UNDEAD +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE D:Made during the war against Morgoth by Feanor, this powerful D:bolt is the bane of Morgoth's power, and has especial strength D:against those foes who are already dead. @@ -2153,11 +3486,38 @@ N:152:of Eternity I:19:24:5 W:127:220:130:8000000 P:0:0d0:36:28:0 -F:SEE_INVIS | SLOW_DIGEST | FREE_ACT | SPEED | DEX | CON | FLY | LUCK -F:XTRA_MIGHT | XTRA_SHOTS | IM_ELEC | REFLECT | INVIS | STEALTH | -F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | -F:RES_CHAOS | RES_DISEN | RES_CONF | RES_BLIND | INFRA | ESP_ORC | ESP_TROLL | ESP_EVIL | -F:PRECOGNITION | NO_MAGIC | ULTIMATE | SPECIAL_GENE +F:CON +F:DEX +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:FLY +F:FREE_ACT +F:IM_ELEC +F:INFRA +F:INVIS +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REFLECT +F:RES_BLIND +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:SEE_INVIS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:XTRA_MIGHT +F:XTRA_SHOTS D:Designed to be used with the Seeker Bolt of Feanor, this Crossbow D:is perfect against the terrible powers of Morgoth. @@ -2168,8 +3528,16 @@ N:153:of the Sandworm I:36:4:5 W:30:3:80:65000 P:30:0d0:0:0:0 -F:RES_POIS | RES_ELEC | RES_FIRE | RES_ACID | SPECIAL_GENE -F:TUNNEL | STR | STEALTH | INFRA | ESP_ANIMAL +F:ESP_ANIMAL +F:INFRA +F:RES_ACID +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SPECIAL_GENE +F:STEALTH +F:STR +F:TUNNEL D:This powerful piece of armour was made using the remains of D:the Sandworm Queen. @@ -2180,8 +3548,14 @@ N:154:'Dragonbane' I:22:28:2 W:70:20:260:33000 P:0:3d8:20:20:0 -F:BLOWS | KILL_DRAGON | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_POIS | SHOW_MODS +F:BLOWS +F:KILL_DRAGON +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS D:Forged by the Dwarves to defend their home of Khazad-dum from dragons, D:this axe has been lost to time... until now. @@ -2192,7 +3566,11 @@ N:155:'Limbslicer' I:24:8:4 W:15:3:140:12000 P:0:2d5:12:15:0 -F:DEX | VORPAL | HIDE_TYPE | SHOW_MODS | WOUNDING +F:DEX +F:HIDE_TYPE +F:SHOW_MODS +F:VORPAL +F:WOUNDING D:The Petty-dwarves of Bathak forged this blade, and it shares their thirst D:for blood. @@ -2203,8 +3581,13 @@ N:156:'Orchast' I:24:11:4 W:15:2:170:12000 P:0:2d7:20:14:0 -F:DEX | SEARCH | SLAY_ORC | ACTIVATE | HIDE_TYPE | SHOW_MODS +F:ACTIVATE F:COULD2H +F:DEX +F:HIDE_TYPE +F:SEARCH +F:SHOW_MODS +F:SLAY_ORC f:COULD2H a:ORCHAST D:Forged by the dwarves of Khazad-dum in a time of desperation, @@ -2217,8 +3600,16 @@ N:157:of the Night I:24:1:4 W:45:20:45:34000 P:0:2d6:34:22:0 -F:DEX | STEALTH | VAMPIRIC | KILL_UNDEAD | RES_DARK | HIDE_TYPE | -F:SHOW_MODS | SEE_INVIS | ACTIVATE | DRAIN_EXP +F:ACTIVATE +F:DEX +F:DRAIN_EXP +F:HIDE_TYPE +F:KILL_UNDEAD +F:RES_DARK +F:SEE_INVIS +F:SHOW_MODS +F:STEALTH +F:VAMPIRIC a:NIGHT D:Found on an unmarked grave after a violent storm, this hatchet D:has a sinister aura of darkness and decay. @@ -2230,8 +3621,16 @@ N:158:'Naturebane' I:24:30:3 W:70:20:300:28400 P:0:5d7:31:27:0 -F:STR | SLAY_ANIMAL | SUST_STR | RES_SHARDS | RES_NEXUS | FEATHER | -F:HIDE_TYPE | SHOW_MODS | ACTIVATE | DRAIN_HP +F:ACTIVATE +F:DRAIN_HP +F:FEATHER +F:HIDE_TYPE +F:RES_NEXUS +F:RES_SHARDS +F:SHOW_MODS +F:SLAY_ANIMAL +F:STR +F:SUST_STR a:NATUREBANE D:Used by the orcs in their battle at Dagor Bragollach against the elves, this D:axe has a bloodthirst for nature. @@ -2243,8 +3642,14 @@ N:159:of Ice I:24:8:3 W:30:25:140:26550 P:0:2d5:3:15:0 -F:INT | CHR | SUST_DEX | BRAND_COLD | IM_COLD | RES_NEXUS | HIDE_TYPE | +F:BRAND_COLD +F:CHR +F:HIDE_TYPE +F:IM_COLD +F:INT +F:RES_NEXUS F:SHOW_MODS +F:SUST_DEX D:Crafted of purest ice and held solid by powerful spells, this icy axe D:delivers a chill of death to its victims. @@ -2255,8 +3660,12 @@ N:160:of Knowledge I:32:5:-6 W:20:5:75:100000 P:6:1d3:0:0:20 -F:LITE1 | HIDE_TYPE | SPECIAL_GENE | LUCK -F:AUTO_ID | ACTIVATE +F:ACTIVATE +F:AUTO_ID +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:SPECIAL_GENE a:KNOWLEDGE D:This helm, designed by Petty-Dwarves ages ago to act as the brain of a D:long lost project, is made of finest glass. Its light banishes all secrets, @@ -2273,7 +3682,10 @@ N:161:of Ahromarwar I:46:1:3 W:20:10:40:20000 P:0:0d0:25:15:30 -F:STEALTH | AUTOMATIC_99 | XTRA_MIGHT | HIDE_TYPE +F:AUTOMATIC_99 +F:HIDE_TYPE +F:STEALTH +F:XTRA_MIGHT D:A trap that can almost never be detected. Its missiles may be mere pebbles, D:but fired at an incredibly high velocity to penetrate even the toughest D:hide or armour. @@ -2285,7 +3697,11 @@ N:162:'Hanisbroner's Surprise' I:46:6:3 W:20:20:40:20000 P:0:0d0:0:0:25 -F:STEALTH | XTRA_SHOTS | TELEPORT_TO | HIDE_TYPE | AUTOMATIC_99 +F:AUTOMATIC_99 +F:HIDE_TYPE +F:STEALTH +F:TELEPORT_TO +F:XTRA_SHOTS D:A magical trap, armed with a wand. Unaccountably, its victims keep D:on coming back for more... @@ -2296,7 +3712,11 @@ N:163:'Merlion Karc's Demonbane' I:46:3:2 W:20:20:200:20000 P:0:0d0:17:27:37 -F:STEALTH | XTRA_SHOTS | XTRA_MIGHT | HIDE_TYPE | ONLY_DEMON +F:HIDE_TYPE +F:ONLY_DEMON +F:STEALTH +F:XTRA_MIGHT +F:XTRA_SHOTS D:A snare set not for animals, or people, but for demons alone, and D:enchanted so that whenever the demon sets foot or claw into the D:(hidden) pentagram, its hide is immediately pierced by many magical @@ -2309,8 +3729,13 @@ N:164:'Narsil' I:23:2:2 W:20:5:30:2000 P:0:3d2:6:10:0 -F:STR | DEX | HIDE_TYPE | BLESSED | -F:SLAY_ORC | SLAY_TROLL | RES_FIRE +F:BLESSED +F:DEX +F:HIDE_TYPE +F:RES_FIRE +F:SLAY_ORC +F:SLAY_TROLL +F:STR D:The sword that was broken shall be reforged... @@ -2322,7 +3747,8 @@ N:165:'Lebohaum' I:32:6:0 W:20:15:15:25000 P:20:0d0:0:0:80 -F:ACTIVATE | EASY_USE +F:ACTIVATE +F:EASY_USE a:LEBOHAUM D:With the Helm 'Lebohaum' your head is safe! @@ -2333,11 +3759,22 @@ N:166:'Mediator' I:38:30:0 W:95:12:500:400000 P:50:2d4:-8:0:35 -F:FEATHER | FLY | ESP_DRAGON | -F:RES_NEXUS | RES_CHAOS | AGGRAVATE | REGEN | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | F:ACTIVATE +F:AGGRAVATE +F:ESP_DRAGON +F:FEATHER +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:RES_NEXUS +F:RES_SHARDS +F:RES_SOUND a:MEDIATOR D:A mighty suit of dragon armour, set with the scales of dragons of both D:Law and Chaos, and with power over both. @@ -2349,7 +3786,10 @@ N:167:of Himring I:36:6:0 W:50:20:100:35000 P:6:0d0:0:0:15 -F:RES_CHAOS | RES_NETHER | RES_POIS | ACTIVATE +F:ACTIVATE +F:RES_CHAOS +F:RES_NETHER +F:RES_POIS a:PROT_EVIL D:Contained within this studded cuirass of pliable leather is the memory of D:unvanquished Himring, defiant fortress surrounded by the legions of Morgoth. @@ -2361,8 +3801,14 @@ N:168:'Hithlomir' I:36:4:4 W:20:3:80:45000 P:4:0d0:0:0:20 -F:STEALTH | HIDE_TYPE | SEARCH | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:SEARCH +F:STEALTH D:Familiar with the secret ways hidden in darkness, this leather cuirass is D:truly more than it appears. @@ -2374,10 +3820,20 @@ N:169:of Gil-galad I:34:10:5 W:70:4:80:65000 P:10:1d3:0:0:20 -F:ACTIVATE | -F:LITE1 | WIS | CHR | SEARCH | LUCK -F:RES_ELEC | RES_ACID | RES_DISEN | RES_DARK | HIDE_TYPE | -F:SUST_WIS | SUST_DEX | SUST_CHR +F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:RES_ACID +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:SEARCH +F:SUST_CHR +F:SUST_DEX +F:SUST_WIS +F:WIS a:GILGALAD D:The legendary shield of Gil-Galad, who fought his way to the gates of D:the Dark Tower, and with whom came light even to Gorgoroth. @@ -2389,9 +3845,16 @@ N:170:of Celebrimbor I:32:3:3 W:55:12:20:45000 P:3:1d1:0:0:18 -F:INT | DEX | CHR | SPELL | SEARCH | -F:RES_FIRE | RES_ACID | RES_DISEN | RES_SHARDS | F:ACTIVATE +F:CHR +F:DEX +F:INT +F:RES_ACID +F:RES_DISEN +F:RES_FIRE +F:RES_SHARDS +F:SEARCH +F:SPELL a:CELEBRIMBOR D:This once belonged to Celebrimbor, maker of the Rings of Power. One who D:knows both fire and acid, from the business of forging and engraving, will @@ -2406,9 +3869,17 @@ N:171:of Umbar I:19:24:2 W:60:20:200:35000 P:0:4d1:18:18:0 -F:STR | CON | XTRA_MIGHT | AGGRAVATE | -F:RES_LITE | RES_DARK | RES_BLIND | RES_ELEC | -F:HIDE_TYPE | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:AGGRAVATE +F:CON +F:HIDE_TYPE +F:RES_BLIND +F:RES_DARK +F:RES_ELEC +F:RES_LITE +F:SHOW_MODS +F:STR +F:XTRA_MIGHT a:UMBAR D:A great brazen arbalest with arms of gleaming steel, shooting quarrels with D:speed and power for those brave enough to risk betrayal. @@ -2421,8 +3892,13 @@ N:172:of Amrod I:19:12:2 W:25:10:30:9000 P:0:0d0:12:15:0 -F:STR | CON | XTRA_MIGHT | -F:RES_FIRE | RES_ELEC | RES_COLD | REGEN +F:CON +F:REGEN +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:STR +F:XTRA_MIGHT D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod D:and Amras, who both hunted with the Green-elves for a time. Like the D:twins, the bows are similar, for both protect their wielders from the @@ -2436,8 +3912,16 @@ N:173:of Amras I:19:12:1 W:25:10:30:9000 P:0:0d0:12:15:0 -F:INT | WIS | DEX | XTRA_SHOTS | XTRA_MIGHT | SPEED | -F:RES_FIRE | RES_ELEC | RES_COLD | SLOW_DIGEST +F:DEX +F:INT +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SLOW_DIGEST +F:SPEED +F:WIS +F:XTRA_MIGHT +F:XTRA_SHOTS D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod D:and Amras, who both hunted with the Green-elves for a time. Like the D:twins, the bows are similar, for both protect their wielders from the @@ -2451,10 +3935,21 @@ N:174:of Nain I:20:7:6 W:60:5:250:30000 P:0:3d8:12:18:0 -F:TUNNEL | INFRA | SEARCH | STR | ESP_ORC | CLIMB | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | -F:BRAND_ACID | RES_ACID | RES_DARK | RES_DISEN | F:ACTIVATE +F:BRAND_ACID +F:CLIMB +F:ESP_ORC +F:INFRA +F:RES_ACID +F:RES_DARK +F:RES_DISEN +F:SEARCH +F:SLAY_DRAGON +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:STR +F:TUNNEL a:STONE_MUD D:Wielded by Nain of the Iron Hills at the Battle of Azanulbizar, this great D:mattock brought victory to the Dwarves over Azog's Orcs - though Nain @@ -2467,11 +3962,20 @@ N:175:of Fundin Bluecloak I:21:6:4 W:25:100:130:60000 P:0:5d4:13:17:10 -F:STR | WIS | SPEED | LITE1 | HIDE_TYPE | -F:SLAY_EVIL | SLAY_UNDEAD | -F:RES_FIRE | RES_ELEC | RES_NETHER | RES_DISEN | HOLD_LIFE | F:ACTIVATE F:COULD2H +F:HIDE_TYPE +F:HOLD_LIFE +F:LITE1 +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_NETHER +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SPEED +F:STR +F:WIS f:COULD2H a:FUNDIN D:The weapon of one of the great dwarven priests, with powers @@ -2485,9 +3989,16 @@ N:176:of the Haradrim I:34:4:2 W:35:12:120:25000 P:4:1d2:0:0:15 -F:ACTIVATE | -F:STR | CON | SUST_STR | SUST_CON | HIDE_TYPE | -F:RES_FEAR | RES_BLIND | RES_POIS | AGGRAVATE +F:ACTIVATE +F:AGGRAVATE +F:CON +F:HIDE_TYPE +F:RES_BLIND +F:RES_FEAR +F:RES_POIS +F:STR +F:SUST_CON +F:SUST_STR a:HARADRIM D:A great shield from the far lands of the South, whose wielder D:will go charging into battle heedless of danger, with the @@ -2501,12 +4012,22 @@ N:177:'Skullcleaver' I:21:15:5 W:30:15:500:60000 P:0:5d4:11:23:20 -F:STR | TUNNEL | INFRA | HIDE_TYPE | -F:CURSED | AGGRAVATE | NO_MAGIC | -F:RES_NEXUS | RES_BLIND | RES_SOUND | -F:KILL_DRAGON | SLAY_ANIMAL | BRAND_POIS | BRAND_ELEC | F:ACTIVATE +F:AGGRAVATE +F:BRAND_ELEC +F:BRAND_POIS F:COULD2H +F:CURSED +F:HIDE_TYPE +F:INFRA +F:KILL_DRAGON +F:NO_MAGIC +F:RES_BLIND +F:RES_NEXUS +F:RES_SOUND +F:SLAY_ANIMAL +F:STR +F:TUNNEL f:COULD2H a:SKULLCLEAVER D:This mighty bludgeon brings destruction to all around it, and is the @@ -2519,8 +4040,17 @@ N:178:of Eol I:31:2:3 W:55:35:25:40000 P:3:1d1:0:0:15 -F:INT | MANA | FREE_ACT | FEATHER | RES_ELEC | RES_DARK | RES_POIS | ACTIVATE -F:LUCK | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:FEATHER +F:FREE_ACT +F:INT +F:LUCK +F:MANA +F:RES_DARK +F:RES_ELEC +F:RES_POIS +F:SPELL_CONTAIN +F:WIELD_CAST a:EOL D:The iron-shod gauntlets of the Dark Elven smith Eol, tingling with magics D:that he could channel in battle. @@ -2532,7 +4062,10 @@ N:179:of Nevrast I:30:3:3 W:20:8:40:35000 P:3:1d1:0:0:13 -F:STEALTH | CON | SPEED | HIDE_TYPE +F:CON +F:HIDE_TYPE +F:SPEED +F:STEALTH D:Footgear made of bear leather and set with opals, which grant the wearer D:silent, hasted movement. @@ -2543,7 +4076,11 @@ N:180:of Gimli I:30:6:4 W:40:8:60:22500 P:4:1d1:5:5:10 -F:INFRA | SEARCH | TUNNEL | CLIMB | HIDE_TYPE +F:CLIMB +F:HIDE_TYPE +F:INFRA +F:SEARCH +F:TUNNEL Z:magic map D:A set of iron-shod boots stamped by Gimli's combat prowess, a peerless D:ally to those journeying through halls of stone under mountains. @@ -2556,9 +4093,19 @@ N:181:of Gothmog I:115:55:-20 W:10:0:150:500 P:0:7d6:13:13:0 -F:SHOW_MODS | SLAY_DEMON | SLAY_EVIL | BRAND_FIRE | BRAND_POIS -F:LUCK | CHAOTIC | LITE1 | WOUNDING | RES_MORGUL | WIELD_CAST -F:HEAVY_CURSE | AUTO_CURSE +F:AUTO_CURSE +F:BRAND_FIRE +F:BRAND_POIS +F:CHAOTIC +F:HEAVY_CURSE +F:LITE1 +F:LUCK +F:RES_MORGUL +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:WIELD_CAST +F:WOUNDING # The Demonshield of Gothmog @@ -2567,9 +4114,18 @@ N:182:of Gothmog I:115:56:4 W:15:0:70:500 P:13:1d1:0:0:13 -F:DEX | INVIS | SUST_STR | SUST_CON | SUST_DEX -F:FEATHER | SH_FIRE | FREE_ACT | HOLD_LIFE -F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST +F:AUTO_CURSE +F:DEX +F:FEATHER +F:FREE_ACT +F:HEAVY_CURSE +F:HOLD_LIFE +F:INVIS +F:SH_FIRE +F:SUST_CON +F:SUST_DEX +F:SUST_STR +F:WIELD_CAST # The Demonhorn of Gothmog @@ -2578,9 +4134,15 @@ N:183:of Gothmog I:115:57:-5 W:20:0:30:500 P:2:1d1:0:0:13 -F:LITE2 | REGEN | ESP_DEMON -F:CHR | SLOW_DIGEST | SEE_INVIS -F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST +F:AUTO_CURSE +F:CHR +F:ESP_DEMON +F:HEAVY_CURSE +F:LITE2 +F:REGEN +F:SEE_INVIS +F:SLOW_DIGEST +F:WIELD_CAST # The Long Sword 'Durandil' @@ -2590,8 +4152,11 @@ N:184:'Durandil' I:23:17:3 W:5:10:130:500 P:0:2d5:5:6:0 -F:RES_FEAR | LUCK -F:ACTIVATE | EASY_USE | SHOW_MODS +F:ACTIVATE +F:EASY_USE +F:LUCK +F:RES_FEAR +F:SHOW_MODS a:DURANDIL D:Don't go adventuring without your Durandil sword! @@ -2602,9 +4167,21 @@ N:200:of Undeath I:39:103:-5 W:20:10:10:0 P:0:1d1:0:0:0 -F:CURSED | INT | WIS | CON | DEX | CHR | STR | ACTIVATE | -F:LITE3 | LITE2 | LUCK | MAGIC_BREATH -F:INSTA_ART | DG_CURSE | ESP_UNDEAD | +F:ACTIVATE +F:CHR +F:CON +F:CURSED +F:DEX +F:DG_CURSE +F:ESP_UNDEAD +F:INSTA_ART +F:INT +F:LITE2 +F:LITE3 +F:LUCK +F:MAGIC_BREATH +F:STR +F:WIS a:UNDEATH D:It appears like the Phial of Galadriel at first - but wait! It D:is a cursed phial created by an evil wizard to lure adventurers @@ -2617,7 +4194,8 @@ N:201: I:9:1:0 W:200:1:10:0 P:0:1d1:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # The Palantir of Orthanc @@ -2626,9 +4204,19 @@ N:202:of Orthanc I:39:104:2 W:75:60:200:100000 P:0:10d10:0:0:0 -F:WIS | INT | SEARCH | INFRA | HIDE_TYPE | ACTIVATE | ESP_ALL | -F:SEE_INVIS | RES_BLIND | AGGRAVATE | DRAIN_MANA | LITE2 +F:ACTIVATE +F:AGGRAVATE +F:DRAIN_MANA +F:ESP_ALL +F:HIDE_TYPE +F:INFRA F:INSTA_ART +F:INT +F:LITE2 +F:RES_BLIND +F:SEARCH +F:SEE_INVIS +F:WIS a:PALANTIR D:A shining white ball of unbreakable crystal, the ancient Palantiri D:were used by kings of Numenor and later by the Exiles for rapid @@ -2644,10 +4232,19 @@ N:203:of Phasing I:45:55:15 W:110:0:2:3000000 P:0:1d1:0:0:0 -F:SPEED | SEE_INVIS | LUCK | MAGIC_BREATH -F:CURSED | HEAVY_CURSE | REGEN -F:WRAITH | IM_NETHER | DRAIN_EXP | HOLD_LIFE | SPECIAL_GENE | +F:CURSED +F:DRAIN_EXP +F:HEAVY_CURSE +F:HOLD_LIFE +F:IM_NETHER F:INSTA_ART +F:LUCK +F:MAGIC_BREATH +F:REGEN +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED +F:WRAITH Z:teleport D:Imbued with the screams of the victims of undead everywhere, this D:ring is more a hole in reality than anything else. Strange forces ripple over @@ -2662,12 +4259,26 @@ N:204:'Toris Mejistos' I:40:18:2 W:50:10:3:60000 Z:restore life -F:INT | WIS | HIDE_TYPE | MANA | LUCK -F:SUST_INT | SUST_WIS | LITE1 | REGEN -F:SLOW_DIGEST | AUTO_CURSE | HEAVY_CURSE -F:ESP_GOOD | ESP_EVIL | HOLD_LIFE -F:INSTA_ART | SPECIAL_GENE | WATER_BREATH -F:SPELL_CONTAIN | WIELD_CAST +F:AUTO_CURSE +F:ESP_EVIL +F:ESP_GOOD +F:HEAVY_CURSE +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:INT +F:LITE1 +F:LUCK +F:MANA +F:REGEN +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPELL_CONTAIN +F:SUST_INT +F:SUST_WIS +F:WATER_BREATH +F:WIELD_CAST +F:WIS D:A blue stone, with an incredible number of incredibly small runes of power D:on it. It carries many secrets. @@ -2677,10 +4288,26 @@ D:on it. It carries many secrets. N:205:of Durin I:45:57:2 W:70:70:2:65000 -F:CON | CHR | STR | SUST_CHR | SUST_CON | SUST_STR | HIDE_TYPE | -F:ESP_EVIL | AGGRAVATE | HEAVY_CURSE | HOLD_LIFE | DRAIN_EXP | -F:RES_DARK | RES_CHAOS | RES_NETHER | RES_COLD | RES_ACID | -F:INSTA_ART | SPECIAL_GENE | CURSED +F:AGGRAVATE +F:CHR +F:CON +F:CURSED +F:DRAIN_EXP +F:ESP_EVIL +F:HEAVY_CURSE +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_DARK +F:RES_NETHER +F:SPECIAL_GENE +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_STR Z:Midas touch D:The greatest of the Seven Rings of the Dwarf-lords, and the last to be D:lost. Alone among the Seven, it was not taken by Sauron when he made @@ -2695,9 +4322,18 @@ N:206:'Elessar' I:40:19:4 W:60:60:3:40000 P:0:0d0:7:7:10 -F:STR | WIS | CHR | SPEED | LITE3 | INSTA_ART | -F:RES_FEAR | RES_FIRE | RES_POIS | RES_DISEN | HIDE_TYPE | F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:INSTA_ART +F:LITE3 +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SPEED +F:STR +F:WIS a:ELESSAR D:This green gem glows with inner light. Aragorn son of Arathorn wore D:it at the Battle of the Pelennor Fields, and he was himself given the @@ -2709,9 +4345,18 @@ D:name of 'Elessar' by the people of Gondor because of this. N:207:'Evenstar' I:40:20:3 W:50:50:3:35000 -F:HOLD_LIFE | SUST_CON | SUST_WIS | SUST_INT | LITE1 | CON | -F:RES_DARK | RES_COLD | RES_NETHER | REGEN | INSTA_ART | F:ACTIVATE +F:CON +F:HOLD_LIFE +F:INSTA_ART +F:LITE1 +F:REGEN +F:RES_COLD +F:RES_DARK +F:RES_NETHER +F:SUST_CON +F:SUST_INT +F:SUST_WIS a:REST_ALL D:A pure white jewel, the last gift of Queen Arwen Undomiel to Frodo D:Baggins, intended to be worn around his neck on the chain that had @@ -2724,9 +4369,20 @@ N:208:of Minas Ithil I:39:107:-3 W:75:60:200:0 P:0:10d10:0:0:-30 -F:LIFE | CON | INT | WIS | ESP_ALL | LITE3 | LITE1 -F:CURSED | HEAVY_CURSE | TY_CURSE | DRAIN_EXP | -F:RES_BLIND | SEE_INVIS | ACTIVATE +F:ACTIVATE +F:CON +F:CURSED +F:DRAIN_EXP +F:ESP_ALL +F:HEAVY_CURSE +F:INT +F:LIFE +F:LITE1 +F:LITE3 +F:RES_BLIND +F:SEE_INVIS +F:TY_CURSE +F:WIS a:PALANTIR D:A shining white ball of unbreakable crystal, the ancient Palantiri D:were used by kings of Numenor and later by the Exiles for rapid @@ -2742,8 +4398,12 @@ N:209:'Balefire' I:18:3:0 W:55:30:2:50000 P:0:6d5:20:15:0 -F:ESP_DEMON | ESP_UNDEAD | LITE1 | -F:BRAND_FIRE | KILL_DEMON | KILL_UNDEAD | +F:BRAND_FIRE +F:ESP_DEMON +F:ESP_UNDEAD +F:KILL_DEMON +F:KILL_UNDEAD +F:LITE1 D:This silver-tipped bolt, ablaze with undying celestial fire, D:is especially potent against undead and creatures of the D:netherworld; it even points the way to places where such @@ -2756,9 +4416,15 @@ N:210:'Stone-biter' I:18:3:3 W:55:30:2:50000 P:0:6d5:20:15:0 -F:ESP_ORC | ESP_TROLL | -F:INFRA | SEARCH | TUNNEL | LUCK -F:BRAND_ACID | SLAY_ORC | SLAY_TROLL | +F:BRAND_ACID +F:ESP_ORC +F:ESP_TROLL +F:INFRA +F:LUCK +F:SEARCH +F:SLAY_ORC +F:SLAY_TROLL +F:TUNNEL D:Wherever it strikes, this silver-tipped bolt eats through rock D:and metal as easily as through flesh. The dwarf-smith who D:crafted Stone-biter also inscribed the shaft with powerful @@ -2772,7 +4438,9 @@ N:211:'Heart's Blood' I:18:2:5 W:85:40:3:35000 P:0:8d5:15:20:0 -F:VORPAL | WOUNDING | CRIT | +F:CRIT +F:VORPAL +F:WOUNDING D:The barbed head of this bolt glows deep red with terrible runes D:of destruction; legend has it that Heart's Blood cannot hit its D:mark without causing a mortal wound. @@ -2784,8 +4452,9 @@ N:212:'Scale-piercer' I:18:2:0 W:85:40:3:35000 P:0:8d5:15:20:0 -F:ESP_DRAGON | RES_FEAR | -F:KILL_DRAGON | +F:ESP_DRAGON +F:KILL_DRAGON +F:RES_FEAR D:This bolt, crafted from the bones of a Great Wyrm, is less famous D:and less powerful than Bard's black arrow. Nonetheless it enables D:the owner to find dragons unerringly, face them bravely, and kill @@ -2802,10 +4471,20 @@ N:213:of Forochel I:6:1:3 W:65:70:60:60000 P:0:3d4:-12:-8:0 -F:INT | WIS | MANA | SPELL | INFRA | SEE_INVIS -F:SUST_INT | SUST_WIS | RES_BLIND | IM_COLD | SENS_FIRE -F:SPECIAL_GENE | WIELD_CAST F:COULD2H +F:IM_COLD +F:INFRA +F:INT +F:MANA +F:RES_BLIND +F:SEE_INVIS +F:SENS_FIRE +F:SPECIAL_GENE +F:SPELL +F:SUST_INT +F:SUST_WIS +F:WIELD_CAST +F:WIS f:COULD2H D:A shaft of pure, invincible crystal cut from the heart of one D:of the great glaciers ringing the Ice-Bay of Forochel. @@ -2818,8 +4497,16 @@ N:214:of Mellyrn I:35:2:4 W:40:40:5:65000 P:4:0d0:0:0:20 -F:HIDE_TYPE | INVIS | DEX | SPEED | STEALTH | LUCK -F:SUST_DEX | RES_LITE | RES_DARK | SPECIAL_GENE +F:DEX +F:HIDE_TYPE +F:INVIS +F:LUCK +F:RES_DARK +F:RES_LITE +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_DEX D:Bearing the same lyrical name as the great trees of Lothlorien D:and containing in its close-woven folds the speed and skill of D:the Galadrim, this grey cloak is ideal for those who travel in @@ -2832,9 +4519,18 @@ N:215:of Ephel Duath I:23:31:-3 W:60:60:50:30000 P:0:2d6:-20:-18:0 -F:STR | WIS | CHR | BRAND_POIS | VAMPIRIC | VORPAL -F:INVIS | AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS +F:AGGRAVATE +F:BRAND_POIS +F:CHR +F:CURSED +F:HEAVY_CURSE +F:INVIS +F:SHOW_MODS F:SPECIAL_GENE +F:STR +F:VAMPIRIC +F:VORPAL +F:WIS D:This filthy orc-blade is famed for vile deeds of torture and blood, D:and its wielder will never cease to fear treachery. @@ -2845,10 +4541,22 @@ N:216:'Garachoth' I:24:30:2 W:70:300:400:91000 P:0:7d5:18:18:-20 -F:STR | CON | SPEED | LEVELS | BLACK_BREATH -F:KILL_DEMON | SLAY_ANIMAL | BRAND_FIRE | VORPAL -F:RES_FEAR | RES_FIRE | RES_CHAOS | RES_NETHER -F:HIDE_TYPE | SHOW_MODS | SPECIAL_GENE +F:BLACK_BREATH +F:BRAND_FIRE +F:CON +F:HIDE_TYPE +F:KILL_DEMON +F:LEVELS +F:RES_CHAOS +F:RES_FEAR +F:RES_FIRE +F:RES_NETHER +F:SHOW_MODS +F:SLAY_ANIMAL +F:SPECIAL_GENE +F:SPEED +F:STR +F:VORPAL D:A ghastly axe with the soul of a demon lord trapped inside, this horrifying D:creation reverberates with the screams of the damned. As you gaze into its D:glassy, translucent blade, it seems that endless sulphrous wastelands @@ -2861,9 +4569,20 @@ N:217:'Skycleaver' I:31:5:1 W:40:45:40:100000 P:5:1d1:16:7:16 -F:STR | CON | DEX | CHR | LUCK | FLY -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS -F:HIDE_TYPE | SHOW_MODS | SPECIAL_GENE +F:CHR +F:CON +F:DEX +F:FLY +F:HIDE_TYPE +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS +F:SPECIAL_GENE +F:STR D:The handgear of a legendary dragonslaying hero. The wearer of these D:wyrmskin gauntlets will be versed in all aerial ways, and will fear no D:dragon that walks or flies. @@ -2876,9 +4595,16 @@ N:218:of the Machine I:30:6:3 W:30:100:170:19000 P:6:1d1:0:0:24 -F:INT | SPEED | TUNNEL | AGGRAVATE -F:RES_CHAOS | RES_SHARDS | RES_CONF -F:ESP_NONLIVING | HIDE_TYPE | SPECIAL_GENE +F:AGGRAVATE +F:ESP_NONLIVING +F:HIDE_TYPE +F:INT +F:RES_CHAOS +F:RES_CONF +F:RES_SHARDS +F:SPECIAL_GENE +F:SPEED +F:TUNNEL D:A massive pair of adamantine boots studded with gold, the final and D:greatest product of the petty-dwarven magical forge. Despite D:the great powers they contain, they are heavy and awkward enough to diff --git a/lib/edit/d_info.txt b/lib/edit/d_info.txt index 5c411d7c..1029f547 100644 --- a/lib/edit/d_info.txt +++ b/lib/edit/d_info.txt @@ -37,7 +37,9 @@ W:0:0:0:14:500 L:89:80:199:20:1:0 A:96:100:56:0:56:0:57:58 O:20:20:20:20 -F:PRINCIPAL | FLAT | NO_RECALL +F:FLAT +F:NO_RECALL +F:PRINCIPAL R:100:0 ### The principal dungeons, they were created by spliting the vanilla dungeon ### @@ -48,8 +50,11 @@ W:11:33:5:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 -F:PRINCIPAL | NO_DOORS | NO_DESTROY | FLAT F:FILL_METHOD_0 +F:FLAT +F:NO_DESTROY +F:NO_DOORS +F:PRINCIPAL R:100:0 N:2:Mordor @@ -60,8 +65,11 @@ L:0:100:0 A:97:50:56:50:56:0:57:97 A:0:100:0 O:20:20:20:20 -F:PRINCIPAL | LAVA_RIVER | CAVERN | NO_STREAMERS +F:CAVERN F:FILL_METHOD_2 +F:LAVA_RIVER +F:NO_STREAMERS +F:PRINCIPAL R:100:0 N:3:Angband @@ -70,9 +78,13 @@ W:67:127:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:PRINCIPAL | CAVERN | NO_EASY_MOVE | NO_RECALL -F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1_2 +F:CAVERN F:FILL_METHOD_0 +F:NO_EASY_MOVE +F:NO_RECALL +F:PRINCIPAL R:100:0 N:4:Barrow-Downs @@ -83,8 +95,9 @@ L:0:95:5 A:96:34:97:66:56:0:57:97 A:100:0:0 O:20:20:20:20 -F:PRINCIPAL | FLAT F:FILL_METHOD_3 +F:FLAT +F:PRINCIPAL R:25:1 M:UNDEAD R:75:0 @@ -100,8 +113,13 @@ L:86:90:205:10:1:0 A:177:100:0:0:0:0:85:87 O:10:10:30:30 E:2d10:10:FIRE -F:CAVE | LAVA_RIVER | NO_RECALL | NO_STREAMERS | NO_UP -F:FILL_METHOD_0 | NO_EASY_MOVE +F:CAVE +F:FILL_METHOD_0 +F:LAVA_RIVER +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_STREAMERS +F:NO_UP R:100:1 M:IM_FIRE @@ -116,13 +134,27 @@ A:85:80:87:20:87:0:57:85 A:50:50:0 O:25:25:25:25 E:10d10:3:NETHER -F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_SHAFT -F:RANDOM_TOWNS | ADJUST_LEVEL_2 | NO_RECALL | NO_STREAMERS -F:LAVA_RIVER | FINAL_GUARDIAN_1032 | FINAL_ARTIFACT_203 -F:FILL_METHOD_2 | NO_RECALL_OUT | NO_UP +F:ADJUST_LEVEL_2 +F:EMPTY +F:FILL_METHOD_2 +F:FINAL_ARTIFACT_203 +F:FINAL_GUARDIAN_1032 +F:FORGET +F:LAVA_RIVER +F:NO_BREATH +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_RECALL_OUT +F:NO_SHAFT +F:NO_STREAMERS +F:NO_UP +F:RANDOM_TOWNS R:5:0 R:95:3 -M:RES_NETH | R_CHAR_G | R_CHAR_W | R_CHAR_U +M:RES_NETH +M:R_CHAR_G +M:R_CHAR_U +M:R_CHAR_W # The Lost Land of Numenor # levels 35-50 @@ -135,12 +167,16 @@ A:187:80:84:10:56:10:57:187 A:60:0:40 O:30:30:10:10 E:1d1:1:ACID +F:FILL_METHOD_3 +F:FINAL_ARTIFACT_204 +F:FINAL_GUARDIAN_980 F:NO_STREAMERS -F:FINAL_GUARDIAN_980 | FINAL_ARTIFACT_204 -F:FILL_METHOD_3 | WATER_BREATH +F:WATER_BREATH R:20:0 R:80:3 -M:AQUATIC | CAN_SWIM | CAN_FLY +M:AQUATIC +M:CAN_FLY +M:CAN_SWIM # Used for astral mode N:8:Halls of Mandos @@ -149,8 +185,10 @@ W:1:98:1:14:160 L:1:100:1:0:1:0 O:20:20:20:20 A:56:100:56:0:56:0:57:58 -F:RANDOM_TOWNS | NO_RECALL | NO_SHAFT F:FILL_METHOD_0 +F:NO_RECALL +F:NO_SHAFT +F:RANDOM_TOWNS R:100:2 M:UNIQUE @@ -164,14 +202,20 @@ L:87:5:88:65:16:30 A:97:90:16:10:56:0:16:58 O:30:30:30:10 E:4d4:20:POISON -F:FINAL_GUARDIAN_481 F:CIRCULAR_ROOMS F:FILL_METHOD_2 +F:FINAL_GUARDIAN_481 R:2:0 R:49:3 -M:SPIDER | R_CHAR_c | R_CHAR_a | R_CHAR_I | +M:R_CHAR_I +M:R_CHAR_a +M:R_CHAR_c +M:SPIDER R:49:3 -M:ORC | R_CHAR_w | R_CHAR_m | R_CHAR_j +M:ORC +M:R_CHAR_j +M:R_CHAR_m +M:R_CHAR_w # The Heart of the Earth # levels 25-36 @@ -183,11 +227,20 @@ L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:40:10:10:20 G:life -F:EVOLVE | FINAL_GUARDIAN_1035 | NO_RECALL | NO_SHAFT | NO_UP +F:EVOLVE +F:FINAL_GUARDIAN_1035 +F:NO_RECALL +F:NO_SHAFT +F:NO_UP R:40:3 -M:R_CHAR_# | R_CHAR_X | R_CHAR_g | R_CHAR_E | +M:R_CHAR_# +M:R_CHAR_E +M:R_CHAR_X +M:R_CHAR_g R:30:3 -M:PASS_WALL | KILL_WALL | HURT_ROCK +M:HURT_ROCK +M:KILL_WALL +M:PASS_WALL R:30:0 # The Void @@ -201,13 +254,25 @@ A:183:90:102:10:0:0:102:102 A:40:60:0 O:25:25:25:25 E:20d6:100:DARK -F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_RECALL_OUT | NO_RECALL | -F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT +F:ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1_2 +F:EMPTY F:FILL_METHOD_2 -F:FINAL_GUARDIAN_1044 | +F:FINAL_GUARDIAN_1044 +F:FORGET +F:NO_BREATH +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_RECALL_OUT +F:NO_SHAFT +F:NO_STREAMERS R:1:0 R:99:3 -M:UNDEAD | DEMON | DRAGON | NONLIVING | SPIRIT +M:DEMON +M:DRAGON +M:NONLIVING +M:SPIRIT +M:UNDEAD # TEST dungeon N:12:Test @@ -218,7 +283,8 @@ L:0:95:5 A:177:100:0:0:0:0:85:87 A:100:0:0 O:20:20:20:20 -F:FILL_METHOD_3 | SMALL +F:FILL_METHOD_3 +F:SMALL R:100:0 G:dungeon2 @@ -233,13 +299,15 @@ L:88:85:84:15:1:0 A:56:75:87:25:56:0:57:58 O:30:30:30:2 E:1d1:20:RAISE -F:FINAL_GUARDIAN_804 | FINAL_ARTIFACT_91 F:FILL_METHOD_3 +F:FINAL_ARTIFACT_91 +F:FINAL_GUARDIAN_804 R:5:0 R:10:3 M:R_CHAR_p R:85:3 -M:UNDEAD | NONLIVING +M:NONLIVING +M:UNDEAD # The Illusory Castle # levels 35-52 @@ -251,14 +319,31 @@ L:1:98:188:2:1:0 A:56:50:189:50:56:0:57:58 O:50:10:20:20 E:6d2:6:CONFUSION -F:RANDOM_TOWNS | NO_STREAMERS -F:FINAL_GUARDIAN_1033 | FINAL_ARTIFACT_160 F:FILL_METHOD_1 +F:FINAL_ARTIFACT_160 +F:FINAL_GUARDIAN_1033 +F:NO_STREAMERS +F:RANDOM_TOWNS R:30:0 R:70:3 -M:STUPID | WEIRD_MIND | SHAPECHANGER | ATTR_MULTI | CHAR_MULTI | RAND_25 | -M:RAND_50 | EMPTY_MIND | INVISIBLE | PASS_WALL | KILL_WALL -S:BR_CONF | BR_CHAO | BA_CHAO | CONF | FORGET | TRAPS | MULTIPLY +M:ATTR_MULTI +M:CHAR_MULTI +M:EMPTY_MIND +M:INVISIBLE +M:KILL_WALL +M:PASS_WALL +M:RAND_25 +M:RAND_50 +M:SHAPECHANGER +M:STUPID +M:WEIRD_MIND +S:BA_CHAO +S:BR_CHAO +S:BR_CONF +S:CONF +S:FORGET +S:MULTIPLY +S:TRAPS # The Maze # Levels 25-37 @@ -270,8 +355,10 @@ L:1:100:1:0:1:0 A:56:98:48:2:56:0:57:58 O:2:40:10:40 G:maze -F:SMALLEST | FORGET -F:FINAL_GUARDIAN_1029 | FINAL_ARTIFACT_38 +F:FINAL_ARTIFACT_38 +F:FINAL_GUARDIAN_1029 +F:FORGET +F:SMALLEST R:80:0 R:20:3 M:R_CHAR_p @@ -285,14 +372,19 @@ W:10:22:8:35:200 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:5:50:10:25 -F:RANDOM_TOWNS | -F:FINAL_OBJECT_810 | FINAL_GUARDIAN_373 | CAVE | +F:CAVE F:FILL_METHOD_0 +F:FINAL_GUARDIAN_373 +F:FINAL_OBJECT_810 +F:RANDOM_TOWNS R:30:3 M:TROLL R:20:0 R:50:3 -M:ORC | R_CHAR_k | R_CHAR_o | R_CHAR_O +M:ORC +M:R_CHAR_O +M:R_CHAR_k +M:R_CHAR_o # Erebor # levels 60-72 @@ -303,14 +395,22 @@ W:60:72:30:20:140 L:88:100:1:0:1:0 A:97:90:87:10:56:0:57:97 O:40:40:40:40 -F:BIG | LAVA_RIVER | CAVERN | NO_RECALL | NO_STREAMERS -F:CAVE | DOUBLE | FINAL_GUARDIAN_715 | +F:BIG +F:CAVE +F:CAVERN +F:DOUBLE F:FILL_METHOD_2 +F:FINAL_GUARDIAN_715 +F:LAVA_RIVER +F:NO_RECALL +F:NO_STREAMERS R:10:0 R:60:1 -M:DRAGON | R_CHAR_D +M:DRAGON +M:R_CHAR_D R:30:1 -M:DRAGON | R_CHAR_d +M:DRAGON +M:R_CHAR_d # The Old Forest # levels 13-25 @@ -322,14 +422,20 @@ L:88:76:84:16:199:8 L:68:16:16 A:96:100:56:0:56:0:202:96 O:20:5:15:30 -F:WATER_RIVERS | NO_DOORS | NO_DESTROY | FLAT | NO_STREAMERS -F:RANDOM_TOWNS | FINAL_GUARDIAN_206 F:FILL_METHOD_3 +F:FINAL_GUARDIAN_206 +F:FLAT +F:NO_DESTROY +F:NO_DOORS +F:NO_STREAMERS +F:RANDOM_TOWNS +F:WATER_RIVERS R:30:0 R:40:3 -M:ANIMAL +M:ANIMAL R:30:3 -M:UNDEAD | R_CHAR_h +M:R_CHAR_h +M:UNDEAD # The Mines of Moria # levels 30-50 @@ -340,15 +446,19 @@ W:30:50:20:40:40 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:30:50:10:5 -F:FINAL_GUARDIAN_872 | WATER_RIVER | BIG | NO_STREAMERS +F:BIG +F:FILL_METHOD_0 +F:FINAL_GUARDIAN_872 F:FORCE_DOWN +F:NO_STREAMERS F:RANDOM_TOWNS +F:WATER_RIVER F:WILD_45_30__44_37 -F:FILL_METHOD_0 R:40:3 M:ORC R:30:3 -M:TROLL | GIANT +M:GIANT +M:TROLL R:20:3 M:DEMON R:10:0 @@ -362,16 +472,21 @@ W:57:70:34:24:160 L:1:80:174:20:1:0 A:56:100:56:0:56:0:57:58 O:20:1:70:9 -F:SMALL | FINAL_GUARDIAN_819 | FINAL_ARTIFACT_205 F:FILL_METHOD_3 +F:FINAL_ARTIFACT_205 +F:FINAL_GUARDIAN_819 +F:SMALL R:30:3 -M:R_CHAR_p | R_CHAR_P +M:R_CHAR_P +M:R_CHAR_p R:10:3 -M:ORC | TROLL +M:ORC +M:TROLL R:20:3 M:UNDEAD R:30:3 -M:DEMON | DRAGON +M:DEMON +M:DRAGON R:10:0 # Dungeons from Variaz @@ -386,8 +501,10 @@ L:84:100:84:0:84:0 A:97:100:56:0:56:0:57:58 O:10:10:30:30 E:1d1:20:ACID -F:FINAL_GUARDIAN_517 | NO_RECALL | NO_UP F:FILL_METHOD_0 +F:FINAL_GUARDIAN_517 +F:NO_RECALL +F:NO_UP R:10:0 R:10:3 M:AQUATIC @@ -407,9 +524,12 @@ W:45:70:20:14:160 L:89:100:89:0:89:0 A:97:100:56:0:56:0:97:97 O:20:20:20:20 -F:RANDOM_TOWNS | FLAT | NO_STREAMERS -F:FINAL_GUARDIAN_789 | FINAL_ARTIFACT_27 F:FILL_METHOD_0 +F:FINAL_ARTIFACT_27 +F:FINAL_GUARDIAN_789 +F:FLAT +F:NO_STREAMERS +F:RANDOM_TOWNS R:60:3 M:CAN_FLY R:40:0 @@ -423,10 +543,14 @@ W:26:40:15:14:160 L:89:100:1:0:1:0 A:89:50:96:25:84:25:57:58 O:20:20:20:20 -F:RANDOM_TOWNS | FLAT | NO_STREAMERS | FINAL_GUARDIAN_990 F:FILL_METHOD_1 +F:FINAL_GUARDIAN_990 +F:FLAT +F:NO_STREAMERS +F:RANDOM_TOWNS R:30:3 -M:R_CHAR_p | R_CHAR_h +M:R_CHAR_h +M:R_CHAR_p R:30:3 M:ANIMAL R:40:0 @@ -440,9 +564,11 @@ W:22:30:12:5:200 L:91:85:94:10:93:5 A:98:100:96:0:84:0:94:94 O:15:5:60:20 -F:NO_DOORS | SAND_VEIN | -F:FINAL_GUARDIAN_1030 | FINAL_ARTIFACT_153 F:FILL_METHOD_0 +F:FINAL_ARTIFACT_153 +F:FINAL_GUARDIAN_1030 +F:NO_DOORS +F:SAND_VEIN R:90:3 M:R_CHAR_w R:10:3 @@ -455,8 +581,11 @@ W:1:1:1:30:255 L:1:100:1:0:1:0 A:1:100:1:0:1:0:1:1 O:1:1:1:1 -F:EMPTY | SMALLEST | NO_RECALL | NO_STREAMERS +F:EMPTY F:FILL_METHOD_0 +F:NO_RECALL +F:NO_STREAMERS +F:SMALLEST R:100:0 # The Grinding Ice @@ -471,9 +600,12 @@ A:95:0:56:100:56:0:57:58 A:100:0:0 O:20:20:20:20 E:1d4:15:COLD -F:DOUBLE | WATER_RIVER | CAVERN | NO_STREAMERS -F:FINAL_GUARDIAN_1034 | +F:CAVERN +F:DOUBLE F:FILL_METHOD_2 +F:FINAL_GUARDIAN_1034 +F:NO_STREAMERS +F:WATER_RIVER R:100:1 M:IM_COLD @@ -487,7 +619,8 @@ W:1:50:1:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:FILL_METHOD_4 | NO_RECALL +F:FILL_METHOD_4 +F:NO_RECALL R:100:0 # N:: diff --git a/lib/edit/e_info.txt b/lib/edit/e_info.txt index f3bc1d31..0116d47c 100644 --- a/lib/edit/e_info.txt +++ b/lib/edit/e_info.txt @@ -93,7 +93,8 @@ T:6:0:255 W:10:1:8:50000 C:-40:-40:0:3 R:100 -F:MANA | SPELL +F:MANA +F:SPELL R:50 F:PVAL_M2 @@ -104,7 +105,10 @@ W:0:2:8:40000 C:0:0:0:0 R:100 F:ACTIVATE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE ### Body Armor ### @@ -114,8 +118,10 @@ T:37:0:255 X:A:30:16 W:0:4:20:1000 R:100 -F:RES_ACID | IGNORE_ACID -f:RES_ACID | IGNORE_ACID +F:IGNORE_ACID +F:RES_ACID +f:IGNORE_ACID +f:RES_ACID N:6:of Resist Lightning T:36:0:255 @@ -123,8 +129,10 @@ T:37:0:255 X:A:30:10 W:0:4:20:400 R:100 -F:RES_ELEC | IGNORE_ELEC -f:RES_ELEC | IGNORE_ELEC +F:IGNORE_ELEC +F:RES_ELEC +f:IGNORE_ELEC +f:RES_ELEC N:7:of Resist Fire T:36:0:15 @@ -133,8 +141,10 @@ T:37:0:255 X:A:30:14 W:0:4:20:800 R:100 -F:RES_FIRE | IGNORE_FIRE -f:RES_FIRE | IGNORE_FIRE +F:IGNORE_FIRE +F:RES_FIRE +f:IGNORE_FIRE +f:RES_FIRE N:8:of Resist Cold T:36:0:15 @@ -143,8 +153,10 @@ T:37:0:255 X:A:30:12 W:0:4:20:600 R:100 -F:RES_COLD | IGNORE_COLD -f:RES_COLD | IGNORE_COLD +F:IGNORE_COLD +F:RES_COLD +f:IGNORE_COLD +f:RES_COLD N:9:of Resistance T:36:0:255 @@ -153,9 +165,18 @@ X:A:30:20 W:0:2:20:12500 C:0:0:10:0 R:100 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE R:25 F:R_HIGH @@ -166,11 +187,18 @@ X:B:30:25 W:0:2:20:15000 C:0:0:10:3 R:100 -F:STEALTH | ESP_ORC -f:STEALTH -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ESP_ORC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:STEALTH +f:STEALTH R:25 F:RES_POIS @@ -181,10 +209,22 @@ X:A:30:30 W:0:1:10:30000 C:0:0:10:0 R:100 -F:SUST_STR | SUST_DEX | SUST_CON | SUST_INT | SUST_WIS | SUST_CHR | -F:HOLD_LIFE | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS R:2 F:R_IMMUNITY @@ -195,7 +235,10 @@ X:A:30:0 W:0:1:10:0 C:0:0:0:-6 R:100 -F:CON | STR | R_STAT | CURSED +F:CON +F:CURSED +F:R_STAT +F:STR # No CURSE_NO_DROP here, players seems to unlike surprises # Mithirl & Adamantite mails & PDSM @@ -238,8 +281,10 @@ T:34:7:255 X:A:32:16 W:0:6:22:1000 R:100 -F:RES_ACID | IGNORE_ACID -f:RES_ACID | IGNORE_ACID +F:IGNORE_ACID +F:RES_ACID +f:IGNORE_ACID +f:RES_ACID N:17:of Resist Lightning T:34:0:5 @@ -248,8 +293,10 @@ T:115:56:56 X:A:32:10 W:0:6:22:400 R:100 -F:RES_ELEC | IGNORE_ELEC -f:RES_ELEC | IGNORE_ELEC +F:IGNORE_ELEC +F:RES_ELEC +f:IGNORE_ELEC +f:RES_ELEC N:18:of Resist Fire T:34:0:5 @@ -258,8 +305,10 @@ T:115:56:56 X:A:32:14 W:0:6:22:800 R:100 -F:RES_FIRE | IGNORE_FIRE -f:RES_FIRE | IGNORE_FIRE +F:IGNORE_FIRE +F:RES_FIRE +f:IGNORE_FIRE +f:RES_FIRE N:19:of Resist Cold T:115:56:56 @@ -268,8 +317,10 @@ T:34:7:255 X:A:32:12 W:0:6:22:600 R:100 -F:RES_COLD | IGNORE_COLD -f:RES_COLD | IGNORE_COLD +F:IGNORE_COLD +F:RES_COLD +f:IGNORE_COLD +f:RES_COLD N:20:of Resistance T:115:56:56 @@ -279,9 +330,18 @@ X:A:32:20 W:0:2:22:12500 C:0:0:10:0 R:100 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE N:21:of Reflection T:115:56:56 @@ -291,9 +351,12 @@ X:A:32:20 W:0:2:22:15000 C:0:0:5:0 R:100 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:REFLECT f:REFLECT -F:IGNORE_ELEC | IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE # Metal shields only N:22:of Electricity @@ -303,7 +366,9 @@ T:34:10:10 X:A:32:10 W:0:2:22:400 R:100 -F:RES_ELEC | IGNORE_ELEC | SH_ELEC +F:IGNORE_ELEC +F:RES_ELEC +F:SH_ELEC f:SH_ELEC ### Crowns and Helms ### @@ -316,7 +381,10 @@ X:A:33:13 C:0:0:0:2 W:0:1:8:500 R:100 -F:DEX | SUST_DEX | ACTIVATE | ESP_ORC +F:ACTIVATE +F:DEX +F:ESP_ORC +F:SUST_DEX a:NOLDOR N:24:of Intelligence @@ -327,7 +395,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INT | SUST_INT +F:INT +F:SUST_INT f:INT N:25:of Wisdom @@ -338,7 +407,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:WIS | SUST_WIS +F:SUST_WIS +F:WIS f:WIS N:26:of Beauty @@ -349,7 +419,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:CHR | SUST_CHR +F:CHR +F:SUST_CHR f:CHR # 40% chance of increase spell power @@ -359,14 +430,23 @@ W:0:1:8:7500 C:0:0:0:3 T:33:0:99 R:100 -F:INT | SUST_INT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:ABILITY | R_HIGH +F:ABILITY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_HIGH +F:SUST_INT R:40 F:SPELL R:50 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST N:28:of Might X:A:33:19 @@ -374,8 +454,14 @@ W:0:1:8:2000 C:0:0:0:3 T:33:0:99 R:100 -F:STR | DEX | CON | SUST_STR | SUST_DEX | SUST_CON | FREE_ACT +F:CON +F:DEX +F:FREE_ACT F:R_HIGH +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR N:29:of Lordliness X:A:33:17 @@ -383,8 +469,11 @@ W:0:1:8:2000 C:0:0:0:3 T:33:0:99 R:100 -F:WIS | CHR | SUST_WIS | SUST_CHR +F:CHR F:R_HIGH +F:SUST_CHR +F:SUST_WIS +F:WIS N:30:of Seeing X:A:33:8 @@ -395,7 +484,9 @@ T:32:8:99 T:33:0:99 T:115:57:57 R:100 -F:SEARCH | RES_BLIND | SEE_INVIS +F:RES_BLIND +F:SEARCH +F:SEE_INVIS f:SEARCH R:20 F:ESP_ALL @@ -408,7 +499,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INFRA | HIDE_TYPE +F:HIDE_TYPE +F:INFRA f:INFRA N:32:of Light @@ -418,7 +510,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:LITE1 | RES_LITE +F:LITE1 +F:RES_LITE f:LITE1 N:33:of Telepathy @@ -460,7 +553,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INT | CURSED +F:CURSED +F:INT f:INT # No CURSE_NO_DROP here, players seems to unlike surprises @@ -492,7 +586,9 @@ C:0:0:0:-5 W:0:1:7:0 T:33:0:99 R:100 -F:STR | DEX | CON +F:CON +F:DEX +F:STR N:40:Dwarven T:32:0:6 @@ -501,7 +597,11 @@ X:B:33:13 C:0:0:0:2 W:0:1:8:500 R:100 -F:INFRA | CON | RES_FIRE | ESP_TROLL | ESP_DRAGON +F:CON +F:ESP_DRAGON +F:ESP_TROLL +F:INFRA +F:RES_FIRE ### Cloaks ### @@ -512,7 +612,11 @@ W:0:4:19:1500 C:0:0:10:0 T:35:0:255 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | RES_SHARDS +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SHARDS N:42:of Stealth X:A:31:10 @@ -529,10 +633,13 @@ W:0:1:28:4000 C:0:0:20:3 T:35:0:255 R:100 -F:STEALTH | -f:STEALTH | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:STEALTH +f:STEALTH # Aura, Fire N:44:of Immolation @@ -541,7 +648,10 @@ W:0:1:18:4000 C:0:0:4:0 T:35:0:255 R:100 -F:IGNORE_ACID | IGNORE_FIRE | SH_FIRE | RES_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_FIRE +F:SH_FIRE f:SH_FIRE N:45:of Enveloping @@ -566,7 +676,8 @@ W:0:1:3:0 C:-15:-15:0:0 T:35:0:255 R:100 -F:AGGRAVATE | SHOW_MODS +F:AGGRAVATE +F:SHOW_MODS # Aura, Electricity N:48:of Electricity @@ -575,7 +686,10 @@ W:0:1:18:4000 C:0:0:4:0 T:35:0:255 R:100 -F:IGNORE_ACID | IGNORE_ELEC | SH_ELEC | RES_ELEC +F:IGNORE_ACID +F:IGNORE_ELEC +F:RES_ELEC +F:SH_ELEC ### Gloves ### @@ -601,7 +715,8 @@ W:0:2:10:1000 C:0:0:0:5 T:31:0:99 R:100 -F:DEX | HIDE_TYPE +F:DEX +F:HIDE_TYPE f:DEX N:52:of Power @@ -610,9 +725,11 @@ X:A:34:22 W:0:1:10:2500 C:5:5:0:5 R:100 -F:STR | SHOW_MODS | HIDE_TYPE -f:STR +F:HIDE_TYPE F:R_HIGH +F:SHOW_MODS +F:STR +f:STR # 53 Gauntlets only N:53:of Peace @@ -621,7 +738,8 @@ W:0:1:3:0 C:-10:-10:0:0 T:31:2:2 R:100 -F:HEAVY_CURSE | CURSED +F:CURSED +F:HEAVY_CURSE # 54 Gloves only N:54:of Charming @@ -687,7 +805,8 @@ W:0:1:27:200000 C:0:0:0:10 T:30:0:99 R:100 -F:SPEED | HIDE_TYPE +F:HIDE_TYPE +F:SPEED f:SPEED R:10 F:PVAL_M3 @@ -700,7 +819,9 @@ W:0:1:20:5000 C:0:0:0:6 T:30:6:6 R:100 -F:CON | INFRA | RES_DARK +F:CON +F:INFRA +F:RES_DARK R:33 F:STR @@ -727,7 +848,8 @@ W:0:1:3:0 C:0:0:0:-10 T:30:0:99 R:100 -F:SPEED | AGGRAVATE +F:AGGRAVATE +F:SPEED ### Weapons ### @@ -741,10 +863,16 @@ X:A:24:30 W:0:2:44:20000 C:6:6:4:3 R:100 -F:WIS | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | -F:SEE_INVIS | BLESSED | RES_FEAR | ESP_EVIL -F:SUSTAIN | LIMIT_BLOWS +F:BLESSED +F:ESP_EVIL +F:LIMIT_BLOWS +F:RES_FEAR +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SUSTAIN +F:WIS R:10 F:BLOWS R:1 @@ -761,12 +889,22 @@ X:A:24:25 W:0:2:44:15000 C:4:4:8:4 R:100 -F:STEALTH | -f:STEALTH | -F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:SUSTAIN | R_HIGH +F:FEATHER +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_HIGH +F:SEE_INVIS +F:STEALTH +F:SUSTAIN +f:STEALTH R:33 F:RES_POIS @@ -779,8 +917,10 @@ X:B:24:20 W:0:1:44:5000 C:0:0:0:3 R:100 -F:WIS | ESP_GOOD -F:BLESSED | ABILITY +F:ABILITY +F:BLESSED +F:ESP_GOOD +F:WIS f:BLESSED N:68:of Greater Life @@ -794,7 +934,8 @@ W:0:1:50:30000 C:5:5:0:3 r:N:MUST2H R:100 -F:LIFE | HOLD_LIFE +F:HOLD_LIFE +F:LIFE f:LIFE N:69:of Westernesse @@ -807,9 +948,17 @@ X:A:24:20 W:0:2:44:20000 C:5:5:0:2 R:100 -F:STR | DEX | CON | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | -F:FREE_ACT | SEE_INVIS | ESP_ORC | ESP_TROLL | ESP_GIANT +F:CON +F:DEX +F:ESP_GIANT +F:ESP_ORC +F:ESP_TROLL +F:FREE_ACT +F:SEE_INVIS +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:STR R:33 F:RES_FEAR R:50 @@ -841,7 +990,8 @@ X:A:24:15 W:0:2:44:2500 C:0:0:0:0 R:100 -F:SLAY_WEAP | WOUNDING +F:SLAY_WEAP +F:WOUNDING N:72:of Spinning T:125:0:255 @@ -854,7 +1004,10 @@ X:A:24:18 W:0:1:44:9000 C:8:8:0:2 R:100 -F:DEX | STR | VORPAL | ACTIVATE +F:ACTIVATE +F:DEX +F:STR +F:VORPAL a:SPIN # The "Elemental" brands (4) (6) @@ -870,7 +1023,9 @@ T:115:55:55 X:B:24:15 W:0:4:44:5000 R:100 -F:BRAND_ACID | RES_ACID | IGNORE_ACID +F:BRAND_ACID +F:IGNORE_ACID +F:RES_ACID f:BRAND_ACID N:74:Shocking @@ -884,7 +1039,9 @@ T:115:55:55 X:B:24:20 W:0:4:44:4500 R:100 -F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC +F:BRAND_ELEC +F:IGNORE_ELEC +F:RES_ELEC f:BRAND_ELEC N:75:Fiery @@ -898,8 +1055,11 @@ T:115:55:55 X:B:24:20 W:0:4:44:3500 R:100 -F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE | LITE1 -f:BRAND_FIRE | +F:BRAND_FIRE +F:IGNORE_FIRE +F:LITE1 +F:RES_FIRE +f:BRAND_FIRE N:76:Frozen T:125:0:255 @@ -912,8 +1072,10 @@ T:115:55:55 X:B:24:15 W:0:4:44:3000 R:100 -F:BRAND_COLD | RES_COLD | IGNORE_COLD -f:BRAND_COLD | +F:BRAND_COLD +F:IGNORE_COLD +F:RES_COLD +f:BRAND_COLD N:77:Venomous T:125:0:255 @@ -926,8 +1088,9 @@ T:115:55:55 X:B:24:20 W:0:4:44:4000 R:100 -F:BRAND_POIS | RES_POIS -f:BRAND_POIS | +F:BRAND_POIS +F:RES_POIS +f:BRAND_POIS N:78:Chaotic T:125:0:255 @@ -940,9 +1103,13 @@ T:115:55:55 X:B:24:28 W:0:1:44:10000 R:100 -F:CHAOTIC | RES_CHAOS | IGNORE_ELEC | IGNORE_ACID | IGNORE_FIRE -f:CHAOTIC +F:CHAOTIC +F:IGNORE_ACID +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS F:R_ANY +f:CHAOTIC N:79:Sharp T:125:0:255 @@ -963,7 +1130,10 @@ X:A:24:20 W:0:1:44:4000 C:10:10:0:6 R:100 -F:IMPACT | STR | TUNNEL | HIDE_TYPE +F:HIDE_TYPE +F:IMPACT +F:STR +F:TUNNEL f:IMPACT # The "Slay" brands (8) @@ -1088,8 +1258,13 @@ X:A:24:20 W:0:2:44:6000 C:0:0:0:2 R:100 -F:INT | SLAY_ANIMAL | SLOW_DIGEST | STEALTH | ESP_ANIMAL -f:SLAY_ANIMAL | STEALTH +F:ESP_ANIMAL +F:INT +F:SLAY_ANIMAL +F:SLOW_DIGEST +F:STEALTH +f:SLAY_ANIMAL +f:STEALTH N:90:of *Slay Evil* T:125:0:255 @@ -1102,8 +1277,13 @@ X:A:24:20 W:0:2:44:6000 C:0:0:0:2 R:100 -F:WIS | SLAY_EVIL | BLESSED | ESP_EVIL | RES_FEAR | ABILITY -f:SLAY_EVIL | +F:ABILITY +F:BLESSED +F:ESP_EVIL +F:RES_FEAR +F:SLAY_EVIL +F:WIS +f:SLAY_EVIL N:91:of *Slay Undead* T:125:0:255 @@ -1117,8 +1297,12 @@ X:A:24:24 W:0:2:44:8000 C:0:0:0:2 R:100 -F:WIS | KILL_UNDEAD | SEE_INVIS | ESP_UNDEAD | RES_NETHER -f:KILL_UNDEAD | +F:ESP_UNDEAD +F:KILL_UNDEAD +F:RES_NETHER +F:SEE_INVIS +F:WIS +f:KILL_UNDEAD N:92:of *Slay Demon* T:125:0:255 @@ -1132,8 +1316,12 @@ X:A:24:16 W:0:2:44:8000 C:0:0:0:2 R:100 -F:INT | KILL_DEMON | ESP_DEMON | RES_FIRE | RES_CHAOS -f:KILL_DEMON | +F:ESP_DEMON +F:INT +F:KILL_DEMON +F:RES_CHAOS +F:RES_FIRE +f:KILL_DEMON N:93:of *Slay Orc* T:15:0:255 @@ -1146,8 +1334,11 @@ X:A:24:14 W:0:2:44:4000 C:0:0:0:2 R:100 -F:DEX | SLAY_ORC | ESP_ORC | SUST_DEX | -f:SLAY_ORC | +F:DEX +F:ESP_ORC +F:SLAY_ORC +F:SUST_DEX +f:SLAY_ORC N:94:of *Slay Troll* T:15:0:255 @@ -1160,8 +1351,12 @@ X:A:24:14 W:0:2:44:4000 C:0:0:0:2 R:100 -F:STR | SLAY_TROLL | ESP_TROLL | REGEN | SUST_STR -f:SLAY_TROLL | +F:ESP_TROLL +F:REGEN +F:SLAY_TROLL +F:STR +F:SUST_STR +f:SLAY_TROLL N:95:of *Slay Giant* T:15:0:255 @@ -1174,8 +1369,12 @@ X:A:24:16 W:0:2:44:4000 C:0:0:0:2 R:100 -F:STR | SLAY_GIANT | ESP_GIANT | RES_SHARDS | SUST_STR -f:SLAY_GIANT | +F:ESP_GIANT +F:RES_SHARDS +F:SLAY_GIANT +F:STR +F:SUST_STR +f:SLAY_GIANT N:96:of *Slay Dragon* T:15:0:255 @@ -1188,9 +1387,13 @@ X:A:24:24 W:0:2:44:8000 C:0:0:0:2 R:100 -F:CON | KILL_DRAGON | ESP_DRAGON | RES_FEAR | +F:CON +F:ESP_DRAGON +F:KILL_DRAGON +F:RES_FEAR +F:R_ELEM +F:R_LOW f:KILL_DRAGON -F:R_LOW | R_ELEM R:20 F:RES_POIS @@ -1202,8 +1405,11 @@ X:B:24:25 W:0:2:44:10000 C:0:0:0:-2 R:100 -F:LIFE | VAMPIRIC | HOLD_LIFE -f:LIFE | VAMPIRIC +F:HOLD_LIFE +F:LIFE +F:VAMPIRIC +f:LIFE +f:VAMPIRIC N:98:(*Defender*) T:21:0:255 @@ -1214,18 +1420,40 @@ X:A:24:35 W:0:1:100:50000 C:-15:-15:20:4 R:100 -F:STEALTH | RES_POIS | DEX | CON | WIS | HOLD_LIFE | +F:CON +F:DEX +F:FEATHER +F:FREE_ACT +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:STEALTH +F:SUSTAIN +F:WIS f:STEALTH -F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:R_ANY | R_LOW | SUSTAIN R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY N:99:of the Thunderlords T:21:0:255 @@ -1237,13 +1465,25 @@ W:0:1:100:7000 C:4:4:0:2 a:TELEPORT R:100 -F:SLAY_EVIL | KILL_DRAGON | TELEPORT | FREE_ACT | SEARCH | BRAND_ELEC -F:REGEN | SLOW_DIGEST | RES_NEXUS | ACTIVATE | FLY | ESP_DRAGON +F:ACTIVATE +F:BRAND_ELEC +F:ESP_DRAGON +F:FLY +F:FREE_ACT +F:KILL_DRAGON +F:REGEN +F:RES_NEXUS F:R_HIGH +F:SEARCH +F:SLAY_EVIL +F:SLOW_DIGEST +F:TELEPORT R:12 F:ABILITY R:2 -F:R_P_ABILITY | PVAL_M3 | LIMIT_BLOWS +F:LIMIT_BLOWS +F:PVAL_M3 +F:R_P_ABILITY N:100:of Gondolin T:21:0:255 @@ -1254,10 +1494,21 @@ X:A:24:26 W:0:1:44:25000 C:7:7:0:3 R:100 -F:STR | CON | ESP_EVIL | RES_FEAR | -F:SLAY_EVIL | SLAY_TROLL | SLAY_DRAGON | SLAY_DEMON | -F:FREE_ACT | SEE_INVIS | LITE1 | RES_DARK | ABILITY | -F:IGNORE_ACID | IGNORE_FIRE +F:ABILITY +F:CON +F:ESP_EVIL +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_FIRE +F:LITE1 +F:RES_DARK +F:RES_FEAR +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_TROLL +F:STR R:33 F:R_HIGH R:33 @@ -1273,9 +1524,12 @@ X:A:24:4 W:0:1:2:500 C:0:0:0:5 R:100 -F:TUNNEL | -f:TUNNEL | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:TUNNEL +f:TUNNEL # More weapons @@ -1289,8 +1543,11 @@ T:115:55:55 X:B:24:30 W:0:1:5:5000 R:100 -F:SLAY_UNDEAD | SEE_INVIS | HOLD_LIFE | DRAIN_HP F:ACTIVATE +F:DRAIN_HP +F:HOLD_LIFE +F:SEE_INVIS +F:SLAY_UNDEAD a:SPECTRAL N:103:of Morgul @@ -1304,9 +1561,15 @@ X:A:24:0 W:0:1:1:0 C:-20:-20:-10:-10 R:100 +F:AGGRAVATE +F:AUTO_CURSE +F:BLACK_BREATH +F:CURSED +F:DRAIN_EXP +F:HEAVY_CURSE F:LUCK -F:SEE_INVIS | AGGRAVATE | HEAVY_CURSE | CURSED | BLACK_BREATH | DRAIN_EXP | -F:AUTO_CURSE | WOUNDING +F:SEE_INVIS +F:WOUNDING # No CURSE_NO_DROP here, players seems to unlike surprises N:104:of Nothingness @@ -1320,7 +1583,10 @@ X:A:24:0 W:0:1:2:0 C:-100:-100:0:0 R:100 -F:NEVER_BLOW | HEAVY_CURSE | CURSED | AUTO_CURSE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:NEVER_BLOW ### Missile Launchers ### @@ -1345,8 +1611,10 @@ X:A:25:20 W:0:4:21:10000 C:5:10:0:1 R:100 -F:XTRA_MIGHT | PVAL_M3 | R_ANY -f:XTRA_MIGHT | +F:PVAL_M3 +F:R_ANY +F:XTRA_MIGHT +f:XTRA_MIGHT N:108:of Extra Shots T:19:0:255 @@ -1354,8 +1622,9 @@ X:A:25:20 C:10:5:0:1 W:0:4:21:10000 R:100 -F:XTRA_SHOTS | PVAL_M2 -f:XTRA_SHOTS | +F:PVAL_M2 +F:XTRA_SHOTS +f:XTRA_SHOTS # Bows only N:109:of Lothlorien @@ -1364,8 +1633,14 @@ X:A:25:20 W:50:2:21:30000 C:10:10:0:2 R:100 -F:DEX | XTRA_MIGHT | FREE_ACT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE | -F:BLESSED | ABILITY +F:ABILITY +F:BLESSED +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT # Crossbows only N:110:of the Haradrim @@ -1374,7 +1649,11 @@ X:A:25:30 W:50:2:21:20000 C:5:15:0:1 R:100 -F:XTRA_MIGHT | XTRA_SHOTS | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT +F:XTRA_SHOTS # Slings only N:111:of Buckland @@ -1383,7 +1662,12 @@ W:40:2:21:20000 C:8:8:0:2 T:19:2:2 R:100 -F:DEX | XTRA_SHOTS | XTRA_MIGHT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE +F:DEX +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT +F:XTRA_SHOTS ### Ammo ### @@ -1434,8 +1718,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_ACID | IGNORE_ACID -f:BRAND_ACID | +F:BRAND_ACID +F:IGNORE_ACID +f:BRAND_ACID W:0:1:12:30 # 117 All Elements at once - melee weapon @@ -1447,16 +1732,26 @@ T:22:0:99 T:23:0:99 T:24:0:99 R:100 -F:BRAND_ACID | RES_ACID | IGNORE_ACID -F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC -F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE -F:BRAND_COLD | RES_COLD | IGNORE_COLD -F:BRAND_POIS | RES_POIS | DRAIN_MANA -f:BRAND_ACID | -f:BRAND_ELEC | -f:BRAND_FIRE | -f:BRAND_COLD | -f:BRAND_POIS | +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_MANA +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +f:BRAND_ACID +f:BRAND_COLD +f:BRAND_ELEC +f:BRAND_FIRE +f:BRAND_POIS N:118:of Slay Demon T:16:0:99 @@ -1491,8 +1786,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_ELEC | IGNORE_ELEC -f:BRAND_ELEC | +F:BRAND_ELEC +F:IGNORE_ELEC +f:BRAND_ELEC W:0:1:12:30 N:122:of Flame @@ -1501,8 +1797,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_FIRE | IGNORE_FIRE -f:BRAND_FIRE | +F:BRAND_FIRE +F:IGNORE_FIRE +f:BRAND_FIRE W:0:2:12:25 N:123:of Frost @@ -1511,8 +1808,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_COLD | IGNORE_COLD -f:BRAND_COLD | +F:BRAND_COLD +F:IGNORE_COLD +f:BRAND_COLD W:0:2:12:25 N:124:of Wounding @@ -1563,9 +1861,15 @@ X:A:25:20 W:0:2:3:1000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | -F:RES_ACID | CHR | SEE_INVIS -F:R_ANY | PVAL_M2 +F:CHR +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M2 +F:RES_ACID +F:R_ANY +F:SEE_INVIS R:25 F:PVAL_M1 @@ -1576,9 +1880,19 @@ X:A:25:20 W:0:1:3:2000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SUST_CHR | -F:RES_FIRE | RES_COLD | RES_ELEC | RES_ACID | CHR | SEE_INVIS -F:R_ANY | PVAL_M3 +F:CHR +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M3 +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_ANY +F:SEE_INVIS +F:SUST_CHR R:50 F:PVAL_M1 R:35 @@ -1592,8 +1906,13 @@ X:B:25:20 W:0:1:2:2000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | ACTIVATE -F:R_ANY | PVAL_M2 +F:ACTIVATE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M2 +F:R_ANY R:50 F:PVAL_M1 R:25 @@ -1643,7 +1962,10 @@ X:A:51:10 W:0:1:10:10000 C:0:0:0:0 R:100 -F:CAPACITY | CHARGING | CHEAPNESS | FAST_CAST | +F:CAPACITY +F:CHARGING +F:CHEAPNESS +F:FAST_CAST ### Lights ### @@ -1694,10 +2016,10 @@ R:100 F:LITE1 F:LITE2 F:LITE3 +F:RES_DARK f:LITE1 f:LITE2 f:LITE3 -F:RES_DARK N:141:of the Shadows X:A:0:6 @@ -1726,7 +2048,8 @@ T:39:0:99 W:0:3:40:4000 C:0:0:0:0 R:100 -F:RES_BLIND | SEE_INVIS +F:RES_BLIND +F:SEE_INVIS N:144:of the Ethereal Eye X:A:0:7 @@ -1751,9 +2074,19 @@ X:B:30:18 W:0:2:20:5000 C:0:0:15:2 R:100 -F:STR | CON | INFRA | FREE_ACT | HIDE_TYPE | -F:RES_FEAR | RES_DARK | SUST_STR | SUST_CON | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INFRA +F:RES_DARK +F:RES_FEAR +F:STR +F:SUST_CON +F:SUST_STR # Ring and Amulet egos @@ -1764,8 +2097,14 @@ T:45:0:255 W:0:1:10:1000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -f:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE N:148:Cursed X:B:0:0 @@ -1799,13 +2138,17 @@ T:65:31:255 W:0:1:20:1000 C:0:0:0:3 R:100 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:50 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:10 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:1 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 ### Trapping Kits ### @@ -1834,8 +2177,11 @@ T:46:0:99 W:0:1:10:3000 C:10:10:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | F:AUTOMATIC_5 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE f:AUTOMATIC_5 N:154:Fully Automatic @@ -1844,8 +2190,11 @@ T:46:0:99 W:0:1:15:5000 C:10:10:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | F:AUTOMATIC_99 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE f:AUTOMATIC_99 N:155:Well-hidden @@ -1854,8 +2203,12 @@ T:46:0:99 W:0:1:8:1000 C:15:15:5:12 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | -F:STEALTH | HIDE_TYPE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:STEALTH f:STEALTH N:156:Complicated @@ -1864,7 +2217,10 @@ T:46:0:99 W:0:1:12:2000 C:15:15:30:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:157:Obvious X:B:0:0 @@ -1872,7 +2228,9 @@ T:46:0:99 W:0:1:1:0 C:-20:-20:-20:-20 R:100 -F:STEALTH | CURSED | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:STEALTH f:STEALTH N:158:for Dragons @@ -1881,8 +2239,12 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_DRAGON | HIDE_TYPE | XTRA_SHOTS | -F:IGNORE_ACID | IGNORE_FIRE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:ONLY_DRAGON +F:STEALTH +F:XTRA_SHOTS N:159:for Demons X:A:0:5 @@ -1890,8 +2252,12 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_DEMON | HIDE_TYPE | XTRA_SHOTS -F:IGNORE_ACID | IGNORE_FIRE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:ONLY_DEMON +F:STEALTH +F:XTRA_SHOTS N:160:for Animals X:A:0:5 @@ -1899,7 +2265,10 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_ANIMAL | HIDE_TYPE | XTRA_SHOTS +F:HIDE_TYPE +F:ONLY_ANIMAL +F:STEALTH +F:XTRA_SHOTS N:161:for Undead X:A:0:5 @@ -1907,7 +2276,11 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_UNDEAD | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST +F:HIDE_TYPE +F:KILL_GHOST +F:ONLY_UNDEAD +F:STEALTH +F:XTRA_SHOTS N:162:for Evil X:A:0:5 @@ -1915,7 +2288,11 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_EVIL | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST +F:HIDE_TYPE +F:KILL_GHOST +F:ONLY_EVIL +F:STEALTH +F:XTRA_SHOTS # Lite ego N:163:of the Magi @@ -1925,15 +2302,19 @@ W:0:1:150:2000 C:0:0:0:3 Z:magic map R:100 -F:INT | WIS | CHR +F:CHR +F:INT +F:WIS R:60 -F:INVIS | RES_BLIND +F:INVIS +F:RES_BLIND R:30 F:R_HIGH R:30 F:PVAL_M2 R:50: -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST ### New ego-items added by JLE @@ -1945,7 +2326,8 @@ C:0:0:-50:0 T:36:0:99 T:37:0:99 R:100 -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:CURSED # Shield of Vulnerability (the only cursed shield) N:165:of Vulnerability @@ -1955,7 +2337,8 @@ C:0:0:-50:0 T:115:56:56 T:34:0:99 R:100 -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:CURSED # Shield of Preservation - N:166:of Preservation @@ -1965,8 +2348,16 @@ C:-10:-10:20:0 T:115:56:56 T:34:0:99 R:100 -F:RES_DISEN | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE | R_HIGH | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_DISEN +F:R_HIGH +F:SUST_CON +F:SUST_DEX +F:SUST_STR R:33 F:R_LOW R:33 @@ -1980,7 +2371,9 @@ T:32:0:6 T:32:8:99 T:33:0:99 R:100 -F:RES_SOUND | RES_CONF | RES_FEAR +F:RES_CONF +F:RES_FEAR +F:RES_SOUND # Crown of Night and Day N:168:of Night and Day @@ -1988,7 +2381,12 @@ X:A:33:18 W:35:1:15:4000 T:33:0:99 R:100 -F:RES_LITE | RES_DARK | LITE1 | SEE_INVIS | RES_BLIND | IGNORE_ACID +F:IGNORE_ACID +F:LITE1 +F:RES_BLIND +F:RES_DARK +F:RES_LITE +F:SEE_INVIS # Cloak of the Magi N:169:of the Magi @@ -1997,9 +2395,16 @@ W:30:1:18:2000 C:-5:-5:5:3 T:35:0:99 R:100 -F:INT | SPEED | SUST_INT | FREE_ACT | STEALTH | HIDE_TYPE | IGNORE_ACID +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:INT +F:SPEED +F:STEALTH +F:SUST_INT R:30 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST # Cloak of Invisibility N:170:of Invisibility @@ -2008,7 +2413,9 @@ W:40:1:18:3000 C:0:0:10:5 T:35:0:99 R:100 -F:STEALTH | HIDE_TYPE | INVIS +F:HIDE_TYPE +F:INVIS +F:STEALTH f:INVIS # Cloak of the Bat @@ -2018,7 +2425,13 @@ W:50:1:35:3000 C:-10:-10:10:3 T:35:0:99 R:100 -F:SPEED | FLY | RES_DARK | SEE_INVIS | INFRA | HIDE_TYPE | STEALTH +F:FLY +F:HIDE_TYPE +F:INFRA +F:RES_DARK +F:SEE_INVIS +F:SPEED +F:STEALTH # Leather Gloves of Thievery N:172:of Thievery @@ -2027,7 +2440,13 @@ W:40:1:15:5000 C:8:3:0:5 T:31:1:1 R:100 -F:DEX | SEARCH | SHOW_MODS | FEATHER | FREE_ACT | HIDE_TYPE | IGNORE_ACID +F:DEX +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:SEARCH +F:SHOW_MODS R:10 F:SPEED @@ -2038,8 +2457,14 @@ W:50:1:15:7000 C:6:8:-20:2 T:31:2:99 R:100 -F:STR | CON | SHOW_MODS | AGGRAVATE | HIDE_TYPE | IGNORE_ACID | RES_FEAR | +F:AGGRAVATE +F:CON F:DRAIN_HP +F:HIDE_TYPE +F:IGNORE_ACID +F:RES_FEAR +F:SHOW_MODS +F:STR R:25 F:BLOWS @@ -2049,7 +2474,8 @@ X:A:35:20 W:0:3:27:5000 T:30:0:99 R:100 -F:RES_NEXUS | FEATHER +F:FEATHER +F:RES_NEXUS # Boots of Elvenkind (leather boots only) N:175:of Elvenkind @@ -2058,7 +2484,13 @@ W:60:1:36:200000 C:0:0:0:5 T:30:2:3 R:100 -F:STEALTH | SPEED | HIDE_TYPE | FEATHER | IGNORE_ACID | IGNORE_FIRE | ABILITY +F:ABILITY +F:FEATHER +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SPEED +F:STEALTH # Weapon of Fury (must be big heavy type of weapon, no daggers or whips) N:176:of Fury @@ -2071,8 +2503,14 @@ T:24:8:99 T:125:0:99 C:10:10:-20:2 R:100 -F:STR | BLOWS | AGGRAVATE | RES_FEAR | HIDE_TYPE | -F:IGNORE_ACID | IGNORE_FIRE | DRAIN_MANA +F:AGGRAVATE +F:BLOWS +F:DRAIN_MANA +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_FEAR +F:STR # Staffs of wishing N:177:of Plenty @@ -2121,7 +2559,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_COLD_3 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:182:Dragon T:14:7:7 @@ -2130,7 +2571,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_ELEC_3 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:183:Dragon T:14:7:7 @@ -2139,7 +2583,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_FIRE_H R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE # Helm of water breathing N:184:of Water Breathing @@ -2148,7 +2595,8 @@ C:0:0:0:2 W:15:1:25:1000 T:32:5:10 R:100 -F:WATER_BREATH | IGNORE_ACID +F:IGNORE_ACID +F:WATER_BREATH f:WATER_BREATH # A second of life for non MUST2H weapons, much lower value tho @@ -2163,7 +2611,8 @@ W:0:1:50:30000 C:5:5:0:1 r:F:MUST2H R:100 -F:LIFE | HOLD_LIFE +F:HOLD_LIFE +F:LIFE f:LIFE # Cloak of Air @@ -2191,7 +2640,10 @@ X:A:25:30 W:60:5:30:30000 C:10:15:20:2 R:120 -F:XTRA_MIGHT | XTRA_SHOTS | REFLECT | IMMOVABLE +F:IMMOVABLE +F:REFLECT +F:XTRA_MIGHT +F:XTRA_SHOTS # N: serial number : ego type # D: description diff --git a/lib/edit/f_info.txt b/lib/edit/f_info.txt index 5ab0cbdc..939af78e 100644 --- a/lib/edit/f_info.txt +++ b/lib/edit/f_info.txt @@ -25,39 +25,62 @@ F:FLOOR N:1:open floor G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT # 0x02 -> fountain N:2:fountain G:_:w -F:FLOOR | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:The liquid here seems magical. # 0x03 --> glyph of warding N:3:glyph of warding G:;:y -F:FLOOR | NOTICE | SUPPORT_LIGHT | CAN_RUN | REMEMBER +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is a mighty spell of protection here. # 0x04 --> open door N:4:open door G:':U -F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR +F:CAN_RUN +F:DOOR +F:FLOOR +F:NOTICE +F:REMEMBER # 0x05 --> broken door N:5:broken door G:':U -F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR +F:CAN_RUN +F:DOOR +F:FLOOR +F:NOTICE +F:REMEMBER # 0x06 --> up stairs (perm) N:6:up staircase G:<:w -F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is an up staircase here. D:1:You cannot tunnel a stair. @@ -65,60 +88,102 @@ D:1:You cannot tunnel a stair. N:7:down staircase G:>:w -F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is a down staircase here. D:1:You cannot tunnel a stair. N:8:quest entrance G:>:y -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a quest entrance. N:9:quest exit G:<:y -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a quest exit. N:10:quest down level G:>:r -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:11:quest up level G:<:r -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:12:town exit G:>:g -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:13:shaft down G:>:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a shaft down here. D:1:You cannot tunnel a shaft. N:14:shaft up G:<:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a shaft up here. D:1:You cannot tunnel a shaft. # 0x0F -> empty fountain N:15:fountain G:_:D -F:FLOOR | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:The fountain seems empty. N:16:web G:+:y -F:CAN_PASS | NOTICE | WEB | NOTICE | TUNNELABLE +F:CAN_PASS +F:NOTICE +F:NOTICE +F:TUNNELABLE +F:WEB D:1:You tunnel through the web. D:2:a web blocking your way # Trap -- the flags are not used by the program N:17:trap G:^:w -F:FLOOR | NOTICE | REMEMBER +F:FLOOR +F:NOTICE +F:REMEMBER # 0x12 --> 0x1F -- UNUSED @@ -127,8 +192,14 @@ F:FLOOR | NOTICE | REMEMBER N:32:door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 1) @@ -136,8 +207,14 @@ D:1:You bash the boor. N:33:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 2) @@ -145,8 +222,14 @@ D:1:You bash the boor. N:34:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 3) @@ -154,8 +237,14 @@ D:1:You bash the boor. N:35:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 4) @@ -163,8 +252,14 @@ D:1:You bash the boor. N:36:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 5) @@ -172,8 +267,14 @@ D:1:You bash the boor. N:37:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 6) @@ -181,8 +282,14 @@ D:1:You bash the boor. N:38:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 7) @@ -190,8 +297,14 @@ D:1:You bash the boor. N:39:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 0) @@ -199,8 +312,13 @@ D:1:You bash the boor. N:40:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 1) @@ -208,8 +326,13 @@ D:1:You bash the boor. N:41:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 2) @@ -217,8 +340,13 @@ D:1:You bash the boor. N:42:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 3) @@ -226,8 +354,13 @@ D:1:You bash the boor. N:43:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 4) @@ -235,8 +368,13 @@ D:1:You bash the boor. N:44:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 5) @@ -244,8 +382,13 @@ D:1:You bash the boor. N:45:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 6) @@ -253,8 +396,13 @@ D:1:You bash the boor. N:46:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 7) @@ -262,8 +410,13 @@ D:1:You bash the boor. N:47:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x30 --> secret door @@ -271,36 +424,55 @@ D:1:You bash the boor. N:48:secret door G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | DOOR +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:DOOR +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You tunnel. # 0x31 --> rubble N:49:pile of rubble G:::w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE -F:CAN_FLY | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You dig in the rubble. # 0x32 --> magma vein N:50:magma vein G:%:s -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x33 --> quartz vein N:51:quartz vein G:%:w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x34 --> magma vein + treasure @@ -308,9 +480,14 @@ D:1:You tunnel into the quartz vein. N:52:magma vein G:%:s M:50 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x35 --> quartz vein + treasure @@ -318,36 +495,55 @@ D:1:You tunnel into the magma vein. N:53:quartz vein G:%:w M:51 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x36 --> magma vein + known treasure N:54:magma vein with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x37 --> quartz vein + known treasure N:55:quartz vein with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x38 --> granite wall -- basic N:56:granite wall G:#:w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x39 --> granite wall -- inner @@ -355,9 +551,13 @@ D:1:You tunnel into the granite wall. N:57:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3A --> granite wall -- outer @@ -365,9 +565,13 @@ D:1:You tunnel into the granite wall. N:58:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3B --> granite wall -- solid @@ -375,110 +579,172 @@ D:1:You tunnel into the granite wall. N:59:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3C --> permanent wall -- basic (perm) N:60:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3D --> permanent wall -- inner (perm) N:61:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3E --> permanent wall -- outer (perm) N:62:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3F --> permanent wall -- solid (perm) N:63:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:64:explosive rune G:*:R -F:FLOOR | CAN_LEVITATE | CAN_FLY | NOTICE | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:NOTICE +F:SUPPORT_LIGHT D:0:This rune seems unstable. N:65:Straight Road startpoint G:*:w -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:66:section of the Straight Road G:*:B -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:67:section of the Straight Road G:*:b -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:68:section of the Straight Road G:*:B -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:69:section of the Straight Road G:*:b -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:70:section of the Straight Road G:*:W -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:71:section of the Straight Road (discharged) G:*:W -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:72:Straight Road exit G:*:w -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:73:corrupted section of the Straight Road G:*:D -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER # 74 --> shop N:74:Building G:1:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER # 75 --> 78 Quests index N:75:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:76:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:77:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:78:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 79 --> 83 UNSUSED @@ -486,94 +752,136 @@ N:84:stream of shallow water G:~:B S:B:B:B:B:B:B:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER F:SUPPORT_GROWTH +F:SUPPORT_LIGHT # -1 = player level N:85:pool of deep lava G:.:R E:-1d2:1:FIRE -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:You move across the deep lava. N:86:stream of shallow lava G:.:r E:-1d1:1:FIRE -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:You move across the shallow lava. N:87:dark pit G:#:D -F:CAN_LEVITATE | CAN_FLY -F:NO_WALK | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE F:DONT_NOTICE_RUNNING +F:NO_WALK +F:SUPPORT_LIGHT D:0:Ohhh, it is dark and deep. N:88:dirt G:.:U -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT N:89:patch of grass G:.:G -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT N:90:ice G:.:W E:1d1:50:ICE -F:FLOOR | NOTICE +F:FLOOR +F:NOTICE N:91:sand G:.:y -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:92:dead tree G:#:D -F:CAN_FLY | CAN_PASS -F:WALL | NO_WALK | NO_VISION | NOTICE +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You chop away at the dead tree. D:2:a tree blocking your way N:93:ash G:.:s -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:94:mud G:.:u -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:95:ice wall G:#:W -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the ice wall... #BOh chilly#w. D:2:an ice wall blocking your way N:96:tree G:#:G -F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You chop away at the tree. D:2:a tree blocking your way N:97:mountain chain G:^:U -F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_CLIMB +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel into such a hard stone. D:2:a hard stone block blocking your way @@ -581,9 +889,13 @@ D:2:a hard stone block blocking your way N:98:sandwall G:#:y -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily dig into the sandwall. D:2:a sandwall blocking your way @@ -592,9 +904,13 @@ D:2:a sandwall blocking your way N:99:sandwall G:%:y M:98 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily dig into the sandwall. D:2:a sandwall blocking your way @@ -602,16 +918,23 @@ D:2:a sandwall blocking your way N:100:sandwall with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily tunnel into the sandwall. D:2:a sandwall blocking your way N:101:high mountain chain G:^:W -F:WALL | NO_WALK | NO_VISION | PERMANENT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:This rock is far too hard. D:2:a very hard stone block blocking your way @@ -620,46 +943,71 @@ G:.:v S:v:R:r:v:R:r:D E:1d1:40:NETHER F:ATTR_MULTI -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR # A diggable glass wall. N:103:molten glass wall G:.:B -F:NO_WALK | WALL | CAN_PASS | TUNNELABLE | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:TUNNELABLE +F:WALL D:1:You tunnel into the molten glass wall... D:2:a molten glass wall blocking your way N:160:Void Jumpgate G:+:v -F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:A dark rift opens to the void here. ###### Here are the altars. ###### N:161:Altar of Being G:0:W -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You feel at peace. N:162:Altar of Winds G:0:B -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to become a bird. N:163:Altar of Force G:0:R -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to fight evil. N:164:Altar of Darkness G:0:D -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:Images of pain and death fill your mind. N:165:Altar of Nature G:0:g -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You feel the desire to walk in a great forest. # XXX @@ -674,20 +1022,30 @@ D:0:You feel the desire to walk in a great forest. # Used as a marker for random quests N:172:open floor G:.:w -F:FLOOR | CAN_RUN | DONT_NOTICE_RUNNING +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH # Underground Tunnel N:173:Underground Tunnel G:#:s -F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:Oh, an underground tunnel! # Tainted water N:174:stream of tainted water G:~:u -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT N:175:monster trap G:;:v @@ -695,14 +1053,22 @@ F:FLOOR N:176:Void Jumpgate G:+:v -F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:A dark rift opens to the void here. N:177:lava wall G:#:R S:R:R:r:r:U:u:R F:ATTR_MULTI -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:The lava is far too hot to tunnel into it. D:2:a lava wall blocking your way @@ -711,33 +1077,51 @@ G:%:v S:R:R:y:v:y:v:R E:150d2:1:HELL_FIRE F:ATTR_MULTI -F:FLOOR | REMEMBER | NOTICE | PERMANENT +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:This fire is so powerful it could destroy even the most powerful artifacts. N:179:path to the next area G:>:w -F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a path leading to the next area here. D:1:You cannot tunnel a path. N:180:path to the previous area G:<:w -F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a path leading to the previous area here. D:1:You cannot tunnel a path. N:181:field G:::g -F:FLOOR | PERMANENT | NOTICE | REMEMBER F:DONT_NOTICE_RUNNING +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a field. N:182:Ekkaia, the Encircling Sea G:*:b S:b:b:b:b:b:b:B F:ATTR_MULTI -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:183:void G: :d @@ -751,97 +1135,159 @@ N:187:pool of deep water G:~:b S:b:b:b:b:b:b:B F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Glass wall -- can see but not pass N:188:glass wall G:.:B -F:NO_WALK | WALL | PERMANENT | NOTICE F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:PERMANENT +F:WALL D:1:This glass seems to be totaly impenetrable. D:2:a glass wall blocking your way # Illusion wall -- can't see but can pass N:189:illusion wall G:#:w -F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT D:0:Looks like this wall is not so real. # Grass roof N:190:Grass roof G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass roof top N:191:grass roof top G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass roof chimney N:192:grass roof chimney G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof N:193:brick roof G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof top N:194:brick roof top G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof chimney N:195:brick roof chimney G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # window N:196:window G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # small window N:197:small window G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # rain barrel N:198:rain barrel G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass with flowers N:199:grass with flowers G:;:G -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH # cobblestone road N:200:cobblestone road G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR # cobblestone with outlet N:201:cobblestone with outlet G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR N:202:small tree G:#:g -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT # Just to have a town entrance picture N:203:town G:*:w -F:FLOOR | NOTICE +F:FLOOR +F:NOTICE # Underground Tunnel N:204:Underground Tunnel G:^:U -F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:Oh, an underground tunnel! # Fire @@ -851,58 +1297,92 @@ S:y:y:y:R:r:y:R E:-1d2:1:FIRE D:0:The blazing fire burns you! F:ATTR_MULTI -F:FLOOR | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Permanent rubble -- town use N:206:pile of rubble G:::w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE -F:CAN_FLY | SUPPORT_LIGHT | PERMANENT +F:CAN_FLY +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:Looks like this pile of rubble is quite hard. # Rocky ground - rougher terrain. N:207:rocky ground G:.:s -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_LIGHT # cloud-like vapour. Floor for Eru's temple N:208:cloud-like vapour G:.:W S:W:B:B:W:w:W:B -F:FLOOR | CAN_LEVITATE | CAN_FLY | SUPPORT_LIGHT -F:ATTR_MULTI | CAN_RUN | DONT_NOTICE_RUNNING +F:ATTR_MULTI +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_LIGHT # condensing water N:209:condensing water G:~:B S:B:B:B:B:B:B:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Dense mist. Can pass through, but not see through N:210:dense mist G:#:w S:w:W:s:s:s:w:w -F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT -F:ATTR_MULTI | DONT_NOTICE_RUNNING +F:ATTR_MULTI +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT D:0:You wander through the mist. D:1:You cannot tunnel through mist! # Hail-stone wall N:211:hail-stone wall G:#:W -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the hail-stone wall. N:212:dead small tree G:#:D -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT # New features for the Maps of Lord Dimwit @@ -910,27 +1390,46 @@ F:NO_VISION N:213:copper pillar G:#:u S:u:u:u:o:u:u:u -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | ATTR_MULTI +F:ATTR_MULTI +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT +F:WALL D:1:The copper is too tough to tunnel through. D:2:a copper pillar blocking your way N:214:ethereal wall G:.:w -F:WALL | NO_WALK | PERMANENT | NOTICE | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:PERMANENT +F:WALL D:1:You can't even see your obstruction! D:2:an unseen force blocking your way N:215:glacial wall G:#:B -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | TUNNELABLE +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT +F:TUNNELABLE +F:WALL D:1:You tunnel into the glacial wall... #BOh chilly#w. D:2:a hard glacial wall blocking your way N:216:battlement G:#:w -F:NO_WALK | CAN_PASS | NOTICE | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | TUNNELABLE +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:SUPPORT_LIGHT +F:TUNNELABLE D:1:You tunnel into the battlement. D:2:a hard stone battlement blocking your way diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 5937dca7..8683b4bd 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -266,7 +266,8 @@ N:29:& Blue Stone~ G:":B I:40:18:0 W:60:0:3:90000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### Edged Weapons ##### @@ -285,7 +286,8 @@ I:23:21:0 W:15:0:140:350 A:15/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a long, double-edged sword with a plain hilt that could D:be wielded in one or two hands. It's called a "bastard sword" because in @@ -340,8 +342,11 @@ W:70:0:180:4000 A:70/8 P:0:6d5:0:0:0 F:ATTR_MULTI -F:RES_CHAOS | CHAOTIC | SHOW_MODS -f:RES_CHAOS | CHAOTIC +F:CHAOTIC +F:RES_CHAOS +F:SHOW_MODS +f:CHAOTIC +f:RES_CHAOS D:A mighty sword which seems to be completely blunt. However, it is a conduit D:into the realms of pure chaos and strikes its victims with the devastating D:might of chaos itself whenever it connects. It gives you resistance to chaos @@ -354,7 +359,8 @@ I:23:25:0 W:30:0:200:775 A:30/1:40/1 P:0:3d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This blade is lot longer, wider and heavier than a long sword. You have to D:wield it with two hands. This means that wielding a shield makes fighting @@ -388,7 +394,8 @@ I:23:28:0 W:40:0:260:850 A:40/1 P:0:4d5:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:These weapons have been built in all sizes. They are custom-made D:for warriors that want to set out and kill their archenemy. These @@ -400,7 +407,8 @@ I:23:20:0 W:20:0:120:400 A:20/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The katana is a long blade with only a small disk for a guard. D:Its hilt is long enough for two hands, though it could be used @@ -480,7 +488,8 @@ I:21:6:0 W:20:0:150:200 A:20/1 P:0:2d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon has a ball linked with a chain to a wooden handle. D:Preferred tactic is smashing the brains of your opponent. @@ -502,7 +511,8 @@ I:21:13:0 W:10:0:150:353 A:10/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon was originally used to cut corn. More warlike versions D:sport a large blade stuck on a wooden handle. The hinge allows it to get @@ -514,7 +524,8 @@ I:21:18:0 W:45:0:280:590 A:45/1 P:0:3d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This two-handed version of the flail gives the fighter a fearsome D:weapon that can do a fair amount of damage. It typically has several @@ -536,7 +547,8 @@ I:21:5:0 W:5:0:120:130 A:5/1 P:0:2d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon is a club ending in a sphere. The sphere is studded D:with metal shards, and thus can both crush and cut your adversary. @@ -547,7 +559,8 @@ I:21:3:0 W:10:0:150:200 A:10/1 P:0:1d9:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A long, wooden pole, usually the height of the wielder. Four of them can be D:made out of the trunk of one young tree, hence the name. The quarterstaff @@ -561,7 +574,8 @@ I:21:8:0 W:5:0:120:225 A:5/1 P:0:3d3:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A large hammer, designed to crush skulls with mighty strikes. @@ -571,7 +585,8 @@ I:21:15:0 W:15:0:180:502 A:15/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A large, mean mace filled with lead in order to wreak a maximum of havoc. @@ -581,8 +596,11 @@ I:21:20:0 W:80:0:400:4300 A:80/5 P:0:5d8:0:0:0 -F:SLAY_UNDEAD | SHOW_MODS | MUST2H -f:MUST2H | SLAY_UNDEAD +F:MUST2H +F:SHOW_MODS +F:SLAY_UNDEAD +f:MUST2H +f:SLAY_UNDEAD D:This mace is custom-made for priests that go out to destroy evil. D:It is deadly, especially for undead. @@ -592,7 +610,8 @@ I:21:10:0 W:10:0:120:376 A:10/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A war hammer combined with a spearpoint, mounted on a long pole. @@ -604,7 +623,8 @@ I:22:10:0 W:15:0:180:408 A:15/1 P:0:2d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This polearm has a beak mounted opposite the blade. @@ -614,7 +634,8 @@ I:22:13:0 W:20:0:190:363 A:20/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A polearm with a long, slightly curved knife-like blade. It has spurs on D:the dull side of the blade. It's primarily a slashing and chopping weapon. Glaives @@ -628,7 +649,8 @@ I:22:15:0 W:25:0:190:430 A:25/1 P:0:3d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The halberd has a broad, short axe blade on a 5 - 6ft long haft, with a D:spearpoint at the top, often a back-spike and occasionally a butt-spike. Used to @@ -644,7 +666,8 @@ I:22:4:0 W:10:0:160:340 A:10/1 P:0:1d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a polearm with a long square-sectioned spike on the end. @@ -654,7 +677,8 @@ I:22:8:0 W:15:0:160:358 A:15/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A staff, 16-18 feet long, that has a small piercing head about 10 inches D:long. The pike is often used by infantry to fend off cavalry. It is very @@ -679,7 +703,8 @@ I:22:5:0 W:5:0:70:120 A:5/1 P:0:1d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The trident is based on the pitchfork. In fact, when not used as a weapon, D:it is often employed as a pitchfork. It is famous for its uses in @@ -692,7 +717,8 @@ I:22:20:0 W:10:0:300:230 A:10/1 P:0:2d8:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is the original polearm. It is shaped like a spear but is bigger. It's D:meant to fend off enemies, not to be thrown. @@ -703,7 +729,8 @@ I:24:25:0 W:40:0:230:500 A:40/1 P:0:4d4:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:A huge and heavy two-headed axe. @@ -713,7 +740,8 @@ I:22:22:0 W:15:0:170:334 A:15/1 P:0:2d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft. D:The Nordics' take on the halberd. The polearm of choice for many Nordics, @@ -725,7 +753,8 @@ I:22:28:0 W:45:0:250:750 A:45/1 P:0:3d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft. D:A Nordic version of the halberd. The polearm of choice for many Nordics, @@ -737,7 +766,8 @@ I:24:11:0 W:15:0:160:304 A:15/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A one-headed axe made for combat, with an elongated moon-shaped blade. @@ -747,7 +777,8 @@ I:22:17:0 W:45:0:250:800 A:45/1 P:0:5d3:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A simple farm implement, converted into a weapon by slightly straightening D:its blade and putting it in line with its pole, instead of the typical @@ -759,8 +790,13 @@ I:22:30:0 W:80:0:250:10000 A:80/20 P:0:8d4:0:0:0 -F:SHOW_MODS | MUST2H | WOUNDING | VORPAL -f:MUST2H | VORPAL | WOUNDING +F:MUST2H +F:SHOW_MODS +F:VORPAL +F:WOUNDING +f:MUST2H +f:VORPAL +f:WOUNDING D:The simple design of the war scythe, but this one uses a finely crafted and D:incredibly sharp steel blade which causes terrible wounds when it hits. @@ -952,8 +988,13 @@ I:35:2:0 W:30:0:5:1500 A:30/4 P:4:0d0:0:0:4 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE | IGNORE_ELEC -F:STEALTH | SEARCH | LUCK +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:LUCK +F:SEARCH +F:STEALTH f:STEALTH D:A wonderfully light cloak coloured in brown and green hues. Its colouring D:greatly helps the wearer to avoid undesired attention. Wearing it makes you @@ -1266,7 +1307,9 @@ I:35:6:1 W:60:0:5:7500 A:75/4 P:6:0d0:0:0:4 -F:RES_DARK | RES_LITE | STEALTH +F:RES_DARK +F:RES_LITE +F:STEALTH f:STEALTH D:A rare cloak imbued with magic to radiate a strange twilight, absorbing both D:extreme brightness and darkness. @@ -1344,7 +1387,8 @@ G:=:d I:45:24:0 W:30:0:2:500 A:30/1 -F:STR | HIDE_TYPE +F:HIDE_TYPE +F:STR f:STR D:This bauble magically improves your strength. @@ -1353,7 +1397,8 @@ G:=:d I:45:26:0 W:30:0:2:500 A:30/1 -F:DEX | HIDE_TYPE +F:DEX +F:HIDE_TYPE f:DEX D:This piece of jewellery magically improves your agility. @@ -1362,7 +1407,8 @@ G:=:d I:45:27:0 W:30:0:2:500 A:30/1 -F:CON | HIDE_TYPE +F:CON +F:HIDE_TYPE f:CON D:This ring magically grants you health, improving your constitution. @@ -1371,7 +1417,8 @@ G:=:d I:45:25:0 W:30:0:2:500 A:30/1 -F:INT | HIDE_TYPE +F:HIDE_TYPE +F:INT f:INT D:This magical piece of jewellery makes you smarter. @@ -1380,7 +1427,8 @@ G:=:d I:45:31:0 W:75:0:2:100000 A:75/1 -F:SPEED | HIDE_TYPE +F:HIDE_TYPE +F:SPEED f:SPEED D:This wonderful ring grants you additional energy, allowing you to act faster. @@ -1389,7 +1437,8 @@ G:=:d I:45:23:0 W:5:0:2:250 A:5/1 -F:SEARCH | HIDE_TYPE +F:HIDE_TYPE +F:SEARCH f:SEARCH D:This ring magically improves your attention, so you can detect hidden things better. @@ -1400,7 +1449,10 @@ I:45:4:0 W:5:0:2:250 A:5/1 a:DEST_TELE -F:CURSED | TELEPORT | EASY_KNOW | ACTIVATE +F:ACTIVATE +F:CURSED +F:EASY_KNOW +F:TELEPORT f:TELEPORT D:This ring will uncontrollably send you to different places at its whim. D:You can use its power once at your will, but it will destroy the ring. @@ -1410,7 +1462,8 @@ G:=:d I:45:6:0 W:5:0:2:250 A:5/1 -F:SLOW_DIGEST | EASY_KNOW +F:EASY_KNOW +F:SLOW_DIGEST f:SLOW_DIGEST D:This magical bauble grants you some sustenance, allowing you to subsist on less food. @@ -1419,7 +1472,9 @@ G:=:d I:45:8:0 W:10:0:2:250 A:10/1 -F:RES_FIRE | IGNORE_FIRE | EASY_KNOW +F:EASY_KNOW +F:IGNORE_FIRE +F:RES_FIRE f:RES_FIRE D:This piece of jewellery grants you some protection from the burning heat of fire. @@ -1428,7 +1483,9 @@ G:=:d I:45:9:0 W:10:0:2:250 A:10/1 -F:RES_COLD | IGNORE_COLD | EASY_KNOW +F:EASY_KNOW +F:IGNORE_COLD +F:RES_COLD f:RES_COLD D:This piece of jewellery grants you some protection from the chilling forces of cold. @@ -1437,7 +1494,8 @@ G:=:d I:45:7:0 W:5:0:2:200 A:5/1 -F:FEATHER | EASY_KNOW +F:EASY_KNOW +F:FEATHER f:FEATHER D:When you put on this ring, you will be able to float just above the floor. D:It prevents you from drowning, and all your falls will be painless. @@ -1447,7 +1505,8 @@ G:=:d I:45:20:0 W:60:0:2:16000 A:60/2 -F:RES_POIS | EASY_KNOW +F:EASY_KNOW +F:RES_POIS f:RES_POIS D:This magical ring grants protection from poison. D:It is rumoured that in deep dungeons monsters can kill you at once if you @@ -1458,7 +1517,8 @@ G:=:d I:45:21:0 W:20:0:2:1500 A:20/1 -F:FREE_ACT | EASY_KNOW +F:EASY_KNOW +F:FREE_ACT f:FREE_ACT D:This magical bauble prevents you from being held. D:Some monsters will paralyse you and then kill you if you lack free action. @@ -1468,7 +1528,9 @@ G:=:d I:45:2:-5 W:5:0:2:0 A:5/1 -F:CURSED | STR | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:STR f:STR D:This accursed ring will sap your strength, rendering you much weaker as long as you wear it. @@ -1479,7 +1541,9 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_FIRE_4 -F:RES_FIRE | IGNORE_FIRE | ACTIVATE +F:ACTIVATE +F:IGNORE_FIRE +F:RES_FIRE f:RES_FIRE D:This fiery circlet grants you protection, makes fire less dangerous and even D:allows you to call forth a ball of flame. @@ -1491,7 +1555,9 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_ACID_4 -F:RES_ACID | IGNORE_ACID | ACTIVATE +F:ACTIVATE +F:IGNORE_ACID +F:RES_ACID f:RES_ACID D:This magical ring is imbued with spells of devouring acid, granting protection against such D:assaults and the ability to shoot acid at your foes. @@ -1503,7 +1569,9 @@ W:50:0:2:3000 A:50/1 a:BA_COLD_4 P:0:0d0:0:0:15 -F:RES_COLD | IGNORE_COLD | ACTIVATE +F:ACTIVATE +F:IGNORE_COLD +F:RES_COLD f:RES_COLD D:This ring is imbued with supernatural cold, which makes you less vulnerable to such effects D:and occasionally allows you to throw balls of ice at your foes. @@ -1513,7 +1581,12 @@ G:=:d I:45:0:-5 W:50:0:2:0 A:50/1 -F:CURSED | TELEPORT | WIS | CHR | HIDE_TYPE | AUTO_CURSE +F:AUTO_CURSE +F:CHR +F:CURSED +F:HIDE_TYPE +F:TELEPORT +F:WIS D:This accursed ring will turn you into a bumbling fool and, in addition, magically D:transports you to places you never wanted to see. It can recurse itself if D:you leave it on too long. @@ -1523,7 +1596,9 @@ G:=:d I:45:3:-5 W:5:0:2:0 A:5/1 -F:CURSED | INT | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:INT f:INT D:This wicked ring feeds off your intellect, magically making you stupid. @@ -1556,7 +1631,10 @@ G:=:d I:45:1:0 W:5:0:2:0 A:5/1 -F:CURSED | AGGRAVATE | EASY_KNOW | AUTO_CURSE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:EASY_KNOW f:AGGRAVATE D:This faithless ring will draw opponents' attention towards its hapless owner. @@ -1565,7 +1643,8 @@ G:=:d I:45:22:0 W:30:0:2:340 A:30/1 -F:SEE_INVIS | EASY_KNOW +F:EASY_KNOW +F:SEE_INVIS f:SEE_INVIS D:This magical piece of jewellery allows your eyes to perceive beings otherwise unseen. @@ -1574,7 +1653,8 @@ G:=:d I:45:10:0 W:20:0:2:400 A:20/1 -F:SUST_STR | EASY_KNOW +F:EASY_KNOW +F:SUST_STR f:SUST_STR D:This magical bauble protects your physical force against attacks attempting to drain it. @@ -1583,7 +1663,8 @@ G:=:d I:45:11:0 W:20:0:2:400 A:20/1 -F:SUST_INT | EASY_KNOW +F:EASY_KNOW +F:SUST_INT f:SUST_INT D:This magical ring protects your intellect against attempts to lower it. @@ -1592,7 +1673,8 @@ G:=:d I:45:12:0 W:20:0:2:400 A:20/1 -F:SUST_WIS | EASY_KNOW +F:EASY_KNOW +F:SUST_WIS f:SUST_WIS D:This magical ring protects you from attempts to make you more foolish. @@ -1601,7 +1683,8 @@ G:=:d I:45:13:0 W:20:0:2:400 A:20/1 -F:SUST_CON | EASY_KNOW +F:EASY_KNOW +F:SUST_CON f:SUST_CON D:This magical ring protects your health, making it impossible for your opponents to lower it. @@ -1610,7 +1693,8 @@ G:=:d I:45:14:0 W:20:0:2:400 A:20/1 -F:SUST_DEX | EASY_KNOW +F:EASY_KNOW +F:SUST_DEX f:SUST_DEX D:This magical ring protects your nerves, so that you will never become clumsy. @@ -1619,7 +1703,8 @@ G:=:d I:45:15:0 W:20:0:2:400 A:20/1 -F:SUST_CHR | EASY_KNOW +F:EASY_KNOW +F:SUST_CHR f:SUST_CHR D:This ring magically protects your beauty and charm from attempts to make you ugly. @@ -1638,7 +1723,10 @@ G:":d I:40:6:0 W:50:0:3:1000 A:50/4 -F:INT | WIS | HIDE_TYPE | LITE1 +F:HIDE_TYPE +F:INT +F:LITE1 +F:WIS D:This talisman grants a sharper wit, greater insight and brightness to light dark places. N:164:Charisma @@ -1646,7 +1734,8 @@ G:":d I:40:7:0 W:30:0:3:500 A:30/1 -F:CHR | HIDE_TYPE +F:CHR +F:HIDE_TYPE f:CHR D:This amulet grants beauty beyond mere looks. @@ -1655,7 +1744,8 @@ G:":d I:40:5:0 W:15:0:3:600 A:15/1 -F:SEARCH | HIDE_TYPE +F:HIDE_TYPE +F:SEARCH f:SEARCH D:This amulet grants keen sight, finding things that are hidden. @@ -1664,7 +1754,9 @@ G:":d I:40:1:0 W:10:0:3:250 A:10/1 -F:CURSED | TELEPORT | EASY_KNOW +F:CURSED +F:EASY_KNOW +F:TELEPORT f:TELEPORT D:This amulet nastily throws you all over the place. @@ -1673,7 +1765,8 @@ G:":d I:40:3:0 W:15:0:3:200 A:15/1 -F:SLOW_DIGEST | EASY_KNOW +F:EASY_KNOW +F:SLOW_DIGEST f:SLOW_DIGEST D:This talisman will make you hungry less quickly when worn. @@ -1682,7 +1775,9 @@ G:":d I:40:4:0 W:10:0:3:250 A:10/1 -F:RES_ACID | IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID +F:RES_ACID f:RES_ACID D:This magical talisman will make the corroding forces of acid less threatening to your health. @@ -1713,9 +1808,18 @@ I:40:8:0 W:70:0:3:30000 A:70/8 P:0:0d0:-4:-4:0 -F:INT | SUST_INT | SEARCH | SPELL_CONTAIN | WIELD_CAST -F:FREE_ACT | RES_BLIND | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INT +F:RES_BLIND +F:RES_CONF +F:SEARCH +F:SPELL_CONTAIN +F:SUST_INT +F:WIELD_CAST D:This rare amulet is highly desirable for mages, as it makes its wearer smarter, more attentive D:and impervious to magics which would make their own magic-use impossible. @@ -1724,8 +1828,16 @@ G:":d I:40:0:-5 W:50:0:3:0 A:50/1 -F:CURSED | STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE -F:AUTO_CURSE | CURSE_NO_DROP +F:AUTO_CURSE +F:CHR +F:CON +F:CURSED +F:CURSE_NO_DROP +F:DEX +F:HIDE_TYPE +F:INT +F:STR +F:WIS D:This wicked amulet will drain all your abilities, turning you into a mere shadow of yourself. It D:is exceedingly hard to get rid of. @@ -1786,7 +1898,10 @@ G:?:d I:70:50:0 W:100:0:5:10000 A:100/8 -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A piece of paper inscribed with strange shifting runes. Upon reading them, they will release D:a blast of chaotic forces. @@ -1926,7 +2041,8 @@ I:16:2:0 W:40:0:4:20 A:40/2:65/1 P:0:3d4:5:5:0 -F:SHOW_MODS | IGNORE_ACID +F:IGNORE_ACID +F:SHOW_MODS D:Sling bullets made from the slags of mithril smelting. They are unusually heavy, hitting D:with great force, and are almost imperishable. @@ -2562,8 +2678,11 @@ I:71:60:100 W:20:0:4:250 A:20/1:45/1:80/1:100/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:FOUNTAIN +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This great potion infuses you with the power of the elements, so that you can better D:withstand their ravages. @@ -2770,8 +2889,12 @@ W:127:0:4:0 A:127/255 P:0:1d1:0:0:0 T:39:2 -F:NORM_ART | FULL_NAME | SPECIAL_GENE | EASY_USE -F:ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:SPECIAL_GENE a:ETERNAL_FLAME D:An impossibly bright, flickering living flame. It can be used D:once to imbue an object with the power of Eru Iluvatar himself. @@ -2782,7 +2905,9 @@ I:23:34:0 W:0:0:7:10 A:0/1:5/1:10/1:20/1 P:0:1d4:0:0:0 -F:SHOW_MODS | VAMPIRIC | SPECIAL_GENE +F:SHOW_MODS +F:SPECIAL_GENE +F:VAMPIRIC D:This looks like some animal's teeth or at least you think D:it comes from an animal... @@ -2794,7 +2919,12 @@ W:50:10:10:12000 P:0:1d4:0:0:0 A:50/200 T:55:8 -F:NO_RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME | SPECIAL_GENE +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:NO_RECHARGE +F:RECHARGED +F:SPECIAL_GENE D:This horn was given to you as a reward. Blow it if you are in dire need D:of leaving your current location fast. @@ -2970,7 +3100,8 @@ I:111:0:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The bright blue cover of this tome seems to glow D:with an inner violet light. You feel more attuned D:to raw magic as you hold it. @@ -2981,7 +3112,9 @@ I:111:1:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_FIRE +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_FIRE D:The cover of this tome is bright red, with flickering D:flames dancing across it once in a while. As you hold D:it, you begin to gain a much closer knowledge of all @@ -2993,7 +3126,9 @@ I:111:2:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_ELEC +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ELEC D:The pages of this tome have a tendency to turn themselves, D:as though flipped by an errant wind. As you hold it, D:you start feeling wind at your fingertips. @@ -3004,7 +3139,9 @@ I:111:3:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_ACID +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ACID D:The solid leather cover of this tome seems permanently D:stained with caked mud and grass. Heavy it is to lift, D:yet strangely comforting to hold - you feel stronger @@ -3016,7 +3153,8 @@ I:111:4:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The cover and pages of this tome seem to be perpetually D:wet, though they are not wet to the touch. As you hold D:it, you begin to understand ocean storms better. @@ -3027,7 +3165,8 @@ I:111:5:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This book seems to flicker strangely. It's one of those books D:with an annoying tendency to disappear when you need it and D:reappear in the unlikeliest places. As you hold it, you start @@ -3039,7 +3178,8 @@ I:111:6:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The cover of this tome is a bright shade of green, and it gives off D:a healthy, zesty scent that makes your thoughts clearer. As you D:hold it, your heart goes out to all living things upon Arda. @@ -3050,7 +3190,8 @@ I:111:7:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A thick book with solid leather binding. It looks entirely D:unremarkable, but as you hold it, you feel strangely able D:to learn the inner workings of things and creatures. @@ -3129,8 +3270,11 @@ I:39:0:0:4000 W:1:0:30:2 A:1/1 P:0:1d1:0:0:0 -F:EASY_KNOW | LITE1 | FUEL_LITE -f:LITE1 | FUEL_LITE +F:EASY_KNOW +F:FUEL_LITE +F:LITE1 +f:FUEL_LITE +f:LITE1 D:A piece of wood with an oily rag wrapped around it. When lit, it will give off a little light and D:much smoke. @@ -3140,8 +3284,12 @@ I:39:1:0:7500 W:3:0:50:35 A:3/1 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE2 | FUEL_LITE -f:LITE2 | FUEL_LITE +F:EASY_KNOW +F:FUEL_LITE +F:IGNORE_FIRE +F:LITE2 +f:FUEL_LITE +f:LITE2 D:A brass container with a wick emerging from it, protected from draughts by a sheet of greased D:paper. It can be carried by a handle. @@ -3399,7 +3547,8 @@ G:=:d I:45:58:0 W:10:0:2:1000 A:10/1 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST f:SPELL_CONTAIN D:This ring is a container for spells. Those that are skilled in copying spells can inscribe a D:spell into it. @@ -3411,7 +3560,8 @@ G:":d I:40:27:0 W:10:0:2:1000 A:10/1 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST f:SPELL_CONTAIN D:This amulet is a container for spells. Those that are skilled in copying spells can inscribe a D:spell into it. @@ -3514,9 +3664,14 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_ACID -F:RES_ACID | FLY | -f:RES_ACID | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +f:RES_ACID D:An armour made of a black dragon's hide, containing some of this beast's powers. N:401:& Blue Dragon Scale Mail~ @@ -3526,9 +3681,14 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_ELEC -F:RES_ELEC | FLY | -f:RES_ELEC | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ELEC +f:RES_ELEC D:A piece of dragon hide fashioned into an armour, shimmering bright blue. N:402:& White Dragon Scale Mail~ @@ -3538,9 +3698,14 @@ W:50:0:200:40000 A:50/8 a:BR_COLD P:30:2d4:-2:0:10 -F:RES_COLD | FLY | -f:RES_COLD | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_COLD +f:RES_COLD D:An armour fashioned from dragon hide, glistening the white of snow. N:403:& Red Dragon Scale Mail~ @@ -3550,9 +3715,14 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_FIRE -F:RES_FIRE | FLY | -f:RES_FIRE | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_FIRE +f:RES_FIRE D:The skin of a dragon made into a suit of armour. It glows a bright red and radiates heat. N:404:& Green Dragon Scale Mail~ @@ -3562,9 +3732,14 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_POIS -F:RES_POIS | FLY | -f:RES_POIS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_POIS +f:RES_POIS D:A suit of armour fashioned of dragon hide. It is dirty green and smells awful. N:405:& Multi-Hued Dragon Scale Mail~ @@ -3574,10 +3749,23 @@ W:90:0:200:150000 A:90/32 P:30:2d4:-2:0:10 a:BR_MANY +F:ACTIVATE F:ATTR_MULTI -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | FLY | -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE +f:RES_POIS D:A powerful armour made of dragonhide. It glows red, blue, green, black and white. N:406:& Pseudo Dragon Scale Mail~ @@ -3587,8 +3775,14 @@ W:70:0:200:70000 A:70/16 P:30:2d4:-2:0:10 a:BR_LIGHT -F:RES_LITE | RES_DARK | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_DARK +F:RES_LITE D:A suit of armour made of dragon hide, glowing with a strange light, or is it darkness? N:407:& Law Dragon Scale Mail~ @@ -3598,8 +3792,14 @@ W:80:0:200:80000 A:80/16 P:30:2d4:-2:0:10 a:BR_SHARD -F:RES_SOUND | RES_SHARDS | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SHARDS +F:RES_SOUND D:A piece of dragonhide cut and shaped so it can be worn as armour. The scales are very sharp, D:and the roaring of a storm seems to come from it, but you're not afraid of either. @@ -3610,8 +3810,13 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_CONF -F:RES_CONF | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CONF D:A suit of armour made from dragon skin. Its brownish scales glitter in a dazzling light. N:409:& Gold Dragon Scale Mail~ @@ -3621,8 +3826,13 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_SOUND -F:RES_SOUND | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SOUND D:A suit of golden-hued armour made of dragonhide. The rustle of its scales occasionally D:increases to a loud boom. @@ -3633,10 +3843,16 @@ W:80:0:200:80000 A:80/16 P:30:2d4:-2:0:10 a:BR_CHAOS +F:ACTIVATE F:ATTR_MULTI -F:RES_CHAOS | RES_DISEN | FLY | -f:RES_CHAOS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS +F:RES_DISEN +f:RES_CHAOS D:A suit of armour made of dragon hide. It glows in colours you have never seen before. As you D:put it on, you feel like you could change the world and are no longer afraid of your equipment D:losing its magic. @@ -3648,8 +3864,16 @@ W:95:0:200:100000 A:95/32 P:30:2d4:-2:0:10 a:BR_BALANCE -F:RES_CHAOS | RES_DISEN | RES_SOUND | RES_SHARDS | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS +F:RES_DISEN +F:RES_SHARDS +F:RES_SOUND D:A suit of armour made of the hide of a dead dragon. When wearing it, you feel like you D:understand the principles of law and chaos, and no longer fear either. @@ -3660,11 +3884,27 @@ W:100:0:250:350000 A:100/64 P:40:2d4:-3:0:15 a:BR_POWER +F:ACTIVATE F:ATTR_MULTI -F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FLY | -F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:RES_SHARDS +F:RES_SOUND D:A suit of armour made of a very thick richly coloured dragonhide. You think you'll never have D:to fear dragons if you put it on. @@ -3676,7 +3916,10 @@ I:32:7:0 W:45:0:50:10000 A:80/4 P:8:1d3:0:0:10 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:An iron helmet, covered with a layer of dragonhide. It offers great protection and may grant D:protection against some dragon's attacks, based on the dragon the hide was taken from. @@ -3686,7 +3929,10 @@ I:34:6:0 W:70:0:100:10000 A:80/4 P:8:1d3:0:0:10 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A large shield, with a dragonskin cover. Depending on which dragon the hide came from, it D:might grant protection against some sorts of dragon breath. @@ -3778,8 +4024,9 @@ G:=:d I:45:38:0 W:10:0:2:300 A:10/2 -F:RES_FEAR | EASY_KNOW -f:RES_FEAR | +F:EASY_KNOW +F:RES_FEAR +f:RES_FEAR D:This ring grants courage, so that you can never become afraid. N:426:Light and Darkness Resistance @@ -3787,8 +4034,11 @@ G:=:d I:45:39:0 W:30:0:2:3000 A:30/2 -F:RES_LITE | RES_DARK | EASY_KNOW -f:RES_LITE | RES_DARK | +F:EASY_KNOW +F:RES_DARK +F:RES_LITE +f:RES_DARK +f:RES_LITE D:This ring protects against fluctuations of the light. N:427:Nether Resistance @@ -3796,8 +4046,10 @@ G:=:d I:45:40:0 W:34:0:2:14500 A:34/2 -F:RES_NETHER | HOLD_LIFE | EASY_KNOW -f:RES_NETHER | +F:EASY_KNOW +F:HOLD_LIFE +F:RES_NETHER +f:RES_NETHER D:This blessed ring improves your life force, protecting you from the draining forces of nether D:and other attempts to suck your lifeblood. @@ -3806,8 +4058,9 @@ G:=:d I:45:41:0 W:24:0:2:3000 A:24/2 -F:RES_NEXUS | EASY_KNOW -f:RES_NEXUS | +F:EASY_KNOW +F:RES_NEXUS +f:RES_NEXUS D:This ring of stability protects you from the warping forces of nexus. N:429:Sound Resistance @@ -3815,8 +4068,9 @@ G:=:d I:45:42:0 W:26:0:2:3000 A:26/2 -F:RES_SOUND | EASY_KNOW -f:RES_SOUND | +F:EASY_KNOW +F:RES_SOUND +f:RES_SOUND D:This ring projects an aura of quiet around you, protecting you from loud noise. N:430:Confusion Resistance @@ -3824,8 +4078,9 @@ G:=:d I:45:43:0 W:22:0:2:3000 A:22/2 -F:RES_CONF | EASY_KNOW -f:RES_CONF | +F:EASY_KNOW +F:RES_CONF +f:RES_CONF D:This ring stabilises your mind, protecting you from all kinds of befuddlement. N:431:Shard Resistance @@ -3833,8 +4088,9 @@ G:=:d I:45:44:0 W:25:0:2:3000 A:25/2 -F:RES_SHARDS | EASY_KNOW -f:RES_SHARDS | +F:EASY_KNOW +F:RES_SHARDS +f:RES_SHARDS D:This piece of jewellery magically toughens your skin, protecting you from flying shrapnel. N:432:Disenchantment Resistance @@ -3842,8 +4098,9 @@ G:=:d I:45:45:0 W:90:0:2:15000 A:90/10 -F:RES_DISEN | EASY_KNOW -f:RES_DISEN | +F:EASY_KNOW +F:RES_DISEN +f:RES_DISEN D:This rare ring of preservation protects your equipment from attempts to sap its magic, also D:causing you to suffer less pain from such attacks. @@ -3852,8 +4109,10 @@ G:=:d I:45:46:0 W:50:0:2:13000 A:50/2 -F:RES_CHAOS | RES_CONF | EASY_KNOW -f:RES_CHAOS | +F:EASY_KNOW +F:RES_CHAOS +F:RES_CONF +f:RES_CHAOS D:This ring protects you from the horribly warping forces of chaos. N:434:Blindness Resistance @@ -3861,8 +4120,9 @@ G:=:d I:45:47:0 W:60:0:2:7500 A:60/2 -F:RES_BLIND | EASY_KNOW -f:RES_BLIND | +F:EASY_KNOW +F:RES_BLIND +f:RES_BLIND D:This ring magically preserves your eyesight, making you impervious to any attempt to blind D:you. @@ -3871,8 +4131,14 @@ G:=:d I:45:48:0 W:100:0:2:100000 A:100/5 -F:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT -f:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT +F:FREE_ACT +F:HOLD_LIFE +F:RES_DISEN +F:RES_POIS +f:FREE_ACT +f:HOLD_LIFE +f:RES_DISEN +f:RES_POIS D:This blessed ring will protect you from disenchantment, poison, attempts to drain your life D:force and holding magic. @@ -3956,7 +4222,10 @@ I:17:3:0 W:55:0:2:35 A:50/4:90/2 P:0:3d4:0:0:0 -F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SHOW_MODS +F:SLAY_EVIL D:An arrow to be shot with a bow, its iron head coated with hallowed silver, D:a material that sears the flesh of all evil creatures. @@ -3966,7 +4235,10 @@ I:18:3:0 W:50:0:2:40 A:60/4:95/2 P:0:3d5:0:0:0 -F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SHOW_MODS +F:SLAY_EVIL D:This crossbow bolt has a silver tip, blessed by the Valar for fighting evil. N:467:Lightning Resistance @@ -3974,8 +4246,10 @@ G:":d I:40:29:0 W:10:0:3:250 A:10/1 -F:RES_ELEC | IGNORE_ELEC | EASY_KNOW -f:RES_ELEC | +F:EASY_KNOW +F:IGNORE_ELEC +F:RES_ELEC +f:RES_ELEC D:This amulet will protect you from electrical discharges and storms. N:468:Wisdom @@ -3983,8 +4257,10 @@ G:":d I:40:28:0 W:30:0:3:500 A:30/1 -F:WIS | SUST_WIS | HIDE_TYPE -f:WIS | +F:HIDE_TYPE +F:SUST_WIS +F:WIS +f:WIS D:This magical amulet will magically make you wiser, and fend off D:attacks that would reduce your wisdom. Beware: if cursed, the D:amulet will do the opposite. @@ -3994,8 +4270,9 @@ G:":d I:40:30:0 W:30:0:3:600 A:30/3 -F:REGEN | EASY_KNOW -f:REGEN | +F:EASY_KNOW +F:REGEN +f:REGEN D:Wearing this amulet will trigger your body's regenerational D:processes quicker and make them proceed faster. @@ -4004,8 +4281,9 @@ G:":d I:40:26:0 W:10:0:3:200 A:10/1 -F:INFRA | HIDE_TYPE -f:INFRA | +F:HIDE_TYPE +F:INFRA +f:INFRA D:This amulet will increase your ability to sense warm-blooded D:creatures in your vicinity. Beware: if cursed, it will do D:just the opposite. @@ -4015,8 +4293,16 @@ G:":d I:40:25:0 W:70:0:3:30000 A:70/8 -F:WIS | CHR | SUST_WIS | SUST_CHR | LITE1 | HIDE_TYPE | -F:RES_DARK | RES_LITE | RES_FIRE | HOLD_LIFE | +F:CHR +F:HIDE_TYPE +F:HOLD_LIFE +F:LITE1 +F:RES_DARK +F:RES_FIRE +F:RES_LITE +F:SUST_CHR +F:SUST_WIS +F:WIS D:This blessed amulet will protect your wisdom and charms from D:diminishing, often adding to them as well. It also grants D:some extra protective magics by the grace of the Valar. @@ -4026,8 +4312,14 @@ G:":d I:40:24:0 W:70:0:3:30000 A:70/8 -F:STR | CON | SUST_STR | SUST_CON | FREE_ACT | HIDE_TYPE | -F:RES_FEAR | RES_DISEN | +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:RES_DISEN +F:RES_FEAR +F:STR +F:SUST_CON +F:SUST_STR D:The ultimate amulet for a warrior, it will grant protection D:in the face of some evil magics, protect your strength and health, D:also increasing them. Beware: if cursed, the amulet will @@ -4038,8 +4330,14 @@ G:":d I:40:23:0 W:70:0:3:30000 A:70/8 -F:DEX | SUST_DEX | STEALTH | SPEED | INFRA | HIDE_TYPE | -F:RES_NEXUS | RES_POIS +F:DEX +F:HIDE_TYPE +F:INFRA +F:RES_NEXUS +F:RES_POIS +F:SPEED +F:STEALTH +F:SUST_DEX D:The ultimate amulet for a rogue or assassin, it protects the D:wearer against some evil magics, granting improvements in D:the abilities vital to these adventurers. Beware: if cursed, @@ -4050,9 +4348,12 @@ G:":d I:40:22:0 W:50:0:3:25000 A:50/6 -F:ESP_ALL | -f:ESP_ALL | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ESP_ALL +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:ESP_ALL D:This rare and powerful amulet lays bare the minds of monsters D:before the wearer. @@ -4061,9 +4362,19 @@ G:":d I:40:21:0 W:60:0:3:20000 A:60/4 -F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | -F:HOLD_LIFE | SLOW_DIGEST | EASY_KNOW | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:EASY_KNOW +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SLOW_DIGEST +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS D:This blessed amulet will make the wearer impervious to evil magics D:that would sap innate abilities. It also slows down the digestive D:system, making food less necessary on long journeys. @@ -4099,7 +4410,8 @@ N:479:& Ring~ G:=:d I:45:57:0 W:70:0:2:65000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### And here starts the gold/gems ##### @@ -4205,7 +4517,10 @@ G:\:D I:21:50:0 W:15:0:200:1000 P:0:3d9:0:0:0 -F:SHOW_MODS | INSTA_ART | MUST2H | SPECIAL_GENE +F:INSTA_ART +F:MUST2H +F:SHOW_MODS +F:SPECIAL_GENE f:MUST2H N:499:& Massive Iron Crown~ @@ -4213,7 +4528,8 @@ G:]:D I:33:50:0 W:44:0:20:1000 P:0:1d1:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### Objects 500 to 511 are "Special Artifacts" ##### @@ -4317,7 +4633,8 @@ N:508:& Ring~ G:=:d I:45:34:0 W:80:0:2:100000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # The Ring of Power 'Nenya' -- see artifact list @@ -4360,9 +4677,13 @@ G:":d I:40:9:0 W:60:0:3:30000 A:60/4 -F:REFLECT | EASY_KNOW -f:REFLECT | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REFLECT +f:REFLECT D:This wondrous amulet will magically make the wearer D:reflect arrows and bolts launched by adversaries. @@ -4373,9 +4694,12 @@ G:":d I:40:13:0 W:40:0:3:30000 A:40/4 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:NO_MAGIC f:NO_MAGIC -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD D:This amulet wards off magic of any kind, good or bad. N:522:Anti-Teleportation @@ -4383,9 +4707,12 @@ G:":d I:40:14:0 W:30:0:3:15000 A:30/4 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:NO_TELE f:NO_TELE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD D:This amulet will prevent the space-time continuum from D:being disrupted around the wearer. @@ -4396,9 +4723,18 @@ G:":d I:40:15:0 W:50:0:3:25000 A:50/4 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE D:This amulet will make the wearer resist the elements. ##### New arms ##### @@ -4409,7 +4745,8 @@ I:23:29:0 W:40:0:280:580 A:40/3 P:0:4d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This great sword of foreign origin is approximately 6 feet long. The hilt is D:long enough for even four hands to grip. A mighty weapon for a warrior. @@ -4421,7 +4758,9 @@ I:39:3:0 W:15:0:50:5000 A:15/2 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE2 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE2 f:LITE2 D:Made by the dwarves, this lantern provides light in the D:darkest recesses of the earth. @@ -4442,7 +4781,9 @@ I:39:2:0 W:5:0:50:2500 A:5/1 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE1 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE1 f:LITE1 D:This enchanted torch never needs to be fuelled. @@ -4473,7 +4814,9 @@ I:39:4:0 W:25:0:50:15000 A:25/3 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE3 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE3 f:LITE3 D:Made by the descendants of the Noldo craftsman, this lamp D:contains a part of the flame which burned inside Feanor. @@ -4502,7 +4845,8 @@ I:24:1:0 W:10:0:60:120 A:10/2 P:0:1d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a large axe that could be wielded in one or two hands. It has D:a single blade with a pick on the reverse, designed for armour piercing. @@ -4580,7 +4924,8 @@ I:23:26:0 W:40:0:230:600 A:40/2 P:0:3d7:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:A large, two-handed sword with a blade that weaves D:left and right until it reaches the hilt. @@ -4591,7 +4936,8 @@ I:23:23:0 W:40:0:200:600 A:40/2 P:0:2d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Also known as a Claidhmore, or Greatsword, this weapon is favoured D:by powerful mercenaries. The blade is large, straight, and broad, @@ -4603,7 +4949,8 @@ I:23:24:0 W:40:0:200:600 A:40/3 P:0:2d9:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is the strictly two-handed version of the bastard sword. D:The blade is of medium length, double-edged, and considerably @@ -4615,7 +4962,8 @@ I:23:22:0 W:40:0:240:500 A:40/3 P:0:4d5:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is a larger version of the curved oriental blade. D:Runes of war decorate its golden hilt. @@ -4647,7 +4995,8 @@ I:22:6:0 W:18:0:155:301 A:18/2 P:0:1d10:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:It is a type of glaive with two ornate hooks on the back D:of the blade. It is typically 8 to 9 feet long. @@ -4658,7 +5007,8 @@ I:22:16:0 W:21:0:165:320 A:21/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Mounted on a long shaft for maximum reach, this weapon is D:effective at repelling both cavalry and infantry. @@ -4669,7 +5019,8 @@ I:22:29:0 W:43:0:400:700 A:43/2 P:0:4d8:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is a shock weapon. Its purpose is to unhorse a rider D:in single combat, or smash through the armour of opposing lines. @@ -4757,7 +5108,10 @@ G:`:g I:46:5:0 W:5:0:20:50 A:5/2:40/2 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:It must be loaded with scrolls, which will release D:their spells at the monster who triggers the trap. @@ -4766,7 +5120,10 @@ G:`:v I:46:6:0 W:20:0:20:50 A:20/2:40/2:60/2 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:It must be loaded with a magic device (wand, staff, or rod), which D:will fire its spell at the monster who triggers the trap. @@ -4784,7 +5141,8 @@ I:65:2:-1:SPELL=Nothing W:2:0:10:20 A:2/1 P:0:1d1:0:0:0 -F:NO_RECHARGE | SPECIAL_GENE +F:NO_RECHARGE +F:SPECIAL_GENE N:567:Nothing G:=:d @@ -4799,7 +5157,8 @@ I:55:30:0 W:5:0:50:50 A:5/1 P:0:1d1:0:0:0 -F:NO_RECHARGE | SPECIAL_GENE +F:NO_RECHARGE +F:SPECIAL_GENE N:569:Nothing G:-:d @@ -4827,7 +5186,8 @@ W:70:0:4:10000 A:70/16 P:0:1d1:0:0:0 T:71:2 -F:NORM_ART | FULL_NAME +F:FULL_NAME +F:NORM_ART D:Quaffing this measure of living blood will imbue your body and soul D:with the power to escape death one time. @@ -4839,7 +5199,8 @@ I:6:1:0 W:5:0:12:300 A:5/1:20/1:50/1:80/1 P:0:1d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:It looks like a simple walking stick, plain and nondescript. D:In the hands of a spellcaster, it can be a deadly weapon. @@ -4853,8 +5214,10 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_ELEC_4 -F:RES_ELEC | IGNORE_ELEC | ACTIVATE -f:RES_ELEC | +F:ACTIVATE +F:IGNORE_ELEC +F:RES_ELEC +f:RES_ELEC D:This sparkling circlet grants you protection, makes electricity less D:dangerous and even allows you to call forth a ball of lightning. @@ -4896,8 +5259,9 @@ G:=:d I:45:53:4 W:50:0:2:10000 A:50/1 -F:INVIS | HIDE_TYPE -f:INVIS | +F:HIDE_TYPE +F:INVIS +f:INVIS D:This magical bauble will hide you from sight. ######### Here are the parchments ######## @@ -5046,7 +5410,8 @@ I:72:1:0 W:5:0:4:100 A:1/3:5/1:10/1 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This concoction can transform your body for a short period of time. # XXX 606 -> 617 @@ -5119,7 +5484,8 @@ I:36:16:0 W:5:0:60:400 A:25/1 P:9:1d1:0:0:0 -F:RES_FIRE | RES_COLD | +F:RES_COLD +F:RES_FIRE D:This suit of thick impregnated cloth is worn by the riders of flying steeds, D:and protects them from extremes of temperatures. @@ -5128,7 +5494,8 @@ N:647:& Stone~ G:~:g I:39:106:0 W:15:0:15:20000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # Here are the boomerangs @@ -5256,7 +5623,9 @@ G:~:o I:102:0:0 W:1:0:50:0 A:1/1:10/1:20/1:30/1 -F:INSTA_ART | ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:INSTA_ART N:663:Craftsmanship G:?:d @@ -5285,7 +5654,9 @@ I:14:60:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:CON | ACTIVATE | WIELD_CAST +F:ACTIVATE +F:CON +F:WIELD_CAST D:A simple wind instrument made from brass. If used by inexperienced musicians it sounds D:like somebody making "prbbt!" noises down a drainpipe. @@ -5295,7 +5666,8 @@ I:14:58:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:STR | WIELD_CAST +F:STR +F:WIELD_CAST D:A sort of clay pot with a bit of skin stretched over its mouth. N:671:& Harp~ @@ -5304,7 +5676,8 @@ I:14:59:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:CHR | WIELD_CAST +F:CHR +F:WIELD_CAST D:A number of strings held by a wooden frame. #N:672:& Banjo~ @@ -5348,7 +5721,8 @@ I:10:1:0 W:5:0:30:100 A:5/1:15/1:25/1:35/1 P:0:1d1:0:0:0 -F:ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD ### Two more scrolls ### @@ -5383,7 +5757,8 @@ I:105:2:0 W:10:5:2:300 A:10/1 P:0:1d1:0:0:0 -F:IGNORE_COLD | IGNORE_ELEC +F:IGNORE_COLD +F:IGNORE_ELEC N:681:Sphere G:?:b @@ -5391,7 +5766,9 @@ I:105:3:0 W:15:5:2:1000 A:15/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:682:Knowledge G:?:b @@ -5445,7 +5822,10 @@ I:104:10:0 W:23:5:2:1000 A:23/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:689:Chaos G:?:v @@ -5454,7 +5834,10 @@ W:26:5:2:2000 A:26/1 P:0:1d1:0:0:0 F:ATTR_MULTI -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:690:Mind G:?:D @@ -5486,7 +5869,10 @@ I:105:4:0 W:50:5:2:5000 A:50/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:694:Armageddon G:?:b @@ -5494,7 +5880,10 @@ I:105:5:0 W:30:5:2:4000 A:30/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:695:Gravity G:?:G @@ -5531,10 +5920,14 @@ I:45:51:0 W:90:0:2:300000 A:90/100 T:45:23 -F:PRECOGNITION | -f:PRECOGNITION | -F:NORM_ART | FULL_NAME -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART +F:PRECOGNITION +f:PRECOGNITION D:This magical ring allows you to know what you will encounter in the near future. # Athelas, cures Black Breath @@ -5575,8 +5968,12 @@ I:70:40:0 W:90:0:5:160000 A:90/140 T:70:51 -F:NORM_ART | FULL_NAME -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:It allows you to leave your body to reincarnate into D:another one. However, your current body is lost in the process. @@ -5586,7 +5983,8 @@ I:23:33:0 W:25:0:70:500 A:25/1:80/2 P:0:3d7:0:0:0 -F:SHOW_MODS | ANTIMAGIC_50 +F:ANTIMAGIC_50 +F:SHOW_MODS f:ANTIMAGIC_50 D:A strange, very sharp long sword, which seems to drain light from its surroundings. As you D:wield it, you feel much less attuned to magic. @@ -5688,8 +6086,12 @@ W:90:0:4:100000 A:90/25 P:0:1d1:0:0:0 T:71:49 -F:NORM_ART | FULL_NAME -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:This old potion is supposed to grant more learning power D:to its user. @@ -5728,8 +6130,9 @@ G:=:d I:45:54:0 W:20:0:2:16000 A:20/3 -F:FLY | EASY_KNOW -f:FLY | +F:EASY_KNOW +F:FLY +f:FLY D:This ring is imbued with the power of eagles. It grants you the power of flight. N:756:& Tome~ of the Time @@ -5738,7 +6141,8 @@ I:111:8:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome seems to have trouble deciding whether it really exists now. Its flickering pages D:contain all that is known about the currents of time. @@ -5756,7 +6160,10 @@ I:111:9:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_FIRE | ATTR_MULTI +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_FIRE D:This tome gives you deeper insights on the works of magic. N:759:& Tome~ of the Mind @@ -5765,7 +6172,8 @@ I:111:10:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome has no pages; knowledge is transferred to you if you simply D:hold it. @@ -5775,7 +6183,8 @@ I:111:20:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This dusty tome is filled with ancient rituals, D:designed to uncover all that is hidden. @@ -5785,7 +6194,8 @@ I:111:21:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A large jewel-encrusted tome that transfers D:wisdom and understanding to its wearer. @@ -5795,7 +6205,8 @@ I:111:22:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome fills you with glorious visions of total devastation. D:Anyone in your way shall be destroyed. @@ -5805,7 +6216,9 @@ I:111:11:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | ATTR_MULTI +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME D:This singed book smells like burned flesh. Its power is as evident D:as its thirst for your blood. @@ -5815,7 +6228,8 @@ I:111:23:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A black and scarlet flame springs from this tome, issuing D:a thunderous roar under which you think you hear the screams of tormented souls. @@ -5825,7 +6239,8 @@ I:111:24:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME # for the Library Quest # Tome of PLAYER @@ -5835,8 +6250,15 @@ I:111:61:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | ATTR_MULTI | SPECIAL_GENE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | NORM_ART +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART +F:SPECIAL_GENE D:This book has some of your favourite spells inside. # The Ring of Phasing -- see artifact list @@ -5846,7 +6268,8 @@ G:=:d I:45:55:0 W:110:0:2:300000 A:110/5 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE N:771:[Earth] G:?:R @@ -5874,7 +6297,10 @@ I:114:2:0 W:50:0:30:2500 A:50/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:SPECIAL_GENE D:A completely translucent gem; as you behold it, you hear a great wind and feel like you're D:about to take off and fly away. @@ -5885,7 +6311,10 @@ I:114:3:0 W:70:0:30:50000 A:70/3 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:SPECIAL_GENE D:A large gem, filled with dark blue water. It feels strangely heavy and cold. @@ -5895,7 +6324,10 @@ I:114:4:0 W:100:0:30:100000 A:100/3 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:SPECIAL_GENE D:A large gem that seems somehow immaterial and is filled with a strange insubstantial... power? @@ -5908,8 +6340,12 @@ W:90:0:15:150000 A:100/14 P:0:1d1:0:0:0 T:66:1 -F:NORM_ART | FULL_NAME -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:This rod creates a little hatch, allowing access to your home, no matter how far away the abode D:is. @@ -5920,7 +6356,9 @@ I:23:32:1 W:50:900:45:2000 A:48/4:60/2:80/1 P:0:4d4:-2:2:0 -F:IGNORE_ACID | RES_DARK | STEALTH +F:IGNORE_ACID +F:RES_DARK +F:STEALTH f:STEALTH D:A thin long sword made of a completely black metal, which reflects no light. @@ -5930,7 +6368,8 @@ I:23:31:0 W:60:1800:50:6000 A:60/20 P:0:1d6:4:0:0 -F:SHOW_MODS | VORPAL +F:SHOW_MODS +F:VORPAL D:A small sword made of a blueish metal with a strangely rough surface. As anything is hurt D:with it, the weapon will stick inside the wound and cause horrible wounds when torn away. @@ -5941,7 +6380,9 @@ I:40:17:0 W:25:0:3:10000 A:25/1 a:BA_POIS_4 -F:RES_POIS | DEX | ACTIVATE +F:ACTIVATE +F:DEX +F:RES_POIS D:A petrified serpent's tongue, hung on a thin chain to be clasped around your neck. It makes you D:like unto snakes, able to wriggle out of tight corners, impervious to poisons and poisonous D:yourself. @@ -5954,9 +6395,14 @@ G:=:d I:45:5:0 W:100:0:2:1 A:100/100 -F:INVIS | DRAIN_EXP | CURSED | HEAVY_CURSE | CURSE_NO_DROP +F:CURSED +F:CURSE_NO_DROP +F:DRAIN_EXP +F:FULL_NAME +F:HEAVY_CURSE +F:INVIS +F:SPECIAL_GENE f:INVIS -F:SPECIAL_GENE | FULL_NAME # To help people climb mountains... @@ -5986,7 +6432,9 @@ I:115:55:0 W:10:0:150:500 A:10/1 P:0:4d6:0:0:0 -F:SHOW_MODS | SLAY_DEMON | WIELD_CAST +F:SHOW_MODS +F:SLAY_DEMON +F:WIELD_CAST D:This blade has been taken from the corpse of a demon. D:Some demonic energy is still coursing through it, helping D:you slay other demons. @@ -5997,7 +6445,8 @@ I:115:56:0 W:15:0:70:500 A:15/1 P:5:1d1:0:0:0 -F:REGEN | WIELD_CAST +F:REGEN +F:WIELD_CAST D:This shield has been taken from the corpse of a demon. D:Some demonic energy is still coursing through it, giving D:life to any that wield it. @@ -6008,7 +6457,8 @@ I:115:57:0 W:20:0:30:500 A:20/1 P:2:1d1:0:0:0 -F:LITE2 | WIELD_CAST +F:LITE2 +F:WIELD_CAST D:This horn is about six feet long. Just looking at it makes you nervous. # XXX @@ -6092,7 +6542,8 @@ I:80:41:0 W:90:5:2:60000 A:90/50 T:80:40 -F:NORM_ART | FULL_NAME +F:FULL_NAME +F:NORM_ART D:This food will, once eaten, permanently add 70 HP. # Scroll of Mass Resurrection - artifact scroll @@ -6102,8 +6553,12 @@ I:70:43:0 W:55:0:5:0 A:55/1 T:70:1 -F:NORM_ART | FULL_NAME -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:This magical scroll sends a call to the halls of Mandos, issuing forth all those who have been D:slain by the reader. @@ -6133,7 +6588,8 @@ I:24:30:0 W:70:0:300:6000 A:70/8 P:0:5d7:0:0:0 -F:SLAY_ANIMAL | SHOW_MODS +F:SHOW_MODS +F:SLAY_ANIMAL D:A huge axe, the sort used for slaughtering animals, this weapon is unusually deadly against D:natural creatures. @@ -6143,7 +6599,10 @@ I:105:255:0 W:10:5:2:300 A:10/3:20/2:30/1:60/1 P:0:1d1:0:0:0 -F:IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A small oval stone. One surface is flat, as if something ought to be scratched or inscribed into D:it. @@ -6173,7 +6632,12 @@ W:10:10:10:3200 A:10/200 P:0:10d10:0:0:0 T:65:6 -F:RECHARGE | SPECIAL_GENE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:RECHARGE +F:RECHARGED +F:SPECIAL_GENE D:The miner's friend. This wand was used by Thrain to dig into the D:walls of the dungeon. Its indestructible nature makes it quite useful. @@ -6185,7 +6649,11 @@ W:50:10:10:12000 P:0:10d4:0:0:0 A:50/200 T:55:8 -F:RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:RECHARGE +F:RECHARGED D:Mithrandir's staff that throws powerful fire attacks at all enemies. It D:can be recharged without blowing up, for it is built to hold D:much magical energy. @@ -6219,7 +6687,11 @@ I:11:7:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Priests of Eru. The relic now lies in pieces, hidden D:from all but but his most dedicated followers. @@ -6230,7 +6702,11 @@ I:11:8:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Priests of Manwe. The relic now lies in pieces, hidden D:from all but his most dedicated followers. @@ -6241,7 +6717,11 @@ I:11:9:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to worshippers of Tulkas. The relic now lies in pieces, D:hidden from all but his most dedicated followers. @@ -6252,7 +6732,11 @@ I:11:10:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Dark Priests. The relic now lies in pieces, hidden D:from all but the most faithful followers of Melkor. @@ -6263,7 +6747,11 @@ I:11:11:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Druids. The relic now lies in pieces, hidden D:from all but the most faithful followers of Yavanna. diff --git a/lib/edit/ow_info.txt b/lib/edit/ow_info.txt index d71dfa26..7a27fc59 100644 --- a/lib/edit/ow_info.txt +++ b/lib/edit/ow_info.txt @@ -16,77 +16,156 @@ N:0:Bilbo the Friendly(Hobbit) I:20000:120 C:120:100:80 -L:Elf | Half-Elf | High-Elf | Dunadan | Hobbit | Dwarf | RohanKnight -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold +L:Dunadan +L:Dwarf +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:RohanKnight +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:1:Uldrik(Human) I:20000:120 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:2:Otick(Human) I:100:120 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:3:Merana(Human) I:0:120 C:200:100:95 L:Human -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:4:Mirimbar(High-Elf) I:0:120 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:5:Raistlin the Chicken(Human) I:20000:130 C:120:100:80 L:Human -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:6:Sultan the Midget(Gnome) I:30000:120 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:7:Lyar-el the Comely(Elf) I:30000:120 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:8:Kon-Dar the Ugly(Half-Orc) I:5000:140 C:120:100:80 -L:Orc | Troll | Half-Ogre | Beorning | Kobold -H:Gnome | Dwarf | Human | RohanKnight | Elf | Half-Elf | High-Elf +L:Beorning +L:Half-Ogre +L:Kobold +L:Orc +L:Troll +H:Dwarf +H:Elf +H:Gnome +H:Half-Elf +H:High-Elf +H:Human +H:RohanKnight N:9:Darg-Low the Grim(Human) I:10000:130 C:120:100:80 L:Human -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:10:Decado the Handsome(Dunadan) I:25000:140 C:120:100:80 -L:Human | Dunadan | RohanKnight -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:11:Wieland the Smith(Dwarf) I:30000:140 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:12:Arnold the Beastly(Barbarian) I:5000:140 @@ -95,26 +174,55 @@ C:120:100:80 N:13:Arndal Beast-Slayer(Half-Elf) I:10000:130 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:14:Eddie Beast-Master(Half-Orc) I:25000:140 C:120:100:80 -L:Orc | Troll | Half-Ogre | Beorning | Kobold -H:Gnome | Dwarf | Human | RohanKnight | Elf | Half-Elf | High-Elf +L:Beorning +L:Half-Ogre +L:Kobold +L:Orc +L:Troll +H:Dwarf +H:Elf +H:Gnome +H:Half-Elf +H:High-Elf +H:Human +H:RohanKnight N:15:Oglign Dragon-Slayer(Dwarf) I:30000:130 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:16:Aragorn(Dunadan) I:20000:140 C:120:100:80 -L:Human | Dunadan | RohanKnight -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:17:Sondar(Human) I:0:140 @@ -123,15 +231,28 @@ C:120:100:80 N:18:Celebor(Half-Elf) I:100:120 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:19:Sharra(Human) I:25000:140 C:120:100:80 -L:Human | Dunadan | RohanKnight -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:20:Hjolgar(Barbarian) I:5000:140 @@ -169,266 +290,523 @@ L:Thunderlord N:26:Ludwig the Humble(Dwarf) I:5000:130 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:27:Gunnar the Paladin(Half-Troll) I:10000:130 C:120:100:80 -L:Orc | Troll | Half-Ogre | Beorning | Kobold -H:Gnome | Dwarf | Human | RohanKnight | Elf | Half-Elf | High-Elf +L:Beorning +L:Half-Ogre +L:Kobold +L:Orc +L:Troll +H:Dwarf +H:Elf +H:Gnome +H:Half-Elf +H:High-Elf +H:Human +H:RohanKnight N:28:Torin the Chosen(High-Elf) I:25000:130 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:29:Sarastro the Wise(Human) I:30000:130 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:30:Mauser the Chemist(Half-Elf) I:10000:130 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:31:Wizzle the Chaotic(Hobbit) I:10000:130 C:120:100:80 -L:Elf | Half-Elf | High-Elf | Dunadan | Hobbit | Dwarf | RohanKnight -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Dwarf +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:RohanKnight +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:32:Midas the Greedy(Gnome) I:15000:140 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:33:Ja-Far the Alchemist(Elf) I:15000:140 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:34:Ariel the Sorceress(Half-Elf) I:20000:140 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:35:Buggerby the Great(Gnome) I:20000:140 C:120:100:80 -L:Gnome | Dwarf | Petty-Dwarf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dwarf +L:Gnome +L:Petty-Dwarf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:36:Inglorian the Mage(Human) I:30000:140 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:37:Luthien Starshine(High-Elf) I:30000:130 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:38:Gary Gygaz(Half-Troll) I:20000:180 C:120:100:80 #L:Rogue -H:Gnome | Dwarf | Human | RohanKnight | Elf | Half-Elf | High-Elf +H:Dwarf +H:Elf +H:Gnome +H:Half-Elf +H:High-Elf +H:Human +H:RohanKnight N:39:Histor the Goblin(Half-Orc) I:20000:180 C:120:100:80 #L:Rogue -H:Gnome | Dwarf | Human | RohanKnight | Elf | Half-Elf | High-Elf +H:Dwarf +H:Elf +H:Gnome +H:Half-Elf +H:High-Elf +H:Human +H:RohanKnight N:40:Zorak the Smart(Dwarf) I:30000:180 C:120:100:80 #L:Rogue -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:41:Tipo the Fair(Human) I:30000:180 C:120:100:80 #L:Rogue -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:42:Dolaf the Greedy(Human) I:10000:130 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:43:Odnar the Sage(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:44:Gandar the Neutral(Dark-Elf) I:25000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:45:Ro-sha the Patient(Elf) I:30000:110 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:46:N'rak the Summoner(Human) I:10000:130 C:120:100:80 -L:Human | Dunadan | RohanKnight -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:47:Esperion the Beastlover(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:48:Flarim the Shopkeeper(Dunadan) I:25000:110 C:120:100:80 -L:Human | Dunadan | RohanKnight -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:49:Tril-akheb the Supreme(Elf) I:30000:110 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:50:Dorchel(Elf) I:30000:110 C:120:100:80 -L:Elf | Half-Elf | Dark-Elf | High-Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Dark-Elf +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:51:Galadriel(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:52:Celeborn(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:53:Aulendil(Elf) I:30000:110 C:120:100:80 #L:Warrior | -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:54:Valceronwe(Elf) I:30000:110 C:120:100:80 #L:Mage | Thaumaturgist | Sorceror -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:55:Voronwe(Elf) I:30000:110 C:120:100:80 #L:Priest | Paladin -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:56:Celegail(Elf) I:30000:110 C:120:100:80 #L:Ranger -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:57:Turgon(High-Elf) I:30000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:58:Pengolodh(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:59:Aerandir(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:60:Celebrimbor(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Warrior | -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:61:Lomelosse(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf | -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:62:Arlindel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Harper | Ranger -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:63:Sulraen(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Mage | Sorceror -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:64:Firiel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf | -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:65:Earendur(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:66:Glorfindel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf +L:Half-Elf +L:High-Elf #L:Ranger -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:67:Ecthelion(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf +L:Half-Elf +L:High-Elf #L:Paladin -H:Orc | Troll | Half-Ogre | Beorning | Kobold | +H:Beorning +H:Half-Ogre +H:Kobold +H:Orc +H:Troll N:68:Kanris(Human) I:5000:140 @@ -437,5 +815,12 @@ C:120:100:80 N:69:Barliman Butterbur(Human) I:100:120 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Orc | Troll | DeathMold | Half-Ogre | Beorning | Kobold | +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:DeathMold +H:Half-Ogre +H:Kobold +H:Orc +H:Troll diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index e313ffa3..04706321 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -688,7 +688,7 @@ C:B:4:35:3 C:C:L:H:10000:2:40 C:P:2:20 C:Z:detect curses -C:G:GOD_FRIEND | +C:G:GOD_FRIEND C:E:0:0:0:0:0:0 C:k:+1000:+900:Magic C:k:+0:+600:Spell-power @@ -844,7 +844,12 @@ R:S:0:0:0:0:0:0:0 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. @@ -852,7 +857,12 @@ R:S:0:1:1:1:-1:1:0 R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:G:ELF R:k:+200:+000:Disarming R:k:+300:+000:Magic-Device @@ -871,8 +881,12 @@ R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:RES_LITE | -R:C:Warrior | Archer | Mage | Priest | Loremaster +R:F:RES_LITE +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Warrior R:G:ELF R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device @@ -890,10 +904,15 @@ R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 R:E:1:1:1:2:1:1 R:Z:create food -R:G:RESIST_BLACK_BREATH | XTRA_MIGHT_SLING | +R:G:RESIST_BLACK_BREATH +R:G:XTRA_MIGHT_SLING R:R:1:0 -R:F:SUST_DEX | -R:C:Warrior | Archer | Mage | Rogue | Loremaster +R:F:SUST_DEX +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Rogue +R:C:Warrior R:k:+0:+300:Sling-mastery R:k:+1500:+000:Disarming R:k:+1800:+000:Magic-Device @@ -912,8 +931,10 @@ R:P:8:135:4:13 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 -R:F:FREE_ACT | -R:C:Warrior | Mage | Rogue +R:F:FREE_ACT +R:C:Mage +R:C:Rogue +R:C:Warrior R:k:+1000:+000:Disarming R:k:+1200:+000:Magic-Device R:k:+6000:+000:Spirituality @@ -931,8 +952,9 @@ R:P:11:125:5:16 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 -R:F:RES_BLIND | -R:C:Warrior | Priest +R:F:RES_BLIND +R:C:Priest +R:C:Warrior R:k:+0:+200:Axe-mastery R:k:+200:+000:Disarming R:k:+900:+000:Magic-Device @@ -950,8 +972,11 @@ R:P:10:110:3:25 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 -R:F:RES_DARK | -R:C:Warrior | Archer | Rogue | Priest +R:F:RES_DARK +R:C:Archer +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:-300:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality @@ -969,9 +994,9 @@ R:P:12:137:3:22 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 -R:F:SUST_STR | +R:F:SUST_STR R:R:15:0 -R:F:REGEN | +R:F:REGEN R:C:Warrior R:k:-500:+000:Disarming R:k:-800:+000:Magic-Device @@ -989,8 +1014,14 @@ R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:SUST_CON | REGEN | -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster +R:F:REGEN +R:F:SUST_CON +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:+400:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality @@ -1008,10 +1039,14 @@ R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:SEE_INVIS | -R:F:RES_LITE | +R:F:RES_LITE +R:F:SEE_INVIS R:G:ELF -R:C:Warrior | Archer | Mage | Priest | Loremaster +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Warrior R:k:+400:+000:Disarming R:k:+2000:+000:Magic-Device R:k:+10000:+000:Spirituality @@ -1029,8 +1064,10 @@ R:P:12:130:3:74 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 -R:F:SUST_STR | RES_DARK | -R:C:Warrior | Priest +R:F:RES_DARK +R:F:SUST_STR +R:C:Priest +R:C:Warrior R:k:-300:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality @@ -1048,10 +1085,12 @@ R:P:12:150:3:75 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 -R:F:SUST_STR | +R:F:SUST_STR R:R:20:1 -R:F:STR | -R:C:Warrior | Rogue | Loremaster +R:F:STR +R:C:Loremaster +R:C:Rogue +R:C:Warrior R:k:+1000:+1000:Bearform-combat R:k:-600:+000:Disarming R:k:-800:+000:Magic-Device @@ -1069,8 +1108,10 @@ R:P:9:125:3:82 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 -R:F:RES_POIS | -R:C:Warrior | Archer | Rogue +R:F:RES_POIS +R:C:Archer +R:C:Rogue +R:C:Warrior R:k:-200:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality @@ -1088,8 +1129,10 @@ R:P:11:135:5:87 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 -R:F:RES_DARK | RES_DISEN | -R:C:Warrior | Rogue +R:F:RES_DARK +R:F:RES_DISEN +R:C:Rogue +R:C:Warrior R:k:+300:+000:Disarming R:k:+500:+000:Magic-Device R:k:+5000:+000:Spirituality @@ -1108,10 +1151,14 @@ R:P:9:150:5:69 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 -R:F:RES_DARK | +R:F:RES_DARK R:R:20:0 -R:F:SEE_INVIS | -R:C:Warrior | Archer | Mage | Rogue | Priest +R:F:SEE_INVIS +R:C:Archer +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:G:ELF R:k:+0:+200:Magic R:k:+500:+000:Disarming @@ -1130,16 +1177,22 @@ R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 R:E:1:1:1:2:1:1 R:Z:grow trees -R:G:NO_STUN | NO_FOOD | -R:G:AC_LEVEL | +R:G:AC_LEVEL +R:G:NO_FOOD +R:G:NO_STUN R:R:1:-5 -R:F:SPEED | SENS_FIRE | SLOW_DIGEST | +R:F:SENS_FIRE +R:F:SLOW_DIGEST +R:F:SPEED R:R:5:0 -R:F:SEE_INVIS | +R:F:SEE_INVIS R:R:20:0 -R:F:ESP_ORC | -R:F:ESP_TROLL | ESP_EVIL | -R:C:Warrior | Priest | Loremaster +R:F:ESP_EVIL +R:F:ESP_ORC +R:F:ESP_TROLL +R:C:Loremaster +R:C:Priest +R:C:Warrior R:O:70:32:2d3 R:b:1:Tree walking R:k:+0:+200:Barehand-combat @@ -1161,26 +1214,27 @@ R:P:10:220:0:84 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 -R:F:SPEED | +R:F:SPEED R:R:5:1 -R:F:SPEED | +R:F:SPEED R:R:10:1 -R:F:SPEED | +R:F:SPEED R:R:15:1 -R:F:SPEED | +R:F:SPEED R:R:20:1 -R:F:SPEED | +R:F:SPEED R:R:25:1 -R:F:SPEED | +R:F:SPEED R:R:30:1 -R:F:SPEED | +R:F:SPEED R:R:35:1 -R:F:SPEED | +R:F:SPEED R:R:40:1 -R:F:SPEED | +R:F:SPEED R:R:45:1 -R:F:SPEED | -R:C:Warrior | Priest +R:F:SPEED +R:C:Priest +R:C:Warrior R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality @@ -1198,22 +1252,25 @@ R:P:12:400:0:89 R:E:1:1:1:2:1:1 R:Z:Thunderlord's Powers R:R:1:0 -R:F:FEATHER | +R:F:FEATHER R:R:4:0 -R:F:ESP_DRAGON | +R:F:ESP_DRAGON R:R:5:0 -R:F:RES_ELEC | +R:F:RES_ELEC R:R:10:0 -R:F:RES_COLD | +R:F:RES_COLD R:R:15:0 -R:F:RES_ACID | +R:F:RES_ACID R:R:17:0 -R:F:FLY | +R:F:FLY R:R:35:0 -R:F:RES_POIS | +R:F:RES_POIS R:R:45:0 -R:F:IM_ELEC | -R:C:Warrior | Mage | Archer | Priest +R:F:IM_ELEC +R:C:Archer +R:C:Mage +R:C:Priest +R:C:Warrior R:k:+600:+000:Disarming R:k:+000:+000:Magic-Device R:k:+5000:+000:Spirituality @@ -1232,9 +1289,12 @@ R:E:1:1:1:4:0:0 R:Z:Death Mold's Powers R:G:EXPERIMENTAL R:R:1:0 -R:F:IMMOVABLE | HOLD_LIFE | -R:F:RES_NETHER | RES_NEXUS | -R:C:Mage | Priest +R:F:HOLD_LIFE +R:F:IMMOVABLE +R:F:RES_NETHER +R:F:RES_NEXUS +R:C:Mage +R:C:Priest R:k:+0:+200:Necromancy R:k:+1500:+000:Disarming R:k:-500:+000:Magic-Device @@ -1250,7 +1310,12 @@ R:S:-5:-5:-5:-5:-5:-5:-5 R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:-500:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality @@ -1266,10 +1331,15 @@ R:S:-3:2:1:5:-4:1:0 R:K:5:6:6:5:8:12:-25:40 R:P:7:130:4:5 R:E:1:1:1:2:1:1 -R:G:XTRA_MIGHT_BOW | +R:G:XTRA_MIGHT_BOW R:R:1:1 -R:F:XTRA_MIGHT | RES_LITE | -R:C:Warrior | Archer | Mage | Priest | Loremaster +R:F:RES_LITE +R:F:XTRA_MIGHT +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Warrior R:G:ELF R:k:+0:+200:Archery R:b:1:Tree walking @@ -1290,26 +1360,68 @@ R:P:10:100:0:91 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:1:0 -R:F:AGGRAVATE | +R:F:AGGRAVATE R:R:20:0 -R:F:DRAIN_EXP | +R:F:DRAIN_EXP R:R:6:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:12:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:18:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:24:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:30:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:36:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:42:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:48:1 -R:F:STR | INT | WIS | DEX | CON | CHR | -R:C:Warrior | Archer | Mage +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS +R:C:Archer +R:C:Mage +R:C:Warrior R:k:+000:+000:Disarming R:k:+000:+000:Magic-Device R:k:+000:+000:Spirituality @@ -1347,10 +1459,28 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Kobold | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | Thunderlord | -S:A:DeathMold | Yeek | Wood-Elf | Maia | +S:A:Beorning +S:A:Dark-Elf +S:A:DeathMold +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Maia +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Thunderlord +S:A:Troll +S:A:Wood-Elf +S:A:Yeek # Just a place holder, the actualy setting are done with corruptions, see # corrupt.lua and player.lua @@ -1361,9 +1491,21 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Hobbit | Gnome | Dwarf | Orc | -S:A:Troll | Dunadan | Half-Ogre | Beorning | Kobold | Petty-Dwarf | -S:A:Dark-Elf | RohanKnight | Yeek | +S:A:Beorning +S:A:Dark-Elf +S:A:Dunadan +S:A:Dwarf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Yeek S:C:A:Mage S:O:70:0:5d3 S:O:70:32:2d3 @@ -1375,14 +1517,38 @@ S:S:-5:1:1:2:-3:-6:-3:105 S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Kobold | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | -S:C:F:Warrior | Archer -S:G:UNDEAD | NO_CUT | NO_FOOD | SEMI_WRAITH | NO_SUBRACE_CHANGE +S:A:Beorning +S:A:Dark-Elf +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek +S:C:F:Archer +S:C:F:Warrior +S:G:NO_CUT +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:SEMI_WRAITH +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:SLOW_DIGEST | RES_COLD | RES_POIS | RES_NETHER | +S:F:HOLD_LIFE +S:F:RES_COLD +S:F:RES_NETHER +S:F:RES_POIS +S:F:SEE_INVIS +S:F:SLOW_DIGEST S:O:70:32:2d3 S:k:+200:+000:Disarming S:k:+800:+000:Magic-Device @@ -1399,15 +1565,35 @@ S:S:0:-2:-2:0:1:-4:-3:70 S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Kobold | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | -S:G:UNDEAD | NO_CUT | NO_FOOD | NO_SUBRACE_CHANGE +S:A:Beorning +S:A:Dark-Elf +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek +S:G:NO_CUT +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:RES_POIS | RES_SHARDS | +S:F:HOLD_LIFE +S:F:RES_POIS +S:F:RES_SHARDS +S:F:SEE_INVIS S:R:10:0 -S:F:RES_COLD | +S:F:RES_COLD S:O:70:32:2d3 S:k:-500:+000:Disarming S:k:-500:+000:Magic-Device @@ -1423,16 +1609,35 @@ S:S:2:-6:-6:1:4:-5:-4:70 S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Kobold | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | +S:A:Beorning +S:A:Dark-Elf +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek S:C:F:Mage -S:G:UNDEAD | NO_FOOD | NO_SUBRACE_CHANGE +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:SLOW_DIGEST | RES_POIS | +S:F:HOLD_LIFE +S:F:RES_POIS +S:F:SEE_INVIS +S:F:SLOW_DIGEST S:R:5:0 -S:F:RES_COLD | +S:F:RES_COLD S:O:70:32:2d3 S:k:-200:+000:Disarming S:k:-200:+000:Magic-Device @@ -1448,10 +1653,15 @@ S:S:2:-3:-2:1:1:-3:1:50 S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 S:E:0:0:0:0:0:0 -S:A:Human | Dwarf | Orc | Troll | Half-Ogre | Beorning | +S:A:Beorning +S:A:Dwarf +S:A:Half-Ogre +S:A:Human +S:A:Orc +S:A:Troll S:C:F:Mage S:R:10:0 -S:F:RES_FEAR | +S:F:RES_FEAR S:k:-200:+000:Disarming S:k:-1000:+000:Magic-Device S:k:+200:+000:Spirituality @@ -1467,10 +1677,25 @@ S:S:-3:1:1:-3:-3:1:0:120 S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Dunadan | High-Elf | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | -S:A:Thunderlord | DeathMold | Yeek | Wood-Elf | Maia | -S:C:F:Warrior | Archer +S:A:Dark-Elf +S:A:DeathMold +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Maia +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Thunderlord +S:A:Wood-Elf +S:A:Yeek +S:C:F:Archer +S:C:F:Warrior S:k:+500:+000:Disarming S:k:+1000:+000:Magic-Device S:k:+500:+000:Spirituality @@ -1485,13 +1710,32 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:G:ASTRAL | NO_SUBRACE_CHANGE +S:G:ASTRAL +S:G:NO_SUBRACE_CHANGE S:R:1:0 S:F:SEE_INVIS -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Kobold | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | Thunderlord | -S:A:DeathMold | Yeek | Wood-Elf | Maia | +S:A:Beorning +S:A:Dark-Elf +S:A:DeathMold +S:A:Dunadan +S:A:Dwarf +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Kobold +S:A:Maia +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Thunderlord +S:A:Troll +S:A:Wood-Elf +S:A:Yeek S:O:70:32:25d2 S:O:70:12:25d3 diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index afb225c1..92fc173a 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -199,10 +199,19 @@ E:1:1:1:2:1:1 O:1:1:1:1 B:BEG:* B:TOUCH:EAT_GOLD -F:MALE | EVIL | WILD_TOWN | WILD_ONLY | -F:RAND_25 | FRIENDS | -F:TAKE_ITEM | OPEN_DOOR | DROP_CORPSE | DROP_SKELETON | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He looks squalid and thoroughly revolting. N:2:Scrawny cat @@ -212,9 +221,16 @@ W:0:3:100:0 E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d1 -F:RAND_25 | WILD_TOO | WILD_GRASS | WILD_TOWN | WILD_ONLY | -F:ANIMAL | DROP_CORPSE | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:RAND_25 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_TOO +F:WILD_TOWN D:A skinny little furball with sharp claws and a menacing look. N:3:Sparrow @@ -224,9 +240,16 @@ W:0:3:90:0 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | CAN_FLY | WILD_TOWN | WILD_ONLY | -F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_SKELETON +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:RAND_25 +F:WILD_ONLY +F:WILD_TOWN D:Utterly harmless, except when angry. N:4:Chaffinch @@ -236,9 +259,17 @@ W:0:3:80:0 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | CAN_FLY | WILD_ONLY | WILD_WOOD | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_SKELETON +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:RAND_25 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Utterly harmless, except when angry. N:5:Wild rabbit @@ -248,9 +279,15 @@ W:0:3:100:0 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_50 | WILD_ONLY | WILD_GRASS | WILD_WOOD | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:RAND_50 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:It is not a carnivore, but will defend itself if you stray too D:close. @@ -261,11 +298,20 @@ W:0:1:1000:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:MALE | WILD_ONLY | WILD_WOOD | -F:RAND_25 | DROP_SKELETON | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | HAS_LITE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_WOOD D:He has a strong axe with a sharp edge. N:7:Scruffy little dog @@ -275,8 +321,14 @@ W:0:3:300:0 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:RAND_25 +F:WILD_ONLY +F:WILD_TOWN D:A thin flea-ridden mutt, growling as you get close. N:8:Farmer Maggot @@ -287,12 +339,23 @@ E:0:1:1:2:1:1 O:0:100:0:0 #B:MOAN:* #B:MOAN:* -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | NO_TARGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL F:NEVER_MOVE -F:OPEN_DOOR | BASH_DOOR | SPECIAL_GENE -F:NEUTRAL | NO_DEATH -F:MORTAL | BASEANGBAND | HAS_LITE +F:NO_DEATH +F:NO_TARGET +F:OPEN_DOOR +F:SPECIAL_GENE +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:He's lost his dogs. He's had his mushrooms stolen. He's not a happy D:hobbit! @@ -303,9 +366,17 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | TAKE_ITEM | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He tends to blubber a lot. N:10:Boil-covered wretch @@ -315,10 +386,19 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:Ugly doesn't begin to describe him. N:11:Village idiot @@ -328,9 +408,17 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | TAKE_ITEM | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:Drooling and comical, but then, what do you expect? N:12:Pitiful-looking beggar @@ -340,10 +428,18 @@ W:0:1:1300:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:You just can't help feeling sorry for him. N:13:Mangy-looking leper @@ -354,10 +450,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* B:TOUCH:DISEASE -F:MALE | DROP_CORPSE | DROP_SKELETON | -F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:You feel it isn't safe to touch him. N:14:Agent of the black market @@ -369,11 +473,23 @@ O:25:50:20:5 B:HIT:HURT:1d6 B:TOUCH:EAT_ITEM B:INSULT:* -F:MALE | DROP_CORPSE | DROP_SKELETON | -F:DROP_60 | WILD_TOWN | -F:WILD_SWAMP | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SWAMP +F:WILD_TOWN +F:WILD_WOOD D:He 'finds' new wares for the Black Market. From unwary adventurers... N:15:Singing, happy drunk @@ -383,11 +499,20 @@ W:0:1:1100:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:MALE | -F:RAND_50 | DROP_SKELETON | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | WILD_TOWN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He makes you glad to be sober. N:16:Aimless-looking merchant @@ -397,10 +522,20 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:MALE | RAND_50 | -F:ONLY_GOLD | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:The typical ponce around town, with purse jingling, and looking for more D:amulets of adornment to buy. @@ -411,10 +546,22 @@ W:0:1:1700:0 E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_50 | DROP_90 | WILD_GRASS | WILD_TOWN | WILD_WOOD | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_GRASS +F:WILD_ONLY +F:WILD_TOWN +F:WILD_WOOD D:No job is too low for him. N:18:Battle-scarred veteran @@ -424,10 +571,19 @@ W:0:1:1650:0 E:1:1:1:2:1:1 O:25:50:25:0 B:HIT:HURT:2d6 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_50 | DROP_90 | WILD_TOWN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He doesn't take to strangers kindly. N:19:Martti Ihrasaari @@ -438,11 +594,20 @@ E:0:1:1:2:1:1 O:50:50:0:0 B:SHOW:* B:SHOW:* -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_CORPSE | WILD_TOWN | WILD_ONLY | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:JOKEANGBAND | HAS_LITE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:He weighs 127 kg. He is the president of some remote country. ##### Normal monsters ##### @@ -455,11 +620,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 B:SPORE:HURT:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A small strange growth. N:21:Large white snake @@ -470,9 +641,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 B:CRUSH:HURT:1d1 -F:RAND_50 | WILD_TOO | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It is about eight feet long. N:22:Grey mushroom patch @@ -482,10 +659,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. N:23:Newt @@ -496,9 +679,19 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 -F:WEIRD_MIND | CAN_SWIM | WILD_TOO | DROP_CORPSE | -F:WILD_GRASS | WILD_WASTE | WILD_SHORE | WILD_SWAMP | WILD_MOUNTAIN | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE D:A small, harmless lizard. N:24:Giant white centipede @@ -509,9 +702,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d2 B:STING:HURT:1d2 -F:RAND_50 | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_50 +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:25:White icky thing @@ -521,8 +719,12 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:EMPTY_MIND | DROP_CORPSE | BASEANGBAND +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:RAND_25 +F:RAND_50 D:It is a smallish, slimy, icky creature. N:26:Clear icky thing @@ -532,9 +734,14 @@ W:1:1:500:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 -F:ATTR_CLEAR | CAN_SWIM | -F:RAND_50 | RAND_25 | -F:INVISIBLE | EMPTY_MIND | DROP_CORPSE | BASEANGBAND +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:INVISIBLE +F:RAND_25 +F:RAND_50 D:It is a smallish, slimy, icky, blobby creature. N:27:Giant white mouse @@ -544,10 +751,14 @@ W:1:1:600:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | WILD_TOO | WILD_GRASS | -F:CAN_SWIM | -F:ANIMAL | DROP_CORPSE | -F:MORTAL | BASEANGBAND | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_GRASS +F:WILD_TOO S:MULTIPLY D:It is about three feet long with large teeth. @@ -559,9 +770,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:CRUSH:HURT:1d4 -F:RAND_25 | CAN_SWIM | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 D:It is about eight feet long. N:29:Small kobold @@ -571,10 +788,17 @@ W:1:1:800:5 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d5 -F:DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:It is a small, dog-headed humanoid figure. N:30:Kobold @@ -584,10 +808,17 @@ W:2:1:900:5 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d8 -F:DROP_60 | WILD_TOO | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:It is a squat and ugly dog-headed humanoid. N:31:White worm mass @@ -597,10 +828,18 @@ W:1:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | -F:ANIMAL | IM_POIS | HURT_LITE | NO_FEAR -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -611,8 +850,12 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:PARALYZE -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR D:A disembodied eye, floating a few feet above the ground. N:33:Rock lizard @@ -622,9 +865,14 @@ W:1:1:100:2 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_MOUNTAIN | -F:DROP_CORPSE | HAS_EGG | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO D:It is a small lizard with a hardened hide. N:34:Grid bug @@ -634,9 +882,15 @@ W:1:1:10:2 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:ELEC:1d4 -F:RAND_25 | FRIENDS | CAN_FLY | -F:STUPID | WEIRD_MIND | -F:ANIMAL | NO_FEAR | IM_ELEC | ZANGBAND +F:ANIMAL +F:CAN_FLY +F:FRIENDS +F:IM_ELEC +F:NO_FEAR +F:RAND_25 +F:STUPID +F:WEIRD_MIND +F:ZANGBAND D:A strange electric bug. N:35:Jackal @@ -646,9 +900,15 @@ W:1:1:400:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:FRIENDS | -F:WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:It is a yapping snarling dog, dangerous when in a pack. N:36:Soldier ant @@ -658,9 +918,14 @@ W:1:1:300:3 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | -F:ANIMAL | WILD_TOO | WILD_GRASS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:A large ant with powerful mandibles. N:37:Fruit bat @@ -670,8 +935,15 @@ W:1:1:20:1 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:ANIMAL | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_SWAMP | DROP_CORPSE -F:MORTAL | BASEANGBAND | AI_ANNOY +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:A fast-moving pest. N:38:Insect swarm @@ -682,9 +954,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 B:STING:HURT:1d1 -F:ANIMAL | WEIRD_MIND | CAN_FLY | RAND_25 | WILD_TOO | WILD_GRASS | -F:WILD_WOOD | WILD_SWAMP | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:NO_CUT +F:RAND_25 +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:A lone insect may be harmless, but there's a whole swarm of D:them here! @@ -697,11 +978,30 @@ O:0:0:0:0 B:GAZE:* B:GAZE:* B:CRUSH:* -F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | IM_COLD | UNIQUE | -F:RES_NETH | RES_WATE | RES_PLAS | RES_DISE | RES_NEXU | NO_SLEEP | NO_CONF -F:KILL_WALL | FORCE_MAXHP | CAN_SWIM | DROP_CORPSE | JOKEANGBAND | HAS_LITE -S:1_IN_9 | -S:TPORT | BLINK | TELE_AWAY +F:CAN_SWIM +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_WALL +F:NO_CONF +F:NO_SLEEP +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:UNIQUE +S:1_IN_9 +S:BLINK +S:TELE_AWAY +S:TPORT D:This unholy abomination will crush you. Flee while you can! N:40:Shrieker mushroom patch @@ -710,11 +1010,21 @@ I:110:1d1:4:1:0 W:2:1:40:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW | -F:STUPID | EMPTY_MIND | -F:IM_POIS | WILD_TOO | WILD_SWAMP | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 S:SHRIEK D:Yum! It looks quite tasty. It doesn't sound so nice, though... @@ -728,9 +1038,15 @@ B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD B:DROOL:* B:DROOL:* -F:RAND_50 | DROP_90 | CAN_SWIM | DROP_CORPSE | -F:EMPTY_MIND | TAKE_ITEM | KILL_BODY | -F:IM_POIS | BASEANGBAND +F:BASEANGBAND +F:CAN_SWIM +F:DROP_90 +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:KILL_BODY +F:RAND_50 +F:TAKE_ITEM D:It is a smallish, slimy, icky, hungry creature. N:42:Metallic green centipede @@ -740,9 +1056,14 @@ W:3:1:500:5 E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:1d2 -F:RAND_50 | WILD_TOO | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_50 +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:43:Novice warrior @@ -753,10 +1074,16 @@ E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:MALE | -F:DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:He looks inexperienced but tough. N:44:Novice rogue @@ -767,10 +1094,17 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO D:A rather shifty individual. N:45:Novice priest @@ -780,13 +1114,22 @@ W:2:1:1500:6 E:1:1:1:2:1:1 O:25:0:50:20 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:HEAL | SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:CAUSE_1 +S:HEAL +S:SCARE D:He is tripping over his priestly robes. N:46:Novice mage @@ -796,13 +1139,22 @@ W:2:1:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:MALE | -F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BLINK | BLIND | CONF | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:BLINK +S:CONF +S:MISSILE D:He is leaving behind a trail of dropped spell components. N:47:Yellow mushroom patch @@ -812,11 +1164,18 @@ W:2:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d6 -F:NEVER_MOVE | WILD_TOO | WILD_SWAMP | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_SWAMP +F:WILD_TOO D:Yum! It looks quite tasty. N:48:White jelly @@ -826,10 +1185,17 @@ W:2:1:2000:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d2 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It's a large pile of white flesh. N:49:Giant black ant @@ -839,10 +1205,16 @@ W:2:1:500:8 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:RAND_25 | -F:WEIRD_MIND | DROP_SKELETON | -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:It is about three feet long. N:50:Salamander @@ -852,9 +1224,16 @@ W:2:1:100:10 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 -F:RAND_25 | CAN_SWIM | WILD_TOO | WILD_VOLCANO | DROP_CORPSE | -F:ANIMAL | IM_FIRE | SUSCEP_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A small black and orange lizard. N:51:White harpy @@ -866,8 +1245,16 @@ O:0:0:0:0 B:CLAW:HURT:1d1 B:CLAW:HURT:1d1 B:BITE:HURT:1d2 -F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | -F:RAND_50 | DROP_CORPSE | ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO D:A flying, screeching bird with a woman's face. N:52:Blue yeek @@ -877,10 +1264,14 @@ W:2:1:700:4 E:1:1:1:2:1:1 O:25:0:0:55 B:HIT:HURT:1d5 -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR D:A small humanoid figure. N:53:Grip, Farmer Maggot's dog @@ -890,10 +1281,15 @@ W:2:2:600:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR | ANIMAL -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -904,10 +1300,15 @@ W:2:2:650:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -918,10 +1319,15 @@ W:2:2:700:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -932,9 +1338,15 @@ W:2:1:200:6 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 -F:RAND_25 | WILD_ONLY | WILD_SHORE | WILD_SWAMP | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WILD_ONLY +F:WILD_SHORE +F:WILD_SWAMP D:It is as big as a wolf. N:57:Freesia @@ -945,11 +1357,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d4 -F:UNIQUE | -F:FORCE_MAXHP | DROP_SKELETON -F:BASH_DOOR | F:ANIMAL -F:MORTAL | ZANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:MORTAL +F:UNIQUE +F:ZANGBAND D:A striped housecat who enjoys hunting. N:58:Green worm mass @@ -959,11 +1373,18 @@ W:2:1:40:3 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:ACID:1d3 -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | -F:ANIMAL | IM_ACID | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_ACID +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -975,8 +1396,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:HURT:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long. N:60:Cave spider @@ -986,10 +1415,16 @@ W:2:1:400:7 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:FRIENDS | -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | SPIDER | HURT_LITE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HURT_LITE +F:MORTAL +F:SPIDER +F:WEIRD_MIND D:It is a black spider that moves in fits and starts. N:61:Crow @@ -1000,8 +1435,14 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 -F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_TOO +F:WILD_WOOD D:It is a hooded crow, gray except for the black wings and head. N:62:Wild cat @@ -1012,8 +1453,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:BASH_DOOR | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_TOO D:A larger than normal feline, hissing loudly. Its velvet claws conceal a D:fistful of needles. @@ -1024,12 +1470,28 @@ W:3:2:670:16 E:1:1:1:2:1:1 O:50:50:0:0 B:TOUCH:EAT_GOLD -F:UNIQUE | MALE | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | DROP_CHOSEN | -F:FORCE_MAXHP | CAN_SPEAK | SMART | -F:RAND_50 | RAND_25 | WILD_TOO | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | DROP_GREAT | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | INVISIBLE -F:EVIL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_90 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:INVISIBLE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO D:Usually known as Gollum. He's been sneaking, and he wants his 'precious.' N:64:Green ooze @@ -1039,10 +1501,19 @@ W:3:2:300:4 E:0:0:0:0:0:0 O:50:0:25:20 B:CRAWL:ACID:1d3 -F:RAND_50 | RAND_25 | DROP_90 | -F:STUPID | EMPTY_MIND | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:DROP_90 +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:STUPID D:It's green and it's oozing. N:65:Poltergeist @@ -1052,14 +1523,27 @@ W:3:1:0:8 E:0:0:0:0:0:0 O:50:5:30:10 B:TOUCH:TERRIFY -F:RAND_50 | RAND_25 | CAN_FLY | -F:DROP_60 | DROP_90 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | TAKE_ITEM | -F:EVIL | UNDEAD | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLINK -D:It is a ghastly, ghostly form. +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLINK +D:It is a ghastly, ghostly form. N:66:Yellow jelly G:j:y @@ -1068,11 +1552,18 @@ W:3:1:2000:12 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_15 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_15 S:DRAIN_MANA D:It's a large pile of yellow flesh. @@ -1083,9 +1574,14 @@ W:4:1:770:6 E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:1d3 -F:RAND_50 | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_50 +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:68:Raven @@ -1096,8 +1592,14 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 -F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_TOO +F:WILD_WOOD D:Larger than a crow, and pitch black. N:69:Giant white louse @@ -1107,8 +1609,13 @@ W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:It is six inches long. @@ -1120,9 +1627,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:STING:HURT:1d3 -F:RAND_50 | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_50 +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:71:Black naga @@ -1132,10 +1644,15 @@ W:3:1:1700:20 E:0:0:0:0:1:0 O:0:75:20:5 B:CRUSH:HURT:1d8 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 D:A large black serpent's body with a female torso. N:72:Spotted mushroom patch @@ -1145,10 +1662,17 @@ W:3:1:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:2d4 -F:NEVER_MOVE | WILD_TOO | WILD_SWAMP | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_SWAMP +F:WILD_TOO D:Yum! It looks quite tasty. N:73:Silver jelly @@ -1159,11 +1683,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:1d3 B:TOUCH:EAT_LITE:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_15 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_15 S:DRAIN_MANA D:It is a large pile of silver flesh that sucks all light from its D:surroundings. @@ -1176,11 +1707,16 @@ E:1:1:1:2:1:1 O:0:50:0:40 B:HIT:HURT:1d4 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_60 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON F:EVIL -F:MORTAL | BASEANGBAND +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:A short little guy, in bedraggled clothes. He appears to be looking D:for a good tavern. @@ -1191,9 +1727,14 @@ W:3:1:800:7 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:It is about two feet long and has sharp pincers. N:76:Yellow mold @@ -1203,10 +1744,15 @@ W:3:1:30:9 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor. N:77:Metallic red centipede @@ -1216,9 +1762,14 @@ W:5:1:800:10 E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:2d3 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:78:Yellow worm mass @@ -1228,10 +1779,17 @@ W:3:2:200:4 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:LOSE_DEX:1d3 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | -F:ANIMAL | HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -1242,12 +1800,20 @@ W:3:2:200:4 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 -F:ATTR_CLEAR | CAN_SWIM | -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | INVISIBLE | -F:ANIMAL | -F:IM_POIS | HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_POIS +F:INVISIBLE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a disgusting mass of poisonous worms. @@ -1258,9 +1824,14 @@ W:3:1:500:6 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:LOSE_STR:1d6 -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | HAS_LITE -S:1_IN_11 | +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR +S:1_IN_11 S:DRAIN_MANA D:A disembodied eye, crackling with energy. @@ -1271,8 +1842,15 @@ W:4:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:BLIND -F:EMPTY_MIND | CAN_FLY | NONLIVING | SUSCEP_ELEC | -F:BASEANGBAND | HAS_LITE | RAND_50 | RAND_25 | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:HAS_LITE +F:NONLIVING +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:SUSCEP_ELEC D:A fast-moving bright light, apparently totally random in its movement. N:82:Cave lizard @@ -1282,8 +1860,12 @@ W:4:1:100:8 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d5 -F:ANIMAL | CAN_SWIM | DROP_CORPSE | HAS_EGG | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL D:It is an armoured lizard with a powerful bite. N:83:Novice ranger @@ -1294,13 +1876,21 @@ E:1:1:1:2:1:1 O:25:45:25:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:ARROW_2 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 +S:ARROW_2 +S:MISSILE D:An agile hunter, ready and relaxed. N:84:Blue jelly @@ -1310,10 +1900,19 @@ W:4:1:2000:14 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:COLD:1d6 -F:NEVER_MOVE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_COLD | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_LITE +F:IM_COLD +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE D:It's a large pile of pulsing blue flesh. N:85:Creeping copper coins @@ -1324,10 +1923,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d4 B:TOUCH:POISON:2d4 -F:ONLY_GOLD | DROP_1D2 | SUSCEP_ACID | -F:COLD_BLOOD | BASH_DOOR | -F:IM_ELEC | IM_POIS | CHAR_MULTI | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:SUSCEP_ACID D:It appears to be a pile of copper coins, until it starts crawling towards you D:on tiny legs. @@ -1338,8 +1945,10 @@ W:4:1:200:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d3 -F:RAND_25 | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is a very vicious rodent. @@ -1350,11 +1959,22 @@ W:4:1:900:15 E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | RAND_50 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:RAND_50 +F:WILD_TOO +F:WILD_WOOD D:Immature Orclings, running wild and screaming all the time. N:88:Swordfish @@ -1365,8 +1985,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A fish with a swordlike "beak". N:89:Blue worm mass @@ -1376,11 +2000,20 @@ W:4:1:40:5 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:COLD:1d4 -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | COLD_BLOOD | -F:ANIMAL | IM_COLD | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:HURT_LITE +F:IM_COLD +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_FIRE +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -1392,8 +2025,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d5 B:CRUSH:HURT:1d8 -F:RAND_25 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | WILD_TOO | -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long. N:91:Skeleton kobold @@ -1403,9 +2044,19 @@ W:5:1:800:12 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is a small animated kobold skeleton. N:92:Ewok @@ -1416,9 +2067,15 @@ E:1:1:1:2:1:1 O:50:0:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | FRIENDS | DROP_CORPSE | -F:WILD_TOO | WILD_WOOD | -F:MORTAL | JOKEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS +F:JOKEANGBAND +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +F:WILD_WOOD S:1_IN_8 S:ARROW_1 D:A cute little bear, full of merchandising potential. @@ -1430,13 +2087,23 @@ W:6:2:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:MALE | -F:FORCE_SLEEP | -F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BLINK | BLIND | CONF | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:BLINK +S:CONF +S:MISSILE D:He is leaving behind a trail of dropped spell components. N:94:Green naga @@ -1447,10 +2114,19 @@ E:0:0:0:0:1:0 O:0:25:0:65 B:CRUSH:HURT:1d8 B:SPIT:ACID:2d6 -F:FEMALE | -F:RAND_25 | TAKE_ITEM | DROP_60 | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:EVIL | IM_ACID | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:IM_ACID +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_SHORE +F:WILD_TOO D:A large green serpent with a female torso. Her green skin glistens with D:acid. @@ -1462,7 +2138,11 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:3d1 B:BITE:HURT:3d1 -F:ANIMAL | AQUATIC | WEIRD_MIND | RAND_25 | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:RAND_25 +F:WEIRD_MIND D:Yech! The disgusting thing only wants your blood! N:96:Barracuda @@ -1473,8 +2153,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A predatory fish with razor-sharp teeth. N:97:Novice paladin @@ -1485,13 +2169,21 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:CAUSE_1 +S:SCARE D:An adventurer both devoutly religious and skilful in combat. D:He seems to consider you an agent of the devil. @@ -1504,8 +2196,13 @@ O:50:0:25:20 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:DROOL:* -F:EVIL | OPEN_DOOR | BASH_DOOR | DROP_90 | DROP_SKELETON | -F:MORTAL | ZANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_SKELETON +F:EVIL +F:MORTAL +F:OPEN_DOOR +F:ZANGBAND D:Drooling, insectoid aliens with disgusting habits. N:99:Blue ooze @@ -1515,10 +2212,19 @@ W:5:1:300:7 E:0:0:0:0:0:0 O:45:20:20:0 B:CRAWL:COLD:1d4 -F:RAND_50 | RAND_25 | DROP_60 | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_COLD | SUSCEP_FIRE -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:DROP_60 +F:EMPTY_MIND +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_FIRE D:It's blue and it's oozing. N:100:Green glutton ghost @@ -1528,10 +2234,20 @@ W:5:1:0:15 E:0:0:0:0:0:0 O:30:30:30:5 B:TOUCH:EAT_FOOD:1d1 -F:RAND_50 | RAND_25 | -F:DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:RAND_50 +F:UNDEAD D:It is a very ugly green ghost with a voracious appetite. N:101:Green jelly @@ -1541,10 +2257,17 @@ W:5:1:2500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:1d2 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_ACID | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_ACID +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pile of pulsing green flesh. N:102:Large kobold @@ -1554,10 +2277,16 @@ W:5:1:1000:25 E:1:1:1:2:1:1 O:0:90:0:5 B:HIT:HURT:1d10 -F:DROP_90 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:OPEN_DOOR D:It a man-sized figure with the all too recognisable face of a kobold. N:103:Grey icky thing @@ -1567,8 +2296,11 @@ W:5:1:500:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d5 -F:RAND_50 | CAN_SWIM | DROP_CORPSE | -F:EMPTY_MIND | BASEANGBAND +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:RAND_50 D:It is a smallish, slimy, icky, nasty creature. N:104:Disenchanter eye @@ -1578,10 +2310,16 @@ W:5:2:500:20 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:UN_BONUS -F:ATTR_MULTI | ATTR_ANY | RES_DISE | DROP_CORPSE | -F:NEVER_MOVE | CAN_FLY | -F:HURT_LITE | NO_FEAR | BASEANGBAND -S:1_IN_9 | +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR +F:RES_DISE +S:1_IN_9 S:DRAIN_MANA D:A disembodied eye, crackling with magic. @@ -1592,11 +2330,20 @@ W:5:1:40:6 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:FIRE:1d6 -F:RAND_50 | RAND_25 | SUSCEP_COLD | -F:STUPID | EMPTY_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_FIRE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_COLD S:MULTIPLY D:It is a large slimy mass of worms. @@ -1607,8 +2354,17 @@ W:5:1:200:15 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d4 -F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE | BASH_DOOR | -F:ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It has a copper head and sharp venomous fangs. N:107:Death sword @@ -1621,10 +2377,26 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:NEVER_MOVE | NONLIVING | NO_FEAR | SUSCEP_ACID | -F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP | -F:DROP_90 | EVIL | IM_COLD | IM_FIRE | FORCE_MAXHP | IM_ELEC | IM_POIS | -F:BASEANGBAND | HAS_LITE | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_ACID D:A bloodthirsty blade lurking for prey. Beware! N:108:Purple mushroom patch @@ -1636,9 +2408,15 @@ O:0:0:0:0 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yuk! It doesn't look so tasty. N:109:Novice priest @@ -1648,13 +2426,23 @@ W:6:2:1500:6 E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:1d5 -F:MALE | GOOD | -F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:HEAL | SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:CAUSE_1 +S:HEAL +S:SCARE D:He is tripping over his priestly robes. N:110:Novice warrior @@ -1665,10 +2453,17 @@ E:1:1:1:2:1:1 O:0:95:0:0 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:He looks inexperienced but tough. N:111:Nibelung @@ -1679,11 +2474,20 @@ E:1:1:1:2:1:1 O:90:0:0:5 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:MALE | -F:FRIENDS | DROP_60 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | RES_DISE | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RES_DISE +F:TAKE_ITEM +F:ZANGBAND D:Night dwarfs collecting riches. N:112:The disembodied hand that strangled people @@ -1693,9 +2497,20 @@ W:6:2:300:20 E:0:0:0:1:0:0 O:0:0:0:0 B:CRUSH:HURT:1d8 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_POIS | CAN_FLY | UNIQUE | -F:NO_CONF | NO_SLEEP | NO_FEAR | ZANGBAND | NO_CUT +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +F:ZANGBAND D:Even today, nobody knows where it lurks... N:113:Brown mold @@ -1705,10 +2520,16 @@ W:6:1:50:20 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A strange brown growth on the dungeon floor. N:114:Giant brown bat @@ -1718,9 +2539,16 @@ W:6:1:600:10 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:ANIMAL | DROP_CORPSE | AI_ANNOY -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It screeches as it attacks. N:115:Rat-thing @@ -1732,10 +2560,14 @@ O:0:0:0:0 B:BITE:HURT:3d2 B:BITE:HURT:3d1 B:BITE:HURT:3d2 -F:EVIL | ANIMAL | DROP_CORPSE | -F:MORTAL | ZANGBAND +F:ANIMAL +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:ZANGBAND S:1_IN_9 -S:SCARE | CONF +S:CONF +S:SCARE D:A ratlike creature with a humanlike face. N:116:Novice rogue @@ -1746,10 +2578,18 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:MALE | FRIENDS | -F:DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO D:A rather shifty individual. N:117:Creeping silver coins @@ -1760,9 +2600,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d6 B:TOUCH:POISON:2d6 -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:COLD_BLOOD | BASH_DOOR | SUSCEP_ACID | CHAR_MULTI | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:SUSCEP_ACID D:It appears to be a pile of silver coins, until it starts crawling towards you D:on tiny legs. @@ -1773,11 +2623,20 @@ W:6:1:1600:15 E:1:1:1:2:1:1 O:20:50:5:15 B:HIT:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO D:He is one of the many weaker 'slave' orcs, often mistakenly known as a D:goblin. @@ -1788,8 +2647,17 @@ W:6:1:200:20 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d5 -F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | HAS_EGG | ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It is recognised by the hard-scaled end of its body that is often rattled D:to frighten its prey. @@ -1801,9 +2669,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:ACID:2d4 B:BITE:ACID:2d6 -F:ANIMAL | EMPTY_MIND | KILL_ITEM | KILL_BODY | CAN_SWIM | WILD_TOO | -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:KILL_BODY +F:KILL_ITEM +F:MORTAL +F:WILD_TOO S:1_IN_10 S:BR_ACID D:It is slowly making its way towards you, eating everything in @@ -1816,9 +2690,15 @@ W:7:1:200:16 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:2d4 -F:RAND_50 | WILD_ONLY | WILD_SHORE | WILD_SWAMP | -F:BASH_DOOR | DROP_CORPSE -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_ONLY +F:WILD_SHORE +F:WILD_SWAMP D:It looks poisonous. N:122:Dark elf @@ -1829,13 +2709,21 @@ E:1:1:1:2:1:1 O:20:20:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:DROP_90 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:CONF | DARKNESS | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:OPEN_DOOR +S:1_IN_10 +S:CONF +S:DARKNESS +S:MISSILE D:An elven figure with jet black skin and white hair, his eyes are large and D:twisted with evil. @@ -1847,9 +2735,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d2 B:HIT:HURT:1d2 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is an animated kobold corpse. Flesh falls off in large chunks as it D:shambles forward. @@ -1862,12 +2760,23 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:POISON +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR F:RAND_25 -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | FRIENDS | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | -F:NO_CONF | NO_SLEEP | HURT_LITE | BASEANGBAND | NO_CUT +F:UNDEAD S:1_IN_10 -S:CAUSE_1 | S_UNDEAD +S:CAUSE_1 +S:S_UNDEAD D:A frightening skeletal figure in a black robe. N:125:Rotting corpse @@ -1878,9 +2787,20 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:POISON:1d3 B:CLAW:POISON:1d3 -F:OPEN_DOOR | BASH_DOOR | FRIENDS | -F:NO_CONF | NO_SLEEP | UNDEAD | EVIL | NO_FEAR | IM_POIS | -F:IM_COLD | COLD_BLOOD | EMPTY_MIND | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:Corpses awakened from their sleep by dark sorcery. N:126:Cave orc @@ -1890,11 +2810,19 @@ W:7:1:1900:20 E:1:1:1:2:1:1 O:20:70:0:0 B:HIT:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC D:He is often found in huge numbers in deep caves. N:127:Wood spider @@ -1905,10 +2833,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:STING:POISON:1d4 -F:FRIENDS | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:ANIMAL | SPIDER | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD D:It scuttles towards you. N:128:Manes @@ -1918,9 +2853,14 @@ W:7:2:300:16 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR D:It is a minor but aggressive demon. N:129:Bloodshot eye @@ -1930,9 +2870,14 @@ W:7:3:550:30 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:BLIND:2d6 -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_7 | +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 S:DRAIN_MANA D:A disembodied eye, bloodshot and nasty. @@ -1944,10 +2889,18 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:1d10 B:BITE:LOSE_STR:1d4 -F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:RAND_25 | DROP_60 | -F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_SHORE +F:WILD_TOO D:A large red snake with a woman's torso. N:131:Red jelly @@ -1957,10 +2910,16 @@ W:7:1:2500:26 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:1d5 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pulsating mound of red flesh. N:132:Green icky thing @@ -1970,9 +2929,12 @@ W:7:2:500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:2d5 -F:RAND_50 | CAN_SWIM | DROP_CORPSE | -F:EMPTY_MIND | -F:IM_ACID | BASEANGBAND +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_ACID +F:RAND_50 D:It is a smallish, slimy, icky, acidic creature. N:133:Lost soul @@ -1983,13 +2945,25 @@ E:0:0:0:0:0:0 O:60:0:25:0 B:HIT:HURT:2d2 B:TOUCH:LOSE_WIS -F:RAND_50 | DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | -F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:TPORT | DRAIN_MANA -D:It is almost insubstantial. +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:IM_COLD +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:DRAIN_MANA +S:TPORT +D:It is almost insubstantial. N:134:Night lizard G:R:b @@ -1999,8 +2973,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:ANIMAL | CAN_SWIM | WILD_TOO | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_TOO D:It is a black lizard with overlapping scales and a powerful jaw. N:135:Mughash, the Kobold Lord @@ -2012,13 +2991,24 @@ O:0:100:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:UNIQUE | MALE | CAN_SPEAK -F:FORCE_MAXHP | -F:ESCORT | ESCORTS | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE D:Strong and powerful, for a kobold. N:136:Skeleton orc @@ -2028,10 +3018,20 @@ W:8:1:1700:26 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d5 -F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is an animated orc skeleton. N:137:Wormtongue, Agent of Saruman @@ -2044,14 +3044,30 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | RES_TELE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | SLOW | TRAPS | BO_COLD | BA_POIS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_5 +S:BA_POIS +S:BO_COLD +S:HEAL +S:SLOW +S:TRAPS D:He's been spying for Saruman. He is a snivelling wretch with no morals. N:138:Robin Hood, the Outlaw @@ -2064,12 +3080,30 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:UNIQUE | MALE | FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | EVIL | DROP_SKELETON | DROP_CORPSE -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD +F:ZANGBAND S:1_IN_5 -S:ARROW_2 | HEAL | TRAPS +S:ARROW_2 +S:HEAL +S:TRAPS D:The legendary archer steals from the rich (you qualify). N:139:Nurgling @@ -2079,9 +3113,16 @@ W:8:2:800:19 E:1:1:1:2:1:1 O:0:0:0:0 B:BITE:DISEASE:1d8 -F:FRIENDS | FRIEND | -F:OPEN_DOOR | BASH_DOOR | IM_POIS | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | ZANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIEND +F:FRIENDS +F:IM_FIRE +F:IM_POIS +F:NO_FEAR +F:OPEN_DOOR +F:ZANGBAND D:It is a minor demon servitor of Nurgle. It looks like a hairless D:teddy bear, with twisted eyes and rotting, ghoulish skin. @@ -2095,10 +3136,24 @@ B:HIT:HURT:1d11 B:HIT:HURT:1d11 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | SPECIAL_GENE | -F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:A captain of a regiment of weaker orcs, Lagduf keeps his troop in order D:with displays of excessive violence. @@ -2109,10 +3164,14 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR D:It is a strange small humanoid. N:142:Novice ranger @@ -2123,12 +3182,20 @@ E:1:1:1:2:1:1 O:0:80:0:15 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:ARROW_2 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_9 +S:ARROW_2 +S:MISSILE D:An agile hunter, ready and relaxed. N:143:Giant salamander @@ -2138,11 +3205,16 @@ W:8:1:600:50 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 -F:FORCE_SLEEP | SUSCEP_COLD | -F:RAND_25 | -F:ANIMAL | IM_FIRE | CAN_SWIM | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_9 +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_9 S:BR_FIRE D:A large black and yellow lizard. You'd better run away! @@ -2153,7 +3225,14 @@ W:8:2:0:28 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:TERRIFY:1d4 -F:PASS_WALL | NO_CONF | NO_SLEEP | NONLIVING | IM_ACID | CAN_FLY | JOKEANGBAND | NO_CUT +F:CAN_FLY +F:IM_ACID +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL D:A black hole in the fabric of reality. N:145:Carnivorous flying monkey @@ -2165,8 +3244,15 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:5d1 -F:ANIMAL | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | -F:DROP_CORPSE | MORTAL | ZANGBAND | HAS_LITE +F:ANIMAL +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +F:ZANGBAND D:It looks fantastic, yet frightening. N:146:Green mold @@ -2176,10 +3262,17 @@ W:8:1:40:28 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor. N:147:Novice paladin @@ -2190,13 +3283,22 @@ E:1:1:1:2:1:1 O:30:55:10:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:CAUSE_1 +S:SCARE D:He thinks you are an agent of the devil. N:148:Lemure @@ -2206,9 +3308,14 @@ W:8:3:1000:16 E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d8 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR D:It is the larval form of a major demon. N:149:Hill orc @@ -2218,11 +3325,19 @@ W:8:1:2000:25 E:1:1:1:2:1:1 O:10:70:10:0 B:HIT:HURT:1d10 -F:MALE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC D:He is a hardy well-weathered survivor. N:150:Bandit @@ -2233,10 +3348,19 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_1D2 | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO +F:WILD_WOOD D:He is after your possessions! N:151:Hunting hawk @@ -2248,8 +3372,15 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 -F:ANIMAL | NO_FEAR | CAN_FLY | WILD_WOOD | WILD_TOO | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:NO_FEAR +F:WILD_TOO +F:WILD_WOOD D:Trained to hunt and kill without fear. N:152:Phantom warrior @@ -2260,8 +3391,16 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:PASS_WALL | NO_SLEEP | FRIENDS | COLD_BLOOD | NONLIVING | -F:NO_FEAR | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FRIENDS +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL D:Spectral creatures that are half real, half illusion. N:153:Gremlin @@ -2273,9 +3412,15 @@ O:0:0:0:0 B:CLAW:EAT_FOOD:1d2 B:CLAW:EAT_FOOD:1d2 B:BITE:EAT_FOOD:1d3 -F:IM_POIS | HURT_LITE | EVIL | DEMON | OPEN_DOOR | -F:TAKE_ITEM | CAN_SWIM | -F:MORTAL | ZANGBAND +F:CAN_SWIM +F:DEMON +F:EVIL +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:ZANGBAND S:MULTIPLY D:Don't feed them after midnight! @@ -2288,9 +3433,16 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | IM_COLD | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:IM_COLD +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO D:A large white figure covered in shaggy fur. N:155:Bloodshot icky thing @@ -2301,10 +3453,13 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d4 B:CRAWL:ACID:2d4 -F:RAND_50 | -F:EMPTY_MIND | CAN_SWIM | DROP_CORPSE | -F:IM_POIS | BASEANGBAND -S:1_IN_11 | +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:RAND_50 +S:1_IN_11 S:DRAIN_MANA D:It is a strange, slimy, icky creature. @@ -2315,9 +3470,11 @@ W:9:1:250:2 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d4 -F:RAND_25 | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:IM_POIS +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is a rodent of unusual size. @@ -2330,8 +3487,16 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:HURT:1d3 -F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:RAND_25 | ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO D:A woman's face on the body of a vicious black bird. N:158:Skaven @@ -2342,9 +3507,19 @@ E:1:1:1:2:1:1 O:35:35:20:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:EVIL | FRIENDS | DROP_60 | DROP_90 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | MALE | WILD_TOO | WILD_WASTE | WILD_SWAMP | -F:MORTAL | ZANGBAND +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE +F:ZANGBAND D:A mutated rat-creature from the great waste, it is vaguely D:humanoid in appearance and walks on its hind legs. This race D:serves chaos fervently and is greatly feared by others. @@ -2358,9 +3533,18 @@ O:0:0:0:0 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:1d11 -F:BASH_DOOR | FORCE_MAXHP | FORCE_SLEEP | UNIQUE | DROP_CORPSE | -F:ANIMAL | WILD_ONLY | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:UNIQUE +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_WOOD D:A wounded bear, who has occasionally attacked humans. N:160:Cave bear @@ -2372,9 +3556,16 @@ O:0:0:0:0 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 -F:BASH_DOOR | FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ANIMAL | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large bear appears to have made its home in this cave. It is hungry, D:and you are trespassing in its territory. @@ -2386,8 +3577,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:WEIRD_MIND | BASH_DOOR | KILL_WALL | KILL_ITEM | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:KILL_ITEM +F:KILL_WALL +F:MORTAL +F:WEIRD_MIND D:Despite its unimpressive size, this mole creature has fangs powerful D:enough to bore through solid rock. @@ -2399,12 +3596,26 @@ E:1:1:1:2:1:1 O:30:40:30:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:MALE | -F:FORCE_SLEEP | DROP_90 | WILD_TOO | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:CONF | BLIND | HOLD | SLOW | MIND_BLAST | S_MONSTER | BLINK +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:HOLD +S:MIND_BLAST +S:SLOW +S:S_MONSTER D:A master of the mental arts, able to damage or dominate the D:minds of others. @@ -2417,11 +3628,24 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | HAS_EGG | IMPRESED | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_ELEC +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_ELEC D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a pale blue. @@ -2435,12 +3659,25 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | ATTR_MULTI -F:EVIL | DRAGON | IM_COLD | SUSCEP_FIRE | HAS_EGG | IMPRESED | BASEANGBAND F:ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_COLD +F:ONLY_GOLD +F:OPEN_DOOR +F:SUSCEP_FIRE +S:1_IN_12 S:BR_COLD D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a pale white. @@ -2454,11 +3691,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:EVIL | DRAGON | IM_POIS | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_POIS +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_POIS D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a sickly green. @@ -2472,11 +3721,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_ACID +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_ACID D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a dull black. @@ -2490,12 +3751,25 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_11 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_FIRE +F:ONLY_GOLD +F:OPEN_DOOR +F:SUSCEP_COLD +S:1_IN_11 S:BR_FIRE D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a pale red. @@ -2508,8 +3782,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:STING:LOSE_STR:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is large and has venomous mandibles. N:169:Brodda, the Easterling @@ -2522,11 +3802,22 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 -F:UNIQUE | MALE | EVIL -F:FORCE_MAXHP | CAN_SPEAK | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_TOO D:A nasty piece of work, Brodda picks on defenceless women and children. N:170:Bloodfang, the Wolf @@ -2537,9 +3828,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d12 B:BITE:HURT:1d12 -F:BASH_DOOR | WILD_ONLY | WILD_GRASS | WILD_WOOD | DROP_CORPSE | -F:ANIMAL | UNIQUE | FORCE_MAXHP | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:UNIQUE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:It has been terrorising the nearby villages. N:171:King cobra @@ -2550,8 +3848,19 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:SPIT:BLIND:1d2 B:BITE:POISON:3d4 -F:RAND_50 | WILD_TOO | WILD_SWAMP | WILD_WOOD | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:It is a large snake with a hooded face. N:172:Eagle @@ -2563,8 +3872,16 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d6 -F:ANIMAL | CAN_FLY | WILD_ONLY | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD | -F:DROP_CORPSE | MORTAL | BASEANGBAND | HAS_EGG +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_WASTE +F:WILD_WOOD D:A magnificent huge predatory bird. N:173:War bear @@ -2576,9 +3893,14 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:WEIRD_MIND D:Bears with tusks, trained to kill. N:174:Killer bee @@ -2589,8 +3911,13 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:STING:POISON:1d4 B:STING:LOSE_STR:1d4 -F:WEIRD_MIND | FRIENDS | CAN_FLY | WILD_TOO | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:FRIENDS +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is poisonous and aggressive. N:175:Giant spider @@ -2603,9 +3930,15 @@ B:BITE:HURT:1d10 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:HURT:1d10 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | -F:ANIMAL | SPIDER | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO D:It is a vast spider whose bulbous body is bloated with poison. N:176:Giant white tick @@ -2615,9 +3948,13 @@ W:10:2:200:27 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:It is moving slowly towards you. N:177:The Borshin @@ -2629,9 +3966,16 @@ O:0:0:0:0 B:HIT:HURT:2d12 B:CRUSH:HURT:2d15 B:TOUCH:TERRIFY -F:BASH_DOOR | UNIQUE | FORCE_MAXHP | NO_CONF -F:IM_POIS | IM_COLD | NO_FEAR -F:MORTAL | CTHANGBAND | NO_CUT +F:BASH_DOOR +F:CTHANGBAND +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:UNIQUE D:Pallid and twisted, this creature hates the very sight of you. D:"It looked like something that had started out to be a man but had never D:quite made it. It had been stepped on, twisted, had holes poked into the @@ -2650,13 +3994,25 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | CONF | MISSILE | DARKNESS | BA_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BA_POIS +S:BLIND +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven figure, dressed all in black, hurling spells at you. N:179:Kamikaze yeek @@ -2666,9 +4022,12 @@ W:10:1:800:10 E:1:1:1:2:1:1 O:0:0:0:0 B:EXPLODE:HURT:15d2 -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | -F:MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:IM_ACID +F:MORTAL +F:OPEN_DOOR +F:ZANGBAND D:The evil wizard Bruce has trained them to be living weapons. N:180:Orfax, Son of Boldor @@ -2681,16 +4040,32 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d9 B:INSULT:* B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:HEAL | BLINK | TELE_TO | SLOW | CONF | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_4 +S:BLINK +S:CONF +S:HEAL +S:SLOW S:S_MONSTER +S:TELE_TO D:He's just like his daddy! He knows mighty spells, but fortunately he is a D:yeek. @@ -2702,11 +4077,23 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRUSH:HURT:1d8 B:CLAW:DISEASE:1d3 -F:OPEN_DOOR | BASH_DOOR | FRIENDS | HURT_LITE | -F:NO_CONF | NO_SLEEP | UNDEAD | EVIL | NO_FEAR | IM_POIS | -F:IM_COLD | COLD_BLOOD | CTHANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:CTHANGBAND +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD S:1_IN_12 -S:CAUSE_1 | SCARE +S:CAUSE_1 +S:SCARE D:"...the hand of a corpse -- bloodless and skeletal, and with D:impossibly long, cracked nails." @@ -2718,10 +4105,16 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:HURT_LITE +F:MALE +F:OPEN_DOOR S:1_IN_12 S:MISSILE D:A dark elven figure in armour, ready with his sword. @@ -2734,10 +4127,19 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 -F:FRIENDS | WILD_TOO | WILD_WASTE | DROP_SKELETON | -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | EVIL | DROP_60 | DROP_90 | +F:BASH_DOOR +F:CTHANGBAND +F:DROP_60 +F:DROP_90 +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE F:MALE -F:MORTAL | CTHANGBAND +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +F:WILD_WASTE D:"Rough-skinned, large-eyed, large-eared, with a horrible, D:distorted resemblance to the koala bear facially, though D:his body had an appearance of emaciation." @@ -2749,10 +4151,18 @@ W:10:2:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d1 -F:ATTR_CLEAR | -F:NEVER_MOVE | INVISIBLE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:INVISIBLE +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID S:MULTIPLY D:Yum! It smells quite tasty. If you could only see it... @@ -2763,11 +4173,18 @@ W:10:2:60:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d1 -F:NEVER_MOVE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_5 | ARROW_1 +F:COLD_BLOOD +F:EMPTY_MIND +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_5 +S:ARROW_1 +S:MULTIPLY D:What looks like the remains of a quiver dropped by a past adventurer D:has become overgrown with a strange mold intent on using the contents D:of the quiver to grab prey. @@ -2782,13 +4199,26 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d13 B:HIT:HURT:1d11 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | WILD_TOO | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE +F:WILD_TOO D:He is a cunning and devious orc with a chaotic nature. N:187:Giant tan bat @@ -2800,9 +4230,17 @@ O:0:0:0:0 B:BITE:TERRIFY:1d3 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat, the beating of whose wings produces a strangely unnerving noise. N:188:Owlbear @@ -2814,8 +4252,13 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:CRUSH:HURT:1d10 -F:EVIL | ANIMAL | OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:OPEN_DOOR D:A bizarre bear-creature with the claws and the face of an owl. N:189:Blue horror @@ -2826,9 +4269,15 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:TERRIFY:1d8 B:CLAW:TERRIFY:1d8 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | NO_CONF | ZANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_CONF +F:NO_FEAR +F:OPEN_DOOR +F:ZANGBAND D:An ugly screaming little demon servant of Tzeentch. N:190:Hairy mold @@ -2838,10 +4287,16 @@ W:10:1:50:32 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange hairy growth on the dungeon floor. N:191:Grizzly bear @@ -2854,9 +4309,14 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d12 B:CRUSH:HURT:1d10 -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | BASH_DOOR | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A huge, beastly bear, more savage than most of its kind. N:192:Disenchanter mold @@ -2866,11 +4326,19 @@ W:10:1:40:40 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:UN_BONUS:1d6 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | RES_DISE | -F:IM_POIS | ATTR_MULTI | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_11 | +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_DISE +F:STUPID +S:1_IN_11 S:DRAIN_MANA D:It is a strange glowing growth on the dungeon floor. @@ -2883,12 +4351,24 @@ O:50:50:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:DROP_60 | BASH_DOOR | HAS_EGG | -F:EVIL | DRAGON | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_11 | -S:CONF | SCARE | BR_LITE | BR_DARK -D:A small relative of the dragon that inhabits dark caves. +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +S:1_IN_11 +S:BR_DARK +S:BR_LITE +S:CONF +S:SCARE +D:A small relative of the dragon that inhabits dark caves. N:194:Tengu G:u:b @@ -2897,10 +4377,20 @@ W:10:1:600:40 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | RES_TELE | CAN_FLY | BASEANGBAND -S:1_IN_3 | -S:BLINK | TELE_TO | TELE_AWAY | TPORT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:EVIL +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR +F:RES_TELE +S:1_IN_3 +S:BLINK +S:TELE_AWAY +S:TELE_TO +S:TPORT D:It is a fast-moving demon that blinks quickly in and out of existence; no D:other demon matches its teleporting mastery. @@ -2912,9 +4402,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:ONLY_GOLD | DROP_90 | DROP_1D2 | -F:COLD_BLOOD | BASH_DOOR | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_90 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of gold coins, until it starts crawling towards you D:on tiny legs. @@ -2925,10 +4423,17 @@ W:10:1:600:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:RAND_25 | FRIENDS | -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_WASTE | WILD_MOUNTAIN | -F:ANIMAL | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FRIENDS +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD D:It howls and snaps at you. N:197:Giant fruit fly @@ -2938,8 +4443,13 @@ W:10:3:100:4 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:A fast-breeding, annoying pest. @@ -2951,8 +4461,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A large black cat, stalking you with intent. It thinks you're its next D:meal. @@ -2964,11 +4481,16 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_ITEM -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | DROP_SKELETON | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:He is eyeing your backpack. N:200:Hobbes the Tiger @@ -2980,9 +4502,15 @@ O:0:0:0:0 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 B:BITE:HURT:1d5 -F:BASH_DOOR | UNIQUE | FORCE_MAXHP | -F:ANIMAL | MALE | CAN_SPEAK | DROP_CORPSE | -F:MORTAL | JOKEANGBAND +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:MORTAL +F:UNIQUE D:Fast-moving, with a taste for tuna sandwiches. N:201:Shadow Creature of Fiona @@ -2993,8 +4521,16 @@ E:1:1:1:2:1:1 O:20:30:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASH_DOOR | OPEN_DOOR | FRIENDS | DROP_60 | IM_POIS | NO_SLEEP | NO_CONF -F:MALE | DROP_SKELETON | ZANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND D:"There was something unusual about their appearance... For one thing, D:all had uniformly bloodshot eyes. Very, very bloodshot eyes. With them, D:though, the condition seemed normal. For another, all had an extra joint @@ -3013,8 +4549,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:1d6 B:TOUCH:LOSE_CON:1d6 -F:UNDEAD | EMPTY_MIND | NO_CONF | NO_SLEEP | IM_POIS | IM_COLD | NO_FEAR | -F:HURT_LITE | COLD_BLOOD | EVIL | NEVER_MOVE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:MULTIPLY D:A sickening mound of decaying flesh, bones, hands and so on. It seems to D:be growing. @@ -3028,10 +4575,17 @@ O:20:50:20:6 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:HIT:CONFUSE:1d3 -F:DROP_60 | EVIL | SHAPECHANGER | ATTR_MULTI | ATTR_ANY -F:MORTAL | ZANGBAND +F:ATTR_ANY +F:ATTR_MULTI +F:DROP_60 +F:EVIL +F:MORTAL +F:SHAPECHANGER +F:ZANGBAND S:1_IN_5 -S:BO_FIRE | BO_COLD | CONF +S:BO_COLD +S:BO_FIRE +S:CONF D:A vaguely humanoid form constantly changing its appearance. N:204:Baby multi-hued dragon @@ -3043,15 +4597,33 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:ATTR_MULTI | -F:FORCE_MAXHP | FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | CAN_FLY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HAS_EGG | IMPRESED | -F:BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales shimmering with a hint of colour. @@ -3063,8 +4635,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:6d1 B:BITE:HURT:7d1 -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:ZANGBAND S:1_IN_8 S:BLINK D:It looks very cute, except for the razor sharp teeth. It moans @@ -3079,12 +4656,27 @@ O:0:50:50:0 B:TOUCH:PARALYZE:1d14 B:TOUCH:PARALYZE:1d14 B:CRUSH:HURT:2d12 -F:ANIMAL | NEVER_MOVE | COLD_BLOOD | DROP_RANDART -F:EMPTY_MIND | UNIQUE | FORCE_MAXHP | FORCE_SLEEP | -F:RES_WATE | IM_POIS | IM_ACID | SUSCEP_FIRE | SPECIAL_GENE | -F:DROP_1D2 | DROP_GOOD | ONLY_ITEM | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:TELE_TO | HOLD | +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_GOOD +F:DROP_RANDART +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CUT +F:ONLY_ITEM +F:RES_WATE +F:SPECIAL_GENE +F:SUSCEP_FIRE +F:UNIQUE +S:1_IN_10 +S:HOLD +S:TELE_TO D:The ancient grey willow tree, ruler of the Old Forest. He despises D:trespassers in his territory. "...a huge willow-tree, old and hoary. D:Enormous it looked, its sprawling branches going up like racing arms @@ -3099,8 +4691,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d5 B:BITE:HURT:2d5 -F:AQUATIC | WILD_TOO | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:WILD_TOO D:A truly strange hybrid of a horse and a fish. N:208:Zombified orc @@ -3112,10 +4708,20 @@ O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is a shambling orcish corpse leaving behind a trail of flesh. N:209:Hippogryph @@ -3126,8 +4732,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:HIT:HURT:2d5 B:BITE:HURT:2d5 -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_GRASS | -F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO D:A strange hybrid of eagle and horse. It looks weird. N:210:Black mamba @@ -3137,10 +4750,20 @@ W:12:3:300:40 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:4d4 -F:RAND_50 | BASH_DOOR | CAN_SWIM | -F:WILD_TOO | WILD_WOOD | WILD_GRASS | WILD_SWAMP | -F:ANIMAL | IM_POIS | DROP_SKELETON | DROP_CORPSE | HAS_EGG | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_GRASS +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:It has glistening black skin, a sleek body, and highly venomous fangs. N:211:White wolf @@ -3151,11 +4774,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d4 -F:RAND_25 | -F:FRIENDS | SUSCEP_FIRE | -F:BASH_DOOR | WILD_TOO | WILD_WASTE | -F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:IM_COLD +F:MORTAL +F:RAND_25 +F:SUSCEP_FIRE +F:WILD_TOO +F:WILD_WASTE D:A large and muscled wolf from the northern wastes. Its breath is cold and D:icy and its fur coated in frost. @@ -3166,11 +4796,18 @@ W:12:3:2600:60 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_11 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_11 S:DRAIN_MANA D:Yum! It looks quite tasty. It is a pulsing mound of glowing flesh. @@ -3181,9 +4818,17 @@ W:12:4:200:6 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | BASH_DOOR | -F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:HURT_LITE +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a disgusting mass of dark worms, eating each other, the floor, D:the air, you... @@ -3195,10 +4840,22 @@ W:12:4:200:7 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:EXP_10 -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | BASH_DOOR | EVIL | CAN_SWIM | -F:ANIMAL | HURT_LITE | NO_FEAR | KILL_WALL | COLD_BLOOD | INVISIBLE | -F:MORTAL | ZANGBAND | NO_CUT +F:ANIMAL +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:INVISIBLE +F:KILL_WALL +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND +F:ZANGBAND S:MULTIPLY D:Even more disgusting dark worms, their essence that of unbeing. @@ -3212,13 +4869,29 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:UNIQUE | MALE | -F:FORCE_MAXHP | WILD_TOO | SPECIAL_GENE | -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | -F:EVIL | ORC | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE +F:WILD_TOO D:A leader of a band of raiding orcs, he picks on hobbits. N:216:Swordsman @@ -3229,10 +4902,16 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:MALE | WILD_TOO | -F:DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:A warrior of considerable skill. N:217:Skaven shaman @@ -3243,12 +4922,25 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | WILD_TOO | WILD_SWAMP | WILD_WASTE | -F:FORCE_SLEEP | DROP_90 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | ZANGBAND -S:1_IN_8 | -S:BLINK | CAUSE_1 | MISSILE | CONF | SCARE +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE +F:ZANGBAND +S:1_IN_8 +S:BLINK +S:CAUSE_1 +S:CONF +S:MISSILE +S:SCARE D:The shaman of a skaven tribe gets his powers from a mystic D:stone corrupted by chaos, called a Warp Stone. @@ -3261,11 +4953,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:NO_CONF +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_CONF D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a dull bronze. @@ -3279,12 +4983,24 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_12 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_SOUN D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales a pale gold. @@ -3297,10 +5013,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:EXP_10 B:GAZE:EXP_10 -F:NEVER_MOVE | EVIL | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:HOLD | TELE_TO +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:HURT_LITE +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 +S:HOLD +S:TELE_TO D:A huge disembodied eye. As you stare into the black nothingness of its pupil, D:you feel your will and vitality draining away, and are unable to do anything D:except approach it in horrified fascination. @@ -3312,8 +5035,12 @@ W:12:4:500:40 E:0:1:0:2:1:0 O:0:0:0:0 B:EXPLODE:HURT:6d6 -F:RAND_50 | FRIENDS | BASH_DOOR | ANIMAL | -F:MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:FRIENDS +F:MORTAL +F:RAND_50 +F:ZANGBAND D:An explosive charge has been attached to this poor animal, who D:has been trained to search for its target and detonate. @@ -3326,8 +5053,16 @@ O:0:0:0:0 B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:1d8 -F:ANIMAL | WEIRD_MIND | FRIENDS | RAND_25 | IM_FIRE | EVIL | SUSCEP_COLD | -F:MORTAL | ZANGBAND | HAS_LITE +F:ANIMAL +F:EVIL +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +F:WEIRD_MIND +F:ZANGBAND D:It is as large as a tiger, and its yellow eyes are pupilless. N:223:Moon beast @@ -3339,11 +5074,22 @@ O:50:0:40:5 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BUTT:HURT:1d6 -F:DROP_1D2 | ONLY_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | ANIMAL | DROP_CORPSE -F:MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:IM_FIRE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ZANGBAND S:1_IN_6 -S:HEAL | BLIND | DARKNESS | CONF | CAUSE_2 +S:BLIND +S:CAUSE_2 +S:CONF +S:DARKNESS +S:HEAL D:"Great greyish-white slippery things which could expand and D:contract at will, and whose principle shape... was that of a D:sort of toad without any eyes, but with a curious vibrating mass @@ -3356,14 +5102,23 @@ W:12:2:600:28 E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d8 -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:BLINK | TPORT | BLIND | SLOW | BA_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:MORTAL +F:OPEN_DOOR +S:1_IN_4 +S:BA_POIS +S:BLIND +S:BLINK +S:SLOW S:S_MONSTER +S:TPORT D:A small humanoid that radiates some power. N:225:Priest @@ -3374,13 +5129,22 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MALE | GOOD | -F:FORCE_SLEEP | -F:DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | SCARE | CAUSE_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:CAUSE_2 +S:HEAL +S:SCARE S:S_MONSTER D:A robed man dedicated to his god. @@ -3392,13 +5156,26 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:1d9 B:HIT:HURT:1d10 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | BLIND | CONF | CAUSE_2 | DARKNESS | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_5 +S:BLIND +S:CAUSE_2 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE D:A dark elven figure, dressed all in black, chanting curses and waiting to D:deliver your soul to hell. @@ -3409,10 +5186,21 @@ W:12:2:0:40 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d3 -F:RAND_50 | RAND_25 | IM_ELEC | IM_POIS | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | BASH_DOOR | -F:IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ELEC +F:IM_POIS +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 D:A whirlwind of sentient air. N:228:Skeleton human @@ -3422,9 +5210,19 @@ W:12:1:1500:38 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is an animated human skeleton. N:229:Zombified human @@ -3435,9 +5233,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is a shambling human corpse dropping chunks of flesh behind it. N:230:Tiger @@ -3449,9 +5257,16 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:One of the largest of its species, a sleek orange and black shape creeps D:towards you, ready to pounce. @@ -3463,12 +5278,24 @@ E:0:0:0:0:0:0 O:45:15:25:0 B:WAIL:TERRIFY B:TOUCH:LOSE_DEX:1d8 -F:FORCE_SLEEP | RAND_25 | -F:DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:TPORT | SCARE +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:UNDEAD +S:1_IN_15 +S:SCARE +S:TPORT D:A ghostly apparition that shrieks horribly. N:232:Stegocentipede @@ -3480,8 +5307,12 @@ O:0:0:0:0 B:BITE:HURT:2d4 B:BITE:HURT:2d4 B:STING:HURT:2d4 -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | DROP_SKELETON | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND D:It is a vast armoured centipede with massive mandibles and a spiked tail. N:233:Spotted jelly @@ -3493,10 +5324,19 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:IM_ACID | IM_POIS | HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A strange jelly thing, covered in discoloured blotches. N:234:Drider @@ -3508,12 +5348,20 @@ O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:POISON:1d6 -F:FORCE_SLEEP | -F:BASH_DOOR | DROP_SKELETON | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:CONF | CAUSE_1 | DARKNESS | MISSILE | ARROW_2 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MORTAL +S:1_IN_8 +S:ARROW_2 +S:CAUSE_1 +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven torso merged with the bloated form of a giant spider. N:235:Mongbat @@ -3525,9 +5373,18 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:POISON:1d8 -F:ANIMAL | EVIL | FRIENDS | CAN_FLY | FORCE_MAXHP | -F:IM_COLD | IM_ELEC | IM_POIS | WEIRD_MIND | DROP_CORPSE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:Devil-bats, notoriously difficult to kill. N:236:Killer brown beetle @@ -3537,8 +5394,13 @@ W:13:1:500:38 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND D:It is a vicious insect with a tough carapace. N:237:Boldor, King of the Yeeks @@ -3550,16 +5412,34 @@ O:0:90:10:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d9 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_CORPSE | -F:ANIMAL | EVIL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_2 | -S:HEAL | BLINK | TPORT | BLIND | SLOW | -S:S_KIN | S_MONSTER +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:BLIND +S:BLINK +S:HEAL +S:SLOW +S:S_KIN +S:S_MONSTER +S:TPORT D:A great yeek, powerful in magic and sorcery, but a yeek all the same. N:238:Ogre @@ -3569,11 +5449,19 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:FRIENDS | -F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A hideous, smallish giant that is often found near or with orcs. N:239:Creeping mithril coins @@ -3584,9 +5472,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:ONLY_GOLD | DROP_90 | DROP_2D2 | -F:COLD_BLOOD | BASH_DOOR | IM_ACID | CHAR_MULTI | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of sentient mithril coins that doesn't like being D:picked up. @@ -3597,12 +5495,27 @@ W:13:2:1500:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d2 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | BLINK | TPORT | BLIND | HOLD | SLOW | CONF | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:HASTE +S:HOLD +S:SLOW +S:TPORT D:A deceptive spell caster. N:241:Druid @@ -3613,13 +5526,29 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:MALE | WILD_TOO | WILD_WOOD | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:SMART | OPEN_DOOR | BASH_DOOR | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | BLINK | BLIND | HOLD | SLOW | BO_FIRE | BO_ELEC | S_ANIMAL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +F:WILD_TOO +F:WILD_WOOD +S:1_IN_3 +S:BLIND +S:BLINK +S:BO_ELEC +S:BO_FIRE +S:HASTE +S:HOLD +S:SLOW +S:S_ANIMAL D:A priest devoted to Nature. N:242:Pink horror @@ -3631,11 +5560,18 @@ O:0:0:0:0 B:CLAW:TERRIFY:1d8 B:CLAW:TERRIFY:1d8 B:BITE:CONFUSE:1d6 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | NO_CONF | ZANGBAND -S:1_IN_8 | -S:CONF | SCARE +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_CONF +F:NO_FEAR +F:OPEN_DOOR +F:ZANGBAND +S:1_IN_8 +S:CONF +S:SCARE D:An ugly screaming little demon servant of Tzeentch. N:243:Cloaker @@ -3646,10 +5582,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:5d5 B:HIT:TERRIFY:5d5 -F:NEVER_MOVE | NO_FEAR | -F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP | -F:DROP_90 | IM_COLD | FORCE_MAXHP | IM_ELEC | IM_POIS | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It resembles a normal cloak until some poor fool ventures too close! N:244:Black orc @@ -3660,11 +5607,20 @@ E:1:1:1:2:1:1 O:10:50:20:15 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:MALE | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO S:1_IN_9 S:ARROW_2 D:He is a large orc with powerful arms and deep black skin. @@ -3678,10 +5634,20 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A fast moving highly acidic jelly thing, that is eating away the floor it D:rests on. @@ -3692,9 +5658,14 @@ W:14:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | MORTAL | JOKEANGBAND +F:ANIMAL +F:BASH_DOOR +F:CAN_FLY +F:JOKEANGBAND +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:Oh no! They are everywhere! @@ -3706,10 +5677,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP D:A strange creature that merges with the dungeon floor, trapping its D:victims by enveloping them within its perfectly disguised form. @@ -3721,10 +5700,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE B:HIT:PARALYZE -F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS | -F:KILL_TREES | SUSCEP_FIRE | ANIMAL | -F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS | -F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:FORCE_SLEEP +F:FRIENDS +F:KILL_TREES +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:A mass of vegetation. As you pass near it, it reaches out tendrils to D:ensnare you. You can just make out skeletons of its previous victims D:deep within the thickets. @@ -3737,8 +5731,11 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:BLIND:1d10 B:BITE:BLIND:1d10 -F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | ZANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:OPEN_DOOR +F:ZANGBAND D:This strange creature looks like a miniature tyrannosaur. It has D:empty, pale eyes and a sharp beak, which it aims at your eyes D:as it jumps at you! @@ -3750,12 +5747,19 @@ W:14:2:150:60 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:1d6 -F:FORCE_SLEEP | WILD_TOO | WILD_WASTE | -F:RAND_50 | CAN_FLY | SUSCEP_FIRE | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_COLD | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_COLD +F:MORTAL +F:RAND_50 +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WASTE +S:1_IN_10 S:BR_COLD D:It is a large fly that drips frost. @@ -3767,11 +5771,17 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:EXPLODE:HURT:20d2 -F:MALE | -F:WILD_TOO | SUSCEP_FIRE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:SUSCEP_FIRE +F:WILD_TOO +F:ZANGBAND D:He is one of the many weaker 'slave' orcs, often mistakenly known as a D:goblin. He is equipped with an explosive charge. @@ -3785,13 +5795,20 @@ B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:FORCE_SLEEP | -F:RAND_50 | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | DROP_CORPSE | -F:EVIL | IM_POIS | BASEANGBAND -S:MULTIPLY | -S:1_IN_8 | -S:BLIND | CONF | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:IM_POIS +F:OPEN_DOOR +F:RAND_50 +S:1_IN_8 +S:BLIND +S:CONF +S:MULTIPLY +S:SCARE D:It is a strange, slimy, icky creature, with rudimentary intelligence, D:but evil cunning. It hungers for food, and you look tasty. @@ -3802,11 +5819,19 @@ W:14:4:2600:20 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d4 -F:NEVER_MOVE | EVIL | CAN_SWIM | -F:IM_POIS | EMPTY_MIND | NO_FEAR | BASEANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_7 | -S:SCARE | CONF | BR_LITE +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 +S:BR_LITE +S:CONF +S:MULTIPLY +S:SCARE D:A chaotic mass of pulsating flesh, mouths and eyes. N:254:Wolfhound of Flora @@ -3817,8 +5842,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d5 B:BITE:HURT:1d5 -F:ANIMAL | NO_FEAR | FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | ZANGBAND +F:ANIMAL +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:NO_FEAR +F:ZANGBAND D:Well-trained watchdogs, obedient to death. N:255:Hill giant @@ -3829,10 +5859,19 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:DROP_60 | WILD_TOO | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO D:A ten foot tall humanoid with powerful muscles. N:256:Flesh golem @@ -3843,10 +5882,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:EMPTY_MIND | BASH_DOOR | CAN_SWIM | -F:IM_ELEC | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:A shambling humanoid monster with long scars. N:257:Warg @@ -3857,9 +5904,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:RAND_25 | BASH_DOOR | FRIENDS | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It is a large wolf with eyes full of cunning. N:258:Cheerful leprechaun @@ -3870,11 +5926,17 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_FOOD -F:DROP_60 | ONLY_GOLD | RAND_50 | OPEN_DOOR | MALE | -F:GOOD | MORTAL | ZANGBAND -S:MULTIPLY | -S:1_IN_6 | +F:DROP_60 +F:GOOD +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:ZANGBAND +S:1_IN_6 S:BLINK +S:MULTIPLY D:A merry little gnome. N:259:Giant flea @@ -3884,8 +5946,12 @@ W:14:3:90:3 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:It makes you itch just to look at it. @@ -3899,13 +5965,25 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A strong orc guarding the pass of Cirith Ungol. He is mortally afraid of D:spiders: he was captured by Shelob once, but escaped when she forgot D:completely about him. @@ -3918,10 +5996,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is a massive animated statue made out of hardened clay. N:262:Black ogre @@ -3932,11 +6019,19 @@ E:1:1:1:2:1:1 O:0:70:0:15 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:RAND_25 | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO D:A massive orc-like figure with black skin and powerful arms. N:263:Dweller on the threshold @@ -3948,11 +6043,24 @@ O:45:0:40:10 B:GAZE:PARALYZE:4d4 B:GAZE:TERRIFY:3d3 B:GAZE:CONFUSE:3d3 -F:NEVER_MOVE | DROP_60 | EVIL | DEMON | DROP_CORPSE | -F:IM_POIS | IM_COLD |IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP -F:MORTAL | ZANGBAND +F:DEMON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ZANGBAND S:1_IN_6 -S:BO_ACID | S_MONSTER | SCARE | DRAIN_MANA +S:BO_ACID +S:DRAIN_MANA +S:SCARE +S:S_MONSTER D:A gorilla-shaped arcane guardian with an appetite for mages. N:264:Half-orc @@ -3963,10 +6071,19 @@ E:1:1:1:2:1:1 O:30:30:30:5 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:MALE | WILD_TOO | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO D:He is a hideous deformed cross-breed of man and orc, combining man's D:strength and cunning with orcish evil. The traitorous wizard Saruman is D:generally believed to be responsible for this abomination. @@ -3979,12 +6096,27 @@ E:0:0:0:0:1:0 O:0:0:80:20 B:STING:HURT:1d10 B:BITE:HURT:1d10 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_1D2 | IM_POIS | IM_COLD | RES_WATE | -F:OPEN_DOOR | BASH_DOOR | EMPTY_MIND | CAN_SWIM | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EMPTY_MIND +F:EVIL +F:FEMALE +F:IM_COLD +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:RES_WATE S:1_IN_8 -S:HOLD | CONF | BO_COLD | HEAL | DARKNESS +S:BO_COLD +S:CONF +S:DARKNESS +S:HEAL +S:HOLD D:A giant snake-like figure with a woman's torso, talented in magic. N:266:Poison ivy @@ -3995,10 +6127,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:POISON:2d2 B:HIT:POISON:2d2 -F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS | -F:KILL_TREES | SUSCEP_FIRE | ANIMAL | -F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS | -F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:FORCE_SLEEP +F:FRIENDS +F:KILL_TREES +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD S:MULTIPLY D:A mass of vegetation. It seems to be growing... @@ -4012,11 +6159,21 @@ B:SPORE:CONFUSE B:SPORE:CONFUSE B:SPORE:HALLU B:SPORE:HALLU -F:FORCE_SLEEP | NEVER_MOVE | -F:STUPID | RES_TELE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BLINK | SLOW | SCARE | DARKNESS +F:BASEANGBAND +F:CAN_SWIM +F:FORCE_SLEEP +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:STUPID +S:1_IN_2 +S:BLINK +S:DARKNESS +S:SCARE +S:SLOW D:Yum! It looks quite tasty. It seems to glow with an unusual light. N:268:Plaguebearer of Nurgle @@ -4028,11 +6185,23 @@ O:50:20:20:10 B:CLAW:DISEASE:2d5 B:CLAW:DISEASE:2d5 B:BUTT:HURT:3d5 -F:FORCE_MAXHP | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | IM_COLD | -F:EVIL | DEMON | UNDEAD | IM_POIS | NONLIVING | ZANGBAND | NO_CUT -S:1_IN_8 | -S:SCARE | S_ANT | CAUSE_2 | SLOW +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_CUT +F:OPEN_DOOR +F:UNDEAD +F:ZANGBAND +S:1_IN_8 +S:CAUSE_2 +S:SCARE +S:SLOW +S:S_ANT D:An unfortunate individual, who was killed by the incurable D:disease known as Nurgle's Rot, and was transformed into a D:rotting demon zombie. It has but one eye, and a single @@ -4047,11 +6216,17 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_1D2 | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE F:EVIL -F:MORTAL | BASEANGBAND +F:FEMALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 D:A giant snake-like figure with a woman's torso. N:270:Wererat @@ -4063,13 +6238,22 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL -F:MORTAL | BASEANGBAND -S:1_IN_9 | -S:BLINK | CAUSE_2 | BO_COLD | BA_POIS | S_KIN +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_9 +S:BA_POIS +S:BLINK +S:BO_COLD +S:CAUSE_2 +S:S_KIN D:A large rat with glowing red eyes, which can also assume human form. The wererat D:is a disgusting creature, relishing in filth and disease. @@ -4082,11 +6266,15 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:FORCE_SLEEP | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MORTAL +S:1_IN_5 S:BR_LITE D:A brilliant canine form whose light hurts your eyes, even at this distance. @@ -4099,11 +6287,15 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:FORCE_SLEEP | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | HURT_LITE | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:MORTAL +S:1_IN_5 S:BR_DARK D:A hole in the air in the shape of a huge hound. No light falls upon its D:form. @@ -4116,9 +6308,21 @@ E:0:0:0:0:1:0 O:90:0:10:0 B:BITE:POISON:1d3 B:BITE:LOSE_STR:1d4 -F:UNDEAD | EVIL | IM_POIS | IM_COLD | WEIRD_MIND | NO_FEAR | CAN_FLY | -F:NO_CONF | NO_SLEEP | DROP_60 | BASH_DOOR | FRIENDS | COLD_BLOOD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD +F:WEIRD_MIND D:A pack of skulls animated by necromantic spells. N:274:Mi-Go @@ -4129,10 +6333,20 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:POISON:1d4 B:BITE:LOSE_STR:1d2 -F:IM_POIS | IM_COLD | COLD_BLOOD | ANIMAL | EVIL | -F:NO_SLEEP | NO_CONF | CAN_FLY | DROP_SKELETON | CTHANGBAND +F:ANIMAL +F:CAN_FLY +F:COLD_BLOOD +F:CTHANGBAND +F:DROP_SKELETON +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_SLEEP S:1_IN_6 -S:CONF | S_MONSTER | S_DEMON +S:CONF +S:S_DEMON +S:S_MONSTER D:"They were pinkish things about five feet long; with crustaceous D:bodies bearing vast pairs of dorsal fins or membranous wings and D:several sets of articulate limbs, and with a sort of convoluted @@ -4148,9 +6362,15 @@ O:0:0:0:0 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | SPIDER | IM_POIS | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO D:A giant spider with hairy black and red legs. N:276:Giant clear centipede @@ -4161,10 +6381,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d4 B:STING:HURT:2d4 -F:ATTR_CLEAR | -F:INVISIBLE | WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:ATTR_CLEAR +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:INVISIBLE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is about four feet long and carnivorous. N:277:Mirkwood spider @@ -4176,10 +6401,19 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:FRIENDS | WILD_TOO | WILD_WOOD | -F:WEIRD_MIND | BASH_DOOR | HURT_LITE | -F:ANIMAL | SPIDER | EVIL | IM_POIS | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD D:A strong and powerful spider from Mirkwood forest. Cunning and evil, it D:seeks to taste your juicy insides. @@ -4191,10 +6425,23 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:COLD:5d8 B:HIT:COLD:5d8 -F:DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | MALE | AURA_COLD | SUSCEP_FIRE | -F:IM_COLD | BASEANGBAND | HAS_LITE | MORTAL +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE D:A twelve foot tall giant covered in furs. N:279:Griffon @@ -4205,8 +6452,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:HIT:HURT:3d4 B:BITE:HURT:2d6 -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | -F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It is half lion, half eagle. It flies menacingly towards you. N:280:Homunculus @@ -4217,8 +6472,16 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:PARALYZE:1d2 B:HIT:HURT:1d10 -F:OPEN_DOOR | BASH_DOOR | NONLIVING | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:EVIL +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_FEAR +F:OPEN_DOOR D:It is a small demonic spirit full of malevolence. N:281:Gnome mage @@ -4228,12 +6491,21 @@ W:15:2:900:40 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLINK | DARKNESS | BO_COLD | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_4 +S:BLINK +S:BO_COLD +S:DARKNESS S:S_MONSTER D:A mage of short stature. @@ -4246,10 +6518,15 @@ O:0:0:0:0 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 -F:ATTR_CLEAR | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:INVISIBLE | BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:ATTR_CLEAR +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:INVISIBLE +F:MORTAL D:A faint sense of motion in the air, hound shaped, stands before you. N:283:Umber hulk @@ -4262,11 +6539,19 @@ B:GAZE:CONFUSE B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:2d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. @@ -4280,10 +6565,15 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:STUPID | WEIRD_MIND | KILL_ITEM | -F:IM_ACID | IM_POIS | DROP_CORPSE | -F:NO_CONF | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:KILL_ITEM +F:MORTAL +F:NO_CONF +F:STUPID +F:WEIRD_MIND D:It is a weird, small animal with two antennae popping forth from D:its forehead. It looks hungry. @@ -4295,10 +6585,17 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:2d10 B:HIT:HURT:2d10 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | ORC | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:ORC D:An unholy hybrid of ogre and orc. N:286:Gelatinous cube @@ -4310,12 +6607,26 @@ O:40:30:20:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | -F:DROP_1D2 | DROP_4D2 | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:It is a strange, vast gelatinous structure that assumes cubic proportions D:as it lines all four walls of the corridors it patrols. Through its D:transparent jelly structure you can see treasures it has engulfed, and a @@ -4328,11 +6639,19 @@ W:16:2:150:65 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | WILD_TOO | WILD_SWAMP | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_POIS D:A vast, foul-smelling dragonfly. @@ -4344,10 +6663,22 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:FIRE:6d8 B:HIT:FIRE:6d8 -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_VOLCANO | SUSCEP_COLD | -F:EVIL | GIANT | MALE | AURA_FIRE | DROP_SKELETON | DROP_CORPSE | -F:IM_FIRE | BASEANGBAND | HAS_LITE | MORTAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A glowing fourteen foot tall giant. Flames drip from its red skin. N:289:Hummerhorn @@ -4357,8 +6688,12 @@ W:16:4:100:4 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:2d2 -F:RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:A giant buzzing wasp, its stinger drips venom. @@ -4370,11 +6705,20 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:MALE | CAN_SWIM | IM_ACID | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_SHORE | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON -F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_TOO D:Intelligent lizard beings from the depths. N:291:Ulfast, Son of Ulfang @@ -4387,12 +6731,22 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:MALE | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE D:A short and swarthy Easterling. N:292:Crebain @@ -4403,10 +6757,25 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 -F:ANIMAL | EVIL | MORTAL | FRIENDS | BASEANGBAND | DROP_CORPSE | HAS_EGG | -F:WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD | WILD_VOLCANO | -F:WILD_GRASS | WILD_SWAMP | WILD_SHORE | WILD_OCEAN | CAN_FLY -S:1_IN_8 | SHRIEK +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:HAS_EGG +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +F:WILD_VOLCANO +F:WILD_WASTE +F:WILD_WOOD +S:1_IN_8 +S:SHRIEK D:A type of crow, specially bred by the forces of evil as spies; their D:rudimentary intelligence guided by an evil mind has tracked you down, D:and now they seek to alert other evil creatures to your presence. @@ -4420,10 +6789,20 @@ O:20:80:0:0 B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:HIT:HURT:7d7 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | HASTE | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +S:1_IN_4 +S:HASTE +S:SCARE D:Even the strongest of normal human warriors fears the Berserker - the one who D:can drive himself into such a terrible battle-frenzy that he can survive blows D:which should kill him, and still apparently feel no pain. He tramples weaker @@ -4439,13 +6818,28 @@ O:0:50:30:10 B:BITE:LOSE_DEX:1d6 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:FORCE_SLEEP | CAN_FLY | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | INVISIBLE | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NONLIVING | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:INVISIBLE +F:NONLIVING +F:ONLY_ITEM +F:RAND_25 +F:SMART +S:1_IN_10 +S:BLIND +S:BLINK +S:CONF +S:SCARE +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:The chaotic evil master's favourite pet. N:295:Sphinx @@ -4456,12 +6850,21 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_1D2 | CAN_FLY | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_11 | -S:SCARE | CONF +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_11 +S:CONF +S:SCARE D:It will eat you if you cannot answer its riddle. N:296:Imp @@ -4472,13 +6875,30 @@ E:0:1:1:0:1:0 O:30:20:50:0 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:FORCE_SLEEP | CAN_FLY | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | INVISIBLE | COLD_BLOOD | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:INVISIBLE +F:ONLY_ITEM +F:RAND_25 +F:RES_TELE +F:SMART +S:1_IN_10 +S:BLIND +S:BLINK +S:BO_FIRE +S:CONF +S:SCARE +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:The lawful evil master's favourite pet. N:297:Forest troll @@ -4490,10 +6910,21 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_TOO +F:WILD_WOOD D:He is green-skinned and ugly. @@ -4504,9 +6935,21 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:COLD:8d8 -F:FORCE_SLEEP | CAN_FLY | SUSCEP_FIRE | RAND_50 | RAND_25 | -F:EMPTY_MIND | AURA_COLD | -F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_COLD +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:SUSCEP_FIRE D:A semi-sentient snowball, hurling itself at targets at random. N:299:Jumping fireball @@ -4516,9 +6959,21 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:FIRE:8d8 -F:FORCE_SLEEP | CAN_FLY | SUSCEP_COLD | -F:EMPTY_MIND | AURA_FIRE | RAND_50 | RAND_25 | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:SUSCEP_COLD D:A semi-sentient fireball that moves around randomly. N:300:Ball lightning @@ -4528,11 +6983,22 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:ELEC:8d8 -F:FORCE_SLEEP | CAN_FLY | RAND_25 | RAND_50 | -F:EMPTY_MIND | AURA_ELEC | -F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE |NO_CUT -D:A crackling ball of energy, zooming about seemingly at random. - +F:AURA_ELEC +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +D:A crackling ball of energy, zooming about seemingly at random. + N:301:2-headed hydra G:M:u I:110:100d3:20:60:20 @@ -4541,11 +7007,24 @@ E:0:1:0:2:2:0 O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_1D2 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | HAS_EGG | IMPRESED | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_11 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_11 S:SCARE D:A strange reptilian creature with two heads, guarding its hoard. @@ -4557,8 +7036,13 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:TERRIFY:2d5 B:CLAW:TERRIFY:5d2 -F:CAN_SWIM | OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_SWAMP -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:MORTAL +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO D:A creature that was once human, but is now as green as moss. N:303:Water spirit @@ -4569,10 +7053,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_POIS | IM_ACID | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 D:A whirlpool of sentient liquid. N:304:Giant red scorpion @@ -4583,9 +7075,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d4 B:STING:LOSE_STR:1d7 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is fast and poisonous. N:305:Earth spirit @@ -4596,11 +7092,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | -F:PASS_WALL | CAN_FLY | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 D:A whirling form of sentient rock. N:306:Fire spirit @@ -4611,10 +7117,22 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:FIRE:2d6 B:HIT:FIRE:2d6 -F:RAND_25 | -F:EMPTY_MIND | BASH_DOOR | CAN_FLY | SUSCEP_COLD | -F:IM_FIRE | IM_POIS | WILD_TOO | WILD_VOLCANO | -F:NO_CONF | NO_SLEEP | NO_FEAR | AURA_FIRE | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A whirlwind of sentient flame. N:307:Fire hound @@ -4626,12 +7144,18 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:FIRE:2d6 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | SUSCEP_COLD | -F:ANIMAL | IM_FIRE | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +S:1_IN_10 S:BR_FIRE D:Flames lick at its feet and its tongue is a blade of fire. You can feel a D:furnace heat radiating from the creature. @@ -4645,12 +7169,17 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:COLD:2d6 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_COLD | SUSCEP_FIRE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:MORTAL +F:SUSCEP_FIRE +S:1_IN_10 S:BR_COLD D:A hound as tall as a man, this creature appears to be composed of angular D:planes of ice. Cold radiates from it and freezes your breath in the air. @@ -4664,12 +7193,17 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:ELEC:2d6 -F:FORCE_SLEEP | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | IM_ELEC | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ELEC +F:MORTAL +S:1_IN_10 S:BR_ELEC D:Saint Elmo's Fire forms a ghostly halo around this hound, and sparks sting D:your fingers as energy builds up in the air around you. @@ -4683,12 +7217,23 @@ O:10:10:10:10 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_COLD | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_COLD +S:1_IN_6 +S:BLIND +S:BO_COLD +S:CAUSE_2 +S:CONF +S:SCARE D:A strange creature that disguises itself as some object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -4701,12 +7246,22 @@ O:0:0:0:0 B:HIT:POISON:3d4 B:HIT:CONFUSE:2d3 B:HIT:PARALYZE:2d3 -F:CHAR_MULTI | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_6 +S:BLIND +S:BO_COLD +S:CAUSE_2 +S:CONF +S:SCARE D:A strange creature that disguises itself as a door to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -4717,9 +7272,18 @@ W:18:2:400:50 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 -F:RAND_25 | FRIENDS | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | RES_TELE | MORTAL | BASEANGBAND -S:1_IN_4 | BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:RAND_25 +F:RES_TELE +S:1_IN_4 +S:BLINK +S:TELE_TO D:A strange magical member of the canine race, its form seems to shimmer and D:fade in front of your very eyes. @@ -4731,12 +7295,21 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:MALE | -F:FORCE_MAXHP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +S:1_IN_9 S:ARROW_2 D:It is a cunning orc of power, as tall as a man, and stronger. It fears D:little. @@ -4751,13 +7324,25 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:He is an orc of power and great cunning, leader of the garrison at Cirith Ungol. N:315:Gorbag, the Orc Captain @@ -4770,13 +7355,24 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | -F:ESCORT | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:He is an orc of power and great cunning, leader of the garrison at Minas Morgul. N:316:Shambling mound @@ -4787,10 +7383,21 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:ONLY_GOLD | DROP_90 | WILD_TOO | WILD_SWAMP | -F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:OPEN_DOOR +F:STUPID +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 S:SHRIEK D:A pile of rotting vegetation that slides towards you with a disgusting D:stench, waking all it nears. @@ -4804,8 +7411,17 @@ O:0:0:0:0 B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 -F:NEVER_MOVE | EMPTY_MIND | STUPID | CHAR_CLEAR | CHAR_MULTI | -F:WILD_ONLY | WILD_WOOD | WILD_SWAMP | ANIMAL | SUSCEP_FIRE | NO_CUT +F:ANIMAL +F:CHAR_CLEAR +F:CHAR_MULTI +F:EMPTY_MIND +F:NEVER_MOVE +F:NO_CUT +F:STUPID +F:SUSCEP_FIRE +F:WILD_ONLY +F:WILD_SWAMP +F:WILD_WOOD D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut D:around its prey and releases paralysing enzymes to stop its struggles. @@ -4817,12 +7433,24 @@ E:0:0:0:0:0:0 O:25:45:20:0 B:HIT:CONFUSE:3d5 B:HIT:EXP_20:3d5 +F:ATTR_ANY +F:ATTR_MULTI +F:BASH_DOOR F:DROP_1D2 -F:OPEN_DOOR | BASH_DOOR | NO_CONF | NO_SLEEP | DROP_CORPSE -F:EVIL | IM_POIS | IM_FIRE | ATTR_ANY | ATTR_MULTI -F:MORTAL | ZANGBAND +F:DROP_CORPSE +F:EVIL +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND S:1_IN_8 -S:MISSILE | BO_FIRE | CONF | TPORT +S:BO_FIRE +S:CONF +S:MISSILE +S:TPORT D:A truly loathsome thing, twisted by chaos, it is a mixture D:of several different kinds of creature. @@ -4834,11 +7462,26 @@ E:1:1:1:0:1:1 O:30:0:30:40 B:CLAW:CONFUSE:3d5 B:CLAW:CONFUSE:3d5 -F:FORCE_MAXHP | DROP_60 | FEMALE | -F:OPEN_DOOR | BASH_DOOR | IM_COLD | NO_CONF | NO_SLEEP | -F:EVIL | DEMON | IM_POIS | IM_FIRE | ZANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND S:1_IN_8 -S:SCARE | S_DEMON | CAUSE_2 | CONF | BO_FIRE | BO_COLD +S:BO_COLD +S:BO_FIRE +S:CAUSE_2 +S:CONF +S:SCARE +S:S_DEMON D:It is minor female demon, vaguely human-like, but with crab-like D:pincers instead of hands. She wears a rather indecent skimpy D:leather bikini, moves quickly and casts deadly spells! @@ -4850,11 +7493,20 @@ W:18:2:150:80 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_CONF D:This vast gleaming bronze fly has wings which beat mesmerically fast. @@ -4866,9 +7518,19 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:DROP_60 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | MALE | WILD_TOO | WILD_MOUNTAIN | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_TOO D:It is eighteen feet tall and looking at you. N:322:Giant black dragon fly @@ -4878,11 +7540,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ACID +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_ACID D:The size of a large bird, this fly drips caustic acid. @@ -4894,10 +7564,20 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:COLD_BLOOD | EMPTY_MIND | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is a massive animated statue. N:324:Red mold @@ -4907,10 +7587,18 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:FIRE:4d4 -F:NEVER_MOVE | SUSCEP_COLD | -F:STUPID | EMPTY_MIND | -F:IM_FIRE | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_COLD D:It is a strange red growth on the dungeon floor; it seems to burn with D:flame. @@ -4921,12 +7609,19 @@ W:22:2:150:75 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | WILD_TOO | WILD_MOUNTAIN | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_FLY | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_SOUN D:Large beating wings support this dazzling insect. A loud buzzing noise D:pervades the air. @@ -4939,9 +7634,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:PARALYZE:10d1 B:TOUCH:PARALYZE:10d1 -F:NEVER_MOVE | IM_COLD | COLD_BLOOD | IM_ACID | IM_ELEC | NO_FEAR | -F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | CHAR_MULTI | -F:EMPTY_MIND | HURT_ROCK | ZANGBAND | NO_CUT +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ZANGBAND D:A sentient section of wall. N:327:Ghast @@ -4954,9 +7661,21 @@ B:CLAW:PARALYZE:2d4 B:CLAW:PARALYZE:2d4 B:BITE:LOSE_CON:2d4 B:BITE:LOSE_CHR:2d4 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | ESCORT | -F:NO_SLEEP | NO_CONF | UNDEAD | EVIL | IM_POIS | IM_COLD | -F:COLD_BLOOD | HURT_LITE | CAN_SWIM | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_60 +F:ESCORT +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:This vile abomination is a relative of ghouls, and often leads packs D:of them. It smells foul, and its bite carries a rotting disease. @@ -4965,10 +7684,17 @@ G:I:D I:120:3d2:8:18:10 W:19:4:100:4 B:BITE:POISON:2d2 -F:RAND_50 | RAND_25 | CAN_FLY | WILD_SWAMP | WILD_TOO | -F:WEIRD_MIND | ANIMAL | EVIL | BASEANGBAND -S:MULTIPLY | -S:1_IN_12 | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:EVIL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_12 +S:MULTIPLY S:SHRIEK D:Believed to be an evil relative of the cricket, this creature gets its name D:from its incessant squeaking, which can best be described as "neek-breek, @@ -4985,11 +7711,22 @@ B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 -F:DROP_60 | NO_SLEEP | NO_CONF | ANIMAL | WEIRD_MIND | SUSCEP_FIRE | -F:RES_WATE | IM_COLD | NEVER_MOVE | WILD_ONLY | WILD_WOOD | -F:BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:DROP_60 +F:IM_COLD +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_WATE +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_ONLY +F:WILD_WOOD S:1_IN_9 -S:BLINK | TELE_TO +S:BLINK +S:TELE_TO D:A very strong near-sentient tree, which has become hostile to other living things. N:330:Bolg, Son of Azog @@ -5002,13 +7739,25 @@ B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:A large and powerful orc, he looks just like his father. He is tall and D:fast, but fortunately blessed with orcish brains. @@ -5021,12 +7770,22 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:FRIENDS | WILD_TOO | WILD_WOOD | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | CAN_SWIM | -F:ANIMAL | SPIDER | IM_POIS | RES_TELE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MORTAL +F:RES_TELE +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD +S:1_IN_5 +S:BLINK +S:TELE_TO D:A spider that never seems quite there. Everywhere you look it is just D:half-seen in the corner of one eye. @@ -5039,11 +7798,21 @@ O:50:50:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:WAIL:TERRIFY -F:MALE | CAN_SWIM | IM_ACID | IM_POIS | WILD_SHORE | -F:DROP_60 | DROP_1D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | FORCE_MAXHP | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SHORE D:A lizardman leader. N:333:Landmine @@ -5053,10 +7822,19 @@ W:20:5:300:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:HURT:25d2 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT +F:ATTR_CLEAR +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It was left here to be used against intruders. N:334:Wyvern @@ -5069,11 +7847,25 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:STING:POISON:1d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_2D2 | IM_POIS | CAN_FLY | HAS_EGG | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CORPSE | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_SKELETON | -F:ANIMAL | EVIL | DRAGON | BASEANGBAND | ATTR_MULTI +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_EGG +F:IM_POIS +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A fast-moving and deadly draconian animal. Beware its poisonous sting! N:335:Great eagle @@ -5085,9 +7877,17 @@ O:0:0:0:0 B:CLAW:HURT:6d3 B:CLAW:HURT:6d3 B:BITE:HURT:3d6 -F:CAN_FLY | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | WILD_WASTE | WILD_WOOD | -F:ANIMAL | GOOD | DROP_CORPSE | BASEANGBAND | HAS_EGG +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO +F:WILD_WASTE +F:WILD_WOOD D:Greater and more intelligent than most of its kind, this great eagle is D:a messenger between the forces of good. @@ -5099,9 +7899,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:NEVER_MOVE | IM_COLD | COLD_BLOOD | IM_ACID | IM_ELEC | NO_FEAR | -F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | FRIENDS | CHAR_MULTI | HURT_ROCK | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:FRIENDS +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP S:MULTIPLY D:A sentient section of wall. @@ -5115,11 +7927,16 @@ B:BITE:HURT:1d8 B:BITE:HURT:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND | NO_CUT -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CUT +S:1_IN_10 S:BR_SHAR D:A beautiful crystalline shape does not disguise the danger this hound D:clearly presents. Your flesh tingles as it approaches. @@ -5134,11 +7951,17 @@ B:BITE:POISON:1d8 B:BITE:POISON:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | CAN_FLY | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_POIS +F:MORTAL +S:1_IN_10 S:BR_POIS D:Swirling vapours surround this beast as it floats towards you, seemingly D:walking on air. Noxious gases sting your throat. @@ -5153,9 +7976,15 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:BASH_DOOR | WILD_WOOD | WILD_TOO | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A fierce and dangerous cat, its huge tusks and sharp claws would lacerate D:even the strongest armour. @@ -5169,11 +7998,17 @@ B:BITE:ACID:1d8 B:BITE:ACID:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_ACID | MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_ACID +F:MORTAL +S:1_IN_10 S:BR_ACID D:Footprints are burned in the ground behind this hound as it pads D:around the dungeon. An acrid smell of acid rises from the dog's pelt. @@ -5187,10 +8022,18 @@ O:0:0:0:0 B:BUTT:HURT:2d8 B:BITE:HURT:2d10 B:BITE:FIRE:2d6 -F:FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:IM_FIRE | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_FIRE D:It is a strange concoction of goat, lion and dragon, with the heads of all D:three beasts. @@ -5201,11 +8044,18 @@ I:110:6d8:10:1:0 W:20:1:3000:250 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW -F:EMPTY_MIND | INVISIBLE | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_4 | -S:BLINK | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_4 +S:BLINK S:S_MONSTER D:It is a strange pulsing mound of flesh. @@ -5218,9 +8068,18 @@ O:0:0:0:0 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_WASTE | -F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_COLD +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD D:A tall shaggy, furry humanoid, it could call the yeti brother. N:344:Weir @@ -5231,10 +8090,16 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:RAND_25 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | EVIL | FRIENDS | -F:MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:ZANGBAND D:It is a tracker; half human, half beast. N:345:Ranger @@ -5245,12 +8110,23 @@ E:1:1:1:2:1:1 O:20:50:20:0 B:HIT:HURT:5d4 B:HIT:HURT:5d4 -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:DROP_SKELETON | DROP_CORPSE | BASEANGBAND | MORTAL | HAS_LITE -S:1_IN_4 | -S:ARROW_2 | MISSILE | BO_COLD | BO_ELEC | BLINK | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:ARROW_2 +S:BLINK +S:BO_COLD +S:BO_ELEC +S:MISSILE +S:S_ANIMAL D:A warrior who is at one with nature. A master of both bow and sword, with D:minor spellcasting skills. @@ -5262,12 +8138,23 @@ E:1:1:1:2:1:1 O:20:60:0:10 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:MALE | GOOD | DROP_SKELETON | DROP_CORPSE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:BASEANGBAND | MORTAL | HAS_LITE -S:1_IN_4 | -S:HEAL | CAUSE_2 | SLOW | SCARE | BLIND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:BLIND +S:CAUSE_2 +S:HEAL +S:SCARE +S:SLOW D:A warrior for a holy cause. Unfortunately, his god is not yours, and there is D:rivalry even between the various gods of Good, so he is your enemy. @@ -5280,9 +8167,15 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 -F:RAND_25 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM D:It is a huge wolf with eyes that glow with manly intelligence. N:348:Dark elven lord @@ -5293,12 +8186,26 @@ E:1:1:1:2:1:1 O:0:80:20:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:MALE | FORCE_SLEEP | -F:ONLY_ITEM | DROP_2D2 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HASTE | BLIND | CONF | DARKNESS | BO_FIRE | BO_COLD | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BLIND +S:BO_COLD +S:BO_FIRE +S:CONF +S:DARKNESS +S:HASTE +S:MISSILE D:A dark elven figure in armour and radiating evil power. N:349:Cloud giant @@ -5309,9 +8216,18 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:8d8 B:HIT:ELEC:8d8 -F:DROP_90 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | IM_ELEC | MALE | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_ELEC +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM D:It is a twenty foot tall giant wreathed in clouds. N:350:Ugluk, the Uruk @@ -5324,13 +8240,26 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_FIRE | IM_COLD | IM_POIS -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A strong and cunning orc warrior, the commander of Saruman's orcish horde. N:351:Blue dragon bat @@ -5340,12 +8269,16 @@ W:21:1:100:54 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:ELEC:1d3 -F:FORCE_SLEEP | -F:RAND_50 | -F:BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_ELEC | AI_ANNOY -F:MORTAL | BASEANGBAND -S:1_IN_4 | +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ELEC +F:MORTAL +F:RAND_50 +S:1_IN_4 S:BR_ELEC D:It is a glowing blue bat with a sharp tail. @@ -5359,12 +8292,23 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD | SUSCEP_FIRE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_FIRE | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_FIRE +S:1_IN_5 +S:BLIND +S:BO_FIRE +S:CAUSE_2 +S:CONF +S:SCARE S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -5379,14 +8323,24 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BLIND | CONF | SCARE | CAUSE_2 | BA_POIS | -S:S_MONSTER -D:A strange creature that disguises itself as an object to lure +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_5 +S:BA_POIS +S:BLIND +S:CAUSE_2 +S:CONF +S:SCARE +S:S_MONSTER +D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -5397,11 +8351,25 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_VOLCANO | WILD_TOO | SUSCEP_COLD | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_FIRE | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF F:NO_CUT -S:1_IN_6 | +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_FIRE D:A whirling maelstrom of fire. @@ -5412,10 +8380,20 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ACID:3d3 -F:FORCE_SLEEP | RAND_50 | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:IM_ACID | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_6 S:BR_ACID D:A caustic spinning whirlpool of foaming, steaming water. @@ -5429,13 +8407,24 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A large and powerful orc, captain of one of Saruman's orcish regiments. N:357:Arch-vile @@ -5446,12 +8435,25 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:HURT:3d9 B:CLAW:HURT:3d9 -F:RAND_50 | EVIL | DEMON | FORCE_SLEEP | FORCE_MAXHP | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | COLD_BLOOD | -F:IM_FIRE | RES_NETH | NO_CONF | NO_SLEEP | NONLIVING | NO_STUN | +F:BASH_DOOR +F:COLD_BLOOD +F:DEMON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:POWERFUL +F:RAND_50 +F:RES_NETH F:ZANGBAND -S:1_IN_3 | -S:BA_FIRE | ANIM_DEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_FIRE D:A pale, corpse-like lesser demon, who moves very fast and spawns evil D:everywhere. @@ -5462,10 +8464,23 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:COLD:3d3 -F:FORCE_SLEEP | RAND_50 | AURA_COLD | COLD_BLOOD | SUSCEP_FIRE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:SUSCEP_FIRE +S:1_IN_6 S:BR_COLD D:A twisting whirlpool of frost. @@ -5476,10 +8491,22 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ELEC:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | HAS_LITE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_ELEC | -F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_6 S:BR_ELEC D:A shimmering tornado of air, sparks crackle along its length. @@ -5491,10 +8518,18 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:10d5 B:BITE:POISON:10d5 -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AQUATIC | -F:IM_POIS | NO_STUN | WILD_TOO | COLD_BLOOD | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NO_STUN +F:POWERFUL +F:WILD_TOO +S:1_IN_8 S:BR_POIS D:This fish is among the most poisonous creatures there are. @@ -5503,8 +8538,12 @@ G:I:r I:120:3d2:8:18:10 W:24:4:100:4 B:BITE:BLIND:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:Clouds of these monsters light up the dungeon - so brightly that you can D:barely see through them. @@ -5517,11 +8556,21 @@ E:1:1:1:2:1:1 O:10:70:0:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:DROP_90 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is an orcish figure covered in wrappings. N:363:Wolf chieftain @@ -5532,10 +8581,22 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 B:WAIL:TERRIFY -F:ESCORTS | FORCE_MAXHP | IM_COLD | IM_ACID | -F:SMART | ESCORT | ANIMAL | EVIL | MORTAL | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | NO_FEAR | MALE -S:1_IN_8 | DARKNESS +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:NO_FEAR +F:OPEN_DOOR +F:SMART +S:1_IN_8 +S:DARKNESS D:A great wolf-chieftain whose pack is in the service of the Dark Lord, D:and whose howls strike fear into even the boldest heart. @@ -5547,11 +8608,24 @@ E:1:1:1:2:1:1 O:25:20:25:20 B:BITE:POISON:5d5 B:BITE:POISON:5d5 -F:MALE | CAN_SWIM | IM_POIS | IM_ACID | -F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | EVIL | MORTAL | ZANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ZANGBAND S:1_IN_8 -S:BA_POIS | S_MONSTER | SCARE | HOLD +S:BA_POIS +S:HOLD +S:SCARE +S:S_MONSTER D:"They walked lithely and sinuously erect on pre-mammalian D:members, their pied and hairless bodies bending with great D:suppleness. There was a loud hissing of formulae as they @@ -5565,9 +8639,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_20:1d6 B:ENGULF:EXP_20:1d6 -F:RAND_25 | SUSCEP_ELEC | UNDEAD | -F:IM_COLD | IM_POIS | IM_ACID | RES_NETH | WILD_TOO | WILD_SWAMP | -F:EVIL | EMPTY_MIND | COLD_BLOOD | FRIENDS | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_CUT +F:RAND_25 +F:RES_NETH +F:SUSCEP_ELEC +F:UNDEAD +F:WILD_SWAMP +F:WILD_TOO D:A cloud of evil, sentient mist. N:366:Killer stag beetle @@ -5578,9 +8664,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 -F:RAND_25 | WILD_TOO | DROP_CORPSE | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle with vicious claws. N:367:Iron golem @@ -5590,11 +8682,22 @@ W:22:2:3800:160 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 -F:FORCE_SLEEP | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_7 | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID +S:1_IN_7 S:SLOW D:It is a massive metal statue that moves steadily towards you. @@ -5608,9 +8711,21 @@ B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 -F:FORCE_SLEEP | RES_TELE -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE D:It looks like a huge spiked roller, moving on its own towards you. N:369:Giant yellow scorpion @@ -5621,9 +8736,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 B:STING:POISON:2d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant scorpion with a sharp stinger. N:370:Jade monk @@ -5636,10 +8755,22 @@ B:KICK:HURT:4d1 B:KICK:HURT:4d1 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:OPEN_DOOR | BASH_DOOR | NO_FEAR | NO_CONF | NO_SLEEP | -F:MALE | DROP_60 | DROP_1D2 | IM_FIRE | IM_COLD | IM_POIS | -F:DROP_SKELETON | DROP_CORPSE | -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND D:A monk trained in martial arts. N:371:Black ooze @@ -5649,13 +8780,23 @@ W:23:1:400:7 E:0:0:0:0:0:0 O:30:0:40:15 B:TOUCH:ACID:2d6 -F:RAND_50 | DROP_60 | STUPID | EMPTY_MIND | CAN_SWIM | -F:TAKE_ITEM | KILL_BODY | OPEN_DOOR | BASH_DOOR | -F:IM_POIS | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT -S:MULTIPLY -S:1_IN_11 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:EMPTY_MIND +F:IM_POIS +F:KILL_BODY +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:OPEN_DOOR +F:RAND_50 +F:STUPID +F:TAKE_ITEM +S:1_IN_11 S:DRAIN_MANA +S:MULTIPLY D:It is a strangely moving puddle. N:372:Hardened warrior @@ -5666,10 +8807,17 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:6d5 B:HIT:HURT:6d5 -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:A scarred warrior who moves with confidence. N:373:Azog, King of the Uruk-Hai @@ -5681,13 +8829,26 @@ O:10:90:0:0 B:HIT:HURT:5d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | ESCORTS | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:He is also known as the King of Khazad-dum. His ego is renowned to be D:bigger than his head. @@ -5701,9 +8862,20 @@ B:CLAW:HURT:4d1 B:CLAW:HURT:4d1 B:BITE:HURT:6d1 B:BITE:HURT:6d1 -F:BASH_DOOR | DEMON | NO_STUN | NO_FEAR | -F:ANIMAL | EVIL | IM_FIRE | NO_SLEEP | NO_CONF | -F:RES_NETH | RES_NEXU | RES_DISE | RES_PLAS | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:DEMON +F:EVIL +F:IM_FIRE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:ZANGBAND D:A revolting canine creature, a huge demon hound with a somewhat D:reptilian head. @@ -5715,13 +8887,25 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | FRIENDS -F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:CONF | MISSILE | DARKNESS | BO_MANA +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BO_MANA +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven mage with spells of frightening destructive power. N:376:Master rogue @@ -5733,10 +8917,18 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:EAT_GOLD:4d4 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:DROP_2D2 | SUSCEP_ELEC | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_ELEC +F:TAKE_ITEM D:A thief of great power and shifty speed. N:377:Red dragon bat @@ -5746,10 +8938,17 @@ W:23:1:100:60 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 -F:FORCE_SLEEP | RAND_50 | SUSCEP_COLD | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | AI_ANNOY -F:ANIMAL | IM_FIRE | BASEANGBAND -S:1_IN_4 | +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:RAND_50 +F:SUSCEP_COLD +S:1_IN_4 S:BR_FIRE D:It is a sharp-tailed bat, wreathed in fire. @@ -5760,9 +8959,15 @@ W:23:1:500:85 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:4d5 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is looking for prey. N:379:Ice skeleton @@ -5773,10 +8978,21 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:CLAW:COLD:2d3 B:CLAW:COLD:2d3 -F:ONLY_ITEM | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD D:It is a skeleton covered in frost. N:380:Angamaite of Umbar @@ -5789,14 +9005,28 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_ELEC -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:SLOW | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:FORGET +S:SLOW D:A Black Numenorean who hates the men of the west. N:381:Forest wight @@ -5808,13 +9038,26 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:FORCE_SLEEP | RAND_25 | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:SCARE | DRAIN_MANA +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RAND_25 +F:UNDEAD +S:1_IN_10 +S:DRAIN_MANA +S:SCARE D:It is a ghostly apparition with a humanoid form. N:382:Khim, Son of Mim @@ -5827,14 +9070,28 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:HEAL | SLOW | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNIQUE +S:1_IN_8 +S:BO_FIRE +S:HEAL +S:SLOW D:One of the last of the Petty-Dwarves. Khim is a tricky sorcerous little D:being, full of mischief. @@ -5848,14 +9105,28 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:HEAL | SLOW | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNIQUE +S:1_IN_8 +S:BO_FIRE +S:HEAL +S:SLOW D:One of the last of the Petty-Dwarves. Ibun is a tricky sorcerous little D:being, full of mischief. @@ -5868,9 +9139,18 @@ O:0:0:0:0 B:CLAW:HURT:7d3 B:CLAW:HURT:7d3 B:BITE:HURT:3d7 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:Among all the eagles of Middle-earth he is the swiftest, and in his time D:has borne messages between all of the Wise. It was Meneldor who bore the D:Ring-bearer away from the destruction of Mount Doom. @@ -5883,8 +9163,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d33 B:HIT:HURT:2d44 -F:PASS_WALL | NO_SLEEP | COLD_BLOOD | NONLIVING | NO_FEAR | -F:FORCE_MAXHP | RES_TELE | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:RES_TELE D:A creature that is half real, half illusion. N:386:Giant silver ant @@ -5894,9 +9183,15 @@ W:23:1:800:45 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:4d4 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:A giant silver ant with a caustic bite. N:387:4-headed hydra @@ -5909,11 +9204,21 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_SHORE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_7 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_7 S:SCARE D:A strange reptilian creature with four heads, guarding its hoard. @@ -5926,11 +9231,27 @@ O:0:0:0:0 B:GAZE:TERRIFY:1d4 B:GAZE:TERRIFY:1d4 B:CRUSH:HURT:44d1 -F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | IM_COLD | -F:RES_NETH | RES_WATE | RES_PLAS | RES_DISE | RES_NEXU | -F:KILL_WALL | FORCE_MAXHP | CAN_SWIM | DROP_CORPSE | JOKEANGBAND | HAS_LITE -S:1_IN_9 | -S:TPORT | BLINK | TELE_AWAY +F:CAN_SWIM +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_WALL +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +S:1_IN_9 +S:BLINK +S:TELE_AWAY +S:TPORT D:This creature just might crush you. N:389:Tyrannosaur @@ -5943,9 +9264,14 @@ B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:3d6 B:BITE:HURT:3d6 -F:FORCE_SLEEP | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CORPSE | -F:ANIMAL | MORTAL | ZANGBAND +F:ANIMAL +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:MOVE_BODY +F:OPEN_DOOR +F:ZANGBAND D:A horror from prehistory, reawakened by chaos. N:390:Mummified human @@ -5956,10 +9282,21 @@ E:1:1:1:2:1:1 O:20:40:20:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:ONLY_ITEM | DROP_90 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD D:It is a human form encased in mouldy wrappings. N:391:Vampire bat @@ -5970,9 +9307,20 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:EXP_40:1d4 B:BITE:EXP_40:1d4 -F:RAND_50 | COLD_BLOOD | REGENERATE | CAN_FLY | -F:EVIL | ANIMAL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_50 +F:REGENERATE +F:UNDEAD D:A blood-sucking bat that flies at your neck hungrily. N:392:Sangahyando of Umbar @@ -5985,14 +9333,28 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_ELEC -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:SLOW | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:FORGET +S:SLOW D:A Black Numenorean with a blacker heart. N:393:It @@ -6005,14 +9367,47 @@ B:GAZE:BLIND:8d8 B:TOUCH:TERRIFY B:GAZE:EXP_40 B:TOUCH:EAT_ITEM -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | DROP_GREAT | DROP_CORPSE | -F:CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR | INVISIBLE | COLD_BLOOD | -F:NO_CONF | UNIQUE | FORCE_MAXHP | NO_SLEEP | CAN_SPEAK | REFLECTING | -F:IM_FIRE | IM_ELEC | EMPTY_MIND | EVIL | SMART | RES_TELE | CAN_FLY | +F:ATTR_CLEAR +F:CAN_FLY +F:CAN_SPEAK +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE F:ZANGBAND S:1_IN_4 -S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF | S_UNDEAD | S_MONSTER | -S:HEAL | TELE_AWAY | DARKNESS | S_HYDRA | TRAPS | FORGET | TELE_TO | SHRIEK +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HEAL +S:SCARE +S:SHRIEK +S:S_HYDRA +S:S_MONSTER +S:S_UNDEAD +S:TELE_AWAY +S:TELE_TO +S:TRAPS D:Nobody has ever seen It. N:394:Banshee @@ -6023,13 +9418,25 @@ E:0:0:0:0:0:0 O:80:0:0:15 B:WAIL:TERRIFY B:TOUCH:EXP_20 -F:FEMALE | -F:RAND_50 | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FEMALE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_15 | -S:TPORT | DRAIN_MANA +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:DRAIN_MANA +S:TPORT D:It is a ghostly woman's form that wails mournfully. N:395:Carrion crawler @@ -6040,9 +9447,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:PARALYZE:2d6 B:STING:PARALYZE:2d6 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:RAND_25 +F:WEIRD_MIND D:A hideous centipede covered in slime and with glowing tentacles around its D:head. @@ -6055,10 +9467,15 @@ O:0:0:0:0 B:CRUSH:HURT:6d4 B:CRUSH:HURT:6d4 B:BITE:HURT:3d2 -F:RAND_25 | SUSCEP_ACID | -F:EMPTY_MIND | BASH_DOOR | -F:IM_POIS | IM_ELEC | -F:MORTAL | CTHANGBAND | NO_CUT +F:BASH_DOOR +F:CTHANGBAND +F:EMPTY_MIND +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:NO_CUT +F:RAND_25 +F:SUSCEP_ACID D:"...a metallically grey tree... about sixteen feet high with D:very thick cylindrical branches... cylinders further D:divided into six flat circular extensions... and from the top @@ -6075,12 +9492,34 @@ B:GAZE:TERRIFY B:GAZE:PARALYZE B:GAZE:LOSE_STR B:GAZE:HALLU -F:EMPTY_MIND | COLD_BLOOD | NONLIVING | NEVER_MOVE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | EVIL | -F:HURT_ROCK | COLD_BLOOD | HURT_LITE | NO_FEAR | -F:NO_CONF | NO_SLEEP | NO_STUN | NONLIVING | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:SHRIEK | S_MONSTER | S_MONSTERS | HOLD | CONF | MIND_BLAST | DRAIN_MANA +F:BASEANGBAND +F:COLD_BLOOD +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NONLIVING +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_TELE +S:1_IN_3 +S:CONF +S:DRAIN_MANA +S:HOLD +S:MIND_BLAST +S:SHRIEK +S:S_MONSTER +S:S_MONSTERS D:A figure carved from stone, with three vulture faces whose eyes glow D:with a malevolent light. None escape its vigilance. @@ -6092,13 +9531,24 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:3d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:SLOW | CONF | BO_ACID +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_4 +S:BO_ACID +S:CONF +S:SLOW D:A stumpy figure carved from stone, with glittering eyes. N:399:Disenchanter beast @@ -6111,9 +9561,15 @@ B:TOUCH:UN_BONUS:1d10 B:TOUCH:UN_BONUS:1d10 B:TOUCH:UN_BONUS:1d10 B:TOUCH:UN_BONUS:1d10 -F:STUPID | WEIRD_MIND | RES_DISE | DROP_CORPSE | ATTR_MULTI | -F:IM_ACID | IM_POIS | -F:NO_CONF | ZANGBAND +F:ATTR_MULTI +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:RES_DISE +F:STUPID +F:WEIRD_MIND +F:ZANGBAND D:It looks like an anteater, and there is a static feeling D:crackling around its long trunk. @@ -6126,14 +9582,28 @@ O:10:0:80:10 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:HIT:HURT:3d8 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | CONF | DARKNESS | -S:S_MONSTER | S_SPIDER | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:CONF +S:DARKNESS +S:HEAL +S:S_ANIMAL +S:S_MONSTER +S:S_SPIDER D:A powerful dark elf, with mighty nature-controlling enchantments. N:401:Stone troll @@ -6145,10 +9615,20 @@ O:0:100:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:HURT_ROCK +F:MALE +F:NO_CUT +F:OPEN_DOOR +F:REGENERATE +F:TROLL D:He is a giant troll with scabrous black skin. N:402:Black @@ -6159,9 +9639,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_40:2d6 B:ENGULF:EXP_40:2d6 -F:RAND_25 | -F:IM_COLD | IM_POIS | IM_ACID | RES_NETH | -F:EVIL | EMPTY_MIND | COLD_BLOOD | FRIENDS | CTHANGBAND | NO_CUT +F:COLD_BLOOD +F:CTHANGBAND +F:EMPTY_MIND +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_CUT +F:RAND_25 +F:RES_NETH D:The eldritch blood of Yibb-Tstll is know only as "the Black": it is D:an amorphous substance, which will suck your life and deliver it to D:Yibb-Tstll. @@ -6175,11 +9663,22 @@ O:30:70:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:HURT:2d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE D:A large troll with an extremely tough and warty hide. N:404:Wereworm @@ -6192,9 +9691,16 @@ B:GAZE:EXP_20 B:CRAWL:ACID:2d4 B:BITE:HURT:1d10 B:BITE:POISON:1d6 -F:BASH_DOOR | EVIL | CAN_SWIM | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul D:monster that breeds on death. @@ -6205,9 +9711,15 @@ W:25:1:600:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:4d4 -F:RAND_25 | WILD_TOO | -F:WEIRD_MIND | BASH_DOOR | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:A giant beetle with poisonous mandibles. N:406:Disenchanter bat @@ -6218,8 +9730,16 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:HIT:UN_BONUS B:HIT:UN_BONUS -F:FORCE_SLEEP | RAND_50 | ANIMAL | MORTAL | ATTR_MULTI | -F:DROP_CORPSE | AI_ANNOY | CAN_FLY | BASEANGBAND | WEIRD_MIND +F:AI_ANNOY +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WEIRD_MIND D:A giant bat which feeds on raw magical energy. N:407:Gnoph-Keh @@ -6231,11 +9751,22 @@ O:20:40:20:10 B:CLAW:COLD:2d4 B:CLAW:COLD:2d4 B:BUTT:HURT:2d9 -F:RAND_25 | DROP_90 | DROP_60 -F:OPEN_DOOR | BASH_DOOR | AURA_COLD | IM_COLD | SUSCEP_FIRE | -F:ANIMAL | DROP_CORPSE | CTHANGBAND +F:ANIMAL +F:AURA_COLD +F:BASH_DOOR +F:CTHANGBAND +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:IM_COLD +F:OPEN_DOOR +F:RAND_25 +F:SUSCEP_FIRE S:1_IN_8 -S:BR_COLD | BO_ICEE | BO_COLD | BA_COLD +S:BA_COLD +S:BO_COLD +S:BO_ICEE +S:BR_COLD D:A creature with a sharp horn: "the hairy myth-thing of the D:Greenland ice, that walked sometimes on two legs, sometimes D:on four, and sometimes on six." @@ -6247,9 +9778,13 @@ W:26:1:700:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 -F:RAND_25 | KILL_BODY | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:KILL_BODY +F:RAND_25 +F:WEIRD_MIND D:It is an ant encased in shaggy grey fur. N:409:Khufu, the Mummified King @@ -6262,13 +9797,37 @@ B:GAZE:TERRIFY B:HIT:DISEASE:6d6 B:CLAW:LOSE_CON:4d4 B:CLAW:LOSE_CON:4d4 -F:UNIQUE | MALE | CAN_SPEAK | UNDEAD | EVIL | ESCORTS | ESCORT | -F:FORCE_MAXHP | COLD_BLOOD | IM_POIS | IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:TRAPS | CAUSE_3 | DARKNESS | S_UNDEAD | SCARE | SLOW | -S:S_KIN | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_90 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNDEAD +F:UNIQUE +S:1_IN_5 +S:ANIM_DEAD +S:CAUSE_3 +S:DARKNESS +S:SCARE +S:SLOW +S:S_KIN +S:S_UNDEAD +S:TRAPS D:He is out to have revenge on those who have desecrated his tomb. N:410:Gwaihir the Windlord @@ -6280,9 +9839,18 @@ O:0:0:0:0 B:CLAW:HURT:15d2 B:CLAW:HURT:15d2 B:BITE:HURT:3d10 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:The greatest of eagles in the Third Age of Middle-earth, Gwaihir rescued D:Gandalf the Wizard from Orthanc, and has twice brought his flock to the D:aid of Sauron's enemies in battle - first outside the gates of Erebor in @@ -6295,10 +9863,16 @@ W:26:2:200:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 -F:RAND_25 | SUSCEP_COLD | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +F:WEIRD_MIND D:It is smoking and burning with great heat. N:412:Displacer beast @@ -6311,8 +9885,12 @@ B:BITE:HURT:2d8 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:INVISIBLE | BASH_DOOR | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:INVISIBLE +F:MORTAL D:It is a huge black panther, clubbed tentacles sprouting from its shoulders. N:413:Ulwarth, Son of Ulfang @@ -6324,12 +9902,23 @@ O:40:60:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_MAXHP | WILD_TOO | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO D:A short and swarthy Easterling. N:414:Werebear @@ -6342,9 +9931,16 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 B:CRUSH:HURT:2d6 -F:BASH_DOOR | OPEN_DOOR | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | EVIL | DROP_1D2 | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:In the eyes of this bear, there glimmers the faintest light of intelligence. D:And then its form begins to change... The combination of animal cunning, D:human intelligence and the great physical strength of the bear makes for @@ -6358,10 +9954,16 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR D:A giant orc-like figure with an awesomely muscled frame. N:416:White wraith @@ -6373,13 +9975,25 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:FORCE_SLEEP | -F:DROP_1D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:SCARE D:It is a tangible but ghostly form made of white fog. N:417:Angel @@ -6392,12 +10006,28 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | -F:ONLY_ITEM | DROP_2D2 | GOOD | CAN_FLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:CONF +S:FORGET +S:SCARE D:Who knows why you are now facing an angel as an enemy? Is it a punishment D:from your own god for your sins, or a test of your mettle, or has this angel D:been sent by another god on behalf of someone who wishes to claim the glory @@ -6413,11 +10043,24 @@ O:0:45:35:10 B:CLAW:DISEASE:1d4 B:CLAW:DISEASE:1d4 B:BITE:PARALYZE:1d5 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | UNDEAD | FRIENDS | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD S:1_IN_9 -S:SCARE | HOLD +S:HOLD +S:SCARE D:Flesh is falling off in chunks from this decaying abomination. N:419:Mim, Betrayer of Turin @@ -6430,15 +10073,36 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:UN_BONUS:3d12 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_DISE | RES_TELE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | SCARE | BO_ACID | BA_ACID | TPORT | S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +F:RES_TELE +F:UNIQUE +S:1_IN_6 +S:BA_ACID +S:BO_ACID +S:HEAL +S:SCARE +S:S_MONSTER +S:TPORT D:The last of his race, Mim is a Petty-Dwarf. Petty-Dwarves are strange D:creatures, powerful in sorcery and originating in the East. They have D:been hunted nearly to extinction by the High Elves. @@ -6451,10 +10115,23 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_20:2d13 B:HIT:EXP_20:2d13 -F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_ACID | -F:COLD_BLOOD | BASH_DOOR | NONLIVING | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID D:A deadly blade of chaos, moving of its own volition. N:421:Killer fire beetle @@ -6465,9 +10142,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:FIRE:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_VOLCANO | DROP_CORPSE | -F:ANIMAL | IM_FIRE | CAN_FLY | SUSCEP_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND +F:WILD_TOO +F:WILD_VOLCANO D:It is a giant beetle wreathed in flames. N:422:Beast of Nurgle @@ -6479,8 +10165,15 @@ O:0:0:0:0 B:TOUCH:POISON:3d3 B:TOUCH:DISEASE:3d3 B:BITE:ACID:4d5 -F:WEIRD_MIND | BASH_DOOR | IM_ACID | IM_POIS | -F:DEMON | EVIL | IM_FIRE | CAN_FLY | ZANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:EVIL +F:IM_ACID +F:IM_FIRE +F:IM_POIS +F:WEIRD_MIND +F:ZANGBAND D:It walks on four legs, but mostly resembles a slug-shaped jelly. D:It even has two disgusting antennae in its head. Yecch! @@ -6494,9 +10187,19 @@ B:BITE:POISON:3d4 B:TOUCH:POISON:3d5 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:ONLY_GOLD | DROP_90 | DROP_2D2 | -F:COLD_BLOOD | BASH_DOOR | CHAR_MULTI | -F:IM_ELEC | IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of coins made of precious adamant, slithering toward D:you on lots of tiny legs. @@ -6509,9 +10212,19 @@ O:10:80:0:10 B:CLAW:POISON:3d3 B:CLAW:POISON:3d3 B:BITE:HURT:1d6 -F:FRIENDS | DROP_60 | WILD_WOOD | WILD_MOUNTAIN | WILD_TOO | WILD_SWAMP | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | REGENERATE | -F:EVIL | TROLL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:A powerful troll form. Venom drips from its needlelike claws. N:425:Flamer of Tzeentch @@ -6522,11 +10235,24 @@ E:1:0:1:2:0:0 O:0:0:0:0 B:ENGULF:FIRE:3d6 B:ENGULF:FIRE:3d6 -F:FORCE_SLEEP | BASH_DOOR | SUSCEP_COLD | -F:IM_FIRE | IM_POIS | AURA_FIRE | DEMON | EVIL | RES_PLAS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | ZANGBAND | HAS_LITE -S:1_IN_3 | -S:BO_FIRE | BA_FIRE +F:AURA_FIRE +F:BASH_DOOR +F:DEMON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_PLAS +F:SUSCEP_COLD +F:ZANGBAND +S:1_IN_3 +S:BA_FIRE +S:BO_FIRE D:It looks like an inverted mushroom, with two flexible arms. N:426:Roper @@ -6539,13 +10265,32 @@ B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 -F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | NEVER_MOVE | -F:ONLY_GOLD | DROP_2D2 | DROP_60 | DROP_1D2 | EVIL | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | IM_COLD | IM_FIRE | BASEANGBAND +F:BASEANGBAND +F:DROP_1D2 +F:DROP_2D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF F:NO_CUT -S:1_IN_5 | -S:BA_FIRE | BA_ELEC | BA_POIS | HASTE | -S:TRAPS | SHRIEK | HOLD | CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +S:1_IN_5 +S:BA_ELEC +S:BA_FIRE +S:BA_POIS +S:CONF +S:HASTE +S:HOLD +S:SHRIEK +S:TRAPS D:This creature look like a pillar of rock. However, a closer D:inspection reveals a glaring eye and powerful tentacles, D:which crush its prey and feed it to the creature's hungry @@ -6559,9 +10304,17 @@ E:1:1:1:2:0:1 O:0:100:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:FRIENDS | DROP_60 | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:WILD_MOUNTAIN | WILD_WASTE | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ZANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:ZANGBAND S:1_IN_6 S:SCARE D:Headless humanoid abominations created by a magical mutation. @@ -6576,12 +10329,17 @@ B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_SOUN D:A blurry canine form which seems to be moving as fast as the eye can D:follow. You can feel the earth resonating beneath your feet. @@ -6596,11 +10354,18 @@ B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | RES_NEXU | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | RES_TELE | NO_SLEEP | MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_SLEEP +F:RES_NEXU +F:RES_TELE +S:1_IN_5 S:BR_NEXU D:A locus of conflicting points coalesce to form the vague shape of a huge D:hound. Or is it just your imagination? @@ -6613,10 +10378,17 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | SMART | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:SMART D:A giant, brutish figure, as ugly as an orc, but with some of the D:intelligence of his half-human ancestry. @@ -6629,12 +10401,27 @@ O:5:85:0:5 B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:HIT:HURT:6d7 -F:UNIQUE | MALE | CAN_SPEAK | WILD_TOO | WILD_SWAMP | WILD_SHORE | -F:FORCE_MAXHP | ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | GIANT | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:GIANT +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO D:An ogre renowned for acts of surprising cruelty, Lokkak is the leader of a large D:band of violent ogres. @@ -6648,13 +10435,32 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a humanoid with an aura of power. You notice a sharp set of front D:teeth. @@ -6667,11 +10473,15 @@ O:0:0:0:0 B:BUTT:HURT:2d10 B:BITE:FIRE:2d10 B:GAZE:PARALYZE:2d6 -F:FORCE_SLEEP | SUSCEP_COLD | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:IM_FIRE | BASEANGBAND -S:1_IN_8 | -S:BR_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:SUSCEP_COLD +S:1_IN_8 +S:BR_FIRE D:The result of evil experiments, this travesty of nature should never be D:alive. It has three heads - goat, dragon and gorgon - all attached to a D:lion's body. @@ -6685,10 +10495,17 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:ANIMAL | IM_ACID | EVIL | ELDRITCH_HORROR | CAN_FLY | DROP_CORPSE | -F:MORTAL | ZANGBAND +F:ANIMAL +F:CAN_FLY +F:DROP_CORPSE +F:ELDRITCH_HORROR +F:EVIL +F:IM_ACID +F:MORTAL +F:ZANGBAND S:1_IN_6 -S:SCARE | HASTE +S:HASTE +S:SCARE D:A scaly bird larger than an elephant, with a horse-like head. N:435:Colbran @@ -6699,11 +10516,22 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:ELEC:3d8 B:HIT:ELEC:3d8 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | CAN_FLY | -F:IM_ELEC | IM_POIS | AURA_ELEC | REFLECTING | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ELEC +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +S:1_IN_3 S:BO_ELEC D:A man-shaped form of living lightning, sparks and shocks crackle all over D:this madly capering figure, as it leaps and whirls around and about you. @@ -6718,13 +10546,26 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:FORCE_SLEEP | CAN_FLY | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HEAL | BLIND | MIND_BLAST | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_4 +S:BLIND +S:DARKNESS +S:HEAL +S:MIND_BLAST D:A wraithly snake-like form with the torso of a beautiful woman, it is the D:most powerful of its kind. @@ -6738,10 +10579,16 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 -F:WILD_TOO | WILD_GRASS | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | ZANGBAND +F:BASH_DOOR +F:EVIL +F:INVISIBLE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:WILD_GRASS +F:WILD_TOO +F:ZANGBAND D:A creature who lives underground and eats surface dwellers that it catches D:with its poisonous tentacle, which is the only part of the creature that D:is ever seen. Perhaps it is better not to see the part which remains @@ -6756,8 +10603,10 @@ O:0:0:0:0 B:STING:POISON:8d1 B:STING:LOSE_STR:8d1 B:WAIL:TERRIFY:1d4 -F:BASH_DOOR | -F:EVIL | DEMON | ZANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:ZANGBAND D:Slaanesh's pet, a large scorpion-like creature with a human face and D:reptile skin. @@ -6771,11 +10620,27 @@ B:WAIL:UN_BONUS B:WAIL:EXP_20 B:WAIL:EAT_GOLD B:WAIL:EAT_ITEM -F:CHAR_MULTI | COLD_BLOOD | EVIL | NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | -F:UNDEAD | FORCE_MAXHP | IM_FIRE | IM_ELEC | IM_POIS | IM_ACID | EMPTY_MIND -F:NEVER_MOVE | JOKEANGBAND | HAS_LITE | NO_CUT +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:1_IN_15 -S:S_DEMON | SHRIEK +S:SHRIEK +S:S_DEMON D:Often found in graveyards. N:440:5-headed hydra @@ -6788,13 +10653,25 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_1D2 | DROP_4D2 | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | MOVE_BODY | CAN_SWIM | -F:ANIMAL | IM_POIS | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:SCARE | BA_POIS +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_POIS +S:SCARE D:A strange reptilian creature with five heads dripping venom. N:441:Barney the Dinosaur @@ -6807,13 +10684,37 @@ B:SHOW:LOSE_INT B:SHOW:LOSE_WIS B:CHARGE:EAT_GOLD B:CHARGE:EAT_GOLD -F:DROP_1D2 | DROP_90 | DROP_GOOD | DROP_GREAT | ONLY_ITEM | -F:EVIL | MALE | CAN_SPEAK | SMART | RES_TELE | CAN_SWIM | DROP_CORPSE -F:ANIMAL | IM_POIS | FORCE_MAXHP | UNIQUE | FORCE_SLEEP -F:MORTAL | JOKEANGBAND +F:ANIMAL +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MORTAL +F:ONLY_ITEM +F:RES_TELE +F:SMART +F:UNIQUE S:1_IN_3 -S:SHRIEK | CONF | S_HYDRA | SLOW | BLIND | DRAIN_MANA -S:BA_POIS | BR_CHAO | FORGET | DARKNESS | BR_NUKE +S:BA_POIS +S:BLIND +S:BR_CHAO +S:BR_NUKE +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:SHRIEK +S:SLOW +S:S_HYDRA D:The lovable purple reptile is making a guest appearance here. N:442:Black knight @@ -6825,12 +10726,22 @@ O:0:90:10:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLIND | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_8 +S:BLIND +S:CAUSE_3 +S:DARKNESS +S:SCARE D:He is a figure encased in deep black plate armour; he looks at you D:menacingly. @@ -6843,11 +10754,23 @@ O:0:0:0:0 B:BITE:PARALYZE:4d5 B:BITE:LOSE_DEX:4d5 B:BITE:LOSE_CON:4d5 -F:FORCE_SLEEP | AQUATIC | GOOD | ANIMAL | -F:IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | WILD_TOO | WILD_OCEAN -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BO_WATE | BO_COLD | BO_ICEE | BO_MANA +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:FORCE_SLEEP +F:GOOD +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_5 +S:BO_COLD +S:BO_ICEE +S:BO_MANA +S:BO_WATE D:Your mind is filled with admiration as you view this wondrous, D:magical seahorse. @@ -6859,12 +10782,26 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:9d9 B:HIT:HURT:9d9 -F:FORCE_SLEEP | -F:DROP_1D2 | TAKE_ITEM | WILD_TOO | WILD_SHORE | WILD_MOUNTAIN | -F:BASH_DOOR | OPEN_DOOR | MOVE_BODY | DROP_CORPSE | -F:EVIL | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_SHORE +F:WILD_TOO +S:1_IN_8 S:ARROW_4 D:A gigantic humanoid with but one eye. @@ -6876,12 +10813,25 @@ E:1:1:1:2:1:1 O:0:0:90:10 B:HIT:CONFUSE:5d5 B:HIT:TERRIFY:5d5 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | SMART | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLIND | MIND_BLAST | HOLD | CAUSE_3 | FORGET | S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_8 +S:BLIND +S:CAUSE_3 +S:FORGET +S:HOLD +S:MIND_BLAST +S:S_MONSTER D:He is using his supernatural talents to bring about your D:destruction. @@ -6894,9 +10844,14 @@ O:0:0:0:0 B:HIT:HURT:1d8 B:BITE:ACID:2d8 B:STING:POISON:1d8 -F:BASH_DOOR | DROP_CORPSE | -F:ANIMAL | IM_ACID | IM_POIS | CAN_SWIM | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:MORTAL D:It is a massive worm form, many feet in length. Its vast maw drips acid D:and poison. @@ -6910,10 +10865,17 @@ B:GAZE:TERRIFY:2d4 B:GAZE:BLIND:2d4 B:BUTT:HURT:2d6 B:BITE:HURT:2d12 -F:ONLY_GOLD | DROP_2D2 | DROP_CORPSE -F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_POIS -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:WILD_SWAMP +F:WILD_TOO D:A strange ox-like form with a huge head but a thin, weak neck, it looks D:like the creation of some deranged alchemist. @@ -6926,9 +10888,24 @@ O:0:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | KILL_WALL | RAND_50 | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RAND_50 S:MULTIPLY D:A sentient, moving section of wall. @@ -6940,15 +10917,29 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | TPORT | TELE_TO | BLIND | CONF | -S:BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:BLIND +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CONF +S:HASTE S:S_MONSTER +S:TELE_TO +S:TPORT D:A fat mage with glasses. And considerable power, too - as you can D:tell from the size of his hat. @@ -6960,13 +10951,26 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:CRUSH:LOSE_INT:2d6 B:GAZE:INSANITY:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:ONLY_ITEM | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND -S:1_IN_8 | -S:BLIND | HOLD | SCARE | MIND_BLAST | BRAIN_SMASH | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_8 +S:BLIND +S:BRAIN_SMASH +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE D:A humanoid form with a gruesome head, tentacular mouth, and piercing D:eyes. Claws reach out for you and you feel a presence invade your mind. @@ -6980,9 +10984,26 @@ B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 -F:FORCE_SLEEP | FORCE_MAXHP | KILL_BODY | KILL_ITEM | UNIQUE | REFLECTING | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | RES_TELE | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_BODY +F:KILL_ITEM +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +F:RES_TELE +F:UNIQUE D:It looks like a huge spiked roller. It was designed to keep this dungeon D:clean, and you are the biggest spot of dirt in sight. @@ -6995,11 +11016,24 @@ O:20:80:0:0 B:CLAW:POISON:2d4 B:CLAW:POISON:2d4 B:BITE:HURT:4d4 -F:FRIENDS | WILD_TOO | WILD_SHORE | DROP_CORPSE | -F:RAND_25 | -F:DROP_60 | DROP_90 | -F:CAN_SWIM | BASH_DOOR | ELDRITCH_HORROR | RES_TELE | -F:EVIL | DEMON | IM_FIRE | IM_COLD | IM_POIS | RES_WATE | CTHANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:ELDRITCH_HORROR +F:EVIL +F:FRIENDS +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:RAND_25 +F:RES_TELE +F:RES_WATE +F:WILD_SHORE +F:WILD_TOO D:"I thought their predominant color was a greyish-green, D:though they had white bellies. They were mostly shiny and D:slippery, but the ridges of their backs were scaly. Their @@ -7018,11 +11052,22 @@ B:GAZE:PARALYZE B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | -F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM | -F:MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_8 S:BR_POIS D:An evil reptile that preys on unsuspecting travellers. Its eyes stare D:deeply at you and your soul starts to wilt! @@ -7037,10 +11082,22 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:COLD:2d6 B:BITE:COLD:2d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | IM_COLD | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_TOO +F:WILD_WASTE D:He is a white troll with powerful clawed hands. N:455:Dhole @@ -7052,9 +11109,16 @@ O:0:0:0:0 B:SPIT:ACID:1d8 B:ENGULF:ACID:2d8 B:CRUSH:HURT:4d8 -F:ANIMAL | EVIL | KILL_WALL | IM_ACID | ELDRITCH_HORROR | -F:CAN_SWIM | FORCE_MAXHP | DROP_CORPSE | -F:MORTAL | CTHANGBAND +F:ANIMAL +F:CAN_SWIM +F:CTHANGBAND +F:DROP_CORPSE +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:KILL_WALL +F:MORTAL S:1_IN_6 S:BR_ACID D:A gigantic worm dripping with acid. "...even as he looked, one @@ -7071,13 +11135,32 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | GOOD | -F:ONLY_ITEM | DROP_2D2 | CAN_FLY | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | RES_TELE | -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | HASTE | BLIND | CONF | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:CONF +S:HASTE +S:HEAL +S:SCARE D:A lesser angel protected by an aura of holiness. Its muscular form looks D:extremely powerful next to your own frail body. @@ -7091,13 +11174,27 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | CONF | SCARE | CAUSE_2 | FORGET | -S:BO_ACID | BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID +S:1_IN_4 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_2 +S:CONF +S:FORGET +S:SCARE S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -7110,13 +11207,26 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:POISON:3d4 B:HIT:CONFUSE:3d4 -F:CHAR_MULTI | ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | ZANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_4 | -S:BLIND | CONF | SCARE | CAUSE_2 | BLINK | S_MONSTER +F:ATTR_ANY +F:ATTR_MULTI +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ZANGBAND +S:1_IN_4 +S:BLIND +S:BLINK +S:CAUSE_2 +S:CONF +S:MULTIPLY +S:SCARE +S:S_MONSTER D:It is a floor tile corrupted by chaos. N:459:Young blue dragon @@ -7128,14 +11238,26 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | -S:BR_ELEC -D:It has a form out of legend. Its still-tender scales are a +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_10 +S:BR_ELEC +S:SCARE +D:It has a form out of legend. Its still-tender scales are a D:deep blue in hue. Sparks crackle along its length. N:460:Young white dragon @@ -7147,13 +11269,26 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WASTE | -F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | SUSCEP_FIRE | -F:EVIL | DRAGON | IM_COLD | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +S:1_IN_10 S:BR_COLD +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:frosty white in hue. Icy blasts of cold air come from it as it breathes. @@ -7166,13 +11301,24 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_SWAMP | -F:DROP_2D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_POIS | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_POIS +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:deep green in hue. Foul gas seeps through its scales. @@ -7185,13 +11331,23 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_2D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | NO_CONF | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:NO_CONF +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_CONF +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:rich bronze hue, and its shape masks its true form. @@ -7205,9 +11361,19 @@ B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:POISON:1d20 B:CRUSH:HURT:2d9 -F:TROLL | EVIL | FRIENDS | OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:IM_POIS | IM_ACID | REGENERATE | ZANGBAND | REGENERATE | -S:1_IN_9 | BR_POIS +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_POIS +F:OPEN_DOOR +F:REGENERATE +F:REGENERATE +F:TROLL +F:ZANGBAND +S:1_IN_9 +S:BR_POIS D:Pale, bald, fat, hairless troll creatures. Ugly beyond description. D:Not to mention how bad their breath smells... @@ -7221,10 +11387,22 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:ONLY_GOLD | DROP_2D2 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:REFLECTING D:It is a massive statue of purest mithril. It looks expensive! N:465:Skeleton troll @@ -7236,10 +11414,20 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | TROLL | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:TROLL +F:UNDEAD D:It is a troll skeleton animated by dark dweomers. N:466:Skeletal tyrannosaur @@ -7252,10 +11440,20 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:LOSE_CON:4d6 B:GAZE:TERRIFY -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | ANIMAL | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | ZANGBAND | NO_CUT +F:ANIMAL +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +F:ZANGBAND D:It is the skeleton of a tyrannosaur, animated by dark dweomers. N:467:Beorn, the Shape-Changer @@ -7268,11 +11466,25 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 -F:UNIQUE | MALE | FORCE_MAXHP | FORCE_SLEEP | -F:BASH_DOOR | ANIMAL | MOVE_BODY | SMART | PET -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | BASEANGBAND -S:1_IN_6 | S_ANIMAL +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:PET +F:SMART +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_6 +S:S_ANIMAL D:Beorn is only occasionally seen in human form these days, preferring to D:appear in the shape of a giant black bear: he also prefers the company of D:beasts to that of humans. He has never taken kindly to strangers, even in @@ -7287,9 +11499,18 @@ O:0:0:0:0 B:CLAW:HURT:16d2 B:CLAW:HURT:16d2 B:BITE:HURT:4d10 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:Among the mightiest of birds, Thorondor is the messenger of the Valar, and D:brings news of Middle-earth to Valinor itself. Nothing that can be seen D:from the airs of the world is hidden from him. @@ -7301,10 +11522,15 @@ W:30:2:600:80 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:5d5 -F:RAND_25 | WILD_TOO | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_ELEC -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is a giant ant that crackles with energy. N:470:Grave wight @@ -7316,13 +11542,27 @@ O:0:50:50:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EXP_20 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNDEAD +S:1_IN_8 +S:CAUSE_3 +S:DARKNESS +S:SCARE D:It is a ghostly form with eyes that haunt you. N:471:Shadow drake @@ -7334,12 +11574,28 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:EXP_10:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | PASS_WALL | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BR_NETH | SLOW | CONF | SCARE | DARKNESS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +S:1_IN_6 +S:BR_NETH +S:CONF +S:DARKNESS +S:SCARE +S:SLOW D:It is a dragon-like form wrapped in shadow. Glowing red eyes shine in D:the dark, and it is surrounded by an aura of unearthly cold that chills D:the soul rather than the body. @@ -7354,10 +11610,17 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND -S:1_IN_5 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:WILD_TOO +F:WILD_WOOD +S:1_IN_5 S:ARROW_4 D:It is a winged lion's body with a human torso and a tail covered in D:vicious spikes. @@ -7369,10 +11632,15 @@ W:30:3:600:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 -F:RAND_25 | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FRIENDS +F:KILL_BODY +F:MORTAL +F:RAND_25 +F:WEIRD_MIND D:An armoured form moving with purpose. Powerful on its own, flee when D:hordes of them march. @@ -7384,8 +11652,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:5d8 B:BITE:HURT:5d8 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS | DROP_CORPSE -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:It is a beetle with deadly sharp cutting mandibles and a rock-hard D:carapace. @@ -7399,10 +11674,18 @@ B:BUTT:HURT:3d9 B:BUTT:HURT:3d9 B:BITE:POISON:1d10 B:KICK:HURT:2d4 -F:FORCE_SLEEP | ANIMAL | MOVE_BODY | WILD_TOO | WILD_WOOD | -F:BASH_DOOR | IM_POIS | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:WILD_TOO +F:WILD_WOOD +S:1_IN_8 S:BR_POIS D:A bull-like creature whose skin is made of steel plates. Watch out for D:its deadly breath! @@ -7417,10 +11700,17 @@ B:BITE:HURT:10d4 B:CLAW:HURT:2d7 B:CLAW:HURT:2d7 B:CLAW:HURT:2d7 -F:FORCE_SLEEP | -F:DROP_1D2 | TAKE_ITEM | -F:BASH_DOOR | OPEN_DOOR | DROP_CORPSE -F:EVIL | IM_POIS | IM_ACID | GIANT | ZANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:GIANT +F:IM_ACID +F:IM_POIS +F:OPEN_DOOR +F:TAKE_ITEM +F:ZANGBAND D:A hideous, beastly, four-armed unclean giant: "...large as a D:barrel... The eyes jutted two inches from each side, shaded by D:bony protuberances overgrown of the mouth. That mouth had great @@ -7436,12 +11726,27 @@ B:WAIL:TERRIFY B:TOUCH:EXP_20 B:CLAW:LOSE_INT:1d6 B:CLAW:LOSE_WIS:1d6 -F:FORCE_SLEEP | RAND_25 | DROP_60 | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | CAN_FLY | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:HOLD D:You don't believe in them. N:478:Death watch beetle @@ -7452,8 +11757,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:5d4 B:WAIL:TERRIFY:5d6 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle that produces a chilling sound. N:479:Mountain ogre @@ -7464,10 +11775,16 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR D:The largest breed of ogre, he is awesomely strong and awesomely ugly. N:480:Nexus quylthulg @@ -7476,11 +11793,21 @@ I:110:10d12:10:1:0 W:32:1:3000:300 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | RES_NEXU | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND -S:1_IN_1 | -S:BLINK | TELE_AWAY +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_NEXU +F:RES_TELE +S:1_IN_1 +S:BLINK +S:TELE_AWAY D:It is a very unstable, strange pulsing mound of flesh. N:481:Shelob, Spider of Darkness @@ -7493,16 +11820,41 @@ B:CLAW:POISON:5d6 B:CLAW:POISON:5d6 B:BITE:PARALYZE:5d10 B:STING:LOSE_STR:5d4 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | ESCORTS | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_RANDART -F:SMART | BASH_DOOR | IM_POIS | IM_ACID | -F:ANIMAL | SPIDER | EVIL | HURT_LITE | NO_SLEEP | BASEANGBAND -S:1_IN_4 | -S:HEAL | BLIND | SLOW | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:TRAPS | BR_DARK | BR_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:ESCORT +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +F:SPECIAL_GENE +F:SPIDER +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BR_DARK +S:BR_POIS +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:HEAL +S:SCARE +S:SLOW S:S_SPIDER +S:TRAPS D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the D:Unlight. Her poison is legendary, as is her ego. She normally guards the D:pass through Cirith Ungol, but occasionally goes out foraging for food to @@ -7517,10 +11869,21 @@ O:0:0:0:0 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 -F:IM_ACID | RES_WATE | AQUATIC | ANIMAL | IM_COLD | MOVE_BODY -F:FORCE_MAXHP | WILD_TOO | WILD_OCEAN | BASEANGBAND | COLD_BLOOD +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:MOVE_BODY +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO S:1_IN_8 -S:BR_ELEC | BR_ACID | BR_POIS +S:BR_ACID +S:BR_ELEC +S:BR_POIS D:Besides being capable of dragging whole ships underwater, D:this creature can also harm you with ranged attacks. @@ -7534,12 +11897,31 @@ B:CLAW:LOSE_STR:3d4 B:CLAW:DISEASE:3d4 B:CLAW:DISEASE:3d4 B:BITE:PARALYZE:3d5 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:DROP_1D2 | FORCE_MAXHP | ESCORT | FORCE_SLEEP | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD S:1_IN_7 -S:SCARE | HOLD | DARKNESS | SCARE | S_UNDEAD | ANIM_DEAD +S:ANIM_DEAD +S:DARKNESS +S:HOLD +S:SCARE +S:SCARE +S:S_UNDEAD D:Flesh is falling off in chunks from this decaying abomination. N:484:Doombat @@ -7551,9 +11933,16 @@ O:0:0:0:0 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 -F:WEIRD_MIND | BASH_DOOR | AURA_FIRE | CAN_FLY | DROP_CORPSE | -F:IM_FIRE | AI_ANNOY | -F:ANIMAL | MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:IM_FIRE +F:MORTAL +F:WEIRD_MIND D:It is a fast moving creature of chaos, a gigantic black bat D:surrounded by flickering bright red flames. @@ -7566,11 +11955,18 @@ O:0:100:0:0 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR D:A humanoid clothed in black who moves with blinding speed. N:486:Memory moss @@ -7581,11 +11977,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:1d4 B:HIT:CONFUSE:1d4 -F:FORCE_SLEEP | NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_6 S:FORGET D:A mass of vegetation. You don't remember seeing anything like it D:before. @@ -7598,11 +12000,31 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_ELEC | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | IM_COLD | IM_ELEC | MALE | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLINK | TELE_TO | CONF | SCARE | BO_ELEC | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_8 +S:BA_ELEC +S:BLINK +S:BO_ELEC +S:CONF +S:SCARE +S:TELE_TO D:It is a twenty-five foot tall giant wreathed in lightning. N:488:Spectator @@ -7614,12 +12036,22 @@ O:0:0:0:0 B:GAZE:PARALYZE:1d4 B:GAZE:CONFUSE:1d4 B:BITE:HURT:1d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:STUPID | EMPTY_MIND | CAN_FLY | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND -S:1_IN_6 | -S:FORGET | CAUSE_2 | HOLD | SLOW +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_6 +S:CAUSE_2 +S:FORGET +S:HOLD +S:SLOW D:A lesser relative of the beholder: a globular body with a large toothy mouth, D:a large central eye, and four smaller eyes on stalks protruding from the top D:of its body. @@ -7633,14 +12065,33 @@ O:20:0:80:0 B:BITE:HURT:5d5 B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 -F:UNIQUE | CAN_SPEAK | -F:FORCE_MAXHP | NONLIVING | NO_CONF | NO_FEAR | -F:ESCORT | ESCORTS | ELDRITCH_HORROR | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | IM_COLD | IM_POIS | DEMON | CTHANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE S:1_IN_5 -S:S_UNDEAD | MIND_BLAST | CAUSE_3 | SCARE | BO_WATE | S_KIN +S:BO_WATE +S:CAUSE_3 +S:MIND_BLAST +S:SCARE +S:S_KIN +S:S_UNDEAD D:A lizard-like Great Old One worshipped by the men of Sarnath. N:490:Biclops @@ -7651,12 +12102,23 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:10d9 B:HIT:HURT:10d9 -F:FORCE_SLEEP | -F:DROP_1D2 | TAKE_ITEM | DROP_CORPSE | -F:BASH_DOOR | OPEN_DOOR | MOVE_BODY | -F:EVIL | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | GIANT | -F:MORTAL | ZANGBAND | HAS_LITE -S:1_IN_8 | +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:OPEN_DOOR +F:TAKE_ITEM +F:ZANGBAND +S:1_IN_8 S:ARROW_4 D:Oh, no! Aaargh! It is the most unnatural, most disgusting D:creature imaginable: a two-eyed cyclops! This perversion @@ -7672,11 +12134,19 @@ B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:MALE | -F:FRIENDS | -F:ONLY_ITEM | DROP_90 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TROLL D:A huge, ugly, half-human in search of plunder. N:492:Ivory monk @@ -7689,9 +12159,22 @@ B:KICK:HURT:8d1 B:HIT:HURT:8d4 B:KICK:HURT:8d1 B:HIT:HURT:8d4 -F:OPEN_DOOR | BASH_DOOR | NO_FEAR | NO_CONF | NO_SLEEP | DROP_SKELETON | -F:DROP_CORPSE | MALE | DROP_60 | DROP_1D2 | IM_FIRE | IM_COLD | IM_POIS | -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND D:A monk trained in the most lethal martial arts. N:493:Bert the Stone Troll @@ -7703,12 +12186,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bill and Tom. @@ -7721,12 +12223,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bert and Tom. @@ -7739,12 +12260,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bert and Bill. @@ -7758,10 +12298,20 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | IM_POIS | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL D:He is a vicious monster, feared for his ferocity. N:497:Anti-paladin @@ -7773,11 +12323,31 @@ O:0:50:50:0 B:HIT:HURT:2d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | OPEN_DOOR | BASH_DOOR | TAKE_ITEM | DROP_1D2 | ONLY_ITEM | -F:EVIL | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | DROP_SKELETON | DROP_CORPSE -F:MORTAL | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:ZANGBAND S:1_IN_4 -S:HOLD | SCARE | BLIND | CAUSE_3 | TRAPS | DARKNESS | FORGET | HASTE +S:BLIND +S:CAUSE_3 +S:DARKNESS +S:FORGET +S:HASTE +S:HOLD +S:SCARE +S:TRAPS D:An embodiment of all the cardinal vices, he beholds you scornfully. N:498:Chaos master @@ -7790,15 +12360,30 @@ B:HIT:HURT:10d2 B:KICK:HURT:10d2 B:PUNCH:HURT:10d2 B:KICK:HURT:10d2 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | EVIL | -F:ONLY_ITEM | DROP_1D2 | ATTR_ANY | DROP_SKELETON | DROP_CORPSE -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP -F:MORTAL | ZANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | -S:S_SPIDER | BA_CHAO | S_DEMON +F:ATTR_ANY +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:ZANGBAND +S:1_IN_6 +S:BA_CHAO +S:HEAL +S:S_DEMON +S:S_SPIDER D:An adept of chaos, feared for his skill of invoking raw Chaos. N:499:Barrow wight @@ -7810,12 +12395,27 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FRIENDS | DROP_60 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:HOLD | SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:HOLD +S:SCARE D:It is a ghostly nightmare of an entity. N:500:Skeleton ettin @@ -7828,11 +12428,21 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:1d5 B:BITE:HURT:1d5 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | TROLL | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:TROLL +F:UNDEAD D:It is the animated skeleton of a massive two-headed troll. N:501:Chaos drake @@ -7844,15 +12454,30 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:ATTR_MULTI | ATTR_ANY | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | RES_DISE | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | -F:IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_DISE | BR_CHAO +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +S:1_IN_6 +S:BR_CHAO +S:BR_DISE +S:CONF +S:SCARE +S:SLOW D:A dragon twisted by the forces of chaos. It seems first ugly, then fair, D:as its form shimmers and changes in front of your eyes. @@ -7865,14 +12490,29 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:DRAGON | EVIL | -F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_SOUN | BR_SHAR +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:SLOW D:This dragon is clever and cunning. It laughs at your puny efforts to D:disturb it. @@ -7885,15 +12525,33 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | RES_DISE | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE -F:EVIL | DRAGON | CAN_FLY | -F:IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_SOUN | BR_SHAR | BR_DISE | BR_CHAO +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +S:1_IN_6 +S:BR_CHAO +S:BR_DISE +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:SLOW D:A mighty dragon, the balance drake seeks to maintain the Cosmic Balance, D:and despises your feeble efforts to destroy evil. @@ -7906,32 +12564,55 @@ O:40:50:10:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | -F:INVISIBLE | PASS_WALL | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_LITE | BR_DARK | BR_CONF -D:A dragon of great power with control over light and dark, the -D:ethereal drake's eyes glare with white hatred from the shadows. - -N:505:Groo, the Wanderer -G:p:U -I:120:13d113:20:70:50 -W:35:7:5000:2000 -E:1:1:1:2:1:1 +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +S:1_IN_6 +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF +S:SCARE +S:SLOW +D:A dragon of great power with control over light and dark, the +D:ethereal drake's eyes glare with white hatred from the shadows. + +N:505:Groo, the Wanderer +G:p:U +I:120:13d113:20:70:50 +W:35:7:5000:2000 +E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:9d1 B:HIT:HURT:6d5 B:HIT:HURT:25d1 B:HIT:HURT:6d5 -F:UNIQUE | MALE | WEIRD_MIND | CAN_SPEAK | -F:FORCE_MAXHP | WILD_TOO | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:DROP_CHOSEN | -F:OPEN_DOOR | BASH_DOOR | -F:IM_COLD | IM_POIS | ZANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WEIRD_MIND +F:WILD_TOO +F:ZANGBAND D:He who laughs at Groo's brains will find there is nothing to laugh D:about... erm, nobody laughs at Groo and lives. @@ -7944,12 +12625,25 @@ O:0:100:0:0 B:HIT:HURT:7d10 B:HIT:HURT:7d10 B:HIT:EAT_GOLD:2d10 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | WILD_TOO | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | IM_COLD | IM_POIS | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO D:Big, brawny, powerful and with a greed for gold. N:507:Shade @@ -7961,13 +12655,29 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:FORGET +S:HOLD D:A shadowy form clutches at you from the darkness. A powerful undead with D:a deadly touch. @@ -7980,13 +12690,28 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_WIS:5d5 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY | -F:COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:FORGET +S:HOLD D:A phantasmal shrieking spirit. Its wail drives the intense cold of pure D:evil deep within your body. @@ -8000,11 +12725,25 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HURT:2d2 B:HIT:HURT:2d2 -F:MALE | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | REGENERATE | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO D:He is a troll that reeks of brackish water and mud. N:510:Fire elemental @@ -8015,12 +12754,28 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | AURA_FIRE | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BO_FIRE D:It is a towering inferno of flames. @@ -8034,13 +12789,38 @@ B:HIT:HURT:4d3 B:HIT:HURT:3d8 B:HIT:HURT:4d3 B:HIT:HURT:3d8 -F:FORCE_SLEEP | FORCE_MAXHP | NO_FEAR | GOOD | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | REFLECTING | RES_TELE -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | HASTE | BLIND | SCARE | MIND_BLAST | BO_FIRE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_2D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:BO_FIRE +S:HASTE +S:HEAL +S:MIND_BLAST +S:SCARE S:S_MONSTERS D:It is an angel moving very quickly, wielding a holy war hammer and casting D:a volley of powerful spells in your direction. @@ -8054,12 +12834,25 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | CAN_FLY | -F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL | -F:IM_POIS | IM_ACID | IM_FIRE | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +S:1_IN_6 S:BO_COLD D:It is a towering tempest of water. @@ -8073,14 +12866,29 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d4 B:BITE:HURT:4d4 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | ATTR_MULTI | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:IM_ELEC | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BR_ACID | BR_POIS | BR_COLD | BR_FIRE | BR_ELEC +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS D:Shimmering in rainbow hues, this hound is beautiful and deadly. N:514:Invisible stalker @@ -8092,13 +12900,23 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:RAND_50 | -F:RES_TELE | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_ELEC +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:POWERFUL +F:RAND_50 +F:RES_TELE D:It is impossible to define its form but its violence is legendary. N:515:Carrion crawler @@ -8109,9 +12927,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:PARALYZE:2d6 B:STING:PARALYZE:2d6 -F:RAND_25 | FRIENDS | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MORTAL +F:RAND_25 +F:WEIRD_MIND D:A hideous centipede covered in slime and with glowing tentacles around its D:head. @@ -8125,12 +12949,22 @@ B:HIT:HURT:2d8 B:HIT:HURT:3d4 B:HIT:EAT_GOLD:4d4 B:HIT:EAT_ITEM:4d5 -F:MALE | -F:DROP_90 | DROP_2D2 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM S:1_IN_6 -S:TRAPS | ARROW_2 | BLINK +S:ARROW_2 +S:BLINK +S:TRAPS D:Cool and confident, fast and lithe; protect your possessions quickly! N:517:The Watcher in the Water @@ -8142,11 +12976,36 @@ O:50:50:0:0 B:CRUSH:ACID:8d8 B:CRUSH:POISON:8d8 B:CRUSH:PARALYZE:8d8 -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | AQUATIC | ANIMAL | -F:IM_ACID | IM_COLD | IM_POIS | RES_WATE | RES_TELE | DROP_CORPSE | -F:NO_CONF | NO_FEAR | EVIL | COLD_BLOOD | BASEANGBAND | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_1D2 | SPECIAL_GENE | DROP_RANDART -S:1_IN_5 | BA_WATE | BO_WATE | HOLD | BR_POIS | BO_ICEE | TELE_TO +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:ONLY_ITEM +F:RES_TELE +F:RES_WATE +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_5 +S:BA_WATE +S:BO_ICEE +S:BO_WATE +S:BR_POIS +S:HOLD +S:TELE_TO D:A vile creature which seems to consist mostly of tentacles, it seeks to D:drag people to their doom in the water. Few have ever escaped its grasp. @@ -8160,13 +13019,33 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d8 B:TOUCH:LOSE_DEX:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLINK | TELE_TO | TELE_AWAY | BLIND | HOLD | SLOW | SCARE | -S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:UNDEAD +S:1_IN_4 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:SLOW +S:TELE_AWAY +S:TELE_TO D:It is a skeletal form dressed in robes. It radiates vastly evil power. N:519:Gas spore @@ -8176,9 +13055,15 @@ W:34:4:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:DISEASE:30d2 -F:FORCE_SLEEP | -F:STUPID | EMPTY_MIND | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:From a distance, this creature is often mistaken for the D:much more dangerous beholder. @@ -8192,14 +13077,33 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_6 | -S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | -S:DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a humanoid form dressed in robes. Power emanates from its chilling D:frame. @@ -8213,14 +13117,36 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | CAN_FLY | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | INVISIBLE | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | -F:BASEANGBAND | NO_CUT -S:1_IN_6 | -S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | -S:DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:The oriental vampire can transform into a mist at will. N:522:Greater mummy @@ -8233,15 +13159,46 @@ B:CLAW:LOSE_CON:3d6 B:CLAW:DISEASE:3d6 B:GAZE:EXP_40:3d4 B:GAZE:TERRIFY:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | NO_FEAR | EVIL | UNDEAD |COLD_BLOOD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_TELE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:HEAL | HASTE | BLIND | SCARE | S_UNDEAD | ANIM_DEAD | -S:BA_POIS | BA_NETH | BA_COLD | DRAIN_MANA | -S:MIND_BLAST | CAUSE_3 | DARKNESS | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:TAKE_ITEM +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_COLD +S:BA_NETH +S:BA_POIS +S:BLIND +S:CAUSE_3 +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HASTE +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_UNDEAD D:Once a powerful ruler, now an even more powerful undead menace. N:523:Bloodletter of Khorne @@ -8253,9 +13210,22 @@ O:0:100:0:0 B:HIT:EXP_20:13d1 B:HIT:EXP_20:13d1 B:HIT:EXP_20:13d1 -F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_60 | REGENERATE | -F:ONLY_ITEM | DROP_CHOSEN | NO_FEAR | NONLIVING | -F:EVIL | IM_POIS | IM_COLD | IM_FIRE | DEMON | ZANGBAND | HAS_LITE +F:DEMON +F:DROP_60 +F:DROP_CHOSEN +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:ZANGBAND D:Slender, red-skinned demons twisting in nightmarish shapes. D:They are armed with hellblades, which will suck the life from D:your body. @@ -8268,9 +13238,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:STING:POISON:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant grey scorpion. It looks poisonous. N:525:Earth elemental @@ -8282,12 +13256,24 @@ O:0:0:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_8 | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +S:1_IN_8 S:BO_ACID D:It is a towering form composed of rock with fists of awesome power. @@ -8300,12 +13286,25 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:CONFUSE:1d4 B:HIT:HURT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | CAN_FLY | -F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +S:1_IN_8 S:BO_ELEC D:It is a towering tornado of winds. @@ -8315,10 +13314,17 @@ I:110:32d8:2:24:70 W:27:1:0:140 B:SPORE:ELEC:5d4 B:SPORE:ELEC:5d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_ELEC | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor, glowing and crackling with sparks. N:528:Gargoyle @@ -8330,12 +13336,26 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:1d6 -F:DROP_60 | ONLY_GOLD | EVIL | DEMON | FRIENDS | HURT_LITE | -F:WILD_TOO | WILD_MOUNTAIN | WILD_WASTE | -F:IM_POIS | IM_FIRE | IM_COLD | IM_ELEC | HURT_ROCK | NONLIVING | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DEMON +F:DROP_60 +F:EVIL +F:FRIENDS +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CUT +F:ONLY_GOLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE S:1_IN_12 -S:BR_ELEC | BR_FIRE +S:BR_ELEC +S:BR_FIRE D:A weird demon creature with a stone-like skin. N:529:Malicious leprechaun @@ -8346,12 +13366,22 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD | -F:HURT_LITE | EVIL | OPEN_DOOR | MALE | -F:MORTAL | BASEANGBAND -S:MULTIPLY | -S:1_IN_6 | -S:BLINK | TPORT | TELE_TO | CAUSE_1 +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:INVISIBLE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +S:1_IN_6 +S:BLINK +S:CAUSE_1 +S:MULTIPLY +S:TELE_TO +S:TPORT D:This little creature has a fiendish gleam in its eyes. N:530:Eog golem @@ -8364,10 +13394,22 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:ONLY_GOLD | DROP_2D2 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:REFLECTING D:It is a massive deep brown statue, striding towards you with an D:all-too-familiar purpose. Your magic surprisingly feels much less D:powerful now. @@ -8379,9 +13421,24 @@ W:35:2:0:200 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:SHATTER:100d2 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | REFLECTING | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | RES_TELE | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +F:RES_TELE +F:UNIQUE D:A shining machine of death and destruction. N:532:Dagashi @@ -8394,11 +13451,18 @@ B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 B:HIT:POISON:3d4 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR D:A human warrior, moving with lightning speed. N:533:Headless ghost @@ -8411,13 +13475,29 @@ B:TOUCH:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:5d5 B:CLAW:LOSE_WIS:5d5 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY | -F:COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | DRAIN_MANA | SCARE | BO_COLD | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_COLD +S:DRAIN_MANA +S:FORGET +S:SCARE D:A phantasmal apparition with no head. N:534:Dread @@ -8429,13 +13509,30 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_60 | DROP_2D2 | -F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_NETH +S:CONF +S:DRAIN_MANA +S:HOLD D:It is a form that screams its presence against the eye. Death incarnate, D:its hideous black body seems to struggle against reality as the universe D:itself struggles to banish it. @@ -8448,8 +13545,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d6 B:STING:POISON:1d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | ELDRITCH_HORROR | DROP_CORPSE | -F:ANIMAL | SPIDER | CTHANGBAND +F:ANIMAL +F:BASH_DOOR +F:CTHANGBAND +F:DROP_CORPSE +F:ELDRITCH_HORROR +F:FRIENDS +F:SPIDER +F:WEIRD_MIND D:Bloated purple spiders with long, bristly legs. N:536:Gauth @@ -8462,10 +13565,21 @@ B:GAZE:UN_BONUS:5d2 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_POWER:5d2 B:GAZE:UN_POWER:5d2 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | EVIL | BASEANGBAND | MORTAL -S:1_IN_5 | -S:CAUSE_2 | TELE_AWAY | BA_COLD | BO_ELEC | HOLD | DRAIN_MANA +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +S:1_IN_5 +S:BA_COLD +S:BO_ELEC +S:CAUSE_2 +S:DRAIN_MANA +S:HOLD +S:TELE_AWAY D:Another lesser relative of the beholder, this six-eyed creature feeds on magic. N:537:Smoke elemental @@ -8476,13 +13590,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:2d6 B:ENGULF:HURT:2d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_FLY | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:DARKNESS | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +S:1_IN_5 +S:BO_FIRE +S:DARKNESS D:It is a towering blackened form, crackling with heat. N:538:Olog @@ -8495,9 +13621,19 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:HURT:2d3 B:BITE:HURT:2d3 -F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_60 | REGENERATE | -F:SMART | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_POIS +F:OPEN_DOOR +F:REGENERATE +F:SMART +F:TROLL D:It is a massive troll, more intelligent than most of its kind, with needle- D:sharp fangs. @@ -8509,9 +13645,20 @@ E:1:1:1:2:1:1 O:100:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_90 | -F:SMART | EVIL | IM_POIS | IM_COLD | MALE | DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART S:1_IN_3 S:ARROW_4 D:A rebel halfling who has rejected the halfling tradition of archery. @@ -8526,11 +13673,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_GRAV D:Unfettered by the usual constraints of gravity, these unnatural creatures D:are walking on the walls and even the ceiling! The earth suddenly feels @@ -8546,11 +13699,26 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | TAKE_ITEM | COLD_BLOOD | -F:DROP_1D2 | DROP_4D2 | CAN_SWIM | -F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A disgusting animated blob of destruction. Flee its gruesome hunger! N:542:Inertia hound @@ -8563,11 +13731,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_INER D:Bizarrely, this hound seems to be hardly moving at all, yet it approaches D:you with deadly menace. It makes you tired just to look at it. @@ -8582,12 +13756,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_WALL D:A deep brown shape is visible before you, its canine form striking you with D:an almost physical force. The dungeon floor buckles as if struck by a @@ -8600,10 +13779,19 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:6d6 -F:FORCE_SLEEP | RAND_50 | NONLIVING | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_4 S:BR_SHAR D:A howling blast of razor-sharp mountain fragments, kept intact by perilous D:magics. @@ -8617,13 +13805,29 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_FIRE | CAN_SWIM | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_ACID +S:BO_ACID D:It is a towering mass of filth, an eyesore of ooze. N:546:Young black dragon @@ -8635,13 +13839,23 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_SWAMP | -F:DROP_3D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ACID | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_ACID +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:darkest black hue. Acid drips from its body. @@ -8654,8 +13868,11 @@ O:0:0:0:0 B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 -F:BASH_DOOR | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL D:A massive elephantine form with eyes twisted by madness. N:548:Giant fire ant @@ -8666,10 +13883,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | SUSCEP_COLD | -F:ANIMAL | IM_FIRE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:IM_FIRE +F:KILL_BODY +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND D:A giant ant covered in shaggy fur. Its powerful jaws glow with heat. N:549:Mature white dragon @@ -8681,13 +13905,28 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND | -F:HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +S:1_IN_9 S:BR_COLD +S:SCARE D:A large dragon, scales gleaming bright white. N:550:Xorn @@ -8700,11 +13939,20 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL D:A huge creature of the element Earth. Able to merge with its element, it D:has four huge arms protruding from its enormous torso. @@ -8718,12 +13966,24 @@ B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:BITE:HURT:4d10 B:SPIT:ACID:4d8 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | MOVE_BODY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | IM_COLD | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TAKE_ITEM +F:TROLL +F:UNIQUE D:A massive and cruel troll of great power, drool slides caustically down D:his muscular frame. Despite his bulk, he strikes with stunning speed. @@ -8737,9 +13997,19 @@ B:CRUSH:HURT:4d8 B:CRUSH:HURT:4d8 B:CRUSH:HURT:4d8 B:BITE:EXP_40:3d9 -F:FORCE_MAXHP | OPEN_DOOR | DROP_60 | WILD_TOO | WILD_SWAMP | -F:SMART | BASH_DOOR | -F:EVIL | GIANT | IM_POIS | CAN_FLY | CTHANGBAND | NO_CUT +F:BASH_DOOR +F:CAN_FLY +F:CTHANGBAND +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:GIANT +F:IM_POIS +F:NO_CUT +F:OPEN_DOOR +F:SMART +F:WILD_SWAMP +F:WILD_TOO D:"Two eyes, the colour of a thin, yellow wine, were set high in the D:thing's body; though it had no separate head. A mouthing, obscene slit, D:filled with fangs lay just beneath the eyes. It had no nose or ears... @@ -8758,13 +14028,24 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_5 | -S:FORGET | MIND_BLAST +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +S:1_IN_5 +S:FORGET +S:MIND_BLAST D:An unholy creature of darkness, the aura emanating from this evil being D:saps your very soul. @@ -8777,13 +14058,27 @@ O:0:50:50:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:HOLD | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_7 +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE D:A tangible but ghostly form, made of grey fog. The air around it feels D:deathly cold. @@ -8797,14 +14092,30 @@ B:GAZE:PARALYZE B:CLAW:LOSE_CON:1d10 B:CLAW:LOSE_CON:1d10 B:GAZE:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:CONF | SCARE | CAUSE_3 | DARKNESS -D:Back from the grave, to wreak vengeance upon the living. A skeletal figure +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_7 +S:CAUSE_3 +S:CONF +S:DARKNESS +S:SCARE +D:Back from the grave, to wreak vengeance upon the living. A skeletal figure D:wearing a black robe, with eyes that burn with undying hatred. N:556:Young multi-hued dragon @@ -8816,15 +14127,33 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:3d8 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_1D2 | DROP_3D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_8 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:SCARE D:It has a form out of legend. Beautiful scales of shimmering D:and magical colours cover it. @@ -8834,14 +14163,39 @@ I:120:50d15:20:150:15 W:36:4:0:1500 E:0:0:0:0:0:0 O:20:0:80:0 -F:NEVER_MOVE | NEVER_BLOW | NONLIVING | -F:FORCE_SLEEP | DROP_90 | DROP_GOOD | EVIL | COLD_BLOOD | EMPTY_MIND | -F:FORCE_MAXHP | NO_CONF | NO_FEAR | NO_SLEEP | CHAR_MULTI | -F:IM_ACID | IM_POIS | IM_COLD | IM_ELEC | SUSCEP_FIRE | RES_NETH | RES_TELE | -F:ZANGBAND | HAS_LITE | NO_CUT -S:1_IN_2 | -S:BO_ACID | BR_FIRE | BO_MANA | BR_COLD | BR_POIS | -S:BO_WATE | BA_POIS | BR_NETH +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_90 +F:DROP_GOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_NETH +F:RES_TELE +F:SUSCEP_FIRE +F:ZANGBAND +S:1_IN_2 +S:BA_POIS +S:BO_ACID +S:BO_MANA +S:BO_WATE +S:BR_COLD +S:BR_FIRE +S:BR_NETH +S:BR_POIS D:A sentient arcane tome casting spells with malevolent intent. N:558:Colossus @@ -8854,12 +14208,22 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NONLIVING | REFLECTING | -F:NO_CONF | NO_SLEEP | NO_FEAR -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING S:1_IN_8 S:ARROW_4 D:An enormous construct resembling a titan made from stone. It strides @@ -8875,13 +14239,24 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_3D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:EVIL | DRAGON | BASEANGBAND | NO_STUN | HAS_LITE | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_STUN +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_SOUN +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:tarnished gold hue, and light is reflected from its form. @@ -8894,14 +14269,26 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_4D2 | DROP_CORPSE -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 S:BR_ELEC +S:SCARE D:A large dragon, scales tinted deep blue. N:561:Mature green dragon @@ -8913,14 +14300,26 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_4D2 | DROP_CORPSE | -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 S:BR_POIS +S:SCARE D:A large dragon, scales tinted deep green. N:562:Mature bronze dragon @@ -8932,13 +14331,25 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_4D2 | CAN_FLY | -F:BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_9 S:BR_CONF +S:CONF +S:SCARE D:A large dragon with scales of rich bronze. N:563:Young red dragon @@ -8950,13 +14361,26 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD | -F:DROP_3D2 | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE -F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:OPEN_DOOR +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_10 S:BR_FIRE +S:SCARE D:It has a form out of legend. Its still-tender scales are a D:deepest red hue. Heat radiates from its form. @@ -8969,10 +14393,19 @@ O:0:100:0:0 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:LOSE_CON:3d4 -F:MALE | -F:DROP_1D2 | FRIENDS | INVISIBLE | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | -F:EVIL | NO_CONF | NO_SLEEP | ZANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND D:A dark elven assassin, so stealthy that he is almost impossible to see. N:565:Trapper @@ -8985,11 +14418,19 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:PARALYZE:15d1 B:HIT:PARALYZE:15d1 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:INVISIBLE | EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP D:This creature traps unsuspecting victims D:and paralyzes them, to be slowly digested later. @@ -9002,12 +14443,23 @@ O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:GAZE:EXP_20 -F:FORCE_SLEEP | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_FIRE | NONLIVING | -F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FORCE_SLEEP F:HAS_LITE -S:1_IN_4 | -S:BO_FIRE | BA_FIRE | +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:BA_FIRE +S:BO_FIRE S:S_DEMON D:It is a humanoid form composed of flames and hatred. @@ -9018,10 +14470,19 @@ W:36:5:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:TIME:30d2 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT +F:ATTR_CLEAR +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It was left here to be used against intruders. N:568:Mezzodaemon @@ -9032,12 +14493,24 @@ E:1:1:1:0:1:1 O:0:0:0:0 B:CLAW:HURT:5d6 B:CLAW:HURT:5d6 -F:FORCE_SLEEP | PASS_WALL | INVISIBLE | -F:IM_POIS | IM_COLD | IM_ACID | IM_FIRE | -F:NO_SLEEP | NO_CONF | NO_STUN | NONLIVING | -F:EVIL | DEMON | BASEANGBAND -S:1_IN_4 | -S:BLINK | DARKNESS | S_DEMON +F:BASEANGBAND +F:DEMON +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:PASS_WALL +S:1_IN_4 +S:BLINK +S:DARKNESS +S:S_DEMON D:An ugly demon with insect-like extremities and large bulbous eyes. N:569:Elder thing @@ -9050,12 +14523,29 @@ B:CRUSH:HURT:4d6 B:CRUSH:HURT:4d6 B:CRUSH:HURT:4d6 B:TOUCH:LOSE_WIS -F:FORCE_SLEEP | OPEN_DOOR | BASH_DOOR | ELDRITCH_HORROR | NONLIVING | -F:EVIL | DEMON | IM_POIS | IM_ACID | NO_CONF | NO_SLEEP | RES_TELE | -F:CAN_SWIM | CTHANGBAND -S:1_IN_4 | -S:SCARE | TELE_AWAY | BA_NUKE | CAUSE_4 | BA_POIS | -S:CONF | S_DEMON | S_UNDEAD +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +S:1_IN_4 +S:BA_NUKE +S:BA_POIS +S:CAUSE_4 +S:CONF +S:SCARE +S:S_DEMON +S:S_UNDEAD +S:TELE_AWAY D:"...some ridged barrel-shaped objects with thin D:horizontal arms radiating spoke-like from a central ring and with D:vertical knobs or bulbs projecting from the head and base of the @@ -9072,13 +14562,27 @@ O:0:0:0:0 B:TOUCH:COLD:4d3 B:HIT:HURT:4d6 B:TOUCH:COLD:4d3 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | AURA_COLD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_COLD | IM_ELEC | CAN_SWIM | IM_POIS | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ICEE | BA_COLD +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +S:1_IN_5 +S:BA_COLD +S:BO_ICEE D:It is a towering glacier of ice. N:571:Necromancer @@ -9089,16 +14593,32 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | TPORT | TELE_TO | BLIND | HOLD | SCARE | CAUSE_3 | -S:BO_NETH | MIND_BLAST | FORGET | -S:S_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:FORGET +S:HASTE +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_UNDEAD +S:TELE_TO +S:TPORT D:A gaunt figure, clothed in black robes. N:572:The Greater hell magic mushroom were-quylthulg @@ -9111,16 +14631,55 @@ B:GAZE:EXP_40:4d8 B:GAZE:EXP_40:4d8 B:CRUSH:ACID:8d8 B:CRUSH:ACID:8d8 -F:FORCE_MAXHP | FORCE_SLEEP | UNIQUE | NO_STUN | NO_CONF | -F:NO_SLEEP| EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | -F:IM_COLD | RES_NETH | RES_WATE | RES_PLAS | RES_DISE | SMART | -F:RES_NEXU | NONLIVING | RES_TELE | KILL_WALL | ELDRITCH_HORROR | -F:BASH_DOOR | DEMON | COLD_BLOOD | ANIMAL | CAN_SWIM | -F:DROP_GOOD | DROP_GREAT | ONLY_ITEM | DROP_2D2 | JOKEANGBAND | NO_CUT -S:1_IN_3 | -S:BLINK | SLOW | SCARE | DARKNESS | HEAL | ANIM_DEAD -S:TPORT | TELE_AWAY | HASTE | S_MONSTER | DRAIN_MANA | -S:S_UNDEAD | S_DEMON | S_DRAGON | S_KIN +F:ANIMAL +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BLINK +S:DARKNESS +S:DRAIN_MANA +S:HASTE +S:HEAL +S:SCARE +S:SLOW +S:S_DEMON +S:S_DRAGON +S:S_KIN +S:S_MONSTER +S:S_UNDEAD +S:TELE_AWAY +S:TPORT D:This unholy abomination will crush you too. Flee while you can! N:573:Lorgan, Chief of the Easterlings @@ -9133,14 +14692,26 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:TELE_TO | S_MONSTERS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:S_MONSTERS +S:TELE_TO D:A mighty warrior from the east, Lorgan hates everything that he cannot D:control. @@ -9154,7 +14725,11 @@ B:GAZE:HURT:10d10 B:GAZE:UN_BONUS:5d2 B:GAZE:EXP_40:5d2 B:GAZE:PARALYZE:5d2 -F:FORCE_MAXHP | BASH_DOOR | EVIL | CAN_FLY | ZANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EVIL +F:FORCE_MAXHP +F:ZANGBAND D:It has two eyestalks and a large central eye. Its gaze can kill. N:575:Mummified troll @@ -9165,11 +14740,23 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_MAXHP | -F:DROP_60 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:UNDEAD D:It is a massive figure clothed in wrappings. You are wary of its massive D:fists. @@ -9181,13 +14768,24 @@ B:ENGULF:EXP_80:5d5 B:ENGULF:UN_POWER:5d5 B:ENGULF:UN_BONUS:5d5 B:HIT:LOSE_ALL:5d5 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_50 | RAND_25 | NONLIVING | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_TIME | BR_DISE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_DISE +S:BR_TIME D:Howling through the disintegrating dungeon, this awesome whirlpool of Unmagic D:rips the enchantments from everything it touches. @@ -9201,13 +14799,31 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d10 B:TOUCH:LOSE_DEX:2d10 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | RES_TELE | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | TELE_AWAY | TELE_LEVEL | -S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO D:It is a skeletal form dressed in robes. It looks evil and devious... N:578:Chaos butterfly @@ -9219,12 +14835,19 @@ O:0:0:0:0 B:CLAW:HURT:3d7 B:CLAW:HURT:3d7 B:CRUSH:HURT:10d5 -F:FORCE_SLEEP | -F:CAN_FLY | -F:WEIRD_MIND | BASH_DOOR | ATTR_MULTI | ATTR_ANY | -F:NO_CONF | NO_SLEEP | MORTAL | ZANGBAND +F:ATTR_ANY +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:WEIRD_MIND +F:ZANGBAND S:1_IN_9 -S:BR_CONF | BR_CHAO +S:BR_CHAO +S:BR_CONF D:With fractal patterns on its wings, it is clearly one of those butterflies D:that mathematicians keep talking about - the ones that flap their wings on the D:other side of the world to cause storms here. Now's your chance to stop it... @@ -9237,11 +14860,23 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TIME:3d4 B:TOUCH:TIME:3d4 -F:PASS_WALL | IM_POIS | IM_FIRE | IM_ELEC | IM_FIRE | IM_ACID | CAN_FLY | -F:NO_CONF | NO_SLEEP | EMPTY_MIND | KILL_ITEM | RAND_50 | -F:ZANGBAND | NO_CUT +F:CAN_FLY +F:EMPTY_MIND +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +F:ZANGBAND S:1_IN_7 -S:SLOW | BR_TIME | +S:BR_TIME +S:SLOW D:You have not seen it yet. N:580:Flying polyp @@ -9253,11 +14888,22 @@ O:0:0:0:0 B:CRUSH:PARALYZE:8d4 B:CRUSH:PARALYZE:8d4 B:CRUSH:PARALYZE:8d4 -F:PASS_WALL | INVISIBLE | FORCE_MAXHP | RES_DISE | -F:IM_POIS | IM_COLD | IM_ACID | ELDRITCH_HORROR | -F:NO_CONF | NO_SLEEP | EVIL | CAN_FLY | CTHANGBAND |NO_CUT +F:CAN_FLY +F:CTHANGBAND +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RES_DISE S:1_IN_7 -S:BR_WALL | +S:BR_WALL D:"They were only partly material and had the power of aerial motion, D:despite the absence of wings... Suggestions of monstrous plasticity D:and of temporary lapses of visibility..." @@ -9272,14 +14918,25 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:UNIQUE | FEMALE | GOOD | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:WEIRD_MIND | OPEN_DOOR | BASH_DOOR | -F:ANIMAL | -F:MORTAL | BASEANGBAND -S:1_IN_2 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WEIRD_MIND +S:1_IN_2 S:S_KIN D:She's upset because you hurt her children. @@ -9293,13 +14950,34 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HALLU:1d9 B:HIT:HALLU:1d9 -F:FORCE_SLEEP | FORCE_MAXHP | RAND_50 | -F:SMART | EMPTY_MIND | INVISIBLE | -F:PASS_WALL | POWERFUL | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_2 | -S:BLINK | TPORT | CONF | CAUSE_2 +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:RAND_50 +F:SMART +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_2 +S:BLINK +S:CAUSE_2 +S:CONF +S:TPORT D:A strange ball of glowing light. It disappears and reappears and seems to D:draw you to it. You seem somehow compelled to stand still and watch its D:strange dancing motion. @@ -9310,10 +14988,23 @@ I:120:20d8:20:120:20 W:37:4:0:250 E:0:0:0:0:0:0 O:0:0:0:0 -F:IM_POIS | IM_COLD | COLD_BLOOD | ANIMAL | EVIL | -F:NO_SLEEP | NO_CONF | CAN_FLY | NEVER_BLOW | CTHANGBAND | +F:ANIMAL +F:CAN_FLY +F:COLD_BLOOD +F:CTHANGBAND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NEVER_BLOW +F:NO_CONF +F:NO_SLEEP S:1_IN_2 -S:CONF | HOLD | DRAIN_MANA | FORGET | MIND_BLAST | SHRIEK +S:CONF +S:DRAIN_MANA +S:FORGET +S:HOLD +S:MIND_BLAST +S:SHRIEK D:"Those huge lidless eyes which stared with hate at me, the jointed D:tendrils which seemed to twist from the head in cosmic rhythms, D:the ten legs, covered with black shining tentacles and folded into @@ -9331,13 +15022,28 @@ O:0:0:0:0 B:HIT:FIRE:3d7 B:HIT:HURT:4d6 B:HIT:FIRE:3d7 -F:FORCE_SLEEP | -F:EMPTY_MIND | AURA_FIRE | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_ELEC | IM_ACID | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_7 | -S:BO_PLAS | BA_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_7 +S:BA_FIRE +S:BO_PLAS D:It is a towering glowing form of molten rock. N:585:Black pudding @@ -9350,13 +15056,28 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | -F:FRIENDS | -F:DROP_60 | DROP_90 | DROP_1D2 | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_SWIM | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:DROP_90 +F:EMPTY_MIND +F:FORCE_MAXHP +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A lump of rotting black flesh that slurrrrrrrps across the dungeon floor. N:586:Killer iridescent beetle @@ -9368,10 +15089,18 @@ O:0:0:0:0 B:CLAW:ELEC:1d12 B:CLAW:ELEC:1d12 B:GAZE:PARALYZE -F:ATTR_MULTI | FORCE_MAXHP | -F:WEIRD_MIND | BASH_DOOR | AURA_ELEC | DROP_CORPSE | -F:ANIMAL | IM_ELEC | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:ATTR_MULTI +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ELEC +F:MORTAL +F:WEIRD_MIND D:It is a giant beetle, whose carapace shimmers with vibrant energies. N:587:Nexus vortex @@ -9381,11 +15110,23 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:5d5 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | RES_NEXU | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_NEXU +F:RES_TELE +S:1_IN_6 S:BR_NEXU D:A maelstrom of potent magical energy. @@ -9397,12 +15138,26 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:4d8 B:ENGULF:ELEC:4d8 -F:FORCE_SLEEP | SUSCEP_COLD | -F:RAND_50 | RAND_25 | RES_PLAS | AURA_FIRE | AURA_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:IM_FIRE | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_PLAS +F:SUSCEP_COLD +S:1_IN_6 S:BR_PLAS D:A whirlpool of intense flame, charring the stones at your feet. @@ -9415,14 +15170,29 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO | -F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_9 S:BR_FIRE +S:CONF +S:SCARE D:A large dragon, scales tinted deep red. N:590:Mature gold dragon @@ -9434,13 +15204,26 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_SLEEP +F:NO_STUN +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_9 S:BR_SOUN +S:CONF +S:SCARE D:A large dragon with scales of gleaming gold. N:591:Crystal drake @@ -9452,14 +15235,29 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_3D2 | REFLECTING | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +S:1_IN_6 S:BR_SHAR +S:CONF +S:SCARE +S:SLOW D:A dragon of strange crystalline form. Light shines through it, dazzling D:your eyes with spectrums of colour. @@ -9472,13 +15270,26 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:DROP_1D2 | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_MOUNTAIN | -F:BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_9 S:BR_ACID +S:SCARE D:A large dragon, with scales of deepest black. N:593:Mature multi-hued dragon @@ -9490,15 +15301,35 @@ O:50:50:0:0 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:4d12 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_2D2 | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_7 | -S:BLIND | CONF | SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_7 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A large dragon, scales shimmering many colours. N:594:Sky whale @@ -9510,13 +15341,31 @@ O:50:50:0:0 B:CRUSH:HURT:20d2 B:CRUSH:HURT:20d2 B:CRUSH:HURT:20d2 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_60 | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:BASH_DOOR | SMART | GOOD | -F:NO_CONF | NO_SLEEP | RES_NEXU | RES_TELE | RES_DISE -F:MORTAL | ZANGBAND -S:1_IN_9 | -S:BRAIN_SMASH | CONF | SCARE | FORGET | TELE_TO | TELE_AWAY | SHRIEK +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:RES_DISE +F:RES_NEXU +F:RES_TELE +F:SMART +F:ZANGBAND +S:1_IN_9 +S:BRAIN_SMASH +S:CONF +S:FORGET +S:SCARE +S:SHRIEK +S:TELE_AWAY +S:TELE_TO D:A vastly intelligent whale-like being from the stars. N:595:Draebor, the Imp @@ -9529,15 +15378,41 @@ B:CLAW:POISON:8d4 B:CLAW:POISON:8d4 B:BITE:HURT:8d8 B:INSULT:* +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DEMON +F:DROP_1D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD F:ESCORT -F:DROP_60 | DROP_90 | DROP_1D2 | DROP_GOOD | ONLY_ITEM | DROP_CORPSE | -F:CAN_SWIM | BASH_DOOR | RES_TELE | CAN_SPEAK | -F:EVIL | DEMON | IM_FIRE | IM_COLD | IM_POIS | RES_WATE | -F:UNIQUE | MALE | FORCE_SLEEP | FORCE_MAXHP | POWERFUL | -F:NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:S_KIN | BLINK | TPORT | TELE_TO | TELE_AWAY | TELE_LEVEL | BLIND | -S:CONF | SCARE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +F:RES_WATE +F:UNIQUE +S:1_IN_5 +S:BLIND +S:BLINK +S:CONF +S:SCARE +S:S_KIN +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:An intensely irritating git of a monster. N:596:Mother Hydra @@ -9549,15 +15424,39 @@ O:0:50:50:0 B:CLAW:POISON:8d4 B:CLAW:POISON:8d4 B:BITE:HURT:8d8 -F:ESCORT | -F:DROP_60 | DROP_90 | DROP_1D2 | DROP_GOOD | ONLY_ITEM | DROP_CORPSE | -F:CAN_SWIM | BASH_DOOR | ELDRITCH_HORROR | RES_TELE | CAN_SPEAK | -F:EVIL | DEMON | IM_FIRE | IM_COLD | IM_POIS | RES_WATE | -F:UNIQUE | FEMALE | FORCE_SLEEP | FORCE_MAXHP | POWERFUL | -F:NO_CONF | -F:MORTAL | CTHANGBAND -S:1_IN_7 | -S:S_HYDRA | S_DEMON | DARKNESS | BA_WATE | BO_ACID | BA_ACID +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:ELDRITCH_HORROR +F:ESCORT +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +F:RES_WATE +F:UNIQUE +S:1_IN_7 +S:BA_ACID +S:BA_WATE +S:BO_ACID +S:DARKNESS +S:S_DEMON +S:S_HYDRA D:The queen of the deep ones. "Vast, Polyphemus-like, and loathsome, it D:darted like a stupendous monster of nightmares..." @@ -9570,14 +15469,28 @@ O:0:90:0:10 B:HIT:EXP_20:6d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_NETH | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_COLD | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_3 | BO_NETH | -S:S_MONSTERS -D:It is a humanoid figure dressed in armour of an ancient form. From beneath +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:SMART +S:1_IN_5 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:SCARE +S:S_MONSTERS +D:It is a humanoid figure dressed in armour of an ancient form. From beneath D:its helmet, eyes glow a baleful red and seem to pierce you like lances of D:fire. @@ -9591,13 +15504,27 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | TAKE_ITEM | BASH_DOOR | -F:EVIL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | TRAPS | BO_FIRE | BO_COLD | BO_ELEC | BO_ICEE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:BO_ICEE +S:HEAL +S:TRAPS D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and D:evil. @@ -9608,11 +15535,20 @@ W:38:4:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:TIME:5d5 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 S:BR_TIME D:You haven't seen it yet. @@ -9624,12 +15560,24 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:BLIND:4d4 B:ENGULF:BLIND:4d4 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BR_LITE | SHRIEK +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_TELE +S:1_IN_4 +S:BR_LITE +S:SHRIEK D:A strange pillar of shining light that hurts your eyes. Its shape changes D:constantly as it cuts through the air towards you. It is like a beacon, D:waking monsters from their slumber. @@ -9643,14 +15591,29 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:ELEC:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_ELEC +S:CONF +S:SCARE D:A huge draconic form. Lightning crackles along its length. N:602:Ancient bronze dragon @@ -9662,13 +15625,28 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_CONF +S:CONF +S:SCARE D:A huge draconic form enveloped in a cascade of colour. N:603:Beholder @@ -9681,12 +15659,30 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY | -F:BASH_DOOR | DROP_CORPSE | -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | -S:FORGET | DARKNESS | BO_ACID | BO_FIRE | BO_COLD | BO_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SCARE +S:SLOW D:A vile creature with one huge central eye, twelve smaller eyes on stalks, and D:a huge mouth filled with sharp teeth. @@ -9700,13 +15696,29 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | CAN_FLY | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:HOLD | SCARE | CAUSE_3 | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:Your life force is torn from your body as this powerful unearthly being D:approaches. @@ -9720,14 +15732,41 @@ B:HIT:HURT:4d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | NO_FEAR | GOOD | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | REFLECTING | RES_TELE -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_11 | -S:HEAL | HASTE | TELE_AWAY | CONF | BO_MANA | BO_PLAS | -S:S_MONSTERS | S_ANGEL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_2D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:SMART +F:TAKE_ITEM +S:1_IN_11 +S:BO_MANA +S:BO_PLAS +S:CONF +S:HASTE +S:HEAL +S:S_ANGEL +S:S_MONSTERS +S:TELE_AWAY D:It is an angel, fast and strong. You are stunned by its extreme holiness D:and try to resist all desires to obey it. @@ -9741,14 +15780,33 @@ B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 -F:UNIQUE | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | CAN_SPEAK | -F:EMPTY_MIND | CAN_SPEAK | MALE | AURA_FIRE | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_ACID | IM_POIS | IM_ELEC | NO_STUN | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BO_PLAS | BA_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SPEAK +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:RAND_25 +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_4 +S:BA_FIRE +S:BO_PLAS D:A towering fire elemental, Vargo burns everything beyond recognition. N:607:Black wraith @@ -9761,13 +15819,30 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_40 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP -F:BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:A figure that seems made of void, its strangely human shape is cloaked in D:shadow. It reaches out at you. @@ -9779,13 +15854,26 @@ E:0:0:0:0:0:0 O:50:0:50:0 B:STING:LOSE_STR:1d5 B:TOUCH:PARALYZE:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_60 | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | CAN_FLY | -F:EVIL | DEMON | -F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | ZANGBAND -S:1_IN_7 | -S:BLIND | CONF | BO_FIRE +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_60 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:ZANGBAND +S:1_IN_7 +S:BLIND +S:BO_FIRE +S:CONF D:It is a black, horned humanoid with wings. N:609:Baron of hell @@ -9797,10 +15885,23 @@ O:0:0:0:0 B:CLAW:HURT:11d2 B:CLAW:HURT:11d2 B:CLAW:HURT:22d1 -F:IM_POIS | OPEN_DOOR | BASH_DOOR | MALE | RES_PLAS | IM_FIRE | NONLIVING | -F:IM_FIRE | NO_CONF | NO_SLEEP | EVIL | DEMON | FORCE_MAXHP | RES_TELE | -F:ZANGBAND | HAS_LITE -S:1_IN_2 | +F:BASH_DOOR +F:DEMON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_FIRE +F:IM_FIRE +F:IM_POIS +F:MALE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:RES_PLAS +F:RES_TELE +F:ZANGBAND +S:1_IN_2 S:BO_PLAS D:A minor demon lord with a goat's head, tough to kill. @@ -9814,12 +15915,29 @@ B:BITE:POISON:10d3 B:BITE:POISON:10d3 B:BITE:POISON:10d3 B:BITE:POISON:10d3 -F:FORCE_SLEEP | UNIQUE | AQUATIC | FORCE_MAXHP | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | DROP_CORPSE | -F:BASH_DOOR | MOVE_BODY | EVIL | ZANGBAND | RES_WATE | -F:ANIMAL | IM_POIS | IM_FIRE -S:1_IN_5 | -S:BR_POIS | BR_FIRE | SCARE | CONF | S_HYDRA +F:ANIMAL +F:AQUATIC +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:ONLY_GOLD +F:RES_WATE +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE +S:S_HYDRA D:A many-headed sea-monster, this foul creature preys on all those who D:escape the clutches of Charybdis. @@ -9833,14 +15951,37 @@ B:KICK:HURT:24d1 B:KICK:HURT:24d1 B:CLAW:EXP_80:4d2 B:CLAW:LOSE_DEX:4d2 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SMART | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:SCARE +S:TELE_TO D:A skeletal form wrapped in priestly robes. Before its un-death, it D:was a monk in an evil order. @@ -9854,13 +15995,31 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | SCARE | CAUSE_3 | MIND_BLAST | DARKNESS | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +S:1_IN_6 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:MIND_BLAST +S:SCARE D:A form that hurts the eye, death permeates the air around it. As it nears D:you, a coldness saps your soul. @@ -9873,11 +16032,22 @@ O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD | -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE | -S:1_IN_5 | BR_FIRE +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_5 +S:BR_FIRE D:It is a giant dog that glows with heat. Flames pour from its nostrils. N:614:7-headed hydra @@ -9890,13 +16060,25 @@ B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:SPIT:BLIND:1d2 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | CAN_SWIM | DROP_CORPSE -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND -S:1_IN_5 | -S:SCARE | BA_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_POIS S:BR_POIS +S:SCARE D:A strange reptilian creature with seven heads dripping venom. N:615:Waldern, King of Water @@ -9909,14 +16091,29 @@ B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:UNIQUE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_FIRE | IM_POIS | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BO_ICEE | BO_WATE | BA_COLD | BA_WATE +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BA_COLD +S:BA_WATE +S:BO_ICEE +S:BO_WATE D:A towering water elemental, Waldern is master of all things liquid. D:Wave after wave drowns your frail body. @@ -9930,15 +16127,40 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:UNIQUE | MALE | ATTR_MULTI | CAN_SPEAK | ATTR_ANY | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | RES_NEXU | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | CAN_FLY | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | -F:BASEANGBAND | HAS_LITE | -S:1_IN_4 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_SOUN | BR_CONF | -S:BR_SHAR | BR_GRAV | BR_NEXU +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_NEXU +F:UNIQUE +S:1_IN_4 +S:BR_ACID +S:BR_COLD +S:BR_CONF +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_NEXU +S:BR_SHAR +S:BR_SOUN D:A large dragon with a selection of heads, all shouting and arguing as they D:look for prey, but each with its own deadly breath weapon. @@ -9951,14 +16173,30 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:COLD:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND -F:HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +F:SUSCEP_FIRE +S:1_IN_6 +S:BLIND S:BR_COLD +S:CONF +S:SCARE D:A huge draconic form. Frost covers it from head to tail. N:618:Ancient green dragon @@ -9970,14 +16208,29 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:POISON:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_POIS +S:CONF +S:SCARE D:A huge draconic form enveloped in clouds of poisonous vapour. N:619:Chthonian @@ -9990,12 +16243,31 @@ B:CRUSH:SHATTER:3d11 B:CRUSH:SHATTER:3d11 B:TOUCH:LOSE_CON:1d2 B:TOUCH:LOSE_CON:1d2 -F:IM_FIRE | RES_PLAS | IM_COLD | IM_POIS | ELDRITCH_HORROR | RES_TELE | -F:KILL_WALL | ONLY_GOLD | DROP_4D2 | DROP_2D2 | CAN_SWIM | DROP_CORPSE | -F:EVIL | FORCE_MAXHP | CTHANGBAND -S:1_IN_5 | -S:SCARE | CONF | HOLD | S_DEMON | -S:MIND_BLAST | HEAL | HASTE | FORGET | BRAIN_SMASH +F:CAN_SWIM +F:CTHANGBAND +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:ONLY_GOLD +F:RES_PLAS +F:RES_TELE +S:1_IN_5 +S:BRAIN_SMASH +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_DEMON D:"Flowing tentacles and a pulpy gray-black elongated sack of a body... D:no distinguishing features at all other than the reaching, groping D:tentacles. Or was there -- yes! -- a lump in the upper body of @@ -10012,10 +16284,23 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:HURT:3d4 B:BITE:HURT:3d4 -F:FORCE_MAXHP | MOVE_BODY | -F:ONLY_ITEM | DROP_2D2 | REGENERATE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_SHORE | WILD_WOOD | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | DROP_CORPSE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TAKE_ITEM +F:TROLL +F:WILD_SHORE +F:WILD_WOOD D:A massive troll of huge strength. Eldraks are extremely stupid and extremely D:violent. @@ -10029,10 +16314,24 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 B:BITE:HURT:3d8 -F:FORCE_MAXHP | REGENERATE | MOVE_BODY | -F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_SWAMP | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:A massive two-headed troll, larger and stronger than many men together. D:Fortunately, ettins are solitary creatures. They are also living proof that D:two heads are not necessarily more intelligent than one... @@ -10047,11 +16346,22 @@ B:BITE:EXP_80:2d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:CONFUSE:6d6 -F:FORCE_MAXHP | -F:ONLY_GOLD | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:HAS_LITE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:OPEN_DOOR +F:UNDEAD D:A fearsome skeletal horse with glowing eyes that watch you with little D:more than a hatred of all that lives. Its flying hooves do not touch the D:ground. @@ -10066,14 +16376,35 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_80:4d6 B:BITE:EXP_80:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_60 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE D:A foul wind chills your bones as this ghastly figure approaches. N:624:Ancient black dragon @@ -10085,13 +16416,28 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:ACID:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_ACID +S:CONF +S:SCARE D:A huge draconic form. Pools of acid melt the floor around it. N:625:Weird fume @@ -10102,13 +16448,29 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:CONFUSE:8d4 B:ENGULF:CONFUSE:8d4 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:CAN_FLY | ATTR_MULTI | ATTR_ANY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | ZANGBAND | NO_CUT -S:1_IN_6 | -S:BR_CHAO | BR_NEXU | BR_NUKE +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_ELEC +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_NEXU +F:ZANGBAND +S:1_IN_6 +S:BR_CHAO +S:BR_NEXU +S:BR_NUKE D:A swirling spiral of mist, constantly changing its appearance. N:626:Spawn of Ubbo-Sathla @@ -10119,10 +16481,24 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRUSH:ACID:8d4 B:CRUSH:ACID:8d4 -F:FORCE_SLEEP | ATTR_MULTI | ATTR_ANY | EVIL | -F:RAND_25 | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | KILL_BODY | -F:CAN_SWIM | NO_CONF | NO_SLEEP | CTHANGBAND | NO_CUT +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_ELEC +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:EMPTY_MIND +F:EVIL +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:KILL_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RES_NEXU S:MULTIPLY D:Weird, jelly like creatures. No two look the same. @@ -10133,9 +16509,25 @@ W:40:2:0:200 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:SHATTER:200d2 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | REFLECTING | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | RES_TELE | JOKEANGBAND | NO_CUT | NO_STUN +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:REFLECTING +F:RES_TELE +F:UNIQUE D:A shining machine of death and destruction. N:628:Malekith the Accursed @@ -10146,15 +16538,40 @@ E:1:1:1:2:1:1 O:50:0:50:0 B:HIT:HURT:12d9 B:HIT:HURT:12d9 -F:MALE | REGENERATE | UNIQUE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:ONLY_ITEM | DROP_90 | DROP_4D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | ZANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | TELE_TO | BLIND | CONF | CAUSE_3 | DARKNESS | FORGET | HOLD | -S:S_MONSTER | S_MONSTERS | S_DEMON | TPORT | BA_NETH | MIND_BLAST | +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_2 +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:HEAL +S:HOLD +S:MIND_BLAST +S:S_DEMON S:S_KIN +S:S_MONSTER +S:S_MONSTERS +S:TELE_TO +S:TPORT D:One of the oldest and most powerful dark elves, Malekith is a master D:sorcerer devoted to evil. The left side of his face is pale, and the other D:is dark. His hair is long and white. @@ -10168,10 +16585,20 @@ O:0:0:0:0 B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:BITE:HURT:6d6 -F:FORCE_MAXHP | UNIQUE | ANIMAL | GOOD | -F:REGENERATE | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_FEAR | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_FEAR +F:REGENERATE +F:UNIQUE D:Shadowfax is the chief of the "Mearas", the greatest of all horses that are D:bred in the fields of Rohan. Although the Mearas should technically be only D:ridden by the royal family of Rohan, only Gandalf the Wizard has ever @@ -10187,11 +16614,20 @@ O:10:90:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:FORCE_MAXHP | -F:DROP_90 | -F:INVISIBLE | PASS_WALL | CAN_FLY | -F:EVIL | TROLL | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:TROLL D:A weird ghostly troll-like being from the ethereal plane. N:631:War troll @@ -10204,10 +16640,22 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:FORCE_MAXHP | SUSCEP_FIRE | REGENERATE | -F:DROP_90 | REGENERATE | FRIENDS | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL D:A massive troll, equipped with a scimitar and heavy armour. N:632:Disenchanter worm mass @@ -10217,9 +16665,18 @@ W:40:3:50:30 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:UN_BONUS:1d4 -F:RAND_50 | RES_DISE | ATTR_MULTI | CAN_SWIM | -F:STUPID | WEIRD_MIND | BASH_DOOR | -F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:HURT_LITE +F:NO_CUT +F:NO_FEAR +F:RAND_50 +F:RES_DISE +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a strange mass of squirming worms. Magical energy crackles D:around its disgusting form. @@ -10230,12 +16687,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_UNDEAD +S:TPORT D:It is a pulsing flesh mound that reeks of death and putrefaction. N:634:Lesser titan @@ -10248,13 +16714,26 @@ B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_GOOD | DROP_4D2 | DROP_SKELETON | DROP_CORPSE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | TELE_TO | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:MALE +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:HEAL +S:SCARE S:S_MONSTERS +S:TELE_TO D:It is a humanoid figure thirty feet tall that gives off an aura of power D:and hate. @@ -10268,12 +16747,26 @@ B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_3D2 | DROP_4D2 | CAN_SWIM | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CORPSE | -F:ANIMAL | IM_FIRE | MORTAL | BASEANGBAND -S:1_IN_4 | -S:SCARE | BO_FIRE | BR_FIRE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 +S:BO_FIRE +S:BR_FIRE +S:SCARE D:A strange reptilian creature with nine smouldering heads. N:636:Enchantress @@ -10285,14 +16778,24 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d8 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLIND | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:BLIND S:S_DRAGON D:This elusive female spellcaster has a special affinity for dragons, without D:whom she rarely fights. @@ -10306,16 +16809,40 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:MALE | INVISIBLE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | TAKE_ITEM | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:S_MONSTERS | -S:ARROW_2 | ARROW_3 | ARROW_4 | MISSILE | BO_FIRE | BO_ELEC | BA_COLD | -S:HASTE | BLINK | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_4 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 +S:BA_COLD +S:BLINK +S:BO_ELEC +S:BO_FIRE +S:HASTE +S:MISSILE +S:S_ANIMALS +S:S_MONSTERS D:A chieftain among the Rangers. His understanding of nature gives him D:powerful elemental spells to use against you, in addition to his skills D:as an archer and a warrior. Furthermore, he is a master of camouflage, so @@ -10330,16 +16857,35 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | TRAPS | -S:BO_ACID | BA_FIRE | BA_COLD | -S:S_MONSTER | S_UNDEAD | S_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CONF +S:S_DRAGON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spell casting. @@ -10353,12 +16899,23 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_MAXHP | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:PASS_WALL +F:SUSCEP_ACID D:It is a tougher relative of the Xorn. Its hide glitters with metal ores. N:640:Giant roc @@ -10370,9 +16927,17 @@ O:0:0:0:0 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 B:HIT:ELEC:12d12 -F:BASH_DOOR | CAN_FLY | WILD_MOUNTAIN | WILD_WOOD | -F:ANIMAL | IM_ELEC | DROP_CORPSE | SUSCEP_ACID | HAS_EGG -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:IM_ELEC +F:MORTAL +F:SUSCEP_ACID +F:WILD_MOUNTAIN +F:WILD_WOOD D:A vast legendary bird, its iron talons rake the most impenetrable of D:surfaces and its screech echoes through the many winding dungeon corridors. @@ -10386,8 +16951,12 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:2d6 B:BUTT:HURT:2d6 -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:MORTAL D:It is a cross between a human and a bull. N:642:Medusa, the Gorgon @@ -10400,15 +16969,33 @@ B:GAZE:EXP_80 B:GAZE:PARALYZE B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:UNIQUE | FEMALE | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_FIRE | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_2 | -S:HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_PLAS | BA_ACID | -S:S_HYDRA | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:BA_ACID +S:BO_FIRE +S:BO_PLAS +S:CAUSE_3 +S:HOLD +S:SCARE +S:S_HYDRA +S:S_KIN D:One of the original three ugly sisters. Her face could sink a thousand D:ships. Her scales rattle as she slithers towards you, venom dripping from D:her ghastly mouth. @@ -10422,14 +17009,31 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:EXP_80:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | RES_TELE -F:INVISIBLE | TAKE_ITEM | CAN_FLY | -F:PASS_WALL | POWERFUL | MOVE_BODY | RES_NETH | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:RES_NETH +F:RES_TELE +F:TAKE_ITEM +S:1_IN_6 S:BR_NETH +S:CONF +S:SCARE +S:SLOW D:It is a dragon-like form wrapped in darkness. You cannot make out its D:true form but you sense its evil. @@ -10442,14 +17046,30 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:FIRE:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_3D2 | DROP_4D2 | CAN_FLY | SUSCEP_COLD | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +F:SUSCEP_COLD +S:1_IN_6 +S:BLIND S:BR_FIRE +S:CONF +S:SCARE D:A huge draconic form. Wisps of smoke steam from its nostrils and the D:extreme heat surrounding it makes you gasp for breath. @@ -10462,13 +17082,28 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:HURT:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A huge draconic form wreathed in a nimbus of light. Its roar stuns and D:deafens you. @@ -10481,14 +17116,32 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +S:1_IN_6 S:BR_SHAR +S:CONF +S:SCARE +S:SLOW D:A huge crystalline dragon. Its claws could cut you to shreds and its D:teeth are razor sharp. Strange colours ripple through it as it moves in D:the light. @@ -10502,15 +17155,26 @@ O:10:0:80:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:CLAW:HURT:2d8 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_SKELETON -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP -F:MORTAL | ZANGBAND -S:1_IN_2 | -S:BLIND | -S:S_DEMON | CONF | SCARE | DARKNESS | BA_CHAO +F:BASH_DOOR +F:DROP_2D2 +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:ZANGBAND +S:1_IN_2 +S:BA_CHAO +S:BLIND +S:CONF +S:DARKNESS +S:SCARE +S:S_DEMON D:This old crone is rumoured to be a witch of chaos... but you don't D:really believe in witches, do you? @@ -10523,13 +17187,23 @@ O:0:50:50:0 B:HIT:HURT:3d4 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | -F:FRIENDS | -F:ONLY_ITEM | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_8 | -S:BLIND | CONF +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_8 +S:BLIND +S:CONF D:It is a demon with a long neck and raking claws. N:649:Death quasit @@ -10541,13 +17215,32 @@ O:0:50:50:0 B:BITE:LOSE_DEX:3d6 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_4D2 | NONLIVING | -F:SMART | INVISIBLE | PASS_WALL | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | IM_POIS | RES_TELE -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_10 | -S:BLIND | CONF | SCARE | CAUSE_3 | FORGET | +F:BASEANGBAND +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RES_TELE +F:SMART +S:1_IN_10 +S:BLIND +S:CAUSE_3 +S:CONF +S:FORGET +S:SCARE S:S_DEMON D:It is a demon of small stature, but its armoured frame moves with D:lightning speed and its powers make it a tornado of death and destruction. @@ -10561,13 +17254,27 @@ O:60:40:0:0 B:CRUSH:HURT:30d2 B:CRUSH:HURT:30d2 B:CRUSH:HURT:30d2 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | IM_FIRE | -F:DROP_60 | DROP_90 | DROP_2D2 | UNIQUE | WEIRD_MIND | -F:BASH_DOOR | SMART | EVIL | IM_COLD | DROP_CORPSE -F:RES_WATE | WILD_OCEAN | -F:MORTAL | ZANGBAND -S:1_IN_9 | -S:BR_NUKE | BA_WATE +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:MORTAL +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_OCEAN +F:ZANGBAND +S:1_IN_9 +S:BA_WATE +S:BR_NUKE D:A gargantuan mutant whale, who has grown legs that enable it to walk D:on dry land as well. @@ -10581,14 +17288,39 @@ B:CLAW:HURT:5d5 B:CLAW:HURT:5d5 B:HIT:LOSE_STR:4d4 B:TOUCH:EXP_80:8d1 -F:UNIQUE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | MOVE_BODY | NONLIVING | NO_SLEEP | NO_CONF| -F:OPEN_DOOR | BASH_DOOR | IM_POIS | IM_COLD | DEMON | EVIL | ZANGBAND -S:1_IN_3 | -S:CAUSE_3 | HOLD | SCARE | BLIND | BO_ACID | S_DEMON | -S:FORGET | BO_NETH | MIND_BLAST | DARKNESS +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BLIND +S:BO_ACID +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_DEMON D:"it was well over six feet in height, with great branches of antlers D:growing out of its forehead. Nude, its flesh was a uniform ash-gray D:in color. It appeared to be sexless, and it had gray, leathery wings @@ -10604,14 +17336,38 @@ B:GAZE:EXP_40:4d4 B:GAZE:EXP_40:4d4 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NO_FEAR | EVIL | REFLECTING | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE | RES_NETH | -F:CAN_FLY | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:TELE_TO | BLIND | SCARE | CAUSE_2 | CAUSE_4 | -S:S_DEMON | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_NETH +F:RES_TELE +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:BO_NETH +S:CAUSE_2 +S:CAUSE_4 +S:SCARE +S:S_DEMON +S:TELE_TO D:An angelic being, who was mighty once, but dared defy its Creator. N:653:Giant headless @@ -10623,11 +17379,19 @@ O:0:100:0:0 B:HIT:HURT:4d8 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:FRIENDS | DROP_60 | DROP_90 | OPEN_DOOR | BASH_DOOR | -F:DROP_SKELETON | DROP_CORPSE -F:EVIL | ZANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:OPEN_DOOR +F:ZANGBAND S:1_IN_6 -S:SCARE | BA_NUKE | BLIND +S:BA_NUKE +S:BLIND +S:SCARE D:Giant headless humanoid abominations created by a magical mutation. N:654:Judge Fire @@ -10640,15 +17404,44 @@ B:HIT:FIRE:5d5 B:HIT:FIRE:5d5 B:GAZE:EXP_80 B:WAIL:TERRIFY -F:UNIQUE | MALE | CAN_SPEAK | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | POWERFUL | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | SUSCEP_COLD | IM_POIS | IM_FIRE | RES_PLAS | -F:NO_CONF | NO_SLEEP | JOKEANGBAND | HAS_LITE | NO_CUT | NO_STUN -S:1_IN_3 | -S:CAUSE_3 | BO_FIRE | BA_FIRE | BR_FIRE | BO_PLAS -S:DARKNESS | S_MONSTER | S_DEMON | S_UNDEAD | TPORT | BLINK | SCARE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_PLAS +F:SUSCEP_COLD +F:SUSCEP_COLD +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BLINK +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:CAUSE_3 +S:DARKNESS +S:SCARE +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD +S:TPORT D:One of the Dark Judges, he has come to punish your crime of living. D:He looks like a skeleton enveloped in flames. @@ -10662,11 +17455,31 @@ B:CRUSH:ACID:5d5 B:HIT:POISON:5d5 B:CRUSH:ACID:5d5 B:HIT:POISON:5d5 -F:UNIQUE | CAN_SPEAK | NO_STUN | NO_SLEEP | NO_CONF | NO_STUN | -F:FORCE_SLEEP | FORCE_MAXHP | ELDRITCH_HORROR | ESCORT | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | REGENERATE | SUSCEP_FIRE | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | KILL_BODY | -F:EVIL | SUSCEP_FIRE | IM_COLD | IM_POIS | CTHANGBAND | NO_CUT +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:CTHANGBAND +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:KILL_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:SUSCEP_FIRE +F:UNIQUE D:"There, in the gray beginning of Earth, the formless mass that was D:Ubbo-Sathla reposed amid the slime and the vapors. Headless, D:without organs or members..." @@ -10681,16 +17494,42 @@ B:HIT:POISON:5d5 B:HIT:DISEASE:5d5 B:TOUCH:LOSE_ALL B:TOUCH:EXP_80 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | SUSCEP_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | SCARE | CAUSE_3 | BO_ACID | BO_NETH | BR_POIS | -S:BR_NETH | BO_NETH | BLINK | TPORT | ANIM_DEAD -S:BO_POIS | S_UNDEAD +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BO_ACID +S:BO_NETH +S:BO_NETH +S:BO_POIS +S:BR_NETH +S:BR_POIS +S:CAUSE_3 +S:SCARE +S:S_UNDEAD +S:TPORT D:Another Dark Judge, he is a rotting humanoid with a cow's skull as D:his head. @@ -10703,15 +17542,39 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | DARKNESS | -S:BO_ACID | BA_FIRE | BA_COLD | ANIM_DEAD -S:S_MONSTER | S_UNDEAD | S_DEMON | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO D:A dark elven figure, dressed in deepest black. Power seems to crackle D:from his slender frame. @@ -10725,14 +17588,36 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d12 B:TOUCH:LOSE_DEX:2d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD +S:TELE_TO D:A skeletal form wrapped in robes. Powerful magic crackles along its D:bony fingers. @@ -10744,13 +17629,26 @@ E:0:0:0:0:0:0 O:0:50:50:0 B:CLAW:LOSE_STR:3d4 B:BITE:EXP_20:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | -F:ONLY_ITEM | DROP_2D2 | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_9 | -S:BO_FIRE | -S:S_DEMON | CONF +F:BASH_DOOR +F:CAN_FLY +F:CTHANGBAND +F:DEMON +F:DROP_2D2 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BO_FIRE +S:CONF +S:S_DEMON D:"There flapped rhythmically a horde of tame, trained, hybrid D:winged things... not altogether crows, nor moles, nor buzzards, D:nor ants, nor decomposed human beings, but something I cannot @@ -10765,16 +17663,47 @@ O:10:40:40:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD | DROP_CHOSEN | -F:SMART | IM_ELEC | IM_COLD | IM_POIS | IM_FIRE | -F:REFLECTING | OPEN_DOOR | BASH_DOOR | SPECIAL_GENE | -F:HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_4 | DARKNESS | -S:BA_NETH | BA_ELEC | BA_ACID | BA_FIRE | BA_COLD | BO_MANA | -S:S_MONSTERS | S_UNDEAD | S_DRAGON | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_3 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BLINK +S:BO_MANA +S:CAUSE_4 +S:CONF +S:DARKNESS +S:HEAL +S:S_DEMON +S:S_DRAGON +S:S_MONSTERS +S:S_UNDEAD +S:TELE_TO D:A lord of the Teleri, Eol is a mighty metalsmith, the first D:one ever to forge weapons of meteorite iron. His dark D:countenance glares at you in disdain. @@ -10789,14 +17718,37 @@ B:GAZE:TERRIFY:4d4 B:GAZE:TERRIFY:4d4 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NO_FEAR | GOOD | REFLECTING | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE | CAN_FLY -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:TELE_TO | BLIND | SCARE | CAUSE_2 | CAUSE_4 | BO_MANA | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:BO_MANA +S:CAUSE_2 +S:CAUSE_4 +S:SCARE S:S_ANGEL +S:TELE_TO D:Never a more heavenly being have you seen. The very holiness of its D:presence makes you deeply respect it. Few creatures can match the powers D:of an Archon; fewer still live to tell the tale after attacking one. @@ -10811,13 +17763,32 @@ B:HIT:ACID:2d4 B:HIT:ACID:2d4 B:CRUSH:HURT:3d4 B:BITE:ACID:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | ELDRITCH_HORROR | NONLIVING | -F:ONLY_ITEM | DROP_90 | REGENERATE | RES_TELE | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | CAN_SWIM | -F:EVIL | DEMON | NO_CONF | NO_SLEEP | SUSCEP_FIRE | IM_POIS | CTHANGBAND | NO_CUT -S:1_IN_9 | -S:BO_FIRE | BO_ACID | -S:S_DEMON | MIND_BLAST | DARKNESS | +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_90 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_TELE +F:SUSCEP_FIRE +S:1_IN_9 +S:BO_ACID +S:BO_FIRE +S:DARKNESS +S:MIND_BLAST +S:S_DEMON D:"...living things that oozed along stone channels... D:But they were not toads like Tsathoggua himself. Far worse -- D:they were amorphous lumps of viscous black slime that took @@ -10832,13 +17803,28 @@ O:45:35:0:10 B:BITE:LOSE_DEX:1d3 B:BITE:POISON:1d3 B:CRUSH:HURT:9d4 -F:FORCE_SLEEP | FORCE_MAXHP | ELDRITCH_HORROR | -F:ONLY_ITEM | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | CAN_FLY | -F:EVIL | DEMON | HURT_LITE | IM_POIS | -F:IM_FIRE | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_9 | -S:BLIND | CONF | S_DEMON | BR_DARK +F:BASH_DOOR +F:CAN_FLY +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:BR_DARK +S:CONF +S:S_DEMON D:"And in the air there were great viperine creatures, D:which had curiously distorted heads, and grotesquely great D:clawed appendages, supporting themselves with ease by the aid @@ -10854,15 +17840,38 @@ B:GAZE:EXP_40:3d6 B:GAZE:UN_POWER:3d6 B:GAZE:INSANITY:3d6 B:BITE:EXP_40:7d6 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:COLD_BLOOD | BASH_DOOR | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:SLOW | CONF | CAUSE_4 | DRAIN_MANA | MIND_BLAST | FORGET | -S:BO_MANA | BO_NETH | BRAIN_SMASH | BA_FIRE | BA_COLD | BO_ACID | -S:S_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_TELE +F:UNDEAD +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_FIRE +S:BO_ACID +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SLOW +S:S_UNDEAD D:A beholder which has cheated death. Black nether storms rage around the D:bloodshot pupil of its central giant eye, and light seems to bend as it D:sucks its power from the very air around it. Your soul chills as it drains @@ -10878,13 +17887,29 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:FORCE_SLEEP | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | POWERFUL | REGENERATE | HURT_LITE | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | RES_NETH | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_8 | -S:BO_NETH | TELE_TO | SLOW +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:UNDEAD +S:1_IN_8 +S:BO_NETH +S:SLOW +S:TELE_TO D:A mighty spirit of darkness of vaguely humanoid form. Razor-edged claws D:reach out to end your life as it glides towards you, seeking to suck the D:energy from your soul to feed its power. @@ -10898,15 +17923,39 @@ O:0:0:100:0 B:BUTT:COLD:3d6 B:BUTT:FIRE:3d6 B:BUTT:ELEC:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | -F:COLD_BLOOD | BASH_DOOR | CAN_FLY | SUSCEP_ACID | -F:EVIL | UNDEAD | POWERFUL | SMART | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE | -F:ONLY_ITEM | DROP_60 | DROP_GOOD | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BA_WATE | BA_FIRE | BO_ICEE | BA_ELEC | BA_COLD | -S:CAUSE_4 | DRAIN_MANA | BRAIN_SMASH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:SUSCEP_ACID +F:UNDEAD +S:1_IN_2 +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_WATE +S:BO_ICEE +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:S_UNDEAD D:It is a huge, twisted grey skull floating through the air. Its cold eyes D:burn with hatred towards all who live. @@ -10919,14 +17968,30 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | -F:RAND_25 | FRIENDS | CAN_FLY | -F:ONLY_ITEM | DROP_60 | -F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_NETH +S:CONF +S:DRAIN_MANA +S:HOLD D:It is a form that screams its presence against the eye. Death incarnate, D:its hideous black body seems to struggle against reality as the universe D:itself struggles to banish it. @@ -10941,12 +18006,25 @@ B:GAZE:PARALYZE:3d12 B:GAZE:PARALYZE:3d12 B:BITE:POISON:2d12 B:BITE:POISON:2d12 -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | POWERFUL | -F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL S:1_IN_8 -S:BR_POIS | BR_DARK | BR_NEXU +S:BR_DARK +S:BR_NEXU +S:BR_POIS D:A large basilisk, whose shape resembles that of a great wyrm. N:669:Charybdis @@ -10958,14 +18036,29 @@ O:50:50:0:0 B:ENGULF:HURT:10d8 B:ENGULF:HURT:10d8 B:ENGULF:HURT:10d8 -F:AQUATIC | EVIL | UNIQUE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | -F:SMART | POWERFUL | MOVE_BODY | NEVER_MOVE | -F:IM_ACID | IM_FIRE | IM_COLD | RES_WATE | COLD_BLOOD | -F:IM_ELEC | IM_POIS | NO_STUN | ZANGBAND -S:1_IN_5 | -S:BA_WATE +F:AQUATIC +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NEVER_MOVE +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:RES_WATE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BA_WATE D:A monstrous dweller of the depths; its hungry maw has been the doom D:of innumerable sailors! @@ -10979,14 +18072,37 @@ B:HIT:HURT:5d10 B:HIT:HURT:5d10 B:HIT:EAT_ITEM:2d10 B:HIT:EAT_ITEM:2d10 -F:MALE | FORCE_MAXHP | CAN_SPEAK | REFLECTING | DROP_SKELETON | DROP_CORPSE | -F:REGENERATE | -F:IM_ACID | IM_ELEC | IM_COLD | IM_FIRE | IM_POIS | RES_TELE | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_GREAT | UNIQUE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL | -F:MORTAL | ZANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND S:1_IN_3 -S:BLIND | HEAL | BA_DARK | HASTE | CONF | +S:BA_DARK +S:BLIND +S:CONF +S:HASTE +S:HEAL D:Deriving his strength from the shadows, this king of thieves D:steals only for the challenge. @@ -10999,14 +18115,32 @@ O:0:100:0:0 B:HIT:EXP_20:8d2 B:HIT:LOSE_STR:8d2 B:HIT:LOSE_CON:8d2 -F:MALE | ATTR_MULTI | UNDEAD | EVIL | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:NO_STUN | NO_CONF | NO_SLEEP | ZANGBAND | NO_CUT -S:1_IN_5 | -S:SHRIEK | S_HOUND +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_FLY +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNDEAD +F:ZANGBAND +S:1_IN_5 +S:SHRIEK +S:S_HOUND D:An undead master of the vicious Zephyr hounds. N:672:Juggernaut of Khorne @@ -11019,9 +18153,20 @@ B:BUTT:HURT:6d6 B:CRUSH:HURT:8d6 B:CRUSH:HURT:8d6 B:BUTT:HURT:6d6 -F:COLD_BLOOD | BASH_DOOR | REFLECTING | KILL_ITEM | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | ZANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +F:ZANGBAND D:A great, vicious beast whose flesh is made of steel and whose D:blood is fire. It charges at you ignoring everything else. @@ -11034,8 +18179,12 @@ O:0:0:0:0 B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 -F:FRIENDS | DROP_CORPSE | -F:BASH_DOOR | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FRIENDS +F:MORTAL D:A massive elephantine form with eyes twisted by madness. N:674:Judge Fear @@ -11048,15 +18197,41 @@ B:GAZE:TERRIFY B:GAZE:EXP_40 B:GAZE:EXP_40 B:GAZE:HURT:2d20 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | MIND_BLAST | BRAIN_SMASH | -S:S_UNDEAD | DRAIN_MANA | FORGET | ANIM_DEAD +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_UNDEAD D:A Dark Judge, reputedly so frightening that his gaze can kill. N:675:Ancient multi-hued dragon @@ -11068,15 +18243,40 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | CONF | SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +S:1_IN_5 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A huge draconic form. Many colours ripple down its massive frame. Few D:live to see another. @@ -11089,14 +18289,27 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:INVISIBLE | CAN_FLY | -F:PASS_WALL | POWERFUL | MOVE_BODY | -F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | -S:BR_LITE | BR_DARK | BR_CONF +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +S:1_IN_6 +S:BLIND +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF D:A huge dragon emanating from the ethereal plane, this terrible creature is D:a master of light and dark. Its form disappears from sight as it cloaks D:itself in unearthly shadows. @@ -11111,13 +18324,29 @@ B:CRUSH:HURT:5d6 B:CRUSH:HURT:5d6 B:BITE:LOSE_STR:1d6 B:BITE:LOSE_STR:1d6 -F:FORCE_SLEEP | FORCE_MAXHP | ELDRITCH_HORROR | -F:ONLY_ITEM | DROP_1D2 | NONLIVING | CAN_SWIM | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | HURT_LITE | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | RES_TELE | CTHANGBAND -S:1_IN_9 | -S:BLIND | CAUSE_2 | -S:S_DEMON | HEAL +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +S:1_IN_9 +S:BLIND +S:CAUSE_2 +S:HEAL +S:S_DEMON D:"Something black in the road, something that wasn't a tree. D:Something big and black and ropy, just squatting there, waiting, D:with ropy arms squirming and reaching... It came crawling up the @@ -11133,14 +18362,37 @@ E:0:0:0:0:0:0 O:35:35:10:10 B:TOUCH:LOSE_ALL:7d6 B:TOUCH:LOSE_ALL:7d6 -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | -F:INVISIBLE | PASS_WALL | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | ATTR_MULTI | ATTR_ANY | -F:CHAR_CLEAR | SMART | COLD_BLOOD | EVIL | -F:IM_COLD | IM_FIRE | IM_ACID | IM_ELEC | IM_POIS | -F:NO_STUN | NO_CONF | NO_SLEEP | CTHANGBAND | HAS_LITE | NO_CUT -S:1_IN_9 | -S:DRAIN_MANA | BR_DISE | BR_NETH | TPORT +F:ATTR_ANY +F:ATTR_MULTI +F:CAN_FLY +F:CHAR_CLEAR +F:COLD_BLOOD +F:CTHANGBAND +F:DROP_1D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:SMART +S:1_IN_9 +S:BR_DISE +S:BR_NETH +S:DRAIN_MANA +S:TPORT D:"The shaft of phosphorescence from the well... was no longer shining D:out, it was pouring out; and as the shapeless stream of unplaceable D:colour left the well it seemed to flow directly into the sky." @@ -11155,15 +18407,32 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:SHATTER:10d10 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | KILL_WALL | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT | NO_STUN -S:1_IN_6 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:CAN_SPEAK +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:KILL_WALL +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:PASS_WALL +F:POWERFUL +F:UNIQUE +S:1_IN_6 +S:BA_ACID +S:BO_ACID D:A towering stone elemental stands before you. The walls and ceiling are D:reduced to rubble as Quaker advances. @@ -11176,12 +18445,27 @@ O:0:0:0:0 B:TOUCH:EXP_40:1d10 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD | SMART | -F:HURT_LITE | EVIL | OPEN_DOOR | MALE | UNDEAD | RES_NETH | ZANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_6 | -S:BLINK | TPORT | TELE_TO | CAUSE_3 | ANIM_DEAD -D:Nasty undead little creatures. They are chanting the name of the +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:INVISIBLE +F:MALE +F:NO_CUT +F:OPEN_DOOR +F:RAND_25 +F:RES_NETH +F:SMART +F:TAKE_ITEM +F:UNDEAD +F:ZANGBAND +S:1_IN_6 +S:ANIM_DEAD +S:BLINK +S:CAUSE_3 +S:MULTIPLY +S:TELE_TO +S:TPORT +D:Nasty undead little creatures. They are chanting the name of the D:sinister wizard who created them: 'Bruce! Bruce..!' N:681:Chaugnar Faugn, Horror from the Hills @@ -11194,15 +18478,34 @@ B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:BITE:LOSE_CON:8d2 B:BITE:LOSE_CON:8d1 -F:UNIQUE | CAN_SPEAK | EVIL | DEMON | -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | -F:ELDRITCH_HORROR | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_FEAR | CTHANGBAND -S:1_IN_6 | -S:HOLD | CAUSE_4 | CONF | SCARE | FORGET | BRAIN_SMASH | -S:MIND_BLAST | CAUSE_3 | S_DEMON | S_MONSTERS +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:POWERFUL +F:UNIQUE +S:1_IN_6 +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_DEMON +S:S_MONSTERS D:"The ears were webbed and tentacled, the trunk terminated in D:a huge flaring disk at least a foot in diameter... Its forelimbs D:were bent stiffly at the elbow, and its hands... rested palms @@ -11217,14 +18520,35 @@ O:90:0:10:0 B:ENGULF:LOSE_CON:4d10 B:ENGULF:LOSE_CON:4d10 B:ENGULF:LOSE_CON:4d10 -F:FORCE_SLEEP | ELDRITCH_HORROR | PASS_WALL | -F:INVISIBLE | DROP_2D2 | DROP_4D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | POWERFUL | -F:SMART | IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | -F:MORTAL | CTHANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BR_WALL | TELE_AWAY | BR_GRAV | -S:S_KIN | MIND_BLAST | BLIND | BLINK +F:BASH_DOOR +F:CAN_FLY +F:CTHANGBAND +F:DROP_2D2 +F:DROP_4D2 +F:ELDRITCH_HORROR +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MORTAL +F:MOVE_BODY +F:NO_CUT +F:OPEN_DOOR +F:PASS_WALL +F:POWERFUL +F:SMART +S:1_IN_4 +S:BLIND +S:BLINK +S:BR_GRAV +S:BR_WALL +S:MIND_BLAST +S:S_KIN +S:TELE_AWAY D:"Invisible ones from the stars... They sometimes took forms... D:but existed as vortices of power in their natural state." @@ -11238,14 +18562,31 @@ B:HIT:COLD:12d12 B:HIT:COLD:12d12 B:HIT:COLD:12d12 B:HIT:COLD:12d12 -F:ESCORT | UNIQUE | IM_COLD | AURA_COLD | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | ZANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | TELE_TO | -S:S_KIN | BR_COLD +F:AURA_COLD +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_COLD +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BR_COLD +S:HEAL +S:S_KIN +S:TELE_TO D:A frost giant chieftain, unusually smart for a giant. N:684:Quachil Uttaus, Treader of the Dust @@ -11257,13 +18598,35 @@ O:0:0:100:0 B:CLAW:HURT:50d1 B:TOUCH:TIME:1d50 B:TOUCH:TIME:1d50 -F:ESCORT | UNIQUE | IM_COLD | ELDRITCH_HORROR | RES_NETH | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | KILL_BODY | DROP_GREAT | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | NO_SLEEP | NO_CONF -F:EVIL | UNDEAD | DEMON | REGENERATE | CTHANGBAND | NO_CUT -S:1_IN_3 | -S:BR_TIME | SLOW | HASTE | HEAL +F:BASH_DOOR +F:CTHANGBAND +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:KILL_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_NETH +F:SMART +F:TAKE_ITEM +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BR_TIME +S:HASTE +S:HEAL +S:SLOW D:"It was a figure no larger than a young child, but severe and D:shriveled as some millenial mummy. Its hairless head, its D:unfeatured face, borne on a neck of skeleton thinness, were @@ -11282,11 +18645,32 @@ B:CRUSH:ACID:5d6 B:CRUSH:ACID:5d6 B:CRUSH:ACID:5d6 B:CRUSH:HURT:9d9 -F:REGENERATE | ONLY_ITEM | KILL_ITEM | DROP_2D2 | DROP_90 | DROP_60 -F:BASH_DOOR | EVIL | NO_CONF | NO_SLEEP | KILL_BODY | CAN_SWIM | -F:FORCE_MAXHP | FORCE_SLEEP | HURT_LITE | POWERFUL | -F:IM_ACID | IM_FIRE | RES_PLAS | IM_POIS | IM_COLD | IM_ELEC | RES_TELE -F:CTHANGBAND | HAS_LITE | NO_CUT +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DROP_2D2 +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_PLAS +F:RES_TELE D:"The nightmare, plastic column of fetid, black iridescence oozed D:tightly onward... A shapeless congerie of protoplasmic bubbles, D:faintly self-luminous and with myriads of temporary eyes forming @@ -11306,15 +18690,42 @@ B:CLAW:POISON:10d5 B:CLAW:POISON:10d5 B:CLAW:EXP_40:10d1 B:GAZE:TERRIFY -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_ELEC | IM_COLD | SUSCEP_FIRE | -F:IM_POIS | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_4 | BA_FIRE | BA_NETH | ANIM_DEAD -S:S_MONSTERS | S_UNDEAD | S_HI_UNDEAD | DRAIN_MANA | +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_FIRE +S:BA_NETH +S:BLIND +S:CAUSE_4 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNDEAD D:The most powerful Dark Judge, whose touch means death. N:687:Ariel, Queen of Air @@ -11327,15 +18738,33 @@ B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 -F:UNIQUE | FEMALE | AURA_ELEC | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_25 | CAN_FLY | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ELEC | BA_COLD | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:EMPTY_MIND +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:UNIQUE +S:1_IN_5 +S:BA_COLD +S:BA_ELEC +S:BO_ELEC D:A towering air elemental, Ariel the sorceress avoids your blows D:with her extreme speed. @@ -11349,13 +18778,28 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | IM_FIRE | CAN_SWIM | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:SCARE | BO_FIRE | BO_PLAS | BA_FIRE | BR_FIRE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 +S:BA_FIRE +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:SCARE D:A strange reptilian hybrid with eleven smouldering heads. N:689:Patriarch @@ -11367,15 +18811,32 @@ O:0:10:90:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d5 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | BLIND | HOLD | CAUSE_4 | CAUSE_3 | ANIM_DEAD | -S:S_MONSTERS | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_2 +S:ANIM_DEAD +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:HEAL +S:HOLD +S:S_MONSTERS +S:S_UNDEAD D:An evil priest, dressed all in black. Deadly spells hit you at an D:alarming rate as his black spiked mace rains down blow after blow on your D:pitiful frame. @@ -11390,14 +18851,35 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | CAN_FLY | -F:SMART | TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_9 | -S:TELE_LEVEL | BLIND | HOLD | CONF | CAUSE_4 | DRAIN_MANA | BO_NETH | +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:SMART +F:TAKE_ITEM +F:UNDEAD +S:1_IN_9 +S:BLIND +S:BO_NETH +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD S:S_UNDEAD +S:TELE_LEVEL D:It is an unlife of power almost unequalled. An affront to existence, its D:very touch abuses and disrupts the flow of life, and its unearthly limbs, D:of purest black, crush rock and flesh with ease. @@ -11412,15 +18894,32 @@ B:CLAW:HURT:3d10 B:CLAW:HURT:3d10 B:BITE:POISON:5d10 B:BITE:POISON:5d10 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:DRAGON | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | SLOW | CONF | ARROW_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DRAGON +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +S:1_IN_6 +S:ARROW_3 +S:BLIND S:BR_POIS +S:CONF +S:SLOW D:A constructed dragon, the drolem has massive strength. Powerful spells D:weaved during its creation make it a fearsome adversary. Its eyes show D:little intelligence, but it has been instructed to destroy all it meets. @@ -11435,14 +18934,30 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:COLD:4d14 B:BITE:COLD:4d14 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CORPSE -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MALE +F:MOVE_BODY +F:NO_CONF +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_FIRE +F:UNIQUE +S:1_IN_4 S:BR_COLD +S:CAUSE_3 +S:CONF D:An ancient and wise dragon, Scatha has grown clever over the long years. D:His scales are covered with frost, and his breath sends a shower of ice D:into the air. @@ -11455,10 +18970,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | -F:NO_SLEEP | NO_FEAR | -F:FRIENDS | -F:MALE | OPEN_DOOR | BASH_DOOR | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ZANGBAND D:Fierce, barbaric warriors, armed with great spiked clubs, and surrounded D:in an aura of scarlet. Whenever one of them is slain, another appears D:out of nowhere to take his place. @@ -11473,15 +18997,38 @@ B:HIT:UN_BONUS:4d8 B:HIT:UN_BONUS:4d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | CAN_SWIM | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE -F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | DRAIN_MANA | -S:MIND_BLAST | BA_NETH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:CONF +S:DRAIN_MANA +S:HOLD +S:MIND_BLAST +S:TELE_TO D:A humanoid form, black as night, advancing steadily and unstoppably. N:695:Zoth-Ommog @@ -11494,15 +19041,35 @@ B:CRUSH:HURT:25d3 B:CRUSH:HURT:25d3 B:BITE:LOSE_DEX:2d10 B:BITE:LOSE_CON:2d10 -F:UNIQUE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_25 | CAN_SWIM | ELDRITCH_HORROR | -F:KILL_ITEM | BASH_DOOR | POWERFUL | -F:EVIL | IM_ACID | IM_COLD | IM_ELEC | IM_POIS | -F:NO_FEAR | CTHANGBAND -S:1_IN_5 | -S:S_MONSTER | SCARE | CAUSE_4 | S_HYDRA | S_SPIDER | -S:BA_NETH | BA_POIS | BA_ACID | CAUSE_3 | HOLD | MIND_BLAST +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_ITEM +F:NO_FEAR +F:POWERFUL +F:RAND_25 +F:UNIQUE +S:1_IN_5 +S:BA_ACID +S:BA_NETH +S:BA_POIS +S:CAUSE_3 +S:CAUSE_4 +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_HYDRA +S:S_MONSTER +S:S_SPIDER D:"A body shaped like a road-based, truncated cone. A flat, blunt, D:wedge-shaped, vaguely reptilian head surmounts this conical torso, D:and the head is almost entirely hidden behind swirling tresses. @@ -11522,11 +19089,20 @@ B:HIT:EAT_ITEM:5d5 B:HIT:EAT_ITEM:5d5 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_GOLD:5d5 -F:MALE | DROP_2D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | TELE_TO | CONF | TRAPS | ARROW_2 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_2 +S:ARROW_2 +S:BLINK +S:CONF +S:TELE_TO +S:TPORT +S:TRAPS D:A class of its own: you are already too late to protect your possessions - D:and he seems to have studied magic too, and is a master of setting traps. @@ -11540,15 +19116,32 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:FIRE:5d14 -F:UNIQUE | MALE | REFLECTING | CAN_FLY | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:SMART | EVIL | DRAGON | IM_FIRE | BASEANGBAND -F:HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:SMART +F:UNIQUE +S:1_IN_4 S:BR_FIRE +S:CAUSE_3 +S:CONF D:Smaug is one of the Uruloki that still survive, a fire-drake of immense D:cunning and intelligence. His speed through air is matched by few other D:dragons, his dragonfire is legendary, and his hide is @@ -11565,10 +19158,26 @@ B:WAIL:TERRIFY B:HIT:EXP_80:64d1 B:HIT:EXP_80:64d1 B:HIT:EXP_80:8d8 -F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD | IM_FIRE | RES_NETH | -F:FORCE_SLEEP | UNIQUE | FORCE_MAXHP | CAN_FLY | -F:COLD_BLOOD | BASH_DOOR | NONLIVING | -F:NO_CONF | NO_SLEEP | NO_FEAR | ZANGBAND | HAS_LITE | NO_CUT | NO_STUN +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_NETH +F:UNIQUE +F:ZANGBAND D:The mightiest of hellblades, a black runesword which thirsts for D:your soul. @@ -11581,14 +19190,40 @@ O:0:100:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | GOOD | -F:RES_NETH | RES_NEXU | RES_DISE | RES_TELE | DROP_SKELETON | DROP_CORPSE -F:NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN | -F:DROP_2D2 | DROP_90 | REFLECTING | -F:MALE | OPEN_DOOR | BASH_DOOR | FORCE_MAXHP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:HEAL | CAUSE_3 | CAUSE_4 | HASTE | SCARE | BLIND | S_ANGEL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_TELE +S:1_IN_4 +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:HASTE +S:HEAL +S:SCARE +S:S_ANGEL D:It seems that the more devout the person, the more likely they are to cross D:the boundary between piety and sanctimoniousness. And such is the case with D:the Order of the Knights Templar; they are among the most pious and @@ -11603,12 +19238,19 @@ W:46:6:800:80 E:1:1:1:2:1:1 O:0:0:0:0 B:EXPLODE:HURT:20d3 -F:RAND_25 | TAKE_ITEM | SMART | -F:EVIL | OPEN_DOOR | MALE | -F:MORTAL | ZANGBAND -S:MULTIPLY | -S:1_IN_6 | -S:BLINK | TPORT | TELE_TO +F:EVIL +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:SMART +F:TAKE_ITEM +F:ZANGBAND +S:1_IN_6 +S:BLINK +S:MULTIPLY +S:TELE_TO +S:TPORT D:These leprechauns are not afraid to die for their cause. They are D:carrying explosives and making terrorist strikes... @@ -11621,15 +19263,34 @@ O:10:50:40:0 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:EXP_80:7d14 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | RES_TELE | -F:COLD_BLOOD | CAN_FLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | ATTR_MULTI -S:1_IN_6 | -S:CONF | SCARE | -S:BR_COLD | BR_NETH +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DRAGON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:TAKE_ITEM +F:UNDEAD +S:1_IN_6 +S:BR_COLD +S:BR_NETH +S:CONF +S:SCARE D:The skeletal form of a once-great dragon, enchanted by magic most D:perilous. Its animated form strikes with speed and drains life from its D:prey to satisfy its hunger. @@ -11644,13 +19305,28 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_1D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | TELE_TO | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:HEAL S:S_MONSTERS +S:TELE_TO D:A forty foot tall humanoid that shakes the ground as it walks. The power D:radiating from its frame shakes your courage, its hatred inspired by your D:defiance. @@ -11665,14 +19341,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:7d14 B:GAZE:PARALYZE -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | RES_NEXU | RES_TELE | -F:ANIMAL | EVIL | DRAGON | IM_ACID | IM_FIRE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:HOLD | SCARE | -S:BR_FIRE | BR_NEXU +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NEXU +F:RES_TELE +S:1_IN_6 +S:BR_FIRE +S:BR_NEXU +S:HOLD +S:SCARE D:A mixture of dragon and basilisk, the dracolisk stares at you with deep D:piercing eyes, its evil breath burning the ground where it stands. @@ -11684,10 +19377,22 @@ B:CLAW:HURT:3d8 B:CLAW:HURT:3d8 B:BITE:EXP_40:4d6 B:BITE:EXP_40:4d6 -F:ANIMAL | MORTAL | EVIL | CAN_FLY | BASH_DOOR | IM_COLD | IM_POIS -F:WILD_TOO | WILD_WASTE | WILD_WOOD | WILD_SWAMP | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EVIL +F:IM_COLD +F:IM_POIS +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD S:1_IN_6 -S:BR_NETH | BR_DARK | BR_POIS +S:BR_DARK +S:BR_NETH +S:BR_POIS D:A terrifying sight: a winged creature greater than any bird you have ever D:seen, and with no feathers on its horrid black leathery wings. Descended D:from a creature of an older world perhaps, bred by Sauron to be a winged @@ -11703,15 +19408,33 @@ B:BITE:EXP_40:2d13 B:BITE:EXP_40:2d13 B:BITE:LOSE_STR:5d8 B:GAZE:TERRIFY -F:FORCE_SLEEP | FORCE_MAXHP | -F:EVIL | UNDEAD | ANIMAL | RES_NEXU | RES_TELE -F:NO_CONF | NO_FEAR | NO_SLEEP | -F:IM_POIS | IM_ACID | IM_COLD | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | ZANGBAND | NO_CUT -S:1_IN_6 | -S:HOLD | SCARE | -S:BR_NEXU | BR_POIS | BR_NETH +F:ANIMAL +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NEXU +F:RES_TELE +F:UNDEAD +F:ZANGBAND +S:1_IN_6 +S:BR_NETH +S:BR_NEXU +S:BR_POIS +S:HOLD +S:SCARE D:A deadly undead horror which looks like a skeletal tyrannosaur D:surrounded by a sickly green glow. @@ -11723,13 +19446,32 @@ E:0:0:0:0:0:0 O:0:0:100:0 B:TOUCH:LOSE_ALL:1d166 B:TOUCH:LOSE_ALL:1d166 -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | -F:ELDRITCH_HORROR | NEVER_MOVE | REGENERATE | POWERFUL | -F:DROP_2D2 | DROP_4D2 | DROP_GOOD | ONLY_ITEM | -F:SMART | IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | CTHANGBAND -S:1_IN_4 | -S:BR_NUKE | S_DEMON | DARKNESS | S_UNDEAD | ANIM_DEAD -S:BR_NEXU | BR_CHAO +F:CTHANGBAND +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:SMART +F:UNIQUE +S:1_IN_4 +S:ANIM_DEAD +S:BR_CHAO +S:BR_NEXU +S:BR_NUKE +S:DARKNESS +S:S_DEMON +S:S_UNDEAD D:"There, about the pulsating body of the Ancient One, hugely D:winged reptilian creatures without faces cluttered and clutched D:at a multitude of blackly writhing, pendulous breasts! Its eyes @@ -11745,14 +19487,46 @@ O:0:0:100:0 B:CLAW:LOSE_INT:5d10 B:CLAW:LOSE_WIS:5d10 B:BITE:CONFUSE:5d10 -F:FORCE_SLEEP | ELDRITCH_HORROR | PASS_WALL | UNIQUE | -F:INVISIBLE | DROP_2D2 | DROP_4D2 | CAN_FLY | DROP_GOOD | ONLY_ITEM | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | POWERFUL | NO_CONF | NO_SLEEP | -F:SMART | IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | -F:MORTAL | CTHANGBAND | NO_CUT -S:1_IN_4 | -S:BR_WALL | TELE_AWAY | BR_GRAV | TELE_LEVEL | S_DEMON | S_UNDEAD | S_KIN | -S:BRAIN_SMASH | HASTE | BLIND | BLINK | BR_INER | CAUSE_3 | CAUSE_4 +F:BASH_DOOR +F:CAN_FLY +F:CTHANGBAND +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:POWERFUL +F:SMART +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:BR_GRAV +S:BR_INER +S:BR_WALL +S:CAUSE_3 +S:CAUSE_4 +S:HASTE +S:S_DEMON +S:S_KIN +S:S_UNDEAD +S:TELE_AWAY +S:TELE_LEVEL D:The chief among the creatures known as Lloigor. Ghatanothoa, unlike most of D:his kind, has assumed a shape, and one which is too horrible to describe: D:"Nothing I could say could even adumbrate the loathsome, unholy, non-human, @@ -11769,10 +19543,21 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | PET | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR | -F:GOOD | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM D:A tree-herd: a sentient, moving tree. Its wrath is fearsome, and it could D:split stones and even the very rock of Isengard with its roots. @@ -11786,10 +19571,22 @@ B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | HURT_ROCK | -F:ONLY_GOLD | DROP_4D2 | MOVE_BODY | KILL_WALL | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | HAS_LITE | NO_CUT +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_GOLD +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM D:A rock giant, a being made of living stone. N:710:Itangast the Fire Drake @@ -11802,14 +19599,29 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:FIRE:4d14 B:BITE:FIRE:4d14 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_4 S:BR_FIRE +S:CAUSE_3 +S:CONF D:A mighty ancient dragon, Itangast's form scorches your flesh. Wisps of D:smoke curl up from his nostrils as he regards you with disdain. @@ -11823,9 +19635,20 @@ B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:EXP_80:5d5 -F:FORCE_SLEEP | NEVER_MOVE | CAN_SWIM | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is the epitome of all that is evil, in a mold. Its lifeless form draws D:power from sucking the souls of those that approach it; a nimbus of pure D:evil surrounds it. Luckily for you, it can't move... @@ -11840,15 +19663,35 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:POISON:5d14 -F:UNIQUE | MALE | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | DROP_CORPSE | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | INVISIBLE | -F:EVIL | DRAGON | IM_FIRE | IM_POIS | ZANGBAND | -F:HAS_LITE -S:1_IN_3 | -S:CONF | CAUSE_3 | -S:BR_FIRE | BR_POIS | SCARE | CAUSE_3 | CONF +F:BASH_DOOR +F:CAN_SPEAK +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_COLD +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BR_FIRE +S:BR_POIS +S:CAUSE_3 +S:CAUSE_3 +S:CONF +S:CONF +S:SCARE D:The mighty dragon of myth, Fafner was a giant who slew his D:brother to win a treasure hoard, and then transformed himself D:into a dragon, greedily watching over his gold. @@ -11863,15 +19706,41 @@ B:WAIL:LOSE_ALL B:TOUCH:UN_POWER B:HIT:EXP_80:8d12 B:HIT:EAT_GOLD:8d12 -F:UNIQUE | MALE | SMART | CAN_SWIM | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_GOLD | DROP_3D2 | DROP_4D2 | -F:COLD_BLOOD | PASS_WALL | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_STUN | NO_CONF | NO_SLEEP | RES_TELE | ZANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS | -S:BO_ICEE | BO_NETH | BA_COLD | BA_NETH | BA_WATE | +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +F:PASS_WALL +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BA_COLD +S:BA_NETH +S:BA_WATE +S:BLIND +S:BO_ICEE +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE S:S_UNDEAD D:The ferryman across the river Styx to the land of the dead. D:He wishes to receive payment for your entry. @@ -11886,10 +19755,23 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | SUSCEP_FIRE | -F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR | -F:GOOD | PET | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE D:Unusually hasty, for an ent. Quickbeam hates evil creatures, and orcs in D:particular, since the destruction of his beloved rowan-trees to feed the D:fires of Orthanc. @@ -11904,15 +19786,38 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:FIRE:8d14 B:BITE:POISON:8d14 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_RANDART -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:SMART | EVIL | DRAGON | IM_POIS | IM_FIRE | -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | -S:BR_FIRE | BR_POIS | BR_SOUN | S_HI_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_RANDART +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BR_FIRE +S:BR_POIS +S:BR_SOUN +S:CONF +S:SCARE +S:S_HI_DRAGON D:Glaurung is the father of all dragons, and was for a long time the most D:powerful. Though this is no longer so, he still has full command over D:his brood and can command them to appear whenever he so wishes. He is @@ -11928,10 +19833,21 @@ B:BITE:FIRE:5d8 B:BITE:FIRE:5d8 B:CRUSH:HURT:3d15 B:CRUSH:HURT:3d15 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | ANIMAL | AQUATIC | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP S:1_IN_9 S:BR_FIRE D:A great water-beast, with an almost impenetrable skin. @@ -11946,19 +19862,32 @@ B:CLAW:HURT:7d13 B:CLAW:HURT:7d13 B:BITE:HURT:8d13 B:BITE:HURT:8d13 -F:UNIQUE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | RES_NETH | -F:ANIMAL | EVIL | IM_FIRE | NO_SLEEP | ZANGBAND -S:1_IN_3 | -S:BR_NETH | BR_COLD | BR_DARK | -S:S_HOUND | S_UNDEAD -D:Garm is a gigantic hound, whose job is to guard that none escapes -D:the tortures of Hel, the place of punishment for the wicked -D:and cowardly dead. - -N:718:Greater wall monster +F:ANIMAL +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BR_COLD +S:BR_DARK +S:BR_NETH +S:S_HOUND +S:S_UNDEAD +D:Garm is a gigantic hound, whose job is to guard that none escapes +D:the tortures of Hel, the place of punishment for the wicked +D:and cowardly dead. + +N:718:Greater wall monster G:#:W I:120:15d40:20:80:20 W:44:4:0:900 @@ -11967,11 +19896,26 @@ O:0:0:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | RAND_50 | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | CAN_FLY | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF F:NO_CUT -S:MULTIPLY | +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +S:MULTIPLY D:A sentient, moving section of wall. N:719:Nycadaemon @@ -11984,13 +19928,33 @@ B:TOUCH:TERRIFY B:CLAW:HURT:6d6 B:CLAW:HURT:6d6 B:CLAW:HURT:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | NONLIVING | -F:REGENERATE | IM_ACID | IM_COLD | IM_FIRE | CAN_FLY | -F:NO_SLEEP | NO_STUN | NO_CONF | EVIL | DEMON | -F:INVISIBLE | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | BASEANGBAND -S:1_IN_4 | -S:HOLD | BLINK | CONF | S_DEMON | BRAIN_SMASH | BR_NETH +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:DEMON +F:DROP_1D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:INVISIBLE +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:REGENERATE +S:1_IN_4 +S:BLINK +S:BRAIN_SMASH +S:BR_NETH +S:CONF +S:HOLD +S:S_DEMON D:A loathsome, sturdy, winged, horned demon, with talons that could tear D:a stone wall down. @@ -12004,12 +19968,24 @@ B:HIT:HURT:4d10 B:HIT:HURT:4d10 B:HIT:LOSE_CON:10d2 B:STING:POISON:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | -F:ONLY_ITEM | DROP_1D2 | NONLIVING | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_POIS | NO_CONF | NO_SLEEP -S:1_IN_7 | -S:SCARE | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_7 +S:SCARE +S:S_DEMON D:A foul, humanoid creature with a long tail, clawed hands and feet, D:and a disgusting, wiry, snaky beard. They are the elite shock troops D:of the hells, capable of a terrifying berserk fury. @@ -12024,14 +20000,37 @@ B:GAZE:TERRIFY B:BUTT:HURT:6d6 B:BITE:EXP_40 B:BITE:LOSE_CON -F:EVIL | DEMON | FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART | NONLIVING | -F:NO_CONF | NO_SLEEP | HURT_LITE | IM_FIRE | IM_COLD | ZANGBAND -S:1_IN_4 | -S:BLIND | CONF | BRAIN_SMASH | SCARE | ANIM_DEAD -S:BA_NETH | FORGET | S_UNDEAD | DRAIN_MANA | -S:S_DEMON | CAUSE_4 | BA_COLD +F:BASH_DOOR +F:DEMON +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:ZANGBAND +S:1_IN_4 +S:ANIM_DEAD +S:BA_COLD +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE +S:S_DEMON +S:S_UNDEAD D:It is a demonic creature from the lowest hell, vaguely resembling a D:large black he-goat. @@ -12045,14 +20044,35 @@ B:TOUCH:POISON:6d5 B:TOUCH:POISON:6d5 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:SCARE +S:S_UNDEAD D:Everywhere colours seem paler and the air chiller. At the centre of the D:cold stands a mighty figure. Its wings envelop you in the chill of death D:as the nightwing reaches out to draw you into oblivion. Your muscles sag @@ -12069,12 +20089,22 @@ B:HIT:SHATTER:8d8 B:HIT:SHATTER:8d8 B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 -F:ONLY_ITEM | DROP_60 | DROP_GOOD | RES_TELE | -F:BASH_DOOR | STUPID | DROP_CORPSE | -F:EVIL | IM_FIRE | FORCE_SLEEP | FORCE_MAXHP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BO_PLAS | BA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:ONLY_ITEM +F:RES_TELE +F:STUPID +S:1_IN_5 +S:BA_FIRE +S:BO_PLAS D:It is a belligerent minotaur with a destructive magical arsenal, armed D:with a hammer. @@ -12088,12 +20118,20 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | -F:FRIENDS | RES_NETH | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_NETH +S:1_IN_5 S:BR_NETH D:You feel a soul-tearing chill upon viewing this beast, a ghostly form of D:darkness in the shape of a large dog. @@ -12108,12 +20146,18 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_5 S:BR_TIME D:You get a terrible sense of deja vu, or is it a premonition? All at once D:you see a little puppy and a toothless old dog. Perhaps you should give @@ -12129,12 +20173,23 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | SUSCEP_COLD | -F:FRIENDS | RES_PLAS | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_FIRE | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_PLAS +F:SUSCEP_COLD +S:1_IN_5 S:BR_PLAS D:The very air warps as pure elemental energy stalks towards you in the D:shape of a giant hound. Your hair stands on end and your palms itch as @@ -12146,12 +20201,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_DEMON +S:TPORT D:A pile of pulsing flesh that glows with an inner hellish fire. The world D:itself seems to cry out against it. @@ -12165,14 +20229,32 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ELEC:6d14 B:BITE:ELEC:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_ELEC +S:CONF +S:SCARE D:A vast dragon of power. Storms and lightning crash around its titanic D:form. Deep blue scales reflect the flashes and highlight the creature's D:great muscles. It regards you with contempt. @@ -12186,13 +20268,31 @@ O:0:100:0:0 B:HIT:SHATTER:20d12 B:HIT:SHATTER:20d12 B:BITE:POISON:6d14 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:DROP_90 | REGENERATE | KILL_WALL | RES_TELE | KILL_BODY | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | -F:IM_ELEC | IM_COLD | IM_FIRE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_WALL +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SPECIAL_GENE +F:TROLL +F:UNIQUE D:Ulik is the strongest troll who has ever lived. He could challenge D:the immortals and pound them to dust with his great strength. @@ -12206,15 +20306,29 @@ B:BUTT:HURT:12d13 B:BUTT:HURT:12d13 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | DROP_CORPSE | -F:EVIL | IM_FIRE | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_6 | -S:SLOW | ARROW_4 | BO_MANA | BO_PLAS | BA_ELEC | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:UNIQUE +S:1_IN_6 +S:ARROW_4 +S:BA_ELEC +S:BO_MANA +S:BO_PLAS S:BR_WALL +S:SLOW D:A fearsome bull-headed monster, Baphomet swings a mighty axe as he curses D:all that defy him. @@ -12228,14 +20342,35 @@ B:HIT:HURT:10d5 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | IM_FIRE | IM_COLD | IM_POIS | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_NETH | RES_NEXU | RES_PLAS | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_3 | BA_NETH | BA_FIRE | BO_PLAS -S:S_MONSTERS | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:SMART +S:1_IN_5 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:CAUSE_3 +S:SCARE +S:S_DEMON +S:S_MONSTERS D:It is a humanoid form dressed in armour of ancient style. From beneath D:its helmet, eyes glow with hellfire. @@ -12249,14 +20384,29 @@ B:CHARGE:EAT_GOLD:5d5 B:CHARGE:EAT_ITEM:5d5 B:SPIT:BLIND:10d5 B:DROOL:DISEASE:8d5 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_POIS | EVIL | RES_TELE -F:MORTAL | JOKEANGBAND | HAS_LITE -S:1_IN_6 | -S:TRAPS | S_BUG +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:S_BUG +S:TRAPS D:He may not code worth a dime, but he certainly knows how to make money. N:733:Santa Claus @@ -12269,16 +20419,45 @@ B:HIT:LOSE_CHR:5d5 B:TOUCH:LOSE_ALL:10d1 B:TOUCH:LOSE_ALL:10d1 B:CHARGE:EAT_GOLD -F:UNIQUE | MALE | CAN_SPEAK | REFLECTING | DROP_SKELETON | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:NO_STUN | NO_SLEEP | -F:IM_ELEC | IM_FIRE | IM_POIS | IM_COLD | -F:COLD_BLOOD | RES_TELE | JOKEANGBAND | HAS_LITE -S:1_IN_3 | -S:CAUSE_4 | HOLD | DRAIN_MANA | SCARE | BLIND | -S:S_UNDEAD | S_HI_UNDEAD | S_HI_DRAGON | S_UNIQUE | -S:BA_NETH | FORGET | TRAPS | BRAIN_SMASH | TELE_AWAY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:FORGET +S:HOLD +S:SCARE +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_UNDEAD +S:S_UNIQUE +S:TELE_AWAY +S:TRAPS D:Why would anybody want to kill Santa Claus? To get all the presents, D:of course! @@ -12292,14 +20471,38 @@ B:BITE:PARALYZE:8d1 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 -F:UNIQUE | CAN_SPEAK | ESCORT | REGENERATE | -F:FORCE_SLEEP | FORCE_MAXHP | ELDRITCH_HORROR | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_SLEEP | RES_TELE | CTHANGBAND | NO_CUT -S:1_IN_4 | -S:S_UNDEAD | S_DEMON | S_MONSTER | BLINK | BA_ACID | FORGET +F:BASH_DOOR +F:CAN_SPEAK +F:CTHANGBAND +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_4 +S:BA_ACID +S:BLINK +S:FORGET +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD D:"Then came pale movement in the well, and something clambered D:up from the dark, a bloated blanched oval supported on myriad D:fleshless legs. Eyes formed in the gelatinous oval and stared @@ -12315,15 +20518,46 @@ B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:GAZE:LOSE_WIS:5d10 B:GAZE:TERRIFY:5d10 -F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | FORCE_MAXHP | CTHANGBAND | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_ACID | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | NO_CUT -S:1_IN_2 | -S:S_DEMON | S_UNDEAD | S_KIN | SCARE | CAUSE_3 | CAUSE_4 | ANIM_DEAD -S:TELE_AWAY | TPORT | BRAIN_SMASH | CONF +F:ATTR_ANY +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:CTHANGBAND +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:SCARE +S:S_DEMON +S:S_KIN +S:S_UNDEAD +S:TELE_AWAY +S:TPORT D:The King in Yellow is an Avatar of Hastur: "He has no D:face, and is twice as tall as a man. He wears pointed shoes under D:his tattered, fantastically colored robes, and a streamer of silk @@ -12340,14 +20574,39 @@ B:BITE:DISEASE:10d10 B:BITE:ACID:10d10 B:BITE:POISON:10d10 B:BITE:CONFUSE:10d10 -F:DEMON | EVIL | NONLIVING | CAN_SWIM | -F:FORCE_SLEEP | FORCE_MAXHP | ONLY_ITEM | DROP_2D2 | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | SMART | POWERFUL | DROP_GOOD | KILL_BODY | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP -F:KILL_ITEM | ZANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:ZANGBAND S:1_IN_3 -S:BR_ACID | BR_POIS | BR_NUKE | SCARE | ANIM_DEAD -S:CAUSE_3 | CAUSE_4 | S_DEMON | S_UNDEAD +S:ANIM_DEAD +S:BR_ACID +S:BR_NUKE +S:BR_POIS +S:CAUSE_3 +S:CAUSE_4 +S:SCARE +S:S_DEMON +S:S_UNDEAD D:This disgusting demon resembles a shambling pile of rotting D:green flesh, with dozens of mouths drooling and leaving a D:trail of foul-smelling goo behind. Nurgle must be @@ -12363,15 +20622,38 @@ B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:LOSE_ALL:15d1 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | -F:ONLY_ITEM | DROP_4D2 | ATTR_MULTI | EVIL | SHAPECHANGER | ATTR_ANY | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL | EVIL | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:ZANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | MIND_BLAST | BA_CHAO | -S:S_SPIDER | S_HOUND | S_DEMON +F:ATTR_ANY +F:ATTR_MULTI +F:BASH_DOOR +F:DROP_4D2 +F:DROP_SKELETON +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SHAPECHANGER +F:SMART +F:ZANGBAND +S:1_IN_2 +S:BA_CHAO +S:HEAL +S:MIND_BLAST +S:S_DEMON +S:S_HOUND +S:S_SPIDER D:He is one of the few true masters of the art, being extremely skillful in D:all forms of unarmed combat and controlling the Chaos D:with disdainful ease. @@ -12385,15 +20667,35 @@ O:0:0:100:0 B:HIT:HURT:6d8 B:HIT:HURT:6d8 B:HIT:HURT:6d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | CAUSE_4 | TRAPS | -S:BO_ACID | BA_FIRE | BA_COLD | BA_POIS | -S:S_MONSTER | S_DEMON | S_HI_DRAGON | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BA_POIS +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:S_DEMON +S:S_HI_DRAGON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spell casting. You stagger at the mighty sound of his D:spells as they echo hollowly through the dungeon. @@ -12408,11 +20710,16 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 -F:FORCE_SLEEP | FRIENDS | -F:INVISIBLE | PASS_WALL | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:FORCE_SLEEP +F:FRIENDS +F:INVISIBLE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PASS_WALL +S:1_IN_5 S:BR_NETH D:A pale green hound. Pulsing red lines and strange fluorescent light D:hint at internal organs best left to the imagination. @@ -12427,13 +20734,37 @@ B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE | -F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND -S:1_IN_4 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | -S:BA_WATE | DARKNESS | BR_DARK | TELE_TO +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_WATE +F:SMART +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_4 +S:BA_WATE +S:BLIND +S:BR_DARK +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DARKNESS +S:SCARE +S:TELE_TO D:An enormously fearsome and powerful inhabitant of the depths. It D:resembles a gargantuan octopus and its evil is almost tangible. @@ -12447,14 +20778,33 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:COLD:6d14 B:BITE:COLD:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | AURA_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_FIRE +S:1_IN_4 +S:BLIND S:BR_COLD +S:CONF +S:SCARE D:An immense dragon capable of awesome destruction. You have never felt D:such extreme cold, or witnessed such an icy stare. Begone quickly or feel D:its wrath! @@ -12469,15 +20819,44 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:4d12 B:TOUCH:LOSE_DEX:4d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | S_UNDEAD | FORGET | S_DEMON | -S:TPORT | HEAL | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:FORGET +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:S_UNDEAD +S:TELE_TO +S:TPORT D:A lich who is partially immaterial, on its way to a new, ethereal form. N:743:The Phoenix @@ -12490,15 +20869,36 @@ B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 -F:UNIQUE | CAN_SPEAK | RES_PLAS | AURA_FIRE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP -F:BASEANGBAND | HAS_LITE | REGENERATE -S:1_IN_3 | -S:BO_FIRE | BO_PLAS | BA_FIRE | -S:BR_FIRE | BR_LITE | BR_PLAS +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_PLAS +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:BR_LITE +S:BR_PLAS D:A massive glowing eagle bathed in flames. The searing heat chars your D:skin and melts your armour. @@ -12512,14 +20912,38 @@ B:STING:LOSE_CON:8d8 B:STING:LOSE_CON:8d8 B:BITE:ACID:10d10 B:BITE:ACID:10d10 -F:FORCE_SLEEP | SMART | KILL_WALL | CAN_SWIM | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | RES_TELE | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | BR_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:BR_NETH +S:SCARE +S:S_UNDEAD D:This intensely evil creature bears the form of a gargantuan black worm. D:Its gaping maw is a void of blackness, and acid drips from its steely hide. D:It is like nothing you have ever seen before, and a terrible chill runs @@ -12534,15 +20958,46 @@ O:0:0:100:0 B:CLAW:CONFUSE:10d10 B:CLAW:CONFUSE:10d10 B:BITE:BLIND:12d12 -F:DEMON | EVIL | ATTR_MULTI | DROP_GOOD | MOVE_BODY | NONLIVING | -F:FORCE_SLEEP | FORCE_MAXHP | ONLY_ITEM | DROP_2D2 | ELDRITCH_HORROR | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL | CAN_FLY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART F:ZANGBAND S:1_IN_3 -S:MIND_BLAST | BA_CHAO | SCARE | BRAIN_SMASH | DRAIN_MANA | -S:S_HOUND | S_DEMON | S_DRAGON | TPORT | HASTE | CONF | SCARE | -S:TELE_AWAY | FORGET +S:BA_CHAO +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:HASTE +S:MIND_BLAST +S:SCARE +S:SCARE +S:S_DEMON +S:S_DRAGON +S:S_HOUND +S:TELE_AWAY +S:TPORT D:The most powerful of Tzeentch's servitors. This demon looks like D:a huge bird-creature, with the head of a predatory bird and D:fantastically multi-coloured wings. @@ -12557,14 +21012,38 @@ B:HIT:CONFUSE:10d10 B:HIT:TERRIFY:10d10 B:HIT:BLIND:10d10 B:HIT:TERRIFY:10d10 -F:DEMON | EVIL | DROP_GOOD | NONLIVING | CAN_SWIM | -F:FORCE_SLEEP | FORCE_MAXHP | ONLY_ITEM | DROP_2D2 | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | SMART | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | ZANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:ZANGBAND S:1_IN_3 -S:SCARE | BRAIN_SMASH | DRAIN_MANA | -S:BR_CONF | S_DEMON | S_UNDEAD | TPORT | HEAL | +S:BRAIN_SMASH +S:BR_CONF +S:DRAIN_MANA +S:HEAL +S:SCARE +S:S_DEMON +S:S_UNDEAD S:TELE_AWAY +S:TPORT D:This demonic keeper of forbidden secrets looks like a hairless D:minotaur with extra arms, decorated with tattoos and nose rings. D:It is the embodiment of Slaanesh's perverted magic. @@ -12579,13 +21058,36 @@ B:CRUSH:SHATTER:55d2 B:CRUSH:SHATTER:55d2 B:TOUCH:LOSE_CON:1d2 B:TOUCH:LOSE_CON:1d2 -F:IM_FIRE | RES_PLAS | IM_COLD | IM_POIS | ELDRITCH_HORROR | RES_TELE | -F:KILL_WALL | ONLY_GOLD | DROP_4D2 | DROP_2D2 | CAN_SWIM | -F:EVIL | FORCE_MAXHP | SMART | UNIQUE | CTHANGBAND | NO_STUN -S:1_IN_5 | -S:SCARE | CONF | HOLD | S_DEMON | S_KIN | -S:HEAL | HASTE | FORGET | BRAIN_SMASH | -S:BR_DARK | BR_ACID | BR_DISE +F:CAN_SWIM +F:CTHANGBAND +F:DROP_2D2 +F:DROP_4D2 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NO_STUN +F:ONLY_GOLD +F:RES_PLAS +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_5 +S:BRAIN_SMASH +S:BR_ACID +S:BR_DARK +S:BR_DISE +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:S_KIN D:The most powerful and most evil of all Chthonians. D:"A great gray thing a mile long chanting and exuding strange acids... D:charging through the depths of the earth at a fantastic speed, in a @@ -12597,13 +21099,35 @@ I:130:60d10:20:110:10 W:57:2:10:18000 E:0:0:0:1:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE | -F:SMART | COLD_BLOOD | CAN_SWIM | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:TELE_AWAY | BLIND | CONF | SCARE | CAUSE_3 | FORGET | DARKNESS | -S:BO_FIRE | BO_ACID | BO_COLD | BO_ELEC +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:SCARE +S:TELE_AWAY D:A skeletal hand floating in the air, motionless except for its flexing D:fingers. @@ -12613,30 +21137,66 @@ I:130:10d100:20:90:10 W:58:2:2:21000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE | -F:SMART | COLD_BLOOD | -F:EVIL | UNDEAD | CAN_SWIM | -F:IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:BO_MANA | BO_NETH | BA_NETH | BRAIN_SMASH | S_UNDEAD -D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it -D:harmless. - -N:750:Skull druj -G:s:o +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BA_NETH +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:S_UNDEAD +D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it +D:harmless. + +N:750:Skull druj +G:s:o I:130:14d100:20:120:10 W:59:2:1000:24000 E:0:0:0:0:1:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | RES_TELE | -F:SMART | COLD_BLOOD | -F:EVIL | UNDEAD | CAN_SWIM | -F:IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:SLOW | CAUSE_4 | MIND_BLAST | BRAIN_SMASH | TRAPS | BO_PLAS | -S:BO_NETH | BA_WATE | S_UNDEAD +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BA_WATE +S:BO_NETH +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:MIND_BLAST +S:SLOW +S:S_UNDEAD +S:TRAPS D:A glowing skull possessed by sorcerous power. It need not move, but D:merely blast you with mighty magic. @@ -12650,11 +21210,22 @@ B:ENGULF:CONFUSE:5d5 B:ENGULF:CONFUSE:5d5 B:ENGULF:HURT:5d5 B:ENGULF:HURT:5d5 -F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP | -F:RAND_50 | RAND_25 | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 S:BR_CHAO D:Void, nothingness, spinning destructively. @@ -12668,15 +21239,53 @@ B:ENGULF:ELEC:5d5 B:ENGULF:FIRE:5d5 B:ENGULF:ACID:5d5 B:ENGULF:COLD:5d5 -F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP | CAN_FLY | -F:RAND_50 | RAND_25 | AURA_COLD | RES_WATE | RES_DISE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_NETH | RES_NEXU | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | AURA_FIRE | AURA_ELEC | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RES_PLAS | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | BR_LITE | -S:BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | BR_NETH | -S:BR_WALL | BR_INER | BR_TIME | BR_GRAV | BR_PLAS | BR_NEXU +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +S:1_IN_6 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL D:An awesome vortex of pure magic, power radiates from its frame. N:753:Nidhogg, the Hel-Drake @@ -12689,16 +21298,37 @@ B:CLAW:LOSE_CON:8d12 B:CLAW:LOSE_CON:8d12 B:BITE:EXP_80:8d15 B:BITE:EXP_80:8d15 -F:UNIQUE | CAN_FLY | RES_NETH | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | IM_POIS | -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_SPEAK | IM_ACID | -F:EVIL | DRAGON | IM_FIRE | NO_SLEEP | IM_COLD | ZANGBAND | -F:HAS_LITE -S:1_IN_5 | -S:CAUSE_3 | BR_NETH | BR_COLD | -S:BR_ACID | BR_POIS | -S:S_DRAGON | S_UNDEAD +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_NETH +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BR_ACID +S:BR_COLD +S:BR_NETH +S:BR_POIS +S:CAUSE_3 +S:S_DRAGON +S:S_UNDEAD D:In the bowels of Hel, the dread Nidhogg, a dragon blacker than the D:night, feasts on the essences of the dead. @@ -12712,17 +21342,41 @@ B:BITE:POISON:8d6 B:BITE:POISON:8d6 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 -F:UNIQUE | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | DROP_CORPSE | -F:ONLY_GOLD | DROP_3D2 | DROP_4D2 | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:OPEN_DOOR | BASH_DOOR | KILL_BODY | POWERFUL | REGENERATE | -F:ANIMAL | IM_FIRE | IM_POIS | -F:NO_CONF | NO_STUN | CAN_SWIM | -F:MORTAL | BASEANGBAND -S:1_IN_3 | -S:SCARE | -S:BO_FIRE | BO_PLAS | BA_FIRE | BA_POIS | -S:BR_FIRE | BR_POIS | S_HYDRA | S_KIN +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:MORTAL +F:NO_CONF +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:SMART +F:SUSCEP_COLD +F:UNIQUE +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_3 +S:BA_FIRE +S:BA_POIS +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:BR_POIS +S:SCARE +S:S_HYDRA +S:S_KIN D:A massive legendary hydra. It has twelve powerful heads. Its many eyes D:stare at you as clouds of smoke and poisonous vapour rise from its D:seething form. It grows new heads as fast as you chop them off. @@ -12737,15 +21391,45 @@ B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 B:HIT:CONFUSE:6d6 B:HIT:CONFUSE:6d6 -F:UNIQUE | FEMALE | SPECIAL_GENE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SPEAK | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | NO_STUN -F:RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_NETH | S_KIN | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_KIN D:Chief messenger between Sauron and Morgoth, she is the most deadly of her D:vampire race on Middle-earth. At first she is charming to meet, but her D:wings and eyes give away her true form. @@ -12760,14 +21444,33 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:6d14 B:BITE:FIRE:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | AURA_FIRE | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_COLD +S:1_IN_4 +S:BLIND S:BR_FIRE +S:CONF +S:SCARE D:A vast dragon of immense power. Fire leaps continuously from its huge D:form. The air around it scalds you. Its slightest glance burns you, and D:you realise how truly insignificant you are. @@ -12782,16 +21485,49 @@ B:CRUSH:HURT:14d8 B:CRUSH:HURT:14d8 B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 -F:UNIQUE | ELDRITCH_HORROR | CAN_SWIM | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SPEAK | AURA_ELEC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | POWERFUL | SMART | NONLIVING | -F:EVIL | DEMON | IM_COLD | IM_POIS | HURT_LITE | NO_SLEEP | -F:RES_TELE | CTHANGBAND -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_WATE | S_DEMON | HASTE | -S:TPORT | TELE_AWAY | TELE_TO | HEAL | BR_DARK | BR_NETH +F:AURA_ELEC +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:COLD_BLOOD +F:CTHANGBAND +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:SMART +F:UNIQUE +S:1_IN_3 +S:BA_WATE +S:BLIND +S:BRAIN_SMASH +S:BR_DARK +S:BR_NETH +S:CAUSE_4 +S:DRAIN_MANA +S:HASTE +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:TELE_AWAY +S:TELE_TO +S:TPORT D:His form is partially that of a reptile, partially that of a gigantic D:octopus. He will destroy you. @@ -12804,11 +21540,33 @@ O:0:100:0:0 B:HIT:HURT:50d1 B:HIT:HURT:50d1 B:HIT:HURT:50d1 -F:DEMON | EVIL | DROP_GOOD | REGENERATE | CAN_FLY | NONLIVING | -F:FORCE_SLEEP | FORCE_MAXHP | ONLY_ITEM | DROP_4D2 | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | RES_NETH | RES_NEXU | RES_TELE | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR -F:CAN_FLY | ZANGBAND | HAS_LITE +F:BASH_DOOR +F:CAN_FLY +F:CAN_FLY +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_NETH +F:RES_NEXU +F:RES_TELE +F:ZANGBAND D:Khorne's mightiest servant, a winged hound-demon walking on D:two paws and wielding a mighty axe and a whip in the other D:two. Intelligent, bloodthirsty eyes leer at you from inside @@ -12820,12 +21578,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_DRAGON +S:TPORT D:It looks like it was once a dragon corpse, now deeply infected with D:magical bacteria that make it pulse in a foul and degrading way. @@ -12839,18 +21606,56 @@ B:CRUSH:ACID:10d6 B:CRUSH:ACID:10d6 B:CRUSH:ACID:10d6 B:CRUSH:HURT:16d16 -F:UNIQUE | ELDRITCH_HORROR | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | SMART | CAN_SWIM | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:REGENERATE | ONLY_ITEM | KILL_ITEM | DROP_2D2 | DROP_90 | DROP_60 | -F:BASH_DOOR | EVIL | NO_CONF | NO_SLEEP | KILL_BODY | -F:FORCE_MAXHP | FORCE_SLEEP | HURT_LITE | POWERFUL | RES_NETH | NONLIVING | -F:IM_ACID | IM_FIRE | RES_PLAS | IM_POIS | IM_COLD | IM_ELEC | RES_TELE -F:CTHANGBAND | NO_CUT -S:1_IN_5 | -S:BRAIN_SMASH | MIND_BLAST | HASTE | TPORT | -S:S_DEMON | S_UNDEAD | S_HI_UNDEAD | S_KIN | -S:BR_DARK | BR_NUKE | BR_ACID | BR_POIS +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:DROP_1D2 +F:DROP_2D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_PLAS +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_5 +S:BRAIN_SMASH +S:BR_ACID +S:BR_DARK +S:BR_NUKE +S:BR_POIS +S:HASTE +S:MIND_BLAST +S:S_DEMON +S:S_HI_UNDEAD +S:S_KIN +S:S_UNDEAD +S:TPORT D:"...a little finger of blackness crept out from beneath its edge D:a great wave of iridescent blackness, neither liquid nor solid, D:a frightful gelatinous mass." @@ -12865,13 +21670,36 @@ B:CRUSH:HURT:13d13 B:CRUSH:FIRE:10d10 B:CRUSH:HURT:13d13 B:CRUSH:FIRE:10d10 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | NONLIVING | ELDRITCH_HORROR | CTHANGBAND | NO_CUT | NO_SLEEP | NO_CONF | NO_STUN +F:BASH_DOOR +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE S:1_IN_6 -S:BR_FIRE | S_DEMON | CAUSE_4 | BR_PLAS | BR_NETH | BRAIN_SMASH | -S:S_UNDEAD | BA_DARK +S:BA_DARK +S:BRAIN_SMASH +S:BR_FIRE +S:BR_NETH +S:BR_PLAS +S:CAUSE_4 +S:S_DEMON +S:S_UNDEAD D:"Higher already than the giants of the forest ringing it, the D:fifty-foot-thick column... sprouted a ring of tendrils, ruddy and D:golden and glittering overall with inclusions of quartz." @@ -12886,15 +21714,40 @@ B:HIT:HURT:10d10 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | PET | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:HEAL | BLIND | CONF | SCARE | CAUSE_3 | CAUSE_4 | BRAIN_SMASH | -S:FORGET | S_MONSTERS | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:HEAL +S:SCARE +S:S_ANIMALS +S:S_MONSTERS D:He is one of the greatest dwarven priests to walk the earth. Fundin has D:earned a high position in the church, and his skill with both weapon and D:spell only justify his position further. His combination of both dwarven @@ -12910,12 +21763,28 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:CRUSH:ACID:9d9 B:CRUSH:ACID:9d9 -F:FORCE_SLEEP | FORCE_MAXHP | BASEANGBAND | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | NONLIVING | -F:EVIL | DEMON | IM_POIS | IM_ACID | NO_CONF | NO_SLEEP -S:1_IN_6 | -S:BR_POIS | BR_ACID | S_DEMON | BLIND | CONF | ARROW_4 +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_6 +S:ARROW_4 +S:BLIND +S:BR_ACID +S:BR_POIS +S:CONF +S:S_DEMON D:It's big. It's fat. It's red. It's ugly. It's got a severe attack of D:highly poisonous flatulence. And its insides are corrosive. All of which D:go together to make the single most repulsive sight - and smell - you have @@ -12931,16 +21800,44 @@ B:HIT:FIRE:4d12 B:HIT:FIRE:4d12 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:UNIQUE | MALE | CAN_SPEAK | NO_FEAR | GOOD | AURA_FIRE | REFLECTING | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NO_SLEEP -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TELE_TO | BLIND | -S:BO_FIRE | BO_MANA | BA_FIRE | -S:BR_FIRE | BR_PLAS | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:SUSCEP_COLD +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BA_FIRE +S:BLIND +S:BO_FIRE +S:BO_MANA +S:BR_FIRE +S:BR_PLAS S:S_ANGEL +S:TELE_TO D:A creature of godly appearance. You dare not challenge Uriel's supremacy. D:Those who stood against him before are but a memory, cremated by his D:mastery of elemental fire. @@ -12955,17 +21852,45 @@ B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:UNIQUE | MALE | CAN_SPEAK | RES_NETH | NO_FEAR | GOOD | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | REFLECTING | AURA_COLD | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | CAN_FLY | NO_SLEEP -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE | BASEANGBAND -F:HAS_LITE -S:1_IN_2 | -S:TELE_TO | BLIND | -S:BO_MANA | BO_NETH | BA_NETH | -S:BR_NETH | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_NETH +F:RES_TELE +F:SMART +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BR_NETH S:S_ANGEL +S:TELE_TO D:Azriel commands awesome power, his visage holy enough to shrivel your D:soul. You shriek with disbelief as his mastery of death draws you to your D:grave. It is truly beyond all but the mightiest of warriors to stand @@ -12981,17 +21906,41 @@ B:CLAW:HURT:10d12 B:CLAW:HURT:10d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:UNIQUE | MALE | CAN_FLY | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BR_ACID | BR_FIRE | BR_DISI | BR_WALL | BR_TIME | -S:S_HI_DRAGON | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BR_ACID +S:BR_DISI +S:BR_FIRE +S:BR_TIME +S:BR_WALL +S:S_HI_DRAGON +S:S_KIN D:"Rushing Jaws" is his name, and death is his game; the greatest and most D:terrible of all dragonkind, his power dismayed even the Valar for a time. @@ -13005,14 +21954,37 @@ B:TOUCH:CONFUSE:5d12 B:TOUCH:CONFUSE:5d12 B:TOUCH:CONFUSE:5d12 B:TOUCH:CONFUSE:5d12 -F:UNIQUE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:IM_ACID | IM_FIRE | IM_POIS | IM_COLD | ELDRITCH_HORROR | -F:NEVER_MOVE | RES_NEXU | REFLECTING | PASS_WALL -F:NO_CONF | NO_SLEEP | NO_CUT | NO_STUN | NO_FEAR | CTHANGBAND -S:1_IN_3 | -S:TELE_AWAY | S_MONSTERS | TELE_LEVEL | BR_NEXU | TPORT | BLINK +F:CAN_FLY +F:CAN_SPEAK +F:CTHANGBAND +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PASS_WALL +F:REFLECTING +F:RES_NEXU +F:UNIQUE +S:1_IN_3 +S:BLINK +S:BR_NEXU +S:S_MONSTERS +S:TELE_AWAY +S:TELE_LEVEL +S:TPORT D:"Not shapeless, but so complex that the eye could recognise no D:describable shape. There were hemispheres and shining metal, D:coupled by long plastic rods. The rods were of a flat gray color, @@ -13032,14 +22004,36 @@ B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:7d7 B:HIT:UN_BONUS:7d7 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | CAN_SWIM | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:SCARE +S:S_UNDEAD D:A huge giant garbed in black, more massive than a titan and stronger than D:a dragon. With terrible blows, it breaks your armour from your back, D:leaving you defenceless against its evil wrath. It can smell your fear, @@ -13056,15 +22050,43 @@ B:HIT:UN_BONUS:6d8 B:HIT:FIRE:6d8 B:HIT:BLIND:10d10 B:HIT:BLIND:10d10 -F:UNIQUE | MALE | FORCE_MAXHP | CAN_SPEAK | NO_SLEEP | GOOD | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | AURA_ELEC | REFLECTING | RES_TELE -F:ESCORT | CAN_FLY | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TELE_TO | BLIND | BO_MANA | -S:S_ANGEL | S_KIN +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:FORCE_MAXHP +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BLIND +S:BO_MANA +S:S_ANGEL +S:S_KIN +S:TELE_TO D:Commanding a legion of angels, Gabriel will destroy you for your sins. He D:will crush you like the pitiful insignificant being he sees you to be. D:Your very soul will be taken into judgement by his supreme authority as he @@ -13079,14 +22101,39 @@ O:0:100:0:0 B:HIT:EXP_80:10d10 B:HIT:EXP_80:10d10 B:HIT:EXP_80:10d10 -F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | RES_NEXU | RES_NETH | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:ZANGBAND | HAS_LITE -S:1_IN_4 | -S:BA_FIRE | BA_CHAO | CONF | TPORT | S_DEMON | BR_CHAO | BA_MANA +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_4 +S:BA_CHAO +S:BA_FIRE +S:BA_MANA +S:BR_CHAO +S:CONF +S:S_DEMON +S:TPORT D:He is one of the greatest warriors of chaos to walk the earth. D:His bloody blade has slain thousands and tens of thousands, and still D:hungers for more. @@ -13101,18 +22148,55 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | ATTR_MULTI | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:DROP_GREAT | DROP_CHOSEN | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | MIND_BLAST | FORGET | TRAPS | ANIM_DEAD | BO_MANA | -S:BO_ICEE | BA_ACID | BA_FIRE | BA_COLD | BA_WATE | BA_CHAO | -S:S_UNDEAD | S_DEMON | S_HI_DRAGON | S_ANIMALS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_ACID +S:BA_CHAO +S:BA_COLD +S:BA_FIRE +S:BA_WATE +S:BLIND +S:BO_ICEE +S:BO_MANA +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_ANIMALS +S:S_DEMON +S:S_HI_DRAGON +S:S_UNDEAD +S:TELE_AWAY +S:TPORT +S:TRAPS D:Originally known as the White, Saruman fell prey to Sauron's wiles. He D:searches forever for the One Ring, to become a mighty Sorcerer-King of the D:world. @@ -13127,13 +22211,25 @@ B:TOUCH:EAT_GOLD:5d5 B:TOUCH:EAT_ITEM:5d5 B:HIT:BLIND:10d5 B:HIT:POISON:8d5 -F:UNIQUE | MALE | CAN_SPEAK | SMART | -F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_POIS | BASEANGBAND -S:1_IN_6 | -S:TELE_TO | TRAPS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:TELE_TO +S:TRAPS D:He is a master of disguise, an expert of stealth, a genius at traps, and D:moves with blinding speed. Check your pockets! @@ -13147,13 +22243,34 @@ B:HIT:LOSE_CHR:8d8 B:HIT:LOSE_CHR:8d8 B:BITE:POISON:10d10 B:STING:LOSE_STR:9d9 -F:FORCE_SLEEP | FORCE_MAXHP | NONLIVING | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY -F:EVIL | DEMON | NO_CONF | NO_SLEEP | INVISIBLE | BASEANGBAND | -F:IM_ACID | IM_ELEC | IM_POIS | IM_COLD | IM_FIRE | NO_CUT -S:1_IN_6 | -S:BA_ELEC | BA_COLD | BO_ICEE | SCARE | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_6 +S:BA_COLD +S:BA_ELEC +S:BO_ICEE +S:SCARE +S:S_DEMON D:It is a demon made almost entirely out of bones. It is humanoid, but with D:a large tail similar to that of a giant scorpion, and emits a foul smell D:of decay and rot. They are despised even in the hells. @@ -13168,15 +22285,39 @@ B:HIT:EXP_40:6d6 B:HIT:EXP_40:6d6 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:HOLD | DRAIN_MANA | BLIND | S_UNDEAD | CONF | -S:SCARE | TELE_TO | TPORT | BRAIN_SMASH | ANIM_DEAD -S:BA_NETH | DARKNESS +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RES_TELE +F:TAKE_ITEM +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD +S:TELE_TO +S:TPORT D:It is a massive form of animated death, its colour deeper than black. It D:drinks in light, and space around it is twisted and torn by the weight of D:its evil. It is unlife and it knows nothing but the stealing of souls and @@ -13192,13 +22333,40 @@ B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE | -F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND -S:1_IN_3 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | TELE_TO | TELE_AWAY | -S:BA_WATE | DARKNESS | BR_DARK | BR_ACID | BR_POIS +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_WATE +F:SMART +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_3 +S:BA_WATE +S:BLIND +S:BR_ACID +S:BR_DARK +S:BR_POIS +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DARKNESS +S:SCARE +S:TELE_AWAY +S:TELE_TO D:An enormously fearsome and powerful inhabitant of the depths. It D:resembles a gargantuan octopus and its evil is almost tangible. @@ -13212,15 +22380,43 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:8d12 B:TOUCH:LOSE_DEX:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | SCARE | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | FORGET | -S:TPORT | HEAL | S_DEMON | BA_NETH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:FORGET +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:TELE_TO +S:TPORT D:A lich who has reached its ultimate evolutionary stage: a completely D:immaterial state. @@ -13234,14 +22430,26 @@ B:CLAW:CONFUSE:12d12 B:CLAW:LOSE_DEX:2d12 B:CLAW:BLIND:10d5 B:BITE:PARALYZE:15d1 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | BASEANGBAND -S:1_IN_3 | -S:TELE_TO | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_3 +S:S_KIN +S:TELE_TO D:Master of all things feline, the Cat Lord moves with catlike stealth. N:778:Jabberwock @@ -13254,14 +22462,22 @@ B:CLAW:HURT:10d10 B:CLAW:HURT:10d10 B:BITE:HURT:10d10 B:BITE:HURT:10d10 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:ONLY_ITEM | DROP_60 | DROP_90 | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND | -S:1_IN_5 | -S:CAUSE_4 | +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:ONLY_ITEM +F:RES_TELE +S:1_IN_5 S:BR_CHAO +S:CAUSE_4 D:'Twas brillig, and the slithy toves / Did gyre and gimble in the wabe: / D:All mimsy were the borogoves, / And the mome raths outgrabe. / D:"Beware the Jabberwock, my son! / The jaws that bite, the claws that catch!" @@ -13276,10 +22492,18 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 -F:ATTR_MULTI | ATTR_ANY | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FRIENDS | BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_CHAO D:A constantly changing canine form, this hound rushes towards you as if D:expecting mayhem and chaos ahead. It appears to have an almost kamikaze @@ -13295,16 +22519,46 @@ B:BITE:EXP_80:8d8 B:BITE:EXP_80:8d8 B:HIT:CONFUSE:8d8 B:HIT:CONFUSE:8d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SPEAK | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:RES_TELE | ZANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | S_HI_UNDEAD | -S:BRAIN_SMASH | BA_NETH | S_KIN | DARKNESS | BA_DARK -D:The most feared of all vampires, the Prince of Darkness himself. +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BA_DARK +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_KIN +D:The most feared of all vampires, the Prince of Darkness himself. N:781:Beholder hive-mother G:e:y @@ -13316,12 +22570,32 @@ B:BITE:EXP_80:6d6 B:GAZE:PARALYZE:5d5 B:GAZE:INSANITY:5d5 B:GAZE:UN_POWER:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY | -F:BASH_DOOR | FEMALE | SMART | DROP_CORPSE | -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH | -S:BA_DARK | BO_MANA | BA_ACID | BA_FIRE | BA_COLD | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +F:SMART +S:1_IN_2 +S:BA_ACID +S:BA_COLD +S:BA_DARK +S:BA_FIRE +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE S:S_KIN D:A hive mother of the race of beholders, she can summon her brood to her aid D:whenever she wishes. @@ -13336,12 +22610,32 @@ B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 B:CRUSH:HURT:6d15 B:CRUSH:HURT:6d15 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:ANIMAL | NO_CONF | NO_SLEEP | NO_FEAR | DROP_CORPSE | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:WILD_OCEAN +F:WILD_TOO S:1_IN_9 -S:BR_FIRE | BR_ACID | BR_DARK | BR_POIS | BA_WATE | -S:S_DRAGON | S_HYDRA | HEAL | CONF | DARKNESS +S:BA_WATE +S:BR_ACID +S:BR_DARK +S:BR_FIRE +S:BR_POIS +S:CONF +S:DARKNESS +S:HEAL +S:S_DRAGON +S:S_HYDRA D:An enormous, terrible sea-monster, the true master of the ocean. N:783:Great Wyrm of Chaos @@ -13354,15 +22648,35 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 -F:ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | FORCE_MAXHP | RES_DISE | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_CHAO | BR_DISE | -S:S_DRAGON | S_HI_DRAGON +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_DISE +S:1_IN_4 +S:BLIND +S:BR_CHAO +S:BR_DISE +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon of changing form. As you watch, it appears first fair D:and then foul. Its body is twisted by chaotic forces as it strives to D:stay real. Its very existence distorts the universe around it. @@ -13377,15 +22691,34 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_SOUN | BR_SHAR | -S:S_DRAGON | S_HI_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon of powerful intellect. It seeks to dominate the universe D:and despises all other life. It sees all who do not obey it as mere D:insects to be crushed underfoot. @@ -13400,15 +22733,38 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:BITE:HURT:8d14 B:BITE:HURT:8d14 -F:DRAGON | EVIL | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | RES_DISE | -F:NO_STUN | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_SOUN | BR_CHAO | BR_SHAR | BR_DISE | -S:S_DRAGON | S_HI_DRAGON +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:RES_DISE +S:1_IN_4 +S:BLIND +S:BR_CHAO +S:BR_DISE +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon, it is thousands of D:years old and seeks to maintain the Cosmic Balance. It sees you as an D:upstart troublemaker without the wisdom to control your actions. @@ -13423,11 +22779,24 @@ B:CLAW:HURT:3d12 B:CLAW:HURT:3d12 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | CAN_SWIM | DROP_CORPSE | -F:BASH_DOOR | OPEN_DOOR | POWERFUL | MOVE_BODY | -F:NO_CONF | NO_SLEEP | EVIL | ZANGBAND | NO_CUT -S:1_IN_3 | +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:ZANGBAND +S:1_IN_3 S:BR_ELEC D:This elemental creature is power incarnate; it looks like a huge polar bear D:with a huge gaping maw instead of a head. @@ -13442,13 +22811,32 @@ B:CLAW:COLD:6d10 B:CLAW:COLD:6d10 B:BITE:COLD:9d9 B:HIT:PARALYZE:8d8 -F:FORCE_SLEEP | FORCE_MAXHP | BASEANGBAND | NONLIVING | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | REGENERATE | -F:EVIL | DEMON | IM_COLD | NO_CONF | NO_SLEEP +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE S:1_IN_6 -S:BR_COLD | BR_SHAR | BA_COLD | BO_ICEE | S_HI_DEMON | -S:SLOW | SCARE | HOLD +S:BA_COLD +S:BO_ICEE +S:BR_COLD +S:BR_SHAR +S:HOLD +S:SCARE +S:SLOW +S:S_HI_DEMON D:This demon from the ice planes is a truly terrifying sight. It has an D:extremely large, insect-like body towering a full twelve feet tall, with D:great claws on its hands and pincers on its mouth, and its head bulges @@ -13464,15 +22852,40 @@ O:0:0:100:0 B:STING:HURT:20d1 B:STING:DISEASE:20d1 B:CRUSH:HURT:3d20 -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ELDRITCH_HORROR | -F:NO_STUN | RES_NEXU | RES_WATE | CAN_SWIM | REGENERATE | -F:FORCE_SLEEP | FORCE_MAXHP | EVIL | SMART | DEMON | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:NO_STUN | -F:IM_POIS | IM_COLD | IM_ACID | CTHANGBAND +F:ATTR_MULTI +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_STUN +F:NO_STUN +F:ONLY_ITEM +F:REGENERATE +F:RES_NEXU +F:RES_WATE +F:SMART +F:UNIQUE S:1_IN_5 -S:BA_WATE | S_HYDRA | S_DRAGON | S_DEMON | SCARE | -S:BLIND | CONF | CAUSE_4 | BR_POIS +S:BA_WATE +S:BLIND +S:BR_POIS +S:CAUSE_4 +S:CONF +S:SCARE +S:S_DEMON +S:S_DRAGON +S:S_HYDRA D:"From an oval body protruded countless thin, pointed spines of D:multi-colored metal; at the more rounded end of the oval a D:circular, thick-lipped mouth formed the centre of a spongy @@ -13491,15 +22904,38 @@ B:HIT:HURT:12d10 B:HIT:HURT:12d10 B:CHARGE:HURT:10d10 B:CHARGE:HURT:10d10 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | SPECIAL_GENE | -F:FORCE_MAXHP | REGENERATE | THUNDERLORD | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_CHOSEN | -F:EVIL | IM_FIRE | IM_COLD | IM_POIS | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TELE_TO | SCARE | BR_TIME | BR_FIRE | -S:BO_MANA | S_THUNDERLORD +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BO_MANA +S:BR_FIRE +S:BR_TIME +S:SCARE +S:S_THUNDERLORD +S:TELE_TO D:As the Thunderlords came from afar to help the elves, Trone and his rebel D:wing came to defend Morgoth! He is an evil and powerful Thunderlord. @@ -13513,15 +22949,42 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:CLAW:HURT:8d14 B:BITE:HURT:8d14 -F:ATTR_MULTI | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | AURA_ELEC | RES_TELE | -F:IM_FIRE | IM_ACID | IM_POIS | IM_COLD | IM_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BR_POIS | BR_ELEC | BR_ACID | BR_FIRE | BR_COLD | -S:CONF | SCARE | BLIND +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +S:1_IN_4 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A huge dragon whose scales shimmer in myriad hues. N:791:Marda, rider of gold Laronth @@ -13534,15 +22997,42 @@ B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 -F:UNIQUE | FEMALE | CAN_SPEAK | THUNDERLORD | ONLY_ITEM | RES_TELE | -F:DROP_CHOSEN | DROP_CORPSE | DROP_SKELETON | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | -F:EVIL | IM_POIS | IM_ELEC | SMART | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:SCARE | BLIND | TPORT | BLINK | TELE_AWAY | TELE_TO | -S:BR_FIRE | BA_MANA | S_THUNDERLORD +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BA_MANA +S:BLIND +S:BLINK +S:BR_FIRE +S:SCARE +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:Former leader among the Thunderlords, she and Trone have fallen under the D:control of Morgoth. Laronth, her eagle, can summon Thunderlords to her aid. @@ -13556,16 +23046,38 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | CAN_FLY | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | AURA_COLD | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | CONF | -S:BA_DARK | BA_NETH | -S:S_WRAITH | S_HI_UNDEAD | S_KIN +F:AURA_COLD +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_DARK +S:BA_NETH +S:BLIND +S:CONF +S:HOLD +S:S_HI_UNDEAD +S:S_KIN +S:S_WRAITH D:This huge affront to existence twists and tears at the fabric of space. D:Darkness itself recoils from the touch of Tselakus as he leaves a trail D:of death and destruction. Mighty claws rend reality as he @@ -13581,16 +23093,37 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:BITE:ELEC:8d14 B:BITE:ELEC:8d14 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | AURA_COLD | DROP_CORPSE | -F:IM_ELEC | EVIL | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | -F:DRAGON | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BR_ELEC | BR_GRAV | BR_LITE | -S:S_DRAGON | S_HI_DRAGON | -S:SCARE | BLIND +F:AURA_COLD +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +S:1_IN_4 +S:BLIND +S:BR_ELEC +S:BR_GRAV +S:BR_LITE +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:The mightiest elemental dragon of air, it can destroy you with ease. N:794:Eilinel the Entrapped @@ -13603,13 +23136,33 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:TOUCH:UN_POWER:3d3 B:TOUCH:UN_BONUS:3d3 -F:UNIQUE | FEMALE | -F:FORCE_MAXHP | -F:DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_FIRE | NO_CONF | NO_SLEEP | ZANGBAND | NO_CUT | NO_STUN -S:1_IN_2 | -S:BLINK | TELE_TO | HEAL | S_MONSTER | BO_ACID | BO_MANA | CAUSE_3 +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:SMART +F:UNDEAD +F:UNIQUE +F:ZANGBAND +S:1_IN_2 +S:BLINK +S:BO_ACID +S:BO_MANA +S:CAUSE_3 +S:HEAL +S:S_MONSTER +S:TELE_TO D:In life, she was the wife of Gorlim. In death, her shade was D:entrapped by Morgoth and used to trick her husband into betraying D:Barahir. Now she is totally entrapped by Morgoth's power, and uses @@ -13625,13 +23178,34 @@ B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | KILL_BODY | POWERFUL | -F:EVIL | DEMON | NO_CONF | NO_SLEEP | CAN_FLY | -F:IM_FIRE | IM_COLD | IM_POIS | IM_ACID | IM_ELEC -S:1_IN_5 | -S:HASTE | SLOW | SCARE | S_HI_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +S:1_IN_5 +S:HASTE +S:SCARE +S:SLOW +S:S_HI_DEMON D:A giant humanoid demon wielding a massive, heavy and sharp scythe. Feared D:by foes and friends alike when it flies into one of its berserk rages, the D:Horned Reaper will cut down anything in its path between it and you - even @@ -13647,17 +23221,45 @@ B:CRUSH:ACID:8d12 B:CRUSH:FIRE:8d12 B:CRUSH:ELEC:8d12 B:CRUSH:POISON:10d14 -F:ATTR_MULTI | ELDRITCH_HORROR | DROP_CORPSE | -F:UNIQUE | CAN_SPEAK | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | EVIL | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE F:ZANGBAND -S:1_IN_2 | -S:BLIND | CONF | SCARE | -S:BR_NETH | BR_CHAO | BR_TIME | BR_GRAV | BR_DISI | -S:S_HI_DRAGON | S_MONSTERS +S:1_IN_2 +S:BLIND +S:BR_CHAO +S:BR_DISI +S:BR_GRAV +S:BR_NETH +S:BR_TIME +S:CONF +S:SCARE +S:S_HI_DRAGON +S:S_MONSTERS D:An elephantine horror with five trunks, each capable of breathing D:destructive blasts. It is said that it is better to face the fury D:of a thousand raging lions than the Norsa! @@ -13672,15 +23274,40 @@ B:CLAW:HURT:8d12 B:CRUSH:LOSE_STR:5d12 B:CLAW:HURT:8d12 B:CRUSH:ACID:5d12 -F:ELDRITCH_HORROR | CAN_SWIM | EVIL | -F:UNIQUE | CAN_SPEAK | AURA_FIRE | AURA_ELEC | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_ELEC | IM_POIS | NO_SLEEP | RES_WATE | CTHANGBAND -S:1_IN_5 | -S:S_DEMON | BR_ACID | S_UNDEAD | S_KIN | CONF | SCARE | -S:MIND_BLAST | BR_CONF +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:CTHANGBAND +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_WATE +F:UNIQUE +S:1_IN_5 +S:BR_ACID +S:BR_CONF +S:CONF +S:MIND_BLAST +S:SCARE +S:S_DEMON +S:S_KIN +S:S_UNDEAD D:"An almost globular torso, with six long, sinuous limbs terminating D:in crab-like claws. From the upper end a subsidiary globe bulged D:forward bubble-like; its triangle of three staring, fishy eyes, @@ -13697,15 +23324,41 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SWIM | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE | -F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_MANA | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BA_MANA +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:S_UNDEAD +S:TELE_TO D:A humanoid form, black as night, advancing steadily and unstoppably, even D:the very rock of the dungeon cannot prevent it reaching you. @@ -13718,13 +23371,39 @@ O:20:40:40:0 B:HIT:HURT:4d5 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:MALE | ONLY_ITEM | FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 | -F:SMART | BASH_DOOR | TAKE_ITEM | MOVE_BODY | -F:EVIL | IM_FIRE | IM_ELEC | IM_POIS | BASEANGBAND | -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR -S:1_IN_2 | -S:HEAL | BLIND | HOLD | CONF | SCARE | TPORT | BA_COLD | BA_FIRE | -S:MIND_BLAST | BRAIN_SMASH | S_MONSTERS | TELE_AWAY | BLINK | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:SMART +F:TAKE_ITEM +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_NETH +S:BRAIN_SMASH +S:CONF +S:HEAL +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_MONSTERS +S:TELE_AWAY +S:TPORT D:A mindcrafter of the highest order. Powerful and evil, and a dangerous D:enemy: a master of mind over matter, of his own mind, and of the minds of D:others, who slavishly follow him into battle when he calls them. @@ -13735,12 +23414,22 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_DEMON +S:TELE_TO D:A massive pulsating mound of flesh, glowing with an inner hellish light. N:801:Greater draconic quylthulg @@ -13749,12 +23438,22 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_DRAGON +S:TELE_TO D:A massive mound of scaled flesh, throbbing and pulsating with multi-hued D:light. @@ -13764,12 +23463,23 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND |NO_CUT -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_UNDEAD +S:TELE_TO D:A massive pile of rotting flesh. A disgusting stench fills the air as it D:throbs and writhes. @@ -13782,13 +23492,36 @@ O:0:0:0:0 B:TOUCH:LOSE_ALL:6d16 B:TOUCH:EXP_80:6d16 B:TOUCH:UN_POWER:6d16 -F:PASS_WALL | NONLIVING | IM_ACID | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | SMART | EMPTY_MIND | -F:ELDRITCH_HORROR | IM_COLD | RES_NETH | NO_STUN | UNIQUE | NO_SLEEP | NO_CONF | NO_FEAR | -F:REGENERATE | ZANGBAND | NO_CUT +F:CAN_FLY +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EMPTY_MIND +F:IM_ACID +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PASS_WALL +F:REGENERATE +F:RES_NETH +F:SMART +F:UNIQUE +F:ZANGBAND S:1_IN_5 -S:BR_NETH | BRAIN_SMASH | SCARE | S_UNDEAD | S_HI_UNDEAD | -S:DRAIN_MANA | HEAL | ANIM_DEAD +S:ANIM_DEAD +S:BRAIN_SMASH +S:BR_NETH +S:DRAIN_MANA +S:HEAL +S:SCARE +S:S_HI_UNDEAD +S:S_UNDEAD D:A black hole in the fabric of reality. It simply is not there. N:804:Feagwath, the Undead Sorcerer @@ -13801,18 +23534,46 @@ B:TOUCH:EXP_80:6d12 B:TOUCH:UN_POWER:6d12 B:TOUCH:LOSE_DEX:6d12 B:TOUCH:LOSE_DEX:6d12 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BLINK | TELE_TO | HOLD | SCARE | CAUSE_4 | -S:BRAIN_SMASH | TRAPS | BA_MANA | -S:BO_MANA | BA_NETH | -S:S_MONSTERS | S_UNDEAD | S_KIN | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_MANA +S:BA_NETH +S:BLINK +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:HOLD +S:SCARE +S:S_KIN +S:S_MONSTERS +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A stench of corruption and decay surrounds this sorcerer, who has clearly D:risen from the dead to continue his foul plots and schemes. @@ -13826,14 +23587,31 @@ B:GAZE:UN_BONUS:6d6 B:GAZE:UN_POWER:6d6 B:GAZE:INSANITY:6d6 B:BITE:EXP_80:8d8 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:SMART | BASH_DOOR | -F:EVIL | IM_POIS | -F:BASEANGBAND -S:1_IN_2 | -S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH | -S:BA_DARK | BO_MANA | BA_NETH | BA_ACID | BA_FIRE | BA_COLD | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MALE +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:BA_ACID +S:BA_COLD +S:BA_DARK +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE S:S_KIN D:A beholder of great size and age, floating in the air. His gaze seems to D:shred your soul and his spells crush your will. He is ancient, his history @@ -13849,15 +23627,39 @@ B:CRUSH:LOSE_ALL:5d6 B:CRUSH:ACID:5d6 B:CRUSH:LOSE_ALL:5d6 B:CRUSH:ACID:5d6 -F:UNIQUE | CAN_SPEAK | RES_TELE | ELDRITCH_HORROR | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | DROP_2D2 | -F:ONLY_ITEM | DROP_GOOD | MOVE_BODY | -F:SMART | BASH_DOOR | -F:EVIL | DEMON | IM_POIS | IM_ACID | IM_COLD | -F:NO_CONF | NO_SLEEP | CTHANGBAND | HAS_LITE | NO_CUT -S:1_IN_2 | -S:S_DEMON | S_MONSTERS | S_UNDEAD | HOLD | SCARE | MIND_BLAST | -S:BR_ACID | BR_NETH | CAUSE_4 +F:BASH_DOOR +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:BR_ACID +S:BR_NETH +S:CAUSE_4 +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_DEMON +S:S_MONSTERS +S:S_UNDEAD D:"...the formless bulking of a couchant mass. And the mass stirred D:a little... and put forth with infinite slothfulness a huge and D:toad-shaped head. And the head opened its eyes very slowly, as if @@ -13874,15 +23676,42 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:7d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | KILL_WALL | -F:RES_NETH | RES_PLAS | REGENERATE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | BRAIN_SMASH | -S:BR_FIRE | BA_NETH | BA_FIRE | BR_PLAS | BO_PLAS | -S:S_HI_DEMON | S_UNDEAD | S_DEMON | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_PLAS +F:SMART +S:1_IN_3 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:BRAIN_SMASH +S:BR_FIRE +S:BR_PLAS +S:CONF +S:S_DEMON +S:S_HI_DEMON +S:S_UNDEAD D:Originally of the semi-divine Maiar, this evil spirit swore allegiance D:to Morgoth at the beginning of time and is now one of his most terrible D:demonic servants. With its flaming whip and sword it seeks to destroy you. @@ -13897,15 +23726,36 @@ B:CLAW:POISON:8d6 B:CLAW:POISON:8d6 B:BITE:PARALYZE:8d10 B:STING:LOSE_STR:8d4 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | IM_ACID | -F:ANIMAL | SPIDER | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP -F:BASEANGBAND -S:1_IN_3 | -S:HEAL | BLIND | SLOW | CONF | SCARE | DARKNESS | BA_DARK | -S:BR_POIS | BR_DARK | S_SPIDER +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +F:SPIDER +F:UNIQUE +S:1_IN_3 +S:BA_DARK +S:BLIND +S:BR_DARK +S:BR_POIS +S:CONF +S:DARKNESS +S:HEAL +S:SCARE +S:SLOW +S:S_SPIDER D:This enormous, hideous spirit of void is in the form of a spider of D:immense proportions. She is surrounded by a cloud of Unlight as she sucks D:in all living light into her bloated body, and breathes out the blackest of @@ -13922,18 +23772,40 @@ B:BITE:POISON:3d9 B:BITE:LOSE_STR:3d9 B:STING:POISON:2d9 B:STING:LOSE_STR:2d9 -F:UNIQUE | CAN_SPEAK | ELDRITCH_HORROR | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | MOVE_BODY | NONLIVING | -F:ANIMAL | SPIDER | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK F:CTHANGBAND -S:1_IN_3 | -S:SCARE | BLIND | CONF | HOLD | BR_POIS | -S:DARKNESS | BR_DARK | S_KIN | S_HI_DEMON -D:"...there was a kind of face on the squat ebon body, low down amid -D:the several-jointed legs. The face peered up with a weird expression -D:of doubt and inquiry..." +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:RES_TELE +F:SMART +F:SPIDER +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BR_DARK +S:BR_POIS +S:CONF +S:DARKNESS +S:HOLD +S:SCARE +S:S_HI_DEMON +S:S_KIN +D:"...there was a kind of face on the squat ebon body, low down amid +D:the several-jointed legs. The face peered up with a weird expression +D:of doubt and inquiry..." N:810:Y'golonac G:H:R @@ -13945,15 +23817,38 @@ B:TOUCH:LOSE_INT:1d20 B:BITE:HURT:40d1 B:TOUCH:LOSE_WIS:1d20 B:BITE:HURT:40d1 -F:UNIQUE | CAN_SPEAK | ELDRITCH_HORROR | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | MOVE_BODY | NONLIVING | -F:EVIL | IM_POIS | CTHANGBAND -S:1_IN_3 | -S:SCARE | BLIND | CONF | HOLD | HASTE | DRAIN_MANA | HASTE | -S:CAUSE_3 | CAUSE_4 | DARKNESS | FORGET | S_DEMON | S_HOUND | -S:TPORT | TELE_TO +F:BASH_DOOR +F:CAN_SPEAK +F:CTHANGBAND +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:ONLY_ITEM +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HASTE +S:HASTE +S:HOLD +S:SCARE +S:S_DEMON +S:S_HOUND +S:TELE_TO +S:TPORT D:"He saw why the shadow on the frosted pane yesterday had been D:headless and he screamed... but before he could scream out his D:protest his breath was cut off, as the hands descended on his @@ -13969,18 +23864,51 @@ B:BITE:HURT:3d12 B:BITE:HURT:3d12 B:CLAW:HURT:3d12 B:CLAW:HURT:3d12 -F:ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | CAN_FLY | -F:FRIENDS | RES_NETH | RES_PLAS | RES_NEXU | RES_DISE | -F:BASH_DOOR | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:DROP_CORPSE | DROP_SKELETON | -F:ANIMAL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | -S:BR_LITE | BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | -S:BR_NETH | BR_DISE | BR_WALL | BR_INER | BR_TIME | -S:BR_GRAV | BR_PLAS | BR_NEXU +F:ANIMAL +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +S:1_IN_5 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL D:A shifting, swirling form. It seems to be all colours and sizes and D:shapes, though the dominant form is that of a huge dog. You feel very D:uncertain all of a sudden. @@ -13995,13 +23923,36 @@ B:CLAW:FIRE:8d10 B:CLAW:FIRE:8d10 B:BITE:POISON:7d10 B:BITE:LOSE_CON:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | POWERFUL | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP -S:1_IN_5 | -S:S_HI_DEMON | S_HI_DRAGON | BR_FIRE | BR_POIS | BR_CHAO | BA_CHAO | -S:SCARE | BA_FIRE | CAUSE_4 +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +S:1_IN_5 +S:BA_CHAO +S:BA_FIRE +S:BR_CHAO +S:BR_FIRE +S:BR_POIS +S:CAUSE_4 +S:SCARE +S:S_HI_DEMON +S:S_HI_DRAGON D:Appearing as a giant, clawed and winged humanoid with a scaly red body D:and massive fangs dripping a foul green liquid, the Pit Fiend is a D:dreadful enemy from the lowest depths of the hells. They are often the @@ -14017,16 +23968,43 @@ B:CRUSH:POISON:15d10 B:CRUSH:CONFUSE:15d10 B:CRUSH:UN_BONUS:10d15 B:CRUSH:UN_POWER:10d15 -F:UNIQUE | ATTR_MULTI | ATTR_ANY | AURA_FIRE | AURA_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | POWERFUL | REGENERATE | -F:DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | ANIMAL | EVIL | CAN_FLY | -F:KILL_ITEM | KILL_BODY | -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR | ZANGBAND | -F:IM_COLD | IM_FIRE | IM_POIS -S:1_IN_3 | -S:BR_CHAO | BR_DISI | BA_CHAO | BR_NETH | BR_MANA | -S:S_MONSTERS | S_HI_DEMON | S_HI_DRAGON +F:ANIMAL +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BA_CHAO +S:BR_CHAO +S:BR_DISI +S:BR_MANA +S:BR_NETH +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_MONSTERS D:Writhing coil upon coil, this mighty spawn of Chaos constantly disintegrates D:and reforms before your dazzled eyes. It gazes balefully upon you with its D:one remaining eye, and seeks to destroy you utterly. @@ -14041,14 +24019,39 @@ B:CLAW:POISON:8d10 B:CLAW:POISON:8d10 B:CRUSH:HURT:8d15 B:BITE:HURT:100d1 -F:UNIQUE | MALE | CAN_SPEAK | SMART | RES_TELE | ANIMAL | -F:ESCORT | ESCORTS | CAN_SWIM | ELDRITCH_HORROR | -F:OPEN_DOOR | BASH_DOOR | -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM | -F:EVIL | IM_POIS | IM_ACID | IM_ELEC | REGENERATE | ZANGBAND -S:1_IN_4 | -S:BR_POIS | BR_NUKE | BR_ACID | S_HYDRA | S_KIN | S_DEMON | +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_4 +S:BR_ACID +S:BR_NUKE +S:BR_POIS +S:S_DEMON +S:S_HYDRA +S:S_KIN D:"The half-human father of serpents... the snake-god of the central D:plains tribes -- presumably the primal source of the more D:southerly Quetzalcoatl or Kukulcan -- was odd, half-anthropomorphic @@ -14063,16 +24066,39 @@ O:20:50:20:0 B:TOUCH:LOSE_ALL:10d10 B:TOUCH:UN_BONUS:10d10 B:TOUCH:UN_POWER:10d10 -F:KILL_WALL | KILL_ITEM | KILL_BODY | NO_FEAR | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ATTR_MULTI | SHAPECHANGER | ATTR_ANY | -F:DROP_60 | DROP_GOOD | POWERFUL | AURA_ELEC | AURA_FIRE | AURA_COLD | -F:BASH_DOOR | IM_ELEC | IM_FIRE | RES_NEXU | IM_COLD | ZANGBAND | -F:IM_POIS | IM_ACID | RES_PLAS | RES_DISE | COLD_BLOOD | NONLIVING | RAND_50 -F:NO_CUT -S:MULTIPLY | -S:1_IN_5 | +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:KILL_WALL +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:POWERFUL +F:RAND_50 +F:RES_DISE +F:RES_NEXU +F:RES_PLAS +F:SHAPECHANGER +F:ZANGBAND +S:1_IN_5 S:BR_CHAO +S:MULTIPLY D:Spawned from the Pits of the Abyss, it is a mass of sentient Chaos, D:spreading uncontrollably and destroying everything in its path. @@ -14086,11 +24112,23 @@ B:HIT:HURT:1d50 B:HIT:HURT:1d50 B:HIT:HURT:1d50 B:HIT:HURT:1d50 -F:RAND_25 | EVIL | DEMON | -F:DROP_2D2 | DROP_GOOD | ONLY_ITEM | RES_TELE | SUSCEP_ACID | -F:IM_POIS | IM_FIRE | FORCE_SLEEP | FORCE_MAXHP | NONLIVING -F:MORTAL | ZANGBAND | HAS_LITE -S:1_IN_4 | +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NONLIVING +F:ONLY_ITEM +F:RAND_25 +F:RES_TELE +F:SUSCEP_ACID +F:ZANGBAND +S:1_IN_4 S:ROCKET D:Reverbrant metal steps announce the arrival of this huge creature, D:half demon half machine. It has an unsurpassable firepower. @@ -14104,16 +24142,47 @@ O:0:0:100:0 B:TOUCH:LOSE_ALL:50d1 B:TOUCH:EXP_80:50d1 B:TOUCH:UN_BONUS:50d1 -F:UNIQUE | FEMALE | CAN_SPEAK | POWERFUL | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_1D2 | DROP_GREAT | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | RES_NETH | IM_COLD | IM_POIS | -F:IM_FIRE | NO_CONF | NO_SLEEP | ZANGBAND | HAS_LITE -S:1_IN_3 | -S:CAUSE_3 | CAUSE_4 | HAND_DOOM | TELE_TO | HOLD | -S:S_UNDEAD | S_HI_UNDEAD | S_HI_DRAGON | FORGET | SCARE | BLIND | -S:BA_DARK | BA_NETH | HEAL | ANIM_DEAD +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_TELE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:ANIM_DEAD +S:BA_DARK +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:FORGET +S:HAND_DOOM +S:HEAL +S:HOLD +S:SCARE +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_UNDEAD +S:TELE_TO D:The Norse ruler of Hel is a merciless queen, who ever hunts for more D:souls to add to her collection of tortured spirits. She arrives in D:an ominous green robe, a certain sign of impending doom, to claim @@ -14129,16 +24198,38 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:TOUCH:UN_POWER B:TOUCH:UN_POWER -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TELE_TO | HOLD | CAUSE_3 | TRAPS | ANIM_DEAD | -S:BO_PLAS | BA_DARK | BA_MANA | BA_FIRE | BA_WATE | BA_NETH -S:S_HI_DEMON | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BO_PLAS +S:CAUSE_3 +S:HOLD +S:S_HI_DEMON +S:S_HI_UNDEAD +S:TELE_TO +S:TRAPS D:The Mouth of Sauron is a mighty spell caster. So old that even he cannot D:remember his own name, his power and evil are undeniable. He believes D:unshakeably that he is unbeatable and laughs as he weaves his awesome @@ -14154,16 +24245,45 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_POWER:6d8 B:HIT:BLIND:6d8 B:HIT:CONFUSE:6d8 -F:UNIQUE | MALE | CAN_SPEAK | POWERFUL | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_1D2 | DROP_GREAT | DROP_GOOD | SPECIAL_GENE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:CAUSE_3 | TELE_TO | BA_FIRE | DRAIN_MANA | HOLD | -S:TRAPS | BA_WATE | BO_PLAS | BA_NETH | -S:BA_MANA | BA_DARK | S_HI_UNDEAD | BA_CHAO | HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BO_PLAS +S:CAUSE_3 +S:DRAIN_MANA +S:HAND_DOOM +S:HOLD +S:S_HI_UNDEAD +S:TELE_TO +S:TRAPS D:The dark master of the terrible fortress of southern Mirkwood. It is D:rumoured that this is in fact none other than Sauron in disguise: D:although if this is so, he has yet to reveal his full power - and perhaps @@ -14179,15 +24299,44 @@ B:HIT:HURT:10d15 B:HIT:HURT:10d15 B:HIT:HURT:10d15 B:HIT:HURT:10d15 -F:UNIQUE | FEMALE | THUNDERLORD | RES_TELE | CAN_FLY | GOOD | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | PET | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM | -F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | REGENERATE | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TPORT | TELE_TO | BR_FIRE | S_THUNDERLORD | -S:TELE_AWAY | HEAL | BA_NETH | BO_NETH | BA_FIRE | BO_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BA_FIRE +S:BA_NETH +S:BO_FIRE +S:BO_NETH +S:BR_FIRE +S:HEAL +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:She came to help you. N:821:Master quylthulg @@ -14196,11 +24345,26 @@ I:120:30d100:20:1:0 W:76:2:7000:15000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:S_MONSTERS | S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_ANIMALS | BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK +S:S_ANIMALS +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:TELE_TO D:A giant seething mass of flesh, overwhelming you with monster after monster. N:822:Qlzqqlzuup, the Lord of Flesh @@ -14209,14 +24373,36 @@ I:130:50d100:30:1:0 W:79:3:10000:20000 E:0:0:0:0:0:0 O:20:20:20:20 -F:UNIQUE | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:ONLY_ITEM | DROP_4D2 | -F:INVISIBLE | ATTR_MULTI | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_1 | -S:S_MONSTERS | S_ANGEL | S_HOUND | S_HYDRA | S_SPIDER | S_ANT | S_ANIMALS | -S:S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_WRAITH | S_UNIQUE | S_KIN +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:RES_TELE +F:UNIQUE +S:1_IN_1 +S:S_ANGEL +S:S_ANIMALS +S:S_ANT +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_HOUND +S:S_HYDRA +S:S_KIN +S:S_MONSTERS +S:S_SPIDER +S:S_UNIQUE +S:S_WRAITH D:A gigantic seething mass of flesh, Qlzqqlzuup changes colours in front D:of your eyes. Pulsating first one colour then the next, it knows only it D:must bring help to protect itself. @@ -14231,13 +24417,30 @@ B:TOUCH:BLIND B:TOUCH:FIRE:12d10 B:TOUCH:FIRE:12d10 B:TOUCH:FIRE:12d10 -F:UNIQUE | RES_TELE | AURA_FIRE | IM_FIRE | CAN_FLY | RES_PLAS | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | SMART | ELDRITCH_HORROR | -F:EVIL | KILL_ITEM | KILL_BODY | -F:NO_CONF | NO_SLEEP | NO_FEAR | CTHANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BR_FIRE | S_KIN +F:AURA_FIRE +F:CAN_FLY +F:CTHANGBAND +F:DROP_4D2 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:RES_PLAS +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:S_KIN D:"But even though we had shielded our eyes, it was impossible not D:to see the great amorphous shapes streaming skyward from the D:accursed place, nor the equally great being hovering like a cloud @@ -14253,15 +24456,44 @@ B:HIT:HURT:15d15 B:HIT:HURT:15d15 B:HIT:HURT:15d15 B:HIT:HURT:15d15 -F:UNIQUE | MALE | THUNDERLORD | RES_TELE | CAN_FLY | CAN_SPEAK | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON | -F:FORCE_SLEEP | FORCE_MAXHP | PET | GOOD | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM | -F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | IM_FIRE | REGENERATE | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:SCARE | TPORT | TELE_TO | S_THUNDERLORD | -S:TELE_LEVEL | HEAL | BR_FIRE | BR_TIME | ROCKET +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:BR_TIME +S:HEAL +S:ROCKET +S:SCARE +S:S_THUNDERLORD +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:A leader from afar, he has come with his eagle to help you in D:your battle. Having already saved his home, he now wants to save Arda! @@ -14275,16 +24507,41 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 -F:UNIQUE | MALE | -F:FORCE_MAXHP | CAN_SPEAK | SMART | EVIL | AI_SPECIAL | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | KILL_WALL | MOVE_BODY | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_POIS | SPECIAL_GENE | -F:REGENERATE | REFLECTING | DROP_SKELETON | DROP_CORPSE | BASEANGBAND -F:HAS_LITE -S:1_IN_6 | -S:S_MONSTERS | S_WRAITH | S_HI_UNDEAD | -S:S_HI_DRAGON | S_HI_DEMON | S_UNIQUE | S_ANIMALS +F:AI_SPECIAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:REGENERATE +F:SMART +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:S_ANIMALS +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH D:The son of Eol the Dark Elf, Maeglin is every bit as evil as his father D:and more. His greed for gold led him to betray the Hidden Kingdom of D:Gondolin to Morgoth's forces. He is a mighty warrior himself, and some @@ -14300,16 +24557,44 @@ B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 -F:UNIQUE | CAN_SPEAK | RES_TELE | ELDRITCH_HORROR | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | DEMON | IM_ACID | IM_ELEC | -F:IM_COLD | IM_POIS | CTHANGBAND | HAS_LITE -S:1_IN_3 | -S:TELE_AWAY | BLIND | HOLD | SCARE | BRAIN_SMASH | -S:BR_DARK | BA_DARK | BR_NETH | HAND_DOOM | -S:S_HI_UNDEAD | S_DEMON | S_MONSTERS | S_HYDRA +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:CTHANGBAND +F:DEMON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:BA_DARK +S:BLIND +S:BRAIN_SMASH +S:BR_DARK +S:BR_NETH +S:HAND_DOOM +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:S_HYDRA +S:S_MONSTERS +S:TELE_AWAY D:"...it was a gigantic eye staring down at them. Around the eye, D:the sky split; deep clefts opened through which the darkness D:began to ooze, a darkness blacker than the night, which crawled @@ -14328,14 +24613,33 @@ B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_3 | -S:MIND_BLAST | BO_ELEC | BO_MANA | BA_ELEC | S_HI_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_3 +S:BA_ELEC +S:BO_ELEC +S:BO_MANA +S:MIND_BLAST +S:S_HI_DEMON D:A winged humanoid demon from the Planes of Hell, Pazuzu grins inhumanely at you D:as he decides your fate. @@ -14349,15 +24653,45 @@ B:CLAW:COLD:12d12 B:CLAW:COLD:12d12 B:CRUSH:ELEC:12d12 B:CRUSH:ELEC:12d12 -F:UNIQUE | CAN_SPEAK | ESCORT | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | AURA_COLD | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_ELEC | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | NONLIVING | -F:EVIL | DEMON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_3 | -S:BO_MANA | SCARE | BR_COLD | S_DEMON | BO_ELEC | BA_ELEC | -S:MIND_BLAST | CAUSE_4 | BA_CHAO | BA_WATE | S_HI_UNDEAD | S_KIN +F:AURA_COLD +F:AURA_ELEC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNIQUE +S:1_IN_3 +S:BA_CHAO +S:BA_ELEC +S:BA_WATE +S:BO_ELEC +S:BO_MANA +S:BR_COLD +S:CAUSE_4 +S:MIND_BLAST +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:S_KIN D:The Wendigo, moving so fast that you can see little except two D:glowing eyes burning with hatred. @@ -14370,11 +24704,22 @@ O:0:0:0:0 B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD | -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE | -S:1_IN_5 | BR_FIRE +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_5 +S:BR_FIRE D:It is a giant dog that glows with heat. Flames pour from its nostrils. N:830:Cantoras, the Skeletal Lord @@ -14387,16 +24732,44 @@ B:GAZE:EXP_80:5d5 B:GAZE:EXP_80:5d5 B:TOUCH:POISON:5d5 B:TOUCH:POISON:5d5 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_TO | SLOW | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BO_ICEE | BO_MANA | BA_WATE | BA_NETH | -S:S_HI_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_NETH +S:BA_WATE +S:BO_ICEE +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:SCARE +S:SLOW +S:S_HI_UNDEAD +S:TELE_TO D:A legion of evil undead druj animating the skeleton of a once mighty D:sorcerer. His power is devastating and his speed unmatched in the D:underworld. Flee his wrath! @@ -14411,16 +24784,48 @@ B:GAZE:EXP_80:10d5 B:GAZE:TERRIFY:10d5 B:TOUCH:FIRE:4d15 B:TOUCH:UN_POWER:4d15 -F:MALE | UNIQUE | CAN_SPEAK | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:IM_FIRE | RES_PLAS | RES_NETH | AURA_FIRE | -F:NO_CONF | NO_SLEEP | NONLIVING | EVIL | DEMON | -F:ESCORTS | IM_COLD | IM_POIS | ZANGBAND | HAS_LITE -S:1_IN_3 | -S:TELE_TO | SCARE | HOLD | BRAIN_SMASH | -S:S_DEMON | S_HI_UNDEAD | S_UNDEAD | -S:BR_FIRE | BR_NETH | S_HI_DEMON | HAND_DOOM | ANIM_DEAD +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_PLAS +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:ANIM_DEAD +S:BRAIN_SMASH +S:BR_FIRE +S:BR_NETH +S:HAND_DOOM +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_UNDEAD +S:TELE_TO D:A duke of hell, in the flesh. N:832:Godzilla @@ -14433,14 +24838,34 @@ B:CLAW:POISON:5d10 B:CLAW:POISON:5d10 B:BITE:HURT:20d10 B:CRUSH:UN_BONUS:5d12 -F:UNIQUE | CAN_SWIM | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | RES_PLAS | RES_DISE | RES_TELE -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | IM_FIRE | IM_COLD | IM_POIS -F:MORTAL | JOKEANGBAND -S:1_IN_2 | -S:BR_DISE | BR_PLAS | BR_NUKE | BR_POIS | BR_ACID +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_DISE +F:RES_PLAS +F:RES_TELE +F:UNIQUE +S:1_IN_2 +S:BR_ACID +S:BR_DISE +S:BR_NUKE +S:BR_PLAS +S:BR_POIS D:Godzilla rose from the contaminated sea. This terrible creature could D:level whole cities in anger. @@ -14454,16 +24879,51 @@ B:TOUCH:ACID:11d11 B:TOUCH:DISEASE:11d11 B:TOUCH:ACID:11d11 B:TOUCH:POISON:11d11 -F:ONLY_ITEM | DROP_1D2 | CAN_SWIM | -F:DROP_GOOD | DROP_GREAT | -F:CAN_SPEAK | EVIL | UNIQUE | NEVER_MOVE | FORCE_MAXHP | FORCE_SLEEP | -F:IM_ACID | IM_POIS | IM_COLD | IM_ELEC | RES_NETH | RES_WATE | RES_NEXU | -F:NO_FEAR | NO_CONF | NO_SLEEP | DEMON | SMART | ELDRITCH_HORROR | -F:COLD_BLOOD | RES_DISE | NO_STUN | CTHANGBAND | NO_CUT -S:1_IN_6 | -S:S_MONSTERS | S_DEMON | S_HI_DRAGON | S_HI_UNDEAD | HEAL | -S:TELE_AWAY | TPORT | CAUSE_4 | BRAIN_SMASH | DRAIN_MANA | -S:BR_NUKE | BR_POIS | BR_CHAO | BR_NEXU | ANIM_DEAD +F:CAN_SPEAK +F:CAN_SWIM +F:COLD_BLOOD +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_WATE +F:SMART +F:UNIQUE +S:1_IN_6 +S:ANIM_DEAD +S:BRAIN_SMASH +S:BR_CHAO +S:BR_NEXU +S:BR_NUKE +S:BR_POIS +S:CAUSE_4 +S:DRAIN_MANA +S:HEAL +S:S_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:TELE_AWAY +S:TPORT D:"...in the pool [there was] a grayish, horrid mass that nearly choked D:it from rim to rim. Here, it seemed, was the ultimate source of all D:miscreation and abomination. For the gray mass quobbed and quivered, @@ -14481,15 +24941,47 @@ B:HIT:COLD:9d11 B:HIT:HURT:9d11 B:HIT:COLD:9d11 B:HIT:HURT:9d11 -F:UNIQUE | CAN_SPEAK | SUSCEP_FIRE | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | RES_NETH | RES_WATE | MALE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | EVIL | ESCORT | GIANT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | TAKE_ITEM | RES_DISE | -F:EVIL | IM_COLD | IM_POIS | SUSCEP_FIRE | -F:COLD_BLOOD | AURA_COLD | DROP_CORPSE | ZANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | -S:BR_COLD | BO_ICEE | DARKNESS | TELE_TO | S_KIN | S_HI_UNDEAD | -S:TELE_AWAY | HAND_DOOM +F:AURA_COLD +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_DISE +F:RES_NETH +F:RES_TELE +F:RES_WATE +F:SUSCEP_FIRE +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BO_ICEE +S:BR_COLD +S:DARKNESS +S:HAND_DOOM +S:S_HI_UNDEAD +S:S_KIN +S:TELE_AWAY +S:TELE_TO D:Ymir is one of the oldest beings in existence. He looks like a giant D:humanoid made of ice. @@ -14502,16 +24994,53 @@ O:0:0:100:0 B:HIT:BLIND:6d11 B:HIT:UN_BONUS:6d11 B:HIT:UN_POWER:6d11 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | RES_NETH | RES_PLAS | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT | EVIL | AURA_FIRE | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | TAKE_ITEM | CAN_SPEAK | -F:EVIL | IM_FIRE | NO_CONF | NO_SLEEP | IM_POIS | SUSCEP_COLD | GIANT | -F:REGENERATE | ZANGBAND | HAS_LITE -S:1_IN_5 | -S:SHRIEK | HASTE | HEAL | DRAIN_MANA | TPORT | TELE_TO | TELE_AWAY | -S:TELE_LEVEL | FORGET | S_HI_DEMON | HAND_DOOM | S_HI_UNDEAD | -S:S_UNIQUE | S_HI_DRAGON | BA_DARK | BA_MANA | ANIM_DEAD +F:AURA_FIRE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_PLAS +F:RES_TELE +F:SUSCEP_COLD +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:ANIM_DEAD +S:BA_DARK +S:BA_MANA +S:DRAIN_MANA +S:FORGET +S:HAND_DOOM +S:HASTE +S:HEAL +S:SHRIEK +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_UNIQUE +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:Loki, the god of mischief, is a nasty person. He will use every D:dirty trick in the book, and then some. In the end, his half-giant D:heritage is bound to show, as he will defect to the side of the @@ -14527,14 +25056,46 @@ B:CLAW:POISON:1d30 B:CLAW:ACID:1d30 B:TOUCH:UN_POWER:1d10 B:CRUSH:UN_BONUS:2d33 -F:RAND_25 | KILL_ITEM | OPEN_DOOR | BASH_DOOR | RES_NETH | ELDRITCH_HORROR | -F:DROP_1D2 | DROP_2D2 | DROP_90 | ONLY_ITEM | FORCE_SLEEP | FORCE_MAXHP | -F:EVIL | DEMON | IM_POIS | IM_COLD | IM_ACID | IM_ELEC | RES_TELE | NONLIVING | -F:POWERFUL | IM_FIRE | CAN_SWIM | CTHANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_90 +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NONLIVING +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RAND_25 +F:RES_NETH +F:RES_TELE S:1_IN_3 -S:SCARE | CONF | S_DEMON | S_UNDEAD | DRAIN_MANA | BR_ACID | -S:BR_FIRE | TPORT | S_MONSTERS | BRAIN_SMASH | BR_NETH | -S:HEAL | MIND_BLAST | BA_NUKE | ANIM_DEAD +S:ANIM_DEAD +S:BA_NUKE +S:BRAIN_SMASH +S:BR_ACID +S:BR_FIRE +S:BR_NETH +S:CONF +S:DRAIN_MANA +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_DEMON +S:S_MONSTERS +S:S_UNDEAD +S:TPORT D:The last remnants of sanity threaten to leave your brain as you D:behold this titanic bat-winged, octopus-headed unholy abomination. D:"They all lay in stone houses in their great city of R'lyeh, @@ -14552,15 +25113,44 @@ B:HIT:FIRE:9d11 B:HIT:HURT:9d11 B:HIT:FIRE:9d11 B:HIT:HURT:9d11 -F:UNIQUE | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | RES_NETH | RES_PLAS | MALE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | EVIL | AURA_FIRE | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | TAKE_ITEM | CAN_SPEAK | -F:EVIL | IM_FIRE | NO_CONF | NO_SLEEP | IM_POIS | SUSCEP_COLD | GIANT | -F:ZANGBAND | HAS_LITE -S:1_IN_5 | -S:BR_FIRE | BR_PLAS | BLIND | TELE_TO | S_KIN | -S:HAND_DOOM | TELE_AWAY | S_HI_DEMON +F:AURA_FIRE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_PLAS +F:RES_TELE +F:SUSCEP_COLD +F:SUSCEP_COLD +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BLIND +S:BR_FIRE +S:BR_PLAS +S:HAND_DOOM +S:S_HI_DEMON +S:S_KIN +S:TELE_AWAY +S:TELE_TO D:Surtur is another of the most ancient of all creatures. He is a demonic D:giant of fire, who is destined to set the nine worlds afire with his D:accursed sword of doom on the day of Ragnarok. @@ -14575,13 +25165,28 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:UN_POWER:10d10 B:TOUCH:UN_POWER:10d10 -F:UNIQUE | ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | IM_FIRE | IM_COLD | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BR_FIRE | BR_COLD | BR_DISE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_2 +S:BR_COLD +S:BR_DISE +S:BR_FIRE D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable D:and immune to magic. Fear its anger, for its devastation is unmatched! @@ -14595,17 +25200,37 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_FIRE | BR_PLAS | -S:S_HI_DEMON | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BR_FIRE +S:BR_PLAS +S:CONF +S:SCARE +S:S_HI_DEMON +S:S_UNDEAD D:A massive form cloaked in flame. Lungorthin stares balefully at you with D:eyes that smoulder red. The dungeon floor where he stands is scorched by D:the heat of his body. @@ -14620,15 +25245,30 @@ B:CLAW:HURT:6d8 B:CLAW:HURT:6d8 B:BITE:POISON:6d6 B:BITE:POISON:6d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | DROP_CORPSE | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_POIS | BASEANGBAND -S:1_IN_3 | -S:SCARE | S_MONSTERS | S_HOUND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:UNIQUE +S:1_IN_3 +S:SCARE +S:S_HOUND +S:S_MONSTERS D:Draugluin provides Sauron with a fearsome personal guard. He is an D:enormous wolf inhabited by a human spirit. He is chief of all his kind. @@ -14642,17 +25282,55 @@ B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:GAZE:LOSE_INT:2d12 B:GAZE:LOSE_WIS:2d12 -F:ONLY_ITEM | DROP_1D2 | CAN_SWIM | -F:DROP_GOOD | DROP_GREAT | -F:CAN_SPEAK | EVIL | UNIQUE | NEVER_MOVE | FORCE_MAXHP | FORCE_SLEEP | -F:IM_ACID | IM_POIS | IM_COLD | IM_ELEC | RES_NETH | RES_WATE | RES_NEXU | -F:NO_FEAR | NO_CONF | NO_SLEEP | DEMON | SMART | ELDRITCH_HORROR | -F:COLD_BLOOD | RES_DISE | CTHANGBAND | NO_CUT -S:1_IN_2 | -S:FORGET | HEAL | HAND_DOOM | BA_MANA | TPORT | TELE_AWAY | -S:TELE_LEVEL | CONF | BLIND | BRAIN_SMASH | DRAIN_MANA | -S:S_MONSTERS | S_KIN | S_HI_DEMON | S_HOUND | S_HYDRA | -S:S_UNIQUE | S_HI_UNDEAD | S_HI_DRAGON | ANIM_DEAD +F:CAN_SPEAK +F:CAN_SWIM +F:COLD_BLOOD +F:CTHANGBAND +F:DEMON +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_WATE +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_MANA +S:BLIND +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:HAND_DOOM +S:HEAL +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_HOUND +S:S_HYDRA +S:S_KIN +S:S_MONSTERS +S:S_UNIQUE +S:TELE_AWAY +S:TELE_LEVEL +S:TPORT D:Shuma-Gorath is one of the immortal lords of chaos. The true form of D:this blasphemous horror is a huge, all-seeing eye surrounded by tentacles. @@ -14666,13 +25344,40 @@ B:HIT:HURT:2d50 B:HIT:HURT:2d50 B:HIT:HURT:2d50 B:HIT:HURT:2d50 -F:RAND_25 | EVIL | DEMON | AURA_FIRE | AURA_COLD | ELDRITCH_HORROR | -F:DROP_2D2 | DROP_4D2 | DROP_GOOD | ONLY_ITEM | RES_TELE | -F:IM_POIS | IM_FIRE | FORCE_SLEEP | FORCE_MAXHP | NONLIVING | -F:IM_COLD | IM_ACID | IM_ELEC | RES_NEXU | RES_NETH | RES_PLAS | -F:REGENERATE | UNIQUE | CTHANGBAND | HAS_LITE | NO_CUT | NO_SLEEP | NO_FEAR -S:1_IN_3 | -S:BR_NEXU | BR_NETH | BR_COLD | BR_FIRE +F:AURA_COLD +F:AURA_FIRE +F:CTHANGBAND +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:RAND_25 +F:REGENERATE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:UNIQUE +S:1_IN_3 +S:BR_COLD +S:BR_FIRE +S:BR_NETH +S:BR_NEXU D:"A belching column of sick greenish flame... spouting volcanically D:from the depths profound and inconceivable, casting no shadows as D:healthy flame should, and coating the nitrous stone with a nasty, @@ -14689,12 +25394,27 @@ B:HIT:HURT:2d50 B:HIT:HURT:2d50 B:HIT:HURT:2d50 B:HIT:HURT:2d50 -F:RAND_25 | EVIL | DEMON | SUSCEP_ACID | -F:DROP_2D2 | DROP_GOOD | ONLY_ITEM | RES_TELE | DROP_GREAT | UNIQUE | NO_SLEEP | -F:IM_POIS | IM_FIRE | FORCE_SLEEP | FORCE_MAXHP | NONLIVING | JOKEANGBAND | +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP F:HAS_LITE -S:1_IN_3 | -S:ROCKET | S_HI_DEMON +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_SLEEP +F:ONLY_ITEM +F:RAND_25 +F:RES_TELE +F:SUSCEP_ACID +F:UNIQUE +S:1_IN_3 +S:ROCKET +S:S_HI_DEMON D:The mightiest of Cyberdemons, their lord and ruler. N:844:Vecna, the Emperor Lich @@ -14707,18 +25427,48 @@ B:HIT:EXP_80:7d12 B:HIT:LOSE_DEX:7d12 B:HIT:UN_POWER:7d12 B:HIT:UN_POWER:7d12 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:TPORT | BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_FIRE | BA_NETH | -S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_KIN | HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:HAND_DOOM +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:TPORT D:The greatest of all undead sorcerers, even the gods once feared him. This D:ancient shadow of death wilts every living thing it passes. @@ -14731,15 +25481,51 @@ O:0:0:100:0 B:TOUCH:HURT:40d5 B:TOUCH:LOSE_CON:16d2 B:TOUCH:LOSE_CON:16d2 -F:UNIQUE | CAN_SPEAK | SMART | ELDRITCH_HORROR | RES_TELE -F:PASS_WALL | FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | AURA_FIRE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | ATTR_MULTI | ATTR_ANY | AURA_COLD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | NONLIVING | CAN_FLY | -F:EVIL | IM_ACID | IM_COLD | IM_ELEC | IM_POIS | IM_FIRE | NO_CONF | NO_SLEEP -F:CTHANGBAND | HAS_LITE | NO_CUT -S:1_IN_3 | -S:BO_MANA | BRAIN_SMASH | BA_MANA | S_MONSTERS | S_HI_DEMON | -S:BA_CHAO | S_DEMON | S_HI_UNDEAD | S_HOUND | BR_MANA | BR_DISI +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:CTHANGBAND +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:RES_TELE +F:SMART +F:SMART +F:UNIQUE +S:1_IN_3 +S:BA_CHAO +S:BA_MANA +S:BO_MANA +S:BRAIN_SMASH +S:BR_DISI +S:BR_MANA +S:S_DEMON +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_HOUND +S:S_MONSTERS D:"Great globes of light massing towards the opening... the breaking D:apart of the nearest globes, and the protoplasmic flesh that D:flowed blackly outward to join together and form that eldritch, @@ -14757,14 +25543,30 @@ B:BITE:HURT:20d6 B:CLAW:HURT:8d8 B:CLAW:HURT:8d8 B:BITE:HURT:20d6 -F:UNIQUE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | KILL_BODY | NO_SLEEP -F:ANIMAL | EVIL | IM_POIS | IM_FIRE | IM_COLD | ZANGBAND -S:1_IN_8 | -S:BR_DARK | BR_POIS | BR_COLD +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_8 +S:BR_COLD +S:BR_DARK +S:BR_POIS D:The immensely huge wolf who would swallow the sun to satisfy its D:hunger - and leave the gods for dessert. @@ -14778,20 +25580,67 @@ B:CLAW:HURT:8d12 B:CLAW:HURT:8d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | RES_NETH | RES_DISE | -F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_4 | -S:S_HI_DRAGON | S_DRAGON | S_KIN | -S:BR_ACID | BR_ELEC | BR_FIRE | -S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK | -S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU | -S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS | -S:BR_WALL | BR_MANA | BR_DISI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +S:1_IN_4 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_DISI +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_MANA +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL +S:S_DRAGON +S:S_HI_DRAGON +S:S_KIN D:The mightiest of all dragonkind, a great wyrm of power is seldom D:encountered in our world. It can crush stars with its might. @@ -14805,15 +25654,52 @@ B:CRUSH:LOSE_WIS:20d5 B:CRUSH:LOSE_INT:20d5 B:BITE:LOSE_STR:10d2 B:BITE:LOSE_CON:10d2 -F:UNIQUE | CAN_SPEAK | FEMALE | ELDRITCH_HORROR | AURA_ELEC | RES_TELE | -F:ATTR_MULTI | FORCE_SLEEP | FORCE_MAXHP | PASS_WALL | ATTR_ANY | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_90 | NONLIVING | CAN_FLY | -F:SMART | OPEN_DOOR | BASH_DOOR | REGENERATE | DEMON | AURA_COLD | -F:EVIL | IM_ACID | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_3 | -S:BO_MANA | BRAIN_SMASH | BA_DARK | S_MONSTERS | -S:CAUSE_4 | HEAL | BR_CHAO | BR_CONF | BR_POIS | BR_NUKE | -S:BA_CHAO | S_HI_DEMON | S_HI_UNDEAD | S_UNIQUE | ANIM_DEAD +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:DROP_4D2 +F:DROP_90 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BO_MANA +S:BRAIN_SMASH +S:BR_CHAO +S:BR_CONF +S:BR_NUKE +S:BR_POIS +S:CAUSE_4 +S:HEAL +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE D:This horrendous outer god looks like a writhing cloudy mass filled D:with mouths and tentacles. @@ -14827,17 +25713,47 @@ B:HIT:HURT:2d66 B:HIT:HURT:2d66 B:HIT:HURT:2d66 B:HIT:HURT:2d66 -F:UNIQUE | CAN_SPEAK | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | PASS_WALL | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_90 | DROP_GREAT | -F:SMART | OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:GOOD | IM_ACID | IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | -F:RES_NEXU | RES_NETH | RES_WATE | ZANGBAND | HAS_LITE -S:1_IN_1 | -S:TELE_AWAY | TELE_TO | TELE_LEVEL | TPORT | -S:BO_MANA | BA_MANA | S_MONSTERS | HEAL | -S:CAUSE_4 | HASTE | HAND_DOOM | -S:S_ANGEL | S_UNIQUE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_90 +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:RES_NETH +F:RES_NEXU +F:RES_WATE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_1 +S:BA_MANA +S:BO_MANA +S:CAUSE_4 +S:HAND_DOOM +S:HASTE +S:HEAL +S:S_ANGEL +S:S_MONSTERS +S:S_UNIQUE +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:The hoary Lord of the Great Abyss seems a wizened man, D:but appearances can be deceiving. @@ -14851,13 +25767,31 @@ B:CLAW:POISON:9d12 B:CLAW:POISON:9d12 B:BITE:FIRE:9d12 B:BITE:FIRE:9d12 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_FIRE | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | IM_POIS | BASEANGBAND -S:1_IN_3 | -S:BR_DARK | BR_POIS | BR_FIRE | BR_NETH | S_HOUND +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_3 +S:BR_DARK +S:BR_FIRE +S:BR_NETH +S:BR_POIS +S:S_HOUND D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is D:the largest wolf to ever walk the earth. He is highly intelligent and a D:deadly opponent in combat. @@ -14872,17 +25806,61 @@ B:CRUSH:LOSE_CON:30d4 B:CRUSH:LOSE_STR:30d4 B:GAZE:LOSE_INT:1d50 B:GAZE:LOSE_WIS:1d50 -F:UNIQUE | CAN_SPEAK | ELDRITCH_HORROR | RES_TELE | NONLIVING | -F:FORCE_SLEEP | FORCE_MAXHP | PASS_WALL | DEMON | RES_NEXU | -F:SHAPECHANGER | ATTR_MULTI | ATTR_ANY | MALE | AURA_ELEC | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT | DROP_90 | -F:SMART | OPEN_DOOR | BASH_DOOR | REGENERATE | AURA_COLD | -F:EVIL | IM_ACID | IM_POIS | IM_FIRE | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_3 | -S:TELE_AWAY | TELE_TO | TELE_LEVEL | TPORT | BR_NEXU | BA_CHAO | -S:BA_MANA | BA_FIRE | S_MONSTERS | BRAIN_SMASH | MIND_BLAST | -S:CAUSE_4 | HASTE | S_HI_UNDEAD | S_HI_DRAGON | ANIM_DEAD | -S:S_ANGEL | HEAL | S_SPIDER | S_HOUND | S_HI_DEMON | HAND_DOOM +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:BASH_DOOR +F:CAN_SPEAK +F:CTHANGBAND +F:DEMON +F:DROP_4D2 +F:DROP_90 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_FIRE +F:IM_POIS +F:MALE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:RES_NEXU +F:RES_TELE +F:SHAPECHANGER +F:SMART +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_CHAO +S:BA_FIRE +S:BA_MANA +S:BRAIN_SMASH +S:BR_NEXU +S:CAUSE_4 +S:HAND_DOOM +S:HASTE +S:HEAL +S:MIND_BLAST +S:S_ANGEL +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_HOUND +S:S_MONSTERS +S:S_SPIDER +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:Nyarlathothep is the messenger, the heart and the soul of the outer gods. D:He is a shapechanger capable of assuming thousands of nightmarish forms. D:One of them looks like this: "A tall, slim figure with the young face of @@ -14901,16 +25879,52 @@ B:CRUSH:HURT:35d5 B:CRAWL:ACID:35d5 B:CRUSH:HURT:35d5 B:CRAWL:ACID:35d5 -F:UNIQUE | ELDRITCH_HORROR | RES_TELE -F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL | DEMON | AURA_FIRE | AURA_ELEC | -F:ATTR_MULTI | ESCORTS | ESCORT | POWERFUL | ATTR_ANY | NONLIVING | -F:KILL_ITEM | KILL_WALL | CAN_SWIM | AURA_COLD -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_90 | RES_DISE | -F:STUPID | OPEN_DOOR | BASH_DOOR | REGENERATE | EMPTY_MIND | -F:EVIL | IM_ACID | IM_POIS | IM_FIRE | NO_CONF | NO_SLEEP | NO_STUN | CTHANGBAND -F:HAS_LITE | NO_CUT -S:1_IN_5 | -S:S_DEMON | BR_CHAO | BR_DISE | BR_MANA | BA_WATE | BR_DISI +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_SWIM +F:CTHANGBAND +F:DEMON +F:DROP_4D2 +F:DROP_90 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:EMPTY_MIND +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:KILL_WALL +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_DISE +F:RES_TELE +F:STUPID +F:UNIQUE +S:1_IN_5 +S:BA_WATE +S:BR_CHAO +S:BR_DISE +S:BR_DISI +S:BR_MANA +S:S_DEMON D:"That last amorphous blight of nethermost confusion which D:blasphemes and bubbles at the centre of all infinity -- D:the boundless daemon sultan Azathoth, whose name no lips @@ -14929,14 +25943,31 @@ B:CLAW:COLD:9d12 B:CLAW:COLD:9d12 B:BITE:COLD:9d12 B:BITE:COLD:9d12 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:SMART | OPEN_DOOR | BASH_DOOR | KILL_BODY | -F:ANIMAL | GOOD | -F:IM_COLD | IM_ACID | IM_ELEC | BASEANGBAND -S:1_IN_5 | -S:BR_COLD | BR_SHAR | BR_SOUN | BR_LITE | +F:ANIMAL +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:KILL_BODY +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_5 +S:BR_COLD +S:BR_LITE +S:BR_SHAR +S:BR_SOUN D:The wolfhound of the Valar, Huan has served many masters in his time, from D:Celegorm son of Feanor to Beren son of Barahir: but now he runs wild and D:acknowledges no master save himself, as he hunts alone for his nemesis - @@ -14951,12 +25982,35 @@ O:0:0:0:0 B:CRUSH:HURT:20d10 B:CRUSH:HURT:20d10 B:BITE:HURT:5d50 -F:UNIQUE | FORCE_MAXHP | FORCE_SLEEP | WILD_TOO | WILD_OCEAN | WILD_SWAMP | -F:MOVE_BODY | KILL_WALL | IM_FIRE | IM_POIS | IM_ACID | IM_COLD | COLD_BLOOD | -F:RES_WATE | RES_PLAS | RES_NEXU | NO_STUN | REGENERATE | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | ZANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:REGENERATE +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:UNIQUE +F:WILD_OCEAN +F:WILD_SWAMP +F:WILD_TOO +F:ZANGBAND S:1_IN_3 -S:BA_WATE | BR_MANA | BR_NETH | BR_POIS | BR_DISI | S_KIN +S:BA_WATE +S:BR_DISI +S:BR_MANA +S:BR_NETH +S:BR_POIS +S:S_KIN D:The Midgard Serpent is so huge that its body surrounds the world of D:mortal men. It could grind even the gods into lifeless pulp. @@ -14970,13 +26024,37 @@ B:HIT:HURT:30d9 B:HIT:HURT:30d9 B:HIT:HURT:30d9 B:HIT:HURT:30d9 -F:UNIQUE | NONLIVING | NO_FEAR | FORCE_MAXHP | FORCE_SLEEP | REFLECTING | -F:MOVE_BODY | KILL_WALL | IM_FIRE | IM_ELEC | IM_POIS | IM_ACID | IM_COLD | -F:RES_NETH | RES_WATE | RES_PLAS | RES_NEXU | NO_STUN | REGENERATE | -F:NO_CONF | NO_SLEEP | NO_STUN | CAN_FLY | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | ZANGBAND | NO_CUT -S:1_IN_3 | -S:BR_DISI | BO_MANA +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_STUN +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BO_MANA +S:BR_DISI D:The Destroyer was built by the Norse deities to be their ultimate weapon D:against the space gods who had arrived to judge the world. Unfortunately, D:the Destroyer has gone berserk and is destroying everything it sees. The @@ -14993,17 +26071,41 @@ B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | CAN_SPEAK | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | KILL_WALL | AURA_FIRE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | -F:IM_FIRE | IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | -S:BR_FIRE | S_KIN | -S:S_HI_DEMON | S_HI_UNDEAD +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NONLIVING +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BR_FIRE +S:CONF +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_KIN D:Gothmog is the Chief Balrog in Morgoth's personal guard. He is renowned D:for slaying three High Kings of the Noldor Elves, and he has never been D:defeated in combat. With his whip of flame and awesome fiery breath he @@ -15019,19 +26121,68 @@ B:CRUSH:HURT:50d4 B:CLAW:UN_POWER:15d2 B:CLAW:UN_BONUS:15d2 B:TOUCH:DISEASE:100d1 -F:UNIQUE | CAN_SPEAK | DEMON | ELDRITCH_HORROR | NONLIVING | -F:FORCE_SLEEP | FORCE_MAXHP | ESCORT | ESCORTS | SMART | RES_PLAS | RES_NEXU | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | REGENERATE | RES_NETH | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_1D2 | DROP_GOOD | -F:DROP_GREAT | RES_DISE | RES_TELE | CAN_SWIM | -F:EVIL | DEMON | IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | NO_CONF | NO_SLEEP | +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM F:CTHANGBAND +F:DEMON +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ELDRITCH_HORROR +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:SMART +F:UNIQUE S:1_IN_3 -S:TPORT | SCARE | BLIND | MIND_BLAST | BRAIN_SMASH | DRAIN_MANA | -S:BR_POIS | BR_ACID | BR_FIRE | CONF | DARKNESS | FORGET | S_HI_UNDEAD | -S:BR_NUKE | BR_NETH | BR_CHAO | BR_DISE | BR_DARK | BR_PLAS | BR_CONF -S:BR_NEXU | S_HI_DEMON | BR_DISI | HAND_DOOM | S:ANIM_DEAD +S:BLIND +S:BRAIN_SMASH +S:BR_ACID +S:BR_CHAO +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_DISI +S:BR_FIRE +S:BR_NETH +S:BR_NEXU +S:BR_NUKE +S:BR_PLAS +S:BR_POIS +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HAND_DOOM +S:MIND_BLAST +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD +S:TPORT D:This creature is death incarnate. "A monster of vaguely anthropoid D:outline, but with an octopus-like head whose face was a mass of D:feelers, a scaly, rubbery-looking body, prodigious claws on hind @@ -15050,16 +26201,47 @@ B:HIT:HURT:12d12 B:HIT:HURT:12d12 B:HIT:FIRE:12d12 B:HIT:FIRE:12d12 -F:UNIQUE | FEMALE | DROP_CORPSE | -F:ATTR_MULTI | THUNDERLORD | RES_TELE | PET | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | GOOD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:DROP_CHOSEN | REFLECTING | AURA_FIRE | AURA_ELEC | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | POWERFUL | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TPORT | TELE_TO | BR_FIRE | BR_TIME | S_THUNDERLORD | TELE_AWAY | +F:ATTR_MULTI +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:BR_TIME +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:Foronth is the first Eagle queen, and Sarko the first to discover D:the Firebirds, the ancestor of the Thunderlord eagles. She will try to D:help you! @@ -15074,14 +26256,42 @@ B:KICK:UN_POWER:13d13 B:KICK:UN_POWER:12d12 B:BUTT:UN_BONUS:11d11 B:BITE:TIME:10d10 -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | REFLECTING | AURA_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | KILL_BODY | POWERFUL | BASH_DOOR | REGENERATE | CAN_FLY | -F:ANIMAL | GOOD | IM_ACID | IM_COLD | IM_ELEC | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | RES_TELE | ZANGBAND -S:1_IN_3 | -S:BR_SOUN | BR_LITE | BR_TIME | BR_SHAR | BR_MANA | -S:S_MONSTERS | HEAL | S_ANGEL +F:ANIMAL +F:AURA_COLD +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:KILL_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +F:ZANGBAND +S:1_IN_3 +S:BR_LITE +S:BR_MANA +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:HEAL +S:S_ANGEL +S:S_MONSTERS D:The Unicorn of Order, who once stole an eye from the great Serpent D:of Chaos, regards you as a mortal meddling in the affairs of immortals, D:and thus is attempting to eliminate you. @@ -15096,18 +26306,61 @@ B:HIT:UN_BONUS:10d12 B:HIT:UN_BONUS:10d12 B:HIT:UN_POWER:8d12 B:HIT:UN_POWER:8d12 -F:UNIQUE | MALE | CAN_SPEAK | REFLECTING | -F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | NO_SLEEP | NO_FEAR | NO_CONF | -F:EVIL | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TPORT | TELE_LEVEL | BLIND | CONF | SCARE | CAUSE_4 | -S:BRAIN_SMASH | FORGET | BO_ICEE | BO_MANA | BO_PLAS | -S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | BA_CHAO | -S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | S_WRAITH | S_UNIQUE | -S:HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BLIND +S:BO_ICEE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:CONF +S:FORGET +S:HAND_DOOM +S:SCARE +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH +S:TELE_LEVEL +S:TPORT D:Mighty in spells and enchantments, he created the One Ring. D:His eyes glow with power and with his gaze he seeks to destroy D:your soul. He has many servants, and rarely fights without them. @@ -15122,21 +26375,74 @@ B:GAZE:EAT_GOLD:20d10 B:HIT:SHATTER:20d10 B:BITE:LOSE_ALL:10d12 B:TOUCH:UN_POWER -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | MALE | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON | -F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE | -F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE | -F:REGENERATE | CAN_FLY | CAN_SWIM | DG_CURSE | WYRM_PROTECT | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF |NO_FEAR | NO_STUN | RES_TELE -F:MORTAL | JOKEANGBAND | HAS_LITE -S:1_IN_2 | -S:S_THUNDERLORD | BR_CHAO | BA_CHAO | ROCKET | BRAIN_SMASH | S_HI_DEMON | -S:BR_NETH | HASTE | BR_MANA | S_HI_UNDEAD | S_HI_DRAGON | TRAPS | FORGET | -S:BR_NUKE | BR_POIS | BR_DISI | HAND_DOOM | HEAL | TPORT | TELE_TO | -S:S_BUG | S_RNG | +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DG_CURSE +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:KILL_BODY +F:KILL_WALL +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_TELE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_2 +S:BA_CHAO +S:BRAIN_SMASH +S:BR_CHAO +S:BR_DISI +S:BR_MANA +S:BR_NETH +S:BR_NUKE +S:BR_POIS +S:FORGET +S:HAND_DOOM +S:HASTE +S:HEAL +S:ROCKET +S:S_BUG +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_RNG +S:S_THUNDERLORD +S:TELE_TO +S:TPORT +S:TRAPS D:He is the master of coding; none can match his skill. He created the D:Variant Maintainer, the RNGs, and the software bugs. Bull Gates is D:nothing next to him. Do not think that since he loves the novels of @@ -15154,19 +26460,58 @@ B:HIT:SHATTER:24d10 B:HIT:SHATTER:24d10 B:HIT:LOSE_ALL:10d12 B:TOUCH:UN_POWER -F:UNIQUE | CAN_SPEAK | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH | -F:SMART | KILL_WALL | MOVE_BODY | AURA_COLD | -F:REGENERATE | POWERFUL | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD | -S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | -S:ROCKET | BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH +F:AURA_COLD +F:BASEANGBAND +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_MANA +S:BA_NETH +S:BO_MANA +S:BRAIN_SMASH +S:BR_DISI +S:BR_NETH +S:HAND_DOOM +S:ROCKET +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH D:He was the most powerful of the Valar, the equal of Manwe. D:He is the Master of the Pits of Angband. His figure is like a black D:mountain crowned with Lightning. He rages with everlasting anger, his @@ -15187,12 +26532,18 @@ W:0:20:1700:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY D:They are used as the main assault force of the human kings. D:They will help you in some quests. @@ -15203,14 +26554,23 @@ W:0:20:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_1 | -S:ARROW_2 | ARROW_1 | ARROW_2 | ARROW_1 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY +S:1_IN_1 +S:ARROW_1 +S:ARROW_1 +S:ARROW_2 +S:ARROW_2 D:They are used as the main assault force of the elven kings. D:They will help you in some quests. @@ -15221,12 +26581,18 @@ W:0:20:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:6d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY D:They are used as the main assault force of the dwarven kings. D:They will help you in some quests. @@ -15238,12 +26604,21 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:MALE | -F:FORCE_MAXHP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +S:1_IN_8 S:ARROW_2 D:It is a cunning orc of power, taller than a man, and stronger. It fears D:little. @@ -15258,13 +26633,33 @@ B:GAZE:CONFUSE:15d5 B:GAZE:PARALYZE:15d5 B:TOUCH:INSANITY:5d5 B:TOUCH:EXP_40:5d5 -F:FEMALE | UNIQUE | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_GREAT | -F:CAN_SPEAK | WEIRD_MIND | DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | JOKEANGBAND | HAS_LITE +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:UNIQUE +F:WEIRD_MIND S:1_IN_3 -S:BR_CONF | BR_SOUN | BR_CHAO | BR_TIME | -S:HOLD | SCARE | SLOW | CONF | FORGET +S:BR_CHAO +S:BR_CONF +S:BR_SOUN +S:BR_TIME +S:CONF +S:FORGET +S:HOLD +S:SCARE +S:SLOW D:She is a feared teacher, mistress of chaos and strangely minded. D:She wants to take your mind. Fear her and flee while you can. @@ -15277,12 +26672,24 @@ O:20:20:20:20 B:INSULT:* B:HIT:INSANITY:1d8 B:HIT:LOSE_WIS:1d8 -F:ONLY_ITEM | DROP_2D2 | UNIQUE | CAN_FLY | -F:DROP_GOOD | WEIRD_MIND | CAN_SPEAK | -F:RAND_50 | RAND_25 | INVISIBLE | EVIL | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:HAS_LITE +F:INVISIBLE +F:JOKEANGBAND +F:MORTAL +F:ONLY_ITEM +F:RAND_25 +F:RAND_50 +F:UNIQUE +F:WEIRD_MIND S:1_IN_2 -S:S_BUG | S_RNG | BR_CONF +S:BR_CONF +S:S_BUG +S:S_RNG D:A deranged programmer, scattering bizarre ideas and bad code everywhere. N:869:Random Number Generator @@ -15294,8 +26701,12 @@ O:20:20:20:20 B:INSULT:* B:MOAN:* B:HIT:CONFUSE:1d6 -F:DROP_1D2 | EVIL | -F:EMPTY_MIND | RAND_50 | RAND_25 | JOKEANGBAND +F:DROP_1D2 +F:EMPTY_MIND +F:EVIL +F:JOKEANGBAND +F:RAND_25 +F:RAND_50 S:MULTIPLY D:A feared creation of the Variant Maintainer, it tries to generate Morgoth D:in the town and the One Ring in the magic shop. @@ -15307,10 +26718,19 @@ W:50:10:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:10d5 -F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID | -F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CUT +F:STUPID +F:UNDEAD S:1_IN_4 -S:ROCKET | ARROW_4 +S:ARROW_4 +S:ROCKET D:It was left here to be used against intruders. N:871:Bouncing mine @@ -15320,10 +26740,23 @@ W:70:10:0:200 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:10d5 -F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID | -F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CUT +F:STUPID +F:UNDEAD S:1_IN_3 -S:ROCKET | ARROW_4 | BLINK | BR_POIS | BR_CHAO | BR_NEXU +S:ARROW_4 +S:BLINK +S:BR_CHAO +S:BR_NEXU +S:BR_POIS +S:ROCKET D:It was left here to be used against intruders. N:872:Durin's Bane @@ -15336,17 +26769,39 @@ B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | SPECIAL_GENE | DROP_RANDART -F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL | -F:ESCORT | ESCORTS | DROP_CORPSE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CHOSEN | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | -F:NO_CONF | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | SCARE | -S:BR_FIRE | -S:S_UNDEAD | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:CONF +S:SCARE +S:S_DEMON +S:S_UNDEAD D:A huge Balrog surrounded by raging pillars of fire, this is indeed a D:terrible opponent. Wielding a great whip of fire and a blazing sword, his D:fury blisters your skin and melts your flesh! @@ -15361,14 +26816,35 @@ B:CRAWL:POISON:3d4 B:CRAWL:EAT_FOOD:3d4 B:TOUCH:ACID:3d5 B:HIT:HURT:3d5 -F:UNIQUE | FEMALE | -F:FORCE_MAXHP | CAN_SPEAK | SMART | ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_CORPSE | -F:WEIRD_MIND | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:DRAIN_MANA | BLIND | CONF | SCARE | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WEIRD_MIND +S:1_IN_5 +S:BLIND +S:CONF +S:DRAIN_MANA +S:SCARE +S:S_KIN D:And you thought her offspring were icky! N:874:Rot jelly @@ -15379,10 +26855,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_FOOD:2d3 B:TOUCH:LOSE_CHR:2d3 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:HURT_LITE | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pile of rotting flesh, whose touch spoils your food. The terrible D:smell it exudes is also very hard to get rid of... @@ -15396,11 +26879,23 @@ B:HIT:HURT:20d5 B:HIT:HURT:20d5 B:TOUCH:EXP_80:20d5 B:TOUCH:EXP_80:20d5 -F:UNIQUE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE D:"And I looked, and behold a pale horse: and his name that sat on him was D:Death, and Hell followed with him. And power was given unto them over the D:fourth part of the earth, to kill with sword, and with hunger, and with @@ -15416,11 +26911,24 @@ B:TOUCH:EAT_FOOD:20d4 B:GAZE:UN_BONUS:20d4 B:WAIL:LOSE_INT:10d5 B:WAIL:LOSE_DEX:10d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_STUN | NO_SLEEP | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE D:One of the horsemen of the apocalypse, before you lies Famine. A D:figure so gaunt that the shape of the bones beneath are revealed, D:Famine rides a pale grey mare that appears near death. @@ -15435,13 +26943,27 @@ B:TOUCH:POISON:20d4 B:TOUCH:POISON:20d4 B:TOUCH:DISEASE:16d5 B:TOUCH:DISEASE:16d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT -S:1_IN_2 | -S:S_ANT | S_SPIDER +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:S_ANT +S:S_SPIDER D:One of the horsemen of the apocalypse, before you lies Pestilence. D:At first, it looks like a human, but then you notice ants, worms, and D:worse peeking out of the flesh. Pestilence rides a purple horse with @@ -15457,12 +26979,26 @@ B:TOUCH:PARALYZE:20d4 B:WAIL:CONFUSE:20d4 B:GAZE:BLIND:20d4 B:WAIL:TERRIFY:20d4 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | NO_FEAR | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT -S:1_IN_2 | +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_2 S:S_MONSTER D:One of the horsemen of the apocalypse, before you lies War. A healthy and D:hearty warrior, War grins a little too wide at you as he prepares for @@ -15478,8 +27014,13 @@ W:2:1:100:7 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d3 -F:ANIMAL | AQUATIC | STUPID | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:MORTAL +F:STUPID D:It's a common fresh-water predatory fish. N:880:Electric eel @@ -15491,9 +27032,16 @@ O:0:0:0:0 B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 -F:AQUATIC | ANIMAL | RAND_25 | IM_ELEC | RES_WATE | -F:WILD_TOO | WILD_OCEAN | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO D:This serpentine creature can create a deadly voltage. Better watch out! N:881:Giant crayfish @@ -15504,8 +27052,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CLAW:HURT:3d4 B:CLAW:HURT:3d4 -F:ANIMAL | AQUATIC | STUPID | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:MORTAL +F:STUPID +F:WEIRD_MIND D:A man-sized, heavily armoured fresh-water relative of the lobster. N:882:Mermaid @@ -15517,8 +27071,15 @@ O:20:50:10:5 B:TOUCH:LOSE_WIS B:TOUCH:INSANITY:2d3 B:TOUCH:CONFUSE -F:FEMALE | RAND_25 | DROP_60 | SMART | AQUATIC | NO_CONF | DROP_CORPSE | -F:MORTAL | ZANGBAND +F:AQUATIC +F:DROP_60 +F:DROP_CORPSE +F:FEMALE +F:MORTAL +F:NO_CONF +F:RAND_25 +F:SMART +F:ZANGBAND D:A green-skinned humanoid with a fishtail. Beware - there are rumours D:of adventures losing their minds under the fearsome D:charms of mermaids. @@ -15531,8 +27092,13 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:PARALYZE:1d6 B:TOUCH:PARALYZE:1d6 -F:ANIMAL | AQUATIC | IM_POIS | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_POIS +F:MORTAL +F:WILD_TOO D:A strange water creature, whose touch can be deadly. N:884:Giant piranha @@ -15543,9 +27109,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:5d1 B:BITE:HURT:5d1 -F:NO_SLEEP | WILD_TOO | COLD_BLOOD | -F:FRIENDS | AQUATIC | ANIMAL | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FRIENDS +F:MORTAL +F:NO_SLEEP +F:WILD_TOO D:A very large and bloodthirsty fish. N:885:Piranha @@ -15555,8 +27126,13 @@ W:3:1:200:8 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FRIENDS | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FRIENDS +F:MORTAL +F:WILD_TOO D:Bloodthirsty fish who can smell your blood from a great distance. N:886:Bullywug @@ -15567,8 +27143,17 @@ E:1:1:1:2:1:1 O:30:40:10:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:MALE | ONLY_ITEM | DROP_1D2 | SMART | AQUATIC | DROP_CORPSE | FRIENDS | -F:MORTAL | BASEANGBAND | HAS_LITE | COLD_BLOOD +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:SMART D:A vaguely humanoid creature, it looks like a cross between a hobbit and a D:frog. @@ -15580,8 +27165,16 @@ E:1:1:1:2:1:1 O:15:60:10:10 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:MALE | ONLY_ITEM | DROP_1D2 | SMART | AQUATIC | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | COLD_BLOOD +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_CORPSE +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:SMART D:A member of the frog-people clan. He is wielding a long, sharp shark tooth. N:888:Bullywug shaman @@ -15592,10 +27185,24 @@ E:1:1:1:2:1:1 O:25:10:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | ONLY_ITEM | DROP_1D2 | SMART | AQUATIC | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | COLD_BLOOD -S:1_IN_5 | -S:BLIND | CONF | DARKNESS | BO_COLD | HEAL | MISSILE | CAUSE_2 +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_CORPSE +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:SMART +S:1_IN_5 +S:BLIND +S:BO_COLD +S:CAUSE_2 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE D:A leader of a clan of frog-people, he is cloaked in a cloak made of D:shark skin. @@ -15607,9 +27214,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CRUSH:HURT:1d20 B:CRUSH:HURT:1d20 -F:RAND_25 | FORCE_MAXHP | RES_WATE | -F:ANIMAL | AQUATIC | WILD_TOO | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_TOO D:Although it looks like a fish and lives in water, it is in fact D:a mammal. And it is huge! @@ -15621,9 +27233,16 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:POISON:3d6 B:BITE:POISON:3d6 -F:AQUATIC | ANIMAL | IM_POIS | FRIENDS | -F:CHAR_CLEAR | ATTR_CLEAR | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:COLD_BLOOD +F:DROP_CORPSE +F:FRIENDS +F:IM_POIS +F:MORTAL S:MULTIPLY D:A relative of crabs and shrimp, this is a tiny creature that inhabits sandy D:bottoms. It has a pair of dangerous-looking claws. @@ -15638,8 +27257,15 @@ B:SPIT:BLIND:1d3 B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 -F:RAND_25 | IM_COLD | RES_WATE | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_TOO D:It doesn't move very fast, but when it does - watch out! N:892:Giant octopus @@ -15652,11 +27278,24 @@ B:SPIT:BLIND:1d4 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 B:CRUSH:PARALYZE:8d4 -F:AQUATIC | SMART | IM_POIS | ANIMAL | NO_CONF | NO_SLEEP | -F:NO_FEAR | SMART | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND -S:1_IN_15 | -S:DARKNESS | SLOW | CONF | SCARE +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:SMART +F:SMART +F:WEIRD_MIND +S:1_IN_15 +S:CONF +S:DARKNESS +S:SCARE +S:SLOW D:A cunning and dangerous undersea opponent. N:893:Eye of the deep @@ -15669,12 +27308,31 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | AQUATIC | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | RES_TELE | -F:SMART | DROP_CORPSE | BASEANGBAND -S:1_IN_2 | -S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | -S:FORGET | DARKNESS | BO_WATE | BO_ICEE | BO_MANA | BO_COLD +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +F:SMART +S:1_IN_2 +S:BLIND +S:BO_COLD +S:BO_ICEE +S:BO_MANA +S:BO_WATE +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SCARE +S:SLOW D:A beholder that inhabits the depths of the sea, sleeping and pondering D:alien thoughts for centuries. Occasionally, it will float to the D:surface to wreck the lives of surface dwellers. @@ -15689,12 +27347,28 @@ B:BITE:POISON:5d10 B:CLAW:PARALYZE B:STING:INSANITY:5d10 B:STING:UN_BONUS -F:AQUATIC | ANIMAL | WEIRD_MIND | FORCE_MAXHP | HURT_LITE | -F:EVIL | SMART | NO_CONF | NO_SLEEP | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BA_POIS | BR_DARK | BLIND | BR_POIS | SLOW | CONF | MIND_BLAST | -S:BRAIN_SMASH | DARKNESS +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:SMART +F:WEIRD_MIND +S:1_IN_5 +S:BA_POIS +S:BLIND +S:BRAIN_SMASH +S:BR_DARK +S:BR_POIS +S:CONF +S:DARKNESS +S:MIND_BLAST +S:SLOW D:A gigantic aquatic monster, somewhat resembling a cross between a D:lobster and a spider. It is coated in poisonous slime and noxious D:parasites. This foul creature hides in the silt of the deep ocean floor, @@ -15709,10 +27383,23 @@ O:0:0:0:0 B:TOUCH:BLIND:3d3 B:TOUCH:POISON:2d4 B:WAIL:TERRIFY -F:COLD_BLOOD | EMPTY_MIND | EVIL | AQUATIC | UNDEAD | IM_COLD | INVISIBLE | -F:IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:1_IN_8 -S:BLIND | HOLD | CONF +S:BLIND +S:CONF +S:HOLD D:A ghastly victim of drowning, forever doomed to wander the ocean waters D:looking for revenge. @@ -15723,8 +27410,13 @@ W:12:1:3000:40 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:4d4 -F:RAND_25 | AQUATIC | ANIMAL | STUPID | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:STUPID D:A small species of shark, although the teeth are still as deadly. N:897:Hammerhead shark @@ -15736,8 +27428,12 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:BUTT:HURT:3d4 B:BITE:HURT:3d4 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A hungry shark with a strange head. N:898:Great white shark @@ -15749,8 +27445,12 @@ O:0:0:0:0 B:BITE:HURT:4d6 B:BITE:HURT:4d6 B:BITE:HURT:4d6 -F:FORCE_SLEEP | AQUATIC | COLD_BLOOD | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FORCE_SLEEP +F:MORTAL D:A very large carnivorous fish. N:899:Aquatic golem @@ -15761,9 +27461,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:3d10 B:HIT:HURT:3d10 -F:COLD_BLOOD | EMPTY_MIND | AQUATIC | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:An ingenious gnomish invention -- a golem designed for underwater D:usage. @@ -15774,8 +27483,13 @@ W:5:1:1500:35 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d10 -F:DROP_90 | EVIL | IM_POIS | AQUATIC | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:IM_POIS +F:MORTAL D:Yes, your favourite denizen of evil also comes in an aquatic variety. N:901:White shark @@ -15787,8 +27501,12 @@ O:0:0:0:0 B:BITE:HURT:3d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A fast-moving hunter of the depths. When this creature moves, D:everybody in the water is in danger! @@ -15802,11 +27520,23 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:3d2 B:HIT:HURT:3d2 -F:MALE | -F:FORCE_MAXHP | AQUATIC | REGENERATE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_OCEAN | -F:OPEN_DOOR | BASH_DOOR | RES_WATE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:RES_WATE +F:TROLL +F:WILD_OCEAN +F:WILD_TOO D:A troll of the sea, he reeks of brine. N:903:Jaws @@ -15819,11 +27549,22 @@ B:BITE:HURT:11d2 B:BITE:HURT:22d1 B:BITE:HURT:11d2 B:BITE:HURT:22d1 -F:FORCE_MAXHP | UNIQUE | MOVE_BODY | -F:WILD_OCEAN | WILD_TOO | COLD_BLOOD | -F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC | -F:NO_CONF | NO_SLEEP | -F:MORTAL | ZANGBAND +F:ANIMAL +F:AQUATIC +F:BASH_DOOR +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:UNIQUE +F:WILD_OCEAN +F:WILD_TOO +F:ZANGBAND D:The biggest white shark who has ever lived, it is hunting for you now! N:904:Aquatic elf @@ -15833,8 +27574,14 @@ W:9:1:1400:25 E:1:1:1:2:1:0 O:20:20:50:10 B:HIT:HURT:3d4 -F:MALE | AQUATIC | SMART | DROP_CORPSE | -F:FRIENDS | DROP_60 | ZANGBAND | HAS_LITE +F:AQUATIC +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:SMART +F:ZANGBAND D:A sleek form vaguely shaped like a dolphin, except with a humanoid D:head and arms. The facial features are decidedly elven. @@ -15846,8 +27593,14 @@ E:1:1:1:2:1:0 O:20:60:10:10 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:MALE | AQUATIC | FRIENDS | SMART | DROP_60 | DROP_CORPSE | ZANGBAND | +F:AQUATIC +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS F:HAS_LITE +F:MALE +F:SMART +F:ZANGBAND D:An aquatic elf trained in all forms of combat. N:906:Aquatic elven shaman @@ -15857,10 +27610,17 @@ W:10:1:1400:35 E:1:1:1:2:1:0 O:10:10:70:10 B:TOUCH:UN_BONUS -F:MALE | AQUATIC | SMART | DROP_2D2 | DROP_CORPSE | ZANGBAND | +F:AQUATIC +F:DROP_2D2 +F:DROP_CORPSE F:HAS_LITE -S:1_IN_12 | -S:BO_MANA | BO_COLD | S_MONSTERS +F:MALE +F:SMART +F:ZANGBAND +S:1_IN_12 +S:BO_COLD +S:BO_MANA +S:S_MONSTERS D:A wizened aquatic elf skilled in the magical arts. You can see an D:iridescent film coating the water around him. @@ -15871,9 +27631,14 @@ W:21:1:800:60 E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE -F:AQUATIC | ANIMAL | SMART | RAND_25 | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:SMART +S:1_IN_10 S:S_MONSTER D:A giant fish shaped like a flounder. There are two enormous eyes D:occupying half of the creature's body. @@ -15886,9 +27651,13 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE B:GAZE:CONFUSE -F:AQUATIC | ANIMAL | SMART | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:SMART +S:1_IN_10 S:S_MONSTERS D:A stargazer a bit larger than average, covered with barnacles. @@ -15899,8 +27668,14 @@ W:13:1:700:55 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d6 -F:AQUATIC | ANIMAL | RAND_25 | INVISIBLE | ATTR_CLEAR | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:ATTR_CLEAR +F:BASEANGBAND +F:DROP_CORPSE +F:INVISIBLE +F:MORTAL +F:RAND_25 D:A flattened fish which is able to change body colouring for D:camouflage. @@ -15912,8 +27687,11 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d2 B:BITE:HURT:2d2 -F:ANIMAL | AQUATIC | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL D:A giant turtle with flippers, adapted for life in the ocean. N:911:Baby dragon turtle @@ -15925,10 +27703,18 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:ONLY_GOLD +S:1_IN_12 S:BR_SOUN D:A newly-hatched dragon turtle. It still hasn't grown a proper shell. @@ -15941,12 +27727,18 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | -F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI -S:1_IN_11 | -S:SCARE | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +S:1_IN_11 S:BR_SOUN +S:SCARE D:A dragon-like creature inhabiting lightless reaches of ocean caves. It has D:a long neck with a tiny head, and four massive flippers. It has a soft and D:flexible shell. @@ -15960,13 +27752,21 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_4D2 | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | AQUATIC | BASEANGBAND | HAS_LITE +F:AQUATIC F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +S:1_IN_9 S:BR_SOUN +S:SCARE D:A large dragon turtle, covered with a tough white shell. N:914:Ancient dragon turtle @@ -15978,13 +27778,27 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_1D2 | DROP_4D2 | -F:SMART | AQUATIC | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:BLIND | CONF | SCARE | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_9 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A huge dragon turtle. You can see many barnacles covering its body. N:915:Fastitocalon @@ -15997,11 +27811,27 @@ B:BITE:HURT:5d8 B:BITE:HURT:5d8 B:CRUSH:POISON:3d10 B:CRUSH:POISON:3d10 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | AQUATIC | WILD_TOO | WILD_OCEAN | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:DRAGON | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BR_FIRE | BR_ACID | BR_SOUN | BA_WATE +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_6 +S:BA_WATE +S:BR_ACID +S:BR_FIRE +S:BR_SOUN D:A huge aquatic dragon-turtle, its shell is as large as a small island. N:916:Undead stargazer @@ -16012,9 +27842,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE B:GAZE:EXP_20 -F:AQUATIC | ANIMAL | SMART | INVISIBLE | UNDEAD | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:S_UNDEAD | S_MONSTER +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:INVISIBLE +F:NO_CUT +F:SMART +F:UNDEAD +S:1_IN_10 +S:S_MONSTER +S:S_UNDEAD D:A stargazer brought back from the dead under control of some unholy D:sorceror. @@ -16026,8 +27863,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:7d4 B:BITE:HURT:7d4 -F:AQUATIC | WILD_TOO | WILD_OCEAN | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:MORTAL +F:WILD_OCEAN +F:WILD_TOO D:An almost beautiful, deadly beast. N:918:Merrow @@ -16038,10 +27879,22 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | AQUATIC | WILD_TOO | WILD_OCEAN | -F:OPEN_DOOR | BASH_DOOR | RES_WATE | IM_COLD | IM_POIS | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO D:A great ogre of the sea, it is violent and stupid. N:919:Water naga @@ -16054,13 +27907,22 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:POISON:1d8 -F:FEMALE | -F:AQUATIC | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:EVIL | NO_CONF | NO_SLEEP | SMART | -F:MORTAL | BASEANGBAND -S:1_IN_7 | -S:DARKNESS | CAUSE_3 | BO_ICEE +F:AQUATIC +F:BASEANGBAND +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +S:1_IN_7 +S:BO_ICEE +S:CAUSE_3 +S:DARKNESS D:A naga adapted to underwater life. She has a fish-like tail and a pair D:of gills. @@ -16070,10 +27932,19 @@ I:105:10d5:10:10:5 W:12:1:900:60 E:0:0:0:0:1:0 O:0:0:0:0 -F:NEVER_BLOW | ATTR_MULTI | AQUATIC | NO_CONF | DROP_CORPSE | -F:MORTAL | ZANGBAND -S:1_IN_4 | -S:BR_CHAO | BR_LITE | BR_SOUN | BR_DISE | BR_TIME +F:AQUATIC +F:ATTR_MULTI +F:DROP_CORPSE +F:MORTAL +F:NEVER_BLOW +F:NO_CONF +F:ZANGBAND +S:1_IN_4 +S:BR_CHAO +S:BR_DISE +S:BR_LITE +S:BR_SOUN +S:BR_TIME D:A disgusting fish, it has a large gaping mouth and a small lantern dangling D:from an outgrowth on its head. @@ -16083,10 +27954,20 @@ I:105:10d5:10:10:5 W:15:1:0:75 E:0:0:0:0:1:0 O:0:0:0:0 -F:NEVER_BLOW | ATTR_MULTI | AQUATIC | INVISIBLE | NO_CONF | UNDEAD | -F:ZANGBAND | NO_CUT -S:1_IN_4 | -S:BR_NETH | BR_DISE | BR_TIME | BR_NEXU | BR_POIS +F:AQUATIC +F:ATTR_MULTI +F:INVISIBLE +F:NEVER_BLOW +F:NO_CONF +F:NO_CUT +F:UNDEAD +F:ZANGBAND +S:1_IN_4 +S:BR_DISE +S:BR_NETH +S:BR_NEXU +S:BR_POIS +S:BR_TIME D:A devilfish brought back from the dead. N:922:Moby Dick, the White Whale @@ -16099,11 +27980,22 @@ B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 -F:FORCE_MAXHP | UNIQUE | MOVE_BODY | -F:WILD_OCEAN | WILD_TOO | COLD_BLOOD | -F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC | -F:MORTAL | JOKEANGBAND -S:1_IN_6 | BA_WATE +F:ANIMAL +F:AQUATIC +F:BASH_DOOR +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:MOVE_BODY +F:UNIQUE +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_6 +S:BA_WATE D:The mightiest whale of the seas, he has sunk many ships in his time. With D:a mere flick of his tail he can create a mighty whirlpool, to the ruin D:of all who would travel the ocean. @@ -16117,11 +28009,15 @@ O:0:0:0:0 B:BITE:CONFUSE:2d8 B:BITE:HURT:2d8 B:CLAW:POISON:2d8 -F:FRIENDS | DROP_CORPSE | -F:ANIMAL | AQUATIC | -F:MORTAL | BASEANGBAND -S:1_IN_10 | -S:BO_ICEE | BO_WATE +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:FRIENDS +F:MORTAL +S:1_IN_10 +S:BO_ICEE +S:BO_WATE D:A dog with a finned tail and large, muscular flippers for hind legs. D:It has a rubbery skin instead of fur. @@ -16134,13 +28030,24 @@ O:20:60:20:0 B:HIT:HURT:3d4 B:GAZE:POISON:8d12 B:CLAW:INSANITY:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | -F:FRIENDS | SMART | -F:ONLY_ITEM | DROP_60 | -F:AQUATIC | POWERFUL | -F:EVIL | DEMON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BO_ICEE | BA_WATE +F:AQUATIC +F:BASEANGBAND +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SMART +S:1_IN_8 +S:BA_WATE +S:BO_ICEE D:A hideous scaled demon, it is a sleek form with many fins but no visible D:arms or legs. It has a toothed gaping maw, reminiscent of a caricature D:of a shark's jaws. @@ -16153,8 +28060,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:POISON:2d5 B:STING:POISON:2d5 -F:ANIMAL | EVIL | AQUATIC | IM_POIS | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:IM_POIS +F:MORTAL +F:WILD_TOO D:An intelligent devil-ray of the depths. N:926:Ixitxachitl priest @@ -16165,10 +28078,21 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:POISON:2d7 B:STING:POISON:2d7 -F:ANIMAL | EVIL | AQUATIC | IM_POIS | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:IM_POIS +F:MORTAL +F:WILD_TOO S:1_IN_6 -S:TELE_TO | HEAL | SCARE | CAUSE_2 | BLIND | S_MONSTER +S:BLIND +S:CAUSE_2 +S:HEAL +S:SCARE +S:S_MONSTER +S:TELE_TO D:A devil-ray of the depths, with priestly magic. N:927:Vampiric ixitxachitl @@ -16179,10 +28103,21 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:STING:POISON:3d8 B:STING:EXP_40:3d8 -F:ANIMAL | EVIL | AQUATIC | RES_NETH | IM_POIS | WILD_TOO | -F:BASEANGBAND | COLD_BLOOD +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:IM_POIS +F:RES_NETH +F:WILD_TOO S:1_IN_6 -S:HEAL | SCARE | CAUSE_3 | BLIND | FORGET | HASTE +S:BLIND +S:CAUSE_3 +S:FORGET +S:HASTE +S:HEAL +S:SCARE D:A devil-ray of the depths, with vampiric powers. N:928:Mathilde, the Science Student @@ -16191,11 +28126,23 @@ I:110:220d100:40:10:3 W:0:4:1100:0 E:0:1:1:2:1:1 O:20:20:20:20 -F:UNIQUE | FEMALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | RAND_25 -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:OPEN_DOOR | DG_CURSE | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:CAN_SPEAK +F:DG_CURSE +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:She loves joking, and she's constantly giggling. A very happy girl. D:Beware, it is rumoured that Dark God has put a mighty curse on her. @@ -16208,9 +28155,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:3d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:930:Young spirit @@ -16221,9 +28178,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:9d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:931:Mature spirit @@ -16234,9 +28201,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:18d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:932:Experienced spirit @@ -16247,9 +28224,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:20d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:933:Wise spirit @@ -16260,9 +28247,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:30d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:934:Fangorn the Treebeard, Lord of the Ents @@ -16275,10 +28272,25 @@ B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | DROP_CORPSE | -F:SMART | TAKE_ITEM | BASH_DOOR | KILL_WALL | NO_SLEEP | -F:GOOD | PET | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE D:The first being to awoke on Arda, apart from the Valar themselves. He is the D:first, oldest, greatest and most respected of all the Ents: and though he is D:slow to anger, he is a terrible foe when roused. @@ -16293,17 +28305,51 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:TERRIFY:5d5 B:HIT:TERRIFY:5d5 -F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:GOOD | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS | -S:BA_FIRE | BO_FIRE | BO_PLAS | BO_MANA | CAUSE_4 | -S:S_MONSTERS | S_ANGEL | S_DRAGON | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:BA_FIRE +S:BLIND +S:BO_FIRE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_ANGEL +S:S_DRAGON +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY +S:TPORT +S:TRAPS D:The wizard who opposed Sauron and, in the end, was the only D:one of the Istari to succeed in his task. Gandalf is very D:wise and specialises in fire magic. @@ -16318,13 +28364,25 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | FORCE_SLEEP | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_POIS | -F:DROP_CORPSE | DROP_SKELETON | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | BLIND | CONF | CAUSE_2 | MIND_BLAST +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:UNIQUE +S:1_IN_6 +S:BLIND +S:CAUSE_2 +S:CONF +S:HEAL +S:MIND_BLAST D:The friend and companion of the dwarven king Thror, he went mad with D:grief after Thror's death at the hands of Azog the Orc. With torn beard D:and ragged clothes, he seems to have fixed on you as a convenient target @@ -16337,10 +28395,22 @@ W:8:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | WILD_TOO | FRIENDS | -F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP -S:1_IN_12 | BLIND | SLOW | CONF | SCARE +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:CONF +S:SCARE +S:SLOW D:A novice in the arts of mind over matter. N:938:Great Swamp Wyrm @@ -16353,14 +28423,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:POISON:6d14 B:BITE:POISON:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_POIS +S:CONF +S:SCARE D:A truly enormous dragon with great powers. The foul gases issuing D:from the beast nearly make you vomit; and while you may try to hold D:your breath as you fight it, it sees no reason to do likewise. @@ -16375,14 +28462,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ACID:6d14 B:BITE:ACID:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_ACID +S:CONF +S:SCARE D:A huge and very powerful dragon. Great steaming pools of acid drip from D:its form onto the ground. You shudder when you see the acid eating away D:the very stones of the dungeon - what could it do to you? @@ -16395,11 +28499,22 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:3d4 B:CLAW:FIRE:5d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | -F:MORTAL | HAS_LITE +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16411,11 +28526,22 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:4d4 B:CLAW:FIRE:5d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | -F:MORTAL | HAS_LITE +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16427,11 +28553,22 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:5d4 B:CLAW:FIRE:7d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | -F:MORTAL | HAS_LITE +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16443,11 +28580,22 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:6d4 B:CLAW:FIRE:7d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | -F:MORTAL | HAS_LITE +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16459,11 +28607,22 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:6d4 B:CLAW:FIRE:8d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | -F:MORTAL | HAS_LITE +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16475,11 +28634,23 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:MALE | FRIENDS | OPEN_DOOR | BASH_DOOR | -F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET | -F:IM_ACID | IM_COLD | RES_WATE | RES_NETH | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:RES_NETH +F:RES_WATE +F:SMART +S:1_IN_2 S:ARROW_4 D:An elf cloaked in green wielding a longbow. @@ -16493,12 +28664,28 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:EXP_80:4d6 B:HIT:EXP_80:4d6 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NAZGUL | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CHOSEN | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | SPECIAL_GENE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE D:A tall black Ringwraith, he is a master of horsemanship. He longs D:to taste your blood. @@ -16512,15 +28699,38 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:TOUCH:EXP_80:5d6 B:TOUCH:EXP_80:5d6 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | FORGET | -S:BO_ACID | BO_FIRE | BO_COLD | BO_NETH | +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_FIRE +S:BO_NETH +S:CAUSE_3 +S:FORGET +S:HOLD +S:SCARE S:S_MONSTER D:A sorceress in life, Adunaphel quickly fell under Sauron's sway and the D:power of the rings. @@ -16535,15 +28745,38 @@ B:HIT:HURT:7d6 B:HIT:HURT:7d6 B:GAZE:EXP_80:6d6 B:WAIL:TERRIFY:6d6 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS | -S:BO_FIRE | BO_COLD | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BO_COLD +S:BO_FIRE +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE S:S_MONSTERS D:A mighty sorcerer king, Akhorahil was blind in life. With powerful D:enchantments, he created jewelled eyes that enabled him to see better than @@ -16559,14 +28792,38 @@ B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_NETH | BA_FIRE | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BLIND +S:BO_FIRE +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE S:S_MONSTER D:Ren was an insane eastern king who believed himself to be the son of a D:volcano god. At an early age his sanity was destroyed by a plague that @@ -16582,15 +28839,40 @@ B:HIT:HURT:8d7 B:HIT:HURT:8d7 B:TOUCH:EXP_40:6d7 B:TOUCH:EXP_40:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | -S:BA_FIRE | BA_NETH | BA_COLD | BA_ELEC | BA_ACID | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:HOLD +S:SCARE S:S_UNDEAD D:This Ringwraith was a weak-minded sorcerer-king who fell easily under D:Sauron's power. @@ -16605,15 +28887,40 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:BITE:EXP_40:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BA_FIRE | BA_NETH | -S:S_MONSTERS | S_UNDEAD | S_HOUND +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:HOLD +S:SCARE +S:S_HOUND +S:S_MONSTERS +S:S_UNDEAD D:Dwar had a special affinity for dogs in life, and can still command them D:at will. He howls manically as he reaches out to destroy you. @@ -16627,15 +28934,40 @@ B:HIT:HURT:9d9 B:HIT:HURT:9d9 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NAZGUL | DROP_CHOSEN | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | MIND_BLAST | -S:BO_COLD | BA_COLD | BA_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_COLD +S:BA_NETH +S:BLIND +S:BO_COLD +S:CAUSE_3 +S:CAUSE_4 +S:HOLD +S:MIND_BLAST +S:SCARE S:S_UNDEAD D:A Ringwraith powerful in fell sorcery, he yearns for the life he has D:exchanged for an unlife of everlasting torment. @@ -16650,16 +28982,48 @@ B:HIT:HURT:9d10 B:HIT:HURT:9d10 B:TOUCH:EXP_80:7d7 B:TOUCH:EXP_80:7d7 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_ACID | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_LEVEL | BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | BO_MANA | -S:BA_FIRE | BA_COLD | BA_NETH | ANIM_DEAD | -S:S_HI_UNDEAD | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_MANA +S:CAUSE_3 +S:CAUSE_4 +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_KIN +S:TELE_LEVEL D:He was the warrior-king of the East, now a Ringwraith. Khamul is a powerful opponent, his skill in D:combat awesome and his form twisted by evil cunning. @@ -16673,16 +29037,47 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:EXP_80:7d7 B:HIT:EXP_80:7d7 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | NAZGUL | -F:EVIL | UNDEAD | DROP_CHOSEN | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_AWAY | BLIND | HOLD | SCARE | CAUSE_3 | BRAIN_SMASH | -S:BO_MANA | BA_NETH | S_WRAITH | -S:S_KIN | S_HI_UNDEAD | S_HI_DRAGON | S_MONSTERS | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_3 +S:HOLD +S:SCARE +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:S_WRAITH +S:TELE_AWAY D:The Chief of the Ringwraiths. A fell being of devastating power, his D:spells are lethal and his combat blows crushingly hard. He moves at D:speed, and commands legions of evil to do his bidding. It is said that he @@ -16696,14 +29091,26 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:FEMALE | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:BLINK | TELE_AWAY +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TELE_AWAY D:A Thunderlord. Among the weaker breeds, but still dangerous. N:956:Blue Thunderlord @@ -16714,14 +29121,27 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d7 B:HIT:HURT:8d7 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:TPORT | BLINK +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TPORT D:A Thunderlord. Among the weaker breeds, but still dangerous. N:957:Brown Thunderlord @@ -16732,14 +29152,27 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d9 B:HIT:HURT:8d9 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:TPORT | BLINK +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TPORT D:A Thunderlord. Beware its flame. N:958:Bronze Thunderlord @@ -16750,14 +29183,28 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:10d9 B:HIT:HURT:10d9 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | BR_TIME | -S:TPORT | BLINK +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:BR_TIME +S:TPORT D:A Thunderlord, mightiest among the males. N:959:Gold Thunderlord @@ -16770,15 +29217,31 @@ B:HIT:HURT:10d9 B:HIT:HURT:10d9 B:HIT:HURT:10d9 B:HIT:HURT:10d9 -F:FEMALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | BR_TIME | -S:TPORT | BLINK | TELE_TO | TELE_AWAY | +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:BR_TIME S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:A Thunderlord, among the queens of their kind. N:960:Blood Sprout @@ -16791,10 +29254,17 @@ B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 -F:STUPID | EMPTY_MIND | KILL_TREES | -F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | +F:EMPTY_MIND +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_TREES F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:STUPID S:MULTIPLY D:A kind of giant mycorrhiza, corrupted into a carnivore by Morgoth. @@ -16808,14 +29278,30 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:HAS_LITE -S:1_IN_2 | -S:CAUSE_3 | BO_WATE | BO_MANA +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:BO_MANA +S:BO_WATE +S:CAUSE_3 D:This sad creature - once a mighty warrior - betrayed his former friends to D:Morgoth's army in return for, he thought, safety for himself and his wife. D:And so he fell under Morgoth's power and became little more than a mindless @@ -16831,10 +29317,22 @@ B:CLAW:HURT:2d5 B:TOUCH:EAT_ITEM B:TOUCH:INSANITY:2d5 B:TOUCH:INSANITY:2d5 -F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOO | -F:RAND_25 | UNIQUE | STUPID | MALE | FORCE_MAXHP | -F:TAKE_ITEM | CAN_SPEAK | CAN_SWIM | EVIL | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MALE +F:MORTAL +F:RAND_25 +F:STUPID +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO S:1_IN_8 S:SHRIEK D:He tends to blubber a lot, he was a simple blubbering idiot before he lost @@ -16851,11 +29349,23 @@ B:CLAW:POISON:2d8 B:CLAW:POISON:2d8 B:BITE:POISON:2d6 B:BITE:POISON:2d6 -F:DROP_SKELETON | FORCE_MAXHP | FRIENDS | -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | -F:ANIMAL | SPIDER | EVIL | IM_POIS | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:OPEN_DOOR +F:SPIDER S:1_IN_4 -S:BO_FIRE | SLOW | HOLD | CAUSE_3 | MISSILE +S:BO_FIRE +S:CAUSE_3 +S:HOLD +S:MISSILE +S:SLOW D:A red arachnid with legs weaving spells in the air. N:964:Elder aranea @@ -16868,12 +29378,28 @@ B:CLAW:POISON:5d8 B:CLAW:POISON:5d8 B:BITE:HALLU:5d6 B:BITE:HALLU:5d6 -F:DROP_SKELETON | FORCE_MAXHP | -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | SMART | -F:ANIMAL | SPIDER | EVIL | IM_FIRE | IM_POIS | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIDER S:1_IN_6 -S:SLOW | HOLD | DRAIN_MANA | MIND_BLAST | HEAL | -S:BA_FIRE | BO_FIRE | CAUSE_3 | S_SPIDER +S:BA_FIRE +S:BO_FIRE +S:CAUSE_3 +S:DRAIN_MANA +S:HEAL +S:HOLD +S:MIND_BLAST +S:SLOW +S:S_SPIDER D:A vast, bloated arachnid, master of its brood: among the more terrible of D:Ungoliant's descendants, this is a monster such as those who haunted the dread D:valley of Nan Dungortheb long ago. @@ -16886,8 +29412,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 B:STING:BLIND:1d1 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:It is moving slowly towards you. N:966:Wavelord @@ -16900,13 +29431,34 @@ B:HIT:HURT:8d9 B:HIT:COLD:8d9 B:HIT:HURT:8d9 B:HIT:COLD:8d9 -F:SMART | PET | DROP_CORPSE | FRIENDS | WILD_SHORE | WILD_OCEAN | WILD_TOO | -F:IM_POIS | AQUATIC | CAN_SWIM | DROP_USEFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | DROP_GOOD | DROP_3D2 | -F:MORTAL | REGENERATE | TAKE_ITEM | GOOD | SUSCEP_FIRE | -F:RES_WATE | RES_NEXU | HAS_LITE +F:AQUATIC +F:CAN_SWIM +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_USEFUL +F:FRIENDS +F:GOOD +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:PET +F:REGENERATE +F:RES_NEXU +F:RES_WATE +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_TOO S:1_IN_4 -S:BO_WATE | BA_WATE | BO_ICEE +S:BA_WATE +S:BO_ICEE +S:BO_WATE D:The Dolphiners came with the Thunderlords from their far home. D:These friendly beings ride their sharks into combat to assist you. @@ -16916,8 +29468,10 @@ I:110:1d1:30:1:10 W:10:3:10:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART D:It does not look that powerful. N:968:Bat of Gorgoroth @@ -16928,11 +29482,24 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:POISON:1d10 B:CLAW:HURT:1d4 -F:DROP_60 | RAND_25 | MOVE_BODY | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | MOVE_BODY | FRIENDS | WEIRD_MIND | -F:ANIMAL | IM_POIS | AI_ANNOY | MORTAL | BASEANGBAND -S:1_IN_8 | -S:SCARE | BR_POIS | BR_DARK +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:MOVE_BODY +F:RAND_25 +F:WEIRD_MIND +S:1_IN_8 +S:BR_DARK +S:BR_POIS +S:SCARE D:Fed with horrid meats and grown to enormous size, this slavering creature D:seeks livelier prey. @@ -16942,10 +29509,20 @@ I:110:1d1:40:250:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:0:1:0 -F:FEMALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE | NO_TARGET -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_DEATH | RES_TELE -F:MORTAL | BASEANGBAND | UNIQUE | PET | +F:BASEANGBAND +F:CAN_SPEAK +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:MORTAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:PET +F:RES_TELE +F:SPECIAL_GENE +F:UNIQUE D:The princess of an unknown kingdom, you need to save her! N:970:Merton Proudfoot, the lost hobbit @@ -16954,10 +29531,19 @@ I:110:1d1:40:250:3 W:1:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:MALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | PET | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:PET +F:SPECIAL_GENE +F:UNIQUE D:The poor hobbit got lost in the dreadful maze! N:971:The Wight-King of the Barrow-downs @@ -16970,12 +29556,30 @@ B:HIT:HURT:2d10 B:WAIL:PARALYZE:2d6 B:TOUCH:EXP_80:4d8 B:TOUCH:EXP_80:4d8 -F:SPECIAL_GENE | FORCE_MAXHP | SMART | CAN_SPEAK | -F:DROP_4D2 | DROP_2D2 | COLD_BLOOD | UNIQUE | -F:CAN_SWIM | CAN_FLY | EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HOLD | SCARE | CAUSE_3 | BA_NETH +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_4 +S:BA_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:He has lived in the Barrow-Downs for centuries after his first death at the D:hands of the Witch-King of Angmar. A once loyal captain under the D:Witch-King's command, he now awaits a time when his undead forces shall @@ -16989,9 +29593,14 @@ O:50:50:0:0 B:HIT:HURT:2d6 B:PUNCH:HURT:1d7 B:KICK:HURT:1d8 -F:SPECIAL_GENE | SMART | OPEN_DOOR -F:FORCE_MAXHP | CAN_SWIM | BASEANGBAND | -F:NO_SLEEP | NO_CONF +F:BASEANGBAND +F:CAN_SWIM +F:FORCE_MAXHP +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:SPECIAL_GENE D:A great warrior. N:973:Experienced possessor (soul) @@ -16999,8 +29608,10 @@ G:G:D I:120:5d5:30:50:10 W:30:3:10:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART S:1_IN_9 S:S_KIN D:It does not look that powerful. @@ -17010,8 +29621,10 @@ G:G:D I:130:10d10:30:100:10 W:95:3:10:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART S:1_IN_4 S:S_KIN D:It does not look that powerful. @@ -17026,12 +29639,31 @@ B:ENGULF:PARASITE:20d10 B:ENGULF:ACID:6d5 B:ENGULF:EXP_80:6d5 B:ENGULF:LOSE_ALL:6d5 -F:FORCE_MAXHP | ZANGBAND | KILL_ITEM | KILL_WALL | KILL_BODY | -F:NONLIVING | COLD_BLOOD | EMPTY_MIND | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_STUN | REGENERATE | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:RES_NETH | RES_PLAS | RES_WATE | RES_DISE | RES_NEXU | -F:DEATH_ORB | NO_CUT +F:CAN_SWIM +F:COLD_BLOOD +F:DEATH_ORB +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:ZANGBAND D:A small, apparently unassuming orb which spawns death and destruction. N:976:Bronze dragon worm @@ -17043,13 +29675,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_CONF +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:NO_CONF +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_CONF +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its scales glitter in D:a multitude of perplexing and distracting ways. @@ -17063,13 +29704,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_SOUN +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_SOUN +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. You can feel the air itself D:vibrating as you near it. @@ -17080,11 +29730,20 @@ I:100:1d1:1:1:0 W:1:1:20:3 E:0:0:0:0:0:0 O:0:0:0:0 -F:NEVER_MOVE | UNIQUE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | FORCE_DEPTH | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | WYRM_PROTECT | ONLY_DEPTH | JOKEANGBAND | NO_CUT +F:EMPTY_MIND +F:FORCE_DEPTH +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_DEPTH +F:STUPID +F:UNIQUE +F:WYRM_PROTECT D:A small strange growth. It seems to be defenceless... N:979:The Physics Teacher @@ -17097,15 +29756,35 @@ B:TOUCH:LOSE_INT:13d13 B:TOUCH:LOSE_WIS:13d13 B:GAZE:PARALYZE B:WAIL:EXP_80 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:PASS_WALL | MOVE_BODY | AURA_FIRE | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | ANIMAL | DEMON | UNDEAD | JOKEANGBAND | NO_CUT +F:ANIMAL +F:AURA_FIRE +F:BASH_DOOR +F:CAN_SPEAK +F:DEMON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:SMART +F:UNDEAD +F:UNIQUE S:1_IN_3 -S:BR_FIRE | BR_PLAS | BR_TIME | BA_WATE | ROCKET | +S:BA_WATE +S:BR_FIRE +S:BR_PLAS +S:BR_TIME S:FORGET +S:ROCKET D:A keeper of forbidden wisdom, this Teacher bombards you with his mastery D:over elements of matter. @@ -17119,12 +29798,31 @@ B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SPECIAL_GENE | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY | BASEANGBAND | -F:HAS_LITE | AQUATIC -S:1_IN_6 | -S:HEAL | HASTE | TELE_AWAY | S_MONSTERS | S_KIN +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:HASTE +S:HEAL +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY D:Last and proudest king of ancient Numenor. Corrupted by power and D:avarice, he fell victim to Sauron's wiles, tried to fight the immortals D:themselves, and condemned Numenor to oblivion. @@ -17134,7 +29832,11 @@ G:@:w I:1:1d1:1:1:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:NEVER_MOVE | NEVER_BLOW | DOPPLEGANGER | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DOPPLEGANGER +F:HAS_LITE +F:NEVER_BLOW +F:NEVER_MOVE D:It looks like you... N:982:Marylene, Heartbreakeress of the Netherworld @@ -17147,21 +29849,80 @@ B:GAZE:PARALYZE:20d15 B:HIT:EXP_80:20d17 B:BITE:LOSE_ALL:10d12 B:TOUCH:INSANITY:12d9 -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | FEMALE | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON | -F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE | -F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE | -F:REGENERATE | CAN_FLY | CAN_SWIM | WYRM_PROTECT | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | RES_TELE | DEMON | -F:MORTAL | DG_CURSE | JOKEANGBAND | HAS_LITE -S:1_IN_1 | -S:BR_CHAO | BA_CHAO | BRAIN_SMASH | SHRIEK | BR_CONF | BR_SOUN | -S:BR_NETH | HASTE | TRAPS | FORGET | BR_DISE | BR_TIME | MIND_BLAST | -S:HEAL | TPORT | TELE_TO | CAUSE_1 | CAUSE_2 | CAUSE_3 | CAUSE_4 | BLIND | -S:CONF | SLOW | HOLD | S_ANGEL | S_UNIQUE +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEMON +F:DG_CURSE +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:KILL_BODY +F:KILL_WALL +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_TELE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_1 +S:BA_CHAO +S:BLIND +S:BRAIN_SMASH +S:BR_CHAO +S:BR_CONF +S:BR_DISE +S:BR_NETH +S:BR_SOUN +S:BR_TIME +S:CAUSE_1 +S:CAUSE_2 +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:HOLD +S:MIND_BLAST +S:SHRIEK +S:SLOW +S:S_ANGEL +S:S_UNIQUE +S:TELE_TO +S:TPORT +S:TRAPS D:A woman of mind-shattering beauty, none can match her beauty. She is perfect, D:and totally evil. She loves nothing but herself and her evil is as D:great as her beauty. No one can stand against her, even DarkGod. @@ -17179,16 +29940,55 @@ B:GAZE:PARALYZE:20d15 B:HIT:HURT:15d10 B:TOUCH:EXP_80:10d5 B:TOUCH:EAT_ITEM -F:RAND_50 | TAKE_ITEM | FORCE_MAXHP | UNIQUE | -F:DROP_3D2 | DROP_GOOD | DROP_GREAT | WYRM_PROTECT | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | RES_TELE | DEMON | -F:EVIL | WEIRD_MIND | RES_NETH | INVISIBLE | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | JOKEANGBAND | NO_CUT +F:DEMON +F:DROP_3D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RAND_50 +F:RES_NETH +F:RES_TELE +F:TAKE_ITEM +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT S:1_IN_2 -S:CONF | SHRIEK | BR_CONF | BR_TIME | BR_INER | BR_GRAV | BRAIN_SMASH | -S:SCARE | BLIND | SLOW | HOLD | HASTE | HEAL | TELE_TO | FORGET | -S:S_HI_DEMON | S_MONSTERS | S_HYDRA | S_HI_DRAGON | S_HI_UNDEAD | S_ANGEL | -S:S_HOUND | S_UNIQUE | +S:BLIND +S:BRAIN_SMASH +S:BR_CONF +S:BR_GRAV +S:BR_INER +S:BR_TIME +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:HOLD +S:SCARE +S:SHRIEK +S:SLOW +S:S_ANGEL +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_HOUND +S:S_HYDRA +S:S_MONSTERS +S:S_UNIQUE +S:TELE_TO D:It is even worse than the RNG, coming from Mangband, D:it seeks to crush you to pulp... and surely can. @@ -17202,15 +30002,43 @@ B:HIT:SHATTER:9d11 B:HIT:SHATTER:9d11 B:HIT:HURT:9d11 B:HIT:HURT:9d11 -F:UNIQUE | SUSCEP_ACID | HURT_ROCK | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | RES_NETH | RES_PLAS | MALE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | EVIL | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | TAKE_ITEM | CAN_SPEAK | -F:EVIL | IM_FIRE | IM_POIS | GIANT | -F:ZANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | -S:BR_WALL | BR_GRAV | BR_SHAR | BLIND | TELE_TO | S_KIN | S_MONSTERS | -S:HAND_DOOM | TELE_AWAY | +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_PLAS +F:RES_TELE +F:SUSCEP_ACID +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BLIND +S:BR_GRAV +S:BR_SHAR +S:BR_WALL +S:HAND_DOOM +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY +S:TELE_TO D:Hrungnir is the strongest of all the Stone Giants: one who would even dare D:to challenge Thor himself to single combat. @@ -17222,11 +30050,20 @@ E:1:1:1:2:1:1 O:25:55:0:20 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE D:He is a sturdy hobbit who is renowned for his unusual strength and D:vigour. He can prove a troublesome opponent. @@ -17239,11 +30076,22 @@ O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | CAN_SWIM | -F:DROP_CORPSE | DROP_SKELETON | ONLY_GOLD | DROP_2D2 | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_9 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_9 S:SCARE D:A strange reptilian creature with three heads, guarding its hoard. @@ -17257,12 +30105,24 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +S:1_IN_10 +S:S_KIN D:An evil and cunning man from the East. Having once sworn allegiance to the D:sons of Feanor, it was Uldor's treachery that turned the tide of the Battle D:of Unnumbered Tears in Morgoth's favour. @@ -17277,15 +30137,27 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | -S:S_SPIDER | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:HEAL +S:S_ANIMAL +S:S_SPIDER D:An adept at unarmed combat, the mystic strikes with stunning power. He D:can summon help from nature and is able to focus his power to ease any D:pain. @@ -17300,14 +30172,37 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:BITE:EXP_80:5d6 B:BITE:EXP_80:5d6 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_60 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD D:A terrible robed undead figure, this creature has existed in its D:unlife for many centuries by stealing the life of others. It can D:summon the very shades of its victims from beyond the grave to @@ -17323,12 +30218,30 @@ B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | IM_FIRE | IM_COLD | IM_ELEC | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_RANDART -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | S_KIN | S_MONSTERS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_10 +S:S_KIN +S:S_MONSTERS D:A short and swarthy Easterling dressed in black. He and his three sons D:once openly swore allegiance to the High Elves, but were secretly in the D:pay of Morgoth. @@ -17342,15 +30255,27 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON -F:RES_NETH | RES_NEXU | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TPORT | HOLD | -S:S_DEMON | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:SMART +S:1_IN_2 +S:BO_FIRE +S:HOLD +S:S_DEMON +S:TPORT D:A figure twisted by evil standing in robes of deepest crimson. N:992:Hezrou @@ -17361,13 +30286,23 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS -F:ONLY_ITEM | DROP_2D2 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING F:BASEANGBAND -S:1_IN_9 | -S:BO_FIRE | +F:BASH_DOOR +F:DEMON +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BO_FIRE S:S_DEMON D:It is a demon of lizard form with cruel-looking jaws. @@ -17379,13 +30314,22 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | F:BASEANGBAND -S:1_IN_9 | -S:BO_FIRE | +F:BASH_DOOR +F:DEMON +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BO_FIRE S:S_DEMON D:It is a demon with arms and pincers, its form a true mockery of life. @@ -17398,15 +30342,25 @@ O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE -F:ONLY_ITEM | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | -F:IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CONF | -S:BR_FIRE | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:BR_FIRE +S:CONF S:S_DEMON D:It is a large demon with the head of a giant boar. Flames run up and down D:its length. @@ -17421,14 +30375,25 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CAUSE_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:CAUSE_2 S:S_DEMON D:She is a demon of female form with many arms, each bearing deadly weapons. @@ -17442,14 +30407,30 @@ B:HIT:FIRE:4d12 B:HIT:FIRE:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | -S:BR_FIRE | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_FIRE +S:CONF S:S_DEMON D:It is a massive humanoid demon wreathed in flames. @@ -17463,16 +30444,31 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | -S:S_SPIDER | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_3 +S:HEAL +S:S_ANIMALS +S:S_SPIDER D:A lord of all that is natural, skilled in the mystic ways. He is a master D:of martial arts and is at one with nature, able to summon help from the D:wild if need be. @@ -17487,15 +30483,32 @@ B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_4D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | MIND_BLAST | -S:S_SPIDER | S_HOUND | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:HEAL +S:MIND_BLAST +S:S_ANIMALS +S:S_HOUND +S:S_SPIDER D:He is one of the few true masters of the art, being extremely skillful in D:all forms of unarmed combat and controlling the world's natural creatures D:with disdainful ease. @@ -17508,15 +30521,25 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:TOUCH:LOSE_STR:1d5 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | -F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | -F:BASEANGBAND -S:1_IN_7 | -S:BLIND | CONF | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_7 +S:BLIND +S:BO_FIRE +S:CONF D:It is a lesser demon of female form; however, she takes little time to D:show her true colours. @@ -17527,10 +30550,21 @@ W:4:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | WILD_TOO | -F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP -S:1_IN_9 | BLIND | SLOW | CONF | SCARE +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:BLIND +S:CONF +S:SCARE +S:SLOW D:A novice in the arts of mind over matter. N:1001:Polyphemus, the Blind Cyclops @@ -17543,13 +30577,34 @@ B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 -F:UNIQUE | MALE | BASEANGBAND | HAS_LITE | CAN_SWIM | -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | DROP_CORPSE | -F:DROP_2D2 | DROP_3D2 | DROP_GOOD | ONLY_ITEM | KILL_ITEM | -F:BASH_DOOR | KILL_BODY | -F:EVIL | GIANT | IM_ACID | IM_POIS | IM_FIRE | IM_COLD | -S:1_IN_5 | -S:BO_WATE | BA_WATE | BO_ICEE | BA_ACID | ARROW_4 +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:MALE +F:ONLY_ITEM +F:RAND_25 +F:UNIQUE +S:1_IN_5 +S:ARROW_4 +S:BA_ACID +S:BA_WATE +S:BO_ICEE +S:BO_WATE D:No ordinary cyclops, but the son of a sea-god: he wields the powers of D:elemental water as well as the considerable strength of a cyclops. His D:one eye was blinded long ago by the warrior Odysseus, but he has trained @@ -17565,13 +30620,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:CONFUSE:6d14 B:BITE:CONFUSE:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SMART +S:1_IN_4 +S:BLIND S:BR_CONF +S:CONF +S:SCARE D:A dragon of great size and power. Its polished bronze scales reflect the D:light in strange and confusing patterns, and you find it hard to keep your D:mind on the job of fighting for your life. @@ -17586,11 +30659,22 @@ B:BITE:TIME:2d12 B:BITE:TIME:2d12 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 -F:FORCE_SLEEP | FRIENDS | RES_NETH | -F:INVISIBLE | PASS_WALL | EVIL | CAN_FLY | -F:ANIMAL | NO_CONF | NO_SLEEP | CTHANGBAND -S:1_IN_5 | BLINK | TELE_TO | -S:BR_NETH | BR_TIME +F:ANIMAL +F:CAN_FLY +F:CTHANGBAND +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:PASS_WALL +F:RES_NETH +S:1_IN_5 +S:BLINK +S:BR_NETH +S:BR_TIME +S:TELE_TO D:"They are lean and athirst!... All the evil in the universe D:was concentrated in their lean, hungry bodies. Or had they D:bodies? I saw them only for a moment, I cannot be certain." @@ -17605,14 +30689,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:HURT:6d14 B:BITE:HURT:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | NO_STUN | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A dragon of gigantic proportions, with destructive abilities to match. The D:sheer loudness of its roar leaves you stunned and unable to think clearly D:enough to defend yourself adequately. @@ -17624,8 +30725,12 @@ W:4:1:200:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d2 -F:RAND_25 | CAN_SWIM | ANIMAL | -F:DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is about three feet long with large teeth. As the light of your lamp falls D:on it, it seems to grow stronger. @@ -17640,9 +30745,16 @@ B:CLAW:HURT:3d2 B:CLAW:HURT:3d2 B:BITE:DISEASE:4d2 B:BITE:DISEASE:4d2 -F:UNIQUE | ESCORT | ESCORTS | FORCE_MAXHP | -F:BASH_DOOR | ANIMAL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:UNIQUE D:A massive rat. He's the leader of the pack. N:1007:Vort the Kobold Queen @@ -17653,14 +30765,29 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:UNIQUE | FEMALE | CAN_SPEAK | -F:FORCE_MAXHP | -F:ESCORT | ESCORTS | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | MISSILE | HEAL | CAUSE_1 | CONF +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_6 +S:CAUSE_1 +S:CONF +S:HEAL +S:MISSILE D:Where Mughash is the strongest of his kind, his consort Vort is the D:wisest: she is her tribe's chief shamaness. @@ -17671,8 +30798,13 @@ W:14:1:100:3 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:It is six inches long. @@ -17683,13 +30815,32 @@ W:34:5:0:1200 E:0:0:0:0:0:0 O:0:0:100:0 B:HIT:HURT:5d5 -F:UNIQUE | MALE | CAN_SPEAK -F:FORCE_MAXHP | UNDEAD | NO_CONF | NO_SLEEP | REGENERATE | NO_STUN | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | PASS_WALL | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:TAKE_ITEM +F:UNDEAD +F:UNIQUE S:1_IN_6 -S:BR_FIRE | HOLD | CONF | SCARE | MIND_BLAST +S:BR_FIRE +S:CONF +S:HOLD +S:MIND_BLAST +S:SCARE D:He's back from the grave for vengeance on those who D:burnt him. He has no mercy for those in his way. @@ -17700,15 +30851,33 @@ W:36:2:1500:1200 E:1:1:1:2:1:1 O:20:20:20:20 B:HIT:HURT:3d8 -F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | RAND_25 | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR -F:JOKEANGBAND | HAS_LITE -S:1_IN_4 | -S:TELE_TO | SHRIEK | SCARE +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE +S:1_IN_4 +S:SCARE +S:SHRIEK +S:TELE_TO D:Once a powerful adventurer, this poor fighter has seen a few too many D:software bugs in his time. Any shred of lucidity is long gone, but D:he still remains dangerous. He wanders aimlessly through the dungeon @@ -17724,15 +30893,37 @@ O:0:50:50:0 B:CLAW:HURT:5d5 B:HIT:LOSE_STR:4d4 B:TOUCH:EXP_80:8d3 -F:UNIQUE | FEMALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | NO_SLEEP | NO_CONF -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | PASS_WALL | MOVE_BODY | NONLIVING | -F:OPEN_DOOR | BASH_DOOR | IM_POIS | IM_COLD | DEMON | EVIL | +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DEMON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:UNIQUE F:ZANGBAND -S:1_IN_3 | -S:CAUSE_3 | HOLD | BLIND | BO_ACID | S_DEMON | -S:FORGET | BO_NETH | MIND_BLAST | DARKNESS +S:1_IN_3 +S:BLIND +S:BO_ACID +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:S_DEMON D:Drop dead gorgeous - literally. N:1012:Vermicious Knid @@ -17744,11 +30935,20 @@ O:40:30:20:10 B:TOUCH:TERRIFY:4d6 B:CRAWL:HURT:4d6 B:ENGULF:HURT:4d6 -F:FRIENDS | EVIL | IM_COLD | SMART | -F:COLD_BLOOD | NO_FEAR | WEIRD_MIND | -F:OPEN_DOOR | ONLY_ITEM | DROP_2D2 | HURT_ROCK | -F:NONLIVING | -F:JOKEANGBAND | NO_CUT +F:COLD_BLOOD +F:DROP_2D2 +F:EVIL +F:FRIENDS +F:HURT_ROCK +F:IM_COLD +F:JOKEANGBAND +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:WEIRD_MIND D:An amorphous shape that looks like wet grey clay with two pale eyes. D:It is totally silent as it oozes towards you. @@ -17762,13 +30962,32 @@ B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 B:HIT:LOSE_STR:6d6 B:HIT:LOSE_STR:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | EMPTY_MIND | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_NETH | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +F:UNDEAD +S:1_IN_3 +S:BA_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:S_HI_UNDEAD +S:TELE_TO D:A skeletal form, black as night, constructed from the bones of its D:previous victims. @@ -17779,12 +30998,23 @@ W:38:4:2000:600 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:3d12 -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_25 | FRIENDS | AURA_FIRE | -F:BASH_DOOR | MOVE_BODY | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | HAS_EGG | EVIL | IM_FIRE | IM_POIS | -F:MORTAL | ZANGBAND -S:1_IN_5 | +F:ANIMAL +F:AURA_FIRE +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_EGG +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:RAND_25 +F:ZANGBAND +S:1_IN_5 S:BR_POIS D:It is a giant snake that drips with poison. @@ -17798,11 +31028,30 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:FORCE_MAXHP | FORCE_SLEEP | EMPTY_MIND | COLD_BLOOD | -F:OPEN_DOOR | BASH_DOOR | IM_FIRE | IM_ELEC | IM_POIS | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BO_PLAS | BA_FIRE | BR_FIRE | BA_ELEC | S_HI_DEMON | TELE_TO +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:RES_TELE +S:1_IN_3 +S:BA_ELEC +S:BA_FIRE +S:BO_PLAS +S:BR_FIRE +S:S_HI_DEMON +S:TELE_TO D:A gigantic four-armed animated bronze statue, glowing with great heat. N:1016:Dimensional shambler @@ -17814,13 +31063,33 @@ O:20:40:40:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | GOOD | -F:ONLY_ITEM | DROP_2D2 | NONLIVING | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | RES_TELE | +F:BASH_DOOR F:CTHANGBAND -S:1_IN_3 | -S:HEAL | HASTE | BLIND | CONF | SCARE | TPORT | BLINK +F:DROP_2D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:HASTE +S:HEAL +S:SCARE +S:TPORT D:A shabby humanoid with a wrinkled skin. It seems to shift D:in and out of existence as you watch. @@ -17831,15 +31100,24 @@ W:17:1:1500:36 E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:4d3 -F:MALE | -F:FORCE_SLEEP | -F:DROP_1D2 | EVIL | -F:DROP_SKELETON | DROP_CORPSE | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:MORTAL | CTHANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | SCARE | CAUSE_2 | -S:S_MONSTER | MIND_BLAST +F:BASH_DOOR +F:CTHANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:CAUSE_2 +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_MONSTER D:A robed humanoid dedicated to a demonic outer god. N:1018:Cult leader @@ -17850,16 +31128,34 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:6d4 B:HIT:HURT:6d4 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | CTHANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | BLIND | HOLD | CONF | CAUSE_3 | -S:S_MONSTER | S_UNDEAD | S_DEMON | BA_CHAO | BRAIN_SMASH +F:BASH_DOOR +F:CTHANGBAND +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_2 +S:BA_CHAO +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CONF +S:HEAL +S:HOLD +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD D:An evil priest, dressed all in black and devoted to one of the netherworld D:demons that call themselves "the outer gods". @@ -17871,15 +31167,38 @@ E:0:0:0:0:0:0 O:10:20:70:0 B:GAZE:TERRIFY:4d4 B:HIT:HURT:8d6 -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NO_FEAR | REFLECTING | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NONLIVING | -F:RES_TELE | ELDRITCH_HORROR | SHAPECHANGER | ATTR_MULTI | +F:ATTR_MULTI +F:BASH_DOOR F:CTHANGBAND -S:1_IN_3 | -S:TELE_TO | BLIND | SCARE | CAUSE_2 | CAUSE_4 | BO_MANA | +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ELDRITCH_HORROR +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SHAPECHANGER +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:BLIND +S:BO_MANA +S:CAUSE_2 +S:CAUSE_4 +S:SCARE S:S_UNDEAD +S:TELE_TO D:"Toad-like creatures which seemed constantly to be changing shape and D:appearance, and from whom emanated, by some means I could not distinguish, D:a ghostly ululation, a piping." August Derleth - "The Lurker at The @@ -17892,10 +31211,21 @@ W:45:2:0:500 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:5d5 -F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | -F:NO_SLEEP | NO_FEAR | SHAPECHANGER | ELDRITCH_HORROR | NONLIVING | -F:MALE | OPEN_DOOR | BASH_DOOR | -F:CTHANGBAND | HAS_LITE +F:BASH_DOOR +F:CTHANGBAND +F:ELDRITCH_HORROR +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NONLIVING +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:SHAPECHANGER D:The Crawling Chaos with a thousand forms. Nyarlathotep is amused at your D:puny attempts to kill him, and will keep coming back for another go D:until he gets bored with the game. @@ -17910,15 +31240,45 @@ B:HIT:ELEC:9d11 B:HIT:HURT:9d11 B:HIT:ELEC:9d11 B:HIT:HURT:9d11 -F:UNIQUE | SUSCEP_COLD | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | RES_NETH | RES_PLAS | MALE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | EVIL | AURA_ELEC | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | TAKE_ITEM | CAN_SPEAK | -F:EVIL | IM_FIRE | IM_POIS | SUSCEP_COLD | GIANT | DEMON -F:ZANGBAND | HAS_LITE -S:1_IN_5 | -S:BR_ELEC | BR_PLAS | BR_MANA | BLIND | TELE_TO | S_KIN | S_HI_DRAGON | -S:HAND_DOOM | TELE_AWAY +F:AURA_ELEC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_PLAS +F:RES_TELE +F:SUSCEP_COLD +F:SUSCEP_COLD +F:TAKE_ITEM +F:UNIQUE +F:ZANGBAND +S:1_IN_5 +S:BLIND +S:BR_ELEC +S:BR_MANA +S:BR_PLAS +S:HAND_DOOM +S:S_HI_DRAGON +S:S_KIN +S:TELE_AWAY +S:TELE_TO D:Thiazi is the greatest of all the Storm Giants: when travelling, he takes D:the form of a giant eagle. It was he who succeeded in kidnapping Iduna and D:her apples of youth from Asgard itself. @@ -17933,16 +31293,52 @@ B:TOUCH:LOSE_ALL:2d25 B:GAZE:PARALYZE:1d20 B:GAZE:TERRIFY:1d20 B:GAZE:BLIND:1d20 -F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI | -F:NO_STUN | RES_DISE | RES_NEXU | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | EVIL | SMART | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:NO_SLEEP | NO_CONF | NO_STUN | IM_POIS | IM_COLD | IM_FIRE | IM_ACID -F:ZANGBAND | HAS_LITE +F:ATTR_MULTI +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:NO_STUN +F:ONLY_ITEM +F:RES_DISE +F:RES_NEXU +F:SMART +F:UNIQUE +F:ZANGBAND S:1_IN_3 -S:BR_NEXU | BR_CHAO | HOLD | SLOW | BR_INER | BA_NUKE | -S:MIND_BLAST | BRAIN_SMASH | CONF | BLIND | TELE_TO | HEAL | -S:TELE_AWAY | TELE_LEVEL | TPORT | S_UNDEAD | S_DEMON | DRAIN_MANA +S:BA_NUKE +S:BLIND +S:BRAIN_SMASH +S:BR_CHAO +S:BR_INER +S:BR_NEXU +S:CONF +S:DRAIN_MANA +S:HEAL +S:HOLD +S:MIND_BLAST +S:SLOW +S:S_DEMON +S:S_UNDEAD +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:"Young with the youth that is outside time, and with a handsome D:bearded face, curved, smiling lips, Olympian brow; and dense locks D:waving and poppy-crowned." @@ -17956,13 +31352,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ELEC | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_ELEC +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ELEC +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ELEC +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Sparks fly from its jaws. @@ -17975,13 +31380,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_COLD | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_COLD +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_COLD +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_COLD +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its breath condenses in the air. @@ -17994,13 +31408,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_POIS | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_POIS +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. You can smell foul gases D:on its breath. @@ -18014,13 +31437,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_ACID +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ACID +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Acidic drool drips from its jaws. @@ -18033,13 +31465,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_FIRE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_FIRE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_FIRE +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Smoke comes from its mouth. @@ -18052,13 +31493,30 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | ATTR_MULTI | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ELEC | IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND -S:MULTIPLY | -S:1_IN_6 | BR_ELEC | BR_COLD | BR_FIRE | BR_ACID | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its scales shimmer different D:colours as you watch. @@ -18073,9 +31531,14 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | UNIQUE | SPECIAL_GENE | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:MORTAL +F:SPECIAL_GENE +F:UNIQUE D:It is a cross between a human and a bull. N:1030:The Sandworm Queen @@ -18088,11 +31551,33 @@ B:CLAW:ACID:5d4 B:CLAW:POISON:5d4 B:BITE:FIRE:5d4 B:BITE:ELEC:5d4 -F:FORCE_MAXHP | DROP_60 | ONLY_ITEM | DROP_GREAT | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | FEMALE | POWERFUL | SPECIAL_GENE | REFLECTING | -F:EVIL | ANIMAL | IM_ELEC | IM_FIRE | IM_ACID | IM_POIS | ESCORT | -F:MORTAL | BASEANGBAND | EMPTY_MIND | UNIQUE | NO_CONF -S:1_IN_2 | BR_POIS | S_KIN +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EMPTY_MIND +F:ESCORT +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_2 +S:BR_POIS +S:S_KIN D:Queen and mother of the sandworms, fear her and her prolific children. N:1031:Sandworm @@ -18105,10 +31590,17 @@ B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:BITE:HURT:5d5 -F:RAND_25 | -F:FORCE_MAXHP | DROP_CORPSE | POWERFUL | -F:EVIL | IM_ELEC | IM_FIRE | IM_POIS | EMPTY_MIND | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:POWERFUL +F:RAND_25 S:MULTIPLY D:Offbreed of the Sandworm Queen, they are harmless alone... @@ -18123,17 +31615,42 @@ B:GAZE:UN_BONUS:10d10 B:GAZE:TIME:10d10 B:GAZE:INSANITY:10d10 B:GAZE:INSANITY:10d5 -F:UNIQUE | SPECIAL_GENE | -F:FORCE_MAXHP | POWERFUL | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | WEIRD_MIND | -F:EVIL | UNDEAD | IM_COLD | IM_FIRE | IM_ACID | IM_ELEC | AURA_COLD | -F:IM_POIS | RES_NETH | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:S_UNDEAD | S_DEMON | S_DRAGON | -S:S_UNIQUE | S_WRAITH | S_HI_DEMON | -S:S_HI_UNDEAD | S_HI_DRAGON | S_KIN | -S:BR_DISE | BA_NETH +F:AURA_COLD +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NO_CUT +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:RES_NETH +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +F:WEIRD_MIND +S:1_IN_2 +S:BA_NETH +S:BR_DISE +S:S_DEMON +S:S_DRAGON +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_UNDEAD +S:S_UNIQUE +S:S_WRAITH D:A disembodied and barely sentient mind, Tik'srvzllat floated D:through the void for eons before being awakened by sorcery, pulled D:into the nether realm, and shaped into the being you see before you. @@ -18151,13 +31668,38 @@ B:HIT:INSANITY:5d6 B:HIT:INSANITY:6d6 B:HIT:INSANITY:7d6 B:HIT:INSANITY:6d6 -F:COLD_BLOOD | EMPTY_MIND | KILL_WALL | FORCE_MAXHP | POWERFUL | SPECIAL_GENE | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:ESCORTS | ESCORT | UNIQUE | NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN -F:CHAR_MULTI | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:SPECIAL_GENE +F:UNIQUE S:1_IN_4 -S:BR_CONF | BR_LITE | BR_DARK | BR_WALL -S:S_KIN | TELE_LEVEL | SHRIEK +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:BR_WALL +S:SHRIEK +S:S_KIN +S:TELE_LEVEL D:One of the last creations of the petty dwarves of Ludarin, its existence D:explains their destruction. A creation of finest glass, the body of this D:creature bends and amplifies light in a way that makes you unsure of its @@ -18174,14 +31716,38 @@ B:HIT:COLD:4d12 B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING | DROP_RANDART -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART | -F:EVIL | DEMON | IM_COLD | NO_CONF | KILL_WALL | BASEANGBAND | -F:HAS_LITE | SPECIAL_GENE -S:1_IN_4 | -S:BLIND | CONF | BRAIN_SMASH | -S:BR_COLD | BO_COLD | BA_NETH | S_UNDEAD | S_DEMON +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:DROP_RANDART +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_COLD +S:BRAIN_SMASH +S:BR_COLD +S:CONF +S:S_DEMON +S:S_UNDEAD D:It is a massive humanoid demon wreathed in frost, wielding a cruel looking D:pike in its hands. @@ -18194,11 +31760,32 @@ O:60:0:40:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | KILL_BODY | ESCORT | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_ELEC | IM_POIS | NONLIVING | UNIQUE -F:HURT_ROCK | NO_CONF | NO_SLEEP | NO_CUT | CHAR_MULTI | BASEANGBAND | SPECIAL_GENE -F:NO_CUT | DROP_RANDART -S:1_IN_10 | S_KIN | BO_ACID | BA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_RANDART +F:EMPTY_MIND +F:ESCORT +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_10 +S:BA_FIRE +S:BO_ACID +S:S_KIN D:Deep in the heart of the earth, even the rock itself is sentient D:and has learned to despise intruders. @@ -18212,12 +31799,30 @@ B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | KILL_BODY | KILL_WALL | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | GIANT | HURT_ROCK | BASEANGBAND | HAS_LITE | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_WALL +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE D:The strongest of all the Titans. Legend has it that he once held the sky D:on his shoulders; and the mountain range that now does so is named after him. @@ -18231,15 +31836,39 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 E:1:1:1:2:1:1 O:0:100:0:0 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | -F:ONLY_ITEM | DROP_4D2 | DROP_3D2 | DROP_GOOD | -F:SMART | TAKE_ITEM | BASH_DOOR | HAS_LITE | -F:EVIL | GIANT | ESCORT | BASEANGBAND | DROP_CORPSE | -F:IM_FIRE | IM_COLD | IM_ACID | IM_POIS | IM_ELEC -S:1_IN_3 | -S:BR_FIRE | BR_COLD | BR_SHAR | BR_SOUN | ROCKET | -S:S_MONSTERS | S_KIN | TELE_TO | HEAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_3 +S:BR_COLD +S:BR_FIRE +S:BR_SHAR +S:BR_SOUN +S:HEAL +S:ROCKET +S:S_KIN +S:S_MONSTERS +S:TELE_TO D:The lord of the Titans, he has broken loose from his confinement in D:the nether hells to seek revenge on the world. @@ -18252,9 +31881,18 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 E:0:1:0:2:1:0 O:0:0:0:0 -F:FORCE_SLEEP | BASH_DOOR | DROP_CORPSE | FRIENDS -F:ANIMAL | IM_COLD | MORTAL | BASEANGBAND | RES_WATE | NO_CUT -S:1_IN_5 | BA_WATE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:MORTAL +F:NO_CUT +F:RES_WATE +S:1_IN_5 +S:BA_WATE D:The sound of a hundred waterfalls rushes through your ears as D:a huge wave of water, vaguely hound-shaped, rushes towards you. @@ -18268,18 +31906,48 @@ B:SPORE:UN_BONUS:10d10 B:SPORE:EXP_80:10d10 B:SPORE:TIME:10d10 B:SPORE:TIME:10d10 -F:UNIQUE | NEVER_MOVE | CAN_SWIM | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | -F:REFLECTING | AURA_ELEC | ONLY_ITEM | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | FORCE_SLEEP | RES_NETH | -F:SMART | POWERFUL | RES_TELE | REGENERATE | CAN_FLY | -F:DG_CURSE | WYRM_PROTECT | EVIL | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | -F:JOKEANGBAND | HAS_LITE | RES_WATE | NO_CUT -S:1_IN_2 | -S:S_HI_DRAGON | S_KIN | BR_DISI | HEAL | TPORT | -S:TELE_LEVEL | TELE_TO +F:AURA_ELEC +F:CAN_FLY +F:CAN_SWIM +F:DG_CURSE +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_2 +S:BR_DISI +S:HEAL +S:S_HI_DRAGON +S:S_KIN +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:An assistant to DarkGod, Improv has chosen the form of a dense D:purple smog for his incarnation into Middle-earth. It travels the D:dungeons, killing software bugs and creating random artifacts for @@ -18295,15 +31963,37 @@ B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 -F:MIMIC | UNIQUE -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | FORGET | -S:BA_ACID | BA_FIRE | BA_COLD | BA_ELEC | -S:S_MONSTER | S_KIN | SHRIEK | BRAIN_SMASH | TRAPS +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MIMIC +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNIQUE +S:1_IN_1 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:SCARE +S:SHRIEK +S:S_KIN +S:S_MONSTER +S:TRAPS D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -18313,10 +32003,19 @@ I:110:1d1:40:250:3 W:1:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:FEMALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:SPECIAL_GENE +F:UNIQUE D:She seems to seek someone, you may help... N:1042:Thrain, the King Under the Mountain @@ -18325,10 +32024,19 @@ I:110:1d1:40:250:3 W:60:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:MALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:SPECIAL_GENE +F:UNIQUE D:He must have suffered horrible tortures... N:1043:Fire golem @@ -18341,11 +32049,21 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:FIRE:3d6 B:HIT:FIRE:3d6 -F:BASH_DOOR | AURA_FIRE | HAS_LITE -F:IM_FIRE | SPECIAL_GENE -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | NO_STUN -F:MORTAL | BASEANGBAND | NO_CUT | AI_PLAYER -S:1_IN_10 | +F:AI_PLAYER +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:SPECIAL_GENE +S:1_IN_10 S:BR_FIRE D:A sentient mass of pure fire. @@ -18359,20 +32077,65 @@ B:HIT:ABOMINATION:3d10 B:HIT:TIME:24d10 B:HIT:INSANITY:24d10 B:HIT:LOSE_ALL:24d10 -F:UNIQUE | CAN_SPEAK | MALE | -F:FORCE_MAXHP | SPIRIT -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH | -F:SMART | KILL_WALL | MOVE_BODY | AURA_FIRE | -F:REGENERATE | POWERFUL | SPECIAL_GENE | CAN_FLY | KILL_TREES -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND | -S:1_IN_4 | -S:BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD | S_KIN | -S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | -S:BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH | HEAL | BRAIN_SMASH | -S:DRAIN_MANA | TELE_TO | DARKNESS | SHRIEK +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_TREES +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:SPIRIT +F:UNIQUE +S:1_IN_4 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_MANA +S:BA_NETH +S:BO_MANA +S:BRAIN_SMASH +S:BRAIN_SMASH +S:BR_DISI +S:BR_NETH +S:DARKNESS +S:DRAIN_MANA +S:HAND_DOOM +S:HEAL +S:SHRIEK +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH +S:TELE_TO D:He was the most powerful of the Valar, the equal of Manwe. D:You banned him here, in the Void, and now you must destroy him D:forever. However here in the Void, his spirit gained much power @@ -18392,9 +32155,14 @@ E:0:1:1:2:0:0 O:25:0:75:0 B:TOUCH:EXP_80:10d10 B:TOUCH:EXP_80:10d10 -F:SPIRIT | BASEANGBAND | NEVER_MOVE | EMPTY_MIND | NO_CUT | -F:COLD_BLOOD | INVISIBLE -S:1_IN_1 | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:INVISIBLE +F:NEVER_MOVE +F:NO_CUT +F:SPIRIT +S:1_IN_1 S:BA_NETH D:This strange, almost intangible spirit keeps assaulting you! @@ -18409,8 +32177,12 @@ B:TOUCH:POISON:10d10 B:CRAWL:POISON:10d10 B:CRAWL:EAT_ITEM:10d9 B:BITE:UN_BONUS:9d9 -F:SPIRIT | BASEANGBAND | WEIRD_MIND | FRIENDS | -F:AI_ANNOY | PASS_WALL +F:AI_ANNOY +F:BASEANGBAND +F:FRIENDS +F:PASS_WALL +F:SPIRIT +F:WEIRD_MIND S:MULTIPLY D:These things multiply at an apparently unstoppable rate! @@ -18424,9 +32196,16 @@ O:0:0:0:0 B:TOUCH:LOSE_DEX:2d3 B:TOUCH:PARALYZE:1d12 B:TOUCH:PARALYZE:1d12 -F:SPIRIT | BASEANGBAND | NO_SLEEP | PASS_WALL | WEIRD_MIND -S:1_IN_2 | -S:SLOW | BLINK | HOLD | HASTE +F:BASEANGBAND +F:NO_SLEEP +F:PASS_WALL +F:SPIRIT +F:WEIRD_MIND +S:1_IN_2 +S:BLINK +S:HASTE +S:HOLD +S:SLOW D:Coming towards you quickly, it seems intent on moving faster than you. # Spirit of confusion @@ -18440,11 +32219,25 @@ B:ENGULF:HALLU:16d8 B:ENGULF:HALLU:16d8 B:ENGULF:CONFUSE:16d8 B:ENGULF:CONFUSE:16d8 -F:SPIRIT | BASEANGBAND | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | ATTR_MULTI | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_CUT -S:1_IN_3 | -S:BR_CHAO | BR_NEXU | BR_CONF +F:ATTR_MULTI +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:IM_ELEC +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RES_NEXU +F:SPIRIT +S:1_IN_3 +S:BR_CHAO +S:BR_CONF +S:BR_NEXU D:A swirling mass, constantly changing its appearance. # Spirit of brawn @@ -18458,10 +32251,25 @@ B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 -F:SPIRIT | BASEANGBAND | DROP_4D2 | KILL_BODY | KILL_WALL | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | KILL_TREES | -F:EVIL | GIANT | HURT_ROCK | BASEANGBAND | HAS_LITE | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_TREES +F:KILL_WALL +F:OPEN_DOOR +F:SPIRIT D:Strong and swarthy, this spirit could bend metal with his bare hands. # Spirit of Wyrms @@ -18475,19 +32283,66 @@ B:CLAW:HURT:10d15 B:CLAW:HURT:10d15 B:BITE:HURT:14d18 B:BITE:HURT:14d18 -F:SPIRIT | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | RES_NETH | RES_DISE | -F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | KILL_TREES | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_3 | -S:S_HI_DRAGON | S_DRAGON | S_KIN | -S:BR_ACID | BR_ELEC | BR_FIRE | -S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK | -S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU | -S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS | -S:BR_WALL | BR_MANA | BR_DISI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_TREES +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:SPIRIT +S:1_IN_3 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_DISI +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_MANA +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL +S:S_DRAGON +S:S_HI_DRAGON +S:S_KIN D:This spirit bears a remarkable similarity to some of the most powerful D:types of dragonkind found in Middle-earth. It appears to be even more D:fearsome though! @@ -18502,11 +32357,23 @@ O:25:20:25:20 B:BITE:POISON:15d15 B:BITE:POISON:15d15 B:BITE:LOSE_ALL:10d12 -F:SPIRIT | CAN_SWIM | IM_POIS | IM_ACID | -F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | EVIL | BASEANGBAND -S:1_IN_4 | -S:BA_POIS | S_MONSTER | SCARE | HOLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_4 +S:BA_POIS +S:HOLD +S:SCARE +S:S_MONSTER D:It slides towards you, a horrible scaly, slidy thing. # Spirit of seeing @@ -18520,11 +32387,25 @@ B:GAZE:UN_BONUS:12d12 B:GAZE:UN_POWER:12d10 B:GAZE:INSANITY:12d14 B:GAZE:LOSE_ALL:6d6 -F:SPIRIT | BASH_DOOR | EVIL | IM_POIS | -F:CAN_FLY | BASEANGBAND -S:1_IN_2 | -S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH | -S:BA_DARK | BO_MANA | BA_NETH | BA_ACID | BA_FIRE | BA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EVIL +F:IM_POIS +F:SPIRIT +S:1_IN_2 +S:BA_ACID +S:BA_COLD +S:BA_DARK +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE D:You will find it difficult to avoid being seen by this spirit! And D:once it has you in its sight, beware! @@ -18539,12 +32420,31 @@ B:TOUCH:UN_BONUS:12d12 B:TOUCH:UN_POWER:12d10 B:TOUCH:INSANITY:12d14 B:TOUCH:LOSE_ALL:6d6 -F:SPIRIT | CAN_FLY | REFLECTING | -F:SMART | BASH_DOOR | COLD_BLOOD | INVISIBLE | EMPTY_MIND | -F:EVIL | BASEANGBAND | CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR -S:1_IN_3 | -S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF | -S:HEAL | TELE_AWAY | DARKNESS | TRAPS | FORGET | SHRIEK +F:ATTR_CLEAR +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:INVISIBLE +F:REFLECTING +F:SMART +F:SPIRIT +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HEAL +S:SCARE +S:SHRIEK +S:TELE_AWAY +S:TRAPS D:Hopefully you will kill this spirit before you realise it exists. # Spirit of ickyness @@ -18558,12 +32458,24 @@ B:CRAWL:POISON:12d14 B:CRAWL:EAT_FOOD:12d14 B:TOUCH:ACID:13d15 B:HIT:HURT:13d15 -F:SPIRIT | BASEANGBAND | -F:EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | IM_POIS | -F:EMPTY_MIND -S:1_IN_4 | -S:DRAIN_MANA | BLIND | CONF | SCARE | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:EMPTY_MIND +F:EMPTY_MIND +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_4 +S:BLIND +S:CONF +S:DRAIN_MANA +S:SCARE +S:S_KIN D:A horrible slimy spirit, that seems to ooze evilness. I wouldn't get D:too close to it if I were you. @@ -18578,10 +32490,13 @@ B:BITE:HURT:12d12 B:BITE:HURT:12d12 B:BITE:HURT:12d8 B:BITE:HURT:12d8 -F:SPIRIT | BASEANGBAND | -F:ESCORT | ESCORTS | -F:OPEN_DOOR | BASH_DOOR -S:1_IN_2 | +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 S:S_KIN D:This spirit appears to have lots of friends! @@ -18596,11 +32511,22 @@ B:WAIL:TERRIFY:8d9 B:HIT:HURT:10d10 B:HIT:ABOMINATION:6d10 B:HIT:ABOMINATION:6d10 -F:SPIRIT | BASEANGBAND | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | NO_CUT -S:1_IN_3 | -S:SCARE | HOLD | DARKNESS | SCARE +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SPIRIT +F:UNDEAD +S:1_IN_3 +S:DARKNESS +S:HOLD +S:SCARE +S:SCARE D:It seems to have been woken from the dead, this spirit. It lumbers D:towards you, seeking to turn you into a form as hideous as its own! @@ -18616,9 +32542,20 @@ O:0:100:0:0 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 -F:SPIRIT | BASEANGBAND | DROP_2D2 | KILL_BODY | KILL_WALL | -F:BASH_DOOR | EVIL | GIANT | HURT_ROCK | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:GIANT +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_WALL +F:SPIRIT D:It is coming for you, this massive imposing tower of strength. D:It appears almost unstoppable! @@ -18632,12 +32569,27 @@ O:0:0:100:0 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | SMART | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:HASTE | TPORT | TELE_TO | BLIND | CONF | -S:BO_MANA | BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_2 +S:BLIND +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:BO_MANA +S:CONF +S:HASTE +S:TELE_TO +S:TPORT D:This spirit looks very clever, cunning almost. # Spirit of wisdom @@ -18650,12 +32602,24 @@ O:0:50:50:0 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:HEAL | MIND_BLAST | CAUSE_4 | SCARE | -S:DRAIN_MANA | BRAIN_SMASH | FORGET | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:FORGET +S:HEAL +S:MIND_BLAST +S:SCARE D:This spirit has something of a priestly look about it. # Spirit of dexterity @@ -18668,10 +32632,18 @@ O:0:50:25:25 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | SMART | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_1 | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_1 S:ARROW_4 D:This spirit moves almost too quickly for you to see him. @@ -18685,8 +32657,16 @@ O:0:50:0:50 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:SPIRIT D:This spirit moves slower than most, but thunders on and on D:towards you. @@ -18700,11 +32680,23 @@ O:70:10:10:10 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 -F:SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | EVIL | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:TRAPS | ARROW_3 | BLINK | TELE_TO | CONF +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +F:TAKE_ITEM +S:1_IN_2 +S:ARROW_3 +S:BLINK +S:CONF +S:TELE_TO +S:TRAPS D:There is something attractive about this spirit, and it seems D:to have a full purse. @@ -18720,9 +32712,15 @@ O:25:60:0:15 B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 -F:SPIRIT | BASEANGBAND | AI_ANNOY | IM_FIRE | AURA_FIRE | HAS_LITE -S:1_IN_2 | -S:BO_FIRE | BA_FIRE +F:AI_ANNOY +F:AURA_FIRE +F:BASEANGBAND +F:HAS_LITE +F:IM_FIRE +F:SPIRIT +S:1_IN_2 +S:BA_FIRE +S:BO_FIRE D:Flickering towards you, and then away, this spirit will burn you badly! # Spirit of icy cold @@ -18735,10 +32733,15 @@ O:25:60:0:15 B:HIT:COLD:10d8 B:HIT:COLD:10d8 B:HIT:COLD:10d8 -F:SPIRIT | BASEANGBAND | IM_COLD | AURA_COLD | -F:COLD_BLOOD | BASH_DOOR -S:1_IN_2 | -S:BO_COLD | BA_COLD +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:IM_COLD +F:SPIRIT +S:1_IN_2 +S:BA_COLD +S:BO_COLD D:The temperature around you drops as soon as you set eyes on this spirit. # Spirit of corrosion (acid) @@ -18751,9 +32754,14 @@ O:25:60:0:15 B:HIT:ACID:10d8 B:HIT:ACID:10d8 B:HIT:ACID:10d8 -F:SPIRIT | BASEANGBAND | IM_ACID | BASH_DOOR | KILL_TREES -S:1_IN_2 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:KILL_TREES +F:SPIRIT +S:1_IN_2 +S:BA_ACID +S:BO_ACID D:The very fabric of the void heals itself where this spirit walks. # Spirit of shocking (electricity) @@ -18766,9 +32774,14 @@ O:25:60:0:15 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 -F:SPIRIT | BASEANGBAND | IM_ELEC | AURA_ELEC | BASH_DOOR -S:1_IN_2 | -S:BO_ELEC | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:IM_ELEC +F:SPIRIT +S:1_IN_2 +S:BA_ELEC +S:BO_ELEC D:The air crackles as this spirit approaches, and you smell singed flesh. # Spirit of Valaraukar (Balrogs) @@ -18782,12 +32795,28 @@ B:HIT:FIRE:11d12 B:HIT:FIRE:11d12 B:CRUSH:HURT:10d12 B:TOUCH:UN_POWER -F:SPIRIT | CAN_FLY | KILL_WALL | AURA_FIRE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | EVIL | DEMON | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_FIRE | IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | BR_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:EVIL +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SPIRIT +S:1_IN_3 +S:BLIND +S:BR_FIRE +S:CONF +S:SCARE D:Carrying a whip of fire, this spirit looks not dissimilar to a certain D:Balrog. @@ -18802,11 +32831,27 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EXP_80:20d8 B:TOUCH:EXP_40:20d8 -F:SPIRIT | BASEANGBAND | REFLECTING | REGENERATE | -F:IM_ACID | IM_ELEC | IM_COLD | IM_FIRE | IM_POIS | RES_TELE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL -S:1_IN_3 | -S:BLIND | HEAL | BA_DARK | HASTE | CONF +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:SPIRIT +F:TAKE_ITEM +S:1_IN_3 +S:BA_DARK +S:BLIND +S:CONF +S:HASTE +S:HEAL D:Deriving his strength from the shadows, this spirit D:steals only for the challenge. @@ -18821,14 +32866,36 @@ B:HIT:HURT:10d9 B:HIT:HURT:9d9 B:BITE:EXP_80:9d9 B:BITE:EXP_80:9d9 -F:SPIRIT | FORCE_SLEEP | CAN_FLY | -F:DROP_60 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | SPIRIT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SPIRIT +F:SPIRIT +F:UNDEAD +S:1_IN_3 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE D:Your blood curdles and your bones chill as this spirit approaches. # Spirit of unresistability (hehehehe) @@ -18842,13 +32909,29 @@ B:HIT:SHATTER:18d10 B:HIT:SHATTER:18d10 B:HIT:LOSE_ALL:8d8 B:TOUCH:UN_POWER -F:BASEANGBAND | SPIRIT | SMART | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:RES_NEXU | RES_NETH | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD | -S:1_IN_2 | -S:BA_MANA | BR_PLAS | BR_TIME | ROCKET | HAND_DOOM | FORGET | BA_WATE +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_NEXU +F:SMART +F:SPIRIT +S:1_IN_2 +S:BA_MANA +S:BA_WATE +S:BR_PLAS +S:BR_TIME +S:FORGET +S:HAND_DOOM +S:ROCKET D:This spirit appears to be afraid of very little, and confident in its D:ability to destroy you. @@ -18863,11 +32946,20 @@ B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:SPIRIT | BASEANGBAND -S:1_IN_2 | -S:BR_TIME | SLOW | HASTE | HOLD +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 +S:BR_TIME +S:HASTE +S:HOLD +S:SLOW D:All at once you see that which is to come and that which has gone before. # Spirit of Gold @@ -18881,12 +32973,29 @@ B:TOUCH:EAT_GOLD:7d15 B:TOUCH:EAT_GOLD:7d15 B:HIT:POISON:6d12 B:HIT:POISON:6d12 -F:ONLY_GOLD | SPIRIT | BASEANGBAND | -F:DROP_4D2 | DROP_4D2 | DROP_4D2 | REFLECTING | COLD_BLOOD | REGENERATE | -F:BASH_DOOR | MOVE_BODY | IM_ELEC | IM_COLD | IM_POIS | -F:RES_TELE | NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP -S:1_IN_4 | -S:ARROW_4 | HEAL | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_4D2 +F:DROP_4D2 +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_GOLD +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SPIRIT +S:1_IN_4 +S:ARROW_4 +S:FORGET +S:HEAL D:It is the very essence of financial greed... # Spirit of doom @@ -18899,11 +33008,19 @@ O:0:10:90:0 B:HIT:HURT:14d14 B:HIT:HURT:14d14 B:HIT:HURT:14d14 -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:SPIRIT | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HAND_DOOM | CAUSE_4 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_2 +S:CAUSE_4 +S:DARKNESS +S:HAND_DOOM D:The very presence of this creature fills the air with an aura of doom. D:You feel waves of depression descending on you as it approaches. @@ -18916,12 +33033,24 @@ E:0:1:0:6:1:0 B:CLAW:HURT:14d10 B:CLAW:HURT:14d10 B:BITE:HURT:17d10 -F:INVISIBLE | CAN_FLY | SPIRIT | WEIRD_MIND | -F:PASS_WALL | POWERFUL | MOVE_BODY | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | SPIRIT -S:1_IN_2 | -S:BLIND | CONF | -S:BR_LITE | BR_DARK | BR_CONF +F:BASEANGBAND +F:CAN_FLY +F:EVIL +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:SPIRIT +F:SPIRIT +F:WEIRD_MIND +S:1_IN_2 +S:BLIND +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF D:This sprit seems to flicker in and out of this plane, and is a master D:of light and dark. @@ -18935,9 +33064,16 @@ O:10:90:0:0 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | ONLY_ITEM | -F:MORTAL | BASEANGBAND | HAS_LITE | SPIRIT +F:BASEANGBAND +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPIRIT D:Stupid but strong, this spirit has an orcish aura about him. ### Here endeth the Spirits ### @@ -18953,22 +33089,41 @@ O:0:5:90:5 # Sorceror, not warrior B:HIT:HURT:1d1 B:HIT:HURT:1d1 -F:OPEN_DOOR | SMART | MALE | DROP_SKELETON | DROP_CORPSE -F:MORTAL | HAS_LITE | JOKEANGBAND | UNIQUE +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +F:UNIQUE # Trone, of course -F:CAN_FLY | REFLECTING | IM_FIRE +F:CAN_FLY +F:IM_FIRE +F:REFLECTING # Thorin -F:IM_ACID | FORCE_MAXHP +F:FORCE_MAXHP +F:IM_ACID # No cold or random gen... waiting on elven rings only at bottom of Erebor F:SPECIAL_GENE # Dig F:KILL_WALL # Obvious resistances -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN # Well, he's been there a while -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ONLY_ITEM # Essence of speed, Manathrust, Noxious Cloud, and Fireflash -S:1_IN_1 | -S:HASTE | BO_MANA | BA_POIS | BA_FIRE +S:1_IN_1 +S:BA_FIRE +S:BA_POIS +S:BO_MANA +S:HASTE D:He looks like he is looking for something, and the flecks of dragon D:blood on his face tell you he means business! diff --git a/lib/edit/ra_info.txt b/lib/edit/ra_info.txt index 30ff3f38..4452c682 100644 --- a/lib/edit/ra_info.txt +++ b/lib/edit/ra_info.txt @@ -1529,14 +1529,16 @@ X:20:1 T:35:0:255 W:10:1:17 C:0:0:0:0 -F:SH_FIRE | RES_FIRE +F:RES_FIRE +F:SH_FIRE N:338 X:22:1 T:35:0:255 W:10:1:20 C:0:0:0:0 -F:SH_ELEC | RES_ELEC +F:RES_ELEC +F:SH_ELEC N:339 X:18:1 diff --git a/lib/edit/re_info.txt b/lib/edit/re_info.txt index c1fb01c8..2b111067 100644 --- a/lib/edit/re_info.txt +++ b/lib/edit/re_info.txt @@ -33,11 +33,35 @@ G:s:* I:%100:+1d+1:+0:+5:-5 W:+5:13:%30:%95:B F:DROP_SKELETON -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:DROP_SKELETON | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF | -M:NO_SLEEP | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL -O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART | -O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:DROP_SKELETON +M:EMPTY_MIND +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:STUPID +M:UNDEAD +O:DROP_CORPSE +O:DROP_GOOD +O:DROP_GREAT +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +O:SMART T:MF_ALL N:2:Zombie @@ -45,11 +69,36 @@ G:z:* I:%95:%110d%100:%90:+10:-5 W:+10:14:%70:%100:B F:DROP_CORPSE -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:DROP_CORPSE | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | EVIL | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL -O:GOOD | DROP_SKELETON | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART -O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:DROP_CORPSE +M:EMPTY_MIND +M:EVIL +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:STUPID +M:UNDEAD +O:DROP_GOOD +O:DROP_GREAT +O:DROP_SKELETON +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +O:SMART T:MF_ALL N:3:Lich @@ -60,15 +109,49 @@ B:TOUCH:LOSE_DEX:+0d+0 B:TOUCH:LOSE_DEX:+0d+0 B:TOUCH:UN_POWER:+0d+0 B:TOUCH:EXP_40:+0d+0 -F:DROP_SKELETON | SMART | R_CHAR_h | R_CHAR_p | R_CHAR_P | R_CHAR_O -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | SMART | EVIL | COLD_BLOOD -O:DROP_SKELETON | GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | -O:DROP_GREAT | RAND_25 | RAND_50 | MORTAL -S:1_IN_4 | -S:BLINK | TELE_TO | TELE_AWAY | BRAIN_SMASH | DRAIN_MANA | CAUSE_3 | -S:BLIND | HOLD | SLOW | SCARE +F:DROP_SKELETON +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_h +F:R_CHAR_p +F:SMART +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:SMART +M:UNDEAD +O:DROP_CORPSE +O:DROP_GREAT +O:DROP_SKELETON +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +S:1_IN_4 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:SLOW +S:TELE_AWAY +S:TELE_TO N:4:Spectral G:G:* @@ -77,12 +160,35 @@ W:+20:20:%10:%110:B B:*:EXP_20:+0d+0 B:*:EXP_20:+0d+0 F:DROP_CORPSE -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | PASS_WALL | EVIL | COLD_BLOOD -O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | -O:DROP_GREAT | EMPTY_MIND | RAND_50 | MORTAL -S:1_IN_5 | BLIND | HOLD | SCARE +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:PASS_WALL +M:UNDEAD +O:DROP_CORPSE +O:DROP_GREAT +O:EMPTY_MIND +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_50 +S:1_IN_5 +S:BLIND +S:HOLD +S:SCARE T:MF_ALL N:5:Captain @@ -93,8 +199,14 @@ B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 -F:R_CHAR_o | R_CHAR_y | R_CHAR_k | BASEANGBAND -M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART N:6:Chieftain G:*:* @@ -104,25 +216,52 @@ B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 -F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND -M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_T +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART N:7:Shaman G:*:r I:+0:%90d%100:+10:%90:+0 W:+2:1:%90:%120:A -F:R_CHAR_o | R_CHAR_k | R_CHAR_n | BASEANGBAND -M:SMART | FORCE_MAXHP | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_k +F:R_CHAR_n +F:R_CHAR_o +M:DROP_1D2 +M:FORCE_MAXHP +M:SMART O:FRIENDS -S:1_IN_6 | MISSILE | CAUSE_1 | CONF | BLINK +S:1_IN_6 +S:BLINK +S:CAUSE_1 +S:CONF +S:MISSILE N:8:Priest G:*:G I:+0:%90d%100:+10:%90:+0 W:+3:2:%90:%120:A -F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND -M:FRIENDS | SMART | FORCE_MAXHP | DROP_1D2 -S:1_IN_6 | CAUSE_2 | MISSILE | DARKNESS | CONF | SCARE | BLINK +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_T +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART +S:1_IN_6 +S:BLINK +S:CAUSE_2 +S:CONF +S:DARKNESS +S:MISSILE +S:SCARE N:9:Mage G:*:r @@ -132,24 +271,41 @@ B:*:*:+0d+0 B:*:*:+0d+0 B:HIT:HURT:=2d=8 B:HIT:HURT:=2d=8 -F:R_CHAR_O | BASEANGBAND -M:SMART | FORCE_MAXHP | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_O +M:DROP_1D2 +M:FORCE_MAXHP +M:SMART O:FRIENDS -S:1_IN_6 | BA_COLD | BO_FIRE | TRAPS | HEAL | HOLD | S_MONSTER | TPORT +S:1_IN_6 +S:BA_COLD +S:BO_FIRE +S:HEAL +S:HOLD +S:S_MONSTER +S:TPORT +S:TRAPS N:10:Archer G:*:W I:+0:+0d+0:+0:+0:+0 W:+1:1:%100:%110:A -F:R_CHAR_y | R_CHAR_k | R_CHAR_O | R_CHAR_o | BASEANGBAND -S:1_IN_4 | ARROW_2 +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y +S:1_IN_4 +S:ARROW_2 N:11:Rogue G:*:b I:+2:+0d+0:+0:+10:-30 W:+1:2:%90:%100:A B:*:EAT_GOLD:+0d+0 -F:R_CHAR_y | R_CHAR_k | R_CHAR_o +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y # For townpeople N:12:Elven diff --git a/lib/edit/s_info.txt b/lib/edit/s_info.txt index d53fb7e0..1e1d7a07 100644 --- a/lib/edit/s_info.txt +++ b/lib/edit/s_info.txt @@ -259,7 +259,8 @@ G:70 N:47:Bearform-combat D:Ability to fight in bear form I:1000 -F:HIDDEN | AUTO_HIDE +F:AUTO_HIDE +F:HIDDEN N:52:Critical-hits D:Ability to deal critical hits with swords < 5lb diff --git a/lib/edit/set_info.txt b/lib/edit/set_info.txt index f114b7ef..c803d79f 100644 --- a/lib/edit/set_info.txt +++ b/lib/edit/set_info.txt @@ -18,10 +18,13 @@ N:0:Elven Gifts D:It is from a group of Elven items once entrusted to Hobbits # Phial of Galadriel P:1:2:1 -F:WIS | CHR | RES_DARK +F:CHR +F:RES_DARK +F:WIS # Sting P:88:2:2 -F:STEALTH | REGEN +F:REGEN +F:STEALTH # The Dragon Slayer @@ -30,7 +33,9 @@ N:1:Dragon Slayer D:It is from a group of items rumoured to be the bane of dragons. # Bow of bard P:125:2:3 -F:DEX | CON | RES_FIRE +F:CON +F:DEX +F:RES_FIRE # Arrow of Bard P:63:2:5 F:SPEED @@ -44,17 +49,22 @@ D:It is one of the 3 legendary daggers. P:66:2:2 F:STR P:66:3:1 -F:KILL_DRAGON | REGEN | SH_FIRE +F:KILL_DRAGON +F:REGEN +F:SH_FIRE # Nimthanc P:67:2:2 F:CON P:67:3:1 -F:KILL_DEMON | IM_COLD +F:IM_COLD +F:KILL_DEMON # Dethanc P:68:2:2 F:DEX P:68:3:1 -F:KILL_UNDEAD | SH_ELEC | FLY +F:FLY +F:KILL_UNDEAD +F:SH_ELEC # Gothmog's Armoury -- Demonologists set @@ -64,10 +74,17 @@ D:It is from a group of items that once belonged to Gothmog, D:the High Captain of the Balrogs # The demonblade of Gothmog P:181:3:7 -F:STR | CON | SPEED | VAMPIRIC +F:CON +F:SPEED +F:STR +F:VAMPIRIC # The demonshield of Gothmog P:182:3:0 -F:IM_FIRE | IM_COLD | SH_ELEC +F:IM_COLD +F:IM_FIRE +F:SH_ELEC # The demonhorn of Gothmog P:183:3:0 -F:ESP_EVIL | ESP_GOOD | AUTO_ID +F:AUTO_ID +F:ESP_EVIL +F:ESP_GOOD diff --git a/lib/edit/st_info.txt b/lib/edit/st_info.txt index d0defd31..83b29b44 100644 --- a/lib/edit/st_info.txt +++ b/lib/edit/st_info.txt @@ -252,7 +252,8 @@ N:6:Black Market A:30:0:1:2:3:4 O:38:39:40:41 G:7:D -F:ALL_ITEM | MEDIUM_LEVEL +F:ALL_ITEM +F:MEDIUM_LEVEL W:24 N:7:Home @@ -479,7 +480,8 @@ T:100:24:256 A:0:0:1:2:3:4 O:12:13:14:15 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:39:Hafted Smith @@ -487,7 +489,8 @@ T:100:21:256 A:0:0:1:2:3:4 O:12:13:14:15 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:40:Polearm Smith @@ -495,7 +498,8 @@ T:100:22:256 A:0:0:1:2:3:4 O:12:13:14:15 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:41:Sword Smith @@ -503,7 +507,8 @@ T:100:23:256 A:0:0:1:2:3:4 O:12:13:14:15 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:42:Rare Jewelry Shop @@ -512,7 +517,10 @@ T:100:45:256 A:0:0:1:2:3:4 O:34:35:36:37 G:6:v -F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL | FORCE_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:FORCE_LEVEL +F:RANDOM F:VERY_RARE W:10 @@ -522,7 +530,10 @@ T:100:45:256 A:0:0:1:2:3:4 O:34:35:36:37 G:6:y -F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL | FORCE_LEVEL +F:DEPEND_LEVEL +F:FORCE_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:RARE W:20 @@ -531,8 +542,9 @@ T:100:30:256 A:0:0:1:2:3:4 O:8:9:10:11 G:2:r -F:RANDOM | MEDIUM_LEVEL F:COMMON +F:MEDIUM_LEVEL +F:RANDOM W:12 N:45:Rare Footwear Shop @@ -540,7 +552,9 @@ T:100:30:256 A:0:0:1:2:3:4 O:8:9:10:11 G:2:r -F:RANDOM | DEEP_LEVEL | MEDIUM_LEVEL +F:DEEP_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:VERY_RARE W:8 @@ -564,7 +578,9 @@ T:100:125:256 A:27:0:1:2:3:4 O:8:9:10:11 G:9:y -F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:24 N:47:Forbidden Library @@ -587,7 +603,9 @@ T:100:125:256 A:27:0:1:2:3:4 O:8:9:10:11 G:9:v -F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:RANDOM F:RARE W:12 @@ -595,7 +613,11 @@ N:48:Expensive Black Market A:0:0:1:2:3:4 O:38:39:40:41 G:7:v -F:RANDOM | ALL_ITEM | DEEP_LEVEL | DEPEND_LEVEL | MEDIUM_LEVEL +F:ALL_ITEM +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:49:Common Shop @@ -623,7 +645,9 @@ T:100:38:256 A:0:0:1:2:3:4 O:8:9:10:11 G:2:v -F:RANDOM | DEEP_LEVEL | DEPEND_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:RANDOM F:VERY_RARE W:12 @@ -632,7 +656,9 @@ T:100:45:31 A:0:0:1:2:3:4 O:34:35:36:37 G:6:G -F:RANDOM | SHALLOW_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:RANDOM +F:SHALLOW_LEVEL F:VERY_RARE W:6 @@ -641,7 +667,9 @@ T:100:70:256 A:0:0:1:2:3:4 O:8:9:10:11 G:5:B -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:53:Potion Store @@ -650,7 +678,9 @@ T:100:72:256 A:0:0:1:2:3:4 O:8:9:10:11 G:5:B -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:54:Recaller @@ -658,7 +688,8 @@ I:100:Word of Recall A:33:0:1:2:3:0 O:8:9:10:11 G:+:b -F:RANDOM | COMMON +F:COMMON +F:RANDOM W:2 N:55:Master Archer @@ -673,7 +704,9 @@ T:50:18:256 A:0:0:1:2:3:4 O:12:13:14:15 G:3:g -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:RARE W:24 diff --git a/lib/edit/tr_info.txt b/lib/edit/tr_info.txt index 65721013..a0c2bb6b 100644 --- a/lib/edit/tr_info.txt +++ b/lib/edit/tr_info.txt @@ -42,92 +42,128 @@ N:1:Weakness Trap I:2:100:5:5:2:0d0:b D:A poisoned needle weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:2:Weakness Trap I:5:100:5:5:20:0d0:b D:A poisoned needle seriously weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:3:Weakness Trap I:7:100:5:8:40:0d0:b D:A poisoned needle permanently weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:4:Intelligence Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:5:Intelligence Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:6:Intelligence Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:7:Wisdom Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:8:Wisdom Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:9:Wisdom Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:10:Fumbling Fingers Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:11:Fumbling Fingers Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:12:Fumbling Fingers Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:13:Wasting Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:14:Wasting Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:15:Wasting Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:16:Beauty Trap I:2:100:5:2:2:0d0:b D:A poisoned needle scars you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:17:Beauty Trap I:5:100:5:5:20:0d0:b D:A poisoned needle scars you horribly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:18:Beauty Trap I:7:100:5:8:40:0d0:b D:A poisoned needle scars you permanently! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # miscellaneous traps @@ -136,177 +172,244 @@ F:FLOOR | CHEST | DOOR N:20:Trap of Curse Weapon I:5:10:0:12:20:0d0:y D:Your weapon will never be the same... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:21:Trap of Curse Armour I:5:15:0:12:20:0d0:y D:Your armour doesn't exactly get better by setting off this trap... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:22:Earthquake Trap I:5:20:0:10:10:0d0:o D:The ceiling collapses around you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:23:Poison Needle Trap I:1:50:50:3:2:0d0:r D:A poisoned needle pricks you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:24:Summon Monster Trap I:2:50:40:4:2:0d0:v D:Monsters defend the memory of the owner... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:25:Summon Undead Trap I:4:25:40:6:10:0d0:v D:Undead rise from the grave to defend this! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:26:Summon Greater Undead Trap I:8:10:50:20:20:0d0:v D:Greater undead defend this! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:27:Teleport Trap I:3:100:50:3:2:0d0:w D:Now you know why nobody ever got close enough to disarm this trap... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:28:Paralysing Trap I:1:100:20:2:2:0d0:r D:You suddenly cannot move! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:29:Explosive Device I:3:100:80:0:3:3d8:r D:Ha! It explodes before your hands can illegally touch it! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:30:Teleport Item Trap I:3:50:50:3:5:0d0:w D:The item magically disappears from your greedy hands! -F:FLOOR | CHEST +F:CHEST +F:FLOOR N:31:Lose Memory Trap I:6:30:30:6:10:0d0:r D:You suddenly can't remember what you were doing here... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:32:Bitter Regret Trap I:9:15:20:9:20:0d0:r D:You already regret trying this... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:33:Bowel Cramps Trap I:1:90:20:1:6:0d0:r D:Your stomach twists with a sharp pang! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:34:Blindness/Confusion Trap I:4:100:50:4:6:0d0:r D:You suddenly can't see, and thinking is difficult too.... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:35:Aggravation Trap I:2:100:50:2:3:0d0:o D:Your hear a high-pitched humming noise... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:36:Multiplication Trap I:3:90:0:3:5:0d0:o D:The floor around you doesn't seem the same... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:37:Steal Item Trap I:3:100:50:3:6:0d0:y D:The chest seems to swell, while your backpack feels lighter.. -F:FLOOR | CHEST +F:CHEST +F:FLOOR N:38:Summon Fast Quylthulgs Trap I:8:50:10:10:25:0d0:v D:Parts of the owner seem to return from somewhere else, as you slow in awe. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:39:Trap of Sinking I:2:50:0:0:3:0d0:w D:A trapdoor opens up under you! -F:FLOOR | DOOR +F:DOOR +F:FLOOR N:40:Trap of Mana Drain I:4:100:50:3:4:0d0:r D:You suddenly can't think so clearly any more... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:41:Trap of Missing Money I:2:100:50:2:2:0d0:y D:Money isn't everything, they say... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:42:Trap of No Return I:5:20:10:4:8:0d0:y D:Do stay a while! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:43:Trap of Silent Switching I:4:100:50:3:6:0d0:y D:You suddenly are a different person! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:44:Trap of Walls I:6:100:50:2:10:0d0:o D:The room seems to shrink! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:45:Trap of Calling Out I:10:100:100:5:15:0d0:v D:You hear something coming closer, much closer. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:46:Trap of Sliding I:8:50:50:4:8:0d0:r D:Your feet seem to have a life of their own! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:47:Trap of Charges Drain I:6:100:70:2:3:0d0:y D:You feel as if you've just lost something... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:48:Trap of Stair Movement I:6:0:50:3:4:0d0:o D:The dungeon seems different... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:49:Trap of New Trap I:5:100:5:0:4:0d0:o D:Somehow, disarming isn't over, you feel... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:50:Trap of Scatter Items I:10:50:50:6:12:0d0:w D:You hear crashing sounds from all over the dungeon! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:51:Trap of Decay I:4:100:50:4:4:0d0:r D:Your stomach isn't empty, but suddenly you think of food. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:52:Trap of Wasting Wands I:6:100:40:4:5:0d0:y D:Your wands seem different... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:53:Trap of Filling I:10:100:0:10:25:0d0:o D:The whole room vibrates in a strange way... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:54:Trap of Drain Speed I:8:50:10:25:80:0d0:y D:You suddenly seem to have more time to self-reflect... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # bolt traps @@ -315,112 +418,178 @@ F:FLOOR | CHEST | DOOR N:60:Lightning Bolt Trap I:2:80:5:3:2:2d8:g D:You are jolted with electricity! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:61:Poison Bolt Trap I:2:80:5:3:2:2d8:g D:A blast of poison gas hits you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:62:Acid Bolt Trap I:2:80:5:3:2:2d8:g D:A jet of acid shoots out at you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:63:Cold Bolt Trap I:2:80:5:3:2:2d8:g D:You are suddenly very cold! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:64:Fire Bolt Trap I:2:80:5:3:2:2d8:g D:You are suddenly very hot! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:65:Plasma Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of plasma hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:66:Water Bolt Trap I:4:80:5:5:8:5d10:g D:A gush of water hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:67:Light Bolt Trap I:4:80:5:5:8:5d10:g D:There is a sudden flash of light around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:68:Dark Bolt Trap I:4:80:5:5:8:5d10:g D:A bolt of pure elemental darkness hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:69:Shards Bolt Trap I:6:80:5:6:15:6d10:g D:A blast of crystal shards hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:70:Sound Bolt Trap I:6:80:5:6:15:10d12:g D:A sudden roar of sound hurts your eardrums! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:71:Confusion Bolt Trap I:4:80:5:5:8:6d10:g D:A blast of confusion gas engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:72:Force Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of pure force hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:73:Inertia Bolt Trap I:6:80:5:6:15:10d12:g D:Your feet feel like lead! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:74:Mana Bolt Trap I:8:80:5:9:25:15d16:g D:A bolt of pure magic hits you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:75:Ice Bolt Trap I:4:80:5:5:8:5d10:g D:A bolt of ice hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:76:Chaos Bolt Trap I:6:80:5:6:15:10d12:g D:A blast of raw chaos hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:77:Nether Bolt Trap I:8:80:5:9:25:15d16:g D:A bolt of negative energy hits you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:78:Disenchantment Bolt Trap I:8:80:5:9:25:15d16:g D:There is a static feeling in the air... -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:79:Nexus Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of nexus hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:80:Time Bolt Trap I:8:80:5:9:25:15d16:g D:Suddenly, several months pass by in a second! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:81:Gravity Bolt Trap I:6:80:5:6:15:10d12:g D:Gravity suddenly warps around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # # ball traps @@ -429,92 +598,146 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:82:Lightning Ball Trap I:3:60:5:5:8:3d10:B D:A massive electrical charge shoots through you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:83:Poison Ball Trap I:3:60:5:5:8:3d10:B D:A large cloud of poison gas envelops you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:84:Acid Ball Trap I:3:60:5:5:8:3d10:B D:You are suddenly drenched in acid! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:85:Cold Ball Trap I:3:60:5:5:8:3d10:B D:A blast of hideously cold air envelops you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:86:Fire Ball Trap I:3:60:5:5:8:3d10:B D:You are suddenly in the centre of a raging inferno! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:87:Plasma Ball Trap I:8:60:5:8:20:12d18:B D:You are engulfed in plasma! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:88:Water Ball Trap I:5:60:5:6:15:8d12:B D:A whirlpool engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:89:Light Ball Trap I:5:60:5:6:15:8d12:B D:A massive flash of light erupts around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:90:Darkness Ball Trap I:5:60:5:6:15:8d12:B D:A large patch of darkness erupts around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:91:Shards Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of crystal shards hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:92:Sound Ball Trap I:8:60:5:8:20:12d18:B D:BOOM! Your eardrums nearly explode! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:93:Confusion Ball Trap I:5:60:5:6:15:8d12:B D:You are enveloped in a cloud of confusion gas! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:94:Force Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of pure force smashes down around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:95:Inertia Ball Trap I:8:60:5:8:20:12d18:B D:Suddenly, your entire body feels like lead! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:96:Mana Ball Trap I:10:60:5:10:30:16d20:B D:You are hit by a blast of pure magic! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:97:Ice Ball Trap I:5:60:5:6:15:8d12:B D:A massive blast of ice crystals engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:98:Chaos Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of raw chaos engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:99:Nether Ball Trap I:10:60:5:10:30:16d20:g D:A blast of energy from the netherworld engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 # N:type:name # I:diff:prob:another:pval:minlevel:color @@ -523,82 +746,118 @@ F:FLOOR | CHEST | DOOR | LEVEL4 N:100:Disenchantment Ball Trap I:10:60:5:10:30:16d20:B D:You are hit by a blast of pure anti-magic! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:101:Nexus Ball Trap I:8:60:5:8:20:12d18:B D:A ball of nexus hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:102:Time Ball Trap I:10:60:5:10:30:16d20:B D:Suddenly, several years pass by in a second! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:103:Gravity Ball Trap I:8:60:5:8:20:12d18:B D:You suddenly feel gravity warp violently around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:110:Arrow Trap I:2:100:0:5:2:0d0:R D:An arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:111:Bolt Trap I:2:100:0:5:5:0d0:R D:A bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:112:Seeker Arrow Trap I:2:100:0:6:10:0d0:R D:A seeker arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:113:Seeker Bolt Trap I:2:100:0:6:12:0d0:R D:A seeker bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:114:Poison Arrow Trap I:2:100:0:5:4:0d0:R D:A poisoned arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:115:Poison Bolt Trap I:2:100:0:6:6:0d0:R D:A poisoned bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:116:Poison Seeker Arrow Trap I:2:100:0:7:12:0d0:R D:A poisoned seeker arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:117:Poison Seeker Bolt Trap I:2:100:0:7:15:0d0:R D:A poisoned seeker bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:118:Broken Dagger Trap I:2:100:0:5:2:0d0:R D:An broken dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:119:Dagger Trap I:2:100:0:5:5:0d0:R D:A dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:120:Poison Broken Dagger Trap I:2:100:0:5:4:0d0:R D:A poisoned broken dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:121:Poison Dagger Trap I:2:100:0:6:6:0d0:R D:A poisoned dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # multiple arrows/daggers traps @@ -607,98 +866,137 @@ F:FLOOR | CHEST | DOOR N:122:Arrows Trap I:4:100:0:7:16:0d0:R D:Some arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:123:Bolts Trap I:4:100:0:7:18:0d0:R D:Some bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:124:Seeker Arrow Trap I:5:100:0:8:20:0d0:R D:Some seeker arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:125:Seeker Bolt Trap I:5:100:0:8:24:0d0:R D:Some seeker bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:126:Poison Arrows Trap I:5:100:0:8:18:0d0:R D:Some poisoned arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:127:Poison Bolt Trap I:6:100:0:8:20:0d0:R D:Some poisoned bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:128:Poison Seeker Arrows Trap I:7:100:0:9:27:0d0:R D:Some poisoned seeker arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:129:Poison Seeker Bolts Trap I:9:100:0:9:30:0d0:R D:Some poisoned seeker bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:130:Broken Daggers Trap I:4:100:0:6:12:0d0:R D:Some broken daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:131:Dagger Trap I:4:100:0:6:15:0d0:R D:Some daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:132:Poison Broken Daggers Trap I:5:100:0:7:18:0d0:R D:Some poisoned broken daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:133:Poison Daggers Trap I:6:100:0:7:23:0d0:R D:Some poisoned daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:140:Trap of Drop Item I:3:50:0:2:5:0d0:y D:A sudden sound startles you and you drop something! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:141:Trap of Drop Items I:5:50:0:5:12:0d0:y D:A sudden sound startles you and you drop several things! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:142:Trap of Drop Everything I:8:50:0:8:20:0d0:y D:A sudden sound startles you and you drop everything! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:158:Trap of Divine Anger I:6:100:5:0:15:0d0:G D:A voice booms out "Have a care, mortal!" -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:159:Trap of Divine Wrath I:9:50:5:0:30:0d0:G D:A voice booms out "Sacrilege!" -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:160:Hallucination Trap I:3:100:10:0:4:0d0:r D:Your vision is clouded by a blast of kaleidoscopic light! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # Bolt traps N:161:Greater Magic Missile Trap I:6:80:5:6:75:25d20:g D:A greater magic missile hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 #N:162:Foulness Trap #I:6:80:5:6:15:10d12:g @@ -713,22 +1011,34 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:164:Trap of Holy Fire I:6:80:5:6:15:10d12:g D:Holy fire rises around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:165:Trap of Hell Fire I:6:80:5:6:15:10d12:g D:Hellfire rises around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:166:Psi Bolt Trap I:6:80:5:6:15:10d12:g D:Your mind is suddenly blasted! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:167:Psi Drain Trap I:6:80:5:6:15:8d10:r D:You suddenly can't think clearly any more... -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # Ball Traps @@ -743,38 +1053,57 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:169:Psi Ball Trap I:8:60:5:8:20:12d18:B D:Your brain is suddenly blasted! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # Useful traps N:170:Acquirement Trap I:1:40:5:5:18:0d0:v D:Whoa! -F:FLOOR | DOOR +F:DOOR +F:FLOOR # More bolt traps N:171:Greater Lightning Bolt Trap I:3:60:5:3:6:6d6:g D:You are jolted with electricity! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:172:Greater Poison Bolt Trap I:3:60:5:3:6:6d6:g D:A blast of deadly poison gas hits you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:173:Greater Acid Bolt Trap I:3:60:5:3:6:6d6:g D:A jet of acid shoots out at you! It burns severely! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:174:Greater Cold Bolt Trap I:3:60:5:3:6:6d6:g D:You are suddenly extremely cold! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:175:Greater Fire Bolt Trap I:3:60:5:3:6:6d6:g D:You are suddenly extremely hot! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt index c9f888cc..2e5a1f43 100644 --- a/lib/mods/theme/edit/a_info.txt +++ b/lib/mods/theme/edit/a_info.txt @@ -33,8 +33,12 @@ N:1:of Galadriel I:39:100:4 W:20:10:10:10000 P:0:1d1:0:0:0 -F:ACTIVATE | SEARCH | LITE3 | LUCK -F:INSTA_ART | HIDE_TYPE +F:ACTIVATE +F:HIDE_TYPE +F:INSTA_ART +F:LITE3 +F:LUCK +F:SEARCH a:LIGHT D:A small crystal phial, with the light of Earendil's Star contained inside. D:Its light is imperishable, and near it darkness cannot endure. @@ -46,8 +50,14 @@ N:2:of Elendil I:39:101:1 W:30:25:5:32500 P:0:1d1:0:0:0 -F:ACTIVATE | SEE_INVIS | HOLD_LIFE | -F:INSTA_ART | SPEED | LITE3 | LITE1 | HIDE_TYPE +F:ACTIVATE +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:LITE1 +F:LITE3 +F:SEE_INVIS +F:SPEED a:MAP_LIGHT Z:detect curses D:The shining Star of the West, a famed heirloom of Elendil's house. @@ -61,8 +71,19 @@ N:3:of Thrain I:39:102:3 W:50:50:5:50000 P:0:1d1:0:0:0 -F:ACTIVATE | SEE_INVIS | HOLD_LIFE | RES_CHAOS | HIDE_TYPE | LUCK -F:INSTA_ART | SPEED | RES_LITE | RES_DARK | ESP_ORC | LITE3 | SPECIAL_GENE +F:ACTIVATE +F:ESP_ORC +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:LITE3 +F:LUCK +F:RES_CHAOS +F:RES_DARK +F:RES_LITE +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED a:THRAIN D:A great globe seemingly filled with moonlight, the famed Heart of the D:Mountain, which splinters the light that falls upon it into a thousand @@ -73,8 +94,13 @@ D:glowing shards. N:4:of Annatar I:40:10:10 W:70:30:3:90000 -F:HIDE_TYPE | MANA | LIFE | SPELL | DRAIN_EXP | AGGRAVATE +F:AGGRAVATE +F:DRAIN_EXP +F:HIDE_TYPE F:INSTA_ART +F:LIFE +F:MANA +F:SPELL D:This fiery golden circle once belonged to one who was known to the elves D:of Eregion as 'The Lord of Gifts'. Treacherous were his gifts, as was his D:teaching. Sauron the Sorcerer lurked behind the guise and his gifts, like @@ -85,10 +111,19 @@ D:this necklace, were not without cost. N:5:of Ingwe I:40:11:3 W:65:30:3:90000 -F:INT | WIS | CHR | SEARCH | INFRA | HIDE_TYPE | -F:SEE_INVIS | FREE_ACT | ACTIVATE | -F:RES_ACID | RES_COLD | RES_ELEC | +F:ACTIVATE +F:CHR +F:FREE_ACT +F:HIDE_TYPE +F:INFRA F:INSTA_ART +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:SEARCH +F:SEE_INVIS +F:WIS a:DISP_EVIL D:The ancient heirloom of Ingwe, high lord of the Vanyar, against whom nothing D:of evil could stand. @@ -100,9 +135,19 @@ D:of evil could stand. N:6:'Nauglamir' I:40:12:3 W:70:50:3:75000 -F:STR | CON | DEX | INFRA | HIDE_TYPE | RES_FEAR | -F:SEE_INVIS | FREE_ACT | REGEN | LITE3 | SPEED | -F:INSTA_ART | SPECIAL_GENE +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:INFRA +F:INSTA_ART +F:LITE3 +F:REGEN +F:RES_FEAR +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED +F:STR a:DIM_DOOR D:A carencet of gold, set with a multitude of shining gems of D:Valinor. Despite its size, its weight seems as that of gossamer. @@ -114,7 +159,31 @@ N:7:'Ancanaur' I:23:32:3 W:80:120:45:5000000 P:0:12d12:10:10:0 -F:CHR | CON | DEX | DRAIN_EXP | FREE_ACT | HEAVY_CURSE | HIDE_TYPE | HOLD_LIFE | IM_FIRE | INT | KILL_DEMON | LEVELS | LITE1 | REGEN | RES_DARK | RES_FEAR | RES_NETHER | RES_NEXUS | SEE_INVIS | SHOW_MODS | SLAY_EVIL | SLAY_UNDEAD | SPEED | STR | WIS +F:CHR +F:CON +F:DEX +F:DRAIN_EXP +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_FIRE +F:INT +F:KILL_DEMON +F:LEVELS +F:LITE1 +F:REGEN +F:RES_DARK +F:RES_FEAR +F:RES_NETHER +F:RES_NEXUS +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SPEED +F:STR +F:WIS Z:mind blast D:"The Jaws of Fire", this is the sword that Feanor forged in secret D:to do battle against his enemies. The sword which threatened Fingolfin, @@ -125,9 +194,20 @@ D:the sword which in the end did not prevent its owner's untimely death. N:8:of Barahir I:45:32:1 W:50:25:2:75000 -F:STR | INT | WIS | DEX | CON | CHR | STEALTH | HIDE_TYPE | -F:RES_POIS | RES_DARK | ACTIVATE | SEE_INVIS | SEARCH | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:HIDE_TYPE F:INSTA_ART +F:INT +F:RES_DARK +F:RES_POIS +F:SEARCH +F:SEE_INVIS +F:STEALTH +F:STR +F:WIS a:BARAHIR D:A ring shaped into twinned serpents with eyes of emerald meeting beneath D:a crown of flowers, an ancient treasure of Isildur's house. @@ -140,7 +220,13 @@ N:9:'Dramborleg' I:24:30:5 W:90:60:300:500000 P:0:5d7:18:25:0 -F:CRIT | HIDE_TYPE | KILL_DEMON | SHOW_MODS | VORPAL | WOUNDING | ACTIVATE +F:ACTIVATE +F:CRIT +F:HIDE_TYPE +F:KILL_DEMON +F:SHOW_MODS +F:VORPAL +F:WOUNDING a:TULKAS D:The great axe of Tuor, Thudder-Sharp is its name. The axe that smote D:both a heavy dint as of a club and cleft as a sword. When it was swung @@ -154,11 +240,28 @@ N:10:of Power 'Narya' I:45:34:1 W:70:30:2:100000 P:0:1d1:6:6:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | FREE_ACT | SEE_INVIS | -F:SUST_STR | SUST_CON | SUST_WIS | SUST_CHR | SPECIAL_GENE | -F:IM_FIRE | RES_NETHER | RES_FEAR | REGEN | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IM_FIRE F:INSTA_ART +F:INT +F:LUCK +F:REGEN +F:RES_FEAR +F:RES_NETHER +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_STR +F:SUST_WIS +F:WIS a:NARYA D:The Ring of Fire, set with a ruby that glows like flame. Narya is one D:of the three Rings of Power created by the Elves and hidden by them from @@ -171,11 +274,27 @@ N:11:of Power 'Nenya' I:45:35:2 W:80:40:2:200000 P:0:1d1:9:9:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | -F:SUST_INT | SUST_WIS | SUST_CHR | -F:IM_COLD | RES_BLIND | STEALTH | ESP_ALL | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:ESP_ALL +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_COLD F:INSTA_ART +F:INT +F:LUCK +F:RES_BLIND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:STR +F:SUST_CHR +F:SUST_INT +F:SUST_WIS +F:WIS a:NENYA D:The Ring of Adamant, with a pure white stone as centrepiece. Nenya is one D:of the three Rings of Power created by the Elves and hidden by them from @@ -188,12 +307,29 @@ N:12:of Power 'Vilya' I:45:36:3 W:90:50:2:300000 P:0:1d1:12:12:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK -F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS | -F:FEATHER | SLOW_DIGEST | REGEN | -F:SUST_STR | SUST_DEX | SUST_CON | -F:IM_ELEC | RES_POIS | RES_DISEN | +F:ACTIVATE +F:CHR +F:CON +F:DEX +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_ELEC F:INSTA_ART +F:INT +F:LUCK +F:REGEN +F:RES_DISEN +F:RES_POIS +F:SEE_INVIS +F:SLOW_DIGEST +F:SPEED +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR +F:WIS a:VILYA D:The Ring of Sapphire, with clear blue gems that shine like stars, D:glittering untouchable despite all that Sauron ever wrought. Vilya is @@ -207,15 +343,45 @@ N:13:of Power 'The One Ring' I:45:37:5 W:100:100:2:5000000 P:0:1d1:15:15:0 -F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | -F:ACTIVATE | AUTO_CURSE | HEAVY_CURSE | INVIS | SPELL | MANA | -F:SEE_INVIS | REGEN | FREE_ACT | CURSED | CURSE_NO_DROP | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | PERMA_CURSE | -F:SUST_STR | SUST_DEX | SUST_CON | -F:SUST_INT | SUST_WIS | SUST_CHR | -F:RES_BLIND | RES_POIS | RES_DISEN | RES_NETHER | ESP_ALL | -F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP | +F:ACTIVATE +F:AUTO_CURSE +F:CHR +F:CON +F:CURSED +F:CURSE_NO_DROP +F:DEX +F:DRAIN_EXP +F:DRAIN_HP +F:DRAIN_MANA +F:ESP_ALL +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE F:INSTA_ART +F:INT +F:INVIS +F:MANA +F:PERMA_CURSE +F:REGEN +F:RES_BLIND +F:RES_DISEN +F:RES_NETHER +F:RES_POIS +F:SEE_INVIS +F:SPEED +F:SPELL +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:WIS a:POWER Z:change the world D:"Ash nazg durbatuluk, ash nazg gimbatul, ash nazg thrakatuluk agh @@ -230,7 +396,8 @@ N:14:of Space-Time I:39:105:0 W:30:12:15:50000 P:0:1d1:0:0:0 -F:INSTA_ART | LITE1 +F:INSTA_ART +F:LITE1 D:A powerful stone that provides a strong light for any who D:wields it. It is rumoured that it may even protect the wearer from D:the passing of time. @@ -244,8 +411,11 @@ N:15:of Orthanc I:39:106:0 W:15:12:15:20000 P:0:1d1:0:0:0 -F:ACTIVATE | SPECIAL_GENE | EASY_USE | LITE1 | +F:ACTIVATE +F:EASY_USE F:INSTA_ART +F:LITE1 +F:SPECIAL_GENE a:STONE_LORE D:The key to the tower of Saruman, which fills your mind D:with images of knowledge and dreadful understanding. It @@ -259,10 +429,19 @@ N:16:'Lothronfaun' I:38:6:0 W:90:9:500:400000 P:30:2d4:-4:0:25 -F:FREE_ACT | IM_ELEC | SPECIAL_GENE | -F:RES_FIRE | RES_COLD | RES_POIS | RES_LITE | RES_DARK | -F:LITE1 | SEE_INVIS | AGGRAVATE | ESP_DRAGON F:ACTIVATE +F:AGGRAVATE +F:ESP_DRAGON +F:FREE_ACT +F:IM_ELEC +F:LITE1 +F:RES_COLD +F:RES_DARK +F:RES_FIRE +F:RES_LITE +F:RES_POIS +F:SEE_INVIS +F:SPECIAL_GENE a:RAZORBACK D:A massive suit of heavy dragon scales deeply saturated with many colours. D:It throbs with angry energies. May-cloud it is called, after the @@ -274,12 +453,33 @@ N:17:of the Sun I:38:30:0 W:100:16:600:500000 P:50:2d4:-8:0:35 -F:HOLD_LIFE | REGEN | ESP_DRAGON | -F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FEATHER | FLY | -F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK | ULTIMATE | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_BLIND | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SPECIAL_GENE F:ACTIVATE +F:ESP_DRAGON +F:FEATHER +F:FLY +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_BLIND +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:RES_SHARDS +F:RES_SOUND +F:SPECIAL_GENE +F:ULTIMATE a:BLADETURNER D:A suit of tilkal, set with scales of every colour, surrounded in a nimbus D:of perfectly untramelled yet inextricably intermingled and utterly mastered @@ -292,9 +492,20 @@ N:18:of Melkor I:22:2:-4 W:65:45:200:100000 P:0:4d6:12:24:0 -F:STEALTH | WIS | CURSED | HEAVY_CURSE | TY_CURSE | ESP_GOOD | -F:DRAIN_MANA | DRAIN_HP | -F:RES_DARK | RES_BLIND | RES_LITE | RES_NETHER | BRAND_POIS | RES_CONF +F:BRAND_POIS +F:CURSED +F:DRAIN_HP +F:DRAIN_MANA +F:ESP_GOOD +F:HEAVY_CURSE +F:RES_BLIND +F:RES_CONF +F:RES_DARK +F:RES_LITE +F:RES_NETHER +F:STEALTH +F:TY_CURSE +F:WIS D:The mighty spear used once by Melkor to slay the trees of Valinor. # The Galvorn Plate Mail of Eol @@ -303,10 +514,19 @@ N:19:of Eol I:37:30:2 W:75:9:420:300000 P:40:2d4:-4:0:20 -F:CON | -F:HOLD_LIFE | SUST_CON | ESP_UNDEAD | RES_CONF | RES_FEAR | -F:RES_ACID | RES_COLD | RES_DARK | RES_NETHER | RES_NEXUS | RES_CHAOS | F:ACTIVATE +F:CON +F:ESP_UNDEAD +F:HOLD_LIFE +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_FEAR +F:RES_NETHER +F:RES_NEXUS +F:SUST_CON a:CURE_1000 D:A suit of imperishable galvorn, with unconquerable strength to endure evil D:and disruptive magics. It protects the life force of its wearer like @@ -319,9 +539,14 @@ N:20:of Isildur I:37:15:1 W:30:3:300:50000 P:25:2d4:0:0:25 -F:CON | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_SOUND | RES_CONF | RES_NEXUS +F:CON +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FIRE +F:RES_NEXUS +F:RES_SOUND D:A gleaming steel suit covering the wearer from neck to foot, with runes of D:warding and stability deeply engraved into its surface. @@ -332,8 +557,17 @@ N:21:of the Rohirrim I:37:9:2 W:30:3:200:30000 P:19:1d4:0:0:15 -F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_CONF | RES_SOUND +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_SOUND +F:SPEED +F:STR D:A stiff suit of armour composed of small metal plates sewn to an D:inner layer of heavy canvas, and covered with a second layer of D:cloth. Within it is the spirit of Eorl the Young, matchless in combat. @@ -345,11 +579,19 @@ N:22:'Belegennon' I:37:20:4 W:40:10:150:135000 P:28:1d4:-1:0:20 -F:STEALTH | WIS | INT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:HOLD_LIFE | RES_DARK | RES_FEAR | -F:SEE_INVIS | F:ACTIVATE +F:HOLD_LIFE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SEE_INVIS +F:STEALTH +F:WIS a:BELEGENNON D:This wondrous suit of fine-linked chain shimmers as though of pure silver. D:It stands untouched amidst the fury of the elements, and a power of @@ -362,9 +604,17 @@ N:23:of Celeborn I:37:25:4 W:40:3:250:150000 P:35:2d4:-3:0:25 -F:STR | CHR | HIDE_TYPE | ESP_ORC -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK | -F:RES_DISEN | ACTIVATE +F:ACTIVATE +F:CHR +F:ESP_ORC +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:STR a:GENOCIDE D:A shimmering suit of true-silver, forged long ago by dwarven smiths of D:legend. It gleams with purest white as you gaze upon it, and mighty are @@ -377,8 +627,15 @@ N:24:of Arvedui I:37:4:2 W:20:3:220:32000 P:14:1d4:-2:0:15 -F:STR | CHR | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SHARDS | RES_NEXUS +F:CHR +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_NEXUS +F:RES_SHARDS +F:STR D:A hauberk, leggings, and sleeves of interlocking steel rings, well padded D:with leather. You feel strong and tall as Arvedui, last king of Arnor, D:as you put it on. @@ -390,8 +647,14 @@ N:25:of Caspanion I:37:6:3 W:25:9:270:40000 P:16:1d4:-2:0:20 -F:INT | WIS | CON | HIDE_TYPE | -F:RES_ACID | RES_POIS | RES_CONF | ACTIVATE +F:ACTIVATE +F:CON +F:HIDE_TYPE +F:INT +F:RES_ACID +F:RES_CONF +F:RES_POIS +F:WIS a:DEST_DOOR D:A hauberk, leggings, and sleeves of interlocking steel rings, strategically D:reinforced at vital locations with a second layer of chain. Magics to @@ -406,7 +669,12 @@ N:26:of Gil-galad I:32:8:10 W:50:80:50:20000 P:6:1d3:0:0:10 -F:ACTIVATE | HIDE_TYPE | INFRA | LITE2 | LITE3 | SEARCH +F:ACTIVATE +F:HIDE_TYPE +F:INFRA +F:LITE2 +F:LITE3 +F:SEARCH a:SUNLIGHT D:The shining helm that Gil-galad, legendary Elven-king, wore in battle. @@ -419,7 +687,13 @@ N:27:of Tom Bombadil I:36:12:1 W:10:10:70:30000 P:40:2d4:0:0:0 -F:CHR | CON | DEX | HIDE_TYPE | INT | STR | WIS +F:CHR +F:CON +F:DEX +F:HIDE_TYPE +F:INT +F:STR +F:WIS Z:teleport D:This garment was once the property of Tom Bombadil - D:a strange being rumoured to be older than Arda itself. It @@ -432,8 +706,12 @@ N:28:'Thalkettoth' I:36:11:3 W:20:3:60:25000 P:11:1d1:-1:0:25 -F:DEX | SPEED | HIDE_TYPE | SPECIAL_GENE | -F:RES_ACID | RES_SHARDS +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_SHARDS +F:SPECIAL_GENE +F:SPEED D:A tunic and skirt sewn with thick, overlapping scales of hardened D:leather whose wearer moves with agility and assurance. @@ -444,8 +722,19 @@ N:29:of Wormtongue I:30:2:3 W:40:20:20:50000 P:2:1d1:-10:-10:10 -F:INT | DEX | CHR | STEALTH | SEARCH | SPEED | HIDE_TYPE | -F:FREE_ACT | FEATHER | RES_DARK | RES_LITE | ESP_GOOD | ESP_UNIQUE +F:CHR +F:DEX +F:ESP_GOOD +F:ESP_UNIQUE +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:RES_DARK +F:RES_LITE +F:SEARCH +F:SPEED +F:STEALTH Z:panic hit D:The pair of boots used by Grima son of Galmod, also named the Wormtongue: D:a treacherous but persuasive counsellor, ever ready to betray, sneak, @@ -458,9 +747,14 @@ N:30:of Thorin I:34:7:4 W:30:6:65:60000 P:5:1d2:0:0:25 -F:STR | CON | HIDE_TYPE | -F:FREE_ACT | IM_ACID | RES_SOUND | -F:RES_CHAOS | ESP_ORC +F:CON +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:IM_ACID +F:RES_CHAOS +F:RES_SOUND +F:STR D:Invoking the strength and endurance of Thorin, King under the Mountain, D:this little shield forged of true-silver is proof against the Element D:of Earth. @@ -471,7 +765,12 @@ N:31:of Celegorm I:34:4:0 W:30:3:60:12000 P:4:1d2:0:0:20 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_DARK +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:RES_LITE D:This shield emblazoned with a multitude of creatures not seen for ages D:once protected Celegorm, lord of Himlad; around it lies a mystic balance D:that contains the conflicts of the elements. @@ -483,8 +782,17 @@ N:32:of Anarion I:34:5:0 W:40:9:120:160000 P:5:1d3:0:0:20 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SUST_STR | SUST_INT | -F:SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | ESP_EVIL +F:ESP_EVIL +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS D:The great metal-bound shield of Anarion, son of Elendil, who Sauron found D:himself powerless to wither or diminish. @@ -495,9 +803,19 @@ N:33:of Hurin I:22:10:3 W:20:15:180:90000 P:0:2d6:12:20:0 -F:STR | CON | HIDE_TYPE | BRAND_ACID | RES_ACID | LITE1 | DRAIN_MANA | -F:SLAY_ORC | KILL_DEMON | SLAY_TROLL | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_ACID +F:CON +F:DRAIN_MANA +F:HIDE_TYPE +F:KILL_DEMON +F:LITE1 F:MUST2H +F:RES_ACID +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STR f:MUST2H a:HURIN D:Wielded by Hurin Thalion in the Fifth Battle of Beleriand, this @@ -510,12 +828,32 @@ N:34:of Morgoth I:33:50:125 W:100:1:20:10000000 P:0:1d1:0:0:0 -F:STR | INT | WIS | DEX | CON | CHR | INFRA | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:RES_LITE | RES_DARK | RES_CONF | RES_NEXUS | RES_NETHER | -F:LITE1 | SEE_INVIS | ESP_ALL | -F:CURSED | HEAVY_CURSE | PERMA_CURSE | -F:INSTA_ART | SPECIAL_GENE +F:CHR +F:CON +F:CURSED +F:DEX +F:ESP_ALL +F:HEAVY_CURSE +F:HIDE_TYPE +F:INFRA +F:INSTA_ART +F:INT +F:LITE1 +F:PERMA_CURSE +F:RES_ACID +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:SEE_INVIS +F:SPECIAL_GENE +F:STR +F:WIS D:Two Silmarils of Feanor blaze from the thunderous crown of twisted D:iron. The corrupted metal feels at once as infernal as hellfire D:and as chilling as the Outer Darkness. One protrusion from the @@ -528,9 +866,18 @@ N:35:of Beruthiel I:33:10:-5 W:40:12:20:0 P:0:1d1:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | -F:FREE_ACT | SEE_INVIS | ESP_ANIMAL | ESP_EVIL | ESP_NONLIVING | ESP_ALL | -F:CURSED | AUTO_CURSE +F:AUTO_CURSE +F:CON +F:CURSED +F:DEX +F:ESP_ALL +F:ESP_ANIMAL +F:ESP_EVIL +F:ESP_NONLIVING +F:FREE_ACT +F:HIDE_TYPE +F:SEE_INVIS +F:STR D:The midnight-hued steel circlet of the sorceress-queen Beruthiel, which D:grants extraordinary powers of sight and awareness at a terrible physical D:cost. @@ -542,8 +889,13 @@ N:36:of Thranduil I:32:2:2 W:20:2:15:50000 P:2:0d0:0:0:10 -F:INT | WIS | HIDE_TYPE | -F:RES_BLIND | ESP_ORC | ESP_EVIL | ESP_TROLL +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:HIDE_TYPE +F:INT +F:RES_BLIND +F:WIS D:The hunting cap of King Thranduil, to whose ears come all the secrets of D:his forest domain. @@ -554,7 +906,11 @@ N:37:of Thengel I:32:3:3 W:10:2:20:22000 P:3:1d1:0:0:12 -F:WIS | CHR | RES_CONF | HIDE_TYPE | LUCK +F:CHR +F:HIDE_TYPE +F:LUCK +F:RES_CONF +F:WIS D:A ridged helmet made of steel, and embossed with scenes of valour in fine- D:engraved silver. It grants the wearer nobility, clarity of thought and D:understanding. @@ -566,9 +922,20 @@ N:38:of Hammerhand I:32:6:3 W:20:2:60:45000 P:6:1d3:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | SPECIAL_GENE | RES_FEAR | -F:SUST_STR | SUST_DEX | SUST_CON | -F:RES_ACID | RES_NEXUS | RES_COLD | RES_DARK | SLOW_DIGEST | +F:CON +F:DEX +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_FEAR +F:RES_NEXUS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR Z:berserk D:A great helm as steady as the heroes of the Westdike. Mighty were the D:blows of Helm, the Hammerhand! @@ -580,9 +947,21 @@ N:39:of Dor-Lomin I:32:7:4 W:40:12:75:300000 P:8:1d3:0:0:20 -F:STR | DEX | CON | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_BLIND | -F:LITE1 | SEE_INVIS | ESP_DRAGON | ESP_THUNDERLORD | ACTIVATE +F:ACTIVATE +F:CON +F:DEX +F:ESP_DRAGON +F:ESP_THUNDERLORD +F:HIDE_TYPE +F:LITE1 +F:RES_ACID +F:RES_BLIND +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:SEE_INVIS +F:STR a:GORLIM D:The legendary dragon helm of Turin Turambar, an object of dread to the D:servants of Morgoth. @@ -593,8 +972,13 @@ N:40:'Holhenneth' I:32:5:2 W:20:5:75:100000 P:5:1d3:0:0:10 -F:INT | WIS | SEARCH | HIDE_TYPE | -F:RES_BLIND | SEE_INVIS | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:INT +F:RES_BLIND +F:SEARCH +F:SEE_INVIS +F:WIS a:DETECT_ALL D:A famous helm of forged iron granting extraordinary powers of mind and D:awareness. @@ -606,11 +990,26 @@ N:41:of Gorlim I:32:5:-5 W:20:5:75:0 P:5:1d3:25:25:10 -F:INT | WIS | SEARCH | HIDE_TYPE | SHOW_MODS | -F:SEE_INVIS | NO_MAGIC | HEAVY_CURSE | TY_CURSE -F:RES_DISEN | RES_FEAR | FREE_ACT | RES_ACID | RES_FIRE | RES_POIS | -F:IM_COLD | ACTIVATE | DRAIN_HP | -F:TELEPORT | CURSED +F:ACTIVATE +F:CURSED +F:DRAIN_HP +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_COLD +F:INT +F:NO_MAGIC +F:RES_ACID +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:TELEPORT +F:TY_CURSE +F:WIS a:GORLIM D:A headpiece, gaudy and barbaric, that betrayed a warrior when he most D:needed succor. @@ -622,9 +1021,23 @@ N:42:of Gondor I:33:11:3 W:40:40:30:125000 P:0:1d1:0:0:15 -F:STR | WIS | CON | HIDE_TYPE | SPEED | RES_CONF | RES_SOUND | -F:RES_COLD | RES_FIRE | RES_LITE | RES_BLIND | RES_ELEC | RES_CHAOS | -F:LITE1 | SEE_INVIS | REGEN | ACTIVATE +F:ACTIVATE +F:CON +F:HIDE_TYPE +F:LITE1 +F:REGEN +F:RES_BLIND +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STR +F:WIS a:CURE_700 D:The shining winged circlet brought by Elendil from dying Numenor, emblem of D:Gondor through an age of the world. @@ -637,10 +1050,23 @@ N:43:of Numenor I:33:12:3 W:60:30:40:50000 P:0:1d1:0:0:18 -F:INT | DEX | CHR | SEARCH | SPEED | HIDE_TYPE | -F:SEE_INVIS | FREE_ACT | RES_DARK | RES_BLIND | -F:RES_SHARDS | RES_SOUND | RES_LITE | RES_COLD | -F:LITE1 | ACTIVATE | DRAIN_MANA +F:ACTIVATE +F:CHR +F:DEX +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:LITE1 +F:RES_BLIND +F:RES_COLD +F:RES_DARK +F:RES_LITE +F:RES_SHARDS +F:RES_SOUND +F:SEARCH +F:SEE_INVIS +F:SPEED a:NUMENOR D:A crown of massive gold, set with wondrous jewels of thought and warding, D:worn by the kings of ancient Numenor. Its wearer may go into battle @@ -655,7 +1081,12 @@ N:44:of Valinor I:35:1:0 W:60:90:10:40000 P:1:0d0:0:0:20 -F:ACTIVATE | IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | RES_POIS +F:ACTIVATE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:RES_POIS a:COLLUIN D:A cape worn by a hero from Valinor, a land utterly beyond the strife D:of the elements. @@ -666,8 +1097,13 @@ N:45:'Holcolleth' I:35:1:2 W:5:25:10:13000 P:1:0d0:0:0:4 -F:INT | WIS | SPEED | STEALTH | HIDE_TYPE | -F:RES_ACID | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:INT +F:RES_ACID +F:SPEED +F:STEALTH +F:WIS a:SLEEP D:This elven-grey mantle possesses great powers of tranquility and of D:concealment, and grants the wearer the knowledge and understanding of @@ -680,8 +1116,14 @@ N:46:of Thingol I:35:1:3 W:10:50:10:35000 P:1:0d0:0:0:18 -F:DEX | CHR | HIDE_TYPE | -F:FREE_ACT | RES_ACID | RES_FIRE | RES_COLD | ACTIVATE +F:ACTIVATE +F:CHR +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_FIRE a:RECHARGE D:A sable-hued cloak, with glowing elven-runes to restore magic showing calm D:and clear as moonlight on still water. @@ -693,7 +1135,10 @@ N:47:of Thorongil I:35:1:0 W:5:10:10:8000 P:1:0d0:0:0:10 -F:FREE_ACT | RES_ACID | SEE_INVIS | RES_FEAR +F:FREE_ACT +F:RES_ACID +F:RES_FEAR +F:SEE_INVIS D:A cloak of shimmering green and brown that grants sight beyond sight and D:shakes off holding magics, worn by Aragorn son of Arathorn in his youth D:as he adventured under the name of Thorongil. @@ -705,8 +1150,11 @@ N:48:'Colannon' I:35:1:3 W:5:20:10:11000 P:1:0d0:0:0:15 -F:STEALTH | SPEED | RES_NEXUS | -F:RES_ACID | ACTIVATE +F:ACTIVATE +F:RES_ACID +F:RES_NEXUS +F:SPEED +F:STEALTH a:TELEPORT D:A crystal-blue cape of fine silk worn by a silent messenger of D:the forces of Law. Somehow, its wearer is always able to escape @@ -719,8 +1167,21 @@ N:49:of Luthien I:35:6:2 W:40:40:5:55000 P:6:0d0:0:0:20 -F:INT | WIS | CHR | HIDE_TYPE | SPEED | STEALTH | INVIS | LUCK -F:RES_ACID | RES_FIRE | RES_COLD | SPECIAL_GENE | ACTIVATE | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:INT +F:INVIS +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_FIRE +F:SPECIAL_GENE +F:SPEED +F:SPELL_CONTAIN +F:STEALTH +F:WIELD_CAST +F:WIS a:REST_LIFE D:The opaque midnight folds, inset with a multitude of tiny diamonds, of D:this cloak swirl around you and you feel a hint, a fragment of the @@ -734,8 +1195,15 @@ N:50:of Tuor I:35:6:4 W:40:40:5:35000 P:6:0d0:0:0:12 -F:STEALTH | DEX | HIDE_TYPE | INVIS | WATER_BREATH -F:FREE_ACT | IM_ACID | SEE_INVIS | CLIMB +F:CLIMB +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IM_ACID +F:INVIS +F:SEE_INVIS +F:STEALTH +F:WATER_BREATH D:From the ruin of Gondolin did Tuor escape, through secret ways and travail, D:shielded by his cloak from a multitude of hostile eyes. @@ -745,7 +1213,10 @@ N:51:of Azaghal I:23:5:0 W:15:30:30:40000 P:0:2d5:12:14:0 -F:KILL_DRAGON | IM_FIRE | ESP_DRAGON | RES_FEAR +F:ESP_DRAGON +F:IM_FIRE +F:KILL_DRAGON +F:RES_FEAR D:The weapon of Azaghal when he wounded Glaurung. It is deadly D:when fighting dragons and is said to make the breaths of fire D:completely harmless. @@ -757,8 +1228,11 @@ N:52:'Cambeleg' I:31:1:2 W:10:6:5:36000 P:1:0d0:8:8:15 -F:STR | CON | HIDE_TYPE | -F:FREE_ACT | SHOW_MODS +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:SHOW_MODS +F:STR D:A hero's handgear that lends great prowess in battle. @@ -768,8 +1242,12 @@ N:53:'Cammithrim' I:31:1:0 W:10:3:5:30000 P:1:0d0:0:0:10 -F:FREE_ACT | RES_LITE | SUST_CON | LITE1 | ACTIVATE +F:ACTIVATE +F:FREE_ACT +F:LITE1 +F:RES_LITE F:SPECIAL_GENE +F:SUST_CON a:BO_MISS_1 D:These gloves glow so brightly as to light the way for their owner and cast D:magical bolts with great frequency. @@ -780,8 +1258,13 @@ N:54:of Eregion I:31:2:4 W:10:5:25:33000 P:2:1d1:0:0:15 -F:RES_FIRE | ACTIVATE | -F:SUST_STR | STR | REGEN | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:REGEN +F:RES_FIRE +F:SPELL_CONTAIN +F:STR +F:SUST_STR +F:WIELD_CAST a:BO_FIRE_1 D:A fiery set of gauntlets that can even shoot fire from the user's D:hands. Wrought by Curufin's people, they guard the wearer's @@ -793,8 +1276,13 @@ N:55:of Nargothrond I:31:2:4 W:10:5:25:33000 P:2:1d1:0:0:15 -F:RES_COLD | ACTIVATE | -F:SUST_CON | CON | REGEN | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CON +F:REGEN +F:RES_COLD +F:SPELL_CONTAIN +F:SUST_CON +F:WIELD_CAST a:BO_COLD_1 D:A set of handgear so icy as to be able to fire frost bolts. Wrought by D:Finrod Felagund himself, it is inscribed with runes that guard and @@ -806,8 +1294,13 @@ N:56:of Lorien I:31:2:4 W:10:5:25:33000 P:2:1d1:0:0:15 -F:RES_ELEC | ACTIVATE | FREE_ACT | -F:SUST_DEX | DEX | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:DEX +F:FREE_ACT +F:RES_ELEC +F:SPELL_CONTAIN +F:SUST_DEX +F:WIELD_CAST a:BO_ELEC_1 D:A set of handgear wrought by the Galadhrim. Sparks surround it, enabling D:the wearer to fire bolts of electricity. Ever has lightning improved and @@ -819,8 +1312,12 @@ N:57:of Ossiriand I:31:2:4 W:10:5:25:33000 P:2:1d1:0:0:15 -F:RES_ACID | ACTIVATE | -F:SUST_CHR | CHR | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:CHR +F:RES_ACID +F:SPELL_CONTAIN +F:SUST_CHR +F:WIELD_CAST a:BO_ACID_1 D:Mighty was the woodcraft of the Laiquendi, for they learned to control the D:element of acid to a level theretofore unknown. This set of handgear is so @@ -832,9 +1329,22 @@ N:58:'Camlost' I:31:2:-3 W:10:20:25:0 P:2:1d1:-11:-12:0 -F:STR | DEX | HIDE_TYPE | DRAIN_MANA | -F:RES_POIS | IM_FIRE | IM_COLD | RES_DISEN | RES_NETHER | FREE_ACT | -F:AGGRAVATE | SHOW_MODS | HEAVY_CURSE | TY_CURSE | TELEPORT | CURSED +F:AGGRAVATE +F:CURSED +F:DEX +F:DRAIN_MANA +F:FREE_ACT +F:HEAVY_CURSE +F:HIDE_TYPE +F:IM_COLD +F:IM_FIRE +F:RES_DISEN +F:RES_NETHER +F:RES_POIS +F:SHOW_MODS +F:STR +F:TELEPORT +F:TY_CURSE D:A pair of gauntlets that sap combat ability, named after the empty hand D:of Beren that once clasped a Silmaril. @@ -845,8 +1355,13 @@ N:59:of Fingolfin I:31:5:4 W:40:15:40:110000 P:5:1d1:10:10:20 -F:DEX | HIDE_TYPE | LUCK -F:FREE_ACT | RES_ACID | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:RES_ACID +F:SHOW_MODS a:BO_MISS_2 Z:magic missile D:The hand-sheathing of Fingolfin, warrior-king of Elves and Men, who gave @@ -859,8 +1374,10 @@ N:60:of Feanor I:30:3:15 W:40:120:40:300000 P:3:1d1:0:0:20 -F:SPEED | HIDE_TYPE | -F:RES_NEXUS | ACTIVATE +F:ACTIVATE +F:HIDE_TYPE +F:RES_NEXUS +F:SPEED a:SPEED D:This wondrous pair of leather boots once sped Feanor, creator of the D:Silmarils and the mightiest of the Eldar, along the Grinding Ice and to @@ -873,9 +1390,16 @@ N:61:'Dal-i-thalion' I:30:2:5 W:10:25:20:40000 P:2:1d1:0:0:15 -F:DEX | HIDE_TYPE | CHR | SUST_CHR | -F:ACTIVATE | FREE_ACT | -F:RES_NETHER | RES_CHAOS | RES_CONF | SUST_CON +F:ACTIVATE +F:CHR +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_CHAOS +F:RES_CONF +F:RES_NETHER +F:SUST_CHR +F:SUST_CON a:CURE_POISON D:A pair of high-laced shoes, strong against the powers of corruption and D:withering, that grant the wearer extraordinary agility. @@ -887,7 +1411,12 @@ N:62:of Thror I:30:6:3 W:30:25:80:15000 P:6:1d1:0:0:20 -F:STR | CON | HIDE_TYPE | SPEED | RES_FEAR | CLIMB +F:CLIMB +F:CON +F:HIDE_TYPE +F:RES_FEAR +F:SPEED +F:STR D:Sturdy footwear of leather and steel as enduring as the long-suffering D:Dwarven King-in-exile who wore them. Of dwarven make, these boots will D:make their wearer completely at home in the mountains. @@ -905,9 +1434,20 @@ N:63:of Bard I:17:2:0 W:55:30:2:50000 P:0:8d4:20:15:0 -F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | KILL_DRAGON | -F:BRAND_ACID | BRAND_ELEC | BRAND_FIRE | BRAND_COLD | BRAND_POIS +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:KILL_DRAGON +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD D:Deadliest of arrows, imbued with elemental strength, this shaft is D:feared especially by the wyrmkin. @@ -918,8 +1458,16 @@ N:64:of Maedhros I:23:5:3 W:15:30:30:22500 P:0:2d5:12:15:0 -F:INT | DEX | HIDE_TYPE | SPEED | SPECIAL_GENE -F:SLAY_TROLL | SLAY_GIANT | FREE_ACT | SEE_INVIS | SHOW_MODS +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_TROLL +F:SPECIAL_GENE +F:SPEED D:A short thrusting blade with a large guard worn by Maedhros the Tall, D:eldest son of Feanor, and wielded with his left hand after the loss of D:his right hand in the pits of Thangorodrim. @@ -930,7 +1478,21 @@ N:65:'Angrist' I:23:1:4 W:25:80:12:150000 P:0:2d4:10:15:5 -F:BRAND_ACID | BRAND_POIS | DEX | FREE_ACT | HIDE_TYPE | LUCK | RES_DARK | SEARCH | SEE_INVIS | SHOW_MODS | SLAY_EVIL | SLAY_ORC | SLAY_TROLL | STEALTH | SUST_DEX +F:BRAND_ACID +F:BRAND_POIS +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:RES_DARK +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH +F:SUST_DEX D:The knife Beren Barahir`s son took from Curufin and with which he cut D:out a Silmaril from the crown of Morgoth, The blade snapped and broke D:when he tried to gain one more and the splint hit Morgoth at his chin. @@ -943,7 +1505,12 @@ N:66:of Samwise I:23:4:0 W:4:100:12:12000 P:0:1d4:4:6:0 -F:ACTIVATE | BRAND_FIRE | LEVELS | LITE1 | RES_FIRE | SHOW_MODS +F:ACTIVATE +F:BRAND_FIRE +F:LEVELS +F:LITE1 +F:RES_FIRE +F:SHOW_MODS a:BO_FIRE_1 D:The blade of Samwise Gamgee, chosen by him from the hoard of the D:Barrow-wights. A fiery dagger finely balanced for deadly throws. @@ -954,7 +1521,11 @@ N:67:of Peregrin I:23:4:0 W:3:100:12:11000 P:0:1d4:4:6:0 -F:ACTIVATE | BRAND_COLD | LEVELS | RES_COLD | SHOW_MODS +F:ACTIVATE +F:BRAND_COLD +F:LEVELS +F:RES_COLD +F:SHOW_MODS a:BO_COLD_1 D:The blade of Peregrin Took, chosen by him from the hoard of the D:Barrow-wights. A frosty dagger finely balanced for deadly throws. @@ -965,7 +1536,11 @@ N:68:of Meriadoc I:23:4:0 W:5:100:12:13000 P:0:1d4:4:6:0 -F:BRAND_ELEC | RES_ELEC | ACTIVATE | SHOW_MODS | LEVELS +F:ACTIVATE +F:BRAND_ELEC +F:LEVELS +F:RES_ELEC +F:SHOW_MODS a:BO_ELEC_1 D:The blade of Meriadoc Brandybuck, chosen by him from the hoard of D:the Barrow-wights. A dagger covered in sparks and finely balanced @@ -977,7 +1552,12 @@ N:69:of Rilia I:23:4:0 W:5:40:12:35000 P:0:2d4:4:3:0 -F:SLAY_ORC | RES_POIS | RES_DISEN | ACTIVATE | SHOW_MODS | BRAND_POIS +F:ACTIVATE +F:BRAND_POIS +F:RES_DISEN +F:RES_POIS +F:SHOW_MODS +F:SLAY_ORC a:BA_POIS_1 D:A large stiletto dagger that glistens with odourless poison, to which the D:wearer seems oddly immune. @@ -989,10 +1569,18 @@ N:70:'Belangil' I:23:4:2 W:10:40:12:50000 P:0:2d4:6:9:0 -F:DEX | HIDE_TYPE | SPEED | BLOWS | -F:BRAND_COLD | RES_COLD | -F:SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS | BRAND_POIS +F:ACTIVATE +F:BLOWS +F:BRAND_COLD +F:BRAND_POIS +F:DEX +F:HIDE_TYPE +F:REGEN +F:RES_COLD +F:SEE_INVIS +F:SHOW_MODS +F:SLOW_DIGEST +F:SPEED a:BELANGIL D:A frosty dagger surrounded in a nimbus of ice with a hilt of elk horn and D:an edge to wound the wind. @@ -1004,11 +1592,22 @@ N:71:'Calris' I:23:21:5 W:30:15:140:100000 P:0:5d4:-20:20:0 -F:CON | HIDE_TYPE | DRAIN_HP | -F:KILL_DRAGON | SLAY_EVIL | SLAY_DEMON | SLAY_TROLL | RES_DISEN | -F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | ESP_DRAGON | ESP_DEMON | -F:AUTO_CURSE | +F:AGGRAVATE +F:AUTO_CURSE +F:CON F:COULD2H +F:CURSED +F:DRAIN_HP +F:ESP_DEMON +F:ESP_DRAGON +F:HEAVY_CURSE +F:HIDE_TYPE +F:KILL_DRAGON +F:RES_DISEN +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL f:COULD2H D:This sword has runes of power incised on its ornate hilt and a single D:blood channel that gleams coldly blue as you grasp this mighty weapon of @@ -1021,13 +1620,28 @@ N:72:'Aranruth' I:23:16:4 W:20:45:150:125000 P:0:3d5:20:12:0 -F:STR | DEX | CON | SUST_CON | SUST_STR -F:REGEN | FREE_ACT | SEE_INVIS | -F:RES_CHAOS | RES_NETHER | HOLD_LIFE | RES_FEAR | -F:RES_COLD | -F:SLAY_DEMON | SLAY_EVIL | SLAY_DRAGON | SLAY_UNDEAD | -F:BRAND_COLD | -F:SLOW_DIGEST | SHOW_MODS | HIDE_TYPE | BLESSED +F:BLESSED +F:BRAND_COLD +F:CON +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:REGEN +F:RES_CHAOS +F:RES_COLD +F:RES_FEAR +F:RES_NETHER +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:STR +F:SUST_CON +F:SUST_STR D:The beautiful sword of Thingol with a hilt of gold and silver inlay, D:glistening icily enough to freeze the hearts of demons. You feel supple D:and lightfooted as you hold it. @@ -1039,9 +1653,20 @@ N:73:'Glamdring' I:23:16:1 W:20:20:150:40000 P:0:2d5:10:15:0 -F:SEARCH | HIDE_TYPE | BLESSED | SLAY_DEMON | -F:SLAY_EVIL | BRAND_FIRE | SLAY_ORC | RES_FIRE | RES_LITE | LITE1 | -F:SLOW_DIGEST | SHOW_MODS | ESP_ORC | SPECIAL_GENE +F:BLESSED +F:BRAND_FIRE +F:ESP_ORC +F:HIDE_TYPE +F:LITE1 +F:RES_FIRE +F:RES_LITE +F:SEARCH +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_ORC +F:SLOW_DIGEST +F:SPECIAL_GENE D:This fiery, shining blade earned its sobriquet "Foe-Hammer" from dying orcs D:who dared to come near hidden Gondolin. Inscribed upon the guard in Cirth D:is the following -- @@ -1054,7 +1679,13 @@ N:74:of Thranduil I:21:3:0 W:20:18:150:50000 P:0:1d9:10:20:0 -F:BRAND_POIS | COULD2H | RES_POIS | SLAY_ANIMAL | HIDE_TYPE | SHOW_MODS | ESP_ANIMAL +F:BRAND_POIS +F:COULD2H +F:ESP_ANIMAL +F:HIDE_TYPE +F:RES_POIS +F:SHOW_MODS +F:SLAY_ANIMAL f:COULD2H D:The carven oak staff of the King of the Woodland Realm, D:this weapon is a fighter's best friend in a forest. @@ -1065,9 +1696,20 @@ N:75:'Orcrist' I:23:16:3 W:20:20:150:40000 P:0:2d5:10:15:0 -F:SEARCH | ESP_ORC | SLAY_DRAGON | ESP_DRAGON | RES_COLD | HIDE_TYPE | -F:SLAY_EVIL | BRAND_COLD | SLAY_ORC | RES_COLD | LITE1 | RES_DARK | -F:SLOW_DIGEST | SHOW_MODS +F:BRAND_COLD +F:ESP_DRAGON +F:ESP_ORC +F:HIDE_TYPE +F:LITE1 +F:RES_COLD +F:RES_COLD +F:RES_DARK +F:SEARCH +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_ORC +F:SLOW_DIGEST D:This coldly gleaming blade is called simply "Biter", by orcs who came to D:know its power all too well. @@ -1077,10 +1719,22 @@ N:76:'Anglachel' I:23:25:2 W:30:30:200:100000 P:0:3d6:13:17:0 -F:STR | HIDE_TYPE | VORPAL | ESP_DRAGON | DRAIN_HP | -F:RES_FIRE | RES_POIS | BRAND_FIRE | BRAND_POIS | -F:KILL_DRAGON | SLAY_TROLL | FREE_ACT | SLOW_DIGEST | REGEN | SHOW_MODS | +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_HP +F:ESP_DRAGON +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DRAGON F:MUST2H +F:REGEN +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS +F:SLAY_TROLL +F:SLOW_DIGEST +F:STR +F:VORPAL f:MUST2H D:A giant sword once wielded by mighty Turin, and a great dragonbane which D:bathed in Glaurung's blood. Its blade once shone brightly, it can cleave @@ -1094,11 +1748,28 @@ N:77:'Zarcuthra' I:23:25:4 W:30:180:250:205000 P:0:4d6:19:21:0 -F:STR | CHR | INFRA | HIDE_TYPE | VORPAL | DRAIN_MANA | -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_FIRE | -F:SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | -F:RES_FIRE | RES_CHAOS | FREE_ACT | SEE_INVIS | AGGRAVATE | SHOW_MODS | +F:AGGRAVATE +F:BRAND_FIRE +F:CHR +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:INFRA +F:KILL_DRAGON F:MUST2H +F:RES_CHAOS +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD +F:STR +F:VORPAL f:MUST2H D:Dark and deadly runes stand stark against the naked steel of this awesome D:weapon, and you feel a stunning power of slaying and rending as you @@ -1111,10 +1782,25 @@ N:78:'Mormegil' I:23:33:2 W:30:15:250:0 P:0:6d7:0:0:-20 -F:SPEED | IM_FIRE | RES_FIRE | BRAND_FIRE | RES_DISEN | RES_FEAR | -F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | LEVELS | TY_CURSE | -F:BLOWS | SLAY_DRAGON | RES_CHAOS | ANTIMAGIC_50 | -F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP +F:AGGRAVATE +F:ANTIMAGIC_50 +F:BLOWS +F:BRAND_FIRE +F:CURSED +F:DRAIN_EXP +F:DRAIN_HP +F:DRAIN_MANA +F:HEAVY_CURSE +F:IM_FIRE +F:LEVELS +F:RES_CHAOS +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:SHOW_MODS +F:SLAY_DRAGON +F:SPEED +F:TY_CURSE D:A foul, twisted sword with blackened spines and knobs, whose very name is a D:curse upon the lips of Elves and Men. @@ -1125,9 +1811,17 @@ N:79:'Gondricam' I:23:12:3 W:20:8:110:28000 P:0:1d7:10:11:0 -F:DEX | STEALTH | HIDE_TYPE | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | FEATHER | -F:SEE_INVIS | REGEN | SHOW_MODS +F:DEX +F:FEATHER +F:HIDE_TYPE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:STEALTH D:Famed sea-defender of Lebennin. A short, slightly curved chopping blade D:with a perfect edge shining cleanly in the sun, an object of hate to the D:men of Umbar who met it in combat. @@ -1139,9 +1833,18 @@ N:80:'Crisdurian' I:23:28:0 W:40:15:260:111000 P:0:4d5:18:19:0 -F:SLAY_DRAGON | SLAY_EVIL | SLAY_UNDEAD | SLAY_TROLL | SLAY_GIANT | -F:SLAY_ORC | SEE_INVIS | SHOW_MODS | VORPAL | BRAND_POIS | WOUNDING | +F:BRAND_POIS F:MUST2H +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLAY_UNDEAD +F:VORPAL +F:WOUNDING f:MUST2H D:A giant's weapon, with a long blade tall and straight thrusting out from a D:massive double-pronged hilt. On its blade are written doomspells against @@ -1154,7 +1857,15 @@ N:81:'Herugrim' I:23:17:2 W:60:40:130:300000 P:0:3d5:8:9:0 -F:ACTIVATE | ESP_EVIL | FREE_ACT | HIDE_TYPE | INT | RES_CONF | RES_DARK | SHOW_MODS | VORPAL +F:ACTIVATE +F:ESP_EVIL +F:FREE_ACT +F:HIDE_TYPE +F:INT +F:RES_CONF +F:RES_DARK +F:SHOW_MODS +F:VORPAL a:CURE_INSANITY D:The ancient blade of Theoden, King of the Mark. It was taken from D:the king by Grima the Wormtongue, and hidden from him in a dusty @@ -1167,10 +1878,24 @@ N:82:'Ringil' I:23:17:10 W:20:120:130:300000 P:0:4d5:22:25:0 -F:SPEED | HIDE_TYPE | RES_FEAR | BLESSED | -F:SLAY_EVIL | BRAND_COLD | SLAY_UNDEAD | KILL_DEMON | SLAY_TROLL | -F:FREE_ACT | RES_COLD | RES_LITE | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DEMON +F:LITE1 +F:REGEN +F:RES_COLD +F:RES_FEAR +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPEED a:BA_COLD_2 D:The weapon of Fingolfin, High King of the Noldor; it shines like a column D:of ice lit by light unquenchable. Morgoth came but unwillingly to meet it @@ -1183,10 +1908,26 @@ N:83:'Anduril' I:23:17:4 W:20:40:130:100000 P:0:3d5:10:15:5 -F:STR | DEX | HIDE_TYPE | RES_FEAR | FREE_ACT | BLESSED | LUCK -F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_FIRE | SUST_DEX | SEE_INVIS | ACTIVATE | SHOW_MODS | LITE1 | -F:RES_DISEN | SPECIAL_GENE +F:ACTIVATE +F:BLESSED +F:BRAND_FIRE +F:DEX +F:FREE_ACT +F:FREE_ACT +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE +F:STR +F:SUST_DEX a:BA_FIRE_1 D:The famed "Flame of the West", the sword that was broken and is forged D:again. It glows with the essence of fire, its wearer is mighty in combat, @@ -1202,10 +1943,23 @@ N:84:'Anguirel' I:23:17:2 W:20:30:130:40000 P:0:2d5:8:12:0 -F:STR | CON | SPEED | HIDE_TYPE | -F:SLAY_EVIL | BRAND_ELEC | SLAY_DEMON | FREE_ACT | RES_ELEC | -F:RES_LITE | RES_DARK | SEE_INVIS | SHOW_MODS | VORPAL | WOUNDING | -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:BRAND_ELEC +F:CON +F:CURSED +F:FREE_ACT +F:HIDE_TYPE +F:RES_DARK +F:RES_ELEC +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SPEED +F:STR +F:VORPAL +F:WOUNDING D:Forged of black galvorn by the Dark-Elven smith Eol, this blade has the D:living lightning trapped inside. @@ -1216,8 +1970,17 @@ N:85:'Elvagil' I:23:17:2 W:20:8:130:20000 P:0:2d5:5:7:0 -F:DEX | CHR | STEALTH | HIDE_TYPE | ESP_ORC | ESP_TROLL -F:SLAY_TROLL | SLAY_ORC | FEATHER | SEE_INVIS | SHOW_MODS +F:CHR +F:DEX +F:ESP_ORC +F:ESP_TROLL +F:FEATHER +F:HIDE_TYPE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH D:The "Singing Blade", whose wearer can slay Orcs and Trolls in the hidden D:and secret places of the earth. @@ -1228,7 +1991,11 @@ N:86:'Forasgil' I:23:7:0 W:15:8:40:15000 P:0:1d6:12:19:0 -F:SLAY_ANIMAL | BRAND_COLD | RES_COLD | RES_LITE | SHOW_MODS +F:BRAND_COLD +F:RES_COLD +F:RES_LITE +F:SHOW_MODS +F:SLAY_ANIMAL D:A slender, tapered blade whose wielder strikes icy blows with deadly D:accuracy. @@ -1239,9 +2006,17 @@ N:87:'Careth Asdriag' I:23:11:2 W:15:8:50:25000 P:0:2d7:6:8:0 -F:DEX | BLOWS | SPEED | CON | -F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_TROLL | SLAY_GIANT | -F:SLAY_ORC | SHOW_MODS | ESP_ANIMAL +F:BLOWS +F:CON +F:DEX +F:ESP_ANIMAL +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SPEED D:An heirloom of the Lords of Rhun far to the east, and a name of D:dismay to creatures natural and unnatural. @@ -1251,9 +2026,24 @@ N:88:'Sting' I:23:10:2 W:20:205:75:100000 P:0:1d7:7:8:0 -F:BLOWS | CON | DEX | ESP_ORC | ESP_SPIDER | ESP_UNDEAD | FREE_ACT | -F:LEVELS | LITE1 | RES_LITE | SEE_INVIS | SHOW_MODS | SLAY_ANIMAL | -F:SLAY_EVIL | SLAY_ORC | SLAY_UNDEAD | SPEED | STR +F:BLOWS +F:CON +F:DEX +F:ESP_ORC +F:ESP_SPIDER +F:ESP_UNDEAD +F:FREE_ACT +F:LEVELS +F:LITE1 +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_UNDEAD +F:SPEED +F:STR D:The perfect size for Bilbo, and stamped forever by the courage he found D:in Mirkwood, this sturdy little blade grants the wearer combat prowess D:and survival abilities they did not know they had. The blade is inscribed @@ -1265,11 +2055,20 @@ N:89:'Haradekket' I:23:18:2 W:20:8:130:111111 P:0:2d5:9:11:0 -F:INT | WIS | BLOWS | -F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DRAGON | SLAY_DEMON | -F:RES_CHAOS | RES_DISEN | RES_NEXUS | -F:SEE_INVIS | BLESSED | +F:BLESSED +F:BLOWS +F:INT +F:RES_CHAOS +F:RES_DISEN +F:RES_NEXUS +F:SEE_INVIS F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:WIS D:A damascened scimitar that seems wondrously easy to hold. Famed in song as D:the "Sickle of Harad", and a deadly foe to the undead. @@ -1280,8 +2079,14 @@ N:90:'Gilettar' I:23:10:2 W:20:8:80:35000 P:0:1d7:3:7:0 -F:BLOWS | HIDE_TYPE | -F:SLAY_ANIMAL | SLOW_DIGEST | REGEN | SHOW_MODS | SEE_INVIS | RES_DISEN +F:BLOWS +F:HIDE_TYPE +F:REGEN +F:RES_DISEN +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLOW_DIGEST D:A stubby blade worn by Beren, whose horn sounded of old in the glades of D:Brethil. @@ -1291,10 +2096,27 @@ N:91:'Daedheloth' I:23:30:0 W:70:25:180:250000 P:0:6d5:18:28:-50 -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_COLD | SLAY_TROLL | -F:SLAY_ORC | FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_CHAOS | SEE_INVIS | ESP_EVIL | AGGRAVATE | SHOW_MODS | -F:CHAOTIC | VORPAL | BRAND_FIRE | BRAND_POIS | SPECIAL_GENE +F:AGGRAVATE +F:BRAND_COLD +F:BRAND_FIRE +F:BRAND_POIS +F:CHAOTIC +F:ESP_EVIL +F:FREE_ACT +F:KILL_DRAGON +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE +F:VORPAL D:This weapon of wrath, cursed with a violent anger, dives hungrily D:into the flesh of its enemies. It gathers shadows of death into its D:owner as they inflict wounds that will never heal. @@ -1305,7 +2127,17 @@ N:92:'Sereghathol' I:23:17:2 W:50:30:150:250000 P:0:5d5:32:32:0 -F:DEX | FREE_ACT | LEVELS | REGEN | SEE_INVIS | SLAY_EVIL | SLOW_DIGEST | SPEED | STR | VORPAL | WOUNDING +F:DEX +F:FREE_ACT +F:LEVELS +F:REGEN +F:SEE_INVIS +F:SLAY_EVIL +F:SLOW_DIGEST +F:SPEED +F:STR +F:VORPAL +F:WOUNDING D:Blood-Sword it is called, after its thirst for the blood of foes. # The Beaked Axe of Dain Ironfoot @@ -1314,8 +2146,15 @@ N:93:of Dain Ironfoot I:22:10:3 W:20:15:180:40000 P:0:2d6:8:10:0 -F:WIS | CON | HIDE_TYPE | -F:SLAY_DRAGON | ESP_EVIL | ESP_UNDEAD | SLOW_DIGEST | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:CON +F:ESP_EVIL +F:ESP_UNDEAD +F:HIDE_TYPE +F:SHOW_MODS +F:SLAY_DRAGON +F:SLOW_DIGEST +F:WIS a:DRAIN_2 D:The narrow axe head of this weapon, finely balanced by a crow's beak, D:would pierce even the armour of Smaug, and its wielder becomes aware of @@ -1328,8 +2167,10 @@ N:94:of Pain I:22:13:0 W:30:155:190:50000 P:0:9d6:0:30:0 -F:SHOW_MODS | LEVELS | DRAIN_MANA | F:COULD2H +F:DRAIN_MANA +F:LEVELS +F:SHOW_MODS f:COULD2H D:The massive chopper that crowns this glaive glows blood-red and black; D:fell spells of annihilation swirl and dance as you swing death's myrmidon @@ -1342,10 +2183,18 @@ N:95:'Osondir' I:22:15:3 W:20:8:190:22000 P:0:3d5:6:9:0 -F:CHR | HIDE_TYPE | -F:BRAND_FIRE | SLAY_UNDEAD | SLAY_GIANT | RES_FIRE | RES_SOUND | -F:FEATHER | SEE_INVIS | SHOW_MODS | ESP_GIANT | +F:BRAND_FIRE +F:CHR F:COULD2H +F:ESP_GIANT +F:FEATHER +F:HIDE_TYPE +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_UNDEAD f:COULD2H D:Lordly and tall did Osondir stand against the wrath of giants, and D:clear-eyed in barrows fell, wielding a halberd glowing ruby red. @@ -1357,10 +2206,20 @@ N:96:'Til-i-arc' I:22:8:2 W:20:15:160:32000 P:0:2d5:10:12:10 -F:INT | HIDE_TYPE | -F:BRAND_COLD | BRAND_FIRE | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | ESP_GIANT -F:RES_FIRE | RES_COLD | SUST_INT | SLOW_DIGEST | SHOW_MODS | +F:BRAND_COLD +F:BRAND_FIRE F:COULD2H +F:ESP_GIANT +F:HIDE_TYPE +F:INT +F:RES_COLD +F:RES_FIRE +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_GIANT +F:SLAY_TROLL +F:SLOW_DIGEST +F:SUST_INT f:COULD2H D:Within this long thrusting spear lie the spirits of frost giants and fire D:demons, who war forever, trapped by magely spells. @@ -1371,11 +2230,24 @@ N:97:'Aiglos' I:22:2:4 W:15:45:50:180000 P:0:3d6:15:25:5 -F:DEX | WIS | HIDE_TYPE | -F:BRAND_COLD | BRAND_ELEC | LITE1 | -F:SLAY_TROLL | SLAY_ORC | SLAY_GIANT | KILL_UNDEAD | -F:FREE_ACT | RES_COLD | RES_ELEC | RES_LITE | -F:SLOW_DIGEST | ACTIVATE | BLESSED | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:KILL_UNDEAD +F:LITE1 +F:RES_COLD +F:RES_ELEC +F:RES_LITE +F:SHOW_MODS +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SLOW_DIGEST +F:WIS a:BA_ELEC_2 D:The mighty spear of Gil-galad, famed as "Snow-point" in the songs of D:Elves, against which all the foul corruptions of Sauron dashed in vain. @@ -1391,11 +2263,29 @@ N:98:of Caradhras I:22:2:4 W:15:45:50:77777 P:0:4d6:15:15:0 -F:INT | WIS | SPEED | TUNNEL | INFRA | HIDE_TYPE | SEARCH | -F:BRAND_FIRE | -F:SLAY_GIANT | SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD | SLAY_DRAGON | -F:RES_FIRE | RES_LITE | HOLD_LIFE | RES_FEAR | FEATHER | ESP_GIANT | -F:SEE_INVIS | ACTIVATE | BLESSED | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_FIRE +F:ESP_GIANT +F:FEATHER +F:HIDE_TYPE +F:HOLD_LIFE +F:INFRA +F:INT +F:RES_FEAR +F:RES_FIRE +F:RES_LITE +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_UNDEAD +F:SPEED +F:TUNNEL +F:WIS a:STONE_MUD D:A magical spear, rumoured to have been forged by Orome himself D:in the coldest reach of the cruel Redhorn. @@ -1406,8 +2296,16 @@ N:99:'Nimloth' I:22:2:3 W:15:12:50:30000 P:0:1d6:11:13:0 -F:STEALTH | RES_DARK | INFRA | SPEED | BLESSED | -F:BRAND_COLD | SLAY_UNDEAD | RES_COLD | SEE_INVIS | SHOW_MODS +F:BLESSED +F:BRAND_COLD +F:INFRA +F:RES_COLD +F:RES_DARK +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_UNDEAD +F:SPEED +F:STEALTH D:A thin spike of thrice-forged steel caps a straight sylvan shaft cut from D:a legendary tree; spells to break the will of the undead and strike cold D:fear into the hearts of foes lie on this perfectly balanced spear. @@ -1419,9 +2317,17 @@ N:100:of Eorlingas I:22:20:2 W:20:23:360:55000 P:0:3d8:3:21:0 -F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR | -F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | SEE_INVIS | SHOW_MODS | +F:DEX +F:HIDE_TYPE F:MUST2H +F:RES_FEAR +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPEED +F:STR f:MUST2H D:"Forth Eorlingas!". To the field of Cormallen came Eorl the Young D:to save beleaguered Gondor, and from his lance fled massive trolls @@ -1434,11 +2340,26 @@ N:101:of Durin I:24:25:3 W:30:90:230:150000 P:0:4d4:10:20:15 -F:STR | CON | TUNNEL | HIDE_TYPE | ESP_EVIL | RES_FEAR | -F:SLAY_DRAGON | KILL_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_ACID | RES_FIRE | RES_LITE | RES_DARK | RES_CHAOS | SHOW_MODS | -F:BRAND_ACID | BRAND_FIRE | +F:BRAND_ACID +F:BRAND_FIRE +F:CON +F:ESP_EVIL +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DEMON F:MUST2H +F:RES_ACID +F:RES_CHAOS +F:RES_DARK +F:RES_FEAR +F:RES_FIRE +F:RES_LITE +F:SHOW_MODS +F:SLAY_DRAGON +F:SLAY_ORC +F:SLAY_TROLL +F:STR +F:TUNNEL f:MUST2H D:The twin massive axe heads of this ancient demon's dread gleam with D:mithril inlay, which tell sagas of endurance, invoking the powers of @@ -1451,10 +2372,25 @@ N:102:of Eonwe I:24:25:2 W:30:120:230:200000 P:0:4d4:15:18:8 -F:STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE | -F:SLAY_EVIL | BRAND_COLD | KILL_DEMON | SLAY_UNDEAD | ESP_NONLIVING -F:SLAY_ORC | FREE_ACT | IM_COLD | SEE_INVIS | ACTIVATE | -F:BLESSED | SHOW_MODS +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:CHR +F:CON +F:DEX +F:ESP_NONLIVING +F:FREE_ACT +F:HIDE_TYPE +F:IM_COLD +F:INT +F:KILL_DEMON +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_UNDEAD +F:STR +F:WIS a:MASS_GENO D:The axe of Eonwe, leader of the Hosts of the West before the gates of D:Thangorodrim, strikes with icy wrath at the undead, disperses hosts of @@ -1467,11 +2403,25 @@ N:103:of Balli Stonehand I:22:22:3 W:30:15:170:90000 P:0:3d8:8:11:5 -F:STR | CON | STEALTH | HIDE_TYPE | ESP_NONLIVING -F:SLAY_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_BLIND | FEATHER | -F:SEE_INVIS | REGEN | SHOW_MODS | +F:CON F:COULD2H +F:ESP_NONLIVING +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:REGEN +F:RES_ACID +F:RES_BLIND +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_ORC +F:SLAY_TROLL +F:STEALTH +F:STR f:COULD2H D:The twin blades of this weapon were forged in Belegost, and powerful forces D:to resist and endure lie ready for he who shall wield it once more. @@ -1483,8 +2433,13 @@ N:104:'Lotharang' I:22:22:1 W:30:15:170:21000 P:0:2d8:4:3:0 -F:STR | DEX | HIDE_TYPE | -F:SLAY_TROLL | SLAY_ORC | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:DEX +F:HIDE_TYPE +F:SHOW_MODS +F:SLAY_ORC +F:SLAY_TROLL +F:STR a:CURE_MW D:A superbly crafted double-bladed axe that slays the creatures of earth and D:allows rapid recovery from their blows. @@ -1496,10 +2451,18 @@ N:105:of the Dwarves I:22:28:10 W:30:8:250:80000 P:0:3d8:12:17:0 -F:SLAY_EVIL | TUNNEL | INFRA | SEARCH | SLAY_GIANT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_FEAR | -F:SHOW_MODS | F:COULD2H +F:INFRA +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:SEARCH +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_GIANT +F:TUNNEL f:COULD2H D:A massive axe with twin razor-sharp heads, so large that it usually D:requires two hands to wield, intricately engraved in gold with spells @@ -1511,10 +2474,15 @@ N:106:'Barukkheled' I:24:11:3 W:20:8:160:50000 P:0:2d6:13:19:0 -F:CON | HIDE_TYPE | -F:SLAY_EVIL | SLAY_TROLL | SLAY_GIANT | SLAY_ORC | -F:SEE_INVIS | SHOW_MODS | +F:CON F:COULD2H +F:HIDE_TYPE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL f:COULD2H D:A royal heirloom of the southern coast, strong in combat against evil D:creatures of the earth. @@ -1526,8 +2494,15 @@ N:107:'Guthwine' I:23:16:1 W:30:10:150:45000 P:0:2d6:6:7:0 -F:CRIT | ESP_ORC | HIDE_TYPE | LITE1 | RES_BLIND | RES_FEAR | -F:SHOW_MODS | SLAY_ORC | WOUNDING +F:CRIT +F:ESP_ORC +F:HIDE_TYPE +F:LITE1 +F:RES_BLIND +F:RES_FEAR +F:SHOW_MODS +F:SLAY_ORC +F:WOUNDING D:The sword of Eomer, son of Eomund, leader of the Riders of the Mark. D:As one flashed this sword with Anduril during a battle long ago. D:Legendary are its powers in the rallying of desperate troops. @@ -1538,10 +2513,21 @@ N:108:of Osse I:22:5:4 W:30:90:70:120000 P:0:4d8:15:19:0 -F:DEX | HIDE_TYPE | -F:SLAY_DRAGON | SLAY_ANIMAL | FREE_ACT | HOLD_LIFE | IM_ACID | -F:RES_NETHER | SEE_INVIS | SLOW_DIGEST | REGEN | ACTIVATE | -F:BLESSED | SHOW_MODS | WATER_BREATH +F:ACTIVATE +F:BLESSED +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:IM_ACID +F:REGEN +F:RES_NETHER +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLOW_DIGEST +F:WATER_BREATH a:TELE_AWAY D:The awesome weapon imbued with some of the power of the Vala Ulmo, D:Lord of Waters. It allows the wearer to laugh in scorn at the dread @@ -1553,10 +2539,19 @@ N:109:'Avavir' I:22:17:3 W:40:8:250:18000 P:0:5d3:8:8:10 -F:DEX | CHR | HIDE_TYPE | -F:BRAND_COLD | BRAND_FIRE | FREE_ACT | RES_FIRE | RES_COLD | -F:RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS | +F:ACTIVATE +F:BRAND_COLD +F:BRAND_FIRE +F:CHR F:COULD2H +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:RES_COLD +F:RES_FIRE +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS f:COULD2H a:RECALL D:With elemental powers whose struggles turn this weapon red and purest @@ -1570,9 +2565,25 @@ N:110:of Dernhelm I:23:17:5 W:70:50:150:250000 P:0:3d5:20:25:0 -F:BLESSED | ESP_UNIQUE | FREE_ACT | HIDE_TYPE | HOLD_LIFE | KILL_UNDEAD | -F:LITE1 | LUCK | RES_DISEN | RES_FEAR | RES_MORGUL | SEE_INVIS | -F:SHOW_MODS | SLAY_EVIL | SPEED | STEALTH | VORPAL | WOUNDING | SPECIAL_GENE +F:BLESSED +F:ESP_UNIQUE +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:KILL_UNDEAD +F:LITE1 +F:LUCK +F:RES_DISEN +F:RES_FEAR +F:RES_MORGUL +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:VORPAL +F:WOUNDING D:Eomer's sister Eowyn once wielded this shining sword when she D:battled the Witch-King of Angmar, hiding her true identity to D:join the battle. Others are less likely to notice the wielder @@ -1586,11 +2597,28 @@ N:111:'Grond' I:21:50:2 W:100:1:1000:500000 P:0:9d9:25:25:10 -F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | KILL_UNDEAD | NO_MAGIC | -F:KILL_DEMON | SLAY_TROLL | SLAY_ORC | RES_ACID | RES_ELEC | RES_FIRE | -F:RES_COLD | SEE_INVIS | ESP_ALL | AGGRAVATE | SHOW_MODS | INSTA_ART | -F:LEVELS | ACTIVATE | SPECIAL_GENE | +F:ACTIVATE +F:AGGRAVATE +F:ESP_ALL +F:IMPACT +F:INSTA_ART +F:KILL_DEMON +F:KILL_DRAGON +F:KILL_UNDEAD +F:LEVELS F:MUST2H +F:NO_MAGIC +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE f:MUST2H a:GROND D:The mighty Hammer of the Underworld, blackened by doomspells of shattering, @@ -1602,10 +2630,15 @@ N:112:'Totila' I:21:13:2 W:20:8:150:55000 P:0:3d6:6:8:0 -F:STEALTH | -F:SLAY_EVIL | BRAND_FIRE | RES_FIRE | RES_CONF | ACTIVATE | -F:SHOW_MODS | LITE1 | +F:ACTIVATE +F:BRAND_FIRE F:COULD2H +F:LITE1 +F:RES_CONF +F:RES_FIRE +F:SHOW_MODS +F:SLAY_EVIL +F:STEALTH f:COULD2H a:CONFUSE D:A flail whose head befuddles those who stare as you whirl it around, and @@ -1618,10 +2651,20 @@ N:113:'Thunderfist' I:21:18:4 W:45:38:300:160000 P:0:3d6:5:18:0 -F:STR | CON | HIDE_TYPE | RES_FEAR | -F:SLAY_ANIMAL | BRAND_FIRE | BRAND_ELEC | SLAY_TROLL | SLAY_ORC | -F:RES_ELEC | RES_FIRE | RES_DARK | SHOW_MODS | +F:BRAND_ELEC +F:BRAND_FIRE +F:CON +F:HIDE_TYPE F:MUST2H +F:RES_DARK +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_ORC +F:SLAY_TROLL +F:STR f:MUST2H D:The long-lost weapon of Kzurin, Dwarven champion of ancient Belegost, D:with runes of strength in its handle, and flames and sparks that roar and @@ -1633,9 +2676,15 @@ N:114:'Maegnas-in-sereg' I:21:12:4 W:20:30:150:30000 P:0:2d6:8:22:0 -F:STR | HIDE_TYPE | BRAND_POIS | -F:SLAY_ANIMAL | SLAY_TROLL | SLAY_ORC | RES_NEXUS | SEE_INVIS | +F:BRAND_POIS +F:HIDE_TYPE +F:RES_NEXUS +F:SEE_INVIS F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_ORC +F:SLAY_TROLL +F:STR D:You feel strong and firm of foot as you whip the chain-suspended spiked orb D:around - and bathe it in the blood of your foes. @@ -1645,7 +2694,11 @@ N:115:'Naurgil' I:21:12:0 W:20:100:150:35000 P:0:2d6:5:7:2 -F:BRAND_FIRE | IM_FIRE | ACTIVATE | SHOW_MODS | LITE1 +F:ACTIVATE +F:BRAND_FIRE +F:IM_FIRE +F:LITE1 +F:SHOW_MODS a:FIRESTAR D:A famed battle-lord of old, with a ruddy head, coloured as embers are that D:can yet rise up in wrath. @@ -1657,8 +2710,12 @@ N:116:'Taratol' I:21:5:0 W:20:15:200:50000 P:0:3d4:12:12:0 -F:KILL_DRAGON | BRAND_ELEC | IM_ELEC | ACTIVATE | SHOW_MODS | +F:ACTIVATE +F:BRAND_ELEC F:COULD2H +F:IM_ELEC +F:KILL_DRAGON +F:SHOW_MODS f:COULD2H a:SPEED D:A great ridged mace that calls around you a nimbus of living lightning; @@ -1671,11 +2728,24 @@ N:117:of Gamil Zirak I:21:8:4 W:40:75:120:250000 P:0:9d3:19:21:5 -F:WIS | TUNNEL | HIDE_TYPE | RES_FEAR | -F:KILL_DRAGON | SLAY_EVIL | BRAND_ELEC | SLAY_UNDEAD | SLAY_DEMON | -F:FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_NEXUS | -F:SEE_INVIS | SHOW_MODS | +F:BRAND_ELEC F:COULD2H +F:FREE_ACT +F:HIDE_TYPE +F:KILL_DRAGON +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +F:RES_NEXUS +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:TUNNEL +F:WIS f:COULD2H D:Gamil Zirak was a great craftsman, the master of Telchar of Nogrod. D:This weapon was rescued from Thingol's treasury, and it is rumoured @@ -1688,9 +2758,13 @@ N:118:'Nar-i-vagil' I:21:3:3 W:20:18:150:70000 P:0:1d9:10:20:0 -F:INT | HIDE_TYPE | -F:SLAY_ANIMAL | BRAND_FIRE | RES_FIRE | SHOW_MODS | +F:BRAND_FIRE F:COULD2H +F:HIDE_TYPE +F:INT +F:RES_FIRE +F:SHOW_MODS +F:SLAY_ANIMAL f:COULD2H D:Named for a fiery star and set with gems of great worth binding mystic D:virtues of protection and thought. @@ -1702,8 +2776,17 @@ N:119:'Eriril' I:21:3:4 W:20:18:150:20000 P:0:1d9:3:5:0 -F:INT | WIS | HIDE_TYPE | ESP_EVIL | SPELL_CONTAIN | WIELD_CAST -F:SLAY_EVIL | RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:ESP_EVIL +F:HIDE_TYPE +F:INT +F:RES_LITE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SPELL_CONTAIN +F:WIELD_CAST +F:WIS a:ID_PLAIN D:The radiant golden staff of an Istari of legend, this wizard's companion D:grants keen sight and the knowledge of many hidden things. @@ -1715,9 +2798,24 @@ N:120:of Olorin I:21:3:4 W:30:105:150:140000 P:0:2d9:10:13:0 -F:INT | WIS | CHR | HIDE_TYPE | SEARCH | BRAND_FIRE | -F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | SPELL_CONTAIN | WIELD_CAST -F:HOLD_LIFE | RES_FIRE | RES_NETHER | SEE_INVIS | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:BRAND_FIRE +F:BRAND_FIRE +F:CHR +F:HIDE_TYPE +F:HOLD_LIFE +F:INT +F:RES_FIRE +F:RES_NETHER +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_EVIL +F:SLAY_ORC +F:SLAY_TROLL +F:SPELL_CONTAIN +F:WIELD_CAST +F:WIS a:DETECT_XTRA D:A staff tall and sturdy, with rough-hewn runes that invoke the element of D:Earth, and which strikes down all creatures who live in the shadow of @@ -1729,11 +2827,25 @@ N:121:'Nguruthos' I:21:20:6 W:80:38:400:444444 P:0:7d8:18:18:0 -F:STR | TUNNEL | HIDE_TYPE | NO_TELE | DRAIN_MANA | -F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_EVIL | KILL_UNDEAD | BRAND_FIRE | -F:IM_FIRE | RES_DARK | RES_CHAOS | RES_DISEN | AGGRAVATE | -F:SHOW_MODS | BRAND_POIS | VAMPIRIC | +F:AGGRAVATE +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_MANA +F:HIDE_TYPE +F:IM_FIRE +F:KILL_UNDEAD F:MUST2H +F:NO_TELE +F:RES_CHAOS +F:RES_DARK +F:RES_DISEN +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DRAGON +F:SLAY_EVIL +F:STR +F:TUNNEL +F:VAMPIRIC f:MUST2H D:A weapon so massive it seems beyond the strength of mortals, yet you feel D:the might of giants within you as you heft it. As you grip the handle @@ -1747,10 +2859,20 @@ N:122:'Turmil' I:21:10:4 W:20:15:120:30000 P:0:2d5:10:6:8 -F:WIS | INFRA | HIDE_TYPE | -F:BRAND_COLD | SLAY_ORC | RES_COLD | RES_LITE | REGEN | -F:ACTIVATE | SHOW_MODS | ESP_ORC | ESP_TROLL | ESP_GIANT | +F:ACTIVATE +F:BRAND_COLD F:COULD2H +F:ESP_GIANT +F:ESP_ORC +F:ESP_TROLL +F:HIDE_TYPE +F:INFRA +F:REGEN +F:RES_COLD +F:RES_LITE +F:SHOW_MODS +F:SLAY_ORC +F:WIS f:COULD2H a:TURMIL D:Wielded by the High Priest of Meneltarma, this great mace gleams coldly as @@ -1764,10 +2886,26 @@ N:123:of Gothmog I:21:2:-2 W:20:15:120:100000 P:0:3d6:15:16:0 -F:INT | DEX | INFRA | HIDE_TYPE | DRAIN_HP | HEAVY_CURSE | -F:CURSED | AGGRAVATE | BRAND_FIRE | SLAY_ANIMAL | SLAY_DEMON | -F:RES_FIRE | ESP_SPIDER | VORPAL | RES_LITE | LITE1 | REGEN | -F:ESP_DEMON | WOUNDING | SHOW_MODS +F:AGGRAVATE +F:BRAND_FIRE +F:CURSED +F:DEX +F:DRAIN_HP +F:ESP_DEMON +F:ESP_SPIDER +F:HEAVY_CURSE +F:HIDE_TYPE +F:INFRA +F:INT +F:LITE1 +F:REGEN +F:RES_FIRE +F:RES_LITE +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_DEMON +F:VORPAL +F:WOUNDING D:With this unbearably bright whip of flame, the Balrog Gothmog has become D:known for never having lost in combat. @@ -1778,8 +2916,12 @@ N:124:'Belthronding' I:19:13:3 W:40:20:40:35000 P:0:0d0:20:22:0 -F:DEX | STEALTH | HIDE_TYPE | -F:RES_DISEN | XTRA_SHOTS | SHOW_MODS +F:DEX +F:HIDE_TYPE +F:RES_DISEN +F:SHOW_MODS +F:STEALTH +F:XTRA_SHOTS D:The great bow of Beleg, made of black yew and strung with elven hair that D:faintly shines a pale clear gold. @@ -1790,8 +2932,13 @@ N:125:of Bard I:19:13:2 W:30:20:40:20000 P:0:0d0:17:19:0 -F:DEX | HIDE_TYPE | ESP_DRAGON | LUCK -F:FREE_ACT | XTRA_MIGHT | SHOW_MODS +F:DEX +F:ESP_DRAGON +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:SHOW_MODS +F:XTRA_MIGHT D:The great yew bow of grim-faced Bard, who shot the mightiest arrow that D:songs record. @@ -1802,8 +2949,11 @@ N:126:'Cubragol' I:19:23:10 W:50:25:110:50000 P:0:0d0:10:14:0 -F:SPEED | HIDE_TYPE | -F:RES_FIRE | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:HIDE_TYPE +F:RES_FIRE +F:SHOW_MODS +F:SPEED a:CUBRAGOL D:A crossbow that grants fiery speed to he who finds it, and from which D:shoot bolts that blaze with flame unquenchable. @@ -1815,11 +2965,29 @@ N:127:of Manwe I:6:1:12 W:127:220:20:9000000 P:0:1d4:-19:-19:0 -F:INT | CHR | WIS | MANA | SPELL | ACTIVATE | LUCK | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SPECIAL_GENE | -F:SEE_INVIS | ESP_EVIL | ESP_DEMON | NEVER_BLOW | INFRA | -F:PRECOGNITION | IM_FIRE | ULTIMATE | SPELL_CONTAIN | WIELD_CAST | +F:ACTIVATE +F:CHR F:COULD2H +F:ESP_DEMON +F:ESP_EVIL +F:IM_FIRE +F:INFRA +F:INT +F:LUCK +F:MANA +F:NEVER_BLOW +F:PRECOGNITION +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SEE_INVIS +F:SPECIAL_GENE +F:SPELL +F:SPELL_CONTAIN +F:ULTIMATE +F:WIELD_CAST +F:WIS f:COULD2H a:GANDALF D:A simple, wooden wizard's staff. Unremarkable in all aspects... @@ -1833,8 +3001,12 @@ N:128:of Beor I:15:4:4 W:20:10:20:40000 P:0:4d5:8:12:0 -F:DEX | SPEED | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD +F:DEX +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SPEED D:Beor's boomerang makes its wielder as agile as the winds, D:and as hard to harm. @@ -1845,8 +3017,20 @@ N:129:'Glimdrir' I:15:4:3 W:40:20:20:60000 P:0:5d5:15:16:0 -F:DEX | SPEED | FREE_ACT | BRAND_POIS | SLAY_EVIL | SLAY_UNDEAD | REGEN -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SOUND | NO_TELE | CURSED +F:BRAND_POIS +F:CURSED +F:DEX +F:FREE_ACT +F:NO_TELE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SPEED D:A powerful boomerang that makes one agile and fast, with a thirst for D:evil and undead creatures, but demands its wielder not teleport, for fear D:of desertion. @@ -1858,9 +3042,20 @@ N:130:of Incanus I:36:2:3 W:30:20:20:60000 P:2:0d0:0:0:20 -F:INT | WIS | SEARCH | HIDE_TYPE | SPELL_CONTAIN | WIELD_CAST -F:SUST_INT | SUST_WIS | FREE_ACT | SEE_INVIS | -F:RES_ACID | RES_ELEC | IM_FIRE | RES_COLD +F:FREE_ACT +F:HIDE_TYPE +F:IM_FIRE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:SEARCH +F:SEE_INVIS +F:SPELL_CONTAIN +F:SUST_INT +F:SUST_WIS +F:WIELD_CAST +F:WIS Z:weigh magic D:Gandalf's long, flowing robe. It provides insight and allows the D:wearer to see things not seen by all. @@ -1872,8 +3067,13 @@ N:131:of the Thain I:19:2:4 W:40:20:40:35000 P:0:0d0:15:15:0 -F:HIDE_TYPE | DEX | CON -F:RES_NETHER | XTRA_SHOTS | XTRA_MIGHT | SHOW_MODS +F:CON +F:DEX +F:HIDE_TYPE +F:RES_NETHER +F:SHOW_MODS +F:XTRA_MIGHT +F:XTRA_SHOTS D:This sling was crafted by Faramir I, Thain of the Shire, just in case D:the nasties of his father's stories ever dare to enter the Shire again. @@ -1883,7 +3083,12 @@ N:132:of Gimli I:34:3:3 W:40:3:65:80000 P:3:0d0:9:10:40 -F:INT | CON | RES_FEAR | HIDE_TYPE | IM_FIRE | RES_SHARDS +F:CON +F:HIDE_TYPE +F:IM_FIRE +F:INT +F:RES_FEAR +F:RES_SHARDS Z:find secret passages D:A gift from the King of Rohan to Gimli the Dwarf, this shield D:combines the cunning and stamina of Gimli Elf-friend, Gimli the @@ -1895,8 +3100,15 @@ N:133:of Gimli I:24:3:2 W:35:60:35:65000 P:0:1d6:5:15:0 -F:STR | BLOWS | LEVELS | SLAY_ORC | FREE_ACT | VORPAL | -F:ESP_UNDEAD | ESP_NONLIVING | COULD2H +F:BLOWS +F:COULD2H +F:ESP_NONLIVING +F:ESP_UNDEAD +F:FREE_ACT +F:LEVELS +F:SLAY_ORC +F:STR +F:VORPAL f:COULD2H D:"Gimli sensed the Dead behind following, but he continued on D:after Aragorn." The trusty axe of Gimli son of Gloin, one of @@ -1908,9 +3120,16 @@ N:134:'Lasher' I:21:2:3 W:20:5:30:50000 P:0:1d6:12:15:0 -F:DEX | BLOWS | HIDE_TYPE | -F:SLAY_ANIMAL | SLAY_ORC | BRAND_POIS | VORPAL | -F:RES_POIS | FREE_ACT | ESP_ORC +F:BLOWS +F:BRAND_POIS +F:DEX +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:RES_POIS +F:SLAY_ANIMAL +F:SLAY_ORC +F:VORPAL D:A powerful whip that is deadly against orcs. It poisons your foes D:and is said to go "snicker snack". @@ -1920,7 +3139,14 @@ N:135:of Thorin I:14:59:2 W:50:10:30:40000 P:0:1d1:0:0:0 -F:ACTIVATE | CHR | INFRA | INSTA_ART | LUCK | STEALTH | SUST_CHR | TUNNEL +F:ACTIVATE +F:CHR +F:INFRA +F:INSTA_ART +F:LUCK +F:STEALTH +F:SUST_CHR +F:TUNNEL a:CHARM_OTHERS Z:remove fear D:This magical instrument once belonged to Thorin Oakenshield, @@ -1935,7 +3161,15 @@ N:136:of Thorin I:32:8:3 W:40:5:20:55000 P:10:2d4:0:0:0 -F:ACTIVATE | DEX | HIDE_TYPE | HOLD_LIFE | REGEN | RES_FEAR | SUST_CON | SUST_DEX | SUST_STR +F:ACTIVATE +F:DEX +F:HIDE_TYPE +F:HOLD_LIFE +F:REGEN +F:RES_FEAR +F:SUST_CON +F:SUST_DEX +F:SUST_STR a:TERROR D:Mighty was Thorin Oakenshield as he emerged from the Gate of the D:Lonely Mountain on the day of the Battle of the Five Armies, clad @@ -1949,8 +3183,18 @@ N:137:of Maglor I:14:59:3 W:60:10:20:100000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | ESP_UNIQUE +F:CHR +F:ESP_UNIQUE +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:WIS D:This harp that once belonged to Maglor makes those who use it seem D:more forceful and convincing. It is also said that those who have D:used it found themselves walking faster, as if to an unheard beat. @@ -1962,8 +3206,17 @@ N:138:of the Sky I:14:58:2 W:40:10:15:80000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD +F:CHR +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SEE_INVIS +F:SPEED +F:STEALTH +F:WIS D:The drum is decorated with the images of the stars, the clouds, the D:Sun guided by Arien and the Moon with Tilion. It imparts to the D:wearer an echo of the beauty of the sky, and protects him from the @@ -1977,8 +3230,16 @@ N:139:of Daeron I:14:59:1 W:20:10:10:50000 P:0:3d4:0:0:0 -F:CHR | SPEED | WIS | RES_SOUND | STEALTH | LUCK -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD +F:CHR +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_SOUND +F:SPEED +F:STEALTH +F:WIS D:A pretty harp that makes those who play it beautiful, wise and D:fast. @@ -1989,8 +3250,16 @@ N:140:of Erebor I:20:6:5 W:50:15:200:55000 P:0:3d4:5:0:0 -F:STR | TUNNEL | SUST_STR | HIDE_TYPE | LITE1 | ACTIVATE | CLIMB -F:RES_CHAOS | RES_LITE | RES_DARK +F:ACTIVATE +F:CLIMB +F:HIDE_TYPE +F:LITE1 +F:RES_CHAOS +F:RES_DARK +F:RES_LITE +F:STR +F:SUST_STR +F:TUNNEL a:EREBOR D:A pick that provides a magical light by which to see while tunnelling. @@ -2001,7 +3270,12 @@ N:141:of the Druedain I:14:58:4 W:19:10:15:10000 P:0:3d4:0:0:0 -F:ACTIVATE | STEALTH | SEARCH | INFRA | RES_POIS | RES_DARK +F:ACTIVATE +F:INFRA +F:RES_DARK +F:RES_POIS +F:SEARCH +F:STEALTH a:DRUEDAIN D:The fabled Drum of the Druedain that will protect those who play it D:from darkness and poison attacks. It also aids in the seeing of @@ -2014,7 +3288,10 @@ N:142:of Rohan I:14:60:2 W:14:10:15:80000 P:0:3d4:0:0:0 -F:ACTIVATE | CHR | WIS | ESP_DRAGON +F:ACTIVATE +F:CHR +F:ESP_DRAGON +F:WIS a:ROHAN D:A horn carved from the bones of the Dragon of Ered-Mithrin, this D:heirloom of the House of Eorl bestows to its user the gifts of @@ -2027,7 +3304,12 @@ N:143:of Helm I:14:60:2 W:16:10:15:15000 P:0:3d4:0:0:0 -F:ACTIVATE | STR | CON | IM_COLD | RES_NETHER | RES_FEAR +F:ACTIVATE +F:CON +F:IM_COLD +F:RES_FEAR +F:RES_NETHER +F:STR a:HELM D:Heedless of cold, fearless of darkness -- besiegers fled at the wind D:of the solitary coming of King Helm Hammerhand, proclaimed by a single @@ -2040,7 +3322,12 @@ N:144:of Boromir I:14:60:3 W:18:10:15:18000 P:0:3d4:0:0:0 -F:ACTIVATE | STR | CON | RES_FEAR | RES_FIRE | AGGRAVATE +F:ACTIVATE +F:AGGRAVATE +F:CON +F:RES_FEAR +F:RES_FIRE +F:STR a:BOROMIR D:The great horn made of the horns of kine of Araw. It is inlaid with silver D:and gold signs; when blown, it can be heard for miles over. The horn gives @@ -2054,7 +3341,13 @@ N:145:of Gothmog I:22:28:-4 W:30:8:250:30000 P:0:3d8:14:19:0 -F:BRAND_FIRE | IM_FIRE | CHR | ACTIVATE | SHOW_MODS | CURSED | TY_CURSE +F:ACTIVATE +F:BRAND_FIRE +F:CHR +F:CURSED +F:IM_FIRE +F:SHOW_MODS +F:TY_CURSE a:AXE_GOTHMOG D:The black axe of Gothmog, which struck Fingon at Nirnaeth. Mighty D:spells of evil make it unsafe in any hands but those of its original wielder. @@ -2066,7 +3359,8 @@ N:146:of Gondor I:17:2:0 W:20:5:3:25000 P:0:10d8:10:20:0 -F:SLAY_EVIL | SLAY_DEMON +F:SLAY_DEMON +F:SLAY_EVIL D:An arrow that was created to rid the world of demons. # The Long Sword of Tulkas @@ -2076,13 +3370,40 @@ N:147:of Tulkas I:23:17:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:LIFE | CON | CHR | LUCK -F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | -F:BRAND_FIRE | BRAND_COLD | BRAND_ELEC | VORPAL | IM_COLD | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_DEMON | -F:FREE_ACT | RES_FIRE | RES_DARK | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN | -F:ACTIVATE | SHOW_MODS | BLESSED | -F:PRECOGNITION | NO_MAGIC | ULTIMATE | SPECIAL_GENE +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:A warm light bathes this translucent blade. The power of the fates are D:at the command of its wielder as the weapon passes Supreme Judgment on @@ -2095,8 +3416,11 @@ N:148:of Great Luck I:36:2:60 W:50:120:20:60000 P:2:0d0:0:0:0 -F:LUCK | HIDE_TYPE | -F:FREE_ACT | DRAIN_HP | DRAIN_MANA +F:DRAIN_HP +F:DRAIN_MANA +F:FREE_ACT +F:HIDE_TYPE +F:LUCK D:A powerful wizard once created this robe to grant him incredible luck.... D:It seems he forgot to wear it. @@ -2107,8 +3431,13 @@ N:149:of Farmer Maggot I:19:2:2 W:10:10:5:20000 P:0:0d0:20:0:0 -F:INFRA | SEARCH | HIDE_TYPE | -F:XTRA_SHOTS | SHOW_MODS | ACTIVATE | SPECIAL_GENE +F:ACTIVATE +F:HIDE_TYPE +F:INFRA +F:SEARCH +F:SHOW_MODS +F:SPECIAL_GENE +F:XTRA_SHOTS a:MAGGOT D:This ordinary seeming leather sling has been raised to legendary D:status amongst generations of hobbit children. Farmer Maggot's @@ -2125,10 +3454,25 @@ N:150:of Angmar I:23:17:-10 W:20:40:130:30000 P:0:4d5:-22:-25:0 -F:SPEED | STR | WIS | CHR | ESP_UNDEAD -F:BRAND_FIRE | SEE_INVIS | SLOW_DIGEST | FREE_ACT | -F:VAMPIRIC | NO_TELE | AGGRAVATE | WRAITH | INVIS | -F:CURSED | HEAVY_CURSE | DG_CURSE | SHOW_MODS | CLONE +F:AGGRAVATE +F:BRAND_FIRE +F:CHR +F:CLONE +F:CURSED +F:DG_CURSE +F:ESP_UNDEAD +F:FREE_ACT +F:HEAVY_CURSE +F:INVIS +F:NO_TELE +F:SEE_INVIS +F:SHOW_MODS +F:SLOW_DIGEST +F:SPEED +F:STR +F:VAMPIRIC +F:WIS +F:WRAITH D:Dark flames wreath the naked steel of the Witch-King of Angmar. D:A mighty curse to all those who wield it apart from its master, D:the torture of the wraithworld awaits those who dare. @@ -2140,9 +3484,19 @@ N:151:of Feanor I:18:2:0 W:127:220:130:100000 P:0:5d5:5:6:0 -F:BRAND_COLD | BRAND_FIRE | BRAND_ELEC | BRAND_ACID | BRAND_POIS | -F:SLAY_DRAGON | SLAY_GIANT | SLAY_TROLL | KILL_UNDEAD | SLAY_ORC | -F:SLAY_DEMON | SLAY_EVIL | SPECIAL_GENE +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:KILL_UNDEAD +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:SPECIAL_GENE D:Made during the war against Morgoth by Feanor, this powerful D:bolt is the bane of Morgoth's power, and has especial strength D:against those foes who are already dead. @@ -2154,7 +3508,38 @@ N:152:of Orome I:19:24:5 W:127:220:130:8000000 P:0:0d0:36:28:0 -F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT | IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION | REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN | SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH | SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | XTRA_MIGHT | XTRA_SHOTS +F:CON +F:DEX +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:FLY +F:FREE_ACT +F:IM_ELEC +F:INFRA +F:INVIS +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REFLECT +F:RES_BLIND +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:SEE_INVIS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:XTRA_MIGHT +F:XTRA_SHOTS D:A crossbow handcrafted by Aule for the Huntsman of the Valar during D:the first pursuit of Melkor Bauglir. @@ -2164,8 +3549,16 @@ N:153:of the Sandworm I:36:4:5 W:30:3:80:65000 P:30:0d0:0:0:0 -F:RES_POIS | RES_ELEC | RES_FIRE | RES_ACID | SPECIAL_GENE -F:TUNNEL | STR | STEALTH | INFRA | ESP_ANIMAL +F:ESP_ANIMAL +F:INFRA +F:RES_ACID +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SPECIAL_GENE +F:STEALTH +F:STR +F:TUNNEL D:This powerful piece of armour was made using the remains of D:the Sandworm Queen. @@ -2175,8 +3568,14 @@ N:154:'Lhugdagnir' I:22:28:2 W:70:20:260:33000 P:0:3d8:20:20:0 -F:BLOWS | KILL_DRAGON | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:RES_POIS | SHOW_MODS +F:BLOWS +F:KILL_DRAGON +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS D:Forged by the Dwarves to defend their home of Khazad-dum from dragons, D:this axe has been lost to time... until now. @@ -2186,7 +3585,11 @@ N:155:'Cam-tal-crist' I:24:8:4 W:15:3:140:12000 P:0:2d5:12:15:0 -F:DEX | VORPAL | HIDE_TYPE | SHOW_MODS | WOUNDING +F:DEX +F:HIDE_TYPE +F:SHOW_MODS +F:VORPAL +F:WOUNDING D:The Petty-dwarves of Bathak forged this blade, and it shares their thirst D:for blood. @@ -2197,8 +3600,13 @@ N:156:'Orchast' I:24:11:4 W:15:2:170:12000 P:0:2d7:20:14:0 -F:DEX | SEARCH | SLAY_ORC | ACTIVATE | HIDE_TYPE | SHOW_MODS | +F:ACTIVATE F:COULD2H +F:DEX +F:HIDE_TYPE +F:SEARCH +F:SHOW_MODS +F:SLAY_ORC f:COULD2H a:ORCHAST D:Forged by the dwarves of Khazad-dum in a time of desperation, @@ -2211,8 +3619,16 @@ N:157:of the Night I:24:1:4 W:45:20:45:34000 P:0:2d6:34:22:0 -F:DEX | STEALTH | VAMPIRIC | KILL_UNDEAD | RES_DARK | HIDE_TYPE | -F:SHOW_MODS | SEE_INVIS | ACTIVATE | DRAIN_EXP +F:ACTIVATE +F:DEX +F:DRAIN_EXP +F:HIDE_TYPE +F:KILL_UNDEAD +F:RES_DARK +F:SEE_INVIS +F:SHOW_MODS +F:STEALTH +F:VAMPIRIC a:NIGHT D:Found on an unmarked grave after a violent storm, this hatchet D:has a sinister aura of darkness and decay. @@ -2223,8 +3639,16 @@ N:158:'Lavandagnir' I:24:30:3 W:70:20:300:28400 P:0:5d7:31:27:0 -F:STR | SLAY_ANIMAL | SUST_STR | RES_SHARDS | RES_NEXUS | FEATHER | -F:HIDE_TYPE | SHOW_MODS | ACTIVATE | DRAIN_HP +F:ACTIVATE +F:DRAIN_HP +F:FEATHER +F:HIDE_TYPE +F:RES_NEXUS +F:RES_SHARDS +F:SHOW_MODS +F:SLAY_ANIMAL +F:STR +F:SUST_STR a:NATUREBANE D:Used by the orcs in their battle at Dagor Bragollach against the elves, this D:axe has a bloodthirst for nature. @@ -2235,8 +3659,14 @@ N:159:of Helcar I:24:8:3 W:30:25:140:26550 P:0:2d5:3:15:0 -F:INT | CHR | SUST_DEX | BRAND_COLD | IM_COLD | RES_NEXUS | HIDE_TYPE | +F:BRAND_COLD +F:CHR +F:HIDE_TYPE +F:IM_COLD +F:INT +F:RES_NEXUS F:SHOW_MODS +F:SUST_DEX D:Crafted of purest ice and held solid by powerful spells, this icy axe D:delivers a chill of death to its victims. @@ -2247,8 +3677,12 @@ N:160:of Knowledge I:32:5:-6 W:20:5:75:100000 P:6:1d3:0:0:20 -F:LITE1 | HIDE_TYPE | SPECIAL_GENE | LUCK | -F:AUTO_ID | ACTIVATE +F:ACTIVATE +F:AUTO_ID +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:SPECIAL_GENE a:KNOWLEDGE D:This helm, designed by Petty-Dwarves ages ago to act as the brain of a D:long lost project, is made of finest glass. Its light banishes all secrets, @@ -2263,7 +3697,10 @@ N:161:of the Edain I:46:3:3 W:20:10:40:20000 P:0:0d0:25:15:30 -F:STEALTH | AUTOMATIC_99 | XTRA_MIGHT | HIDE_TYPE +F:AUTOMATIC_99 +F:HIDE_TYPE +F:STEALTH +F:XTRA_MIGHT D:A trap that can almost never be detected. Its missiles may be mere pebbles, D:but fired at an incredibly high velocity to penetrate even the toughest D:hide or armour. @@ -2274,7 +3711,11 @@ N:162:of the Noegyth Nibin I:46:6:3 W:20:20:40:20000 P:0:0d0:0:0:25 -F:STEALTH | XTRA_SHOTS | TELEPORT_TO | HIDE_TYPE | AUTOMATIC_99 +F:AUTOMATIC_99 +F:HIDE_TYPE +F:STEALTH +F:TELEPORT_TO +F:XTRA_SHOTS D:A magical trap, armed with a wand. Unaccountably, its victims keep D:on coming back for more... @@ -2284,7 +3725,11 @@ N:163:of the Naugrim I:46:2:2 W:20:20:200:20000 P:0:0d0:17:27:37 -F:STEALTH | XTRA_SHOTS | XTRA_MIGHT | HIDE_TYPE | ONLY_DEMON +F:HIDE_TYPE +F:ONLY_DEMON +F:STEALTH +F:XTRA_MIGHT +F:XTRA_SHOTS D:A snare set not for animals, or people, but for demons alone, and D:enchanted so that whenever the demon sets foot or claw into the D:(hidden) pentagram, its hide is immediately pierced by many magical @@ -2296,7 +3741,13 @@ N:164:'Narsil' I:23:2:2 W:20:5:30:15000 P:0:3d2:6:10:0 -F:BLESSED | DEX | HIDE_TYPE | RES_FIRE | SLAY_ORC | SLAY_TROLL | STR +F:BLESSED +F:DEX +F:HIDE_TYPE +F:RES_FIRE +F:SLAY_ORC +F:SLAY_TROLL +F:STR D:These are the shards of the mighty blade of Isildur, which deprived D:the dark lord Sauron of The One Ring of Power. Legend has it that D:the sword that was broken shall be reforged. You can barely make out @@ -2311,7 +3762,15 @@ N:165:of Peregrin Took I:37:4:2 W:20:3:220:32000 P:14:1d4:3:5:11 -F:ACTIVATE | ESP_TROLL | HIDE_TYPE | LITE1 | REGEN | RES_FEAR | SHOW_MODS | STR | SUST_STR +F:ACTIVATE +F:ESP_TROLL +F:HIDE_TYPE +F:LITE1 +F:REGEN +F:RES_FEAR +F:SHOW_MODS +F:STR +F:SUST_STR a:GORLIM D:This sturdy mail shirt was a gift from the nobility of Gondor to the halfling D:Peregrin Took. It enables a warrior to fight more capably and cling to life when @@ -2324,11 +3783,22 @@ N:166:'Loknare' I:38:20:0 W:95:12:500:400000 P:50:2d4:-8:0:35 -F:FEATHER | FLY | ESP_DRAGON | -F:RES_NEXUS | RES_CHAOS | AGGRAVATE | REGEN | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | F:ACTIVATE +F:AGGRAVATE +F:ESP_DRAGON +F:FEATHER +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:RES_NEXUS +F:RES_SHARDS +F:RES_SOUND a:MEDIATOR D:A mighty suit of dragon armour, set with the scales of dragons of both D:Law and Chaos, and with power over both. Loknare means Dragonblaze. @@ -2339,7 +3809,10 @@ N:167:of Himring I:36:6:0 W:50:20:100:35000 P:6:0d0:0:0:15 -F:RES_CHAOS | RES_NETHER | RES_POIS | ACTIVATE +F:ACTIVATE +F:RES_CHAOS +F:RES_NETHER +F:RES_POIS a:PROT_EVIL D:Contained within this studded cuirass of pliable leather is the memory of D:unvanquished Himring, defiant fortress surrounded by the legions of Morgoth. @@ -2351,8 +3824,14 @@ N:168:'Hithlomir' I:36:4:4 W:20:3:80:45000 P:4:0d0:0:0:20 -F:STEALTH | HIDE_TYPE | SEARCH | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK +F:HIDE_TYPE +F:RES_ACID +F:RES_COLD +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:SEARCH +F:STEALTH D:Familiar with the secret ways hidden in darkness, this leather cuirass is D:truly more than it appears. @@ -2364,10 +3843,20 @@ N:169:of Gil-galad I:34:10:5 W:70:4:80:65000 P:10:1d3:0:0:20 -F:ACTIVATE | -F:LITE1 | WIS | CHR | SEARCH | LUCK -F:RES_ELEC | RES_ACID | RES_DISEN | RES_DARK | HIDE_TYPE | -F:SUST_WIS | SUST_DEX | SUST_CHR +F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:LITE1 +F:LUCK +F:RES_ACID +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:SEARCH +F:SUST_CHR +F:SUST_DEX +F:SUST_WIS +F:WIS a:GILGALAD D:The legendary shield of Gil-Galad, who fought his way to the gates of D:the Dark Tower, and with whom came light even to Gorgoroth. @@ -2379,9 +3868,16 @@ N:170:of Celebrimbor I:32:3:3 W:55:12:20:45000 P:3:1d1:0:0:18 -F:INT | DEX | CHR | SPELL | SEARCH | -F:RES_FIRE | RES_ACID | RES_DISEN | RES_SHARDS | F:ACTIVATE +F:CHR +F:DEX +F:INT +F:RES_ACID +F:RES_DISEN +F:RES_FIRE +F:RES_SHARDS +F:SEARCH +F:SPELL a:CELEBRIMBOR D:This once belonged to Celebrimbor, maker of the Rings of Power. One who D:knows both fire and acid, from the business of forging and engraving, will @@ -2396,9 +3892,17 @@ N:171:of Umbar I:19:24:2 W:60:20:200:35000 P:0:4d1:18:18:0 -F:STR | CON | XTRA_MIGHT | AGGRAVATE | -F:RES_LITE | RES_DARK | RES_BLIND | RES_ELEC | -F:HIDE_TYPE | ACTIVATE | SHOW_MODS +F:ACTIVATE +F:AGGRAVATE +F:CON +F:HIDE_TYPE +F:RES_BLIND +F:RES_DARK +F:RES_ELEC +F:RES_LITE +F:SHOW_MODS +F:STR +F:XTRA_MIGHT a:UMBAR D:A great brazen arbalest with arms of gleaming steel, shooting quarrels with D:speed and power for those brave enough to risk betrayal. @@ -2411,8 +3915,13 @@ N:172:of Amrod I:19:12:2 W:25:10:30:9000 P:0:0d0:12:15:0 -F:STR | CON | XTRA_MIGHT | -F:RES_FIRE | RES_ELEC | RES_COLD | REGEN +F:CON +F:REGEN +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:STR +F:XTRA_MIGHT D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod D:and Amras, who both hunted with the Green-elves for a time. Like the D:twins, the bows are similar, for both protect their wielders from the @@ -2426,8 +3935,16 @@ N:173:of Amras I:19:12:1 W:25:10:30:9000 P:0:0d0:12:15:0 -F:INT | WIS | DEX | XTRA_SHOTS | XTRA_MIGHT | SPEED | -F:RES_FIRE | RES_ELEC | RES_COLD | SLOW_DIGEST +F:DEX +F:INT +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SLOW_DIGEST +F:SPEED +F:WIS +F:XTRA_MIGHT +F:XTRA_SHOTS D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod D:and Amras, who both hunted with the Green-elves for a time. Like the D:twins, the bows are similar, for both protect their wielders from the @@ -2441,10 +3958,21 @@ N:174:of Nain I:20:7:6 W:60:5:250:30000 P:0:3d8:12:18:0 -F:TUNNEL | INFRA | SEARCH | STR | ESP_ORC | CLIMB | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | -F:BRAND_ACID | RES_ACID | RES_DARK | RES_DISEN | F:ACTIVATE +F:BRAND_ACID +F:CLIMB +F:ESP_ORC +F:INFRA +F:RES_ACID +F:RES_DARK +F:RES_DISEN +F:SEARCH +F:SLAY_DRAGON +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:STR +F:TUNNEL a:STONE_MUD D:Wielded by Nain of the Iron Hills at the Battle of Azanulbizar, this great D:mattock brought victory to the Dwarves over Azog's Orcs - though Nain @@ -2457,10 +3985,20 @@ N:175:of Fundin Bluecloak I:21:6:4 W:25:100:130:60000 P:0:5d4:13:17:10 -F:STR | WIS | SPEED | LITE1 | HIDE_TYPE | -F:SLAY_EVIL | SLAY_UNDEAD | ACTIVATE | -F:RES_FIRE | RES_ELEC | RES_NETHER | RES_DISEN | HOLD_LIFE | +F:ACTIVATE F:COULD2H +F:HIDE_TYPE +F:HOLD_LIFE +F:LITE1 +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_NETHER +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SPEED +F:STR +F:WIS f:COULD2H a:FUNDIN D:The weapon of one of the great dwarven priests, with powers @@ -2474,9 +4012,16 @@ N:176:of the Haradrim I:34:4:2 W:35:12:120:25000 P:4:1d2:0:0:15 -F:ACTIVATE | -F:STR | CON | SUST_STR | SUST_CON | HIDE_TYPE | -F:RES_FEAR | RES_BLIND | RES_POIS | AGGRAVATE +F:ACTIVATE +F:AGGRAVATE +F:CON +F:HIDE_TYPE +F:RES_BLIND +F:RES_FEAR +F:RES_POIS +F:STR +F:SUST_CON +F:SUST_STR a:HARADRIM D:A great shield from the far lands of the South, whose wielder D:will go charging into battle heedless of danger, with the @@ -2489,11 +4034,22 @@ N:177:'Dolcrist' I:21:15:5 W:30:15:500:60000 P:0:5d4:11:23:20 -F:STR | TUNNEL | INFRA | HIDE_TYPE | -F:CURSED | AGGRAVATE | NO_MAGIC | ACTIVATE | -F:RES_NEXUS | RES_BLIND | RES_SOUND | -F:KILL_DRAGON | SLAY_ANIMAL | BRAND_POIS | BRAND_ELEC | +F:ACTIVATE +F:AGGRAVATE +F:BRAND_ELEC +F:BRAND_POIS F:COULD2H +F:CURSED +F:HIDE_TYPE +F:INFRA +F:KILL_DRAGON +F:NO_MAGIC +F:RES_BLIND +F:RES_NEXUS +F:RES_SOUND +F:SLAY_ANIMAL +F:STR +F:TUNNEL f:COULD2H a:SKULLCLEAVER D:This mighty bludgeon brings destruction to all around it, and is the @@ -2505,8 +4061,17 @@ N:178:of Eol I:31:2:3 W:55:35:25:40000 P:3:1d1:0:0:15 -F:INT | MANA | FREE_ACT | FEATHER | RES_ELEC | RES_DARK | RES_POIS | -F:ACTIVATE | LUCK | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:FEATHER +F:FREE_ACT +F:INT +F:LUCK +F:MANA +F:RES_DARK +F:RES_ELEC +F:RES_POIS +F:SPELL_CONTAIN +F:WIELD_CAST a:EOL D:The iron-shod gauntlets of the Dark Elven smith Eol, tingling with magics D:that he could channel in battle. @@ -2518,7 +4083,10 @@ N:179:of Nevrast I:30:3:3 W:20:8:40:35000 P:3:1d1:0:0:13 -F:STEALTH | CON | SPEED | HIDE_TYPE +F:CON +F:HIDE_TYPE +F:SPEED +F:STEALTH D:Footgear made of bear leather and set with opals, which grant the wearer D:silent, hasted movement. @@ -2529,7 +4097,11 @@ N:180:of Gimli I:30:6:4 W:40:8:60:22500 P:4:1d1:5:5:10 -F:INFRA | SEARCH | TUNNEL | CLIMB | HIDE_TYPE +F:CLIMB +F:HIDE_TYPE +F:INFRA +F:SEARCH +F:TUNNEL Z:magic map D:A set of iron-shod boots stamped by Gimli's combat prowess, a peerless D:ally to those journeying through halls of stone under mountains. @@ -2542,9 +4114,19 @@ N:181:of Gothmog I:115:55:-20 W:10:0:150:500 P:0:7d6:13:13:0 -F:SHOW_MODS | SLAY_DEMON | SLAY_EVIL | BRAND_FIRE | BRAND_POIS -F:LUCK | CHAOTIC | LITE1 | WOUNDING | RES_MORGUL | WIELD_CAST -F:HEAVY_CURSE | AUTO_CURSE +F:AUTO_CURSE +F:BRAND_FIRE +F:BRAND_POIS +F:CHAOTIC +F:HEAVY_CURSE +F:LITE1 +F:LUCK +F:RES_MORGUL +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:WIELD_CAST +F:WOUNDING # The Demonshield of Gothmog @@ -2553,9 +4135,18 @@ N:182:of Gothmog I:115:56:4 W:15:0:70:500 P:13:1d1:0:0:13 -F:DEX | INVIS | SUST_STR | SUST_CON | SUST_DEX -F:FEATHER | SH_FIRE | FREE_ACT | HOLD_LIFE -F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST +F:AUTO_CURSE +F:DEX +F:FEATHER +F:FREE_ACT +F:HEAVY_CURSE +F:HOLD_LIFE +F:INVIS +F:SH_FIRE +F:SUST_CON +F:SUST_DEX +F:SUST_STR +F:WIELD_CAST # The Demonhorn of Gothmog @@ -2564,9 +4155,15 @@ N:183:of Gothmog I:115:57:-5 W:20:0:30:500 P:2:1d1:0:0:13 -F:LITE2 | REGEN | ESP_DEMON -F:CHR | SLOW_DIGEST | SEE_INVIS -F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST +F:AUTO_CURSE +F:CHR +F:ESP_DEMON +F:HEAVY_CURSE +F:LITE2 +F:REGEN +F:SEE_INVIS +F:SLOW_DIGEST +F:WIELD_CAST # The Elven cloak of Peregrin Took # From T-Plus by Ingeborg S. Norden @@ -2575,7 +4172,14 @@ N:184:of Peregrin Took I:35:2:3 W:10:10:10:12500 P:4:0d0:0:0:16 -F:ACTIVATE | CHR | DEX | HIDE_TYPE | INVIS | LUCK | SEARCH | STEALTH +F:ACTIVATE +F:CHR +F:DEX +F:HIDE_TYPE +F:INVIS +F:LUCK +F:SEARCH +F:STEALTH a:CURE_HUNGER D:This simple-looking cloak, dyed in hues that blend into the woodlands, was a gift D:from the elves of Lothlorien to the halfling Peregrin Took. Its wearer has an @@ -2589,9 +4193,21 @@ N:185:of Tom Bombadil I:14:59:4 W:80:60:20:150000 P:0:3d4:0:0:0 -F:ACTIVATE | BLESSED | CHR | ESP_UNDEAD | FREE_ACT | -F:HIDE_TYPE | HOLD_LIFE | LIFE | LUCK | RES_FEAR | -F:RES_SOUND | SEARCH | SEE_INVIS | STEALTH | SUST_CHR +F:ACTIVATE +F:BLESSED +F:CHR +F:ESP_UNDEAD +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:LIFE +F:LUCK +F:RES_FEAR +F:RES_SOUND +F:SEARCH +F:SEE_INVIS +F:STEALTH +F:SUST_CHR a:PROT_EVIL D:This small, serviceable wooden harp once belonged to Tom Bombadil-- D:a mysterious figure whose song prevented the Wight-King from @@ -2605,11 +4221,30 @@ N:186:of Radagast I:21:3:2 W:100:120:150:180000 P:0:2d9:10:13:0 -F:ACTIVATE | BLESSED | CHR | ESP_ANIMAL | ESP_EVIL | -F:HIDE_TYPE | INFRA | INT | MANA | RES_COLD | RES_ELEC | -F:RES_FIRE | RES_MORGUL | SEARCH | SEE_INVIS | SHOW_MODS | -F:SLAY_ANIMAL | SLAY_EVIL | SPELL | SPELL_CONTAIN | -F:STEALTH | WATER_BREATH | WIELD_CAST | WIS +F:ACTIVATE +F:BLESSED +F:CHR +F:ESP_ANIMAL +F:ESP_EVIL +F:HIDE_TYPE +F:INFRA +F:INT +F:MANA +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_MORGUL +F:SEARCH +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_ANIMAL +F:SLAY_EVIL +F:SPELL +F:SPELL_CONTAIN +F:STEALTH +F:WATER_BREATH +F:WIELD_CAST +F:WIS a:RADAGAST Z:grow trees D:Rumoured to be a gift from Yavanna to Radagast the Brown, this @@ -2626,9 +4261,20 @@ N:187:'Valaroma' I:14:60:4 W:80:60:15:90000 P:0:3d4:0:0:0 -F:ACTIVATE | BLESSED | CON | ESP_ANIMAL | ESP_EVIL | -F:FREE_ACT | HIDE_TYPE | LUCK | RES_CONF | RES_FEAR | -F:RES_SOUND | SEARCH | SEE_INVIS | STEALTH +F:ACTIVATE +F:BLESSED +F:CON +F:ESP_ANIMAL +F:ESP_EVIL +F:FREE_ACT +F:HIDE_TYPE +F:LUCK +F:RES_CONF +F:RES_FEAR +F:RES_SOUND +F:SEARCH +F:SEE_INVIS +F:STEALTH a:VALAROMA D:This heavenly instrument, wrought from gleaming silver, most D:often appears in the hands of the Valarin huntsman Orome; yet @@ -2643,9 +4289,20 @@ N:188:'Menelcol' I:35:1:5 W:70:70:10:27500 P:1:0d0:0:0:25 -F:ACTIVATE | CHR | FLY | HIDE_TYPE | IM_ELEC | INFRA | -F:LITE1 | MAGIC_BREATH | RES_COLD | RES_DARK | RES_LITE | -F:SEARCH | SEE_INVIS | SUST_CHR +F:ACTIVATE +F:CHR +F:FLY +F:HIDE_TYPE +F:IM_ELEC +F:INFRA +F:LITE1 +F:MAGIC_BREATH +F:RES_COLD +F:RES_DARK +F:RES_LITE +F:SEARCH +F:SEE_INVIS +F:SUST_CHR a:GILGALAD D:This deep-blue velvet cloak, embroidered with silvery stars, sheds a D:celestial light that reveals hidden things and bestows unearthly @@ -2659,9 +4316,18 @@ N:189:of Ghan-buri-Ghan I:36:1:2 W:25:10:20:30000 P:2:0d0:0:0:32 -F:CON | HIDE_TYPE | LIFE | RES_COLD | RES_FIRE | -F:RES_POIS | RES_SOUND | STR | SUST_CON | -F:SUST_STR | SUST_WIS | WIS +F:CON +F:HIDE_TYPE +F:LIFE +F:RES_COLD +F:RES_FIRE +F:RES_POIS +F:RES_SOUND +F:STR +F:SUST_CON +F:SUST_STR +F:SUST_WIS +F:WIS Z:poison dart D:The wrappings of a leader among the wild Men of Druadan D:forest. It contains a multitude of tiny pockets filled @@ -2674,7 +4340,12 @@ N:190:of Ghan-buri-Ghan I:35:1:5 W:30:15:10:25000 P:1:0d0:5:5:13 -F:DEX | HIDE_TYPE | INVIS | SPEED | STEALTH | SUST_DEX +F:DEX +F:HIDE_TYPE +F:INVIS +F:SPEED +F:STEALTH +F:SUST_DEX Z:berserk D:This dark-coloured cloak once belonged to the leader of the D:Druedain. As you put it on, you feel safer from attempts to @@ -2687,8 +4358,16 @@ N:191:of Gondor I:39:108:-3 W:60:30:50:50000 P:0:0d0:0:0:0 -F:ACTIVATE | ESP_UNDEAD | HIDE_TYPE | INSTA_ART | INVIS | -F:LITE1 | RES_CHAOS | RES_DARK | RES_NETHER | STEALTH +F:ACTIVATE +F:ESP_UNDEAD +F:HIDE_TYPE +F:INSTA_ART +F:INVIS +F:LITE1 +F:RES_CHAOS +F:RES_DARK +F:RES_NETHER +F:STEALTH a:SUMMON_UNDEAD D:A large banner of pure black, strangely gleaming with a dark light D:that is faint and at the same time so bright it attracts attention. @@ -2700,8 +4379,15 @@ N:192:of Saruman I:6:1:4 W:60:80:12:60000 P:0:1d4:5:5:0 -F:ACTIVATE | HIDE_TYPE | INT | MANA | SHOW_MODS | SPEED | -F:SPELL | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:HIDE_TYPE +F:INT +F:MANA +F:SHOW_MODS +F:SPEED +F:SPELL +F:SPELL_CONTAIN +F:WIELD_CAST a:BA_COLD_1 Z:weigh magic D:A white quarterstaff that faintly gleams a pale white, it once belonged @@ -2716,8 +4402,18 @@ N:193:of Curunir I:36:2:10 W:60:80:20:2000000 P:2:0d0:-40:-40:36 -F:ACTIVATE | HIDE_TYPE | IM_COLD | IM_ELEC | SPEED | SPELL_CONTAIN | -F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | WIELD_CAST +F:ACTIVATE +F:HIDE_TYPE +F:IM_COLD +F:IM_ELEC +F:SPEED +F:SPELL_CONTAIN +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:WIELD_CAST a:BA_ELEC_2 D:The white robe of the Istari wizard Curunir, known on Middle-earth as D:Saruman the White and Saruman of Many Colours. Imbued with cold and @@ -2731,7 +4427,11 @@ N:194:of Brand I:19:23:10 W:30:10:110:40000 P:0:0d0:5:7:0 -F:ACTIVATE | HIDE_TYPE | RES_COLD | SHOW_MODS | STEALTH +F:ACTIVATE +F:HIDE_TYPE +F:RES_COLD +F:SHOW_MODS +F:STEALTH a:RUNE_EXPLO D:The bow of Brand, last King of Dale. It was given to him D:as a gift by the King under the Mountain of Erebor, and @@ -2744,7 +4444,11 @@ N:195:'Nimphelos' I:39:109:1 W:20:10:10:40000 P:0:1d1:0:0:0 -F:HIDE_TYPE | INFRA | INSTA_ART | LITE3 | SEARCH +F:HIDE_TYPE +F:INFRA +F:INSTA_ART +F:LITE3 +F:SEARCH Z:dazzle D:It was a gift from the Falas-Elves to the Naugrim who built Menegroth, D:the abode of Thingol and Melian. It shines like starlight on the waves @@ -2757,10 +4461,26 @@ N:196:of Flames I:39:110:2 W:75:90:200:100000 P:0:10d10:0:0:0 -F:ACTIVATE | AUTO_CURSE | CURSED | DRAIN_EXP | DRAIN_MANA | -F:ESP_EVIL | HEAVY_CURSE | HIDE_TYPE | INSTA_ART | LITE2 | -F:LITE3 | RES_CHAOS | RES_DARK | RES_FIRE | RES_LITE | -F:RES_NETHER | RES_NEXUS | RES_SHARDS | SEE_INVIS | STR +F:ACTIVATE +F:AUTO_CURSE +F:CURSED +F:DRAIN_EXP +F:DRAIN_MANA +F:ESP_EVIL +F:HEAVY_CURSE +F:HIDE_TYPE +F:INSTA_ART +F:LITE2 +F:LITE3 +F:RES_CHAOS +F:RES_DARK +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_SHARDS +F:SEE_INVIS +F:STR a:INVULN Z:banish evil D:A Silmaril of Feanor. It shines with the unquenchable light of the @@ -2778,9 +4498,24 @@ N:197:of the Seas I:39:111:2 W:75:90:200:100000 P:0:10d10:0:0:0 -F:ACTIVATE | AUTO_CURSE | CURSED | DRAIN_EXP | DRAIN_HP | ESP_EVIL | -F:HEAVY_CURSE | HIDE_TYPE | INSTA_ART | INT | LITE2 | LITE3 | -F:RES_CHAOS | RES_DARK | RES_LITE | RES_NETHER | RES_NEXUS | SEE_INVIS +F:ACTIVATE +F:AUTO_CURSE +F:CURSED +F:DRAIN_EXP +F:DRAIN_HP +F:ESP_EVIL +F:HEAVY_CURSE +F:HIDE_TYPE +F:INSTA_ART +F:INT +F:LITE2 +F:LITE3 +F:RES_CHAOS +F:RES_DARK +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:SEE_INVIS a:RECALL Z:banish evil D:A Silmaril of Feanor. It shines with the unquenchable light of the @@ -2797,8 +4532,19 @@ N:198:of Numenor I:12:2:-3 W:50:40:24:80000 P:0:0d0:0:0:0 -F:ACTIVATE | AUTO_CURSE | CHR | CON | CURSED | HEAVY_CURSE | -F:INSTA_ART | LUCK | SPEED | SPELL_CONTAIN | STR | WIELD_CAST | WRAITH +F:ACTIVATE +F:AUTO_CURSE +F:CHR +F:CON +F:CURSED +F:HEAVY_CURSE +F:INSTA_ART +F:LUCK +F:SPEED +F:SPELL_CONTAIN +F:STR +F:WIELD_CAST +F:WRAITH a:DISP_GOOD D:The chief mark of royalty in Westernesse, it is said to have perished D:in the fall of Numenor. It once belonged to Ar-Pharazon the Golden and @@ -2810,8 +4556,15 @@ N:199:of Annuminas I:12:3:4 W:60:50:24:80000 P:0:0d0:0:0:0 -F:ACTIVATE | BLESSED | CHR | FREE_ACT | INSTA_ART | LUCK | -F:RES_CONF | SPELL_CONTAIN | WIELD_CAST +F:ACTIVATE +F:BLESSED +F:CHR +F:FREE_ACT +F:INSTA_ART +F:LUCK +F:RES_CONF +F:SPELL_CONTAIN +F:WIELD_CAST a:RUNE_PROT D:The chief mark of royalty in Arnor, possibly the oldest remaining work D:of Men. It came from Numenor, but it belonged to the Lords of Andunie @@ -2824,9 +4577,21 @@ N:200:of Taniquetil I:39:4:2 W:75:60:200:100000 P:0:1d1:0:0:0 -F:ACTIVATE | BLESSED | ESP_ALL | HIDE_TYPE | INFRA | INT | -F:LITE1 | LITE2 | LITE3 | RES_BLIND | RES_LITE | SEARCH | -F:SEE_INVIS | WATER_BREATH | WIS +F:ACTIVATE +F:BLESSED +F:ESP_ALL +F:HIDE_TYPE +F:INFRA +F:INT +F:LITE1 +F:LITE2 +F:LITE3 +F:RES_BLIND +F:RES_LITE +F:SEARCH +F:SEE_INVIS +F:WATER_BREATH +F:WIS a:PALANTIR Z:detect curses D:This holy lamp once belonged to a seeress who warned Ar-Pharazon of @@ -2842,7 +4607,8 @@ N:201: I:9:1:0 W:200:1:10:0 P:0:1d1:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # The Palantir of Orthanc @@ -2851,9 +4617,19 @@ N:202:of Orthanc I:39:104:2 W:75:60:200:100000 P:0:10d10:0:0:0 -F:WIS | INT | SEARCH | INFRA | HIDE_TYPE | ACTIVATE | ESP_ALL | -F:SEE_INVIS | RES_BLIND | AGGRAVATE | DRAIN_MANA | LITE2 +F:ACTIVATE +F:AGGRAVATE +F:DRAIN_MANA +F:ESP_ALL +F:HIDE_TYPE +F:INFRA F:INSTA_ART +F:INT +F:LITE2 +F:RES_BLIND +F:SEARCH +F:SEE_INVIS +F:WIS a:PALANTIR D:A shining white ball of unbreakable crystal, the ancient Palantiri D:were used by kings of Numenor and later by the Exiles for rapid @@ -2868,10 +4644,19 @@ N:203:'Fuin' I:45:55:15 W:110:0:2:3000000 P:0:1d1:0:0:0 -F:SPEED | SEE_INVIS | LUCK | MAGIC_BREATH -F:CURSED | HEAVY_CURSE | REGEN -F:WRAITH | IM_NETHER | DRAIN_EXP | HOLD_LIFE | SPECIAL_GENE | +F:CURSED +F:DRAIN_EXP +F:HEAVY_CURSE +F:HOLD_LIFE +F:IM_NETHER F:INSTA_ART +F:LUCK +F:MAGIC_BREATH +F:REGEN +F:SEE_INVIS +F:SPECIAL_GENE +F:SPEED +F:WRAITH Z:teleport D:Imbued with the screams of the victims of undead everywhere, this D:ring is more a hole in reality than anything else. Strange forces ripple over @@ -2886,7 +4671,23 @@ N:204:'Coimir' I:40:18:2 W:80:120:3:120000 P:0:0d0:0:0:0 -F:FREE_ACT | HIDE_TYPE | HOLD_LIFE | INSTA_ART | LIFE | LITE1 | LUCK | REGEN | RES_NETHER | SLOW_DIGEST | SPECIAL_GENE | SPELL_CONTAIN | SUST_CON | SUST_DEX | SUST_STR | WATER_BREATH | WIELD_CAST +F:FREE_ACT +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:LIFE +F:LITE1 +F:LUCK +F:REGEN +F:RES_NETHER +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPELL_CONTAIN +F:SUST_CON +F:SUST_DEX +F:SUST_STR +F:WATER_BREATH +F:WIELD_CAST Z:restore life D:Called 'Life-jewel' by the Vanyar of old, this flawless sapphire D:pendant bears potent runes that preserve body and soul. @@ -2896,10 +4697,26 @@ D:pendant bears potent runes that preserve body and soul. N:205:of Durin I:45:57:2 W:70:70:2:65000 -F:CON | CHR | STR | SUST_CHR | SUST_CON | SUST_STR | HIDE_TYPE | -F:ESP_EVIL | AGGRAVATE | HEAVY_CURSE | HOLD_LIFE | DRAIN_EXP | -F:RES_DARK | RES_CHAOS | RES_NETHER | RES_COLD | RES_ACID | -F:INSTA_ART | SPECIAL_GENE | CURSED +F:AGGRAVATE +F:CHR +F:CON +F:CURSED +F:DRAIN_EXP +F:ESP_EVIL +F:HEAVY_CURSE +F:HIDE_TYPE +F:HOLD_LIFE +F:INSTA_ART +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_DARK +F:RES_NETHER +F:SPECIAL_GENE +F:STR +F:SUST_CHR +F:SUST_CON +F:SUST_STR Z:Midas touch D:The greatest of the Seven Rings of the Dwarf-lords, and the last to be D:lost. Alone among the Seven, it was not taken by Sauron when he made @@ -2914,9 +4731,18 @@ N:206:'Elessar' I:40:19:4 W:60:60:3:40000 P:0:0d0:7:7:10 -F:STR | WIS | CHR | SPEED | LITE3 | INSTA_ART | -F:RES_FEAR | RES_FIRE | RES_POIS | RES_DISEN | HIDE_TYPE | F:ACTIVATE +F:CHR +F:HIDE_TYPE +F:INSTA_ART +F:LITE3 +F:RES_DISEN +F:RES_FEAR +F:RES_FIRE +F:RES_POIS +F:SPEED +F:STR +F:WIS a:ELESSAR D:This green gem glows with inner light. Aragorn son of Arathorn wore D:it at the Battle of the Pelennor Fields, and he was himself given the @@ -2928,9 +4754,18 @@ D:name of 'Elessar' by the people of Gondor because of this. N:207:'Evenstar' I:40:20:3 W:50:50:3:35000 -F:HOLD_LIFE | SUST_CON | SUST_WIS | SUST_INT | LITE1 | CON | -F:RES_DARK | RES_COLD | RES_NETHER | REGEN | INSTA_ART | F:ACTIVATE +F:CON +F:HOLD_LIFE +F:INSTA_ART +F:LITE1 +F:REGEN +F:RES_COLD +F:RES_DARK +F:RES_NETHER +F:SUST_CON +F:SUST_INT +F:SUST_WIS a:REST_ALL D:A pure white jewel, the last gift of Queen Arwen Undomiel to Frodo D:Baggins, intended to be worn around his neck on the chain that had @@ -2942,9 +4777,20 @@ N:208:of Minas Ithil I:39:107:-3 W:75:60:200:0 P:0:10d10:0:0:-30 -F:LIFE | CON | INT | WIS | ESP_ALL | LITE3 | LITE1 -F:CURSED | HEAVY_CURSE | TY_CURSE | DRAIN_EXP | -F:RES_BLIND | SEE_INVIS | ACTIVATE +F:ACTIVATE +F:CON +F:CURSED +F:DRAIN_EXP +F:ESP_ALL +F:HEAVY_CURSE +F:INT +F:LIFE +F:LITE1 +F:LITE3 +F:RES_BLIND +F:SEE_INVIS +F:TY_CURSE +F:WIS a:PALANTIR D:A shining white ball of unbreakable crystal, the ancient Palantiri D:were used by kings of Numenor and later by the Exiles for rapid @@ -2960,7 +4806,8 @@ N:209:of Thror I:8:33:0 W:70:100:30:1 P:0:0d0:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE D:A map made by Thror, the King under the Mountain. It shows the Lonely D:Mountain of Erebor, the Running River, and the lands about devastated by D:Smaug. It also contains mention of a secret entrance to the Mountain. @@ -2972,7 +4819,8 @@ N:210:of Thorin I:11:13:0 W:70:100:5:1 P:0:0d0:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE D:A small silver key, given to Thorin Oakenshield by Gandalf the Grey, D:who got it from Thrain, Thorin's father, in Dol Guldur. It opens a D:magical gate to a special cavern in the Lonely Mountain - you will @@ -2984,7 +4832,11 @@ N:211:of Thror I:11:14:0 W:70:100:50:100000 P:0:0d0:0:0:0 -F:ACTIVATE | ACTIVATE_NO_WIELD | HIDE_TYPE | INSTA_ART | SPECIAL_GENE +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:HIDE_TYPE +F:INSTA_ART +F:SPECIAL_GENE a:ALCHEMY D:It was made for Thror, King under the Mountain. It is a huge golden bowl D:with two handles, hammered and carved, with birds and flowers whose eyes @@ -2996,7 +4848,10 @@ N:212:of Gondor I:11:15:0 W:40:70:2:70000 P:0:0d0:0:0:0 -F:ACTIVATE | ACTIVATE_NO_WIELD | HIDE_TYPE | INSTA_ART +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:HIDE_TYPE +F:INSTA_ART a:BOROMIR D:The summons of Gondor, an arrow sent as a symbol of desperate need from D:Gondor to its northern allies, the Rohirrim. The tradition dates back to @@ -3012,10 +4867,20 @@ N:213:of Forochel I:6:1:3 W:65:70:60:60000 P:0:3d4:-12:-8:0 -F:INT | WIS | MANA | SPELL | INFRA | SEE_INVIS | -F:SUST_INT | SUST_WIS | RES_BLIND | IM_COLD | SENS_FIRE | -F:SPECIAL_GENE | WIELD_CAST | F:COULD2H +F:IM_COLD +F:INFRA +F:INT +F:MANA +F:RES_BLIND +F:SEE_INVIS +F:SENS_FIRE +F:SPECIAL_GENE +F:SPELL +F:SUST_INT +F:SUST_WIS +F:WIELD_CAST +F:WIS f:COULD2H D:A shaft of pure, invincible crystal cut from the heart of one D:of the great glaciers ringing the Ice-Bay of Forochel. @@ -3028,8 +4893,15 @@ N:214:of Mellyrn I:35:2:4 W:40:40:5:65000 P:4:0d0:0:0:20 -F:HIDE_TYPE | INVIS | DEX | SPEED | STEALTH | LUCK | -F:SUST_DEX | RES_LITE | RES_DARK +F:DEX +F:HIDE_TYPE +F:INVIS +F:LUCK +F:RES_DARK +F:RES_LITE +F:SPEED +F:STEALTH +F:SUST_DEX D:Bearing the same lyrical name as the great trees of Lothlorien D:and containing in its close-woven folds the speed and skill of D:the Galadrim, this grey cloak is ideal for those who travel in @@ -3042,8 +4914,17 @@ N:215:of Ephel Duath I:23:31:-3 W:60:60:50:30000 P:0:2d6:-20:-18:0 -F:STR | WIS | CHR | BRAND_POIS | VAMPIRIC | VORPAL | -F:INVIS | AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | +F:AGGRAVATE +F:BRAND_POIS +F:CHR +F:CURSED +F:HEAVY_CURSE +F:INVIS +F:SHOW_MODS +F:STR +F:VAMPIRIC +F:VORPAL +F:WIS D:This filthy orc-blade is famed for vile deeds of torture and blood, D:and its wielder will never cease to fear treachery. @@ -3054,10 +4935,21 @@ N:216:'Garachoth' I:24:30:2 W:70:50:400:0 P:0:7d5:18:18:-20 -F:STR | CON | SPEED | LEVELS | BLACK_BREATH | -F:KILL_DEMON | SLAY_ANIMAL | BRAND_FIRE | VORPAL | -F:RES_FEAR | RES_FIRE | RES_CHAOS | RES_NETHER | -F:HIDE_TYPE | SHOW_MODS +F:BLACK_BREATH +F:BRAND_FIRE +F:CON +F:HIDE_TYPE +F:KILL_DEMON +F:LEVELS +F:RES_CHAOS +F:RES_FEAR +F:RES_FIRE +F:RES_NETHER +F:SHOW_MODS +F:SLAY_ANIMAL +F:SPEED +F:STR +F:VORPAL D:A ghastly axe with the soul of a demon lord trapped inside, this horrifying D:creation reverberates with the screams of the damned. As you gaze into its D:glassy, translucent blade, it seems that endless sulphrous wastelands @@ -3070,9 +4962,19 @@ N:217:'Skycleaver' I:31:5:1 W:40:45:40:100000 P:5:1d1:16:7:16 -F:STR | CON | DEX | CHR | LUCK | FLY | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:HIDE_TYPE | SHOW_MODS +F:CHR +F:CON +F:DEX +F:FLY +F:HIDE_TYPE +F:LUCK +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:SHOW_MODS +F:STR D:The handgear of a legendary dragonslaying hero. The wearer of these D:wyrmskin gauntlets will be versed in all aerial ways, and will fear no D:dragon that walks or flies. @@ -3085,9 +4987,16 @@ N:218:of the Machine I:30:6:3 W:30:100:170:19000 P:6:1d1:0:0:24 -F:INT | SPEED | TUNNEL | AGGRAVATE | -F:RES_CHAOS | RES_SHARDS | RES_CONF | -F:ESP_NONLIVING | HIDE_TYPE | SPECIAL_GENE +F:AGGRAVATE +F:ESP_NONLIVING +F:HIDE_TYPE +F:INT +F:RES_CHAOS +F:RES_CONF +F:RES_SHARDS +F:SPECIAL_GENE +F:SPEED +F:TUNNEL D:A massive pair of adamantine boots studded with gold, the final and D:greatest product of the petty-dwarven magical forge. Despite D:the great powers they contain, they are heavy and awkward enough to @@ -3102,7 +5011,18 @@ N:219:of Belegaer I:36:2:5 W:100:200:20:1500000 P:2:0d0:0:0:20 -F:FREE_ACT | HIDE_TYPE | IM_ACID | IM_COLD | IM_ELEC | LITE1 | LUCK | RES_BLIND | RES_DARK | SEARCH | STEALTH | WATER_BREATH +F:FREE_ACT +F:HIDE_TYPE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:LITE1 +F:LUCK +F:RES_BLIND +F:RES_DARK +F:SEARCH +F:STEALTH +F:WATER_BREATH D:This pearl-trimmed blue robe was created by a Maia loremaster in D:Ulmo's service. No ocean storm can harm its wearer or anything D:he carries; the pressure and darkness of deep water cannot hinder @@ -3114,7 +5034,13 @@ N:220:of Girion I:40:4:5 W:20:5:2:15000 P:0:1d1:0:0:10 -F:ACTIVATE | CHR | INSTA_ART | RES_NEXUS | RES_POIS | SEE_INVIS | SUST_CHR +F:ACTIVATE +F:CHR +F:INSTA_ART +F:RES_NEXUS +F:RES_POIS +F:SEE_INVIS +F:SUST_CHR a:GROW_MOLD D:A necklace of emeralds, green as the grass. It once belonged to Girion, D:King of Dale, and was given to the Dwarves of the Lonely Mountain as @@ -3127,7 +5053,11 @@ N:221:'Dailir' I:18:3:5 W:85:40:3:35000 P:0:8d5:15:20:0 -F:CRIT | HIDE_TYPE | SHOW_MODS | VORPAL | WOUNDING +F:CRIT +F:HIDE_TYPE +F:SHOW_MODS +F:VORPAL +F:WOUNDING D:The beloved dart of Beleg Cuthalion. It never failed to be found D:unharmed, until it broke when Beleg fell upon it while he was D:carrying Turin Turambar away from an Orc-camp, the night Beleg @@ -3141,7 +5071,12 @@ N:222:of Faramir I:40:29:5 W:10:2:2:10000 P:0:0d0:18:0:8 -F:HIDE_TYPE | INSTA_ART | RES_CONF | SHOW_MODS | STEALTH | SUST_DEX +F:HIDE_TYPE +F:INSTA_ART +F:RES_CONF +F:SHOW_MODS +F:STEALTH +F:SUST_DEX D:A slim neckpiece of True-silver, with quiet spells of Ithilien to aid and D:protect the wearer. @@ -3152,7 +5087,12 @@ N:223:of Earendil I:34:8:0 W:95:80:100:90000 P:20:1d1:0:0:80 -F:ACTIVATE | RES_BLIND | RES_DARK | RES_ELEC | RES_FIRE | RES_NETHER +F:ACTIVATE +F:RES_BLIND +F:RES_DARK +F:RES_ELEC +F:RES_FIRE +F:RES_NETHER a:BLADETURNER D:A shining shield, once borne by the great mariner Earendil, "scored with D:runes to keep all wounds and harm from him". @@ -3163,8 +5103,14 @@ N:224:of Legolas I:19:13:3 W:40:20:40:30000 P:0:0d0:17:19:0 -F:XTRA_MIGHT | XTRA_SHOTS | FREE_ACT | HIDE_TYPE | ESP_ORC | -F:STEALTH | INFRA | DEX +F:DEX +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:INFRA +F:STEALTH +F:XTRA_MIGHT +F:XTRA_SHOTS D:The great bow of Legolas, one of the Nine Walkers of old. D:Handcrafted specially for Thranduil's son in Lothlorien, D:this bow gives clarity of sight and agility to the wielder. @@ -3175,8 +5121,14 @@ N:225:of Erkenbrand I:34:5:3 W:40:9:120:200000 P:0:0d0:0:0:30 -F:REFLECT | STR | CHR | SUST_DEX | HIDE_TYPE | ESP_ORC | -F:FREE_ACT | REGEN +F:CHR +F:ESP_ORC +F:FREE_ACT +F:HIDE_TYPE +F:REFLECT +F:REGEN +F:STR +F:SUST_DEX D:Tall and strong stood Erkenbrand, Lord of the Westfold, as he rode D:to combat the forces of Isengard. The valour of Helm Hammerhand lived D:again in him. This shield is painted red according to Rohan custom @@ -3207,12 +5159,39 @@ N:241:of the Eruchin I:21:10:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE | -F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK | -F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE | -F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL | -F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON | -F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:A weapon forged by Aule himself and blessed by Eru Iluvatar, D:calling upon the strength of all his children (hence the name, @@ -3225,12 +5204,39 @@ N:242:of Ulmo I:22:5:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE | -F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK | -F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE | -F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL | -F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON | -F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:The awesome weapon of the Vala Ulmo, Lord of Waters. Mightiest of all the D:powers of good save Manwe himself, Ulmo laughs in scorn at the dread powers @@ -3242,12 +5248,39 @@ N:243:of Aule I:24:11:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE | -F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK | -F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE | -F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL | -F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON | -F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:Aule's mighty weapon, granted to you to aid the defeat of Melkor. @@ -3257,12 +5290,39 @@ N:244:of Vaire I:23:7:10 W:127:220:130:9000000 P:0:5d6:21:26:50 -F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE | CHR | -F:CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK | NO_MAGIC | -F:PRECOGNITION | REGEN | RES_DARK | RES_FIRE | SEE_INVIS | SHOW_MODS | -F:SLAY_DEMON | SLAY_EVIL | SLAY_TROLL | SLAY_UNDEAD | SLOW_DIGEST | -F:SPECIAL_GENE | SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | -F:SUST_WIS | ULTIMATE | VORPAL +F:ACTIVATE +F:BLESSED +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:CHR +F:CON +F:FREE_ACT +F:IM_COLD +F:LIFE +F:LITE1 +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REGEN +F:RES_DARK +F:RES_FIRE +F:SEE_INVIS +F:SHOW_MODS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_TROLL +F:SLAY_UNDEAD +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:VORPAL a:ERU D:A shining rapier used by Vaire to cut the strings of time when D:dire need arises. Its power with that of the Flame Imperishable @@ -3274,12 +5334,38 @@ N:245:of Irmo I:19:13:5 W:127:220:130:8000000 P:0:0d0:36:28:0 -F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT | -F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION | -F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN | -F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH | -F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | -F:SUST_WIS | ULTIMATE | XTRA_MIGHT | XTRA_SHOTS +F:CON +F:DEX +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:FLY +F:FREE_ACT +F:IM_ELEC +F:INFRA +F:INVIS +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REFLECT +F:RES_BLIND +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:SEE_INVIS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:XTRA_MIGHT +F:XTRA_SHOTS D:A gift from Orome to Irmo, a mighty bow that sings the songs of the D:garden of Lorien. It will guide your hand and steady your grip in D:your encounter with Melkor. @@ -3290,12 +5376,38 @@ N:246:of Nessa I:19:2:5 W:127:220:130:8000000 P:0:0d0:36:28:0 -F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT | -F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION | -F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN | -F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH | -F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | -F:ULTIMATE | XTRA_MIGHT | XTRA_SHOTS +F:CON +F:DEX +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:FLY +F:FREE_ACT +F:IM_ELEC +F:INFRA +F:INVIS +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REFLECT +F:RES_BLIND +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:SEE_INVIS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:XTRA_MIGHT +F:XTRA_SHOTS D:This sling was made for the most lithe of the Valier to provide D:her with amusement as she used it to shoot magical pebbles of D:cheer and charm while dancing in the lush green fields of Valinor. @@ -3307,12 +5419,38 @@ N:247:of Varda I:15:4:5 W:127:220:130:8000000 P:0:0d0:36:28:0 -F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT | -F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION | -F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN | -F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH | -F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | -F:ULTIMATE | XTRA_MIGHT | XTRA_SHOTS +F:CON +F:DEX +F:ESP_EVIL +F:ESP_ORC +F:ESP_TROLL +F:FLY +F:FREE_ACT +F:IM_ELEC +F:INFRA +F:INVIS +F:LUCK +F:NO_MAGIC +F:PRECOGNITION +F:REFLECT +F:RES_BLIND +F:RES_CHAOS +F:RES_CONF +F:RES_DISEN +F:SEE_INVIS +F:SLOW_DIGEST +F:SPECIAL_GENE +F:SPEED +F:STEALTH +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS +F:ULTIMATE +F:XTRA_MIGHT +F:XTRA_SHOTS D:Made from living starlight, this boomerang will dispel the darkest D:of darkness. It is a gift from Varda Elentari, to aid you in your D:task. @@ -3323,11 +5461,33 @@ N:248:of Mandos I:40:27:0 W:100:16:60:500000 P:0:2d4:0:0:85 -F:ACTIVATE | ESP_DRAGON | FEATHER | FLY | HOLD_LIFE | IGNORE_ACID | -F:IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | REGEN | RES_ACID | -F:RES_BLIND | RES_CHAOS | RES_COLD | RES_CONF | RES_DARK | RES_DISEN | -F:RES_ELEC | RES_FIRE | RES_LITE | RES_NETHER | RES_NEXUS | RES_POIS | -F:RES_SHARDS | RES_SOUND | SPECIAL_GENE | ULTIMATE +F:ACTIVATE +F:ESP_DRAGON +F:FEATHER +F:FLY +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_BLIND +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:RES_SHARDS +F:RES_SOUND +F:SPECIAL_GENE +F:ULTIMATE a:BLADETURNER D:This amulet contains the power of Mandos, the Doomsman of the D:Valar. It will grant you protection against the foul dark magic diff --git a/lib/mods/theme/edit/d_info.txt b/lib/mods/theme/edit/d_info.txt index bfdf6142..149c2a73 100644 --- a/lib/mods/theme/edit/d_info.txt +++ b/lib/mods/theme/edit/d_info.txt @@ -37,7 +37,9 @@ W:0:0:0:14:500 L:89:80:199:20:1:0 A:96:100:56:0:56:0:57:58 O:20:20:20:20 -F:PRINCIPAL | FLAT | NO_RECALL +F:FLAT +F:NO_RECALL +F:PRINCIPAL R:100:0 ### The principal dungeons, they were created by spliting the vanilla dungeon ### @@ -48,8 +50,11 @@ W:11:33:5:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 -F:PRINCIPAL | NO_DOORS | NO_DESTROY | FLAT F:FILL_METHOD_0 +F:FLAT +F:NO_DESTROY +F:NO_DOORS +F:PRINCIPAL R:100:0 N:2:Barad-Dur @@ -60,8 +65,12 @@ L:0:100:0 A:97:50:56:50:56:0:57:97 A:0:100:0 O:20:20:20:20 -F:PRINCIPAL | LAVA_RIVER | CAVERN | NO_STREAMERS -F:FILL_METHOD_2 | NO_RECALL +F:CAVERN +F:FILL_METHOD_2 +F:LAVA_RIVER +F:NO_RECALL +F:NO_STREAMERS +F:PRINCIPAL R:100:0 N:3:Angband @@ -70,9 +79,13 @@ W:67:100:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:PRINCIPAL | CAVERN | NO_EASY_MOVE | NO_RECALL -F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1_2 +F:CAVERN F:FILL_METHOD_0 +F:NO_EASY_MOVE +F:NO_RECALL +F:PRINCIPAL R:100:0 N:4:Barrow-Downs @@ -84,8 +97,9 @@ L:88:78:89:18:199:4 A:96:80:97:19:57:1:57:97 A:100:0:0 O:20:20:20:20 -F:PRINCIPAL | FLAT F:FILL_METHOD_3 +F:FLAT +F:PRINCIPAL R:25:1 M:UNDEAD R:75:0 @@ -101,8 +115,12 @@ L:86:90:205:10:1:0 A:177:100:0:0:0:0:85:87 O:10:10:30:30 E:2d10:10:FIRE -F:CAVE | LAVA_RIVER | NO_RECALL | NO_STREAMERS -F:FILL_METHOD_0 | NO_EASY_MOVE +F:CAVE +F:FILL_METHOD_0 +F:LAVA_RIVER +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_STREAMERS R:100:1 M:IM_FIRE @@ -117,13 +135,25 @@ A:85:80:87:20:87:0:57:85 A:50:50:0 O:25:25:25:25 E:10d10:3:NETHER -F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_SHAFT -F:ADJUST_LEVEL_2 | NO_RECALL | NO_STREAMERS -F:LAVA_RIVER | FINAL_GUARDIAN_1032 | FINAL_ARTIFACT_203 -F:FILL_METHOD_2 | NO_RECALL_OUT +F:ADJUST_LEVEL_2 +F:EMPTY +F:FILL_METHOD_2 +F:FINAL_ARTIFACT_203 +F:FINAL_GUARDIAN_1032 +F:FORGET +F:LAVA_RIVER +F:NO_BREATH +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_RECALL_OUT +F:NO_SHAFT +F:NO_STREAMERS R:5:0 R:95:3 -M:RES_NETH | R_CHAR_G | R_CHAR_W | R_CHAR_U +M:RES_NETH +M:R_CHAR_G +M:R_CHAR_U +M:R_CHAR_W # The Lost Land of Numenor # levels 35-50 @@ -136,12 +166,16 @@ A:187:80:84:10:56:10:57:187 A:60:0:40 O:30:30:10:10 E:1d1:1:ACID +F:FILL_METHOD_3 +F:FINAL_ARTIFACT_204 +F:FINAL_GUARDIAN_980 F:NO_STREAMERS -F:FINAL_GUARDIAN_980 | FINAL_ARTIFACT_204 -F:FILL_METHOD_3 | WATER_BREATH +F:WATER_BREATH R:20:0 R:80:3 -M:AQUATIC | CAN_SWIM | CAN_FLY +M:AQUATIC +M:CAN_FLY +M:CAN_SWIM # Used for astral mode N:8:Halls of Waiting @@ -150,8 +184,10 @@ W:1:98:1:14:160 L:1:100:1:0:1:0 O:20:20:20:20 A:56:100:56:0:56:0:57:58 -F:RANDOM_TOWNS | NO_RECALL | NO_SHAFT F:FILL_METHOD_0 +F:NO_RECALL +F:NO_SHAFT +F:RANDOM_TOWNS R:100:2 M:UNIQUE @@ -166,16 +202,22 @@ L:87:5:88:65:16:30 A:97:90:16:10:56:0:16:58 O:30:30:30:10 E:4d4:20:POISON -F:FINAL_GUARDIAN_481 -F:RANDOM_TOWNS | CIRCULAR_ROOMS +F:CIRCULAR_ROOMS F:FILL_METHOD_2 +F:FINAL_GUARDIAN_481 F:FORCE_DOWN +F:RANDOM_TOWNS F:WILD_65_56__67_53 R:2:0 R:49:3 -M:SPIDER | R_CHAR_a | R_CHAR_I | +M:R_CHAR_I +M:R_CHAR_a +M:SPIDER R:49:3 -M:ORC | R_CHAR_w | R_CHAR_m | R_CHAR_j +M:ORC +M:R_CHAR_j +M:R_CHAR_m +M:R_CHAR_w # The Heart of the Earth # levels 25-36 @@ -187,11 +229,19 @@ L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:40:10:10:20 G:life -F:EVOLVE | FINAL_GUARDIAN_1035 | NO_RECALL | NO_SHAFT +F:EVOLVE +F:FINAL_GUARDIAN_1035 +F:NO_RECALL +F:NO_SHAFT R:40:3 -M:R_CHAR_# | R_CHAR_X | R_CHAR_g | R_CHAR_E | +M:R_CHAR_# +M:R_CHAR_E +M:R_CHAR_X +M:R_CHAR_g R:30:3 -M:PASS_WALL | KILL_WALL | HURT_ROCK +M:HURT_ROCK +M:KILL_WALL +M:PASS_WALL R:30:0 # The Void @@ -205,13 +255,25 @@ A:183:90:102:10:0:0:102:102 A:40:60:0 O:25:25:25:25 E:20d6:100:DARK -F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_RECALL_OUT | NO_RECALL | -F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT +F:ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1_2 +F:EMPTY F:FILL_METHOD_2 -F:FINAL_GUARDIAN_1044 | +F:FINAL_GUARDIAN_1044 +F:FORGET +F:NO_BREATH +F:NO_EASY_MOVE +F:NO_RECALL +F:NO_RECALL_OUT +F:NO_SHAFT +F:NO_STREAMERS R:1:0 R:99:3 -M:UNDEAD | DEMON | DRAGON | NONLIVING | SPIRIT +M:DEMON +M:DRAGON +M:NONLIVING +M:SPIRIT +M:UNDEAD # TEST dungeon N:12:Test @@ -222,7 +284,8 @@ L:0:95:5 A:177:100:0:0:0:0:85:87 A:100:0:0 O:20:20:20:20 -F:FILL_METHOD_3 | SMALL +F:FILL_METHOD_3 +F:SMALL R:100:0 G:dungeon2 @@ -237,13 +300,15 @@ L:88:85:84:15:1:0 A:56:75:87:25:56:0:57:58 O:30:30:30:2 E:1d1:20:RAISE -F:FINAL_GUARDIAN_804 | FINAL_ARTIFACT_91 F:FILL_METHOD_3 +F:FINAL_ARTIFACT_91 +F:FINAL_GUARDIAN_804 R:5:0 R:10:3 M:R_CHAR_p R:85:3 -M:UNDEAD | NONLIVING +M:NONLIVING +M:UNDEAD # The Illusory Castle # levels 35-52 @@ -255,14 +320,31 @@ L:1:98:188:2:1:0 A:56:50:189:50:56:0:57:58 O:50:10:20:20 E:6d2:6:CONFUSION -F:RANDOM_TOWNS | NO_STREAMERS -F:FINAL_GUARDIAN_1033 | FINAL_ARTIFACT_160 F:FILL_METHOD_1 +F:FINAL_ARTIFACT_160 +F:FINAL_GUARDIAN_1033 +F:NO_STREAMERS +F:RANDOM_TOWNS R:30:0 R:70:3 -M:STUPID | WEIRD_MIND | SHAPECHANGER | ATTR_MULTI | CHAR_MULTI | RAND_25 | -M:RAND_50 | EMPTY_MIND | INVISIBLE | PASS_WALL | KILL_WALL -S:BR_CONF | BR_CHAO | BA_CHAO | CONF | FORGET | TRAPS | MULTIPLY +M:ATTR_MULTI +M:CHAR_MULTI +M:EMPTY_MIND +M:INVISIBLE +M:KILL_WALL +M:PASS_WALL +M:RAND_25 +M:RAND_50 +M:SHAPECHANGER +M:STUPID +M:WEIRD_MIND +S:BA_CHAO +S:BR_CHAO +S:BR_CONF +S:CONF +S:FORGET +S:MULTIPLY +S:TRAPS # The Maze # Levels 25-37 @@ -274,8 +356,10 @@ L:1:100:1:0:1:0 A:56:98:48:2:56:0:57:58 O:2:40:10:40 G:maze -F:SMALLEST | FORGET -F:FINAL_GUARDIAN_1029 | FINAL_ARTIFACT_38 +F:FINAL_ARTIFACT_38 +F:FINAL_GUARDIAN_1029 +F:FORGET +F:SMALLEST R:80:0 R:20:3 M:R_CHAR_p @@ -289,16 +373,20 @@ W:10:22:8:35:200 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:5:50:10:25 -F:RANDOM_TOWNS | -F:FINAL_OBJECT_810 | FINAL_GUARDIAN_373 | CAVE | +F:CAVE F:FILL_METHOD_0 +F:FINAL_GUARDIAN_373 +F:FINAL_OBJECT_810 F:FORCE_DOWN +F:RANDOM_TOWNS F:WILD_49_21__51_19 R:30:3 M:TROLL R:20:0 R:50:3 -M:ORC | R_CHAR_o | R_CHAR_O +M:ORC +M:R_CHAR_O +M:R_CHAR_o # Erebor # levels 60-72 @@ -309,14 +397,22 @@ W:60:72:30:20:140 L:88:100:1:0:1:0 A:97:90:87:10:56:0:57:97 O:40:40:40:40 -F:BIG | LAVA_RIVER | CAVERN | NO_RECALL | NO_STREAMERS -F:CAVE | DOUBLE | FINAL_GUARDIAN_715 | +F:BIG +F:CAVE +F:CAVERN +F:DOUBLE F:FILL_METHOD_2 +F:FINAL_GUARDIAN_715 +F:LAVA_RIVER +F:NO_RECALL +F:NO_STREAMERS R:10:0 R:60:1 -M:DRAGON | R_CHAR_D +M:DRAGON +M:R_CHAR_D R:30:1 -M:DRAGON | R_CHAR_d +M:DRAGON +M:R_CHAR_d # The Old Forest # levels 13-25 @@ -328,14 +424,21 @@ L:88:76:84:16:199:8 L:68:16:16 A:96:100:56:0:56:0:202:96 O:20:5:15:30 -F:WATER_RIVERS | NO_DOORS | NO_DESTROY | FLAT | NO_STREAMERS -F:RANDOM_TOWNS | FINAL_GUARDIAN_206 F:FILL_METHOD_3 +F:FINAL_GUARDIAN_206 +F:FLAT +F:NO_DESTROY +F:NO_DOORS +F:NO_STREAMERS +F:RANDOM_TOWNS +F:WATER_RIVERS R:30:0 R:40:3 -M:ANIMAL +M:ANIMAL R:30:3 -M:UNDEAD | R_CHAR_h | R_CHAR_l +M:R_CHAR_h +M:R_CHAR_l +M:UNDEAD # The Mines of Moria # levels 30-50 @@ -346,15 +449,18 @@ W:30:50:20:40:40 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:30:50:10:5 -F:FINAL_GUARDIAN_872 | WATER_RIVER | NO_STREAMERS +F:FILL_METHOD_0 +F:FINAL_GUARDIAN_872 F:FORCE_DOWN +F:NO_STREAMERS F:RANDOM_TOWNS +F:WATER_RIVER F:WILD_45_30__44_37 -F:FILL_METHOD_0 R:40:3 M:ORC R:30:3 -M:TROLL | GIANT +M:GIANT +M:TROLL R:20:3 M:DEMON R:10:0 @@ -368,16 +474,21 @@ W:57:70:34:24:160 L:1:80:174:20:1:0 A:56:100:56:0:56:0:57:58 O:20:1:70:9 -F:SMALL | FINAL_GUARDIAN_819 | FINAL_ARTIFACT_205 F:FILL_METHOD_3 +F:FINAL_ARTIFACT_205 +F:FINAL_GUARDIAN_819 +F:SMALL R:30:3 -M:R_CHAR_p | R_CHAR_P +M:R_CHAR_P +M:R_CHAR_p R:10:3 -M:ORC | TROLL +M:ORC +M:TROLL R:20:3 M:UNDEAD R:30:3 -M:DEMON | DRAGON +M:DEMON +M:DRAGON R:10:0 # Dungeons from Variaz @@ -392,8 +503,9 @@ L:84:100:84:0:84:0 A:97:100:56:0:56:0:57:58 O:10:10:30:30 E:1d1:20:ACID -F:FINAL_GUARDIAN_517 | NO_RECALL F:FILL_METHOD_0 +F:FINAL_GUARDIAN_517 +F:NO_RECALL R:10:0 R:10:3 M:AQUATIC @@ -413,9 +525,12 @@ W:45:70:20:14:160 L:89:100:89:0:89:0 A:97:100:56:0:56:0:97:97 O:20:20:20:20 -F:RANDOM_TOWNS | FLAT | NO_STREAMERS -F:FINAL_GUARDIAN_789 | FINAL_ARTIFACT_193 F:FILL_METHOD_0 +F:FINAL_ARTIFACT_193 +F:FINAL_GUARDIAN_789 +F:FLAT +F:NO_STREAMERS +F:RANDOM_TOWNS R:60:3 M:CAN_FLY R:40:0 @@ -429,10 +544,15 @@ W:26:40:15:14:160 L:89:100:1:0:1:0 A:89:50:96:25:84:25:57:58 O:20:20:20:20 -F:RANDOM_TOWNS | FLAT | NO_STREAMERS | FINAL_GUARDIAN_990 F:FILL_METHOD_1 +F:FINAL_GUARDIAN_990 +F:FLAT +F:NO_STREAMERS +F:RANDOM_TOWNS R:30:3 -M:R_CHAR_p | R_CHAR_h | R_CHAR_l +M:R_CHAR_h +M:R_CHAR_l +M:R_CHAR_p R:30:3 M:ANIMAL R:40:0 @@ -446,9 +566,11 @@ W:22:30:12:5:200 L:91:85:94:10:93:5 A:98:100:96:0:84:0:94:94 O:15:5:60:20 -F:NO_DOORS | SAND_VEIN | -F:FINAL_GUARDIAN_1030 | FINAL_ARTIFACT_153 F:FILL_METHOD_0 +F:FINAL_ARTIFACT_153 +F:FINAL_GUARDIAN_1030 +F:NO_DOORS +F:SAND_VEIN R:100:1 M:R_CHAR_w R:10:3 @@ -461,8 +583,11 @@ W:1:1:1:30:255 L:1:100:1:0:1:0 A:1:100:1:0:1:0:1:1 O:1:1:1:1 -F:EMPTY | SMALLEST | NO_RECALL | NO_STREAMERS +F:EMPTY F:FILL_METHOD_0 +F:NO_RECALL +F:NO_STREAMERS +F:SMALLEST R:100:0 # The Grinding Ice @@ -477,9 +602,12 @@ A:95:0:56:100:56:0:57:58 A:100:0:0 O:20:20:20:20 E:1d4:15:COLD -F:DOUBLE | WATER_RIVER | CAVERN | NO_STREAMERS -F:FINAL_GUARDIAN_1034 | +F:CAVERN +F:DOUBLE F:FILL_METHOD_2 +F:FINAL_GUARDIAN_1034 +F:NO_STREAMERS +F:WATER_RIVER R:100:1 M:IM_COLD @@ -493,7 +621,8 @@ W:1:50:1:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:FILL_METHOD_4 | NO_RECALL +F:FILL_METHOD_4 +F:NO_RECALL R:100:0 ### New dungeons added for Theme module ### @@ -512,12 +641,22 @@ A:90:20:93:40:88:40:88:211 O:20:20:20:20 # it is always dark here in the northern wastelands E:2d4:1:DARK -F:NO_DOORS | CAVERN | COLD | NO_DESTROY | EMPTY | FLAT | -F:NO_RECALL | LIFE_LEVEL | NO_STREAMERS | NO_SHAFT | -F:FINAL_GUARDIAN_389 | +F:CAVERN +F:COLD +F:EMPTY F:FILL_METHOD_4 +F:FINAL_GUARDIAN_389 +F:FLAT +F:LIFE_LEVEL +F:NO_DESTROY +F:NO_DOORS +F:NO_RECALL +F:NO_SHAFT +F:NO_STREAMERS R:100:3 -M:COLD_BLOOD | HURT_LITE | IM_COLD +M:COLD_BLOOD +M:HURT_LITE +M:IM_COLD # Emyn Luin # levels 60-70 @@ -531,13 +670,20 @@ L:89:45:81:5:88:50 A:215:100:215:0:215:0:56:211 # lots of treasure, not much magic O:50:20:10:30 -F:CAVE | CAVERN | CIRCULAR_ROOMS | RANDOM_TOWNS | -F:NO_STREAMERS | NO_RECALL | NO_DESTROY +F:CAVE +F:CAVERN +F:CIRCULAR_ROOMS +F:NO_DESTROY +F:NO_RECALL +F:NO_STREAMERS +F:RANDOM_TOWNS # no_recall because it should not be so easy to get Nauglamir. :P -F:FINAL_GUARDIAN_457 | FINAL_ARTIFACT_6 F:FILL_METHOD_3 +F:FINAL_ARTIFACT_6 +F:FINAL_GUARDIAN_457 R:100:0 -M:R_CHAR_k | R_CHAR_o +M:R_CHAR_k +M:R_CHAR_o #Dol Amroth - Castle of Prince Imrahil #levels 25-35 @@ -549,14 +695,23 @@ W:25:35:15:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:SMALLEST | NO_DESTROY | TOWER | RANDOM_TOWNS | -F:ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT | NO_STAIR | -F:NO_EASY_MOVE | FILL_METHOD_2 -F:FINAL_GUARDIAN_402 | +F:ADJUST_LEVEL_1 +F:FILL_METHOD_2 +F:FINAL_GUARDIAN_402 +F:NO_DESTROY +F:NO_EASY_MOVE +F:NO_SHAFT +F:NO_STAIR +F:NO_STREAMERS +F:RANDOM_TOWNS +F:SMALLEST +F:TOWER R:80:3 -M:R_CHAR_p | R_CHAR_P +M:R_CHAR_P +M:R_CHAR_p R:20:3 -M:SMART | TAKE_ITEM +M:SMART +M:TAKE_ITEM #Angmar #levels 80-90 @@ -571,13 +726,23 @@ A:214:100:214:0:214:0:214:214 O:20:20:20:20 # In addition to swamp water poison, we have disenchantment E:1d1:1:DISENCHANT -F:ADJUST_LEVEL_1_2 | NO_DOORS | NO_STREAMERS | -F:HOT | FLAT | NO_SHAFT | NO_NEW_MONSTER | CIRCULAR_ROOMS | -F:FINAL_GUARDIAN_242 | FINAL_ARTIFACT_110 +F:ADJUST_LEVEL_1_2 +F:CIRCULAR_ROOMS F:FILL_METHOD_2 +F:FINAL_ARTIFACT_110 +F:FINAL_GUARDIAN_242 +F:FLAT +F:HOT +F:NO_DOORS +F:NO_NEW_MONSTER +F:NO_SHAFT +F:NO_STREAMERS R:50:0 R:50:3 -M:RES_DISE | UNDEAD | DEMON | NONLIVING +M:DEMON +M:NONLIVING +M:RES_DISE +M:UNDEAD #Near Harad #levels 20-25 @@ -592,14 +757,24 @@ A:91:100:91:0:91:0:98:91 O:20:20:20:20 #Living is slow in the desert, heh :) E:1d1:1:INERTIA -F:NO_DOORS | CAVE | CAVERN | HOT | NO_DESTROY | EMPTY | FLAT -F:RANDOM_TOWNS | NO_STREAMERS | NO_SHAFT | -F:FINAL_GUARDIAN_395 | FINAL_ARTIFACT_171 -F:FILL_METHOD_4 +F:CAVE +F:CAVERN +F:EMPTY +F:FILL_METHOD_4 +F:FINAL_ARTIFACT_171 +F:FINAL_GUARDIAN_395 +F:FLAT +F:HOT +F:NO_DESTROY +F:NO_DOORS +F:NO_SHAFT +F:NO_STREAMERS +F:RANDOM_TOWNS #It's a desert (sort of wilderness) so WILD_TOO monsters, plus the 'p's for the Haradrim R:30:0 R:70:3 -M:WILD_TOO | R_CHAR_p +M:R_CHAR_p +M:WILD_TOO #Isengard - Orc Cave on steroids. #levels 35-40 @@ -611,13 +786,18 @@ W:35:40:20:14:160 L:88:100:1:0:1:0 A:97:100:56:0:56:0:57:97 O:20:20:20:20 -F:CAVE | ADJUST_LEVEL_2 | NO_STREAMERS | +F:ADJUST_LEVEL_2 +F:CAVE F:FILL_METHOD_0 +F:NO_STREAMERS R:20:0 R:30:3 -M:TROLL | R_CHAR_T | +M:R_CHAR_T +M:TROLL R:50:3 -M:ORC | R_CHAR_o | R_CHAR_O +M:ORC +M:R_CHAR_O +M:R_CHAR_o # Tol Eressea - of course you never actually set foot on Tol Eressea ;) # levels 40-45 @@ -631,10 +811,18 @@ L:84:60:222:40:222:0 A:211:100:211:0:211:0:211:211 # As little loot as possible, this is open water, after all O:1:1:1:1 -F:SMALLEST | NO_DOORS | NO_DESTROY | EMPTY | FLAT | -F:ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT | NO_NEW_MONSTER | -F:FINAL_GUARDIAN_791 | FINAL_ARTIFACT_219 | +F:ADJUST_LEVEL_1 +F:EMPTY F:FILL_METHOD_0 +F:FINAL_ARTIFACT_219 +F:FINAL_GUARDIAN_791 +F:FLAT +F:NO_DESTROY +F:NO_DOORS +F:NO_NEW_MONSTER +F:NO_SHAFT +F:NO_STREAMERS +F:SMALLEST R:1:0 R:99:1 M:R_CHAR_B @@ -648,9 +836,12 @@ W:101:127:30:14:160 L:1:100:1:0:1:0 A:56:100:56:0:56:0:57:58 O:20:20:20:20 -F:CAVERN | NO_EASY_MOVE | NO_RECALL -F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 -F:FILL_METHOD_0 +F:ADJUST_LEVEL_1 +F:ADJUST_LEVEL_1_2 +F:CAVERN +F:FILL_METHOD_0 +F:NO_EASY_MOVE +F:NO_RECALL R:100:0 # Bilbo's trail in the Barrow-downs @@ -662,8 +853,8 @@ L:88:94:210:2:199:4 A:96:80:97:19:57:1:57:97 A:100:0:0 O:20:20:20:20 -F:FLAT F:FILL_METHOD_3 +F:FLAT R:25:1 M:UNDEAD R:75:0 @@ -676,8 +867,10 @@ W:33:33:15:14:160 L:89:95:199:5:88:0 A:96:100:97:0:56:0:202:96 O:20:20:20:20 -F:NO_DOORS | NO_DESTROY | FLAT F:FILL_METHOD_0 +F:FLAT +F:NO_DESTROY +F:NO_DOORS R:100:0 # N:: diff --git a/lib/mods/theme/edit/e_info.txt b/lib/mods/theme/edit/e_info.txt index 70d0e917..c17a589d 100644 --- a/lib/mods/theme/edit/e_info.txt +++ b/lib/mods/theme/edit/e_info.txt @@ -93,7 +93,8 @@ T:6:0:99 W:10:1:8:50000 C:-40:-40:0:3 R:100 -F:MANA | SPELL +F:MANA +F:SPELL R:50 F:PVAL_M2 @@ -104,7 +105,10 @@ W:0:2:8:40000 C:0:0:0:0 R:100 F:ACTIVATE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE ### Body Armor ### @@ -114,8 +118,10 @@ T:37:0:99 X:A:30:16 W:0:4:20:1000 R:100 -F:RES_ACID | IGNORE_ACID -f:RES_ACID | IGNORE_ACID +F:IGNORE_ACID +F:RES_ACID +f:IGNORE_ACID +f:RES_ACID N:6:of Resist Lightning T:36:0:99 @@ -123,8 +129,10 @@ T:37:0:99 X:A:30:10 W:0:4:20:400 R:100 -F:RES_ELEC | IGNORE_ELEC -f:RES_ELEC | IGNORE_ELEC +F:IGNORE_ELEC +F:RES_ELEC +f:IGNORE_ELEC +f:RES_ELEC N:7:of Resist Fire T:36:0:15 @@ -133,8 +141,10 @@ T:37:0:99 X:A:30:14 W:0:4:20:800 R:100 -F:RES_FIRE | IGNORE_FIRE -f:RES_FIRE | IGNORE_FIRE +F:IGNORE_FIRE +F:RES_FIRE +f:IGNORE_FIRE +f:RES_FIRE N:8:of Resist Cold T:36:0:15 @@ -143,8 +153,10 @@ T:37:0:99 X:A:30:12 W:0:4:20:600 R:100 -F:RES_COLD | IGNORE_COLD -f:RES_COLD | IGNORE_COLD +F:IGNORE_COLD +F:RES_COLD +f:IGNORE_COLD +f:RES_COLD N:9:of Resistance T:36:0:99 @@ -153,9 +165,18 @@ X:A:30:20 W:0:2:20:12500 C:0:0:10:0 R:100 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE R:25 F:R_HIGH @@ -166,11 +187,18 @@ X:B:30:25 W:0:2:20:15000 C:0:0:10:3 R:100 -F:STEALTH | ESP_ORC -f:STEALTH -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ESP_ORC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:STEALTH +f:STEALTH R:25 F:RES_POIS @@ -181,10 +209,22 @@ X:A:30:30 W:0:1:10:30000 C:0:0:10:0 R:100 -F:SUST_STR | SUST_DEX | SUST_CON | SUST_INT | SUST_WIS | SUST_CHR | -F:HOLD_LIFE | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS R:2 F:R_IMMUNITY @@ -197,7 +237,12 @@ X:A:30:0 W:0:1:10:0 C:0:0:0:-6 R:100 -F:CON | STR | R_STAT | CURSED | HEAVY_CURSE | AGGRAVATE +F:AGGRAVATE +F:CON +F:CURSED +F:HEAVY_CURSE +F:R_STAT +F:STR # No CURSE_NO_DROP here, players seems to unlike surprises # Mithirl & Galvorn mails & PDSM @@ -240,8 +285,10 @@ T:34:7:99 X:A:32:16 W:0:6:22:1000 R:100 -F:RES_ACID | IGNORE_ACID -f:RES_ACID | IGNORE_ACID +F:IGNORE_ACID +F:RES_ACID +f:IGNORE_ACID +f:RES_ACID N:17:of Resist Lightning T:34:0:5 @@ -250,8 +297,10 @@ T:115:56:56 X:A:32:10 W:0:6:22:400 R:100 -F:RES_ELEC | IGNORE_ELEC -f:RES_ELEC | IGNORE_ELEC +F:IGNORE_ELEC +F:RES_ELEC +f:IGNORE_ELEC +f:RES_ELEC N:18:of Resist Fire T:34:0:5 @@ -260,8 +309,10 @@ T:115:56:56 X:A:32:14 W:0:6:22:800 R:100 -F:RES_FIRE | IGNORE_FIRE -f:RES_FIRE | IGNORE_FIRE +F:IGNORE_FIRE +F:RES_FIRE +f:IGNORE_FIRE +f:RES_FIRE N:19:of Resist Cold T:115:56:56 @@ -270,8 +321,10 @@ T:34:7:99 X:A:32:12 W:0:6:22:600 R:100 -F:RES_COLD | IGNORE_COLD -f:RES_COLD | IGNORE_COLD +F:IGNORE_COLD +F:RES_COLD +f:IGNORE_COLD +f:RES_COLD N:20:of Resistance T:115:56:56 @@ -281,9 +334,18 @@ X:A:32:20 W:0:2:22:12500 C:0:0:10:0 R:100 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE N:21:of Reflection T:115:56:56 @@ -293,9 +355,12 @@ X:A:32:20 W:0:2:22:15000 C:0:0:5:0 R:100 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:REFLECT f:REFLECT -F:IGNORE_ELEC | IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE # Metal shields only N:22:of Electricity @@ -305,7 +370,9 @@ T:34:10:10 X:A:32:10 W:0:2:22:400 R:100 -F:RES_ELEC | IGNORE_ELEC | SH_ELEC +F:IGNORE_ELEC +F:RES_ELEC +F:SH_ELEC f:SH_ELEC ### Crowns and Helms ### @@ -318,7 +385,10 @@ X:A:33:13 C:0:0:0:2 W:0:1:8:500 R:100 -F:DEX | SUST_DEX | ACTIVATE | ESP_ORC +F:ACTIVATE +F:DEX +F:ESP_ORC +F:SUST_DEX a:NOLDOR N:24:of Intelligence @@ -329,7 +399,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INT | SUST_INT +F:INT +F:SUST_INT f:INT N:25:of Wisdom @@ -340,7 +411,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:WIS | SUST_WIS +F:SUST_WIS +F:WIS f:WIS N:26:of Beauty @@ -351,7 +423,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:CHR | SUST_CHR +F:CHR +F:SUST_CHR f:CHR # 40% chance of increase spell power @@ -361,14 +434,23 @@ W:0:1:8:7500 C:0:0:0:3 T:33:0:99 R:100 -F:INT | SUST_INT | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:ABILITY | R_HIGH +F:ABILITY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INT +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_HIGH +F:SUST_INT R:40 F:SPELL R:50 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST N:28:of Gondor X:A:33:19 @@ -377,8 +459,14 @@ C:0:0:0:3 T:32:0:99 T:33:0:99 R:100 -F:STR | DEX | CON | SUST_STR | SUST_DEX | SUST_CON | FREE_ACT +F:CON +F:DEX +F:FREE_ACT F:R_HIGH +F:STR +F:SUST_CON +F:SUST_DEX +F:SUST_STR N:29:of Arnor X:A:33:17 @@ -387,8 +475,11 @@ C:0:0:0:3 T:32:0:99 T:33:0:99 R:100 -F:WIS | CHR | SUST_WIS | SUST_CHR +F:CHR F:R_HIGH +F:SUST_CHR +F:SUST_WIS +F:WIS N:30:of Seeing X:A:33:8 @@ -399,7 +490,9 @@ T:32:8:99 T:33:0:99 T:115:57:57 R:100 -F:SEARCH | RES_BLIND | SEE_INVIS +F:RES_BLIND +F:SEARCH +F:SEE_INVIS f:SEARCH R:20 F:ESP_ALL @@ -412,7 +505,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INFRA | HIDE_TYPE +F:HIDE_TYPE +F:INFRA f:INFRA N:32:of Light @@ -422,7 +516,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:LITE1 | RES_LITE +F:LITE1 +F:RES_LITE f:LITE1 N:33:of Telepathy @@ -464,7 +559,8 @@ T:32:0:6 T:32:8:99 T:115:57:57 R:100 -F:INT | CURSED +F:CURSED +F:INT f:INT # No CURSE_NO_DROP here, players seems to unlike surprises @@ -496,7 +592,9 @@ C:0:0:0:-5 W:0:1:7:0 T:33:0:99 R:100 -F:STR | DEX | CON +F:CON +F:DEX +F:STR N:40:Dwarven T:32:0:6 @@ -505,7 +603,11 @@ X:B:33:13 C:0:0:0:2 W:0:1:8:500 R:100 -F:INFRA | CON | RES_FIRE | ESP_TROLL | ESP_DRAGON +F:CON +F:ESP_DRAGON +F:ESP_TROLL +F:INFRA +F:RES_FIRE ### Cloaks ### @@ -516,7 +618,11 @@ W:0:4:19:1500 C:0:0:10:0 T:35:0:99 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | RES_SHARDS +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SHARDS N:42:of Eriador X:A:31:10 @@ -536,10 +642,13 @@ W:0:1:28:4000 C:0:0:20:3 T:35:0:99 R:100 -F:STEALTH | -f:STEALTH | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:OLD_RESIST +F:STEALTH +f:STEALTH # Aura, Fire N:44:of Immolation @@ -548,7 +657,10 @@ W:0:1:18:4000 C:0:0:4:0 T:35:0:99 R:100 -F:IGNORE_ACID | IGNORE_FIRE | SH_FIRE | RES_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_FIRE +F:SH_FIRE f:SH_FIRE N:45:of Enveloping @@ -573,7 +685,8 @@ W:0:1:3:0 C:-15:-15:0:0 T:35:0:99 R:100 -F:AGGRAVATE | SHOW_MODS +F:AGGRAVATE +F:SHOW_MODS # Aura, Electricity N:48:of Electricity @@ -582,7 +695,10 @@ W:0:1:18:4000 C:0:0:4:0 T:35:0:99 R:100 -F:IGNORE_ACID | IGNORE_ELEC | SH_ELEC | RES_ELEC +F:IGNORE_ACID +F:IGNORE_ELEC +F:RES_ELEC +F:SH_ELEC ### Gloves ### @@ -608,7 +724,8 @@ W:0:2:10:1000 C:0:0:0:5 T:31:0:99 R:100 -F:DEX | HIDE_TYPE +F:DEX +F:HIDE_TYPE f:DEX N:52:of Power @@ -617,9 +734,11 @@ X:A:34:22 W:0:1:10:2500 C:5:5:0:5 R:100 -F:STR | SHOW_MODS | HIDE_TYPE -f:STR +F:HIDE_TYPE F:R_HIGH +F:SHOW_MODS +F:STR +f:STR # 53 Gauntlets only N:53:of Peace @@ -628,7 +747,8 @@ W:0:1:3:0 C:-10:-10:0:0 T:31:2:2 R:100 -F:HEAVY_CURSE | CURSED +F:CURSED +F:HEAVY_CURSE # 54 Gloves only N:54:of Charming @@ -697,7 +817,8 @@ W:0:1:27:200000 C:0:0:0:10 T:30:0:99 R:100 -F:SPEED | HIDE_TYPE +F:HIDE_TYPE +F:SPEED f:SPEED R:10 F:PVAL_M3 @@ -710,7 +831,9 @@ W:0:1:20:5000 C:0:0:0:6 T:30:6:6 R:100 -F:CON | INFRA | RES_DARK +F:CON +F:INFRA +F:RES_DARK R:33 F:STR @@ -737,7 +860,8 @@ W:0:1:3:0 C:0:0:0:-10 T:30:0:99 R:100 -F:SPEED | AGGRAVATE +F:AGGRAVATE +F:SPEED ### Weapons ### @@ -751,10 +875,16 @@ X:A:24:30 W:0:2:44:20000 C:6:6:4:3 R:100 -F:WIS | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | -F:SEE_INVIS | BLESSED | RES_FEAR | ESP_EVIL -F:SUSTAIN | LIMIT_BLOWS +F:BLESSED +F:ESP_EVIL +F:LIMIT_BLOWS +F:RES_FEAR +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SUSTAIN +F:WIS R:10 F:BLOWS R:1 @@ -771,12 +901,22 @@ X:A:24:25 W:0:2:44:15000 C:4:4:8:4 R:100 -F:STEALTH | -f:STEALTH | -F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:SUSTAIN | R_HIGH +F:FEATHER +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_HIGH +F:SEE_INVIS +F:STEALTH +F:SUSTAIN +f:STEALTH R:33 F:RES_POIS @@ -789,8 +929,10 @@ X:B:24:20 W:0:1:44:5000 C:0:0:0:3 R:100 -F:WIS | ESP_GOOD -F:BLESSED | ABILITY +F:ABILITY +F:BLESSED +F:ESP_GOOD +F:WIS f:BLESSED N:68:of Greater Life @@ -804,7 +946,8 @@ W:0:1:50:30000 C:5:5:0:3 r:N:MUST2H R:100 -F:LIFE | HOLD_LIFE +F:HOLD_LIFE +F:LIFE f:LIFE N:69:of Westernesse @@ -817,9 +960,17 @@ X:A:24:20 W:0:2:44:20000 C:5:5:0:2 R:100 -F:STR | DEX | CON | -F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | -F:FREE_ACT | SEE_INVIS | ESP_ORC | ESP_TROLL | ESP_GIANT +F:CON +F:DEX +F:ESP_GIANT +F:ESP_ORC +F:ESP_TROLL +F:FREE_ACT +F:SEE_INVIS +F:SLAY_GIANT +F:SLAY_ORC +F:SLAY_TROLL +F:STR R:33 F:RES_FEAR R:50 @@ -851,7 +1002,8 @@ X:A:24:15 W:0:2:44:2500 C:0:0:0:0 R:100 -F:SLAY_WEAP | WOUNDING +F:SLAY_WEAP +F:WOUNDING N:72:of Spinning T:125:0:99 @@ -864,7 +1016,10 @@ X:A:24:18 W:0:1:44:9000 C:8:8:0:2 R:100 -F:DEX | STR | VORPAL | ACTIVATE +F:ACTIVATE +F:DEX +F:STR +F:VORPAL a:SPIN # The "Elemental" brands (4) (6) @@ -880,7 +1035,9 @@ T:115:55:55 X:B:24:15 W:0:4:44:5000 R:100 -F:BRAND_ACID | RES_ACID | IGNORE_ACID +F:BRAND_ACID +F:IGNORE_ACID +F:RES_ACID f:BRAND_ACID N:74:Shocking @@ -894,7 +1051,9 @@ T:115:55:55 X:B:24:20 W:0:4:44:4500 R:100 -F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC +F:BRAND_ELEC +F:IGNORE_ELEC +F:RES_ELEC f:BRAND_ELEC N:75:Fiery @@ -908,8 +1067,11 @@ T:115:55:55 X:B:24:20 W:0:4:44:3500 R:100 -F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE | LITE1 -f:BRAND_FIRE | +F:BRAND_FIRE +F:IGNORE_FIRE +F:LITE1 +F:RES_FIRE +f:BRAND_FIRE N:76:Frozen T:125:0:99 @@ -922,8 +1084,10 @@ T:115:55:55 X:B:24:15 W:0:4:44:3000 R:100 -F:BRAND_COLD | RES_COLD | IGNORE_COLD -f:BRAND_COLD | +F:BRAND_COLD +F:IGNORE_COLD +F:RES_COLD +f:BRAND_COLD N:77:Venomous T:125:0:99 @@ -936,8 +1100,9 @@ T:115:55:55 X:B:24:20 W:0:4:44:4000 R:100 -F:BRAND_POIS | RES_POIS -f:BRAND_POIS | +F:BRAND_POIS +F:RES_POIS +f:BRAND_POIS N:78:Chaotic T:125:0:99 @@ -950,9 +1115,13 @@ T:115:55:55 X:B:24:28 W:0:1:44:10000 R:100 -F:CHAOTIC | RES_CHAOS | IGNORE_ELEC | IGNORE_ACID | IGNORE_FIRE -f:CHAOTIC +F:CHAOTIC +F:IGNORE_ACID +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS F:R_ANY +f:CHAOTIC N:79:Sharp T:125:0:99 @@ -973,7 +1142,10 @@ X:A:24:20 W:0:1:44:4000 C:10:10:0:6 R:100 -F:IMPACT | STR | TUNNEL | HIDE_TYPE +F:HIDE_TYPE +F:IMPACT +F:STR +F:TUNNEL f:IMPACT # The "Slay" brands (8) @@ -1098,8 +1270,13 @@ X:A:24:20 W:0:2:44:6000 C:0:0:0:2 R:100 -F:INT | SLAY_ANIMAL | SLOW_DIGEST | STEALTH | ESP_ANIMAL -f:SLAY_ANIMAL | STEALTH +F:ESP_ANIMAL +F:INT +F:SLAY_ANIMAL +F:SLOW_DIGEST +F:STEALTH +f:SLAY_ANIMAL +f:STEALTH N:90:of *Slay Evil* T:125:0:99 @@ -1112,8 +1289,13 @@ X:A:24:20 W:0:2:44:6000 C:0:0:0:2 R:100 -F:WIS | SLAY_EVIL | BLESSED | ESP_EVIL | RES_FEAR | ABILITY -f:SLAY_EVIL | +F:ABILITY +F:BLESSED +F:ESP_EVIL +F:RES_FEAR +F:SLAY_EVIL +F:WIS +f:SLAY_EVIL N:91:of *Slay Undead* T:125:0:99 @@ -1127,8 +1309,12 @@ X:A:24:24 W:0:2:44:8000 C:0:0:0:2 R:100 -F:WIS | KILL_UNDEAD | SEE_INVIS | ESP_UNDEAD | RES_NETHER -f:KILL_UNDEAD | +F:ESP_UNDEAD +F:KILL_UNDEAD +F:RES_NETHER +F:SEE_INVIS +F:WIS +f:KILL_UNDEAD N:92:of *Slay Demon* T:125:0:99 @@ -1142,8 +1328,12 @@ X:A:24:16 W:0:2:44:8000 C:0:0:0:2 R:100 -F:INT | KILL_DEMON | ESP_DEMON | RES_FIRE | RES_CHAOS -f:KILL_DEMON | +F:ESP_DEMON +F:INT +F:KILL_DEMON +F:RES_CHAOS +F:RES_FIRE +f:KILL_DEMON N:93:of *Slay Orc* T:15:0:99 @@ -1156,8 +1346,11 @@ X:A:24:14 W:0:2:44:4000 C:0:0:0:2 R:100 -F:DEX | SLAY_ORC | ESP_ORC | SUST_DEX | -f:SLAY_ORC | +F:DEX +F:ESP_ORC +F:SLAY_ORC +F:SUST_DEX +f:SLAY_ORC N:94:of *Slay Troll* T:15:0:99 @@ -1170,8 +1363,12 @@ X:A:24:14 W:0:2:44:4000 C:0:0:0:2 R:100 -F:STR | SLAY_TROLL | ESP_TROLL | REGEN | SUST_STR -f:SLAY_TROLL | +F:ESP_TROLL +F:REGEN +F:SLAY_TROLL +F:STR +F:SUST_STR +f:SLAY_TROLL N:95:of *Slay Giant* T:15:0:99 @@ -1184,8 +1381,12 @@ X:A:24:16 W:0:2:44:4000 C:0:0:0:2 R:100 -F:STR | SLAY_GIANT | ESP_GIANT | RES_SHARDS | SUST_STR -f:SLAY_GIANT | +F:ESP_GIANT +F:RES_SHARDS +F:SLAY_GIANT +F:STR +F:SUST_STR +f:SLAY_GIANT N:96:of *Slay Dragon* T:15:0:99 @@ -1198,9 +1399,13 @@ X:A:24:24 W:0:2:44:8000 C:0:0:0:2 R:100 -F:CON | KILL_DRAGON | ESP_DRAGON | RES_FEAR | +F:CON +F:ESP_DRAGON +F:KILL_DRAGON +F:RES_FEAR +F:R_ELEM +F:R_LOW f:KILL_DRAGON -F:R_LOW | R_ELEM R:20 F:RES_POIS @@ -1212,8 +1417,11 @@ X:B:24:25 W:0:2:44:10000 C:0:0:0:-2 R:100 -F:LIFE | VAMPIRIC | HOLD_LIFE -f:LIFE | VAMPIRIC +F:HOLD_LIFE +F:LIFE +F:VAMPIRIC +f:LIFE +f:VAMPIRIC N:98:(*Defender*) T:21:0:99 @@ -1224,18 +1432,40 @@ X:A:24:35 W:0:1:100:50000 C:-15:-15:20:4 R:100 -F:STEALTH | RES_POIS | DEX | CON | WIS | HOLD_LIFE | +F:CON +F:DEX +F:FEATHER +F:FREE_ACT +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:STEALTH +F:SUSTAIN +F:WIS f:STEALTH -F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:R_ANY | R_LOW | SUSTAIN R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY # 'of the Thunderlords' renamed to 'of Tulkas' and picked up some new flags:) --furiosity N:99:of Tulkas @@ -1249,16 +1479,30 @@ W:10:6:90:45000 C:4:4:0:2 a:TELEPORT R:100 -F:SLAY_EVIL | KILL_DRAGON | TELEPORT | FREE_ACT | SEARCH | BRAND_ELEC -F:REGEN | SLOW_DIGEST | RES_MORGUL | ACTIVATE | ESP_DRAGON +F:ACTIVATE +F:BRAND_ELEC +F:ESP_DRAGON +F:FREE_ACT +F:KILL_DRAGON +F:REGEN +F:RES_MORGUL +F:SEARCH +F:SLAY_EVIL +F:SLOW_DIGEST +F:TELEPORT R:50 -F:RES_NEXUS | HOLD_LIFE +F:HOLD_LIFE +F:RES_NEXUS R:30 -F:R_HIGH | KILL_UNDEAD +F:KILL_UNDEAD +F:R_HIGH R:12 -F:ABILITY | KILL_DEMON +F:ABILITY +F:KILL_DEMON R:2 -F:R_P_ABILITY | PVAL_M3 | LIMIT_BLOWS +F:LIMIT_BLOWS +F:PVAL_M3 +F:R_P_ABILITY N:100:of Gondolin T:21:0:99 @@ -1269,10 +1513,21 @@ X:A:24:26 W:0:1:44:25000 C:7:7:0:3 R:100 -F:STR | CON | ESP_EVIL | RES_FEAR | -F:SLAY_EVIL | SLAY_TROLL | SLAY_DRAGON | SLAY_DEMON | -F:FREE_ACT | SEE_INVIS | LITE1 | RES_DARK | ABILITY | -F:IGNORE_ACID | IGNORE_FIRE +F:ABILITY +F:CON +F:ESP_EVIL +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_FIRE +F:LITE1 +F:RES_DARK +F:RES_FEAR +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_DRAGON +F:SLAY_EVIL +F:SLAY_TROLL +F:STR R:33 F:R_HIGH R:33 @@ -1288,9 +1543,12 @@ X:A:24:4 W:0:1:2:500 C:0:0:0:5 R:100 -F:TUNNEL | -f:TUNNEL | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:TUNNEL +f:TUNNEL # More weapons @@ -1304,8 +1562,11 @@ T:115:55:55 X:B:24:30 W:0:1:5:5000 R:100 -F:SLAY_UNDEAD | SEE_INVIS | HOLD_LIFE | DRAIN_HP F:ACTIVATE +F:DRAIN_HP +F:HOLD_LIFE +F:SEE_INVIS +F:SLAY_UNDEAD a:SPECTRAL N:103:of Morgul @@ -1319,9 +1580,15 @@ X:A:24:0 W:0:1:1:0 C:-20:-20:-10:-10 R:100 +F:AGGRAVATE +F:AUTO_CURSE +F:BLACK_BREATH +F:CURSED +F:DRAIN_EXP +F:HEAVY_CURSE F:LUCK -F:SEE_INVIS | AGGRAVATE | HEAVY_CURSE | CURSED | BLACK_BREATH | DRAIN_EXP | -F:AUTO_CURSE | WOUNDING +F:SEE_INVIS +F:WOUNDING # No CURSE_NO_DROP here, players seems to unlike surprises N:104:of Angmar @@ -1335,7 +1602,10 @@ X:A:24:0 W:0:1:2:0 C:-100:-100:0:0 R:100 -F:NEVER_BLOW | HEAVY_CURSE | CURSED | AUTO_CURSE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:NEVER_BLOW ### Missile Launchers ### @@ -1360,8 +1630,10 @@ X:A:25:20 W:0:4:21:10000 C:5:10:0:1 R:100 -F:XTRA_MIGHT | PVAL_M3 | R_ANY -f:XTRA_MIGHT | +F:PVAL_M3 +F:R_ANY +F:XTRA_MIGHT +f:XTRA_MIGHT N:108:of Extra Shots T:19:0:99 @@ -1369,8 +1641,9 @@ X:A:25:20 C:10:5:0:1 W:0:4:21:10000 R:100 -F:XTRA_SHOTS | PVAL_M2 -f:XTRA_SHOTS | +F:PVAL_M2 +F:XTRA_SHOTS +f:XTRA_SHOTS # Bows only N:109:of Lothlorien @@ -1379,8 +1652,14 @@ X:A:25:20 W:50:2:21:30000 C:10:10:0:2 R:100 -F:DEX | XTRA_MIGHT | FREE_ACT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE | -F:BLESSED | ABILITY +F:ABILITY +F:BLESSED +F:DEX +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT # Crossbows only N:110:of the Haradrim @@ -1389,7 +1668,11 @@ X:A:25:30 W:50:2:21:20000 C:5:15:0:1 R:100 -F:XTRA_MIGHT | XTRA_SHOTS | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT +F:XTRA_SHOTS # Slings only N:111:of Buckland @@ -1398,7 +1681,12 @@ W:40:2:21:20000 C:8:8:0:2 T:19:1:1 R:100 -F:DEX | XTRA_SHOTS | XTRA_MIGHT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE +F:DEX +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:XTRA_MIGHT +F:XTRA_SHOTS ### Ammo ### @@ -1449,8 +1737,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_ACID | IGNORE_ACID -f:BRAND_ACID | +F:BRAND_ACID +F:IGNORE_ACID +f:BRAND_ACID W:0:1:12:30 # 117 All Elements at once - melee weapon @@ -1462,16 +1751,26 @@ T:22:0:99 T:23:0:99 T:24:0:99 R:100 -F:BRAND_ACID | RES_ACID | IGNORE_ACID -F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC -F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE -F:BRAND_COLD | RES_COLD | IGNORE_COLD -F:BRAND_POIS | RES_POIS | DRAIN_MANA -f:BRAND_ACID | -f:BRAND_ELEC | -f:BRAND_FIRE | -f:BRAND_COLD | -f:BRAND_POIS | +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:DRAIN_MANA +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +f:BRAND_ACID +f:BRAND_COLD +f:BRAND_ELEC +f:BRAND_FIRE +f:BRAND_POIS N:118:of Slay Demon T:16:0:99 @@ -1506,8 +1805,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_ELEC | IGNORE_ELEC -f:BRAND_ELEC | +F:BRAND_ELEC +F:IGNORE_ELEC +f:BRAND_ELEC W:0:1:12:30 N:122:of Flame @@ -1516,8 +1816,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_FIRE | IGNORE_FIRE -f:BRAND_FIRE | +F:BRAND_FIRE +F:IGNORE_FIRE +f:BRAND_FIRE W:0:2:12:25 N:123:of Frost @@ -1526,8 +1827,9 @@ T:17:0:99 T:18:0:99 X:A:23:10 R:100 -F:BRAND_COLD | IGNORE_COLD -f:BRAND_COLD | +F:BRAND_COLD +F:IGNORE_COLD +f:BRAND_COLD W:0:2:12:25 N:124:of Wounding @@ -1578,9 +1880,15 @@ X:A:25:20 W:0:2:3:1000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | -F:RES_ACID | CHR | SEE_INVIS -F:R_ANY | PVAL_M2 +F:CHR +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M2 +F:RES_ACID +F:R_ANY +F:SEE_INVIS R:25 F:PVAL_M1 @@ -1591,9 +1899,19 @@ X:A:25:20 W:0:1:3:2000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SUST_CHR | -F:RES_FIRE | RES_COLD | RES_ELEC | RES_ACID | CHR | SEE_INVIS -F:R_ANY | PVAL_M3 +F:CHR +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M3 +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_ANY +F:SEE_INVIS +F:SUST_CHR R:50 F:PVAL_M1 R:35 @@ -1607,8 +1925,13 @@ X:B:25:20 W:0:1:2:2000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | ACTIVATE -F:R_ANY | PVAL_M2 +F:ACTIVATE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M2 +F:R_ANY R:50 F:PVAL_M1 R:25 @@ -1658,7 +1981,10 @@ X:A:51:10 W:0:1:10:10000 C:0:0:0:0 R:100 -F:CAPACITY | CHARGING | CHEAPNESS | FAST_CAST | +F:CAPACITY +F:CHARGING +F:CHEAPNESS +F:FAST_CAST ### Lights ### @@ -1709,10 +2035,10 @@ R:100 F:LITE1 F:LITE2 F:LITE3 +F:RES_DARK f:LITE1 f:LITE2 f:LITE3 -F:RES_DARK N:141:of the Shadows X:A:0:6 @@ -1741,7 +2067,8 @@ T:39:0:99 W:0:3:40:4000 C:0:0:0:0 R:100 -F:RES_BLIND | SEE_INVIS +F:RES_BLIND +F:SEE_INVIS N:144:of the Ethereal Eye X:A:0:7 @@ -1766,9 +2093,19 @@ X:B:30:18 W:0:2:20:5000 C:0:0:15:2 R:100 -F:STR | CON | INFRA | FREE_ACT | HIDE_TYPE | -F:RES_FEAR | RES_DARK | SUST_STR | SUST_CON | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INFRA +F:RES_DARK +F:RES_FEAR +F:STR +F:SUST_CON +F:SUST_STR # Magical: affects soft armour, gloves, cloaks @@ -1782,11 +2119,19 @@ T:45:0:99 W:5:1:10:2000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -f:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE R:50 -F:SPELL_CONTAIN | WIELD_CAST -f:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST +f:SPELL_CONTAIN +f:WIELD_CAST # Ring and Amulet egos @@ -1822,13 +2167,17 @@ T:65:31:99 W:0:1:20:1000 C:0:0:0:3 R:100 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:50 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:10 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 R:1 -F:PVAL_M5 | PVAL_M3 +F:PVAL_M3 +F:PVAL_M5 ### Trapping Kits ### @@ -1857,8 +2206,11 @@ T:46:0:99 W:0:1:10:3000 C:10:10:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | F:AUTOMATIC_5 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE f:AUTOMATIC_5 N:154:Fully Automatic @@ -1867,8 +2219,11 @@ T:46:0:99 W:0:1:15:5000 C:10:10:0:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | F:AUTOMATIC_99 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE f:AUTOMATIC_99 N:155:Well-hidden @@ -1877,8 +2232,12 @@ T:46:0:99 W:0:1:8:1000 C:15:15:5:12 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE | -F:STEALTH | HIDE_TYPE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:STEALTH f:STEALTH N:156:Complicated @@ -1887,7 +2246,10 @@ T:46:0:99 W:0:1:12:2000 C:15:15:30:0 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:157:Obvious X:B:0:0 @@ -1895,7 +2257,9 @@ T:46:0:99 W:0:1:1:0 C:-20:-20:-20:-20 R:100 -F:STEALTH | CURSED | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:STEALTH f:STEALTH N:158:for Dragons @@ -1904,8 +2268,12 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_DRAGON | HIDE_TYPE | XTRA_SHOTS | -F:IGNORE_ACID | IGNORE_FIRE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:ONLY_DRAGON +F:STEALTH +F:XTRA_SHOTS N:159:for Demons X:A:0:5 @@ -1913,8 +2281,12 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_DEMON | HIDE_TYPE | XTRA_SHOTS -F:IGNORE_ACID | IGNORE_FIRE +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:ONLY_DEMON +F:STEALTH +F:XTRA_SHOTS N:160:for Animals X:A:0:5 @@ -1922,7 +2294,10 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_ANIMAL | HIDE_TYPE | XTRA_SHOTS +F:HIDE_TYPE +F:ONLY_ANIMAL +F:STEALTH +F:XTRA_SHOTS N:161:for Undead X:A:0:5 @@ -1930,7 +2305,11 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_UNDEAD | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST +F:HIDE_TYPE +F:KILL_GHOST +F:ONLY_UNDEAD +F:STEALTH +F:XTRA_SHOTS N:162:for Evil X:A:0:5 @@ -1938,7 +2317,11 @@ T:46:0:99 W:0:3:10:500 C:20:20:10:4 R:100 -F:STEALTH | ONLY_EVIL | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST +F:HIDE_TYPE +F:KILL_GHOST +F:ONLY_EVIL +F:STEALTH +F:XTRA_SHOTS # Lite ego N:163:of the Magi @@ -1948,15 +2331,19 @@ W:0:1:150:2000 C:0:0:0:3 Z:magic map R:100 -F:INT | WIS | CHR +F:CHR +F:INT +F:WIS R:60 -F:INVIS | RES_BLIND +F:INVIS +F:RES_BLIND R:30 F:R_HIGH R:30 F:PVAL_M2 R:50: -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST ### New ego-items added by JLE @@ -1968,7 +2355,8 @@ C:0:0:-50:0 T:36:0:99 T:37:0:99 R:100 -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:CURSED # Shield of Vulnerability (the only cursed shield) [not in Theme, it isn't!] N:165:of Vulnerability @@ -1978,7 +2366,8 @@ C:0:0:-50:0 T:115:56:56 T:34:0:99 R:100 -F:AGGRAVATE | CURSED +F:AGGRAVATE +F:CURSED # Shield of Preservation - N:166:of Preservation @@ -1988,8 +2377,16 @@ C:-10:-10:20:0 T:115:56:56 T:34:0:99 R:100 -F:RES_DISEN | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE | R_HIGH | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_DISEN +F:R_HIGH +F:SUST_CON +F:SUST_DEX +F:SUST_STR R:33 F:R_LOW R:33 @@ -2003,7 +2400,9 @@ T:32:0:6 T:32:8:99 T:33:0:99 R:100 -F:RES_SOUND | RES_CONF | RES_FEAR +F:RES_CONF +F:RES_FEAR +F:RES_SOUND # Crown of Night and Day N:168:of Night and Day @@ -2011,7 +2410,12 @@ X:A:33:18 W:35:1:15:4000 T:33:0:99 R:100 -F:RES_LITE | RES_DARK | LITE1 | SEE_INVIS | RES_BLIND | IGNORE_ACID +F:IGNORE_ACID +F:LITE1 +F:RES_BLIND +F:RES_DARK +F:RES_LITE +F:SEE_INVIS # Cloak of the Magi N:169:of the Magi @@ -2020,9 +2424,16 @@ W:30:1:18:2000 C:-5:-5:5:3 T:35:0:99 R:100 -F:INT | SPEED | SUST_INT | FREE_ACT | STEALTH | HIDE_TYPE | IGNORE_ACID +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:INT +F:SPEED +F:STEALTH +F:SUST_INT R:30 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST # Cloak of Invisibility N:170:of Invisibility @@ -2031,7 +2442,9 @@ W:40:1:18:3000 C:0:0:10:5 T:35:0:99 R:100 -F:STEALTH | HIDE_TYPE | INVIS +F:HIDE_TYPE +F:INVIS +F:STEALTH f:INVIS # Cloak of the Bat @@ -2041,7 +2454,13 @@ W:50:1:35:3000 C:-10:-10:10:3 T:35:0:99 R:100 -F:SPEED | FLY | RES_DARK | SEE_INVIS | INFRA | HIDE_TYPE | STEALTH +F:FLY +F:HIDE_TYPE +F:INFRA +F:RES_DARK +F:SEE_INVIS +F:SPEED +F:STEALTH # Leather Gloves of Thievery N:172:of Thievery @@ -2050,7 +2469,13 @@ W:40:1:15:5000 C:8:3:0:5 T:31:1:1 R:100 -F:DEX | SEARCH | SHOW_MODS | FEATHER | FREE_ACT | HIDE_TYPE | IGNORE_ACID +F:DEX +F:FEATHER +F:FREE_ACT +F:HIDE_TYPE +F:IGNORE_ACID +F:SEARCH +F:SHOW_MODS R:10 F:SPEED @@ -2061,8 +2486,14 @@ W:50:1:15:7000 C:6:8:-20:2 T:31:2:99 R:100 -F:STR | CON | SHOW_MODS | AGGRAVATE | HIDE_TYPE | IGNORE_ACID | RES_FEAR | +F:AGGRAVATE +F:CON F:DRAIN_HP +F:HIDE_TYPE +F:IGNORE_ACID +F:RES_FEAR +F:SHOW_MODS +F:STR R:25 F:BLOWS @@ -2072,7 +2503,8 @@ X:A:35:20 W:0:3:27:5000 T:30:0:99 R:100 -F:RES_NEXUS | FEATHER +F:FEATHER +F:RES_NEXUS # Boots of Elvenkind (leather boots only) N:175:of Elvenkind @@ -2081,7 +2513,12 @@ W:60:1:36:200000 C:0:0:0:4 T:30:2:3 R:100 -F:STEALTH | HIDE_TYPE | FEATHER | IGNORE_ACID | IGNORE_FIRE | ABILITY +F:ABILITY +F:FEATHER +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:STEALTH R:50 F:SPEED @@ -2096,8 +2533,14 @@ T:24:8:99 T:125:0:99 C:10:10:-20:2 R:100 -F:STR | BLOWS | AGGRAVATE | RES_FEAR | HIDE_TYPE | -F:IGNORE_ACID | IGNORE_FIRE | DRAIN_MANA +F:AGGRAVATE +F:BLOWS +F:DRAIN_MANA +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_FEAR +F:STR # Staffs of wishing N:177:of Plenty @@ -2146,7 +2589,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_COLD_3 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:182:Dragon T:14:7:7 @@ -2155,7 +2601,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_ELEC_3 R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:183:Dragon T:14:7:7 @@ -2164,7 +2613,10 @@ W:0:1:2:2000 C:0:0:0:0 a:BA_FIRE_H R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE # Helm of water breathing N:184:of Water Breathing @@ -2173,7 +2625,8 @@ C:0:0:0:2 W:15:1:25:1000 T:32:5:10 R:100 -F:WATER_BREATH | IGNORE_ACID +F:IGNORE_ACID +F:WATER_BREATH f:WATER_BREATH # A second of life for non MUST2H weapons, much lower value tho @@ -2188,7 +2641,8 @@ W:0:1:50:30000 C:5:5:0:1 r:F:MUST2H R:100 -F:LIFE | HOLD_LIFE +F:HOLD_LIFE +F:LIFE f:LIFE # Cloak of Air @@ -2216,7 +2670,10 @@ X:A:25:30 W:60:5:30:30000 C:10:15:20:2 R:120 -F:XTRA_MIGHT | XTRA_SHOTS | REFLECT | IMMOVABLE +F:IMMOVABLE +F:REFLECT +F:XTRA_MIGHT +F:XTRA_SHOTS ### New ego-items from T-Plus by Ingeborg S. Norden ### @@ -2226,7 +2683,9 @@ N:189:Rogue's X:B:35:15 W:15:10:25:2500 C:-5:-5:0:2 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE T:30:2:3 Z:panic hit R:100 @@ -2239,7 +2698,7 @@ R:25 F:LUCK f:LUCK R:10 -F:R_HIGH | +F:R_HIGH ### Egos for rings, amulets and crowns (partly inspired by Multiband) @@ -2255,8 +2714,8 @@ T:45:0:38 W:5:1:10:1250 C:0:0:0:0 R:100 -F:LITE1 | -f:LITE1 | +F:LITE1 +f:LITE1 # Dazzling (as above, with more light plus resistance/granted ability) @@ -2270,14 +2729,15 @@ W:10:3:12:2500 C:0:0:0:0 Z:illuminate R:100 -F:LITE2 | RES_LITE | -f:LITE2 | +F:LITE2 +F:RES_LITE +f:LITE2 R:50 -F:LITE1 | -f:LITE1 | +F:LITE1 +f:LITE1 R:25 -F:LITE3 | -f:LITE3 | +F:LITE3 +f:LITE3 # Radiant (Dazzling with some extras; # no cursed jewelry) @@ -2292,20 +2752,23 @@ T:45:51:99 W:15:5:15:3500 C:0:0:0:0 Z:illuminate -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:LITE3 | RES_LITE | -f:LITE3 | +F:LITE3 +F:RES_LITE +f:LITE3 R:50 -F:LITE2 | -f:LITE2 | +F:LITE2 +f:LITE2 R:25 -F:LITE1 | -f:LITE1 | +F:LITE1 +f:LITE1 R:20 -F:RES_BLIND | +F:RES_BLIND R:2 -F:REFLECT | +F:REFLECT # Blazing (Glowing plus fiery sheath, resistance, undamaged by # fire; restrictions as per Glowing, but no Cold Resistance/Ice @@ -2321,16 +2784,20 @@ T:45:51:99 W:15:5:15:3000 C:0:0:0:0 R:100 -F:LITE1 | RES_FIRE | SH_FIRE | -f:LITE1 | SH_FIRE | IGNORE_FIRE +F:LITE1 +F:RES_FIRE +F:SH_FIRE +f:IGNORE_FIRE +f:LITE1 +f:SH_FIRE R:25 -F:LITE2 | -f:LITE2 | +F:LITE2 +f:LITE2 R:10 -F:LITE3 | -f:LITE3 | +F:LITE3 +f:LITE3 R:2 -F:IM_FIRE | +F:IM_FIRE # Lucky (amulets only--resists cursing, undamaged by elements, luck # bonus added; no inherently cursed types or Nothing amulets) @@ -2341,9 +2808,12 @@ T:40:2:15 T:40:17:99 W:15:5:15:2750 C:0:0:0:5 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:BLESSED | LUCK | +F:BLESSED +F:LUCK # Unlucky (amulets only; no Prot/Evil, Doom, or Nothing amulets) N:195:Unlucky @@ -2353,9 +2823,12 @@ T:40:17:99 W:0:3:10:0 C:-5:-5:-5:-5 R:100 -F:CURSED | AUTO_CURSE | LUCK | AGGRAVATE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:LUCK R:20 -F:HEAVY_CURSE | +F:HEAVY_CURSE # Armour of the Maiar (of the Chosen in T-Plus) @@ -2366,15 +2839,30 @@ X:A:30:30 W:10:3:45:15000 C:0:0:15:0 R:100 -F:BLESSED | ESP_EVIL | ESP_GIANT | ESP_TROLL | -F:FREE_ACT | RES_FEAR | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:OLD_RESIST | -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:BLESSED +F:ESP_EVIL +F:ESP_GIANT +F:ESP_TROLL +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:OLD_RESIST +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FEAR +F:RES_FIRE +f:FREE_ACT +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE Z:berserk R:25 -F:R_HIGH | SUSTAIN | +F:R_HIGH +F:SUSTAIN ### Weapons of the Maiar (of the Chosen in T-Plus) N:197:of the Maiar @@ -2387,19 +2875,37 @@ X:A:24:35 W:10:5:45:30000 C:6:6:4:3 R:100 -F:SLAY_GIANT | SLAY_TROLL | -F:SEE_INVIS | FREE_ACT | BLESSED | RES_FEAR | -F:ESP_GIANT | ESP_TROLL | -F:LIMIT_BLOWS | -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:BLESSED +F:ESP_GIANT +F:ESP_TROLL +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:LIMIT_BLOWS +F:RES_FEAR +F:SEE_INVIS +F:SLAY_GIANT +F:SLAY_TROLL +f:FREE_ACT +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE R:33 -F:ESP_EVIL | SLAY_EVIL | R_ANY | +F:ESP_EVIL +F:R_ANY +F:SLAY_EVIL R:10 F:BLOWS R:1 F:PVAL_M1 -r:F:CHAOTIC | DRAIN_HP | VAMPIRIC | CURSED | HEAVY_CURSE | +r:F:CHAOTIC +r:F:CURSED +r:F:DRAIN_HP +r:F:HEAVY_CURSE +r:F:VAMPIRIC # Robe of Ithryn (of the Archmagi in T-Plus) N:198:of the Ithryn @@ -2408,15 +2914,30 @@ X:A:30:30 W:15:3:45:15000 C:-5:-5:15:2 R:100 -F:FREE_ACT | RES_BLIND | RES_CONF | R_HIGH | SUST_INT | -F:SPELL_CONTAIN | WIELD_CAST | -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SUST_INT | -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_BLIND +F:RES_CONF +F:R_HIGH +F:SPELL_CONTAIN +F:SUST_INT +F:WIELD_CAST +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE +f:SUST_INT +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:33 -F:RES_DISEN | SPELL | +F:RES_DISEN +F:SPELL R:10 -F:MANA | +F:MANA # Robe of Sanctity @@ -2426,16 +2947,30 @@ X:A:30:30 W:15:3:45:15000 C:0:0:15:2 R:100 -F:FREE_ACT | RES_BLIND | RES_CONF | R_HIGH | SUST_WIS | -F:BLESSED | ACTIVATE | -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SUST_WIS | +F:ACTIVATE +F:BLESSED +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_BLIND +F:RES_CONF +F:R_HIGH +F:SUST_WIS +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE +f:SUST_WIS a:PROT_EVIL -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:33 -F:ESP_EVIL | +F:ESP_EVIL R:10 -F:SPELL | +F:SPELL N:200:Ethereal T:35:0:99 @@ -2444,17 +2979,28 @@ X:B:25:25 W:15:2:20:27500 C:0:0:20:0 R:100 -F:FREE_ACT | SEE_INVIS | HOLD_LIFE | -F:ACTIVATE | -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +F:ACTIVATE +F:FREE_ACT +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SEE_INVIS +f:FREE_ACT +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE a:SPECTRAL R:33 -F:RES_NETHER | +F:RES_NETHER R:5 -F:MAGIC_BREATH | -f:MAGIC_BREATH | +F:MAGIC_BREATH +f:MAGIC_BREATH ### More new ego-items from Annals of Ea by Feanor: @@ -2465,8 +3011,13 @@ X:A:24:80 W:40:25:100:25000 C:0:0:0:5 R:100 -F:ESP_EVIL | SPELL | MANA -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ESP_EVIL +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:MANA +F:SPELL # Swords of the Noldor N:202:of the Noldor @@ -2475,19 +3026,43 @@ X:A:24:35 W:40:25:100:50000 C:15:15:20:4 R:100 -F:STEALTH | RES_POIS | DEX | CON | WIS | HOLD_LIFE | +F:BLESSED +F:CON +F:DEX +F:FEATHER +F:FREE_ACT +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REGEN +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:SLAY_EVIL +F:STEALTH +F:SUSTAIN +F:WIS +F:WOUNDING f:STEALTH -F:FREE_ACT | SEE_INVIS | FEATHER | REGEN | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -F:R_ANY | R_LOW | SUSTAIN -F:SLAY_EVIL | BLESSED | WOUNDING R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY # Spear of Vanyar N:203:of the Vanyar @@ -2496,17 +3071,38 @@ R:100 X:A:24:35 W:40:25:100:50000 C:15:15:20:4 -F:STEALTH | HOLD_LIFE | SEE_INVIS | WIS | INT | -F:REGEN | RES_FEAR | RES_DARK | RES_LITE | RES_BLIND | -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD | -F:SLAY_DEMON | SLAY_UNDEAD | BLESSED | -F:R_ANY | R_LOW | SUSTAIN +F:BLESSED +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INT +F:REGEN +F:RES_BLIND +F:RES_DARK +F:RES_FEAR +F:RES_LITE +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_UNDEAD +F:STEALTH +F:SUSTAIN +F:WIS R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY # Axe of the Nandor N:204:of the Nandor @@ -2515,16 +3111,33 @@ R:100 X:A:24:35 W:40:25:100:50000 C:15:15:20:5 -F:STEALTH | SPEED | SEE_INVIS | RES_COLD | RES_ELEC | -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC | -F:SLAY_ORC | SLAY_ANIMAL | RES_POIS | -F:R_ANY | R_LOW | SUSTAIN +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_COLD +F:RES_ELEC +F:RES_POIS +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:SLAY_ANIMAL +F:SLAY_ORC +F:SPEED +F:STEALTH +F:SUSTAIN R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY # Arrow of Teleri N:205:of the Teleri @@ -2532,7 +3145,9 @@ T:17:0:99 X:A:23:10 W:40:25:100:5000 R:100 -F:R_ANY | WOUNDING | BLESSED +F:BLESSED +F:R_ANY +F:WOUNDING # Hafted of Avari N:206:of the Avari @@ -2541,15 +3156,28 @@ R:100 X:A:24:35 W:40:25:100:50000 C:15:15:20:5 -F:STEALTH | INVIS | SEE_INVIS | INFRA | RES_DARK | -F:RES_BLIND | SLAY_UNDEAD | -F:R_ANY | R_LOW | SUSTAIN +F:INFRA +F:INVIS +F:RES_BLIND +F:RES_DARK +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:SLAY_UNDEAD +F:STEALTH +F:SUSTAIN R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN R:10 -F:R_IMMUNITY | R_ANY +F:R_ANY +F:R_IMMUNITY ### Ravenred's Weapons of Unmagic @@ -2564,7 +3192,7 @@ W:0:2:44:8000 C:-10:-10:0:0 R:100 F:ANTIMAGIC_50 -f:ANTIMAGIC_50 +f:ANTIMAGIC_50 ### Amulet and ring egos suggested by power @@ -2575,10 +3203,18 @@ T:45:1:99 X:B:0:10 W:0:5:100:2000 C:0:0:10:2 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:WIS | SEE_INVIS | HOLD_LIFE | BLESSED -f:WIS | SEE_INVIS | HOLD_LIFE | BLESSED +F:BLESSED +F:HOLD_LIFE +F:SEE_INVIS +F:WIS +f:BLESSED +f:HOLD_LIFE +f:SEE_INVIS +f:WIS #Demonic - anything but Devotion and Protection from Evil N:209:Demonic @@ -2591,8 +3227,10 @@ W:0:5:100:2000 C:0:0:0:2 r:F:BLESSED R:100 -F:ESP_DEMON | RES_FIRE -f:ESP_DEMON | RES_FIRE +F:ESP_DEMON +F:RES_FIRE +f:ESP_DEMON +f:RES_FIRE # Jewellery of the Rohirrim - no speed rings N:210:Rohirric @@ -2602,10 +3240,14 @@ T:45:32:99 X:B:0:10 W:0:5:100:20000 C:0:0:0:3 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE | +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:RES_FEAR | SPEED -f:RES_FEAR | SPEED +F:RES_FEAR +F:SPEED +f:RES_FEAR +f:SPEED # Draconic - anything but Devotion and Protection from Evil N:211:Draconic @@ -2631,16 +3273,27 @@ X:B:0:30 W:25:5:50:1000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC | -F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | R_ANY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_ANY R:20 -F:IM_FIRE | R_HIGH +F:IM_FIRE +F:R_HIGH R:15 -F:IM_COLD | R_HIGH +F:IM_COLD +F:R_HIGH R:10 -F:IM_ELEC | R_HIGH +F:IM_ELEC +F:R_HIGH R:5 -F:IM_ACID | R_HIGH +F:IM_ACID +F:R_HIGH R:1 F:IM_NETHER @@ -2655,10 +3308,19 @@ X:A:0:30 W:0:5:30:0 C:0:0:0:-10 R:100 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC | -F:CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE R:50 -F:R_STAT | CURSED | HEAVY_CURSE | AUTO_CURSE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:R_STAT #Horns of Ulmo (Ulumuri) @@ -2668,8 +3330,12 @@ X:A:0:80 W:0:5:80:5000 C:0:0:0:0 R:100 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC | -F:PVAL_M5 | R_IMMUNITY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:PVAL_M5 +F:R_IMMUNITY # Reverse Armour of the Maiar (of the Chosen in T-Plus) N:215:of the Fallen @@ -2679,14 +3345,30 @@ X:A:30:30 W:0:3:45:0 C:0:0:-15:0 R:25 -F:CURSED | AUTO_CURSE | ESP_GOOD | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | +F:AUTO_CURSE +F:CURSED +F:ESP_GOOD +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE R:50 -F:CURSED | AUTO_CURSE | R_LOW | SUSTAIN | AGGRAVATE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:R_LOW +F:SUSTAIN R:75 -F:CURSED | AUTO_CURSE | WRAITH | DRAIN_EXP | +F:AUTO_CURSE +F:CURSED +F:DRAIN_EXP +F:WRAITH R:100 -F:CURSED | AUTO_CURSE | DRAIN_MANA | DRAIN_HP | BLACK_BREATH +F:AUTO_CURSE +F:BLACK_BREATH +F:CURSED +F:DRAIN_HP +F:DRAIN_MANA ###Reverse Weapons of the Maiar (of the Chosen in T-Plus) N:216:of the Fallen @@ -2699,16 +3381,36 @@ X:A:24:35 W:0:5:45:0 C:+6:+6:-5:-3 R:100 -F:NEVER_BLOW | IM_NETHER | PERMA_CURSE +F:IM_NETHER +F:NEVER_BLOW +F:PERMA_CURSE R:50 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | NO_MAGIC | CLONE +F:AUTO_CURSE +F:CLONE +F:CURSED +F:HEAVY_CURSE +F:NO_MAGIC R:33 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | DRAIN_EXP | DRAIN_MANA +F:AUTO_CURSE +F:CURSED +F:DRAIN_EXP +F:DRAIN_MANA +F:HEAVY_CURSE R:10 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | CHAOTIC | DRAIN_HP +F:AUTO_CURSE +F:CHAOTIC +F:CURSED +F:DRAIN_HP +F:HEAVY_CURSE R:1 -F:R_STAT | CURSED | AUTO_CURSE | ESP_GOOD | -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | +F:AUTO_CURSE +F:CURSED +F:ESP_GOOD +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:R_STAT # Robe of Fools (reverse of Ithryn/Archmagi in T-Plus) N:217:of the Fools @@ -2717,11 +3419,22 @@ X:A:30:30 W:0:3:45:0 C:-5:-5:-15:-2 R:100 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | LIFE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:LIFE R:33 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | RES_DISEN | SPELL | NO_MAGIC | +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:NO_MAGIC +F:RES_DISEN +F:SPELL R:10 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | MANA | +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:MANA # Robe of Vice (reverse of Sanctity in T-Plus) N:218:of Vice @@ -2730,9 +3443,14 @@ X:A:30:30 W:0:3:45:0 C:0:0:-15:-2 R:100 -F:CURSED | HEAVY_CURSE | AUTO_CURSE | LIFE | AGGRAVATE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:LIFE R:33 -F:ESP_GOOD | ANTIMAGIC_50 +F:ANTIMAGIC_50 +F:ESP_GOOD # Soft and Hard Armour of Sensitivity, no paper armour N:219:of Sensitivity @@ -2745,7 +3463,9 @@ X:A:30:30 W:0:3:45:0 C:0:0:-5:-2 R:100 -F:CURSED | SENS_FIRE | R_STAT | +F:CURSED +F:R_STAT +F:SENS_FIRE # Elemental ammo N:220:Elemental @@ -2756,16 +3476,20 @@ X:B:30:30 W:0:1:50:1000 C:5:5:0:0 R:100 -F:BRAND_ACID | IGNORE_ACID -F:BRAND_ELEC | IGNORE_ELEC -F:BRAND_FIRE | IGNORE_FIRE -F:BRAND_COLD | IGNORE_COLD -F:BRAND_POIS | -f:BRAND_ACID | -f:BRAND_ELEC | -f:BRAND_FIRE | -f:BRAND_COLD | -f:BRAND_POIS | +F:BRAND_ACID +F:BRAND_COLD +F:BRAND_ELEC +F:BRAND_FIRE +F:BRAND_POIS +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:BRAND_ACID +f:BRAND_COLD +f:BRAND_ELEC +f:BRAND_FIRE +f:BRAND_POIS # Cursed ammo @@ -2777,7 +3501,8 @@ X:A:30:30 W:0:1:50:0 C:-10:-10:0:0 R:100 -F:CURSED | IMMOVABLE +F:CURSED +F:IMMOVABLE # Bows of Numenor @@ -2787,8 +3512,13 @@ X:A:50:50 W:0:1:50:0 C:10:10:0:3 R:100 -F:DEX | XTRA_MIGHT | XTRA_SHOTS | -F:RES_FEAR | RES_POIS | RES_DARK | FREE_ACT +F:DEX +F:FREE_ACT +F:RES_DARK +F:RES_FEAR +F:RES_POIS +F:XTRA_MIGHT +F:XTRA_SHOTS # Lights of Valinor (no refillable lights) @@ -2798,9 +3528,20 @@ X:A:60:60 W:0:2:60:45000 C:0:0:0:2 R:100 -F:STR | INT | WIS | DEX | CON | CHR +F:CHR +F:CON +F:DEX F:ESP_ALL -f:STR | INT | WIS| DEX | CON | CHR | ESP_ALL +F:INT +F:STR +F:WIS +f:CHR +f:CON +f:DEX +f:ESP_ALL +f:INT +f:STR +f:WIS # Lucky weapons - named after smith of legend N:224:of Telchar @@ -2811,7 +3552,9 @@ T:24:0:99 X:A:70:70 W:10:2:70:3000 C:10:10:0:2 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 F:LUCK f:LUCK @@ -2826,8 +3569,16 @@ X:A:50:50 W:0:2:50:0 C:5:5:0:-2 R:100 -F:LUCK | CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE -f:LUCK | CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:HEAVY_CURSE +F:LUCK +f:AGGRAVATE +f:AUTO_CURSE +f:CURSED +f:HEAVY_CURSE +f:LUCK # Holy ammo - based on 'Of Holy Might' from Hengband N:226:Blessed @@ -2838,8 +3589,13 @@ X:B:30:30 W:0:5:60:600 C:5:10:0:0 R:100 -F:SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD | BRAND_FIRE | BLESSED -F:IGNORE_FIRE | IGNORE_ACID +F:BLESSED +F:BRAND_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD # Holy Avenger weapons brought back, modified N:227:(Holy Avenger) @@ -2851,9 +3607,13 @@ X:A:50:50 W:0:2:60:20000 C:5:5:0:3 R:100 -F:WIS | SUSTAIN | -F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | -F:SEE_INVIS | BLESSED +F:BLESSED +F:SEE_INVIS +F:SLAY_DEMON +F:SLAY_EVIL +F:SLAY_UNDEAD +F:SUSTAIN +F:WIS # A Whip of the Balroeg, adapted from Oangband N:228:of the Balroeg @@ -2862,8 +3622,12 @@ X:A:50:50 W:0:3:50:12000 C:-10:10:0:-3 R:100 -F:STEALTH | BRAND_FIRE | RES_FIRE | LITE2 | -F:IGNORE_FIRE | ESP_GOOD | +F:BRAND_FIRE +F:ESP_GOOD +F:IGNORE_FIRE +F:LITE2 +F:RES_FIRE +F:STEALTH R:5 F:IM_FIRE @@ -2876,7 +3640,9 @@ X:A:25:10 W:0:3:50:0 C:0:0:0:-1 r:F:BLESSED -F:DRAIN_EXP | SEE_INVIS | CHR +F:CHR +F:DRAIN_EXP +F:SEE_INVIS # Magical missile launchers # Tiny mana boost for magic-using archers or warrior-types @@ -2900,13 +3666,23 @@ T:45:0:56 T:45:59:99 W:5:1:10:2000 C:0:0:0:0 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD -f:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE R:50 -F:SPELL_CONTAIN | WIELD_CAST -f:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST +f:SPELL_CONTAIN +f:WIELD_CAST # Magestaves of Sorcery, added in Theme 1.0.1 N:232:of Sorcery @@ -2914,9 +3690,13 @@ X:A:24:60 T:6:0:99 W:30:1:8:100000 C:-80:-80:0:3 -r:F:CURSED | HEAVY_CURSE | PERMA_CURSE +r:F:CURSED +r:F:HEAVY_CURSE +r:F:PERMA_CURSE R:100 -F:MANA | SPELL | LIFE +F:LIFE +F:MANA +F:SPELL R:50 F:PVAL_M2 @@ -2929,7 +3709,9 @@ T:24:0:99 X:A:70:70 W:0:2:70:50000 C:1:1:0:0 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 F:LEVELS f:LEVELS @@ -2941,8 +3723,15 @@ X:A:25:20 W:50:2:21:50000 C:10:10:0:2 R:100 -F:CON | XTRA_MIGHT | XTRA_SHOTS | RES_POIS | STEALTH -F:IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE | SEE_INVIS +F:CON +F:HIDE_TYPE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_POIS +F:SEE_INVIS +F:STEALTH +F:XTRA_MIGHT +F:XTRA_SHOTS # Spear of Mirkwood, added in Theme 1.0.2 N:235:of Mirkwood @@ -2950,16 +3739,32 @@ T:22:2:2 X:A:24:35 W:40:25:100:50000 C:15:15:20:3 -r:F:CURSED | HEAVY_CURSE | AUTO_CURSE +r:F:AUTO_CURSE +r:F:CURSED +r:F:HEAVY_CURSE R:100 -F:STEALTH | HOLD_LIFE | SEE_INVIS | CON | -F:RES_FEAR | RES_DARK | RES_LITE | RES_BLIND | -F:IGNORE_ACID | IGNORE_FIRE | -F:R_ANY | R_LOW | SUSTAIN +F:CON +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_FIRE +F:RES_BLIND +F:RES_DARK +F:RES_FEAR +F:RES_LITE +F:R_ANY +F:R_LOW +F:SEE_INVIS +F:STEALTH +F:SUSTAIN R:30 -F:R_ANY | R_LOW | SUSTAIN +F:R_ANY +F:R_LOW +F:SUSTAIN R:20 -F:R_ANY | R_LOW | SUSTAIN | R_HIGH +F:R_ANY +F:R_HIGH +F:R_LOW +F:SUSTAIN # Dwarven jewelry - no speed rings; added in Theme 1.1.4 N:236:Dwarven @@ -2975,7 +3780,8 @@ Z:stone to mud R:50 F:SUSTAIN R:25 -F:R_ANY | SUSTAIN +F:R_ANY +F:SUSTAIN R:5 F:CON diff --git a/lib/mods/theme/edit/f_info.txt b/lib/mods/theme/edit/f_info.txt index 2b42aa47..c4d2f149 100644 --- a/lib/mods/theme/edit/f_info.txt +++ b/lib/mods/theme/edit/f_info.txt @@ -25,39 +25,62 @@ F:FLOOR N:1:open floor G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT # 0x02 -> fountain N:2:fountain G:_:w -F:FLOOR | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:The liquid here seems magical. # 0x03 --> glyph of warding N:3:glyph of warding G:;:y -F:FLOOR | NOTICE | SUPPORT_LIGHT | CAN_RUN | REMEMBER +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is a mighty spell of protection here. # 0x04 --> open door N:4:open door G:':U -F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR +F:CAN_RUN +F:DOOR +F:FLOOR +F:NOTICE +F:REMEMBER # 0x05 --> broken door N:5:broken door G:':U -F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR +F:CAN_RUN +F:DOOR +F:FLOOR +F:NOTICE +F:REMEMBER # 0x06 --> up stairs (perm) N:6:up staircase G:<:w -F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is an up staircase here. D:1:You cannot tunnel a stair. @@ -65,60 +88,102 @@ D:1:You cannot tunnel a stair. N:7:down staircase G:>:w -F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT D:0:There is a down staircase here. D:1:You cannot tunnel a stair. N:8:quest entrance G:>:y -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a quest entrance. N:9:quest exit G:<:y -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a quest exit. N:10:quest down level G:>:r -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:11:quest up level G:<:r -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:12:town exit G:>:g -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER N:13:shaft down G:>:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a shaft down here. D:1:You cannot tunnel a shaft. N:14:shaft up G:<:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a shaft up here. D:1:You cannot tunnel a shaft. # 0x0F -> empty fountain N:15:fountain G:_:D -F:FLOOR | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:The fountain seems empty. N:16:web G:+:y -F:CAN_PASS | NOTICE | WEB | NOTICE | TUNNELABLE +F:CAN_PASS +F:NOTICE +F:NOTICE +F:TUNNELABLE +F:WEB D:1:You tunnel through the web. D:2:a web blocking your way # Trap -- the flags are not used by the program N:17:trap G:^:w -F:FLOOR | NOTICE | REMEMBER +F:FLOOR +F:NOTICE +F:REMEMBER # 0x12 --> 0x1F -- UNUSED @@ -127,8 +192,14 @@ F:FLOOR | NOTICE | REMEMBER N:32:door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 1) @@ -136,8 +207,14 @@ D:1:You bash the boor. N:33:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 2) @@ -145,8 +222,14 @@ D:1:You bash the boor. N:34:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 3) @@ -154,8 +237,14 @@ D:1:You bash the boor. N:35:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 4) @@ -163,8 +252,14 @@ D:1:You bash the boor. N:36:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 5) @@ -172,8 +267,14 @@ D:1:You bash the boor. N:37:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 6) @@ -181,8 +282,14 @@ D:1:You bash the boor. N:38:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> locked door (power 7) @@ -190,8 +297,14 @@ D:1:You bash the boor. N:39:locked door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR +F:CAN_PASS +F:DOOR +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 0) @@ -199,8 +312,13 @@ D:1:You bash the boor. N:40:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 1) @@ -208,8 +326,13 @@ D:1:You bash the boor. N:41:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 2) @@ -217,8 +340,13 @@ D:1:You bash the boor. N:42:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 3) @@ -226,8 +354,13 @@ D:1:You bash the boor. N:43:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 4) @@ -235,8 +368,13 @@ D:1:You bash the boor. N:44:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 5) @@ -244,8 +382,13 @@ D:1:You bash the boor. N:45:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 6) @@ -253,8 +396,13 @@ D:1:You bash the boor. N:46:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x2x --> jammed door (power 7) @@ -262,8 +410,13 @@ D:1:You bash the boor. N:47:jammed door G:+:U M:32 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:REMEMBER F:TUNNELABLE +F:WALL D:1:You bash the boor. # 0x30 --> secret door @@ -271,36 +424,55 @@ D:1:You bash the boor. N:48:secret door G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | DOOR +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:DOOR +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You tunnel. # 0x31 --> rubble N:49:pile of rubble G:::w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE -F:CAN_FLY | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You dig in the rubble. # 0x32 --> magma vein N:50:magma vein G:%:s -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x33 --> quartz vein N:51:quartz vein G:%:w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x34 --> magma vein + treasure @@ -308,9 +480,14 @@ D:1:You tunnel into the quartz vein. N:52:magma vein G:%:s M:50 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x35 --> quartz vein + treasure @@ -318,36 +495,55 @@ D:1:You tunnel into the magma vein. N:53:quartz vein G:%:w M:51 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x36 --> magma vein + known treasure N:54:magma vein with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the magma vein. # 0x37 --> quartz vein + known treasure N:55:quartz vein with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the quartz vein. # 0x38 --> granite wall -- basic N:56:granite wall G:#:w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x39 --> granite wall -- inner @@ -355,9 +551,13 @@ D:1:You tunnel into the granite wall. N:57:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3A --> granite wall -- outer @@ -365,9 +565,13 @@ D:1:You tunnel into the granite wall. N:58:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3B --> granite wall -- solid @@ -375,233 +579,347 @@ D:1:You tunnel into the granite wall. N:59:granite wall G:#:w M:56 -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the granite wall. # 0x3C --> permanent wall -- basic (perm) N:60:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3D --> permanent wall -- inner (perm) N:61:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3E --> permanent wall -- outer (perm) N:62:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL # 0x3F --> permanent wall -- solid (perm) N:63:permanent wall G:#:w M:60 -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:64:explosive rune G:*:R -F:FLOOR | CAN_LEVITATE | CAN_FLY | NOTICE | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:NOTICE +F:SUPPORT_LIGHT D:0:This rune seems unstable. N:65:Straight Road startpoint G:*:w -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:66:section of the Straight Road G:*:B -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:67:section of the Straight Road G:*:b -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:68:section of the Straight Road G:*:B -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:69:section of the Straight Road G:*:b -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:70:section of the Straight Road G:*:W -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:71:section of the Straight Road (discharged) G:*:W -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:72:Straight Road exit G:*:w -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER N:73:corrupted section of the Straight Road G:*:D -F:FLOOR | REMEMBER | NOTICE +F:FLOOR +F:NOTICE +F:REMEMBER # 74 --> shop N:74:Building G:1:U -F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER # 75 --> 78 Quests index N:75:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:76:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:77:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:78:permanent wall G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL #Elanor N:79:grass with Elanor flowers G:&:y -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Fumellar N:80:grass with Fumella flowers G:;:r -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Anemones N:81:grass with anemones G:;:v -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Niphredil N:82:grass with Niphredil flowers G:;:w -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Iris N:83:grass with irises G:;:b -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:84:stream of shallow water G:~:B S:B:B:B:B:B:B:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER F:SUPPORT_GROWTH +F:SUPPORT_LIGHT # -1 = player level N:85:pool of deep lava G:.:R E:-1d2:1:FIRE -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:You move across the deep lava. N:86:stream of shallow lava G:.:r E:-1d1:1:FIRE -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:You move across the shallow lava. N:87:dark pit G:#:D -F:CAN_LEVITATE | CAN_FLY -F:NO_WALK | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE F:DONT_NOTICE_RUNNING +F:NO_WALK +F:SUPPORT_LIGHT D:0:Ohhh, it is dark and deep. N:88:dirt G:.:U -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT N:89:patch of grass G:.:G -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT N:90:ice G:.:W E:1d1:50:ICE -F:FLOOR | NOTICE +F:FLOOR +F:NOTICE N:91:sand G:.:y -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:92:dead tree G:#:D -F:CAN_FLY | CAN_PASS -F:WALL | NO_WALK | NO_VISION | NOTICE +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You chop away at the dead tree. D:2:a tree blocking your way N:93:ash G:.:s -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:94:puddle of mud G:.:u -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH N:95:ice wall G:#:W -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the ice wall... #BOh, chilly#w. D:2:an ice wall blocking your way N:96:tree G:#:G -F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You chop away at the tree. D:2:a tree blocking your way N:97:mountain chain G:^:U -F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_CLIMB +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel into such a hard stone. D:2:a hard stone block blocking your way @@ -609,9 +927,12 @@ D:2:a hard stone block blocking your way N:98:sandwall G:#:y -F:WALL | NO_WALK | CAN_PASS | NO_VISION +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily dig into the sandwall. D:2:a sandwall blocking your way @@ -620,9 +941,12 @@ D:2:a sandwall blocking your way N:99:sandwall G:%:y M:98 -F:WALL | NO_WALK | CAN_PASS | NO_VISION +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily dig into the sandwall. D:2:a sandwall blocking your way @@ -630,16 +954,23 @@ D:2:a sandwall blocking your way N:100:sandwall with treasure G:*:o -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:TUNNELABLE +F:WALL D:1:You easily tunnel into the sandwall. D:2:a sandwall blocking your way N:101:high mountain chain G:^:W -F:WALL | NO_WALK | NO_VISION | PERMANENT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:This rock is far too hard. D:2:a very hard stone block blocking your way @@ -648,71 +979,112 @@ G:.:v S:v:R:r:v:R:r:D E:1d1:40:NETHER F:ATTR_MULTI -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR # A diggable glass wall. N:103:molten glass wall G:.:B -F:NO_WALK | WALL | CAN_PASS | TUNNELABLE | NOTICE +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:TUNNELABLE +F:WALL D:1:You tunnel into the molten glass wall... D:2:a molten glass wall blocking your way N:159:Void Jumpgate G:+:v -F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:A dark rift opens to the void here. N:160:Void Jumpgate G:+:v -F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:A dark rift opens to the void here. ###### Here are the altars. ###### N:161:Altar of Being G:0:W -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You feel at peace. N:162:Altar of Winds G:0:B -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to become a bird. N:163:Altar of Force G:0:R -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to fight evil. N:164:Altar of Darkness G:0:D -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:Images of pain and death fill your mind. N:165:Altar of Nature G:0:g -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You feel the desire to walk in a great forest. N:166:Altar of Stone G:0:s -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to forge items. N:167:Altar of Light G:0:y -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to light up dark places. N:168:Altar of Waters G:0:b -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to bathe in the ocean. N:169:Altar of Doom G:0:o -F:FLOOR | REMEMBER | NOTICE | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:REMEMBER D:0:You grow a desire to do justice. # XXX @@ -727,20 +1099,30 @@ D:0:You grow a desire to do justice. # Used as a marker for random quests N:172:open floor G:.:w -F:FLOOR | CAN_RUN | DONT_NOTICE_RUNNING +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH # Underground Tunnel N:173:Underground Tunnel G:#:s -F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:Oh, an underground tunnel! # Tainted water N:174:stream of tainted water G:~:u -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT N:175:monster trap G:;:v @@ -748,14 +1130,22 @@ F:FLOOR N:176:Void Jumpgate G:+:v -F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:A dark rift opens to the void here. N:177:lava wall G:#:R S:R:R:r:r:U:u:R F:ATTR_MULTI -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:The lava is far too hot to tunnel into it. D:2:a lava wall blocking your way @@ -764,33 +1154,51 @@ G:%:v S:R:R:y:v:y:v:R E:150d2:1:HELL_FIRE F:ATTR_MULTI -F:FLOOR | REMEMBER | NOTICE | PERMANENT +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:This fire is so powerful it could destroy even the most powerful artifacts. N:179:path to the next area G:>:w -F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a path leading to the next area here. D:1:You cannot tunnel a path. N:180:path to the previous area G:<:w -F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN +F:CAN_RUN +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:0:There is a path leading to the previous area here. D:1:You cannot tunnel a path. N:181:field G:::g -F:FLOOR | PERMANENT | NOTICE | REMEMBER F:DONT_NOTICE_RUNNING +F:FLOOR +F:NOTICE +F:PERMANENT +F:REMEMBER D:1:You cannot tunnel a field. N:182:Ekkaia, the Encircling Sea G:*:b S:b:b:b:b:b:b:B F:ATTR_MULTI -F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL N:183:void G: :d @@ -804,97 +1212,159 @@ N:187:pool of deep water G:~:b S:b:b:b:b:b:b:B F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Glass wall -- can see but not pass N:188:glass wall G:.:B -F:NO_WALK | WALL | PERMANENT | NOTICE F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:PERMANENT +F:WALL D:1:This glass seems to be totaly impenetrable. D:2:a glass wall blocking your way # Illusion wall -- can't see but can pass N:189:illusion wall G:#:w -F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT D:0:Looks like this wall is not so real. # Grass roof N:190:Grass roof G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass roof top N:191:grass roof top G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass roof chimney N:192:grass roof chimney G:#:y -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof N:193:brick roof G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof top N:194:brick roof top G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # brick roof chimney N:195:brick roof chimney G:#:r -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # window N:196:window G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # small window N:197:small window G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # rain barrel N:198:rain barrel G:#:w -F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL # grass with Kingsfoil flowers N:199:grass with Kingsfoil flowers G:;:G -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH # cobblestone road N:200:cobblestone road G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR # cobblestone with outlet N:201:cobblestone with outlet G:.:w -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR N:202:small tree G:#:g -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT # Just to have a town entrance picture N:203:town G:*:w -F:FLOOR | NOTICE +F:FLOOR +F:NOTICE # Underground Tunnel N:204:Underground Tunnel G:^:U -F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT D:0:Oh, an underground tunnel! # Fire @@ -904,108 +1374,166 @@ S:y:y:y:R:r:y:R E:-1d2:1:FIRE D:0:The blazing fire burns you! F:ATTR_MULTI -F:FLOOR | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Permanent rubble -- town use N:206:pile of rubble G:::w -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE -F:CAN_FLY | SUPPORT_LIGHT | PERMANENT +F:CAN_FLY +F:CAN_PASS +F:NOTICE +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:Looks like this pile of rubble is quite hard. # Rocky ground - rougher terrain. N:207:rocky ground G:.:s -F:FLOOR | SUPPORT_LIGHT | CAN_RUN +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_LIGHT # cloud-like vapour. Floor for Eru's temple N:208:cloud-like vapour G:.:W S:W:B:B:W:w:W:B -F:FLOOR | CAN_LEVITATE | CAN_FLY | SUPPORT_LIGHT -F:ATTR_MULTI | CAN_RUN | DONT_NOTICE_RUNNING +F:ATTR_MULTI +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_LIGHT # condensing water N:209:condensing water G:~:B S:B:B:B:B:B:B:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT # Dense mist. Can pass through, but not see through N:210:dense mist G:#:w S:w:W:s:s:s:w:w -F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT -F:ATTR_MULTI | DONT_NOTICE_RUNNING +F:ATTR_MULTI +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT D:0:You wander through the mist. D:1:You cannot tunnel through mist! # Hail-stone wall N:211:hail-stone wall G:#:W -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You tunnel into the hail-stone wall. N:212:dead small tree G:#:D -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:NO_VISION +F:REMEMBER +F:SUPPORT_LIGHT # Low hill N:213:low hill G:^:g -F:FLOOR | DONT_NOTICE_RUNNING| CAN_RUN | SUPPORT_LIGHT | NO_VISION +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NO_VISION +F:SUPPORT_LIGHT D:0:You go over the hill. D:1:You cannot tunnel through that. #Angband and Mordor (Ered Lithui, Ephel Duath) mountains N:214:dark mountain chain G:^:D -F:WALL | NO_WALK | NO_VISION | PERMANENT F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:This rock is far too hard. D:2:a very hard stone block blocking your way #Ered Luin - Blue Mountains N:215:blue mountain chain G:^:B -F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_CLIMB +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel into such a hard stone. D:2:a hard stone block blocking your way #Ered Mithrin - Grey Mountains N:216:grey mountain chain G:^:s -F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_CLIMB +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel into such a hard stone. D:2:a hard stone block blocking your way #Orodruin - Mount Doom N:217:part of Mount Doom G:^:R -F:WALL | NO_WALK | NO_VISION | NOTICE | SUPPORT_LIGHT F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a stream of searing lava barring your way #Snow-capped peak N:218:snow-capped peak G:^:w -F:WALL | NO_WALK | NO_VISION | NOTICE | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | PERMANENT +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:The ice is too cold to tunnel into it. D:2:an unusually thick wall of ice barring your way @@ -1013,45 +1541,66 @@ D:2:an unusually thick wall of ice barring your way #BUG - these do not burn. N:219:fir tree G:#:g -F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT F:TUNNELABLE +F:WALL D:1:You chop away at the fir tree. D:2:a fir tree blocking your way #section of a flet (wooden platforms built high up in the trees of Lothlórien) N:220:section of a flet G:_:u -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR #light post N:221:light post G:|:w -F:WALL | NO_WALK | CAN_FLY | CAN_PASS -F:SUPPORT_LIGHT | REMEMBER +F:CAN_FLY +F:CAN_PASS +F:NO_WALK +F:REMEMBER +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel a light post. D:2:A light post blocking your way #Water lily N:222:water lily G:;:B -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Dead Marshes swamp water N:223:part of the Dead Marshes G:~:G E:10d10:6:CONFUSION -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT #Morannon N:224:Black Gate G:+:D -F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION | NOTICE +F:CAN_CLIMB +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a closed Black Gate blocking your way @@ -1060,14 +1609,24 @@ N:225:river G:~:w S:w:w:w:B:w:w:B F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN -F:DONT_NOTICE_RUNNING | SUPPORT_GROWTH +F:CAN_FLY +F:CAN_LEVITATE +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_GROWTH +F:SUPPORT_LIGHT #Swamp N:226:swamp pool G:~:g E:1d1:1:POISON -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_LIGHT #Anduin river N:227:stream of the Anduin river @@ -1075,14 +1634,23 @@ G:~:B E:1d1:1:WATER S:w:w:w:b:w:w:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | SUPPORT_GROWTH +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR +F:REMEMBER +F:SUPPORT_GROWTH +F:SUPPORT_LIGHT #Road sign to Gondolin to avoid Maeglin quest silliness somewhat N:228:road sign that says 'Find Gondolin!' G:?:v S:v:R:B:G:w:v:R F:ATTR_MULTI -F:WALL | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | +F:NOTICE +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT +F:WALL ### New terrain features for town use ### @@ -1090,8 +1658,15 @@ F:WALL | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | N:229:beehive G:*:o E:1d1:1:POISON -F:WALL | PERMANENT | CAN_FLY | REMEMBER | SUPPORT_LIGHT | -F:CAN_PASS | NO_WALK | NO_VISION | DONT_NOTICE_RUNNING | +F:CAN_FLY +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:REMEMBER +F:SUPPORT_LIGHT +F:WALL D:0:Ouch! A bee stung you! D:1:You'll just get stung. D:2:a beehive blocking your way @@ -1099,49 +1674,81 @@ D:2:a beehive blocking your way #Dirt road - same as dirt but more appropriate for towns N:230:dirt road G:.:U -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR F:SUPPORT_GROWTH #Wide gate N:231:wide gate G:-:D -F:WALL | PERMANENT | CAN_FLY | SUPPORT_LIGHT | NOTICE | -F:CAN_PASS | NO_WALK | NO_VISION | DONT_NOTICE_RUNNING | +F:CAN_FLY +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a closed gate barring your way #Same gate, but opened N:232:open gate G:':D -F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_LIGHT ### For wood houses, bridges, etc: #Wooden board - horizontal N:233:wooden board G:-:u -F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY +F:CAN_FLY +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a wooden board blocking your way #Wooden board - vertical N:234:wooden board G:|:u -F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY +F:CAN_FLY +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a wooden board blocking your way #Light wooden board - horizontal N:235:wooden board G:-:U -F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY +F:CAN_FLY +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a wooden board blocking your way #Light wooden board - vertical N:236:wooden board G:|:U -F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY +F:CAN_FLY +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a wooden board blocking your way @@ -1149,9 +1756,14 @@ D:2:a wooden board blocking your way #BUG - these do not burn. N:237:white tree G:#:w -F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION | PERMANENT +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:SUPPORT_LIGHT +F:WALL D:1:You cannot tunnel through that. D:2:a white tree blocking your way @@ -1161,35 +1773,52 @@ G:|:B E:25d10:1:WATER S:w:w:w:b:w:w:b F:ATTR_MULTI -F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | -F:DONT_NOTICE_RUNNING | SUPPORT_GROWTH | +F:CAN_FLY +F:CAN_LEVITATE +F:DONT_NOTICE_RUNNING +F:FLOOR +F:REMEMBER +F:SUPPORT_GROWTH +F:SUPPORT_LIGHT #Slippery rock ledge N:239:slippery rock ledge G:&:s E:5d10:1:COLD -F:FLOOR | CAN_LEVITATE | CAN_FLY | SUPPORT_LIGHT | +F:CAN_FLY +F:CAN_LEVITATE +F:FLOOR F:SUPPORT_GROWTH +F:SUPPORT_LIGHT #Stable N:240:stable G:#:u -F:WALL | NO_WALK | NO_VISION | PERMANENT | CAN_FLY +F:CAN_FLY +F:NO_VISION +F:NO_WALK +F:PERMANENT +F:WALL D:1:You cannot tunnel through that. D:2:a stable wall blocking your way #Wooden plank N:241:wooden plank G:%:U -F:FLOOR | CAN_RUN | DONT_NOTICE_RUNNING | SUPPORT_LIGHT | -F:SUPPORT_GROWTH | +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:SUPPORT_GROWTH +F:SUPPORT_LIGHT #Fosse (dry moat) N:242:fosse pit G:&:g -F:CAN_LEVITATE | CAN_FLY -F:NO_WALK | SUPPORT_LIGHT +F:CAN_FLY +F:CAN_LEVITATE F:DONT_NOTICE_RUNNING +F:NO_WALK +F:SUPPORT_LIGHT D:1:You cannot tunnel through that. D:2:a dry moat blocking your way @@ -1197,9 +1826,13 @@ D:2:a dry moat blocking your way N:243:Mallorn G:*:y S:y:W:W:y:w:W:y -F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT -F:WALL | NO_WALK | NO_VISION +F:CAN_FLY +F:CAN_PASS F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT +F:WALL D:1:It isn't a good idea to harm a Mallorn. D:2:a Mallorn blocking your way @@ -1208,33 +1841,56 @@ D:2:a Mallorn blocking your way N:244:copper pillar G:#:u S:u:u:u:o:u:u:u -F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | ATTR_MULTI +F:ATTR_MULTI +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT +F:WALL D:1:The copper is too tough to tunnel through. D:2:a copper pillar blocking your way N:245:ethereal wall G:.:w -F:WALL | NO_WALK | PERMANENT | NOTICE | DONT_NOTICE_RUNNING +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:PERMANENT +F:WALL D:1:You can't even see your obstruction! D:2:an unseen force blocking your way N:246:glacial wall G:#:B -F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | TUNNELABLE +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NO_VISION +F:NO_WALK +F:SUPPORT_LIGHT +F:TUNNELABLE +F:WALL D:1:You tunnel into the glacial wall... #BOh, chilly!#w. D:2:a hard glacial wall blocking your way N:247:battlement G:#:w -F:NO_WALK | CAN_PASS | NOTICE | SUPPORT_LIGHT -F:DONT_NOTICE_RUNNING | TUNNELABLE +F:CAN_PASS +F:DONT_NOTICE_RUNNING +F:NOTICE +F:NO_WALK +F:SUPPORT_LIGHT +F:TUNNELABLE D:1:You tunnel into the battlement. D:2:a hard stone battlement blocking your way N:248:door of Orthanc G:':r -F:FLOOR | NOTICE | REMEMBER | CAN_RUN -F:SUPPORT_LIGHT | DONT_NOTICE_RUNNING -D:0:The Key of Orthanc allows you to pass. \ No newline at end of file +F:CAN_RUN +F:DONT_NOTICE_RUNNING +F:FLOOR +F:NOTICE +F:REMEMBER +F:SUPPORT_LIGHT +D:0:The Key of Orthanc allows you to pass. diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index 21db38f0..055f9e5e 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -275,7 +275,8 @@ N:29:& Blue Stone~ G:":B I:40:18:0 W:60:0:3:90000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### Edged Weapons ##### @@ -294,7 +295,8 @@ I:23:21:0 W:15:0:140:350 A:15/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a long, double-edged sword with a plain hilt that could D:be wielded in one or two hands. It's called a "bastard sword" because in @@ -349,8 +351,11 @@ W:70:0:180:4000 A:70/8 P:0:6d5:0:0:0 F:ATTR_MULTI -F:RES_CHAOS | CHAOTIC | SHOW_MODS -f:RES_CHAOS | CHAOTIC +F:CHAOTIC +F:RES_CHAOS +F:SHOW_MODS +f:CHAOTIC +f:RES_CHAOS D:A mighty sword which seems to be completely blunt. However, it is a conduit D:into the realms of pure chaos and strikes its victims with the devastating D:might of chaos itself whenever it connects. It gives you resistance to chaos @@ -363,7 +368,8 @@ I:23:25:0 W:30:0:200:775 A:30/1:40/1 P:0:3d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This blade is lot longer, wider and heavier than a long sword. You have to D:wield it with two hands. This means that wielding a shield makes fighting @@ -397,7 +403,8 @@ I:23:28:0 W:40:0:260:850 A:40/1 P:0:4d5:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:These weapons have been built in all sizes. They are custom-made D:for warriors that want to set out and kill their archenemy. These @@ -409,7 +416,8 @@ I:23:20:0 W:20:0:120:400 A:20/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The katana is a long blade with only a small disk for a guard. D:Its hilt is long enough for two hands, though it could be used @@ -489,7 +497,8 @@ I:21:6:0 W:20:0:150:200 A:20/1 P:0:2d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon has a ball linked with a chain to a wooden handle. D:Preferred tactic is smashing the brains of your opponent. @@ -511,7 +520,8 @@ I:21:13:0 W:10:0:150:353 A:10/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon was originally used to cut corn. More warlike versions D:sport a large blade stuck on a wooden handle. The hinge allows it to get @@ -523,7 +533,8 @@ I:21:18:0 W:45:0:280:590 A:45/1 P:0:3d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This two-handed version of the flail gives the fighter a fearsome D:weapon that can do a fair amount of damage. It typically has several @@ -545,7 +556,8 @@ I:21:5:0 W:5:0:120:130 A:5/1 P:0:2d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This weapon is a club ending in a sphere. The sphere is studded D:with metal shards, and thus can both crush and cut your adversary. @@ -556,7 +568,8 @@ I:21:3:0 W:10:0:150:200 A:10/1 P:0:1d9:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A long, wooden pole, usually the height of the wielder. Four of them can be D:made out of the trunk of one young tree, hence the name. The quarterstaff @@ -570,7 +583,8 @@ I:21:8:0 W:5:0:120:225 A:5/1 P:0:3d3:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A large hammer, designed to crush skulls with mighty strikes. @@ -580,7 +594,8 @@ I:21:15:0 W:15:0:180:502 A:15/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A large, mean mace filled with lead in order to wreak a maximum of havoc. @@ -590,8 +605,11 @@ I:21:20:0 W:80:0:400:4300 A:80/5 P:0:5d8:0:0:0 -F:SLAY_UNDEAD | SHOW_MODS | MUST2H -f:MUST2H | SLAY_UNDEAD +F:MUST2H +F:SHOW_MODS +F:SLAY_UNDEAD +f:MUST2H +f:SLAY_UNDEAD D:This mace is custom-made for priests that go out to destroy evil. D:It is deadly, especially for undead. @@ -601,7 +619,8 @@ I:21:10:0 W:10:0:120:376 A:10/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A war hammer combined with a spearpoint, mounted on a long pole. @@ -613,7 +632,8 @@ I:22:10:0 W:15:0:180:408 A:15/1 P:0:2d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This polearm has a beak mounted opposite the blade. @@ -623,7 +643,8 @@ I:22:13:0 W:20:0:190:363 A:20/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A polearm with a long, slightly curved knife-like blade. It has spurs on D:the dull side of the blade. It's primarily a slashing and chopping weapon. Glaives @@ -637,7 +658,8 @@ I:22:15:0 W:25:0:190:430 A:25/1 P:0:3d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The halberd has a broad, short axe blade on a 5-6 ft long haft, with a D:spearpoint at the top, often a back-spike and occasionally a butt-spike. Used to @@ -653,7 +675,8 @@ I:22:4:0 W:10:0:160:340 A:10/1 P:0:1d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a polearm with a long square-sectioned spike on the end. @@ -663,7 +686,8 @@ I:22:8:0 W:15:0:160:358 A:15/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A staff, 16-18 feet long, that has a small piercing head about 10 inches D:long. The pike is often used by infantry to fend off cavalry. It is very @@ -688,7 +712,8 @@ I:22:5:0 W:5:0:70:120 A:5/1 P:0:1d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:The trident is based on the pitchfork. In fact, when not used as a weapon, D:it is often employed as a pitchfork. It is famous for its uses in @@ -701,7 +726,8 @@ I:22:20:0 W:10:0:300:230 A:10/1 P:0:2d8:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is the original polearm. It is shaped like a spear but is bigger. It's D:meant to fend off enemies, not to be thrown. @@ -712,7 +738,8 @@ I:24:25:0 W:40:0:230:500 A:40/1 P:0:4d4:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:A huge and heavy two-headed axe. @@ -722,7 +749,8 @@ I:22:22:0 W:15:0:170:334 A:15/1 P:0:2d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft. D:The Nordics' take on the halberd. The polearm of choice for many Nordics, @@ -734,7 +762,8 @@ I:22:28:0 W:45:0:250:750 A:45/1 P:0:3d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft. D:Another Nordic version of the halberd. The polearm of choice for many Nordics, @@ -746,7 +775,8 @@ I:24:11:0 W:15:0:160:304 A:15/1 P:0:2d6:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A one-headed axe made for combat, with an elongated moon-shaped blade. @@ -756,7 +786,8 @@ I:22:17:0 W:45:0:250:800 A:45/1 P:0:5d3:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A simple farm implement, converted into a weapon by slightly straightening D:its blade and putting it in line with its pole, instead of the typical @@ -768,8 +799,13 @@ I:22:30:0 W:80:0:250:10000 A:80/20 P:0:8d4:0:0:0 -F:SHOW_MODS | MUST2H | WOUNDING | VORPAL -f:MUST2H | VORPAL | WOUNDING +F:MUST2H +F:SHOW_MODS +F:VORPAL +F:WOUNDING +f:MUST2H +f:VORPAL +f:WOUNDING D:The simple design of the war scythe, but this one uses a finely crafted and D:incredibly sharp steel blade which causes terrible wounds when it hits. @@ -962,8 +998,13 @@ I:35:2:0 W:30:0:5:1500 A:30/4 P:4:0d0:0:0:4 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE | IGNORE_ELEC -F:STEALTH | SEARCH | LUCK +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:LUCK +F:SEARCH +F:STEALTH f:STEALTH D:A wonderfully light cloak coloured in brown and green hues. Its colouring D:greatly helps the wearer to avoid undesired attention. Wearing it makes you @@ -1215,7 +1256,10 @@ I:37:30:0 W:75:0:420:20000 A:75/4 P:40:2d4:-4:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A suit of plate armour fashioned from a metal whose secret is only known to Eol, D:the dark Elvensmith. It is practically unbreakable. @@ -1276,7 +1320,9 @@ I:35:6:1 W:60:0:5:7500 A:75/4 P:6:0d0:0:0:4 -F:RES_DARK | RES_LITE | STEALTH +F:RES_DARK +F:RES_LITE +F:STEALTH f:STEALTH D:A rare cloak imbued with magic to radiate a strange twilight, absorbing both D:extreme brightness and darkness. @@ -1354,7 +1400,9 @@ G:=:d I:45:24:0 W:30:0:2:500 A:30/1 -F:STR | HIDE_TYPE | SUST_STR +F:HIDE_TYPE +F:STR +F:SUST_STR f:STR D:This bauble magically improves your strength. @@ -1363,7 +1411,9 @@ G:=:d I:45:26:0 W:30:0:2:500 A:30/1 -F:DEX | HIDE_TYPE | SUST_DEX +F:DEX +F:HIDE_TYPE +F:SUST_DEX f:DEX D:This piece of jewellery magically improves your agility. @@ -1372,7 +1422,9 @@ G:=:d I:45:27:0 W:30:0:2:500 A:30/1 -F:CON | HIDE_TYPE | SUST_CON +F:CON +F:HIDE_TYPE +F:SUST_CON f:CON D:This ring magically grants you health, improving your constitution. @@ -1381,7 +1433,9 @@ G:=:d I:45:25:0 W:30:0:2:500 A:30/1 -F:INT | HIDE_TYPE | SUST_INT +F:HIDE_TYPE +F:INT +F:SUST_INT f:INT D:This magical piece of jewellery makes you smarter. @@ -1390,7 +1444,8 @@ G:=:d I:45:31:0 W:75:0:2:100000 A:75/1 -F:SPEED | HIDE_TYPE +F:HIDE_TYPE +F:SPEED f:SPEED D:This wonderful ring grants you additional energy, allowing you to act faster. @@ -1399,7 +1454,8 @@ G:=:d I:45:23:0 W:5:0:2:250 A:5/1 -F:SEARCH | HIDE_TYPE +F:HIDE_TYPE +F:SEARCH f:SEARCH D:This ring magically improves your attention, so you can detect hidden things better. @@ -1410,7 +1466,10 @@ I:45:4:0 W:5:0:2:250 A:5/1 a:DEST_TELE -F:CURSED | TELEPORT | EASY_KNOW | ACTIVATE +F:ACTIVATE +F:CURSED +F:EASY_KNOW +F:TELEPORT f:TELEPORT D:This ring will uncontrollably send you to different places at its whim. D:You can use its power once at your will, but it will destroy the ring. @@ -1420,7 +1479,8 @@ G:=:d I:45:6:0 W:5:0:2:250 A:5/1 -F:SLOW_DIGEST | EASY_KNOW +F:EASY_KNOW +F:SLOW_DIGEST f:SLOW_DIGEST D:This magical bauble grants you some sustenance, allowing you to subsist on less food. @@ -1429,7 +1489,8 @@ G:=:d I:45:7:0 W:5:0:2:200 A:5/1 -F:FEATHER | EASY_KNOW +F:EASY_KNOW +F:FEATHER f:FEATHER D:When you put on this ring, you will be able to float just above the floor. D:It prevents you from drowning, and all your falls will be painless. @@ -1439,7 +1500,8 @@ G:=:d I:45:20:0 W:60:0:2:16000 A:60/2 -F:RES_POIS | EASY_KNOW +F:EASY_KNOW +F:RES_POIS f:RES_POIS D:This magical ring grants protection from poison. D:It is rumoured that in deep dungeons monsters can kill you at once if you @@ -1450,7 +1512,8 @@ G:=:d I:45:21:0 W:20:0:2:1500 A:20/1 -F:FREE_ACT | EASY_KNOW +F:EASY_KNOW +F:FREE_ACT f:FREE_ACT D:This magical bauble prevents you from being held. D:Some monsters will paralyse you and then kill you if you lack free action. @@ -1460,7 +1523,9 @@ G:=:d I:45:2:-5 W:5:0:2:0 A:5/1 -F:CURSED | STR | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:STR f:STR D:This accursed ring will sap your strength, rendering you much weaker as long as you wear it. @@ -1471,8 +1536,10 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_FIRE_4 -F:RES_FIRE | ACTIVATE -f:RES_FIRE | IGNORE_FIRE +F:ACTIVATE +F:RES_FIRE +f:IGNORE_FIRE +f:RES_FIRE D:This fiery circlet grants you protection, makes fire less dangerous and even D:allows you to call forth a ball of flame. @@ -1483,8 +1550,10 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_ACID_4 -F:RES_ACID | ACTIVATE -f:RES_ACID | IGNORE_ACID +F:ACTIVATE +F:RES_ACID +f:IGNORE_ACID +f:RES_ACID D:This magical ring is imbued with spells of devouring acid, granting protection against such D:assaults and the ability to shoot acid at your foes. @@ -1495,8 +1564,10 @@ W:50:0:2:3000 A:50/1 a:BA_COLD_4 P:0:0d0:0:0:15 -F:RES_COLD | ACTIVATE -f:RES_COLD | IGNORE_COLD +F:ACTIVATE +F:RES_COLD +f:IGNORE_COLD +f:RES_COLD D:This ring is imbued with supernatural cold, which makes you less vulnerable to such effects D:and occasionally allows you to throw balls of ice at your foes. @@ -1505,7 +1576,12 @@ G:=:d I:45:0:-5 W:50:0:2:0 A:50/1 -F:CURSED | TELEPORT | WIS | CHR | HIDE_TYPE | AUTO_CURSE +F:AUTO_CURSE +F:CHR +F:CURSED +F:HIDE_TYPE +F:TELEPORT +F:WIS D:This accursed ring will turn you into a bumbling fool and, in addition, magically D:transports you to places you never wanted to see. It can recurse itself if D:you leave it on too long. @@ -1515,7 +1591,9 @@ G:=:d I:45:3:-5 W:5:0:2:0 A:5/1 -F:CURSED | INT | HIDE_TYPE +F:CURSED +F:HIDE_TYPE +F:INT f:INT D:This wicked ring feeds off your intellect, magically making you stupid. @@ -1533,7 +1611,9 @@ G:=:d I:45:28:0 W:20:0:2:500 A:20/1 -F:HIDE_TYPE | EASY_USE | ACTIVATE | +F:ACTIVATE +F:EASY_USE +F:HIDE_TYPE a:WHIRLWIND D:This ring magically improves your control in combat, allowing you to hit more often. D:It can also sometimes be used to hit several nearby opponents with deadly accuracy. @@ -1550,7 +1630,10 @@ G:=:d I:45:1:0 W:5:0:2:0 A:5/1 -F:CURSED | AGGRAVATE | EASY_KNOW | AUTO_CURSE +F:AGGRAVATE +F:AUTO_CURSE +F:CURSED +F:EASY_KNOW f:AGGRAVATE D:This faithless ring will draw opponents' attention towards its hapless owner. D:If you have any pets, it will also make them turn against you. @@ -1560,7 +1643,8 @@ G:=:d I:45:22:0 W:30:0:2:340 A:30/1 -F:SEE_INVIS | EASY_KNOW +F:EASY_KNOW +F:SEE_INVIS f:SEE_INVIS D:This magical piece of jewellery allows your eyes to perceive beings otherwise unseen. @@ -1579,7 +1663,10 @@ G:":d I:40:6:0 W:50:0:3:1000 A:50/4 -F:INT | WIS | HIDE_TYPE | LITE1 +F:HIDE_TYPE +F:INT +F:LITE1 +F:WIS D:This talisman grants a sharper wit, greater insight and brightness to light dark places. N:164:Charisma @@ -1587,7 +1674,8 @@ G:":d I:40:7:0 W:30:0:3:500 A:30/1 -F:CHR | HIDE_TYPE +F:CHR +F:HIDE_TYPE f:CHR D:This amulet grants beauty beyond mere looks. @@ -1596,7 +1684,8 @@ G:":d I:40:5:0 W:15:0:3:600 A:15/1 -F:SEARCH | HIDE_TYPE +F:HIDE_TYPE +F:SEARCH f:SEARCH D:This amulet grants keen sight, finding things that are hidden. @@ -1605,7 +1694,9 @@ G:":d I:40:1:0 W:10:0:3:250 A:10/1 -F:CURSED | TELEPORT | EASY_KNOW +F:CURSED +F:EASY_KNOW +F:TELEPORT f:TELEPORT D:This amulet nastily throws you all over the place. @@ -1616,7 +1707,10 @@ G:":d I:40:2:0 W:25:0:3:10000 A:25/1 -F:EASY_KNOW | ACTIVATE | BLESSED | ESP_EVIL +F:ACTIVATE +F:BLESSED +F:EASY_KNOW +F:ESP_EVIL a:PROT_EVIL D:This blessed amulet fends off evil beings and warns the wearer D:of their presence. @@ -1640,9 +1734,18 @@ I:40:8:0 W:70:0:3:30000 A:70/8 P:0:0d0:-4:-4:0 -F:INT | SUST_INT | SEARCH | SPELL_CONTAIN | WIELD_CAST -F:FREE_ACT | RES_BLIND | RES_CONF | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FREE_ACT +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:INT +F:RES_BLIND +F:RES_CONF +F:SEARCH +F:SPELL_CONTAIN +F:SUST_INT +F:WIELD_CAST D:This rare amulet is highly desirable for mages, as it makes its wearer smarter, more attentive D:and impervious to magics which would make their own magic-use impossible. @@ -1651,8 +1754,16 @@ G:":d I:40:0:-5 W:50:0:3:0 A:50/1 -F:CURSED | STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE -F:AUTO_CURSE | CURSE_NO_DROP +F:AUTO_CURSE +F:CHR +F:CON +F:CURSED +F:CURSE_NO_DROP +F:DEX +F:HIDE_TYPE +F:INT +F:STR +F:WIS D:This wicked amulet will drain all your abilities, turning you into a mere shadow of yourself. It D:is exceedingly hard to get rid of. @@ -1713,7 +1824,10 @@ G:?:d I:70:50:0 W:100:0:5:10000 A:100/8 -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A piece of paper inscribed with strange shifting runes. Upon reading them, they will release D:a blast of chaotic forces. @@ -1853,7 +1967,8 @@ I:16:2:0 W:40:0:4:20 A:40/2:65/1 P:0:3d4:5:5:0 -F:SHOW_MODS | IGNORE_ACID +F:IGNORE_ACID +F:SHOW_MODS D:Sling bullets made from the slags of mithril smelting. They are unusually heavy, hitting D:with great force, and are almost imperishable. @@ -2486,8 +2601,11 @@ I:71:60:100 W:20:0:4:250 A:20/1:45/1:80/1:100/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD F:FOUNTAIN +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This great potion infuses you with the power of the elements, so that you can better D:withstand their ravages. @@ -2694,8 +2812,12 @@ W:127:0:4:0 A:127/255 P:0:1d1:0:0:0 T:39:2 -F:NORM_ART | FULL_NAME | SPECIAL_GENE | EASY_USE -F:ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:SPECIAL_GENE a:ETERNAL_FLAME D:An impossibly bright, flickering living flame. It can be used D:once to imbue an object with the power of Eru Iluvatar himself. @@ -2706,7 +2828,9 @@ I:23:34:0 W:0:0:7:10 A:0/1:5/1:10/1:20/1 P:0:1d4:0:0:0 -F:SHOW_MODS | VAMPIRIC | SPECIAL_GENE +F:SHOW_MODS +F:SPECIAL_GENE +F:VAMPIRIC D:A temporary weapon that only a necromancer can use. # The Horn of the Thunderlords @@ -2717,8 +2841,16 @@ W:50:10:10:12000 P:0:1d4:0:0:0 A:50/200 T:55:8 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD | -F:NO_RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME | SPECIAL_GENE +F:EASY_USE +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART +F:NO_RECHARGE +F:RECHARGED +F:SPECIAL_GENE D:This horn was given to you as a reward. Blow it if you are in dire need D:of leaving your current location fast. @@ -2894,7 +3026,8 @@ I:111:0:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The slick black cover of this tome seems to glow D:with an inner violet light. You feel more attuned D:to raw magic as you hold it. @@ -2905,7 +3038,9 @@ I:111:1:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_FIRE +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_FIRE D:The cover of this tome is bright red, with flickering D:flames dancing across it once in a while. As you hold D:it, you begin to gain a much closer knowledge of all @@ -2917,7 +3052,9 @@ I:111:2:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_ELEC +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ELEC D:The pages of this tome have a tendency to turn themselves, D:as though flipped by an errant wind. As you hold it, D:you start feeling wind at your fingertips. @@ -2928,7 +3065,9 @@ I:111:3:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_ACID +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ACID D:The solid leather cover of this tome seems permanently D:stained with caked mud and grass. Heavy it is to lift, D:yet strangely comforting to hold - you feel stronger @@ -2940,7 +3079,8 @@ I:111:4:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The cover and pages of this tome seem to be perpetually D:wet, though they are not wet to the touch. As you hold D:it, you begin to understand ocean storms better. @@ -2951,7 +3091,8 @@ I:111:5:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This book seems to flicker strangely. It's one of those books D:with an annoying tendency to disappear when you need it and D:reappear in the unlikeliest places. As you hold it, you start @@ -2963,7 +3104,8 @@ I:111:6:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The cover of this tome is a bright shade of green, and it gives off D:a healthy, zesty scent that makes your thoughts clearer. As you D:hold it, your heart goes out to all living things upon Arda. @@ -2974,7 +3116,8 @@ I:111:7:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A thick book with solid leather binding. It looks entirely D:unremarkable, but as you hold it, you feel strangely able D:to learn the inner workings of things and creatures. @@ -3054,8 +3197,11 @@ I:39:0:0:4000 W:1:0:30:2 A:1/1 P:0:1d1:0:0:0 -F:EASY_KNOW | LITE1 | FUEL_LITE -f:LITE1 | FUEL_LITE +F:EASY_KNOW +F:FUEL_LITE +F:LITE1 +f:FUEL_LITE +f:LITE1 D:A piece of wood with an oily rag wrapped around it. When lit, it will give off a little light and D:much smoke. @@ -3065,8 +3211,12 @@ I:39:1:0:7500 W:3:0:50:35 A:3/1 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE2 | FUEL_LITE -f:LITE2 | FUEL_LITE +F:EASY_KNOW +F:FUEL_LITE +F:IGNORE_FIRE +F:LITE2 +f:FUEL_LITE +f:LITE2 D:A brass container with a wick emerging from it, protected from draughts by a sheet of greased D:paper. It can be carried by a handle. @@ -3096,7 +3246,10 @@ I:66:28:90 W:95:0:15:150000 A:100/16 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This powerful rod will release great blasts of destructive energy, but there's no knowing what D:this effect will concentrate on. @@ -3106,7 +3259,10 @@ I:66:1:10 W:15:0:15:1000 A:15/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:When fuelled with enough ambient mana, this rod can detect nearby passages. N:352:Trap Location @@ -3115,7 +3271,10 @@ I:66:29:8 W:5:0:15:100 A:5/1:10/1:20/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares. N:353:Probing @@ -3124,7 +3283,10 @@ I:66:7:50 W:40:0:15:4000 A:40/4 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rod of knowledge which will tell you about nearby creatures' health. D:If they are sleeping, the intrusion will wake them. @@ -3134,7 +3296,10 @@ I:66:3:80 W:30:0:15:4500 A:30/4 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rod which can transport you from the depths to your home and back. N:355:Illumination @@ -3144,7 +3309,10 @@ W:20:0:15:1000 A:20/1 P:0:1d1:0:0:0 F:EASY_KNOW -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod carries a minor spell of brightness, lighting your immediate surroundings whenever D:activated. @@ -3154,7 +3322,10 @@ I:66:15:15 W:10:0:15:500 A:10/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod can shoot a lance of bright light, hurting creatures which lurk in the dark. N:357:Lightning Bolts @@ -3163,7 +3334,10 @@ I:66:21:30 W:20:0:15:2000 A:20/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod shoots a small spark of lightning, zapping the creature it hits. N:358:Frost Bolts @@ -3172,7 +3346,10 @@ I:66:23:35 W:25:0:15:2500 A:25/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A small but extremely cold shard of ice will fly from this rod to the enemy you zap it at. N:359:Fire Bolts @@ -3181,7 +3358,10 @@ I:66:22:40 W:30:0:15:3000 A:30/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod fires a magical flaming arrow at your foe, burning them. N:360:Polymorph @@ -3190,7 +3370,10 @@ I:66:19:25 W:35:0:15:1200 A:35/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod of change will cause its target creature to mutate into someone else. D:Beware, it can make a weak enemy into a more powerful one. @@ -3200,7 +3383,10 @@ I:66:17:25 W:30:0:15:1500 A:30/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This obstructive rod will slow the creature its spell hits. N:362:Sleep Monster @@ -3209,7 +3395,10 @@ I:66:16:25 W:30:0:15:1500 A:30/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This sorcerous rod will cause its target to stop in its tracks. N:363:Drain Life @@ -3218,7 +3407,10 @@ I:66:18:30 W:75:0:15:3600 A:75/4 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This necromantic magical rod will hurt a living creature struck by its spell. N:364:Teleport Other @@ -3227,7 +3419,10 @@ I:66:13:60 W:45:0:15:1400 A:45/2 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod of movement will displace its target to another location. N:365:Disarming @@ -3236,7 +3431,10 @@ I:66:14:50 W:35:0:15:2100 A:35/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod will clear a path for you, triggering and thus rendering harmless all traps on the way. N:366:Lightning Balls @@ -3245,7 +3443,10 @@ I:66:25:50 W:55:0:15:4000 A:55/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod will hurl a large ball of lightning at its target, electrifying all it engulfs. N:367:Cold Balls @@ -3254,7 +3455,10 @@ I:66:27:55 W:60:0:15:4500 A:60/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod will call forth a minor storm of ice which freezes everything in the area of its blast. N:368:Fire Balls @@ -3264,7 +3468,10 @@ W:75:0:15:5000 A:75/1 P:0:1d1:0:0:0 D:This rod will cause a small storm of flame to rage in a small circular area of your choice. -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE N:369:Acid Balls G:-:d @@ -3272,7 +3479,10 @@ I:66:24:60 W:70:0:15:5500 A:70/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This destructive rod will drown its target and its immediate surroundings in caustic acid. N:370:Acid Bolts @@ -3281,7 +3491,10 @@ I:66:20:40 W:40:0:15:3500 A:40/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod will shoot a small glob of powerful acid at its target. N:371:Enlightenment @@ -3290,7 +3503,10 @@ I:66:5:40 W:65:0:15:10000 A:65/4 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod grants you knowledge of your surroundings. N:372:Perception @@ -3299,7 +3515,10 @@ I:66:2:20 W:50:0:15:13000 A:50/8:100/8 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod makes you insightful, laying open the identity of your possessions. N:373:Curing @@ -3308,7 +3527,10 @@ I:66:8:35 W:65:0:15:15000 A:65/8 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This is a rod with minor healing powers, alleviating many disabling conditions. N:374:Healing @@ -3317,7 +3539,10 @@ I:66:9:120 W:80:0:15:20000 A:80/8 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod has major healing powers and can restore your health if you have been wounded. N:375:Detection @@ -3326,7 +3551,10 @@ I:66:6:80 W:30:0:15:5000 A:30/8 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod grants knowledge about all things worthy of notice in your vicinity. N:376:Restoration @@ -3335,7 +3563,10 @@ I:66:10:140 W:80:0:15:25000 A:80/16 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This rod lets you remember and gain back previously reduced abilities. N:377:Speed @@ -3344,7 +3575,10 @@ I:66:11:100 W:95:0:15:50000 A:95/16 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This energising rod will allow you to act a lot faster for some time. # Ring of Spell @@ -3354,7 +3588,8 @@ G:=:d I:45:58:0 W:10:0:2:1000 A:10/1 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST f:SPELL_CONTAIN D:This ring is a container for spells. Those that are skilled in copying spells can inscribe a D:spell onto it. @@ -3366,7 +3601,8 @@ G:":d I:40:27:0 W:10:0:2:1000 A:10/1 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST f:SPELL_CONTAIN D:This amulet is a container for spells. Those that are skilled in copying spells can inscribe a D:spell onto it. @@ -3469,9 +3705,14 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_ACID -F:RES_ACID | FLY | -f:RES_ACID | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +f:RES_ACID D:A pitch-black armour made from a black dragon's hide. D:It contains some of the dead beast's powers. @@ -3482,9 +3723,14 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_ELEC -F:RES_ELEC | FLY | -f:RES_ELEC | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ELEC +f:RES_ELEC D:A shimmering bright blue armour made from a blue dragon's hide. D:It contains some of the dead beast's powers. @@ -3495,9 +3741,14 @@ W:50:0:200:40000 A:50/8 a:BR_COLD P:30:2d4:-2:0:10 -F:RES_COLD | FLY | -f:RES_COLD | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_COLD +f:RES_COLD D:A gleaming white armour made from a white dragon's hide. D:It contains some of the dead beast's powers. @@ -3508,9 +3759,14 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_FIRE -F:RES_FIRE | FLY | -f:RES_FIRE | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_FIRE +f:RES_FIRE D:A glowing red armour made from a red dragon's hide. D:It contains some of the dead beast's powers. @@ -3521,9 +3777,14 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_POIS -F:RES_POIS | FLY | -f:RES_POIS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_POIS +f:RES_POIS D:A dirty green, foul-smelling armour made from a green dragon's hide. D:It contains some of the dead beast's powers. @@ -3534,10 +3795,23 @@ W:90:0:200:150000 A:90/32 P:30:2d4:-2:0:10 a:BR_MANY +F:ACTIVATE F:ATTR_MULTI -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | FLY | -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +F:RES_POIS +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE +f:RES_POIS D:A powerful armour glowing red, blue, green, black, and white. D:made from a multihued dragon's hide, it contains some of the dead beast's powers. @@ -3548,8 +3822,14 @@ W:70:0:200:70000 A:70/16 P:30:2d4:-2:0:10 a:BR_LIGHT -F:RES_LITE | RES_DARK | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_DARK +F:RES_LITE D:A strangely glowing armour made from a pseudo-dragon's hide. D:It contains some of the dead beast's powers. @@ -3560,8 +3840,14 @@ W:80:0:200:80000 A:80/16 P:30:2d4:-2:0:10 a:BR_SHARD -F:RES_SOUND | RES_SHARDS | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SHARDS +F:RES_SOUND D:A sharp-scaled armour that seems to roar, made from a law dragon's hide. D:It contains some of the dead beast's powers. @@ -3572,8 +3858,13 @@ W:50:0:200:40000 A:50/8 P:30:2d4:-2:0:10 a:BR_CONF -F:RES_CONF | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CONF D:A brownish armour glittering in a dazzling light, made from a bronze dragon's hide. D:It contains some of the dead beast's powers. @@ -3584,8 +3875,13 @@ W:60:0:200:50000 A:60/8 P:30:2d4:-2:0:10 a:BR_SOUND -F:RES_SOUND | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_SOUND D:A suit of armour with rustling scales, made from a gold dragon's hide. D:It contains some of the dead beast's powers. @@ -3596,10 +3892,16 @@ W:80:0:200:80000 A:80/16 P:30:2d4:-2:0:10 a:BR_CHAOS +F:ACTIVATE F:ATTR_MULTI -F:RES_CHAOS | RES_DISEN | FLY | -f:RES_CHAOS | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS +F:RES_DISEN +f:RES_CHAOS D:A suit of armour made of dragon hide. It glows in colours you have never seen before. As you D:put it on, you feel like you could change the world and are no longer afraid of your equipment D:losing its magic. @@ -3611,8 +3913,16 @@ W:95:0:200:100000 A:95/32 P:30:2d4:-2:0:10 a:BR_BALANCE -F:RES_CHAOS | RES_DISEN | RES_SOUND | RES_SHARDS | FLY | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ACTIVATE +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_CHAOS +F:RES_DISEN +F:RES_SHARDS +F:RES_SOUND D:A suit of armour made of the hide of a dead dragon. When wearing it, you feel like you D:understand the principles of law and chaos, and no longer fear either. @@ -3623,11 +3933,27 @@ W:100:0:250:350000 A:100/64 P:40:2d4:-3:0:15 a:BR_POWER +F:ACTIVATE F:ATTR_MULTI -F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FLY | -F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK | -F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF | -F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FLY +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_CHAOS +F:RES_COLD +F:RES_CONF +F:RES_DARK +F:RES_DISEN +F:RES_ELEC +F:RES_FIRE +F:RES_LITE +F:RES_NETHER +F:RES_NEXUS +F:RES_POIS +F:RES_SHARDS +F:RES_SOUND D:A suit of armour made of a very thick richly coloured dragonhide. You think you'll never have D:to fear dragons if you put it on. @@ -3639,7 +3965,10 @@ I:32:7:0 W:45:0:50:10000 A:80/4 P:8:1d3:0:0:10 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:An iron helmet, covered with a layer of dragonhide. It offers great protection and may grant D:protection against some dragon's attacks, based on the dragon the hide was taken from. @@ -3649,7 +3978,10 @@ I:34:6:0 W:70:0:100:10000 A:80/4 P:8:1d3:0:0:10 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A large shield, with a dragonskin cover. Depending on which dragon the hide came from, it D:might grant protection against some sorts of dragon breath. @@ -3741,8 +4073,9 @@ G:=:d I:45:38:0 W:10:0:2:300 A:10/2 -F:RES_FEAR | EASY_KNOW -f:RES_FEAR | +F:EASY_KNOW +F:RES_FEAR +f:RES_FEAR D:This ring grants courage, so that you can never become afraid. N:426:Light and Darkness Resistance @@ -3750,8 +4083,11 @@ G:=:d I:45:39:0 W:30:0:2:3000 A:30/2 -F:RES_LITE | RES_DARK | EASY_KNOW -f:RES_LITE | RES_DARK | +F:EASY_KNOW +F:RES_DARK +F:RES_LITE +f:RES_DARK +f:RES_LITE D:This ring protects against fluctuations of the light. N:427:Nether Resistance @@ -3759,8 +4095,10 @@ G:=:d I:45:40:0 W:34:0:2:14500 A:34/2 -F:RES_NETHER | HOLD_LIFE | EASY_KNOW -f:RES_NETHER | +F:EASY_KNOW +F:HOLD_LIFE +F:RES_NETHER +f:RES_NETHER D:This blessed ring improves your life force, protecting you from the draining forces of nether D:and other attempts to suck your lifeblood. @@ -3769,8 +4107,9 @@ G:=:d I:45:41:0 W:24:0:2:3000 A:24/2 -F:RES_NEXUS | EASY_KNOW -f:RES_NEXUS | +F:EASY_KNOW +F:RES_NEXUS +f:RES_NEXUS D:This ring of stability protects you from the warping forces of nexus. N:429:Sound Resistance @@ -3778,8 +4117,9 @@ G:=:d I:45:42:0 W:26:0:2:3000 A:26/2 -F:RES_SOUND | EASY_KNOW -f:RES_SOUND | +F:EASY_KNOW +F:RES_SOUND +f:RES_SOUND D:This ring projects an aura of quiet around you, protecting you from loud noise. N:430:Confusion Resistance @@ -3787,8 +4127,9 @@ G:=:d I:45:43:0 W:22:0:2:3000 A:22/2 -F:RES_CONF | EASY_KNOW -f:RES_CONF | +F:EASY_KNOW +F:RES_CONF +f:RES_CONF D:This ring stabilises your mind, protecting you from all kinds of befuddlement. N:431:Shard Resistance @@ -3796,8 +4137,9 @@ G:=:d I:45:44:0 W:25:0:2:3000 A:25/2 -F:RES_SHARDS | EASY_KNOW -f:RES_SHARDS | +F:EASY_KNOW +F:RES_SHARDS +f:RES_SHARDS D:This piece of jewellery magically toughens your skin, protecting you from flying shrapnel. N:432:Disenchantment Resistance @@ -3805,8 +4147,9 @@ G:=:d I:45:45:0 W:90:0:2:15000 A:90/10 -F:RES_DISEN | EASY_KNOW -f:RES_DISEN | +F:EASY_KNOW +F:RES_DISEN +f:RES_DISEN D:This rare ring of preservation protects your equipment from attempts to sap its magic, also D:causing you to suffer less pain from such attacks. @@ -3815,8 +4158,10 @@ G:=:d I:45:46:0 W:50:0:2:13000 A:50/2 -F:RES_CHAOS | RES_CONF | EASY_KNOW -f:RES_CHAOS | +F:EASY_KNOW +F:RES_CHAOS +F:RES_CONF +f:RES_CHAOS D:This ring protects you from the horribly warping forces of chaos. N:434:Blindness Resistance @@ -3824,8 +4169,9 @@ G:=:d I:45:47:0 W:60:0:2:7500 A:60/2 -F:RES_BLIND | EASY_KNOW -f:RES_BLIND | +F:EASY_KNOW +F:RES_BLIND +f:RES_BLIND D:This ring magically preserves your eyesight, making you impervious to any attempt to blind D:you. @@ -3834,8 +4180,14 @@ G:=:d I:45:48:0 W:100:0:2:100000 A:100/5 -F:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT -f:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT +F:FREE_ACT +F:HOLD_LIFE +F:RES_DISEN +F:RES_POIS +f:FREE_ACT +f:HOLD_LIFE +f:RES_DISEN +f:RES_POIS D:This blessed ring will protect you from disenchantment, poison, attempts to drain your life D:force and holding magic. @@ -3844,8 +4196,11 @@ G:=:d I:45:49:0 W:50:0:2:100000 A:50/2 -F:BLOWS | ACTIVATE | EASY_USE | -f:BLOWS | ACTIVATE +F:ACTIVATE +F:BLOWS +F:EASY_USE +f:ACTIVATE +f:BLOWS a:SPIN D:This powerful ring of fighters greatly enhances your fighting speed, allowing you to attack D:more often in a round of combat. @@ -3919,7 +4274,10 @@ I:17:3:0 W:55:0:2:35 A:50/4:90/2 P:0:3d4:0:0:0 -F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SHOW_MODS +F:SLAY_EVIL D:An arrow to be shot with a bow, its iron head coated with hallowed silver, D:a material that sears the flesh of all evil creatures. @@ -3929,7 +4287,10 @@ I:18:3:0 W:50:0:2:40 A:60/4:95/2 P:0:3d5:0:0:0 -F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE +F:IGNORE_ACID +F:IGNORE_FIRE +F:SHOW_MODS +F:SLAY_EVIL D:This crossbow bolt has a silver tip, blessed by the Valar for fighting evil. N:468:Wisdom @@ -3937,8 +4298,10 @@ G:":d I:40:28:0 W:30:0:3:500 A:30/1 -F:WIS | SUST_WIS | HIDE_TYPE -f:WIS | +F:HIDE_TYPE +F:SUST_WIS +F:WIS +f:WIS D:This magical amulet will magically make you wiser, and fend off D:attacks that would reduce your wisdom. Beware: if cursed, the D:amulet will do the opposite. @@ -3948,8 +4311,9 @@ G:":d I:40:30:0 W:30:0:3:600 A:30/3 -F:REGEN | EASY_KNOW -f:REGEN | +F:EASY_KNOW +F:REGEN +f:REGEN D:Wearing this amulet will trigger your body's regenerational D:processes quicker and make them proceed faster. @@ -3958,8 +4322,9 @@ G:":d I:40:26:0 W:10:0:3:200 A:10/1 -F:INFRA | HIDE_TYPE -f:INFRA | +F:HIDE_TYPE +F:INFRA +f:INFRA D:This amulet will increase your ability to sense warm-blooded D:creatures in your vicinity. Beware: if cursed, it will do D:just the opposite. @@ -3969,8 +4334,16 @@ G:":d I:40:25:0 W:70:0:3:30000 A:70/8 -F:WIS | CHR | SUST_WIS | SUST_CHR | LITE1 | HIDE_TYPE | -F:RES_DARK | RES_LITE | RES_FIRE | HOLD_LIFE | +F:CHR +F:HIDE_TYPE +F:HOLD_LIFE +F:LITE1 +F:RES_DARK +F:RES_FIRE +F:RES_LITE +F:SUST_CHR +F:SUST_WIS +F:WIS D:This blessed amulet will protect your wisdom and charms from D:diminishing, often adding to them as well. It also grants D:some extra protective magics by the grace of the Valar. @@ -3980,8 +4353,14 @@ G:":d I:40:24:0 W:70:0:3:30000 A:70/8 -F:STR | CON | SUST_STR | SUST_CON | FREE_ACT | HIDE_TYPE | -F:RES_FEAR | RES_DISEN | +F:CON +F:FREE_ACT +F:HIDE_TYPE +F:RES_DISEN +F:RES_FEAR +F:STR +F:SUST_CON +F:SUST_STR D:The ultimate amulet for a warrior, it will grant protection D:in the face of some evil magics, protect your strength and health, D:also increasing them. Beware: if cursed, the amulet will @@ -3992,8 +4371,14 @@ G:":d I:40:23:0 W:70:0:3:30000 A:70/8 -F:DEX | SUST_DEX | STEALTH | SPEED | INFRA | HIDE_TYPE | -F:RES_NEXUS | RES_POIS +F:DEX +F:HIDE_TYPE +F:INFRA +F:RES_NEXUS +F:RES_POIS +F:SPEED +F:STEALTH +F:SUST_DEX D:The ultimate amulet for a rogue or assassin, it protects the D:wearer against some evil magics, granting improvements in D:the abilities vital to these adventurers. Beware: if cursed, @@ -4004,9 +4389,12 @@ G:":d I:40:22:0 W:50:0:3:25000 A:50/6 -F:ESP_ALL | -f:ESP_ALL | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:ESP_ALL +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +f:ESP_ALL D:This rare and powerful amulet lays bare the minds of monsters D:before the wearer. @@ -4015,9 +4403,19 @@ G:":d I:40:21:0 W:60:0:3:20000 A:60/4 -F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | -F:HOLD_LIFE | SLOW_DIGEST | EASY_KNOW | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:EASY_KNOW +F:HOLD_LIFE +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SLOW_DIGEST +F:SUST_CHR +F:SUST_CON +F:SUST_DEX +F:SUST_INT +F:SUST_STR +F:SUST_WIS D:This blessed amulet will make the wearer impervious to evil magics D:that would sap innate abilities. It also slows down the digestive D:system, making food less necessary on long journeys. @@ -4053,7 +4451,8 @@ N:479:& Ring~ G:=:d I:45:57:0 W:70:0:2:65000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### And here starts the gold/gems ##### @@ -4159,7 +4558,10 @@ G:\:D I:21:50:0 W:15:0:200:1000 P:0:3d9:0:0:0 -F:SHOW_MODS | INSTA_ART | MUST2H | SPECIAL_GENE +F:INSTA_ART +F:MUST2H +F:SHOW_MODS +F:SPECIAL_GENE f:MUST2H N:499:& Massive Iron Crown~ @@ -4167,7 +4569,8 @@ G:]:D I:33:50:0 W:44:0:20:1000 P:0:1d1:0:0:0 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE ##### Objects 500 to 511 are "Special Artifacts" ##### @@ -4271,7 +4674,8 @@ N:508:& Ring~ G:=:d I:45:34:0 W:80:0:2:100000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # The Ring of Power 'Nenya' -- see artifact list @@ -4314,9 +4718,13 @@ G:":d I:40:9:0 W:60:0:3:30000 A:60/4 -F:REFLECT | EASY_KNOW -f:REFLECT | -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:REFLECT +f:REFLECT D:This wondrous amulet will magically make the wearer D:reflect arrows and bolts launched by adversaries. @@ -4327,9 +4735,12 @@ G:":d I:40:13:0 W:40:0:3:30000 A:40/4 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:NO_MAGIC f:NO_MAGIC -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD D:This amulet wards off magic of any kind, good or bad. N:522:Anti-Teleportation @@ -4337,9 +4748,12 @@ G:":d I:40:14:0 W:30:0:3:15000 A:30/4 +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE F:NO_TELE f:NO_TELE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD D:This amulet will prevent the space-time continuum from D:being disrupted around the wearer. @@ -4350,9 +4764,18 @@ G:":d I:40:15:0 W:50:0:3:25000 A:50/4 -F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD -f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:RES_ACID +F:RES_COLD +F:RES_ELEC +F:RES_FIRE +f:RES_ACID +f:RES_COLD +f:RES_ELEC +f:RES_FIRE D:This amulet will make the wearer resist the elements. ##### New arms ##### @@ -4363,7 +4786,8 @@ I:23:29:0 W:40:0:280:580 A:40/3 P:0:4d6:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This great sword of foreign origin is approximately 6 feet long. The hilt is D:long enough for even four hands to grip. A mighty weapon for a warrior. @@ -4375,7 +4799,9 @@ I:39:3:0 W:15:0:50:5000 A:15/2 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE2 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE2 f:LITE2 D:Made by the Dwarves, this lantern provides light in the D:darkest recesses of the earth. @@ -4396,7 +4822,9 @@ I:39:2:0 W:5:0:50:2500 A:5/1 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE1 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE1 f:LITE1 D:This enchanted torch never needs to be fuelled. @@ -4427,7 +4855,9 @@ I:39:4:0 W:25:0:50:15000 A:25/3 P:0:1d1:0:0:0 -F:EASY_KNOW | IGNORE_FIRE | LITE3 +F:EASY_KNOW +F:IGNORE_FIRE +F:LITE3 f:LITE3 D:Made by the descendants of the Noldo craftsman, this lamp D:contains a part of the flame which burned inside Feanor. @@ -4458,7 +4888,8 @@ I:24:1:0 W:10:0:60:120 A:10/2 P:0:1d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:This is a larger version of a throwing axe. It has a single D:blade with a pick on the reverse, designed for armour piercing. @@ -4537,7 +4968,8 @@ I:23:26:0 W:40:0:230:600 A:40/2 P:0:3d7:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:A large, two-handed sword with a blade that weaves D:left and right until it reaches the hilt. @@ -4548,7 +4980,8 @@ I:23:23:0 W:40:0:200:600 A:40/2 P:0:2d8:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Also known as a Claidhmore, or Greatsword, this weapon is favoured D:by powerful mercenaries. The blade is large, straight, and broad, @@ -4560,7 +4993,8 @@ I:23:24:0 W:40:0:200:600 A:40/3 P:0:2d9:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is the strictly two-handed version of the bastard sword. D:The blade is of medium length, double-edged, and considerably @@ -4572,7 +5006,8 @@ I:23:22:0 W:40:0:240:500 A:40/3 P:0:4d5:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is a larger version of the curved oriental blade. D:Runes of war decorate its golden hilt. @@ -4604,7 +5039,8 @@ I:22:6:0 W:18:0:155:301 A:18/2 P:0:1d10:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:It is a type of glaive with two ornate hooks on the back D:of the blade. It is typically 8 to 9 feet long. @@ -4615,7 +5051,8 @@ I:22:16:0 W:21:0:165:320 A:21/1 P:0:2d5:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:Mounted on a long shaft for maximum reach, this weapon is D:effective at repelling both cavalry and infantry. @@ -4626,7 +5063,8 @@ I:22:29:0 W:43:0:400:700 A:43/2 P:0:4d8:0:0:0 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:This is a shock weapon. Its purpose is to unhorse a rider D:in single combat, or smash through the armour of opposing lines. @@ -4717,7 +5155,10 @@ G:`:g I:46:5:0 W:5:0:20:50 A:5/2:40/2 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:It must be loaded with scrolls, which will release D:their spells at the monster who triggers the trap. @@ -4726,7 +5167,10 @@ G:`:v I:46:6:0 W:20:0:20:50 A:20/2:40/2:60/2 -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:It must be loaded with a magic device (wand, staff, or rod), which D:will fire its spell at the monster who triggers the trap. @@ -4752,7 +5196,8 @@ W:70:0:4:10000 A:70/16 P:0:1d1:0:0:0 T:71:2 -F:NORM_ART | FULL_NAME +F:FULL_NAME +F:NORM_ART D:This magical potion contains a small part of the power of D:Eru Iluvatar on Middle-Earth. @@ -4768,7 +5213,8 @@ I:6:1:0 W:5:0:12:300 A:5/1:20/1:50/1:80/1 P:0:1d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:It looks like a simple walking stick, plain and nondescript. D:In the hands of a spellcaster, it can be a deadly weapon. @@ -4782,8 +5228,10 @@ W:50:0:2:3000 A:50/1 P:0:0d0:0:0:15 a:BA_ELEC_4 -F:RES_ELEC | ACTIVATE -f:RES_ELEC | IGNORE_ELEC +F:ACTIVATE +F:RES_ELEC +f:IGNORE_ELEC +f:RES_ELEC D:This sparkling circlet grants you protection, makes electricity less D:dangerous and even allows you to call forth a ball of lightning. @@ -4827,8 +5275,9 @@ G:=:d I:45:53:4 W:50:0:2:10000 A:50/1 -F:INVIS | HIDE_TYPE -f:INVIS | +F:HIDE_TYPE +F:INVIS +f:INVIS D:This magical bauble will hide you from sight. # XXX @@ -4982,7 +5431,8 @@ I:72:1:0 W:5:0:4:100 A:1/3:5/1:10/1 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This concoction can transform your body for a short period of time. ### New Parchments for Theme - monster and artifact spoilers @@ -5174,7 +5624,8 @@ I:36:16:0 W:5:0:60:400 A:25/1 P:9:1d1:0:0:0 -F:RES_FIRE | RES_COLD | +F:RES_COLD +F:RES_FIRE D:This coat is made from the down of Manwe's Great Eagles, D:gathered painstakingly from nests. It is magical, protecting D:the wearer from extremes of temperatures. @@ -5184,7 +5635,8 @@ N:647:& Key~ G:~:g I:39:106:0 W:15:0:15:20000 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE # Here are the boomerangs @@ -5312,7 +5764,9 @@ G:~:o I:102:0:0 W:1:0:50:0 A:1/1:10/1:20/1:30/1 -F:INSTA_ART | ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD +F:INSTA_ART N:663:Craftsmanship G:?:d @@ -5341,7 +5795,9 @@ I:14:60:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:CON | ACTIVATE | WIELD_CAST +F:ACTIVATE +F:CON +F:WIELD_CAST D:A simple wind instrument made from brass. If used by inexperienced musicians it sounds D:like somebody making "prbbt!" noises down a drainpipe. @@ -5351,7 +5807,8 @@ I:14:58:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:STR | WIELD_CAST +F:STR +F:WIELD_CAST D:A sort of clay pot with a bit of skin stretched over its mouth. N:671:& Harp~ @@ -5360,7 +5817,8 @@ I:14:59:1 W:7:0:30:400 A:7/2:20/1:40/1:80/1 P:0:1d1:0:0:0 -F:CHR | WIELD_CAST +F:CHR +F:WIELD_CAST D:A number of strings held by a wooden frame. # XXX @@ -5383,7 +5841,8 @@ I:10:1:0 W:5:0:30:100 A:5/1:15/1:25/1:35/1 P:0:1d1:0:0:0 -F:ACTIVATE | ACTIVATE_NO_WIELD +F:ACTIVATE +F:ACTIVATE_NO_WIELD ### Two more scrolls ### @@ -5420,7 +5879,9 @@ I:105:2:0 W:10:5:2:300 A:10/1 P:0:1d1:0:0:0 -F:IGNORE_COLD | IGNORE_ELEC | EASY_KNOW +F:EASY_KNOW +F:IGNORE_COLD +F:IGNORE_ELEC D:A rune signifying a beam or ray. N:681:Sphere @@ -5429,7 +5890,10 @@ I:105:3:0 W:15:5:2:1000 A:15/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW +F:EASY_KNOW +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rune signifying a ball or sphere. N:682:Knowledge @@ -5456,7 +5920,8 @@ I:104:5:0 W:10:5:2:300 A:10/1 P:0:1d1:0:0:0 -F:IGNORE_FIRE | EASY_KNOW +F:EASY_KNOW +F:IGNORE_FIRE D:A rune signifying flame. N:685:Cold @@ -5465,7 +5930,8 @@ I:104:4:0 W:12:5:2:300 A:12/1 P:0:1d1:0:0:0 -F:IGNORE_COLD | EASY_KNOW +F:EASY_KNOW +F:IGNORE_COLD D:A rune signifying cold. N:686:Lightning @@ -5474,7 +5940,8 @@ I:104:1:0 W:13:5:2:300 A:13/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ELEC D:A rune signifying a lightning beam. N:687:Acid @@ -5483,7 +5950,8 @@ I:104:3:0 W:16:5:2:300 A:16/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID D:A rune signifying acid. N:688:Element @@ -5492,7 +5960,11 @@ I:104:10:0 W:23:5:2:1000 A:23/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rune signifying an element. N:689:Chaos @@ -5502,7 +5974,11 @@ W:26:5:2:2000 A:26/1 P:0:1d1:0:0:0 F:ATTR_MULTI -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rune signifying raw chaos. N:690:Mind @@ -5511,7 +5987,8 @@ I:104:85:0 W:19:5:2:3000 A:19/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ELEC D:A rune signifying the mind. N:691:Holding @@ -5520,7 +5997,8 @@ I:104:75:0 W:5:5:2:500 A:5/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID D:A rune signifying the action of holding, or sleep. N:692:Arrow @@ -5529,7 +6007,8 @@ I:105:1:0 W:6:5:2:100 A:6/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ELEC D:A rune signifying an arrow. N:693:Power Surge @@ -5538,7 +6017,11 @@ I:105:4:0 W:50:5:2:5000 A:50/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rune signifying a powerful surge. N:694:Armageddon @@ -5547,7 +6030,11 @@ I:105:5:0 W:30:5:2:4000 A:30/1 P:0:1d1:0:0:0 -F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A rune signifying a powerful blast. N:695:Gravity @@ -5556,7 +6043,8 @@ I:104:35:0 W:16:5:2:300 A:16/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID D:A rune signifying the forces of gravity. # XXX @@ -5567,7 +6055,8 @@ I:104:92:0 W:35:5:2:1000 A:35/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID D:A rune signifying undeath. N:698:Protection @@ -5576,7 +6065,8 @@ I:104:74:0 W:45:5:2:1500 A:45/1 P:0:1d1:0:0:0 -F:IGNORE_ACID | EASY_KNOW +F:EASY_KNOW +F:IGNORE_ACID D:A rune signifying protection. # XXX @@ -5588,10 +6078,14 @@ I:45:51:0 W:90:0:2:300000 A:90/100 T:45:23 -F:PRECOGNITION | -f:PRECOGNITION | -F:NORM_ART | FULL_NAME -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART +F:PRECOGNITION +f:PRECOGNITION D:This magical ring allows you to know what you will encounter in the near future. # Athelas, cures Black Breath @@ -5631,8 +6125,12 @@ I:70:40:0 W:90:0:5:160000 A:90/140 T:70:51 -F:NORM_ART | FULL_NAME -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:It allows you to leave your body to reincarnate into D:another one. However, your current body is lost in the process. @@ -5642,7 +6140,8 @@ I:23:33:0 W:25:0:70:500 A:25/1:80/2 P:0:3d7:0:0:0 -F:SHOW_MODS | ANTIMAGIC_50 +F:ANTIMAGIC_50 +F:SHOW_MODS f:ANTIMAGIC_50 D:A strange, very sharp long sword, which seems to drain light from its surroundings. As you D:wield it, you feel much less attuned to magic. @@ -5784,8 +6283,9 @@ G:=:d I:45:54:0 W:20:0:2:16000 A:20/3 -F:FLY | EASY_KNOW -f:FLY | +F:EASY_KNOW +F:FLY +f:FLY D:This ring is imbued with the power of eagles. It grants you the power of flight. N:756:& Tome~ of the Time @@ -5794,7 +6294,8 @@ I:111:8:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome seems to have trouble deciding whether it really exists now. Its flickering pages D:contain all that is known about the currents of time. @@ -5812,7 +6313,10 @@ I:111:9:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | IGNORE_FIRE | ATTR_MULTI +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_FIRE D:This tome gives you deeper insights on the works of magic. N:759:& Tome~ of the Mind @@ -5821,7 +6325,8 @@ I:111:10:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome has no pages; knowledge is transferred to you if you simply D:hold it. @@ -5831,7 +6336,8 @@ I:111:20:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This dusty tome is filled with ancient rituals, D:designed to uncover all that is hidden. @@ -5841,7 +6347,8 @@ I:111:21:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A large jewel-encrusted tome that transfers D:wisdom and understanding to its bearer. @@ -5851,7 +6358,8 @@ I:111:22:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome fills you with glorious visions of total devastation. D:Anyone in your way shall be destroyed. @@ -5861,7 +6369,9 @@ I:111:11:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | ATTR_MULTI +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME D:This singed book smells like burned flesh. Its power is as evident D:as its thirst for your blood. @@ -5871,7 +6381,8 @@ I:111:23:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:A black and scarlet flame springs from this tome, issuing D:a thunderous roar, and you hear the screams of tormented souls. @@ -5881,7 +6392,8 @@ I:111:63:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The sleek black cover of this tome is covered with intricate D:carved decorations, inset with rubies that sparkle like fire. @@ -5891,7 +6403,8 @@ I:111:64:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This tome's cover and pages radiate a soft white light. N:767:& Ocean Tome~ of Ulmo @@ -5900,7 +6413,8 @@ I:111:65:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:This book smells faintly of seaweed and appears to be wet. N:768:& Forest Tome~ of Yavanna @@ -5909,7 +6423,8 @@ I:111:24:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:The cover of this tome reminds you of tree bark. D:You feel the smell of grass and flowers as you read it. @@ -5921,8 +6436,15 @@ I:111:61:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW | ATTR_MULTI | SPECIAL_GENE -F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | NORM_ART +F:ATTR_MULTI +F:EASY_KNOW +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART +F:SPECIAL_GENE D:This book has some of your favourite spells inside. # The Ring of Phasing -- see artifact list @@ -5932,7 +6454,8 @@ G:=:d I:45:55:0 W:110:0:2:300000 A:110/5 -F:INSTA_ART | SPECIAL_GENE +F:INSTA_ART +F:SPECIAL_GENE N:771:& Holy Tome~ of Mandos G:?:w @@ -5940,7 +6463,8 @@ I:111:66:0 W:50:0:30:25000 A:50/4 P:0:1d1:0:0:0 -F:FULL_NAME | EASY_KNOW +F:EASY_KNOW +F:FULL_NAME D:Just holding this tome makes you fill with quiet strength. # XXX # @@ -5957,8 +6481,12 @@ W:90:0:15:150000 A:100/14 P:0:1d1:0:0:0 T:66:1 -F:NORM_ART | FULL_NAME -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:This rod creates a little hatch, allowing access to your home no matter how far away it is. # Additional swords @@ -5968,7 +6496,9 @@ I:23:32:1 W:50:900:45:2000 A:48/4:60/2:80/1 P:0:4d4:-2:2:0 -F:IGNORE_ACID | RES_DARK | STEALTH +F:IGNORE_ACID +F:RES_DARK +F:STEALTH f:STEALTH D:A thin long sword made of a completely black metal, which reflects no light. @@ -5978,7 +6508,8 @@ I:23:31:0 W:60:1800:50:6000 A:60/20 P:0:1d6:4:0:0 -F:SHOW_MODS | VORPAL +F:SHOW_MODS +F:VORPAL D:A small sword made of a blueish metal with a strangely rough surface. As anything is hurt D:with it, the weapon will stick inside the wound and cause horrible wounds when torn away. @@ -5989,7 +6520,9 @@ I:40:17:0 W:25:0:3:10000 A:25/1 a:BA_POIS_4 -F:RES_POIS | DEX | ACTIVATE +F:ACTIVATE +F:DEX +F:RES_POIS D:A petrified serpent's tongue, hung on a thin chain to be clasped around your neck. It makes you D:like a snake, able to wriggle out of tight corners, impervious to poisons and poisonous D:yourself. @@ -6008,9 +6541,14 @@ G:=:d I:45:5:0 W:100:0:2:1 A:100/100 -F:INVIS | DRAIN_EXP | CURSED | HEAVY_CURSE | CURSE_NO_DROP +F:CURSED +F:CURSE_NO_DROP +F:DRAIN_EXP +F:FULL_NAME +F:HEAVY_CURSE +F:INVIS +F:SPECIAL_GENE f:INVIS -F:SPECIAL_GENE | FULL_NAME # To help people climb mountains... @@ -6039,7 +6577,9 @@ I:115:55:0 W:10:0:150:500 A:10/1 P:0:4d6:0:0:0 -F:SHOW_MODS | SLAY_DEMON | WIELD_CAST +F:SHOW_MODS +F:SLAY_DEMON +F:WIELD_CAST D:This blade has been taken from the corpse of a demon. D:Some demonic energy is still coursing through it, helping D:you slay other demons. @@ -6050,7 +6590,8 @@ I:115:56:0 W:15:0:70:500 A:15/1 P:5:1d1:0:0:0 -F:REGEN | WIELD_CAST +F:REGEN +F:WIELD_CAST D:This shield has been taken from the corpse of a demon. D:Some demonic energy is still coursing through it, giving D:life to any that wield it. @@ -6061,7 +6602,8 @@ I:115:57:0 W:20:0:30:500 A:20/1 P:2:1d1:0:0:0 -F:LITE2 | WIELD_CAST +F:LITE2 +F:WIELD_CAST D:This horn is about six feet long, and originates from a demon. D:Some demonic energy is still coursing through it. @@ -6136,7 +6678,10 @@ W:70:0:15:2000 A:70/30 P:0:1d1:0:0:0 F:ATTR_MULTI -F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:This is the rarest and most powerful kind of rod there is. Its material was once used D:to chain Melkor Bauglir in the Halls of Mandos, and only Aule knows the secret of its D:making. Treasure this rod greatly. @@ -6155,8 +6700,12 @@ I:70:43:0 W:55:0:5:0 A:55/1 T:70:1 -F:NORM_ART | FULL_NAME -F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:NORM_ART D:This magical scroll sends a call to the halls of Mandos, issuing forth all those who have been D:slain by the reader. @@ -6186,7 +6735,8 @@ I:24:30:0 W:70:0:300:6000 A:70/8 P:0:5d7:0:0:0 -F:SLAY_ANIMAL | SHOW_MODS +F:SHOW_MODS +F:SLAY_ANIMAL D:A huge axe, the sort used for slaughtering animals, this weapon is unusually deadly against D:natural creatures. @@ -6196,7 +6746,10 @@ I:105:255:0 W:10:5:2:300 A:10/3:20/2:30/1:60/1 P:0:1d1:0:0:0 -F:IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE D:A small oval stone. One surface is flat, as if something ought to be scratched or inscribed into D:it. @@ -6226,7 +6779,12 @@ W:10:10:10:3200 A:10/200 P:0:10d10:0:0:0 T:65:6 -F:RECHARGE | SPECIAL_GENE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:RECHARGE +F:RECHARGED +F:SPECIAL_GENE D:The miner's friend. This wand was used by Thrain to dig into the D:walls of the dungeon. Its indestructible nature makes it quite useful. @@ -6238,7 +6796,11 @@ W:50:10:10:12000 P:0:10d4:0:0:0 A:50/200 T:55:8 -F:RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME +F:EASY_USE +F:FULL_NAME +F:NORM_ART +F:RECHARGE +F:RECHARGED D:Mithrandir's staff that throws powerful fire attacks at all enemies. It D:can be recharged without blowing up, for it is built to hold D:much magical energy. @@ -6272,7 +6834,11 @@ I:11:7:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Priests of Eru. The relic now lies in pieces, hidden D:from all but but his most dedicated followers. @@ -6283,7 +6849,11 @@ I:11:8:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Priests of Manwe. The relic now lies in pieces, hidden D:from all but his most dedicated followers. @@ -6294,7 +6864,11 @@ I:11:9:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to worshippers of Tulkas. The relic now lies in pieces, D:hidden from all but his most dedicated followers. @@ -6305,7 +6879,11 @@ I:11:10:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Dark Priests. The relic now lies in pieces, hidden D:from all but the most faithful followers of Melkor. @@ -6316,7 +6894,11 @@ I:11:11:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to Druids. The relic now lies in pieces, hidden D:from all but the most faithful followers of Yavanna. @@ -6338,8 +6920,12 @@ I:11:16:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | FULL_NAME -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to the Stonewrights. The relic now lies in pieces, hidden D:from all but the most faithful followers of Aule. @@ -6350,8 +6936,12 @@ I:11:17:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | FULL_NAME -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to the Priests of Varda. The relic now lies in pieces, D:hidden from all but the most faithful followers of Varda. @@ -6362,8 +6952,12 @@ I:11:18:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | FULL_NAME -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to the Priests of Ulmo. The relic now lies in pieces, hidden D:from all but the most faithful followers of Ulmo. @@ -6374,8 +6968,12 @@ I:11:19:0 W:0:0:0:1000 A:0/1 P:0:1d1:0:0:0 -F:SPECIAL_GENE | FULL_NAME -F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | +F:FULL_NAME +F:IGNORE_ACID +F:IGNORE_COLD +F:IGNORE_ELEC +F:IGNORE_FIRE +F:SPECIAL_GENE D:Although it looks like a piece of junk, it is actually part of an ancient D:relic belonging to the Priests of Mandos. The relic now lies in pieces, D:hidden from all but the most faithful followers of Mandos. @@ -6423,8 +7021,12 @@ G:":d I:40:3:3 W:70:12:3:55000 A:70/12 -F:BLOWS | STR | DEX -F:AGGRAVATE | DRAIN_MANA | DRAIN_EXP +F:AGGRAVATE +F:BLOWS +F:DEX +F:DRAIN_EXP +F:DRAIN_MANA +F:STR D:This rare amulet will magically improve your fighting prowess D:greatly, but this improvement comes at a cost. Nothing can D:ignore the challenge this amulet magically issues when worn. @@ -6434,7 +7036,10 @@ G:":d I:40:16:1 W:70:12:3:100000 A:70/12 -F:LIFE | SUST_CON | HOLD_LIFE | DRAIN_MANA +F:DRAIN_MANA +F:HOLD_LIFE +F:LIFE +F:SUST_CON D:This rare amulet will magically increase your life force and D:even prevent it from being sapped. However, wearing this D:amulet makes you feel less adept at using magic. @@ -6447,8 +7052,16 @@ G:=:d I:45:10:2 W:100:0:2:125000 A:100/10 -F:MANA | SPELL | SPELL_CONTAIN | WIELD_CAST | HIDE_TYPE | -f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SPELL | +F:HIDE_TYPE +F:MANA +F:SPELL +F:SPELL_CONTAIN +F:WIELD_CAST +f:IGNORE_ACID +f:IGNORE_COLD +f:IGNORE_ELEC +f:IGNORE_FIRE +f:SPELL D:This powerful ring not only stores a chosen spell (which must be D:engraved by 'copying' it); it also improves the power of cast spells D:and augments the wearer's magical reserves. @@ -6458,11 +7071,19 @@ G:=:d I:45:11:2 W:100:0:2:125000 A:100/10 -F:SUST_STR | SUST_DEX | SUST_CON | REGEN | -F:HOLD_LIFE | LIFE | -F:HIDE_TYPE | ACTIVATE | +F:ACTIVATE +F:HIDE_TYPE +F:HOLD_LIFE +F:LIFE +F:REGEN +F:SUST_CON +F:SUST_DEX +F:SUST_STR a:CURE_HUNGER -f:SUST_STR | SUST_DEX | SUST_CON | REGEN | +f:REGEN +f:SUST_CON +f:SUST_DEX +f:SUST_STR D:This valuable ring enhances and protects the wearer's life force in every way. N:842:Clear Thought @@ -6470,10 +7091,15 @@ G:=:d I:45:12:0 W:100:0:2:125000 A:100/10 -F:SUST_INT | SUST_WIS | RES_FEAR | RES_CONF | -F:ACTIVATE | EASY_KNOW | +F:ACTIVATE +F:EASY_KNOW +F:RES_CONF +F:RES_FEAR +F:SUST_INT +F:SUST_WIS a:CURE_INSANITY -f:SUST_INT | SUST_WIS | +f:SUST_INT +f:SUST_WIS D:This valuable ring protects the wearer's intellect and intuition, as well as D:guarding him from most mental attacks. From time to time, the wearer can D:even purge himself of insanity. @@ -6595,7 +7221,8 @@ I:24:3:0 W:8:0:35:100 P:0:1d6:0:0:0 A:8/1:15/1 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A throwing-length axe with a "beard", an increased depth at the lower D:end of the blade. Surprisingly light and durable, it doubles as a @@ -6607,7 +7234,8 @@ I:24:4:0 W:25:0:200:450 P:0:3d6:0:0:0 A:25/1:40/1 -F:SHOW_MODS | MUST2H +F:MUST2H +F:SHOW_MODS f:MUST2H D:A mighty axe with two moon-shaped blades on each side of the headpiece, D:the immense weight leads to slow but powerful swings. @@ -6628,7 +7256,8 @@ I:24:7:0 W:22:0:150:420 A:22/1 P:0:3d4:0:0:0 -F:SHOW_MODS | COULD2H +F:COULD2H +F:SHOW_MODS f:COULD2H D:A large axe with an elongated moon shaped blade. Strikes a good balance D:between swinging power and speed. @@ -6683,7 +7312,7 @@ N:867:Map G:?:U I:8:33:0 W:70:100:30:50000 -F:INSTA_ART | +F:INSTA_ART D:At first glance, this looks like another crumpled piece of paper. D:As you smooth out the parchment, you see the faint outline of a D:map... You have a feeling you might find use for this map one day. @@ -6693,7 +7322,7 @@ N:868:& Key~ G:-:W I:11:13:0 W:70:100:5:50000 -F:INSTA_ART | +F:INSTA_ART D:As you clear away some mud from this item, you notice that it is D:actually a small silver key. You wonder what it opens. Perhaps D:you should hang on to this key, you might find it useful later. @@ -6704,7 +7333,7 @@ N:869:& Cup~ G:+:y I:11:14:0 W:70:100:50:100000 -F:INSTA_ART | +F:INSTA_ART D:It looks like a lump of clay, and as you prepare to throw it D:away, a piece breaks off, and you see a faint gleam of gold. D:Taking off the rest of the caked-on mud, you see that it is @@ -6747,14 +7376,15 @@ N:874:& Amulet~ G:":B I:40:29:5 W:10:2:2:10000 -F:INSTA_ART +F:INSTA_ART # The Black Banner of Gondor - see artifact list N:875:& Black Banner~ G:~:D I:39:108:0 W:60:30:50:50000 -F:LITE1 | INSTA_ART +F:INSTA_ART +F:LITE1 D:A strange banner of black thread rolled up as though it were a scroll. # The Pearl 'Nimphelos' - see artifact list @@ -6763,7 +7393,9 @@ G:~:w I:39:109:1 W:20:10:10:40000 P:0:1d1:0:0:0 -F:LITE3 | INSTA_ART | FULL_NAME +F:FULL_NAME +F:INSTA_ART +F:LITE3 D:A beautiful shining pearl, about the size of a dove's egg. # The Silmaril of Flames - see artifact list @@ -6772,7 +7404,10 @@ G:*:R I:39:110:2 W:75:90:200:100000 P:0:10d10:0:0:0 -F:LITE2 | LITE3 | INSTA_ART | FULL_NAME +F:FULL_NAME +F:INSTA_ART +F:LITE2 +F:LITE3 D:A dazzling, mesmerizingly beautiful jewel, shining in pure white D:light with a slight tinge of red. It hurts your eyes to look at it, D:yet you cannot bear to turn away from it, either. @@ -6783,7 +7418,9 @@ G:*:B I:39:111:2 W:75:90:200:100000 P:0:10d10:0:0:0 -F:LITE2 | LITE3 | INSTA_ART +F:INSTA_ART +F:LITE2 +F:LITE3 D:A dazzling, mesmerizingly beautiful jewel, shining in pure white D:light with a slight tinge of blue. It hurts your eyes to look at it, D:yet you cannot bear to turn away from it, either. @@ -6812,8 +7449,9 @@ I:17:3:0 W:5:7:1:3 P:0:2d6:0:0:0 A:5/7:20/7:50/7 +F:ESP_ANIMAL F:SHOW_MODS -F:SLAY_ANIMAL | ESP_ANIMAL +F:SLAY_ANIMAL D:A sharpened metal head on a piece of wood, fitted with decorative D:green feathers. You can use it for 'f'iring a bow. @@ -6850,7 +7488,8 @@ I:15:3:0 W:25:0:40:300 A:25/1:35:/2 P:0:2d5:0:0:0 -F:SHOW_MODS | IGNORE_ACID +F:IGNORE_ACID +F:SHOW_MODS D:A small curved piece of wood with mithril blades on the "forward" edges. N:885:& Mithril Boomerang~ @@ -6859,7 +7498,8 @@ I:15:4:0 W:35:5:40:1000 A:35/1:50/2 P:0:5d6:0:0:0 -F:SHOW_MODS | IGNORE_ACID +F:IGNORE_ACID +F:SHOW_MODS D:A curved leaf-shaped piece of wood, its "forward" edges enhanced with mithril blades. # N: serial number : & object name~ @@ -6868,4 +7508,4 @@ D:A curved leaf-shaped piece of wood, its "forward" edges enhanced with mithril # W: depth : rarity : weight : cost # P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac # A: depth/rarity : depth/rarity : etc -# F: flag | flag | etc \ No newline at end of file +# F: flag | flag | etc diff --git a/lib/mods/theme/edit/ow_info.txt b/lib/mods/theme/edit/ow_info.txt index 75683581..abb4b1d9 100644 --- a/lib/mods/theme/edit/ow_info.txt +++ b/lib/mods/theme/edit/ow_info.txt @@ -17,242 +17,530 @@ N:0:Bell Goodchild(Hobbit) I:20000:120 C:120:100:80 -L:Elf | Half-Elf | High-Elf | Dunadan | Hobbit | Dwarf | RohanKnight -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Druadan | Dark-Elf +L:Dunadan +L:Dwarf +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Druadan +H:Half-Ogre +H:Orc +H:Troll ### The General Store - 1 ### N:1:Balin(Dwarf) I:25000:130 C:150:100:50 -L:Dwarf | Petty-Dwarf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Troll +L:Dwarf +L:Petty-Dwarf +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:2:Berylla Boffin(Hobbit) I:20000:130 C:125:100:70 -L:Human | Hobbit -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:3:Adrahil(Half-Elf) I:30000:120 C:110:100:80 -L:Half-Elf | High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:4:Aegnor(Wood-Elf) I:10000:140 C:110:100:80 -L:High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:High-Elf +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Armoury - 2 ### N:5:Bifur(Dwarf) I:20000:130 C:125:100:70 -L:Hobbit | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Hobbit +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:6:Lalia Clayhanger(Hobbit) I:25000:130 C:125:100:50 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:7:Alcarin(Human) I:10000:140 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:8:Alatariel(High-Elf) I:30000:120 C:110:100:80 -L:High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Weaponsmith - 3 ### N:9:Bofur(Dwarf) I:30000:120 C:125:100:70 -L:Human | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:10:Daisy Gamgee(Hobbit) I:20000:130 C:110:100:80 -L:Human | Hobbit -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:11:Beregond(Dunadan) I:25000:130 C:110:100:80 -L:Human | High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Human +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:12:Amarie(Dark-Elf) I:10000:140 C:125:100:50 -L:Dark-Elf | Elf -H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling +L:Dark-Elf +L:Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Temple - 4 ### N:13:Bombur(Dwarf) I:20000:130 C:125:100:70 -L:Half-Elf | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Half-Elf +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:14:Dora Baggins(Hobbit) I:30000:120 C:110:100:80 -L:Human | High-Elf | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:15:Bergil(Half-Elf) I:10000:140 C:125:100:50 -L:Human | Half-Elf | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:Half-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:16:Amdir(Wood-Elf) I:25000:130 C:110:100:80 -L:High-Elf | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Elf +L:High-Elf +L:Hobbit +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Alchemist - 5 ### N:17:Borin(Dwarf) I:20000:130 C:110:100:80 -L:Petty-Dwarf | Dwarf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll +L:Dwarf +L:Petty-Dwarf +H:Dark-Elf +H:Demon +H:Dragon +H:Elf +H:Half-Ogre +H:Orc +H:Troll N:18:Elfstan Fairbairn(Hobbit) I:10000:140 C:125:100:50 -L:Human | Half-Elf | High-Elf | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll N:19:Cemendur(Human) I:25000:130 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:20:Annael(High-Elf) I:30000:120 C:125:100:70 -L:Human | Half-Elf | High-Elf | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll ### The Magic Shop - 6 ### N:21:Dis(Dwarf) I:30000:120 C:125:100:50 -L:Petty-Dwarf | Dwarf | Half-Elf | Dunadan -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Human | Troll | Eagle +L:Dunadan +L:Dwarf +L:Half-Elf +L:Petty-Dwarf +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Eagle +H:Half-Ogre +H:Human +H:Orc +H:Troll N:22:Folco Boffin(Hobbit) I:10000:140 C:110:100:80 L:Hobbit -H:Dragon | Demon | Orc | Troll +H:Demon +H:Dragon +H:Orc +H:Troll N:23:Ciryon(Dunadan) I:25000:130 C:110:100:80 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:24:Arminas(Dark-Elf) I:20000:130 C:125:100:70 -L:Human | Dark-Elf | Elf -H:Dragon | Demon | Beorning | Orc | High-Elf | Half-Ogre | Petty-Dwarf | Troll | Easterling +L:Dark-Elf +L:Elf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:High-Elf +H:Orc +H:Petty-Dwarf +H:Troll ### The Black Market - 7 ### N:25:Dori(Dwarf) I:30000:150 C:110:100:90 -L:Dwarf | Easterling -H:Dragon | Demon | Orc +L:Dwarf +L:Easterling +H:Demon +H:Dragon +H:Orc N:26:Halfred Greenhand(Hobbit) I:30000:150 C:110:100:90 -L:Hobbit -H:Dragon | Demon | Troll +L:Hobbit +H:Demon +H:Dragon +H:Troll N:27:Deorwine(Half-Elf) I:30000:150 C:110:100:90 -L:Half-Elf | Easterling -H:Dragon | Demon | Dark-Elf +L:Easterling +L:Half-Elf +H:Dark-Elf +H:Demon +H:Dragon N:28:Artanis(Wood-Elf) I:30000:150 C:110:100:90 -L:High-Elf | Elf | Easterling -H:Dragon | Demon | Orc | Troll +L:Easterling +L:Elf +L:High-Elf +H:Demon +H:Dragon +H:Orc +H:Troll ### The Bookstore - 9 ### N:29:Dwalin(Dwarf) I:20000:130 C:125:100:70 -L:Human | Petty-Dwarf | Dwarf -H:Dragon | Demon | Orc | Elf | Half-Ogre | Troll +L:Dwarf +L:Human +L:Petty-Dwarf +H:Demon +H:Dragon +H:Elf +H:Half-Ogre +H:Orc +H:Troll N:30:Tanta Hornblower(Hobbit) I:10000:140 C:110:100:80 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Troll +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Orc +H:Troll N:31:Dorlas(Human) I:30000:120 C:150:100:50 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:32:Caranthir(High-Elf) I:25000:130 C:110:100:80 -L:Half-Elf | High-Elf | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Pet Shop - 0 ### N:33:Fili(Dwarf) I:20000:130 C:125:100:70 -L:RohanKnight | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Petty-Dwarf +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:34:Lalia Clayhanger(Hobbit) I:25000:130 C:110:100:80 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Troll +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Orc +H:Troll N:35:Elfwine(Dunadan) I:10000:140 C:110:100:80 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:36:Edrahil(Dark-Elf) I:30000:120 C:150:100:50 -L:Dark-Elf | Elf | Easterling -H:Dragon | Demon | Orc | High-Elf | Half-Ogre | Dwarf | Troll +L:Dark-Elf +L:Easterling +L:Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:High-Elf +H:Orc +H:Troll ### The Mayors/Kings/Rulers ### @@ -260,210 +548,461 @@ H:Dragon | Demon | Orc | High-Elf | Half-Ogre | Dwarf | Troll N:37:Uldrik(Human) I:0:0 C:0:0:0 -L:Human | RohanKnight | Dunadan | Hobbit | -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Minas Anor N:38:Aragorn (Dunadan) I:0:0 C:0:0:0 -L:Human | High-Elf | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll #Khazad-Dum N:39:Gimli(Dwarf) I:0:0 C:0:0:0 -L:RohanKnight | Dunadan | Hobbit | Elf | Dwarf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Dwarf +L:Elf +L:Hobbit +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Beorn's Halls N:40:Deor(Beorning) I:100:100 C:110:100:90 -L:Beorning | Dwarf | Maia | Hobbit | Ent -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Beorning +L:Dwarf +L:Ent +L:Hobbit +L:Maia +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Dale N:41:Bard the Grim(Human) I:100:100 C:110:100:90 -L:Human | Hobbit | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Henneth Annun N:42:Halbarad(Dunadan) I:100:100 C:110:100:90 -L:Human | High-Elf | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Hobbit +L:Human +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Imladris N:43:Elrond Half-Elven I:100:100 C:110:100:90 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf | Dwarf | Ent -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Dwarf +L:Elf +L:Ent +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Helm's Deep N:44:Erkenbrand(RohanKnight) I:100:100 C:110:100:90 -L:Human | Maia | RohanKnight | Dunadan | Hobbit | Elf | Dwarf | Ent -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Dwarf +L:Elf +L:Ent +L:Hobbit +L:Human +L:Maia +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll #Thranduil's Halls N:45:Legolas Greenleaf(Wood-Elf) I:100:100 C:110:100:90 -L:High-Elf | Dunadan | Ent | Elf -H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Elf +L:Ent +L:High-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll #Edoras N:46:Theoden(RohanKnight) I:100:100 C:110:100:90 -L:Human | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Esgaroth N:47:The Master(Human) I:100:100 C:110:100:90 -L:Human -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Hobbiton N:48:Samwise Gamgee(Hobbit) I:100:100 C:110:100:90 -L:Hobbit | Elf | High-Elf | Dark-Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dark-Elf +L:Elf +L:High-Elf +L:Hobbit +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Osgiliath N:49:Eldacar(Human) I:100:100 C:110:100:90 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll #Pelargir N:50:Earnil(Dunadan) I:100:100 C:110:100:90 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### Caras Galadhon owners ### N:51:Galadriel(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:52:Celeborn(High-Elf) I:15000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:53:Aulendil(Elf) I:30000:110 C:120:100:80 #L:Warrior | -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:54:Valceronwe(Elf) I:30000:110 C:120:100:80 #L:Mage | Thaumaturgist | Sorceror -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:55:Voronwe(Elf) I:30000:110 C:120:100:80 #L:Priest | Paladin -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:56:Celegail(Elf) I:30000:110 C:120:100:80 #L:Ranger -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll ### Gondolin owners ### N:57:Turgon(High-Elf) I:30000:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:58:Pengolodh(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:59:Aerandir(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:60:Celebrimbor(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Warrior | -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:61:Lomelosse(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf | -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:62:Arlindel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Harper | Ranger -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:63:Sulraen(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf +L:Elf +L:Half-Elf +L:High-Elf #L:Mage | Sorceror -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:64:Firiel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf | -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:65:Earendur(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf | Elf -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:66:Glorfindel(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf +L:Half-Elf +L:High-Elf #L:Ranger -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:67:Ecthelion(High-Elf) I:0:110 C:120:100:80 -L:High-Elf | Half-Elf +L:Half-Elf +L:High-Elf #L:Paladin -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Inn-Keepers (minus Gondolin) ### @@ -471,97 +1010,204 @@ H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling N:68:Barliman Butterbur(Human) I:100:120 C:120:100:80 -L:Dunadan | Hobbit | Human | -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling +L:Dunadan +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Pelargir N:69:Ciryatur(Dunadan) I:100:120 C:110:100:80 -L:Dunadan | Human | RohanKnight -H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Caras Galadhon N:70:Celebor(Elf) I:100:120 C:110:100:80 -L:High-Elf | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Elf +L:High-Elf +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Minas Anor N:71:Bregolas(Human) I:100:120 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Khazad-Dum N:72:Thror(Dwarf) I:100:120 C:110:100:80 -L:Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | High-Elf | Troll +L:Dwarf +L:Petty-Dwarf +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:High-Elf +H:Orc +H:Troll #Dale N:73:Troin(Dwarf) I:100:120 C:110:100:80 -L:Human | Dwarf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dwarf +L:Human +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll #Edoras N:74:Theodwyn(Shieldmaiden) I:100:120 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Esgaroth N:75:Garm(Human) I:100:120 C:110:100:80 -L:Human | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll +L:Dwarf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll #Hobbiton N:76:Rose Cotton(Hobbit) I:100:120 C:110:100:80 -L:Human | High-Elf | Hobbit -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:High-Elf +L:Hobbit +L:Human +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Osgiliath N:77:Palantir(Human) I:100:120 C:110:100:80 -L:Human | High-Elf | RohanKnight | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:High-Elf +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Soothsayers ### N:78:Ori(Dwarf) I:20000:130 C:125:100:70 -L:Hobbit | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Hobbit +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:79:Tolman Gardner(Hobbit) I:25000:130 C:150:100:50 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:80:Inziladun(Human) I:10000:140 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan | Easterling -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Easterling +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:81:Gelmir(High-Elf) I:30000:120 C:110:100:80 -L:High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Eagles ### @@ -569,103 +1215,199 @@ N:82:Palano(Eagle) I:30000:130 C:125:100:50 L:Eagle -H:Dragon | Demon | RohanKnight +H:Demon +H:Dragon +H:RohanKnight N:83:Eglad(Eagle) I:30000:130 C:125:100:50 L:Eagle -H:Dragon | Demon | Hobbit +H:Demon +H:Dragon +H:Hobbit N:84:Hiron(Eagle) I:30000:130 C:125:100:50 L:Eagle -H:Dragon | Demon | Dunadan +H:Demon +H:Dragon +H:Dunadan N:85:Grada(Eagle) I:30000:130 C:125:100:50 L:Eagle -H:Dragon | Demon | High-Elf +H:Demon +H:Dragon +H:High-Elf ### The Librarians ### N:86:Frerin(Dwarf) I:25000:130 C:150:100:50 -L:Dwarf | Petty-Dwarf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Troll +L:Dwarf +L:Petty-Dwarf +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:87:Malva Headstrong(Hobbit) I:20000:130 C:125:100:70 -L:Human | Hobbit -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:88:Erendis(Half-Elf) I:30000:120 C:110:100:80 -L:Half-Elf | High-Elf | Dunadan | Elf | Easterling -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:89:Elemmakil(Wood-Elf) I:10000:140 C:110:100:80 -L:High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:High-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll ### The Casino Owners ### N:90:Fror(Dwarf) I:20000:130 C:125:100:70 -L:Hobbit | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Hobbit +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:91:Marmadas Brandybuck(Hobbit) I:25000:130 C:150:100:50 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:92:Fastred(Human) I:10000:140 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan | Easterling -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Easterling +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll N:93:Elured(High-Elf) I:30000:120 C:110:100:80 -L:High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll +L:Dunadan +L:Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Beastmasters ### N:94:Gloin(Dwarf) I:30000:120 C:125:100:70 -L:Human | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:95:Milo Burrows(Hobbit) I:20000:130 C:110:100:80 -L:Human | Hobbit -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:96:Findegil(Dunadan) I:25000:130 C:110:100:80 -L:Human | High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Human +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:97:Elurin(Dark-Elf) I:10000:140 C:150:100:50 -L:Dark-Elf | Elf | Easterling -H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dark-Elf +L:Easterling +L:Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### Gondor/Rohan owners ### @@ -674,130 +1416,272 @@ H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll N:98:Tarcil(Human) I:30000:120 C:150:100:50 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:99:Ulbar(Easterling) I:10000:140 C:110:100:80 -L:Human | RohanKnight | Dunadan -L:Half-Elf | High-Elf | Elf | Easterling +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight N:100:Brego(RohanKnight) I:25000:130 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Petty-Dwarf +H:Troll N:101:Ostoher(Dunadan) I:20000:130 C:125:100:70 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Tower of Magery N:102:Arveleg(Human) I:25000:130 C:125:100:70 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:103:Uldar(Easterling) I:30000:120 C:110:100:80 -L:Human | RohanKnight | Dunadan | Easterling -L:Half-Elf | High-Elf | Elf +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight N:104:Aldor(RohanKnight) I:20000:130 C:150:100:50 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Petty-Dwarf +H:Troll N:105:Tarannon(Dunadan) I:10000:140 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Inner Temple N:106:Eradan(Human) I:30000:120 C:125:100:70 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:107:Ulwise(Easterling) I:25000:130 C:150:100:50 -L:Human | RohanKnight | Dunadan | Easterling -L:Half-Elf | High-Elf | Elf +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight N:108:Gram(RohanKnight) I:20000:130 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Petty-Dwarf +H:Troll N:109:Minalcar(Dunadan) I:10000:140 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll #Paladins Guild N:110:Herion(Human) I:30000:120 C:150:100:50 -L:Human | RohanKnight | Dunadan | Easterling -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Easterling +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:111:Ulgug(Easterling) I:10000:140 C:110:100:80 -L:Human | RohanKnight | Dunadan | Easterling -L:Half-Elf | High-Elf | Elf +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight N:112:Walda(RohanKnight) I:25000:130 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Petty-Dwarf +H:Troll N:113:Calimehtar(Dunadan) I:20000:130 C:125:100:70 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll #Rangers Guild N:114:Egalmoth(Human) I:25000:130 C:125:100:70 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:115:Ulaf(Easterling) I:30000:120 C:110:100:80 -L:Human | RohanKnight | Dunadan | Easterling -L:Half-Elf | High-Elf | Elf +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Human +L:RohanKnight N:116:Fengel(RohanKnight) I:20000:130 C:150:100:50 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Petty-Dwarf +H:Troll N:117:Telemnar(Dunadan) I:10000:140 C:110:100:80 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll ### Dungeon Markets ### @@ -807,25 +1691,36 @@ N:118:Ris(Dwarf) I:30000:150 C:150:100:50 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:119:Malach Aradan(Human) I:25000:200 C:125:100:60 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:120:Indis(Half-Elf) I:20000:170 C:115:100:70 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:121:Rogdug(Half-Orc) I:10000:130 C:125:100:80 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Haftedsmiths ### @@ -833,25 +1728,36 @@ N:122:Sogur(Dwarf) I:20000:170 C:125:100:80 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:123:Manwendil(Human) I:25000:200 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:124:Lenwe(Half-Elf) I:10000:130 C:150:100:50 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:125:Ghaz(Half-Orc) I:30000:150 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Polearmsmiths ### @@ -859,25 +1765,36 @@ N:126:Tolin(Dwarf) I:10000:130 C:115:100:70 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:127:Narmacil(Human) I:25000:200 C:125:100:80 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:128:Lindir(Half-Elf) I:20000:170 C:150:100:50 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:129:Stogash(Half-Orc) I:30000:150 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Swordsmiths ### @@ -885,25 +1802,36 @@ N:130:Tis(Dwarf) I:20000:170 C:125:100:80 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:131:Nuneth(Human) I:10000:130 C:125:100:60 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:132:Mahtan(Half-Elf) I:30000:150 C:115:100:70 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:133:Rudak(Half-Orc) I:25000:200 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Rare Jewellers ### @@ -911,25 +1839,36 @@ N:134:Uin(Dwarf) I:25000:200 C:115:100:70 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:135:Ornendil(Human) I:10000:130 C:125:100:60 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:136:Malgalad(Half-Elf) I:30000:150 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:137:Ghashuf(Half-Orc) I:20000:170 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Jewellers ### @@ -937,285 +1876,433 @@ N:138:Vali(Dwarf) I:25000:200 C:150:100:50 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:139:Orodreth(Human) I:30000:150 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:140:Theodred(Half-Elf) I:10000:130 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:141:Rangush(Half-Orc) I:20000:170 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Footwear Shop owners ### N:142:Nellas(Human) I:10000:130 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:143:Tindomiel(Half-Elf) I:25000:200 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:144:Ragnor(Half-Elf) I:20000:170 C:150:100:50 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:145:Idrish(Half-Orc) I:30000:150 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Rare Footwear Shop owners ### N:146:Nerwen(Human) I:20000:170 C:125:100:80 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:147:Ulbar (Half-Elf) I:10000:130 C:125:100:60 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:148:Pelendur(Half-Elf) I:30000:150 C:115:100:70 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:149:Budgar(Half-Orc) I:25000:200 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Dungeon Librarians ### N:150:Nom(Human) I:25000:200 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:151:Urwen (Half-Elf) I:10000:130 C:125:100:60 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:152:Rian(Half-Elf) I:30000:150 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:153:Mosrog(Half-Orc) I:20000:170 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Expensive Black Marketeers ### N:154:Olwe(Human) I:30000:200 C:125:100:90 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:155:Valacar(Half-Elf) I:30000:200 C:125:100:90 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:156:Silmarien(Half-Elf) I:30000:200 C:125:100:90 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:157:Ghaz(Half-Orc) I:30000:200 C:125:100:90 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Common Shop Owners ### N:158:Ioreth(Human) I:25000:200 C:150:100:50 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:159:Vidugavia(Half-Elf) I:30000:150 C:115:100:70 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:160:Soronto(Half-Elf) I:10000:130 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:161:Nazg(Half-Orc) I:20000:170 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Dragon Hunters ### N:162:Oropher(Human) I:10000:130 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:163:Walda(Half-Elf) I:25000:200 C:125:100:80 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:164:Mithrellas(Half-Elf) I:20000:170 C:150:100:50 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:165:Urbag(Half-Orc) I:30000:150 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Speed Ring Market Owners ### N:166:Orophin(Human) I:20000:170 C:125:100:80 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:167:Wulf(Half-Orc) I:10000:130 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf N:168:Baguk(Half-Troll) I:30000:150 C:115:100:70 -L:Troll | Easterling -H:Dragon | Demon | Human +L:Easterling +L:Troll +H:Demon +H:Dragon +H:Human N:169:Zikram(Half-Orc) I:25000:200 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Scribes ### N:170:Rumil(Human) I:25000:200 C:115:100:70 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:171:Saeros(Half-Elf) I:10000:130 C:125:100:60 -L:Half-Elf | Easterling -H:Dragon | Demon | Half-Ogre +L:Easterling +L:Half-Elf +H:Demon +H:Dragon +H:Half-Ogre N:172:Zartosh(Half-Orc) I:30000:150 C:125:100:80 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf N:173:Shog(Half-Troll) I:20000:170 C:150:100:50 -L:Troll | Easterling -H:Dragon | Demon | Human +L:Easterling +L:Troll +H:Demon +H:Dragon +H:Human ### The Potion Peddlers ### N:174:Zamin(Human) I:25000:200 C:150:100:50 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:175:Algosh(Half-Orc) I:30000:150 C:115:100:70 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf N:176:Seghash(Half-Troll) I:10000:130 C:125:100:80 -L:Troll | Easterling -H:Dragon | Demon | Human +L:Easterling +L:Troll +H:Demon +H:Dragon +H:Human N:177:Kabbug(Half-Orc) I:20000:170 C:125:100:60 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf ### The Master Archers ### N:178:Palin(Dwarf) I:30000:120 C:125:100:70 -L:Human | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dwarf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:179:Wilcome Cotton(Hobbit) I:20000:130 C:110:100:80 -L:Human | Hobbit -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:180:Inzilbeth(Dunadan) I:25000:130 C:110:100:80 -L:Human | High-Elf | Dunadan | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Human +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:181:Gildor Inglorion(Dark-Elf) I:10000:140 C:150:100:50 -L:Dark-Elf | Elf | Easterling -H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll +L:Dark-Elf +L:Easterling +L:Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### Theme stores ### @@ -1224,104 +2311,248 @@ H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll N:182:Gror(Dwarf) I:20000:130 C:125:100:70 -L:Half-Elf | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Half-Elf +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:183:Saradoc Oldbuck(Hobbit) I:30000:120 C:110:100:80 -L:Human | High-Elf | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:184:Gloredhel(Half-Elf) I:10000:140 C:150:100:50 -L:Human | Half-Elf | Dunadan | Elf | Easterling -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:185:Erellont(Wood-Elf) I:25000:130 C:110:100:80 -L:High-Elf | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Elf +L:High-Elf +L:Hobbit +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Hunters ### N:186:Kili(Dwarf) I:20000:130 C:110:100:80 -L:Petty-Dwarf | Dwarf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll +L:Dwarf +L:Petty-Dwarf +H:Dark-Elf +H:Demon +H:Dragon +H:Elf +H:Half-Ogre +H:Orc +H:Troll N:187:Ruby Bolger(Hobbit) I:10000:140 C:150:100:50 -L:Human | Half-Elf | High-Elf | Hobbit | Elf | Easterling -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll +L:Easterling +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll N:188:Goldwine(Human) I:25000:130 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan | Elf | Easterling -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:189:Erestor(High-Elf) I:30000:120 C:125:100:70 -L:Human | Half-Elf | High-Elf | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Troll ### The Runecrafters ### N:190:Nori(Dwarf) I:30000:120 C:150:100:50 -L:Petty-Dwarf | Dwarf | Half-Elf | Dunadan -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Human | Troll | Eagle +L:Dunadan +L:Dwarf +L:Half-Elf +L:Petty-Dwarf +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Eagle +H:Half-Ogre +H:Human +H:Orc +H:Troll N:191:Camellia Sackville(Hobbit) I:10000:140 C:110:100:80 -L:Hobbit | Easterling -H:Dragon | Demon | Orc | Troll +L:Easterling +L:Hobbit +H:Demon +H:Dragon +H:Orc +H:Troll N:192:Hador Lorindol(Dunadan) I:25000:130 C:110:100:80 -L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +L:RohanKnight +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:193:Galathil(Dark-Elf) I:20000:130 C:125:100:70 -L:Human | Dark-Elf | Elf -H:Dragon | Demon | Beorning | Orc | High-Elf | Half-Ogre | Petty-Dwarf | Troll +L:Dark-Elf +L:Elf +L:Human +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:High-Elf +H:Orc +H:Petty-Dwarf +H:Troll ### The Musicians ### N:194:Oin(Dwarf) I:20000:130 C:125:100:70 -L:Human | Petty-Dwarf | Dwarf -H:Dragon | Demon | Orc | Elf | Half-Ogre | Troll | Easterling +L:Dwarf +L:Human +L:Petty-Dwarf +H:Demon +H:Dragon +H:Easterling +H:Elf +H:Half-Ogre +H:Orc +H:Troll N:195:Robin Smallburrow(Hobbit) I:10000:140 C:110:100:80 -L:Human | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Troll | Easterling +L:Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Orc +H:Troll N:196:Hareth(Half-Elf) I:30000:120 C:150:100:50 -L:Human | RohanKnight | Dunadan -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:197:Galdor(Wood-Elf) I:25000:130 C:110:100:80 -L:Half-Elf | High-Elf | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling +L:Elf +L:Half-Elf +L:High-Elf +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Easterling +H:Half-Ogre +H:Orc +H:Petty-Dwarf +H:Troll ### The Precious Metalsmiths ### @@ -1329,82 +2560,176 @@ N:198:Gabil(Dwarf) I:10000:130 C:115:100:70 L:Dwarf -H:Dragon | Demon | Orc +H:Demon +H:Dragon +H:Orc N:199:Isil(Human) I:25000:200 C:125:100:80 -L:Human | Easterling -H:Dragon | Demon | Troll +L:Easterling +L:Human +H:Demon +H:Dragon +H:Troll N:200:Grima(Half-Orc) I:20000:170 C:150:100:50 -L:Orc | Easterling -H:Dragon | Demon | Elf +L:Easterling +L:Orc +H:Demon +H:Dragon +H:Elf N:201:Kosh(Half-Troll) I:30000:150 C:125:100:60 -L:Troll | Easterling -H:Dragon | Demon | Human +L:Easterling +L:Troll +H:Demon +H:Dragon +H:Human ### The Mapmakers ### N:202:Pas(Dwarf) I:20000:130 C:125:100:70 -L:Half-Elf | Petty-Dwarf | Dwarf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll +L:Dwarf +L:Half-Elf +L:Petty-Dwarf +H:Beorning +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:203:Isumbras Took(Hobbit) I:30000:120 C:110:100:80 -L:Human | High-Elf | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:204:Labadal(Half-Elf) I:10000:140 C:150:100:50 -L:Human | Half-Elf | Dunadan | Elf | Easterling -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll +L:Dunadan +L:Easterling +L:Elf +L:Half-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Half-Ogre +H:Orc +H:Troll N:205:Guilin(Wood-Elf) I:25000:130 C:110:100:80 -L:High-Elf | Dunadan | Hobbit | Elf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll +L:Dunadan +L:Elf +L:High-Elf +L:Hobbit +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll ### The Farmers ### N:206:Rili(Dwarf) I:20000:130 C:110:100:80 -L:Petty-Dwarf | Dwarf -H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll +L:Dwarf +L:Petty-Dwarf +H:Dark-Elf +H:Demon +H:Dragon +H:Elf +H:Half-Ogre +H:Orc +H:Troll N:207:Wiseman Gamwich(Hobbit) I:10000:140 C:150:100:50 -L:Human | Half-Elf | High-Elf | Hobbit | Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll +L:Elf +L:Half-Elf +L:High-Elf +L:Hobbit +L:Human +H:Beorning +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll N:208:Lalaith(Human) I:25000:130 C:110:100:80 -L:Human | Half-Elf | RohanKnight | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling +L:Dunadan +L:Elf +L:Half-Elf +L:Human +L:RohanKnight +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll N:209:Gwindor(High-Elf) I:30000:120 C:125:100:70 -L:Human | Half-Elf | High-Elf | Dunadan | Elf -H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll +L:Dunadan +L:Elf +L:Half-Elf +L:High-Elf +L:Human +H:Beorning +H:Dark-Elf +H:Demon +H:Dragon +H:Dwarf +H:Half-Ogre +H:Orc +H:Troll ### The Old Mage in Minas Anor ### N:210:Malbeth the Seer I:20000:130 C:110:100:80 -L:Human | RohanKnight | Dunadan | High-Elf -H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling +L:Dunadan +L:High-Elf +L:Human +L:RohanKnight +H:Beorning +H:Demon +H:Dragon +H:Easterling +H:Half-Ogre +H:Orc +H:Troll diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 2e615e3a..8c807dcb 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -881,7 +881,7 @@ C:B:4:35:3 C:C:L:H:10000:2:40 C:P:2:20 C:Z:detect curses -C:G:GOD_FRIEND | +C:G:GOD_FRIEND C:E:0:0:0:0:0:0 C:k:+1000:+900:Magic C:k:+0:+600:Spell-power @@ -1082,7 +1082,13 @@ R:S:0:0:0:0:0:0:0 R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Rogue +R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. @@ -1090,7 +1096,13 @@ R:S:0:1:1:1:-1:1:0 R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Rogue +R:C:Warrior R:G:ELF R:k:+200:+000:Disarming R:k:+300:+000:Magic-Device @@ -1109,8 +1121,13 @@ R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:RES_LITE | -R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist +R:F:RES_LITE +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Warrior R:G:ELF R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device @@ -1128,10 +1145,16 @@ R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 R:E:1:1:1:2:1:0 R:Z:create food -R:G:RESIST_BLACK_BREATH | XTRA_MIGHT_SLING | +R:G:RESIST_BLACK_BREATH +R:G:XTRA_MIGHT_SLING R:R:1:0 -R:F:SUST_DEX | -R:C:Warrior | Archer | Mage | Rogue | Loremaster | Pacifist +R:F:SUST_DEX +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Rogue +R:C:Warrior R:k:+0:+300:Sling-mastery R:k:+1500:+000:Disarming R:k:+1800:+000:Magic-Device @@ -1150,8 +1173,11 @@ R:P:8:135:4:13 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 -R:F:FREE_ACT | -R:C:Warrior | Mage | Rogue | Pacifist +R:F:FREE_ACT +R:C:Mage +R:C:Pacifist +R:C:Rogue +R:C:Warrior R:k:+1000:+000:Disarming R:k:+1200:+000:Magic-Device R:k:+6000:+000:Spirituality @@ -1169,8 +1195,11 @@ R:P:11:125:5:16 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 -R:F:RES_BLIND | LITE1 -R:C:Warrior | Priest | Pacifist +R:F:LITE1 +R:F:RES_BLIND +R:C:Pacifist +R:C:Priest +R:C:Warrior R:k:+0:+200:Axe-mastery R:k:+200:+000:Disarming R:k:+900:+000:Magic-Device @@ -1188,8 +1217,11 @@ R:P:10:110:3:25 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 -R:F:RES_DARK | -R:C:Warrior | Archer | Rogue | Priest +R:F:RES_DARK +R:C:Archer +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:-300:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality @@ -1207,9 +1239,9 @@ R:P:12:137:3:22 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 -R:F:SUST_STR | +R:F:SUST_STR R:R:15:0 -R:F:REGEN | +R:F:REGEN R:C:Warrior R:k:-500:+000:Disarming R:k:-800:+000:Magic-Device @@ -1228,8 +1260,15 @@ R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:SUST_CON | REGEN | -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist +R:F:REGEN +R:F:SUST_CON +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:+400:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality @@ -1247,10 +1286,15 @@ R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 R:E:1:1:1:2:1:1 R:R:1:0 -R:F:SEE_INVIS | -R:F:RES_LITE | +R:F:RES_LITE +R:F:SEE_INVIS R:G:ELF -R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Warrior R:k:+400:+000:Disarming R:k:+2000:+000:Magic-Device R:k:+10000:+000:Spirituality @@ -1268,8 +1312,11 @@ R:P:12:130:3:74 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 -R:F:SUST_STR | RES_DARK | -R:C:Warrior | Priest | Pacifist +R:F:RES_DARK +R:F:SUST_STR +R:C:Pacifist +R:C:Priest +R:C:Warrior R:k:-300:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality @@ -1287,10 +1334,12 @@ R:P:12:150:3:75 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 -R:F:SUST_STR | +R:F:SUST_STR R:R:20:1 -R:F:STR | -R:C:Warrior | Rogue | Loremaster +R:F:STR +R:C:Loremaster +R:C:Rogue +R:C:Warrior R:k:+1000:+1000:Bearform-combat R:k:-600:+000:Disarming R:k:-800:+000:Magic-Device @@ -1312,8 +1361,12 @@ R:P:9:115:0:82 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 -R:F:RES_POIS | -R:C:Warrior | Archer | Rogue | Loremaster | Pacifist +R:F:RES_POIS +R:C:Archer +R:C:Loremaster +R:C:Pacifist +R:C:Rogue +R:C:Warrior R:k:+0:+250:Boomerang-mastery R:k:-200:+000:Disarming R:k:-300:+000:Magic-Device @@ -1332,8 +1385,11 @@ R:P:11:135:5:87 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 -R:F:RES_DARK | RES_DISEN | LITE1 -R:C:Warrior | Rogue +R:F:LITE1 +R:F:RES_DARK +R:F:RES_DISEN +R:C:Rogue +R:C:Warrior R:k:+300:+000:Disarming R:k:+500:+000:Magic-Device R:k:+5000:+000:Spirituality @@ -1352,10 +1408,14 @@ R:P:9:150:5:69 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 -R:F:RES_DARK | +R:F:RES_DARK R:R:20:0 -R:F:SEE_INVIS | -R:C:Warrior | Archer | Mage | Rogue | Priest +R:F:SEE_INVIS +R:C:Archer +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:G:ELF R:k:+0:+200:Magic R:k:+500:+000:Disarming @@ -1374,16 +1434,24 @@ R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 R:E:1:1:1:2:1:1 R:Z:grow trees -R:G:NO_STUN | NO_FOOD | -R:G:AC_LEVEL | +R:G:AC_LEVEL +R:G:NO_FOOD +R:G:NO_STUN R:R:1:-5 -R:F:SPEED | SENS_FIRE | SLOW_DIGEST | RES_POIS +R:F:RES_POIS +R:F:SENS_FIRE +R:F:SLOW_DIGEST +R:F:SPEED R:R:5:0 -R:F:SEE_INVIS | +R:F:SEE_INVIS R:R:20:0 -R:F:ESP_ORC | -R:F:ESP_TROLL | ESP_EVIL | -R:C:Warrior | Priest | Loremaster | Pacifist +R:F:ESP_EVIL +R:F:ESP_ORC +R:F:ESP_TROLL +R:C:Loremaster +R:C:Pacifist +R:C:Priest +R:C:Warrior R:O:70:32:2d3 R:b:1:Tree walking R:k:+0:+200:Barehand-combat @@ -1405,26 +1473,28 @@ R:P:10:220:0:84 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 -R:F:SPEED | +R:F:SPEED R:R:5:1 -R:F:SPEED | +R:F:SPEED R:R:10:1 -R:F:SPEED | +R:F:SPEED R:R:15:1 -R:F:SPEED | +R:F:SPEED R:R:20:1 -R:F:SPEED | +R:F:SPEED R:R:25:1 -R:F:SPEED | +R:F:SPEED R:R:30:1 -R:F:SPEED | +R:F:SPEED R:R:35:1 -R:F:SPEED | +R:F:SPEED R:R:40:1 -R:F:SPEED | +R:F:SPEED R:R:45:1 -R:F:SPEED | -R:C:Warrior | Priest | Pacifist +R:F:SPEED +R:C:Pacifist +R:C:Priest +R:C:Warrior R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality @@ -1443,25 +1513,29 @@ R:K:6:0:10:-16:30:10:0:0 R:P:12:300:5:89 R:E:0:1:0:4:1:1 R:R:1:0 -R:F:FEATHER | FLY +R:F:FEATHER +R:F:FLY R:R:4:0 -R:F:ESP_DRAGON | +R:F:ESP_DRAGON R:R:5:0 -R:F:RES_ELEC | +R:F:RES_ELEC R:R:10:0 -R:F:RES_COLD | +R:F:RES_COLD R:R:15:0 -R:F:RES_ACID | +R:F:RES_ACID R:R:17:0 -R:F:RES_FIRE | +R:F:RES_FIRE R:R:35:0 -R:F:RES_POIS | +R:F:RES_POIS R:R:45:0 -R:F:IM_ELEC | +R:F:IM_ELEC R:R:50:0 R:F:CLIMB R:k:+1000:+300:Barehand-combat -R:C:Loremaster | Mage | Priest | Pacifist +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest R:k:+600:+000:Disarming R:k:+000:+000:Magic-Device R:k:+5000:+000:Spirituality @@ -1484,7 +1558,10 @@ R:k:=0:=0:Weaponmastery R:k:+0:+400:Barehand-combat R:k:=0:=0:Geomancy R:F:FLY -R:C:Loremaster | Mage | Priest | Pacifist +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest #R:G:EVIL R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device @@ -1498,7 +1575,13 @@ R:S:-5:-5:-5:-5:-5:-5:-5 R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Rogue +R:C:Warrior R:k:-500:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality @@ -1517,10 +1600,16 @@ R:S:2:2:-3:5:0:1:0 R:K:5:6:6:5:8:12:-5:40 R:P:7:130:4:5 R:E:1:1:1:2:1:1 -R:G:XTRA_MIGHT_BOW | +R:G:XTRA_MIGHT_BOW R:R:1:1 -R:F:XTRA_MIGHT | RES_LITE | -R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist +R:F:RES_LITE +R:F:XTRA_MIGHT +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Pacifist +R:C:Priest +R:C:Warrior R:G:ELF R:k:+0:+200:Archery R:b:1:Tree walking @@ -1543,24 +1632,67 @@ R:P:10:100:0:91 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:20:0 -R:F:DRAIN_EXP | +R:F:DRAIN_EXP R:R:6:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:12:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:18:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:24:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:30:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:36:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:42:1 -R:F:STR | INT | WIS | DEX | CON | CHR | +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS R:R:48:1 -R:F:STR | INT | WIS | DEX | CON | CHR | -R:C:Warrior | Archer | Mage | Pacifist +R:F:CHR +R:F:CON +R:F:DEX +R:F:INT +R:F:STR +R:F:WIS +R:C:Archer +R:C:Mage +R:C:Pacifist +R:C:Warrior R:k:+000:+000:Disarming R:k:+000:+000:Magic-Device R:k:+000:+000:Spirituality @@ -1580,8 +1712,10 @@ R:S:2:-2:-2:-2:2:-1:-1 R:K:0:-5:-1:0:0:10:5:5 R:P:10:140:0:105 R:E:1:1:1:2:1:1 -R:C:Warrior | Archer -R:G:XTRA_MIGHT_XBOW | NO_STUN +R:C:Archer +R:C:Warrior +R:G:NO_STUN +R:G:XTRA_MIGHT_XBOW R:R:5:0 R:F:FREE_ACT R:R:15:0 @@ -1614,9 +1748,16 @@ R:K:0:0:0:0:0:0:0:0 R:P:10:170:3:109 # Everything at zero here, depends on type of demon. R:E:0:0:0:0:0:0 -R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster +R:C:Archer +R:C:Loremaster +R:C:Mage +R:C:Priest +R:C:Rogue +R:C:Warrior R:G:CORRUPT -R:F:RES_FEAR | HOLD_LIFE | RES_DARK +R:F:HOLD_LIFE +R:F:RES_DARK +R:F:RES_FEAR R:Z:spear of darkness R:k:+500:+000:Disarming R:k:+050:+000:Magic-Device @@ -1654,10 +1795,28 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | -S:A:Druadan | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | Eagle | -S:A:Yeek | Wood-Elf | Maia | Easterling +S:A:Beorning +S:A:Dark-Elf +S:A:Druadan +S:A:Dunadan +S:A:Dwarf +S:A:Eagle +S:A:Easterling +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Maia +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek # Just a place holder, the actualy setting are done with corruptions, see # corrupt.lua and player.lua @@ -1668,9 +1827,22 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Hobbit | Gnome | Dwarf | Orc | -S:A:Troll | Dunadan | Half-Ogre | Beorning | Druadan | Petty-Dwarf | -S:A:Dark-Elf | RohanKnight | Yeek | Easterling +S:A:Beorning +S:A:Dark-Elf +S:A:Druadan +S:A:Dunadan +S:A:Dwarf +S:A:Easterling +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:Hobbit +S:A:Human +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Yeek S:C:A:Mage S:O:70:0:5d3 S:O:70:32:2d3 @@ -1682,14 +1854,39 @@ S:S:-5:1:1:2:-3:-6:-3:105 S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | -S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | -S:C:F:Warrior | Archer -S:G:UNDEAD | NO_CUT | NO_FOOD | SEMI_WRAITH | NO_SUBRACE_CHANGE +S:A:Beorning +S:A:Dark-Elf +S:A:Druadan +S:A:Dunadan +S:A:Dwarf +S:A:Easterling +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek +S:C:F:Archer +S:C:F:Warrior +S:G:NO_CUT +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:SEMI_WRAITH +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:SLOW_DIGEST | RES_COLD | RES_POIS | RES_NETHER | +S:F:HOLD_LIFE +S:F:RES_COLD +S:F:RES_NETHER +S:F:RES_POIS +S:F:SEE_INVIS +S:F:SLOW_DIGEST S:O:70:32:2d3 S:k:+200:+000:Disarming S:k:+800:+000:Magic-Device @@ -1706,15 +1903,36 @@ S:S:0:-2:-2:0:1:-4:-3:70 S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | -S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | -S:G:UNDEAD | NO_CUT | NO_FOOD | NO_SUBRACE_CHANGE +S:A:Beorning +S:A:Dark-Elf +S:A:Druadan +S:A:Dunadan +S:A:Dwarf +S:A:Easterling +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek +S:G:NO_CUT +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:RES_POIS | RES_SHARDS | +S:F:HOLD_LIFE +S:F:RES_POIS +S:F:RES_SHARDS +S:F:SEE_INVIS S:R:10:0 -S:F:RES_COLD | +S:F:RES_COLD S:O:70:32:2d3 S:k:-500:+000:Disarming S:k:-500:+000:Magic-Device @@ -1730,16 +1948,36 @@ S:S:2:-6:-6:1:4:-5:-4:70 S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling | -S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf | +S:A:Beorning +S:A:Dark-Elf +S:A:Druadan +S:A:Dunadan +S:A:Dwarf +S:A:Easterling +S:A:Elf +S:A:Gnome +S:A:Half-Elf +S:A:Half-Ogre +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Orc +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Troll +S:A:Wood-Elf +S:A:Yeek S:C:F:Mage -S:G:UNDEAD | NO_FOOD | NO_SUBRACE_CHANGE +S:G:NO_FOOD +S:G:NO_SUBRACE_CHANGE +S:G:UNDEAD S:R:1:0 -S:F:SEE_INVIS | HOLD_LIFE | -S:F:SLOW_DIGEST | RES_POIS | +S:F:HOLD_LIFE +S:F:RES_POIS +S:F:SEE_INVIS +S:F:SLOW_DIGEST S:R:5:0 -S:F:RES_COLD | +S:F:RES_COLD S:O:70:32:2d3 S:k:-200:+000:Disarming S:k:-200:+000:Magic-Device @@ -1755,10 +1993,17 @@ S:S:2:-3:-2:1:1:-3:1:50 S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 S:E:0:0:0:0:0:0 -S:A:Human | Dwarf | Orc | Troll | Half-Ogre | Beorning | Druadan | Easterling +S:A:Beorning +S:A:Druadan +S:A:Dwarf +S:A:Easterling +S:A:Half-Ogre +S:A:Human +S:A:Orc +S:A:Troll S:C:F:Mage S:R:10:0 -S:F:RES_FEAR | +S:F:RES_FEAR S:k:-200:+000:Disarming S:k:-1000:+000:Magic-Device S:k:+200:+000:Spirituality @@ -1774,10 +2019,24 @@ S:S:-3:1:1:-3:-3:1:0:120 S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 S:E:0:0:0:0:0:0 -S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf | -S:A:Dunadan | High-Elf | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | -S:A:Eagle | Yeek | Wood-Elf | Maia | -S:C:F:Warrior | Archer +S:A:Dark-Elf +S:A:Dunadan +S:A:Dwarf +S:A:Eagle +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:High-Elf +S:A:Hobbit +S:A:Human +S:A:Maia +S:A:Petty-Dwarf +S:A:RohanKnight +S:A:Wood-Elf +S:A:Yeek +S:C:F:Archer +S:C:F:Warrior S:k:+500:+000:Disarming S:k:+1000:+000:Magic-Device S:k:+500:+000:Spirituality @@ -1792,11 +2051,22 @@ S:S:0:0:0:0:0:0:0:100 S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:G:ASTRAL | NO_SUBRACE_CHANGE +S:G:ASTRAL +S:G:NO_SUBRACE_CHANGE S:R:1:0 S:F:SEE_INVIS -S:A:Half-Elf | Elf | High-Elf | Dark-Elf | Wood-Elf | Maia | -S:A:Hobbit | Gnome | Dwarf | Petty-Dwarf | Ent | Eagle | +S:A:Dark-Elf +S:A:Dwarf +S:A:Eagle +S:A:Elf +S:A:Ent +S:A:Gnome +S:A:Half-Elf +S:A:High-Elf +S:A:Hobbit +S:A:Maia +S:A:Petty-Dwarf +S:A:Wood-Elf S:O:70:32:25d2 S:O:70:12:25d3 @@ -1819,11 +2089,14 @@ S:S:3:0:0:0:0:0:0:100 S:K:0:0:0:0:-2:2:5:0 S:P:0:0:1 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Warrior | Archer +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_STR | SH_FIRE | RES_FIRE +S:F:RES_FIRE +S:F:SH_FIRE +S:F:SUST_STR S:R:5:1 S:F:STR S:R:10:1 @@ -1839,7 +2112,8 @@ S:F:STR S:R:45:0 S:F:IM_FIRE S:R:50:1 -S:F:STR | CLIMB +S:F:CLIMB +S:F:STR S:Z:fire breath S:k:+1000:+600:Fire @@ -1852,11 +2126,13 @@ S:S:0:0:0:0:0:3:0:100 S:K:2:0:1:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Archer | Warrior +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_CHR | | RES_ACID +S:F:RES_ACID +S:F:SUST_CHR S:R:5:1 S:F:CHR S:R:10:1 @@ -1872,7 +2148,8 @@ S:F:CHR S:R:45:0 S:F:IM_ACID S:R:50:1 -S:F:CHR | CLIMB +S:F:CHR +S:F:CLIMB S:Z:spit acid S:k:+1000:+600:Water @@ -1885,11 +2162,13 @@ S:S:0:0:0:0:3:0:0:100 S:K:0:0:2:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Archer | Warrior +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_CON | RES_POIS +S:F:RES_POIS +S:F:SUST_CON S:R:5:1 S:F:CON S:R:10:1 @@ -1903,7 +2182,8 @@ S:F:CON S:R:40:1 S:F:CON S:R:50:1 -S:F:CON | CLIMB +S:F:CLIMB +S:F:CON S:Z:poison dart S:k:+1000:+600:Air @@ -1915,11 +2195,14 @@ S:S:0:0:0:3:0:0:0:100 S:K:3:0:0:2:1:0:0:0 S:P:0:0:1 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Archer | Warrior +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_DEX | RES_ELEC | SH_ELEC +S:F:RES_ELEC +S:F:SH_ELEC +S:F:SUST_DEX S:R:5:1 S:F:DEX S:R:10:1 @@ -1935,7 +2218,8 @@ S:F:DEX S:R:45:0 S:F:IM_ELEC S:R:50:1 -S:F:DEX | CLIMB +S:F:CLIMB +S:F:DEX S:Z:dazzle S:k:+1000:+600:Earth @@ -1947,11 +2231,14 @@ S:S:0:3:0:0:0:0:0:100 S:K:0:2:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Archer | Warrior +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_INT | RES_COLD | SENS_FIRE +S:F:RES_COLD +S:F:SENS_FIRE +S:F:SUST_INT S:R:5:1 S:F:INT S:R:10:1 @@ -1967,7 +2254,8 @@ S:F:INT S:R:45:0 S:F:IM_COLD S:R:50:1 -S:F:INT | CLIMB +S:F:CLIMB +S:F:INT S:Z:cold breath S:k:+1000:+600:Divination @@ -1980,11 +2268,15 @@ S:S:0:0:3:0:0:0:0:100 S:K:0:0:1:5:2:2:0:0 S:P:0:0:3 S:E:0:0:0:0:0:0 -S:A:Dragon -S:C:F:Archer | Warrior -S:G:NO_SUBRACE_CHANGE | UNDEAD | SEMI_WRAITH +S:A:Dragon +S:C:F:Archer +S:C:F:Warrior +S:G:NO_SUBRACE_CHANGE +S:G:SEMI_WRAITH +S:G:UNDEAD S:R:1:0 -S:F:SUST_WIS | HOLD_LIFE +S:F:HOLD_LIFE +S:F:SUST_WIS S:R:5:1 S:F:WIS S:R:10:1 @@ -1998,7 +2290,8 @@ S:F:WIS S:R:40:1 S:F:WIS S:R:50:1 -S:F:WIS | CLIMB +S:F:CLIMB +S:F:WIS S:Z:chaos breath S:k:+1000:+600:Meta @@ -2013,7 +2306,7 @@ S:S:-1:1:1:1:-1:-2:0:100 S:K:2:0:1:2:2:20:0:0 S:P:1:20:1 S:E:1:1:1:2:1:1 -S:A:Demon +S:A:Demon S:C:F:Priest S:G:NO_SUBRACE_CHANGE S:R:1:0 @@ -2047,10 +2340,13 @@ S:P:1:0:1 # R:E:weapons:torso:arms:finger:head:legs S:E:0:1:2:4:1:1 S:A:Demon -S:C:F:Warrior | Archer | Priest +S:C:F:Archer +S:C:F:Priest +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:SUST_CHR | FLY +S:F:FLY +S:F:SUST_CHR S:R:5:0 S:F:FREE_ACT S:R:10:0 @@ -2074,29 +2370,34 @@ S:S:-1:0:0:0:-1:0:0:100 S:K:2:0:2:0:5:30:0:0 S:P:0:-10:2 S:E:1:1:1:2:1:1 -S:A:Demon +S:A:Demon S:C:F:Priest S:G:NO_SUBRACE_CHANGE S:R:5:0 S:F:ESP_ANIMAL S:R:10:1 -S:F:ESP_ORC | SEARCH +S:F:ESP_ORC +S:F:SEARCH S:R:15:0 S:F:ESP_TROLL S:R:20:1 -S:F:ESP_DRAGON | SEARCH +S:F:ESP_DRAGON +S:F:SEARCH S:R:25:0 S:F:ESP_UNDEAD S:R:30:1 -S:F:ESP_NONLIVING | SEARCH +S:F:ESP_NONLIVING +S:F:SEARCH S:R:35:0 S:F:ESP_EVIL S:R:40:1 -S:F:ESP_GOOD | SEARCH +S:F:ESP_GOOD +S:F:SEARCH S:R:45:0 S:F:ESP_DEMON S:R:50:1 -S:F:ESP_ALL | SEARCH +S:F:ESP_ALL +S:F:SEARCH S:Z:smell monsters S:Z:smell metal R:k:+500:+300:Stealth @@ -2113,23 +2414,31 @@ S:S:2:-1:-2:-2:2:-1:0:100 S:K:-1:0:0:-8:-2:-10:5:0 S:P:2:20:0 S:E:1:1:1:2:1:1 -S:A:Demon -S:C:F:Priest | Mage -S:G:NO_SUBRACE_CHANGE | NO_STUN +S:A:Demon +S:C:F:Mage +S:C:F:Priest +S:G:NO_STUN +S:G:NO_SUBRACE_CHANGE S:R:1:0 S:F:RES_POIS S:R:10:1 -S:F:RES_FIRE | TUNNEL +S:F:RES_FIRE +S:F:TUNNEL S:R:20:1 -S:F:RES_ACID | TUNNEL +S:F:RES_ACID +S:F:TUNNEL S:R:30:1 -S:F:RES_ELEC | TUNNEL +S:F:RES_ELEC +S:F:TUNNEL S:R:40:1 -S:F:RES_COLD | TUNNEL +S:F:RES_COLD +S:F:TUNNEL S:R:45:1 -S:F:RES_SHARDS | TUNNEL +S:F:RES_SHARDS +S:F:TUNNEL S:R:50:1 -S:F:RES_SOUND | TUNNEL +S:F:RES_SOUND +S:F:TUNNEL S:k:+1000:+500:Boulder-throwing S:Z:eat rock R:k:-800:+000:Stealth @@ -2147,8 +2456,11 @@ S:K:0:0:1:-10:2:10:0:0 S:P:2:10:0 S:E:1:1:1:2:1:1 S:A:Demon -S:C:F:Archer | Priest -S:G:NO_SUBRACE_CHANGE | NO_STUN | AC_LEVEL +S:C:F:Archer +S:C:F:Priest +S:G:AC_LEVEL +S:G:NO_STUN +S:G:NO_SUBRACE_CHANGE S:R:1:0 S:F:RES_POIS S:R:1:7 @@ -2176,29 +2488,34 @@ S:S:1:1:1:1:1:-1:0:100 S:K:2:0:2:-20:5:30:0:0 S:P:0:-20:2 S:E:1:1:1:2:1:1 -S:A:Demon +S:A:Demon S:C:F:Priest S:G:NO_SUBRACE_CHANGE S:R:4:0 S:F:ESP_ANIMAL S:R:8:1 -S:F:ESP_ORC | SEARCH +S:F:ESP_ORC +S:F:SEARCH S:R:12:0 S:F:ESP_TROLL S:R:16:1 -S:F:ESP_DRAGON | SEARCH +S:F:ESP_DRAGON +S:F:SEARCH S:R:20:0 S:F:ESP_UNDEAD S:R:24:1 -S:F:ESP_NONLIVING | SEARCH +S:F:ESP_NONLIVING +S:F:SEARCH S:R:28:0 S:F:ESP_EVIL S:R:32:1 -S:F:ESP_GOOD | SEARCH +S:F:ESP_GOOD +S:F:SEARCH S:R:36:0 S:F:ESP_DEMON S:R:40:1 -S:F:ESP_ALL | SEARCH +S:F:ESP_ALL +S:F:SEARCH S:R:50:0 S:F:PRECOGNITION S:Z:smell monsters @@ -2222,54 +2539,110 @@ S:K:5:5:5:10:5:50:0:0 S:P:2:40:3 S:E:0:1:0:1:1:0 S:A:Demon -S:C:F:Warrior | Archer | Priest | Rogue +S:C:F:Archer +S:C:F:Priest +S:C:F:Rogue +S:C:F:Warrior S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:FEATHER | FREE_ACT | LITE1 | RES_POIS | +S:F:FEATHER +S:F:FREE_ACT +S:F:LITE1 +S:F:RES_POIS S:R:1:0 -S:F:REGEN | SEE_INVIS | SLOW_DIGEST | SUST_CHR | +S:F:REGEN +S:F:SEE_INVIS +S:F:SLOW_DIGEST +S:F:SUST_CHR S:R:1:10 -S:F:SPEED | +S:F:SPEED S:R:5:0 -S:F:ESP_ANIMAL | RES_FIRE | RES_COLD | SUST_WIS | +S:F:ESP_ANIMAL +S:F:RES_COLD +S:F:RES_FIRE +S:F:SUST_WIS S:R:5:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:10:0 -S:F:ESP_ORC | RES_ELEC | RES_ACID | SUST_INT | WATER_BREATH | +S:F:ESP_ORC +S:F:RES_ACID +S:F:RES_ELEC +S:F:SUST_INT +S:F:WATER_BREATH S:R:10:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:15:0 -S:F:ESP_TROLL | FLY | RES_CONF | RES_LITE | SUST_CON | +S:F:ESP_TROLL +S:F:FLY +S:F:RES_CONF +S:F:RES_LITE +S:F:SUST_CON S:R:15:1 -S:F:LUCK | SPEED | SPELL | +S:F:LUCK +S:F:SPEED +S:F:SPELL S:R:20:0 -S:F:ESP_DRAGON | ESP_GIANT | LITE2 | RES_BLIND | SUST_DEX | +S:F:ESP_DRAGON +S:F:ESP_GIANT +S:F:LITE2 +S:F:RES_BLIND +S:F:SUST_DEX S:R:20:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:25:0 -S:F:ESP_UNDEAD | ESP_NONLIVING | RES_DISEN | RES_CHAOS | SUST_STR | +S:F:ESP_NONLIVING +S:F:ESP_UNDEAD +S:F:RES_CHAOS +S:F:RES_DISEN +S:F:SUST_STR S:R:25:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:30:0 -S:F:ESP_EVIL | ESP_DEMON | RES_SOUND | +S:F:ESP_DEMON +S:F:ESP_EVIL +S:F:RES_SOUND S:R:30:1 -S:F:LUCK | SPEED | SPELL | +S:F:LUCK +S:F:SPEED +S:F:SPELL S:R:35:0 -S:F:CLIMB | ESP_GOOD | ESP_THUNDERLORD | RES_SHARDS | +S:F:CLIMB +S:F:ESP_GOOD +S:F:ESP_THUNDERLORD +S:F:RES_SHARDS S:R:35:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:40:0 -S:F:ESP_UNIQUE | LITE3 | PRECOGNITION | RES_NEXUS | RES_NETHER | +S:F:ESP_UNIQUE +S:F:LITE3 +S:F:PRECOGNITION +S:F:RES_NETHER +S:F:RES_NEXUS S:R:40:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED S:R:45:0 -S:F:ESP_ALL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | MAGIC_BREATH | +S:F:ESP_ALL +S:F:IM_ACID +S:F:IM_COLD +S:F:IM_ELEC +S:F:IM_FIRE +S:F:MAGIC_BREATH S:R:45:1 -S:F:SPEED | SPELL | +S:F:SPEED +S:F:SPELL S:R:50:0 -S:F:IM_NETHER | REFLECT | WRAITH | +S:F:IM_NETHER +S:F:REFLECT +S:F:WRAITH S:R:50:1 -S:F:LUCK | SPEED | +S:F:LUCK +S:F:SPEED R:k:+25000:+500:Stealth R:k:+2000:+200:Sneakiness R:k:+2000:+300:Magic-Device @@ -2282,7 +2655,7 @@ S:S:-2:1:1:3:-1:-1:2:150 S:K:2:2:2:2:2:30:0:0 S:P:1:50:2 S:E:1:1:1:2:1:1 -S:A:Demon +S:A:Demon S:C:F:Priest S:G:NO_SUBRACE_CHANGE S:R:1:0 @@ -2309,15 +2682,19 @@ S:S:2:1:1:-1:2:1:1:100 S:K:0:0:4:-3:0:10:10:10 S:P:2:30:0 S:E:1:1:1:2:1:1 -S:A:Demon -S:C:F:Priest | Mage +S:A:Demon +S:C:F:Mage +S:C:F:Priest S:G:NO_SUBRACE_CHANGE S:R:5:0 -S:F:RES_FIRE | RES_COLD +S:F:RES_COLD +S:F:RES_FIRE S:R:10:0 -S:F:RES_ELEC | RES_ACID +S:F:RES_ACID +S:F:RES_ELEC S:R:15:0 -S:F:RES_POIS | RES_CONF +S:F:RES_CONF +S:F:RES_POIS S:k:+1000:+100:Combat S:k:+1000:+100:Weaponmastery R:k:+1000:+100:Archery @@ -2336,11 +2713,14 @@ S:S:1:1:1:1:1:1:0:150 S:K:1:1:1:1:1:20:15:10 S:P:3:50:2 S:E:1:1:1:2:1:1 -S:A:Demon -S:C:F:Priest | Loremaster | Rogue +S:A:Demon +S:C:F:Loremaster +S:C:F:Priest +S:C:F:Rogue S:G:NO_SUBRACE_CHANGE S:R:1:0 -S:F:IM_FIRE | SH_FIRE +S:F:IM_FIRE +S:F:SH_FIRE S:k:+0:+300:Combat S:k:+0:+300:Magic S:Z:turn into a Balrog diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index d5696b9b..87294e8b 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -200,10 +200,19 @@ E:1:1:1:2:1:1 O:1:1:1:1 B:BEG:* B:TOUCH:EAT_GOLD -F:MALE | EVIL | WILD_TOWN | WILD_ONLY | -F:RAND_25 | FRIENDS | -F:TAKE_ITEM | OPEN_DOOR | DROP_CORPSE | DROP_SKELETON | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He looks squalid and thoroughly revolting. N:2:Scrawny cat @@ -213,9 +222,17 @@ W:0:3:100:0 E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d1 -F:RAND_25 | WILD_GRASS | WILD_TOWN | WILD_ONLY | -F:ANIMAL | DROP_CORPSE | DROP_SKELETON | -F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_TOWN D:A skinny little furball with sharp claws. N:3:Sparrow @@ -225,9 +242,19 @@ W:0:3:90:0 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | CAN_FLY | WILD_TOWN | WILD_ONLY | -F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | -F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | AQUATIC +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_SKELETON +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:WILD_ONLY +F:WILD_TOWN D:Utterly harmless, except when angry. N:4:Chaffinch @@ -237,9 +264,20 @@ W:0:3:80:0 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | CAN_FLY | WILD_ONLY | WILD_WOOD | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | AQUATIC -F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_SKELETON +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Utterly harmless, except when angry. N:5:Wild rabbit @@ -249,9 +287,17 @@ W:0:3:100:0 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_50 | WILD_ONLY | WILD_GRASS | WILD_WOOD | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_50 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:It is not a carnivore, but will defend itself if you stray too D:close. @@ -262,11 +308,22 @@ W:0:1:1000:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:MALE | WILD_ONLY | WILD_WOOD | -F:RAND_25 | DROP_SKELETON | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | HAS_LITE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_WOOD D:He has a strong axe with a sharp edge. N:7:Scruffy little dog @@ -276,8 +333,16 @@ W:0:3:300:0 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY | -F:ANIMAL | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:WILD_ONLY +F:WILD_TOWN D:A thin flea-ridden mutt, growling as you get close. N:8:Farmer Maggot @@ -286,12 +351,24 @@ I:110:35d10:40:10:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:100:0:0 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | NO_TARGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL F:NEVER_MOVE -F:OPEN_DOOR | BASH_DOOR | SPECIAL_GENE -F:NEUTRAL | NO_TARGET | NO_DEATH -F:MORTAL | BASEANGBAND | HAS_LITE +F:NO_DEATH +F:NO_TARGET +F:NO_TARGET +F:OPEN_DOOR +F:SPECIAL_GENE +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:A broad and thick-set hobbit with a round red face. "There's earth under D:his old feet, and clay on his fingers; wisdom in his bones, and both his D:eyes are open." He seems sad about something. @@ -303,9 +380,19 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | TAKE_ITEM | NEUTRAL | NO_TARGET | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He tends to blubber a lot. N:10:Boil-covered wretch @@ -315,10 +402,21 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | NEUTRAL | NO_TARGET -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:Ugly doesn't begin to describe him. N:11:Village idiot @@ -328,9 +426,19 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY | -F:RAND_25 | DROP_1D2 | TAKE_ITEM | NEUTRAL | NO_TARGET -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:Drooling and comical, he runs around town with a stupid grin. N:12:Pitiful-looking beggar @@ -340,10 +448,20 @@ W:0:1:1300:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | NEUTRAL | NO_TARGET -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:You just can't help feeling sorry for him. N:13:Mangy-looking leper @@ -354,10 +472,20 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* B:TOUCH:DISEASE -F:MALE | DROP_CORPSE | DROP_SKELETON | -F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | NEUTRAL | NO_TARGET -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:You feel it isn't safe to touch him. N:14:Agent of the black market @@ -369,11 +497,22 @@ O:25:50:20:5 B:HIT:HURT:1d6 B:TOUCH:EAT_ITEM B:INSULT:* -F:MALE | DROP_CORPSE | DROP_SKELETON | -F:DROP_60 | WILD_TOWN | -F:WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_TOWN +F:WILD_WOOD D:He 'finds' new wares for the Black Market. From unwary adventurers. N:15:Singing, happy drunk @@ -383,11 +522,22 @@ W:0:1:1100:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:MALE | -F:RAND_50 | DROP_SKELETON | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | WILD_TOWN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE | NEUTRAL | NO_TARGET +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He makes you glad to be sober. N:16:Aimless-looking merchant @@ -397,10 +547,22 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:MALE | RAND_50 | -F:ONLY_GOLD | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY | -F:MORTAL | BASEANGBAND | HAS_LITE | NEUTRAL | NO_TARGET +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:The typical ponce around town, with purse jingling, and looking for more D:amulets of adornment to buy. @@ -411,10 +573,22 @@ W:0:1:1700:0 E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_50 | DROP_90 | WILD_GRASS | WILD_TOWN | WILD_WOOD | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_GRASS +F:WILD_ONLY +F:WILD_TOWN +F:WILD_WOOD D:No job is too low for him. N:18:Battle-scarred veteran @@ -424,10 +598,19 @@ W:0:1:1650:0 E:1:1:1:2:1:1 O:25:50:25:0 B:HIT:HURT:2d6 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:RAND_50 | DROP_90 | WILD_TOWN | WILD_ONLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_50 +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He doesn't take to strangers kindly. N:19:The Squint-eyed Southerner @@ -440,9 +623,21 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:PUNCH:HURT:3d8 B:PUNCH:HURT:3d8 -F:UNIQUE | MALE | CAN_SPEAK | BASEANGBAND | HAS_LITE | -F:FORCE_MAXHP | DROP_CORPSE | WILD_TOWN | WILD_ONLY | DROP_1D2 | -F:ONLY_ITEM | DROP_GOOD | DROP_GREAT | DROP_RANDART | MORTAL +F:BASEANGBAND +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_RANDART +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:He doesn't look like he's from around here, and a gut D:feeling tells you he's a spy. @@ -456,11 +651,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 B:SPORE:HURT:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A small strange growth. N:21:Large white snake @@ -471,9 +672,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 B:CRUSH:HURT:1d1 -F:RAND_50 | WILD_TOO | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It is about eight feet long. N:22:Grey mushroom patch @@ -483,10 +690,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. N:23:Newt @@ -497,9 +710,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 -F:WEIRD_MIND | CAN_SWIM | WILD_TOO | DROP_CORPSE | -F:WILD_GRASS | WILD_WASTE | WILD_SHORE | WILD_MOUNTAIN | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_SHORE +F:WILD_TOO +F:WILD_WASTE D:A small, harmless lizard. # New monster added by furiosity for the Theme module @@ -513,9 +735,22 @@ B:KICK:HURT:10d10 B:KICK:HURT:10d10 B:BUTT:HURT:10d10 B:BUTT:HURT:10d10 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS -F:FRIEND | FRIENDS | FORCE_SLEEP | STUPID | WEIRD_MIND | -F:SUSCEP_POIS | KILL_BODY | NEUTRAL | NO_TARGET | KILL_ITEM | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIEND +F:FRIENDS +F:KILL_BODY +F:KILL_ITEM +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:STUPID +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY D:A strong and powerful animal with sharp-looking horns. Large cattle D:used to carry and draw burdens, and for milk and meat. It is domestic and D:utterly harmless, except when angry. @@ -531,9 +766,22 @@ B:KICK:HURT:20d20 B:KICK:HURT:20d20 B:KICK:HURT:20d20 B:KICK:HURT:20d20 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | -F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | GOOD | -F:KILL_BODY | NEUTRAL | NO_TARGET | KILL_ITEM | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIEND +F:FRIENDS +F:GOOD +F:KILL_BODY +F:KILL_ITEM +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY D:The oxen that live on the lands around the Sea of Rhun are hardier D:and wilder than any others in Middle-earth. Legends claim that they D:are descended from the cattle of the Huntsman of the Valar, Orome @@ -552,8 +800,19 @@ B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:KICK:HURT:5d5 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | -F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIEND +F:FRIENDS +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY D:Woolly grazing animals, especially common on the Barrow-downs D:and in the Vales of Anduin. Utterly harmless unless angered. @@ -564,10 +823,14 @@ W:1:1:600:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | WILD_TOO | WILD_GRASS | -F:CAN_SWIM | -F:ANIMAL | DROP_CORPSE | -F:MORTAL | BASEANGBAND | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_GRASS +F:WILD_TOO S:MULTIPLY D:It is about three feet long, with large teeth. @@ -579,9 +842,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:CRUSH:HURT:1d4 -F:RAND_25 | CAN_SWIM | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 D:It is about eight feet long. # New monster added by furiosity for the Theme module @@ -595,8 +864,17 @@ B:KICK:HURT:10d12 B:KICK:HURT:10d12 B:KICK:HURT:10d12 B:KICK:HURT:10d12 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | -F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | NEUTRAL | NO_TARGET | GOOD | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:GOOD +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY D:The great Mearas are legendary horses bred by the Rohirrim. D:Swift and sure they are, but only members of the royal D:family of Rohan are allowed to ride them. This animal will @@ -613,8 +891,18 @@ B:KICK:HURT:8d10 B:KICK:HURT:8d10 B:KICK:HURT:8d10 B:KICK:HURT:8d10 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | -F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | WILD_TOWN | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY +F:WILD_TOWN D:Beasts of burden and transport used by Elves and Men through the ages. D:A noble animal, it can be quite a sight as it prances gracefully D:through the fields. It won't attack you unless provoked. @@ -626,10 +914,18 @@ W:1:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | -F:ANIMAL | IM_POIS | HURT_LITE | NO_FEAR -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -640,8 +936,12 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:PARALYZE -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR D:A disembodied eye, floating a few feet above the ground. N:33:Rock lizard @@ -651,9 +951,14 @@ W:1:1:100:2 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_MOUNTAIN | -F:DROP_CORPSE | HAS_EGG | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO D:It is a small lizard with a hardened hide. # New monster added by furiosity for the Theme module @@ -666,8 +971,16 @@ O:0:0:0:0 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_TOO | -F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | WILD_WOOD | UNIQUE | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A monstrous beast that inhabited Everholt in the Firien Wood, D:around the feet of the Halifirien in the White Mountains. It D:is twice the size of a regular boar, and twice as aggressive. @@ -680,9 +993,15 @@ W:1:1:400:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:FRIENDS | -F:WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:It is a yapping snarling wild dog, dangerous when in a pack. N:36:Soldier ant @@ -692,9 +1011,14 @@ W:1:1:300:3 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | -F:ANIMAL | WILD_TOO | WILD_GRASS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:A large ant with powerful mandibles. N:37:Fruit bat @@ -704,8 +1028,14 @@ W:1:1:20:1 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:ANIMAL | CAN_FLY | WILD_TOO | WILD_WOOD | DROP_CORPSE -F:MORTAL | BASEANGBAND | AI_ANNOY +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_TOO +F:WILD_WOOD D:A fast-moving pest. N:38:Insect swarm @@ -716,9 +1046,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 B:STING:HURT:1d1 -F:ANIMAL | WEIRD_MIND | CAN_FLY | RAND_25 | WILD_TOO | WILD_GRASS | -F:WILD_WOOD | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:NO_CUT +F:RAND_25 +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A lone insect may be harmless, but there's a whole swarm of D:them here! @@ -731,8 +1069,15 @@ E:0:1:0:2:1:2 O:0:0:0:0 B:BUTT:HURT:3d3 B:BUTT:HURT:3d3 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_TOO | -F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | WILD_WOOD | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:Aggressive tusked beasts common to woodland regions. N:40:Shrieker mushroom patch @@ -741,11 +1086,20 @@ I:110:1d1:4:1:0 W:2:1:40:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW | -F:STUPID | EMPTY_MIND | -F:IM_POIS | WILD_TOO | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_TOO +S:1_IN_4 S:SHRIEK D:Yum! It looks quite tasty. It doesn't sound so nice, though. @@ -760,8 +1114,19 @@ B:KICK:HURT:7d7 B:BUTT:HURT:7d7 B:KICK:HURT:7d7 B:BUTT:HURT:7d7 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | -F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIEND +F:FRIENDS +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY D:Domestic horned beasts kept throughout Middle-earth. D:Utterly harmless, unless angered. @@ -790,10 +1155,16 @@ E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:MALE | -F:DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:He looks inexperienced but tough. N:44:Novice rogue @@ -804,10 +1175,17 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO D:A rather shifty individual. N:45:Novice priest @@ -817,13 +1195,22 @@ W:2:1:1500:6 E:1:1:1:2:1:1 O:25:0:50:20 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:HEAL | SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:CAUSE_1 +S:HEAL +S:SCARE D:He is tripping over his priestly robes. N:46:Novice mage @@ -833,13 +1220,22 @@ W:2:1:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:MALE | -F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BLINK | BLIND | CONF | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:BLINK +S:CONF +S:MISSILE D:He is leaving behind a trail of dropped spell components. N:47:Yellow mushroom patch @@ -849,11 +1245,17 @@ W:2:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d6 -F:NEVER_MOVE | WILD_TOO | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_TOO D:Yum! It looks quite tasty. N:48:White jelly @@ -863,10 +1265,17 @@ W:2:1:2000:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d2 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It's a large pile of white flesh. N:49:Giant black ant @@ -876,10 +1285,16 @@ W:2:1:500:8 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:RAND_25 | -F:WEIRD_MIND | DROP_SKELETON | -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:It is about three feet long. N:50:Salamander @@ -889,9 +1304,16 @@ W:2:1:100:10 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 -F:RAND_25 | CAN_SWIM | WILD_TOO | WILD_VOLCANO | DROP_CORPSE | -F:ANIMAL | IM_FIRE | SUSCEP_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A small black and orange lizard. N:51:White harpy @@ -903,8 +1325,16 @@ O:0:0:0:0 B:CLAW:HURT:1d1 B:CLAW:HURT:1d1 B:BITE:HURT:1d2 -F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | -F:RAND_50 | DROP_CORPSE | ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO D:A flying, screeching bird with a woman's face. # New monster added by furiosity for the Theme module @@ -918,8 +1348,18 @@ B:KICK:HURT:8d8 B:BUTT:HURT:8d8 B:KICK:HURT:8d8 B:BUTT:HURT:8d8 -F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | -F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | WILD_WOOD | +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:SUSCEP_POIS +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Graceful creature found throughout Middle-earth. Deer are D:traditionally dedicated to the Vala Nessa, and are said to D:follow her as she travels through the wild lands. They will @@ -932,10 +1372,15 @@ W:2:2:600:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR | ANIMAL -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -946,10 +1391,15 @@ W:2:2:650:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -960,10 +1410,15 @@ W:2:2:700:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:UNIQUE | SPECIAL_GENE -F:FORCE_MAXHP | RAND_25 | DROP_CORPSE -F:BASH_DOOR -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:SPECIAL_GENE +F:UNIQUE D:A rather vicious dog belonging to Farmer Maggot. It thinks you are D:stealing mushrooms. @@ -974,9 +1429,14 @@ W:2:1:200:6 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 -F:RAND_25 | WILD_ONLY | WILD_SHORE | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WILD_ONLY +F:WILD_SHORE D:It is as big as a wolf. # New monster added by furiosity for the Theme module @@ -989,8 +1449,16 @@ O:0:0:0:0 B:BITE:TERRIFY:2d8 B:CLAW:HURT:2d16 B:CLAW:HURT:2d16 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:Master of all felines, it's a huge cat with enormous paws D:and a thick mane. Its roar is deafeningly terrifying. @@ -1001,11 +1469,18 @@ W:2:1:40:3 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:ACID:1d3 -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | -F:ANIMAL | IM_ACID | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_ACID +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -1017,8 +1492,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:HURT:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long. N:60:Cave spider @@ -1028,10 +1511,16 @@ W:2:1:400:7 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:FRIENDS | -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | SPIDER | HURT_LITE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HURT_LITE +F:MORTAL +F:SPIDER +F:WEIRD_MIND D:It is a black spider that moves in fits and starts. N:61:Crow @@ -1042,8 +1531,15 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 -F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND | AQUATIC +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_TOO +F:WILD_WOOD D:It is a hooded crow, gray except for the black wings and head. N:62:Wild cat @@ -1054,8 +1550,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:BASH_DOOR | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_TOO D:A larger than normal feline, hissing loudly. Its velvet claws conceal a D:fistful of needles. @@ -1067,16 +1568,32 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:TOUCH:EAT_GOLD B:BITE:HURT:2d4 -F:UNIQUE | MALE | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | DROP_CHOSEN | -F:FORCE_MAXHP | CAN_SPEAK | SMART | -F:RAND_50 | RAND_25 | WILD_TOO | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | DROP_GREAT | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | INVISIBLE -F:EVIL | BASEANGBAND -S:1_IN_25 | -S:S_SPIDER -D:Also known as Gollum. He is of the Periannath, but does not look it. -D:He is thin and frail, sneaking around in dark corners, hoping to +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_90 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:INVISIBLE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +S:1_IN_25 +S:S_SPIDER +D:Also known as Gollum. He is of the Periannath, but does not look it. +D:He is thin and frail, sneaking around in dark corners, hoping to D:reclaim his "precious," and he'll use any means necessary to do so. N:64:Green ooze @@ -1086,10 +1603,19 @@ W:3:2:300:4 E:0:0:0:0:0:0 O:50:0:25:20 B:CRAWL:ACID:1d3 -F:RAND_50 | RAND_25 | DROP_90 | -F:STUPID | EMPTY_MIND | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:DROP_90 +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:STUPID D:It's green and it's oozing. N:65:Poltergeist @@ -1099,12 +1625,25 @@ W:3:1:0:8 E:0:0:0:0:0:0 O:50:5:30:10 B:TOUCH:TERRIFY -F:RAND_50 | RAND_25 | CAN_FLY | -F:DROP_60 | DROP_90 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | TAKE_ITEM | -F:EVIL | UNDEAD | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 S:BLINK D:It is a ghastly, ghostly form. @@ -1115,11 +1654,18 @@ W:3:1:2000:12 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_15 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_15 S:DRAIN_MANA D:It's a large pile of yellow flesh. @@ -1131,9 +1677,16 @@ W:0:3:100:0 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:WILD_ONLY | WILD_GRASS | WILD_WOOD | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | NEUTRAL | NO_TARGET | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:A funny chittering creature, looking for nuts. N:68:Raven @@ -1144,8 +1697,18 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 -F:ANIMAL | WILD_ONLY | WILD_WOOD | CAN_FLY | DROP_CORPSE -F:MORTAL | HAS_EGG | NEUTRAL | NO_TARGET | IMPRESED | BASEANGBAND | AQUATIC +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_ONLY +F:WILD_WOOD D:Larger than a crow, and pitch black. N:69:White midge @@ -1155,8 +1718,13 @@ W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:It is an evil relative of the moth, native to marshlands. @@ -1170,8 +1738,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:6d1 B:BITE:HURT:7d1 -F:WILD_TOO | WILD_WOOD | DROP_CORPSE | CAN_FLY | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_TOO +F:WILD_WOOD D:An ominous-looking squirrel with dark fur, covered in D:leaves for better masquerade. It has glowing eyes and D:unusually sharp teeth. It is a horrific creation of the @@ -1185,10 +1758,15 @@ W:3:1:1700:20 E:0:0:0:0:1:0 O:0:75:20:5 B:CRUSH:HURT:1d8 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 D:A large black serpent's body with a female torso. N:72:Spotted mushroom patch @@ -1198,10 +1776,16 @@ W:3:1:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:2d4 -F:NEVER_MOVE | WILD_TOO | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:WILD_TOO D:Yum! It looks quite tasty. N:73:Silver jelly @@ -1212,11 +1796,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:1d3 B:TOUCH:EAT_LITE:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_15 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_15 S:DRAIN_MANA D:It is a large pile of silver flesh that sucks all light from its D:surroundings. @@ -1229,10 +1820,15 @@ E:1:1:1:2:1:1 O:0:50:0:40 B:HIT:HURT:1d4 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_60 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:A short little guy, in bedraggled clothes. He appears to be looking D:for a good tavern. @@ -1243,9 +1839,14 @@ W:3:1:800:7 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:It is about two feet long and has sharp pincers. N:76:Yellow mold @@ -1255,10 +1856,15 @@ W:3:1:30:9 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor. # New monster added by furiosity for the Theme module @@ -1271,8 +1877,14 @@ O:0:0:0:0 B:BITE:HURT:2d2 B:BITE:DISEASE:1d1 B:BITE:EAT_FOOD:1d1 -F:BASEANGBAND | ANIMAL | MORTAL | AI_ANNOY | -F:RAND_50 | RAND_25 | SMART | WEIRD_MIND | +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:MORTAL +F:RAND_25 +F:RAND_50 +F:SMART +F:WEIRD_MIND S:1_IN_10 S:SHRIEK D:A large humanoid form, relatively rare on Middle-earth. @@ -1285,10 +1897,17 @@ W:3:2:200:4 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:LOSE_DEX:1d3 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | -F:ANIMAL | HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -1299,12 +1918,20 @@ W:3:2:200:4 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 -F:ATTR_CLEAR | CAN_SWIM | -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | INVISIBLE | -F:ANIMAL | -F:IM_POIS | HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:HURT_LITE +F:IM_POIS +F:INVISIBLE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a disgusting mass of poisonous worms. @@ -1315,9 +1942,14 @@ W:3:1:500:6 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:LOSE_STR:1d6 -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | HAS_LITE -S:1_IN_11 | +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR +S:1_IN_11 S:DRAIN_MANA D:A disembodied eye, crackling with energy. @@ -1328,8 +1960,15 @@ W:4:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:BLIND -F:EMPTY_MIND | CAN_FLY | NONLIVING | SUSCEP_ELEC | -F:BASEANGBAND | HAS_LITE | RAND_50 | RAND_25 | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:HAS_LITE +F:NONLIVING +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:SUSCEP_ELEC D:A fast-moving bright light, apparently totally random in its movement. N:82:Cave lizard @@ -1339,8 +1978,16 @@ W:4:1:100:8 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d5 -F:ANIMAL | CAN_SWIM | DROP_CORPSE | HAS_EGG | WILD_ONLY -F:MORTAL | NEUTRAL | NO_TARGET | IMPRESED | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_ONLY D:It is an armoured lizard with a powerful bite. N:83:Novice ranger @@ -1351,13 +1998,21 @@ E:1:1:1:2:1:1 O:25:45:25:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:ARROW_2 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 +S:ARROW_2 +S:MISSILE D:An agile hunter, ready and relaxed. N:84:Blue jelly @@ -1367,10 +2022,19 @@ W:4:1:2000:14 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:COLD:1d6 -F:NEVER_MOVE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_COLD | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_LITE +F:IM_COLD +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE D:It's a large pile of pulsing blue flesh. N:85:Creeping copper coins @@ -1381,10 +2045,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d4 B:TOUCH:POISON:2d4 -F:ONLY_GOLD | DROP_1D2 | SUSCEP_ACID | -F:COLD_BLOOD | BASH_DOOR | -F:IM_ELEC | IM_POIS | CHAR_MULTI | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:SUSCEP_ACID D:It appears to be a pile of copper coins, until it starts crawling towards you D:on tiny legs. @@ -1395,8 +2067,10 @@ W:4:1:200:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d3 -F:RAND_25 | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is a very vicious rodent. @@ -1407,11 +2081,22 @@ W:4:1:900:15 E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | RAND_50 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:RAND_50 +F:WILD_TOO +F:WILD_WOOD D:Immature Orcling, running wild and screaming all the time. N:88:Swordfish @@ -1422,8 +2107,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A fish with a swordlike "beak". N:89:Blue worm mass @@ -1433,11 +2122,20 @@ W:4:1:40:5 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:COLD:1d4 -F:RAND_50 | RAND_25 | -F:STUPID | WEIRD_MIND | COLD_BLOOD | -F:ANIMAL | IM_COLD | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:HURT_LITE +F:IM_COLD +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_FIRE +F:WEIRD_MIND S:MULTIPLY D:It is a large slimy mass of worms. @@ -1449,8 +2147,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d5 B:CRUSH:HURT:1d8 -F:RAND_25 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | WILD_TOO | -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long. # New monster added by furiosity for the Theme module @@ -1464,14 +2170,32 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | TAKE_ITEM | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:ARROW_2 | ARROW_3 | ARROW_4 | MISSILE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_4 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 +S:MISSILE D:A person with no love for Gondor. He thinks you are a soldier in D:the King's army. @@ -1486,12 +2210,21 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:POISON:2d8 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:DROP_2D2 | SUSCEP_ELEC | FRIENDS | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:ARROW_1 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_ELEC +F:TAKE_ITEM +S:1_IN_5 +S:ARROW_1 D:A person with no love for Rohan. He thinks you are a Rider of the D:Mark in disguise. @@ -1502,13 +2235,23 @@ W:6:2:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:MALE | -F:FORCE_SLEEP | -F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BLINK | BLIND | CONF | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:BLINK +S:CONF +S:MISSILE D:He is leaving behind a trail of dropped spell components. N:94:Green naga @@ -1519,10 +2262,19 @@ E:0:0:0:0:1:0 O:0:25:0:65 B:CRUSH:HURT:1d8 B:SPIT:ACID:2d6 -F:FEMALE | -F:RAND_25 | TAKE_ITEM | DROP_60 | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:EVIL | IM_ACID | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:IM_ACID +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_SHORE +F:WILD_TOO D:A large green serpent with a female torso. Her green skin glistens with D:acid. @@ -1534,7 +2286,11 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:3d1 B:BITE:HURT:3d1 -F:ANIMAL | AQUATIC | WEIRD_MIND | RAND_25 | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:RAND_25 +F:WEIRD_MIND D:Yech! The disgusting thing only wants your blood! N:96:Barracuda @@ -1545,8 +2301,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A predatory fish with razor-sharp teeth. N:97:Novice paladin @@ -1557,13 +2317,21 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:CAUSE_1 +S:SCARE D:An adventurer both devoutly religious and skillful in combat. D:He seems to consider you an agent of Morgoth. @@ -1577,10 +2345,20 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | MALE | -F:EVIL | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:MALE +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:WILD_TOO +F:WILD_WOOD D:A dark-skinned human who worships Sauron. A powerful warrior, D:almost as strong as a troll. He has bizarre white eyes. @@ -1591,10 +2369,19 @@ W:5:1:300:7 E:0:0:0:0:0:0 O:45:20:20:0 B:CRAWL:COLD:1d4 -F:RAND_50 | RAND_25 | DROP_60 | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_COLD | SUSCEP_FIRE -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:DROP_60 +F:EMPTY_MIND +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_FIRE D:It's blue and it's oozing. N:100:Green glutton ghost @@ -1604,10 +2391,20 @@ W:5:1:0:15 E:0:0:0:0:0:0 O:30:30:30:5 B:TOUCH:EAT_FOOD:1d1 -F:RAND_50 | RAND_25 | -F:DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:RAND_50 +F:UNDEAD D:It is a very ugly green ghost with a voracious appetite. N:101:Green jelly @@ -1617,10 +2414,17 @@ W:5:1:2500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:1d2 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:IM_ACID | HURT_LITE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_ACID +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pile of pulsing green flesh. # New monster added for the Theme module @@ -1634,9 +2438,23 @@ O:0:50:0:50 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND | UNIQUE | FORCE_MAXHP | CAN_SPEAK | SMART | -F:EVIL | ORC | OPEN_DOOR | BASH_DOOR | IM_FIRE | IM_COLD | -F:IM_POIS | ESCORT | ESCORTS | DROP_1D2 | DROP_GOOD | MALE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:ORC +F:SMART +F:UNIQUE D:A strong and cunning orc warrior, a commander of Saruman's orcs. # New monster added for the Theme module @@ -1650,19 +2468,51 @@ O:0:45:45:10 B:INSULT:INSANITY:2d10 B:INSULT:EAT_GOLD:2d10 B:INSULT:EAT_ITEM:2d10 -F:MALE | SMART | CAN_SPEAK | JOKEANGBAND | -F:FORCE_MAXHP | -F:RAND_25 | -F:DROP_90 | DROP_GOOD | DROP_GREAT | -F:DROP_4D2 | DROP_2D2 | ONLY_ITEM | AI_ANNOY | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | KILL_BODY | RES_NETH | RES_DISE | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:RES_NEXU | RES_PLAS | HAS_LITE | NO_CUT | NO_STUN | -F:REFLECTING | -S:1_IN_5 -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_2 | FORGET | TRAPS | -S:BO_MANA | ROCKET | +F:AI_ANNOY +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_4D2 +F:DROP_90 +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_BODY +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RAND_25 +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:SMART +S:1_IN_5 +S:BLIND +S:BO_MANA +S:CAUSE_2 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:ROCKET +S:SCARE +S:TELE_AWAY +S:TPORT +S:TRAPS D:This annoying little gnome won't stop bragging about his great D:magical powers and shiny new equipment--unless someone silences D:him permanently. Unfortunately, your own weapons and spells @@ -1675,10 +2525,16 @@ W:5:2:500:20 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:UN_BONUS -F:ATTR_MULTI | ATTR_ANY | RES_DISE | DROP_CORPSE | -F:NEVER_MOVE | CAN_FLY | -F:HURT_LITE | NO_FEAR | BASEANGBAND -S:1_IN_9 | +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_FEAR +F:RES_DISE +S:1_IN_9 S:DRAIN_MANA D:A disembodied eye, crackling with magic. @@ -1689,11 +2545,20 @@ W:5:1:40:6 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:FIRE:1d6 -F:RAND_50 | RAND_25 | SUSCEP_COLD | -F:STUPID | EMPTY_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_SWIM | -F:HURT_LITE | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_FIRE +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:SUSCEP_COLD S:MULTIPLY D:It is a large slimy mass of worms. @@ -1704,8 +2569,17 @@ W:5:1:200:15 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d4 -F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE | BASH_DOOR | -F:ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It has a copper head and sharp venomous fangs. N:107:Death sword @@ -1718,10 +2592,26 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:NEVER_MOVE | NONLIVING | NO_FEAR | SUSCEP_ACID | -F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP | -F:DROP_90 | EVIL | IM_COLD | IM_FIRE | FORCE_MAXHP | IM_ELEC | IM_POIS | -F:BASEANGBAND | HAS_LITE | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_ACID D:A bloodthirsty blade lurking for prey. Beware! N:108:Purple mushroom patch @@ -1733,9 +2623,15 @@ O:0:0:0:0 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yuck! It doesn't look so tasty. N:109:Apprentice priest @@ -1745,13 +2641,23 @@ W:6:2:1500:6 E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:1d5 -F:MALE | GOOD | -F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:HEAL | SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:CAUSE_1 +S:HEAL +S:SCARE D:He is tripping over his priestly robes. N:110:Apprentice warrior @@ -1762,10 +2668,17 @@ E:1:1:1:2:1:1 O:0:95:0:0 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:He looks inexperienced but tough. # New monster added for the Theme module @@ -1776,10 +2689,13 @@ I:110:6d6:25:80:200 W:8:4:0:30 B:HIT:HURT:3d4 B:TOUCH:EAT_GOLD -F:MALE -F:DROP_1D2 | DROP_GOOD -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR +F:BASH_DOOR +F:DROP_1D2 +F:DROP_GOOD F:EVIL +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM S:1_IN_8 S:ARROW_1 D:A filthy little dwarf. He wants your purse, and judging by the @@ -1793,13 +2709,19 @@ I:120:7d10:20:16:20 W:10:1:0:50 B:HIT:HURT:1d6 B:HIT:HURT:UN_BONUS:1d6 -F:MALE -F:FORCE_SLEEP -F:ONLY_ITEM | DROP_1D2 -F:OPEN_DOOR | BASH_DOOR +F:BASH_DOOR +F:DROP_1D2 F:EVIL +F:FORCE_SLEEP +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR S:1_IN_5 -S:BLIND | CONF | MISSILE | DARKNESS | BA_POIS +S:BA_POIS +S:BLIND +S:CONF +S:DARKNESS +S:MISSILE D:A small dwarf in mage's robes. He looks comical, but he has slain any D:adventurer foolish enough to laugh at him. @@ -1810,10 +2732,16 @@ W:6:1:50:20 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A strange brown growth on the dungeon floor. N:114:Giant brown bat @@ -1823,9 +2751,16 @@ W:6:1:600:10 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:ANIMAL | DROP_CORPSE | AI_ANNOY -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It screeches as it attacks. # New monster added by furiosity for the Theme module @@ -1835,8 +2770,18 @@ I:120:1d1:6:5:10 W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:RAND_50 | RAND_25 | NEUTRAL | NO_TARGET | WILD_ONLY | WILD_WOOD | NEVER_BLOW | -F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND | WILD_GRASS | +F:ANIMAL +F:BASEANGBAND +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NO_TARGET +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:A large insect with beautiful fluttering wings. N:116:Apprentice rogue @@ -1847,10 +2792,18 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:MALE | FRIENDS | -F:DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO D:A rather shifty individual. N:117:Creeping silver coins @@ -1861,9 +2814,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d6 B:TOUCH:POISON:2d6 -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:COLD_BLOOD | BASH_DOOR | SUSCEP_ACID | CHAR_MULTI | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:SUSCEP_ACID D:It appears to be a pile of silver coins, until it starts crawling towards you D:on tiny legs. @@ -1874,11 +2837,20 @@ W:6:1:1600:15 E:1:1:1:2:1:1 O:20:50:5:15 B:HIT:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO D:He is one of the many weaker 'slave' orcs, often mistakenly known as a D:goblin. @@ -1889,8 +2861,17 @@ W:6:1:200:20 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d5 -F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | HAS_EGG | ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_TOO D:It is recognised by the hard-scaled end of its body that is often rattled D:to frighten its prey. @@ -1902,9 +2883,15 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:ACID:2d4 B:BITE:ACID:2d6 -F:ANIMAL | EMPTY_MIND | KILL_ITEM | KILL_BODY | CAN_SWIM | WILD_TOO | -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:KILL_BODY +F:KILL_ITEM +F:MORTAL +F:WILD_TOO S:1_IN_10 S:BR_ACID D:It is slowly making its way towards you, eating everything in @@ -1917,9 +2904,14 @@ W:7:1:200:16 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:2d4 -F:RAND_50 | WILD_ONLY | WILD_SHORE | -F:BASH_DOOR | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:RAND_50 +F:WILD_ONLY +F:WILD_SHORE D:It looks poisonous. N:122:Dark elf @@ -1930,13 +2922,21 @@ E:1:1:1:2:1:1 O:20:20:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:DROP_90 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:CONF | DARKNESS | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:OPEN_DOOR +S:1_IN_10 +S:CONF +S:DARKNESS +S:MISSILE D:An elven figure with jet black skin and white hair, his eyes are large and D:twisted with evil. @@ -1948,9 +2948,17 @@ W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:EAT_LITE:1d1 -F:RAND_50 | RAND_25 | HURT_LITE | WILD_TOO | WILD_WOOD | -F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND | WILD_GRASS | -S:MULTIPLY +F:ANIMAL +F:BASEANGBAND +F:HURT_LITE +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD +S:MULTIPLY D:Nocturnal insect of a kind closely related to butterflies. N:124:Crypt creep @@ -1962,12 +2970,23 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:POISON +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR F:RAND_25 -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | FRIENDS | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | -F:NO_CONF | NO_SLEEP | HURT_LITE | BASEANGBAND | NO_CUT +F:UNDEAD S:1_IN_10 -S:CAUSE_1 | S_UNDEAD +S:CAUSE_1 +S:S_UNDEAD D:A frightening skeletal figure in a black robe. N:125:Rotting corpse @@ -1978,9 +2997,20 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:POISON:1d3 B:CLAW:POISON:1d3 -F:OPEN_DOOR | BASH_DOOR | FRIENDS | -F:NO_CONF | NO_SLEEP | UNDEAD | EVIL | NO_FEAR | IM_POIS | -F:IM_COLD | COLD_BLOOD | EMPTY_MIND | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:Corpses awakened from their sleep by dark sorcery. N:126:Cave orc @@ -1990,11 +3020,19 @@ W:7:1:1900:20 E:1:1:1:2:1:1 O:20:70:0:0 B:HIT:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC D:He is often found in huge numbers in deep caves. N:127:Wood spider @@ -2005,10 +3043,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:STING:POISON:1d4 -F:FRIENDS | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_WOOD | -F:ANIMAL | SPIDER | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD D:It scuttles towards you. N:128:Hurog @@ -2018,10 +3063,15 @@ W:7:2:300:16 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND | -S:1_IN_50 | +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR +S:1_IN_50 S:BR_NETH D:A minor demonic servant of evil. Its features remind you of a dog - in fact, D:Huroeg are the result of the corruption of dogs by Morgoth. @@ -2033,9 +3083,14 @@ W:7:3:550:30 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:BLIND:2d6 -F:NEVER_MOVE | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_7 | +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HURT_LITE +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 S:DRAIN_MANA D:A disembodied eye, bloodshot and nasty. @@ -2047,10 +3102,18 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:1d10 B:BITE:LOSE_STR:1d4 -F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:RAND_25 | DROP_60 | -F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_SHORE +F:WILD_TOO D:A large red snake with a woman's torso. N:131:Red jelly @@ -2060,10 +3123,16 @@ W:7:1:2500:26 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:1d5 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pulsating mound of red flesh. # New monster added by furiosity for the Theme module @@ -2073,9 +3142,19 @@ I:110:1d1:30:1:10 W:0:3:80:0 E:0:1:1:0:1:0 O:0:0:0:0 -F:RAND_25 | CAN_FLY | WILD_ONLY | WILD_WOOD | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | NEVER_BLOW | NEUTRAL | NO_TARGET | -F:MORTAL | BASEANGBAND | DG_CURSE | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DG_CURSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NO_TARGET +F:RAND_25 +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Small brown birds of thrush kind, famous for their clear D:singing, and the fact that they will sing during the night D:as well as the day (hence their name). Since the days of @@ -2091,12 +3170,24 @@ E:0:0:0:0:0:0 O:60:0:25:0 B:HIT:HURT:2d2 B:TOUCH:LOSE_WIS -F:RAND_50 | DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | -F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:TPORT | DRAIN_MANA +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:IM_COLD +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:DRAIN_MANA +S:TPORT D:It is almost insubstantial. N:134:Night lizard @@ -2107,8 +3198,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:ANIMAL | CAN_SWIM | WILD_TOO | DROP_CORPSE -F:MORTAL | HAS_EGG | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:WILD_TOO D:It is a black lizard with overlapping scales and a powerful jaw. # New monster added by furiosity for the Theme module @@ -2121,8 +3217,18 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 B:BITE:DISEASE:1d4 -F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE | WILD_SHORE | -F:MORTAL | HAS_EGG | BASEANGBAND | EVIL | WILD_SWAMP | IMPRESED | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:It is a hooded crow, camouflaged well for a swampland or forest. D:It is a carrion bird that often lives close alongside the mewlips, D:the remains of whose prey it devours. @@ -2134,10 +3240,20 @@ W:8:1:1700:26 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d5 -F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is an animated orc skeleton. N:137:Grima the Wormtongue, Agent of Saruman @@ -2150,14 +3266,30 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | RES_TELE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | SLOW | TRAPS | BO_COLD | BA_POIS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_5 +S:BA_POIS +S:BO_COLD +S:HEAL +S:SLOW +S:TRAPS D:He was once the chief counsellor to King Theoden of Rohan. D:He betrayed king and country by becoming a spy for the D:corrupted Istari Saruman. @@ -2172,12 +3304,30 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:UNIQUE | MALE | FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | EVIL | DROP_SKELETON | DROP_CORPSE -F:MORTAL | JOKEANGBAND | HAS_LITE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD S:1_IN_5 -S:ARROW_2 | HEAL | TRAPS +S:ARROW_2 +S:HEAL +S:TRAPS D:The legendary archer who steals from the rich (you qualify). # New monster added by furiosity for the Theme module @@ -2189,8 +3339,16 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 -F:ANIMAL | WILD_ONLY | WILD_SHORE | CAN_FLY | DROP_CORPSE | -F:MORTAL | BASEANGBAND | WILD_OCEAN | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_OCEAN +F:WILD_ONLY +F:WILD_SHORE D:A sea-bird found around the shores of Middle-earth. The sound of a D:gull mewing is said to awaken the Sea-longing in the heart of an Elf. @@ -2204,10 +3362,24 @@ B:HIT:HURT:1d11 B:HIT:HURT:1d11 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | SPECIAL_GENE | -F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:An orc soldier who served under Shagrat in the garrison of the Tower of Cirith Ungol. # New monster added by furiosity for the Theme module @@ -2218,9 +3390,17 @@ W:1:9:80:0 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_25 | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_SKELETON +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:RAND_25 +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD S:1_IN_10 S:SHRIEK D:A tiny scarlet bird from Numenor, with a really high voice. @@ -2233,12 +3413,20 @@ E:1:1:1:2:1:1 O:0:80:0:15 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:ARROW_2 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_9 +S:ARROW_2 +S:MISSILE D:An agile hunter, ready and relaxed. N:143:Giant salamander @@ -2248,11 +3436,16 @@ W:8:1:600:50 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 -F:FORCE_SLEEP | SUSCEP_COLD | -F:RAND_25 | -F:ANIMAL | IM_FIRE | CAN_SWIM | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_9 +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_9 S:BR_FIRE D:A large black and yellow lizard. You'd better run away! @@ -2263,7 +3456,14 @@ W:8:2:0:28 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:TERRIFY:1d4 -F:PASS_WALL | NO_CONF | NO_SLEEP | NONLIVING | IM_ACID | CAN_FLY | JOKEANGBAND | NO_CUT +F:CAN_FLY +F:IM_ACID +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL D:A black hole in the fabric of reality. # New monster added by furiosity for the Theme module @@ -2273,9 +3473,18 @@ I:120:9d10:8:100:255 W:20:3:300:0 E:0:1:0:6:1:0 O:0:0:0:0 -F:CAN_FLY | NEUTRAL | NO_TARGET | GOOD | -F:MORTAL | NEVER_BLOW | DG_CURSE | WILD_ONLY | -F:AQUATIC | WILD_SHORE | NO_TARGET | WILD_OCEAN +F:AQUATIC +F:CAN_FLY +F:DG_CURSE +F:GOOD +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NO_TARGET +F:NO_TARGET +F:WILD_OCEAN +F:WILD_ONLY +F:WILD_SHORE D:Beautiful and graceful large white birds inhabiting aquatic D:regions. They never do any harm, and it is said that anyone D:who kills a swan incurs the wrath of the Valar. @@ -2287,10 +3496,17 @@ W:8:1:40:28 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor. N:147:Apprentice paladin @@ -2301,13 +3517,22 @@ E:1:1:1:2:1:1 O:30:55:10:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:SCARE | CAUSE_1 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:CAUSE_1 +S:SCARE D:He thinks you are an agent of Morgoth. N:148:Caborrog @@ -2317,10 +3542,15 @@ W:8:3:1000:16 E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d8 -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND | -S:1_IN_50 | +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FRIENDS +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR +S:1_IN_50 S:BR_NETH D:A minor demonic servant of evil. It resembles a frog - in fact, D:Caborroeg are the result of Morgoth's corruption of frogs. @@ -2332,11 +3562,19 @@ W:8:1:2000:25 E:1:1:1:2:1:1 O:10:70:10:0 B:HIT:HURT:1d10 -F:MALE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC D:He is a hardy well-weathered survivor. N:150:Bandit @@ -2347,10 +3585,19 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_GOLD -F:MALE | -F:DROP_1D2 | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_TOO +F:WILD_WOOD D:He is after your cash! N:151:Hunting hawk @@ -2362,8 +3609,17 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 -F:ANIMAL | NO_FEAR | CAN_FLY | WILD_WOOD | WILD_TOO | DROP_CORPSE -F:MORTAL | HAS_EGG | IMPRESED | BASEANGBAND | AQUATIC +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NO_FEAR +F:WILD_TOO +F:WILD_WOOD D:Trained to hunt and kill without fear. N:152:Phantom warrior @@ -2374,8 +3630,16 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:PASS_WALL | NO_SLEEP | FRIENDS | COLD_BLOOD | NONLIVING | -F:NO_FEAR | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FRIENDS +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL D:Spectral creatures that are half real, half illusion. # New monster added by furiosity for the Theme module @@ -2387,8 +3651,17 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 -F:ANIMAL | WILD_ONLY | WILD_WOOD | CAN_FLY | DROP_CORPSE | -F:MORTAL | HAS_EGG | BASEANGBAND | NEUTRAL | NO_TARGET | WILD_GRASS | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Large speckled brown birds with a special fondness for snails, D:whose shells they remove by breaking them against stones. @@ -2401,9 +3674,16 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | IM_COLD | -F:MORTAL | SUSCEP_FIRE | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:IM_COLD +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO D:A large white figure covered in shaggy fur. # New monster added by furiosity for the Theme module @@ -2414,9 +3694,16 @@ W:10:1:600:40 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_WASTE | WILD_MOUNTAIN | -F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD +S:1_IN_8 S:SHRIEK D:Dog-like carnivore of woodland and farmland, distinctive for D:its red-orange coats and its eerie plaintive cries. @@ -2428,9 +3715,11 @@ W:9:1:250:2 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d4 -F:RAND_25 | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:IM_POIS +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is a rodent of unusual size. @@ -2443,8 +3732,16 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:HURT:1d3 -F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:RAND_25 | ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO D:A woman's face on the body of a vicious black bird. # New monster added by furiosity for the Theme module @@ -2455,8 +3752,13 @@ W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:RAND_50 | RAND_25 | EVIL | -F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:EVIL +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:SHRIEK D:An evil swarm of bloodsucking flies. They are grey, brown and black D:insects, together in a homogeneous mass. They are loud, hateful and @@ -2472,12 +3774,27 @@ E:1:1:1:2:1:1 O:25:20:25:20 B:BITE:POISON:5d5 B:BITE:POISON:5d5 -F:MALE | CAN_SWIM | IM_POIS | IM_ACID | AQUATIC | -F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | EVIL | MORTAL | BASEANGBAND -F:WILD_TOO | WILD_OCEAN | WILD_SHORE | +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_TOO S:1_IN_8 -S:BA_POIS | SCARE | HOLD +S:BA_POIS +S:HOLD +S:SCARE D:A sea-serpent of Elvish legend. N:160:Cave bear @@ -2489,9 +3806,16 @@ O:0:0:0:0 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 -F:BASH_DOOR | FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ANIMAL | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large bear appears to have made its home in this cave. It is hungry, D:and you are trespassing in its territory. @@ -2503,8 +3827,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:WEIRD_MIND | BASH_DOOR | KILL_WALL | KILL_ITEM | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:KILL_ITEM +F:KILL_WALL +F:MORTAL +F:WEIRD_MIND D:Despite its unimpressive size, this mole creature has fangs powerful D:enough to bore through solid rock. @@ -2516,12 +3846,26 @@ E:1:1:1:2:1:1 O:30:40:30:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:MALE | -F:FORCE_SLEEP | DROP_90 | WILD_TOO | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:CONF | BLIND | HOLD | SLOW | MIND_BLAST | S_MONSTER | BLINK +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:HOLD +S:MIND_BLAST +S:SLOW +S:S_MONSTER D:A master of the mental arts, able to damage or dominate the D:minds of others. @@ -2534,11 +3878,24 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | HAS_EGG | IMPRESED | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_ELEC +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_ELEC D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a pale blue. @@ -2552,12 +3909,24 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | ATTR_MULTI -F:EVIL | DRAGON | IM_COLD | SUSCEP_FIRE | HAS_EGG | IMPRESED | BASEANGBAND F:ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_COLD +F:ONLY_GOLD +F:OPEN_DOOR +F:SUSCEP_FIRE +S:1_IN_12 S:BR_COLD D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a pale white. @@ -2571,11 +3940,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:EVIL | DRAGON | IM_POIS | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_POIS +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_POIS D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a sickly green. @@ -2589,11 +3970,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:IM_ACID +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_ACID D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a dull black. @@ -2607,12 +4000,25 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_11 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_FIRE +F:ONLY_GOLD +F:OPEN_DOOR +F:SUSCEP_COLD +S:1_IN_11 S:BR_FIRE D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a pale red. @@ -2625,8 +4031,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:STING:LOSE_STR:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is large and has venomous mandibles. N:169:Brodda, the Easterling @@ -2639,11 +4051,22 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 -F:UNIQUE | MALE | EVIL -F:FORCE_MAXHP | CAN_SPEAK | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_TOO D:A nasty piece of work, Brodda picks on defenceless women and children. # New monster added for the Theme module @@ -2657,9 +4080,22 @@ O:10:90:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND | UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | -F:CAN_SPEAK | DROP_CORPSE | WILD_TOO | OPEN_DOOR | BASH_DOOR | -F:HURT_LITE | ONLY_ITEM | DROP_1D2 | DROP_GOOD | ESCORT | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE +F:WILD_TOO D:Strong and powerful, for a goblin. N:171:King cobra @@ -2670,8 +4106,18 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:SPIT:BLIND:1d2 B:BITE:POISON:3d4 -F:RAND_50 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | CAN_SWIM | ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_TOO +F:WILD_WOOD D:It is a large snake with a hooded face. N:172:Eagle @@ -2683,8 +4129,20 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d6 -F:ANIMAL | CAN_FLY | WILD_ONLY | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD | -F:DROP_CORPSE | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | IMPRESED | HAS_EGG | AQUATIC +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_WASTE +F:WILD_WOOD D:A magnificent huge predatory bird. N:173:War bear @@ -2696,9 +4154,14 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:WEIRD_MIND D:A bear with tusks, trained to kill. N:174:Killer bee @@ -2709,8 +4172,13 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:STING:POISON:1d4 B:STING:LOSE_STR:1d4 -F:WEIRD_MIND | FRIENDS | CAN_FLY | WILD_TOO | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:FRIENDS +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is poisonous and aggressive. N:175:Giant spider @@ -2723,9 +4191,15 @@ B:BITE:HURT:1d10 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:HURT:1d10 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | -F:ANIMAL | SPIDER | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO D:It is a large spider whose bulbous body is bloated with poison. N:176:Giant white tick @@ -2735,9 +4209,13 @@ W:10:2:200:27 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:It is moving slowly towards you. # New monster added for the Theme module @@ -2752,11 +4230,25 @@ B:TOUCH:EAT_FOOD B:TOUCH:EAT_ITEM B:BEG:EAT_GOLD B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_MAXHP | FORCE_DEPTH | WILD_TOWN | WILD_ONLY | -F:OPEN_DOOR | BASH_DOOR | DROP_GOOD | -F:RAND_25 | DROP_60 | DROP_2D2 | DROP_GREAT | ONLY_ITEM | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_DEPTH +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:An obscenely lucky and very stealthy Halfling. You have an intense D:desire to kill this creature. @@ -2768,13 +4260,25 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | CONF | MISSILE | DARKNESS | BA_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BA_POIS +S:BLIND +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven figure, dressed all in black, hurling spells at you. # New monster added for the Theme module @@ -2787,10 +4291,14 @@ B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 +F:BASH_DOOR +F:DROP_1D2 +F:DROP_GOOD +F:FORCE_SLEEP +F:FRIENDS F:MALE -F:FORCE_SLEEP | FRIENDS -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD -F:OPEN_DOOR | BASH_DOOR +F:ONLY_ITEM +F:OPEN_DOOR D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to D:snare them. Now they act as slavemasters in his mines. @@ -2801,10 +4309,13 @@ G:k:w I:110:2d100:25:120:1 W:22:1:0:175 B:HIT:SHATTER:6d6 -F:MALE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD -F:OPEN_DOOR | BASH_DOOR +F:BASH_DOOR +F:DROP_1D2 +F:DROP_GOOD F:EVIL +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to D:snare them. This smith has been forging blades for the Orcs. @@ -2818,13 +4329,23 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:MALE | EVIL -F:FORCE_SLEEP | FORCE_MAXHP -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD -F:OPEN_DOOR | BASH_DOOR -F:IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP -S:1_IN_8 -S:HEAL | BO_FIRE | BO_ACID +F:BASH_DOOR +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_8 +S:BO_ACID +S:BO_FIRE +S:HEAL D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to D:snare them. This is a lord among the dark dwarves. @@ -2839,18 +4360,32 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | BLIND | CONF | CAUSE_2 | DARKNESS | MISSILE -D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to -D:snare them. This priest serves Melkor unquestioningly, and today it is your -D:turn to die. - -N:183:Dark elven warrior +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_5 +S:BLIND +S:CAUSE_2 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE +D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to +D:snare them. This priest serves Melkor unquestioningly, and today it is your +D:turn to die. + +N:183:Dark elven warrior G:h:u I:110:10d11:20:16:20 W:10:1:1400:50 @@ -2858,10 +4393,16 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:HURT_LITE +F:MALE +F:OPEN_DOOR S:1_IN_12 S:MISSILE D:A dark elven figure in armour, ready with his sword. @@ -2873,10 +4414,18 @@ W:10:2:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d1 -F:ATTR_CLEAR | -F:NEVER_MOVE | INVISIBLE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:INVISIBLE +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID S:MULTIPLY D:Yum! It smells quite tasty. If you could only see it. @@ -2887,11 +4436,18 @@ W:10:2:60:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d1 -F:NEVER_MOVE | COLD_BLOOD | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_5 | ARROW_1 +F:COLD_BLOOD +F:EMPTY_MIND +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_5 +S:ARROW_1 +S:MULTIPLY D:What looks like the remains of a quiver dropped by a past adventurer D:has become overgrown with a strange mold intent on using the contents D:of the quiver to grab prey. @@ -2906,13 +4462,26 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d13 B:HIT:HURT:1d11 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | WILD_TOO | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE +F:WILD_TOO D:He is a cunning and devious orc. Short and broad, he has crooked D:legs and arms that hang almost to the ground. @@ -2925,9 +4494,17 @@ O:0:0:0:0 B:BITE:TERRIFY:1d3 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:The beating of its wings produces a strangely unnerving noise. N:188:Owlbear @@ -2939,8 +4516,13 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:CRUSH:HURT:1d10 -F:EVIL | ANIMAL | OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:OPEN_DOOR D:A bizarre bear with the claws and the face of an owl. # New monster added by furiosity for the Theme module @@ -2951,8 +4533,15 @@ W:1:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 -F:BASEANGBAND | EMPTY_MIND | STUPID | ATTR_CLEAR | -F:UNDEAD | RAND_50 | CAN_SWIM | INVISIBLE | EVIL | +F:ATTR_CLEAR +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:INVISIBLE +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. N:190:Hairy mold @@ -2962,10 +4551,16 @@ W:10:1:50:32 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d3 -F:NEVER_MOVE | CAN_SWIM | -F:STUPID | EMPTY_MIND | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange hairy growth on the dungeon floor. N:191:Grizzly bear @@ -2978,9 +4573,14 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d12 B:CRUSH:HURT:1d10 -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | BASH_DOOR | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A huge, beastly bear, more savage than most of its kind. N:192:Disenchanter mold @@ -2990,11 +4590,19 @@ W:10:1:40:40 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:UN_BONUS:1d6 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | RES_DISE | -F:IM_POIS | ATTR_MULTI | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_11 | +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_DISE +F:STUPID +S:1_IN_11 S:DRAIN_MANA D:It is a strange glowing growth on the dungeon floor. @@ -3007,11 +4615,23 @@ O:50:50:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:DROP_60 | BASH_DOOR | HAS_EGG | -F:EVIL | DRAGON | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_11 | -S:CONF | SCARE | BR_LITE | BR_DARK +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +S:1_IN_11 +S:BR_DARK +S:BR_LITE +S:CONF +S:SCARE D:A small relative of the dragon that inhabits dark caves. N:194:Limrog @@ -3021,10 +4641,20 @@ W:10:1:600:40 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | RES_TELE | CAN_FLY | BASEANGBAND -S:1_IN_3 | -S:BLINK | TELE_TO | TELE_AWAY | TPORT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:EVIL +F:IM_FIRE +F:NO_FEAR +F:OPEN_DOOR +F:RES_TELE +S:1_IN_3 +S:BLINK +S:TELE_AWAY +S:TELE_TO +S:TPORT D:It is a fast-moving demon that blinks quickly in and out of existence; no D:other demon matches its teleporting mastery. It resembles a fish - Limroeg D:are actually fish that were corrupted by Morgoth. @@ -3037,9 +4667,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:ONLY_GOLD | DROP_90 | DROP_1D2 | -F:COLD_BLOOD | BASH_DOOR | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_90 +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of gold coins, until it starts crawling towards you D:on tiny legs. @@ -3050,10 +4688,17 @@ W:10:1:600:30 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:RAND_25 | FRIENDS | -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_WASTE | WILD_MOUNTAIN | -F:ANIMAL | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FRIENDS +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD D:It howls and snaps at you. N:197:Giant fruit fly @@ -3063,8 +4708,13 @@ W:10:3:100:4 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:A fast-breeding, annoying pest. @@ -3076,8 +4726,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 -F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A large black cat, stalking you with intent. It thinks you're its next D:meal. @@ -3089,11 +4746,16 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_ITEM -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | DROP_SKELETON | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:He is eyeing your backpack. # New monster added by furiosity for the Theme module @@ -3104,8 +4766,13 @@ W:3:1:0:5 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:2d4 -F:BASEANGBAND | EMPTY_MIND | STUPID | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It is D:especially aggressive. @@ -3117,8 +4784,14 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:2d4 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It is D:surrounded by a foul stench. @@ -3130,8 +4803,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:1d6 B:TOUCH:LOSE_CON:1d6 -F:UNDEAD | EMPTY_MIND | NO_CONF | NO_SLEEP | IM_POIS | IM_COLD | NO_FEAR | -F:HURT_LITE | COLD_BLOOD | EVIL | NEVER_MOVE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:MULTIPLY D:A sickening mound of decaying flesh, bones, hands and other body parts. D:It seems to be growing. @@ -3144,8 +4828,14 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:2d4 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. Its form seems D:infused with blood, surely that of its victims. @@ -3158,15 +4848,33 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:ATTR_MULTI | -F:FORCE_MAXHP | FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | CAN_FLY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HAS_EGG | IMPRESED | -F:BASEANGBAND | HAS_LITE -S:1_IN_12 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales shimmering with a hint of colour. @@ -3179,8 +4887,14 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:2d4 B:TOUCH:CONFUSE:3d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It is D:surrounded by a foul stench and an aura of mystery. @@ -3193,12 +4907,27 @@ O:0:50:50:0 B:TOUCH:PARALYZE:1d14 B:TOUCH:PARALYZE:1d14 B:CRUSH:HURT:2d12 -F:ANIMAL | NEVER_MOVE | COLD_BLOOD | DROP_RANDART -F:EMPTY_MIND | UNIQUE | FORCE_MAXHP | FORCE_SLEEP | -F:RES_WATE | IM_POIS | IM_ACID | SUSCEP_FIRE | SPECIAL_GENE | -F:DROP_1D2 | DROP_GOOD | ONLY_ITEM | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:TELE_TO | HOLD | +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_GOOD +F:DROP_RANDART +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CUT +F:ONLY_ITEM +F:RES_WATE +F:SPECIAL_GENE +F:SUSCEP_FIRE +F:UNIQUE +S:1_IN_10 +S:HOLD +S:TELE_TO D:The ancient grey willow tree, ruler of the Old Forest. He despises D:trespassers in his territory. "...a huge willow-tree, old and hoary. D:Enormous it looked, its sprawling branches going up like racing arms @@ -3213,8 +4942,15 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ELEC:3d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | IM_ELEC | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_ELEC +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It is D:surrounded by a barely noticeable aura of sparks. @@ -3227,10 +4963,20 @@ O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is a shambling orcish corpse leaving behind a trail of flesh. N:209:Hippogryph @@ -3241,8 +4987,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:HIT:HURT:2d5 B:BITE:HURT:2d5 -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_GRASS | -F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO D:A strange hybrid of eagle and horse. N:210:Black mamba @@ -3252,10 +5005,19 @@ W:12:3:300:40 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:4d4 -F:RAND_50 | BASH_DOOR | CAN_SWIM | -F:WILD_TOO | WILD_WOOD | WILD_GRASS | -F:ANIMAL | IM_POIS | DROP_SKELETON | DROP_CORPSE | HAS_EGG | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_POIS +F:MORTAL +F:RAND_50 +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:It has glistening black skin, a sleek body, and highly venomous fangs. N:211:White wolf @@ -3266,11 +5028,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d4 -F:RAND_25 | -F:FRIENDS | SUSCEP_FIRE | -F:BASH_DOOR | WILD_TOO | WILD_WASTE | -F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:IM_COLD +F:MORTAL +F:RAND_25 +F:SUSCEP_FIRE +F:WILD_TOO +F:WILD_WASTE D:A large and muscled wolf from the northern wastes. Its breath is cold and D:icy and its fur is coated with frost. @@ -3281,11 +5050,18 @@ W:12:3:2600:60 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_11 | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_11 S:DRAIN_MANA D:Yum! It looks quite tasty. It is a pulsing mound of glowing flesh. @@ -3296,9 +5072,17 @@ W:12:4:200:6 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:RAND_50 | RAND_25 | CAN_SWIM | -F:STUPID | WEIRD_MIND | BASH_DOOR | -F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:HURT_LITE +F:NO_CUT +F:NO_FEAR +F:RAND_25 +F:RAND_50 +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a disgusting mass of dark worms, eating each other, the floor, D:the air, you... @@ -3311,8 +5095,15 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_CHR:3d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NO_CUT +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It seems to D:be rising straight from the earth to get you. @@ -3326,13 +5117,29 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:UNIQUE | MALE | -F:FORCE_MAXHP | WILD_TOO | SPECIAL_GENE | -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | -F:EVIL | ORC | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE +F:WILD_TOO D:A leader of a band of raiding orcs from the Misty Mountains D:He's been known to pick on Shire-folk. @@ -3344,10 +5151,16 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:MALE | WILD_TOO | -F:DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO D:A warrior of considerable skill. # New monster added by furiosity for the Theme module @@ -3360,8 +5173,16 @@ O:0:0:0:0 B:TOUCH:HURT:3d5 B:TOUCH:SHATTER:1d1 # Yes, I'm nasty. :P -furiosity -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT | NO_STUN | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NO_CUT +F:NO_STUN +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It seems to D:be coming from the walls. @@ -3374,11 +5195,23 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:NO_CONF +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_CONF D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a dull bronze. @@ -3392,12 +5225,24 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_12 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_12 S:BR_SOUN D:This newly-born dragon is still soft, its eyes unaccustomed to light and D:its scales a pale gold. @@ -3410,10 +5255,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:EXP_10 B:GAZE:EXP_10 -F:NEVER_MOVE | EVIL | CAN_FLY | DROP_CORPSE | -F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:HOLD | TELE_TO +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:HURT_LITE +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 +S:HOLD +S:TELE_TO D:A huge disembodied eye. As you stare into the black nothingness of its pupil, D:you feel your will and vitality draining away, and are unable to do anything D:except approach it in horrified fascination. @@ -3426,8 +5278,15 @@ W:15:5:0:20 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:3d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NO_CUT +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It seems to D:be surrounded with a strange aura of dark light. @@ -3439,8 +5298,15 @@ W:20:5:0:30 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:4d4 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NO_CUT +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It glows D:an eerily unnatural pink colour. @@ -3453,8 +5319,15 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:5d5 B:TOUCH:LOSE_DEX:5d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | CAN_FLY | +F:BASEANGBAND +F:CAN_FLY +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It prefers D:to dwell in the trees and is rather stealthy. @@ -3467,8 +5340,15 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:6d6 B:TOUCH:BLIND:6d6 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | IM_ELEC | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_ELEC +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. It seems to D:be materializing out of thin air. @@ -3480,13 +5360,22 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MALE | GOOD | -F:FORCE_SLEEP | -F:DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | SCARE | CAUSE_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:CAUSE_2 +S:HEAL +S:SCARE S:S_MONSTER D:A robed man dedicated to his Vala. He believes you to be a D:servant of the Shadow. @@ -3499,13 +5388,26 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:1d9 B:HIT:HURT:1d10 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | BLIND | CONF | CAUSE_2 | DARKNESS | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_5 +S:BLIND +S:CAUSE_2 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE D:A dark elven figure, dressed all in black, chanting curses and waiting to D:deliver your soul to the Void. @@ -3516,10 +5418,21 @@ W:12:2:0:40 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d3 -F:RAND_50 | RAND_25 | IM_ELEC | IM_POIS | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | BASH_DOOR | -F:IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ELEC +F:IM_POIS +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 D:A whirlwind of sentient air. N:228:Skeleton human @@ -3529,9 +5442,19 @@ W:12:1:1500:38 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is an animated human skeleton. N:229:Zombified human @@ -3542,9 +5465,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:It is a shambling human corpse dropping chunks of flesh behind it. N:230:Tiger @@ -3556,9 +5489,16 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:One of the largest of its species, a sleek orange and black shape creeps D:towards you, ready to pounce. @@ -3570,12 +5510,24 @@ E:0:0:0:0:0:0 O:45:15:25:0 B:WAIL:TERRIFY B:TOUCH:LOSE_DEX:1d8 -F:FORCE_SLEEP | RAND_25 | -F:DROP_60 | DROP_90 | CAN_FLY | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:TPORT | SCARE +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:UNDEAD +S:1_IN_15 +S:SCARE +S:TPORT D:A ghostly apparition that shrieks horribly. # New monster added by furiosity for the Theme module @@ -3588,8 +5540,14 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:3d5 B:TOUCH:PARASITE:6d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:RAND_50 +F:STUPID +F:UNDEAD D:An evil cannibal spirit from the marshlands. Foul stench D:of decay surrounds it, and you are afraid to let it get D:near you. @@ -3603,10 +5561,19 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:IM_ACID | IM_POIS | HURT_LITE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:A strange pile of flesh, covered in discoloured blotches. N:234:Drider @@ -3618,12 +5585,20 @@ O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:POISON:1d6 -F:FORCE_SLEEP | -F:BASH_DOOR | DROP_SKELETON | -F:EVIL | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:CONF | CAUSE_1 | DARKNESS | MISSILE | ARROW_2 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MORTAL +S:1_IN_8 +S:ARROW_2 +S:CAUSE_1 +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven torso merged with the bloated form of a giant spider. N:235:Mongbat @@ -3635,9 +5610,18 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:POISON:1d8 -F:ANIMAL | EVIL | FRIENDS | CAN_FLY | FORCE_MAXHP | -F:IM_COLD | IM_ELEC | IM_POIS | WEIRD_MIND | DROP_CORPSE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:They say it is notoriously difficult to kill. N:236:Killer brown beetle @@ -3647,8 +5631,13 @@ W:13:1:500:38 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND D:It is a vicious insect with a tough carapace. # New monster added by furiosity for the Theme module @@ -3663,13 +5652,31 @@ B:TOUCH:EXP_20:7d5 B:TOUCH:DISEASE:7d5 B:TOUCH:PARASITE:14d10 B:TOUCH:LOSE_ALL:7d5 -F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_FEAR | -F:FORCE_MAXHP | KILL_ITEM | KILL_BODY | NO_CONF | -F:NO_SLEEP | NO_CUT | NO_STUN | REGENERATE | IM_COLD | -F:RES_NETH | RES_PLAS | RES_WATE | RES_DISE | RES_NEXU | +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RAND_50 +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:STUPID +F:UNDEAD S:1_IN_5 -S:ANIM_DEAD | +S:ANIM_DEAD D:An evil cannibal spirit from the marshlands. It has been given D:additional power by necromantic magic, making it nearly invulnerable. # Wow, a dangerous icky thing :P @@ -3681,11 +5688,19 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:FRIENDS | -F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A hideous, smallish giant that is often found near or with orcs. N:239:Creeping mithril coins @@ -3696,9 +5711,19 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:ONLY_GOLD | DROP_90 | DROP_2D2 | -F:COLD_BLOOD | BASH_DOOR | IM_ACID | CHAR_MULTI | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of sentient mithril coins that doesn't like being D:picked up. @@ -3709,12 +5734,27 @@ W:13:2:1500:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d2 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | BLINK | TPORT | BLIND | HOLD | SLOW | CONF | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:HASTE +S:HOLD +S:SLOW +S:TPORT D:A deceptive spellcaster. N:241:Druid @@ -3725,33 +5765,74 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:MALE | WILD_TOO | WILD_WOOD | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:SMART | OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | BLINK | BLIND | HOLD | SLOW | BO_FIRE | BO_ELEC | S_ANIMAL -D:A priest devoted to Yavanna Kementari. He thinks you want to -D:destroy the forests of Arda. - -# New monster added by furiosity for the Theme module -# A Black Numenorean (hell knight) on steroids -N:242:Fuinur, Lord of the Haradrim -G:p:r +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +F:WILD_TOO +F:WILD_WOOD +S:1_IN_3 +S:BLIND +S:BLINK +S:BO_ELEC +S:BO_FIRE +S:HASTE +S:HOLD +S:SLOW +S:S_ANIMAL +D:A priest devoted to Yavanna Kementari. He thinks you want to +D:destroy the forests of Arda. + +# New monster added by furiosity for the Theme module +# A Black Numenorean (hell knight) on steroids +N:242:Fuinur, Lord of the Haradrim +G:p:r I:140:80d100:50:300:0 W:90:1:0:150000 E:1:1:1:2:1:1 O:0:40:60:0 B:HIT:HURT:20d5 B:HIT:EXP_80:20d5 -F:UNIQUE | MALE | MORTAL | BASEANGBAND | HAS_LITE | -F:FORCE_MAXHP | SMART | IM_FIRE | IM_ELEC | IM_POIS | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GREAT | -F:RES_NETH | RES_NEXU | RES_PLAS | RES_WATE | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | EVIL | SPECIAL_GENE | -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_4 | BA_NETH | BA_FIRE | BO_PLAS -S:S_HI_DEMON | S_HI_UNDEAD | HASTE | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_5 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:CAUSE_4 +S:HASTE +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD D:A Man of Numenor who fell under the influence of Sauron during the time D:the Dark Lord dwelt on that island. He sailed east to Middle-earth, with D:a companion named Herumor, and settled in the southern region of Harad. @@ -3767,10 +5848,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:5d5 B:HIT:TERRIFY:5d5 -F:NEVER_MOVE | NO_FEAR | -F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP | -F:DROP_90 | IM_COLD | FORCE_MAXHP | IM_ELEC | IM_POIS | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It resembles a normal cloak until some poor fool ventures too close. N:244:Black orc @@ -3781,11 +5873,20 @@ E:1:1:1:2:1:1 O:10:50:20:15 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:MALE | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO S:1_IN_9 S:ARROW_2 D:He is a large orc with powerful arms and deep black skin. @@ -3799,10 +5900,20 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A fast moving highly acidic pile of flesh. It is D:eating away the floor it rests on. @@ -3813,9 +5924,14 @@ W:14:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | MORTAL | JOKEANGBAND +F:ANIMAL +F:BASH_DOOR +F:CAN_FLY +F:JOKEANGBAND +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:Oh no! They are everywhere! @@ -3827,10 +5943,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP D:A strange creature that merges with the dungeon floor, trapping its D:victims by enveloping them within its perfectly disguised form. @@ -3842,10 +5966,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE B:HIT:PARALYZE -F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS | -F:KILL_TREES | SUSCEP_FIRE | ANIMAL | -F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS | -F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:FORCE_SLEEP +F:FRIENDS +F:KILL_TREES +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:A mass of vegetation. As you pass near it, it reaches out tendrils to D:ensnare you. You can just make out skeletons of its previous victims D:deep within the thickets. @@ -3860,13 +5999,32 @@ O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:UNIQUE | MALE | FORCE_MAXHP | GOOD | CAN_SPEAK | -F:SMART | PET | HAS_LITE | OPEN_DOOR | BASH_DOOR | -F:DROP_CORPSE | DROP_SKELETON | MORTAL | CAN_SWIM | -F:RES_WATE | RES_NETH | IM_COLD | IM_ACID | IM_POIS | -S:1_IN_2 | -S:ARROW_4 | S_KIN | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:RES_NETH +F:RES_WATE +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD +S:1_IN_2 +S:ARROW_4 +S:S_KIN D:A fair Elf in a travel cloak, wielding a longbow and short sword. D:Stately and graceful, he rides his steed Asfaloth with great speed. D:It is rumoured that he is none other but Glorfindel of Gondolin, who @@ -3880,12 +6038,19 @@ W:14:2:150:60 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:1d6 -F:FORCE_SLEEP | WILD_TOO | WILD_WASTE | -F:RAND_50 | CAN_FLY | SUSCEP_FIRE | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_COLD | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_COLD +F:MORTAL +F:RAND_50 +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WASTE +S:1_IN_10 S:BR_COLD D:It is a large dragonfly that drips frost. @@ -3897,11 +6062,17 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:EXPLODE:HURT:20d2 -F:MALE | -F:WILD_TOO | SUSCEP_FIRE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | HURT_LITE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:HURT_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:SUSCEP_FIRE +F:WILD_TOO D:He is one of the many weaker 'slave' orcs, often mistakenly called a D:goblin. He is equipped with an explosive charge. @@ -3917,11 +6088,23 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | OPEN_DOOR | BASH_DOOR | UNIQUE | -F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET | -F:IM_ACID | IM_COLD | RES_WATE | RES_NETH | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:RES_NETH +F:RES_WATE +F:SMART +F:UNIQUE +S:1_IN_5 S:S_KIN D:The eldest son of Finarfin and brother to Galadriel, who founded D:Minas Tirith in the Pass of Sirion, and delved his citadel at @@ -3937,11 +6120,19 @@ W:14:4:2600:20 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d4 -F:NEVER_MOVE | EVIL | CAN_SWIM | -F:IM_POIS | EMPTY_MIND | NO_FEAR | BASEANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_7 | -S:SCARE | CONF | BR_LITE +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:NEVER_MOVE +F:NO_CUT +F:NO_FEAR +S:1_IN_7 +S:BR_LITE +S:CONF +S:MULTIPLY +S:SCARE D:A chaotic mass of pulsating flesh, mouths and eyes. # New monster added by furiosity for the Theme module @@ -3955,10 +6146,26 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_4 | HASTE | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_4 +S:HASTE +S:SCARE D:The eldest of the Seven Sons of Feanor, and considered to be their D:leader. In Valinor he swore the Oath of Feanor, and followed his D:father back to Middle-earth. After Feanor's death, Morgoth captured @@ -3974,10 +6181,19 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:DROP_60 | WILD_TOO | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO D:A ten-foot-tall humanoid with powerful muscles. N:256:Flesh golem @@ -3988,10 +6204,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:EMPTY_MIND | BASH_DOOR | CAN_SWIM | -F:IM_ELEC | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:A shambling humanoid monster with long scars. N:257:Warg @@ -4002,9 +6226,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:RAND_25 | BASH_DOOR | FRIENDS | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:MORTAL +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It is a large wolf with eyes full of cunning. If you see D:one, it usually means orcs are nearby. @@ -4016,11 +6249,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_FOOD -F:DROP_60 | ONLY_GOLD | RAND_50 | OPEN_DOOR | MALE | -F:GOOD | MORTAL | BASEANGBAND | PET -S:MULTIPLY | -S:1_IN_6 | +F:BASEANGBAND +F:DROP_60 +F:GOOD +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:RAND_50 +S:1_IN_6 S:BLINK +S:MULTIPLY D:A merry little gnome. N:259:Giant flea @@ -4030,8 +6270,12 @@ W:14:3:90:3 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:Just looking at it makes you itchy all over. @@ -4045,13 +6289,25 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A strong orc guarding the pass of Cirith Ungol. He is mortally afraid of D:spiders: he was captured by Shelob once, but escaped when she forgot D:completely about him. @@ -4064,10 +6320,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is a massive animated statue made out of hardened clay. N:262:Black ogre @@ -4078,11 +6343,19 @@ E:1:1:1:2:1:1 O:0:70:0:15 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:RAND_25 | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:WILD_MOUNTAIN +F:WILD_TOO D:A massive orc-like figure with black skin and powerful arms. # New monster added by furiosity for the Theme module @@ -4096,11 +6369,30 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:HEAL | SCARE | CAUSE_2 | HOLD | CONF | S_ANIMALS | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:CAUSE_2 +S:CONF +S:HEAL +S:HOLD +S:SCARE +S:S_ANIMALS D:The second son of Feanor, who inherited more of his mother Nerdanel's D:gentle spirit than any of his brothers. Maglor was famed as a poet and D:bard, but he took the Oath of Feanor in Tirion and shared in the woes @@ -4114,10 +6406,19 @@ E:1:1:1:2:1:1 O:30:30:30:5 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:MALE | WILD_TOO | -F:FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +F:WILD_TOO D:He is a hideous deformed cross-breed with man and orc, combining man's D:strength and cunning with orcish evil. The Dunlendings fighting on D:Saruman's side were first noted to mix their blood with the orcs. @@ -4130,12 +6431,27 @@ E:0:0:0:0:1:0 O:0:0:80:20 B:STING:HURT:1d10 B:BITE:HURT:1d10 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_1D2 | IM_POIS | IM_COLD | RES_WATE | -F:OPEN_DOOR | BASH_DOOR | EMPTY_MIND | CAN_SWIM | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EMPTY_MIND +F:EVIL +F:FEMALE +F:IM_COLD +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:RES_WATE S:1_IN_8 -S:HOLD | CONF | BO_COLD | HEAL | DARKNESS +S:BO_COLD +S:CONF +S:DARKNESS +S:HEAL +S:HOLD D:A giant snake-like figure with a woman's torso, talented in magic. N:266:Poison ivy @@ -4146,10 +6462,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:POISON:2d2 B:HIT:POISON:2d2 -F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS | -F:KILL_TREES | SUSCEP_FIRE | ANIMAL | -F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS | -F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:FORCE_SLEEP +F:FRIENDS +F:KILL_TREES +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD S:MULTIPLY D:A mass of vegetation. It seems to be growing. @@ -4163,11 +6494,21 @@ B:SPORE:CONFUSE B:SPORE:CONFUSE B:SPORE:HALLU B:SPORE:HALLU -F:FORCE_SLEEP | NEVER_MOVE | -F:STUPID | RES_TELE | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BLINK | SLOW | SCARE | DARKNESS +F:BASEANGBAND +F:CAN_SWIM +F:FORCE_SLEEP +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:STUPID +S:1_IN_2 +S:BLINK +S:DARKNESS +S:SCARE +S:SLOW D:Yum! It looks quite tasty. It seems to glow with an unusual light. # New monster added by furiosity for the Theme module @@ -4181,11 +6522,30 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:S_MONSTER | S_ANIMAL | S_KIN | S_MONSTERS | S_ANIMALS | S_KIN | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:S_ANIMAL +S:S_ANIMALS +S:S_KIN +S:S_KIN +S:S_MONSTER +S:S_MONSTERS D:Celegorm the Fair was the third of the seven sons of Feanor. D:The most ambitious of the seven, he followed the oath of his father D:with the greatest ardour. He searches forever for the Silmarils. @@ -4199,11 +6559,17 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_1D2 | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE F:EVIL -F:MORTAL | BASEANGBAND +F:FEMALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 D:A giant snake-like figure with a woman's torso. N:270:Wererat @@ -4215,13 +6581,22 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_60 | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL -F:MORTAL | BASEANGBAND -S:1_IN_9 | -S:BLINK | CAUSE_2 | BO_COLD | BA_POIS | S_KIN +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +S:1_IN_9 +S:BA_POIS +S:BLINK +S:BO_COLD +S:CAUSE_2 +S:S_KIN D:A large rat with glowing red eyes, which can also assume human form. D:It is a disgusting creature, relishing in filth and disease. @@ -4234,11 +6609,15 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:FORCE_SLEEP | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MORTAL +S:1_IN_5 S:BR_LITE D:A brilliant canine form whose light hurts your eyes, even at this distance. @@ -4251,11 +6630,15 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:FORCE_SLEEP | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | HURT_LITE | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:MORTAL +S:1_IN_5 S:BR_DARK D:A hole in the air in the shape of a huge hound. No light falls upon its D:form. @@ -4268,9 +6651,21 @@ E:0:0:0:0:1:0 O:90:0:10:0 B:BITE:POISON:1d3 B:BITE:LOSE_STR:1d4 -F:UNDEAD | EVIL | IM_POIS | IM_COLD | WEIRD_MIND | NO_FEAR | CAN_FLY | -F:NO_CONF | NO_SLEEP | DROP_60 | BASH_DOOR | FRIENDS | COLD_BLOOD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD +F:WEIRD_MIND D:A skull animated by necromantic spells. You'll seldom catch one alone. # New monster added by furiosity for the Theme module @@ -4284,11 +6679,27 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EAT_ITEM:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:TRAPS | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:CONF +S:SCARE +S:TRAPS D:The fourth son of Feanor, who turned on his own kind because of the D:Oath of his father. He searches forever for the Silmarils of Feanor. @@ -4301,9 +6712,15 @@ O:0:0:0:0 B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | SPIDER | IM_POIS | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO D:A giant spider with hairy black and red legs. # New monster added by furiosity for the Theme module @@ -4317,11 +6734,29 @@ B:HIT:HURT:10d10 B:HIT:EAT_ITEM:10d10 B:HIT:EAT_ITEM:10d10 B:HIT:EAT_ITEM:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:TELE_TO | TELE_AWAY | TPORT | BLINK | TRAPS | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:BLINK +S:TELE_AWAY +S:TELE_TO +S:TPORT +S:TRAPS D:The fifth son of Feanor, closely associated with his elder D:brother Celegorm. Bound by the Oath of Feanor, he searches D:forever for the Silmarils. @@ -4335,10 +6770,19 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:FRIENDS | WILD_TOO | WILD_WOOD | -F:WEIRD_MIND | BASH_DOOR | HURT_LITE | -F:ANIMAL | SPIDER | EVIL | IM_POIS | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD D:A strong and powerful spider from Mirkwood forest. Cunning and evil, it D:seeks to taste your juicy insides. @@ -4350,10 +6794,23 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:COLD:5d8 B:HIT:COLD:5d8 -F:DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | MALE | AURA_COLD | SUSCEP_FIRE | -F:IM_COLD | BASEANGBAND | HAS_LITE | MORTAL +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE D:A twelve-foot-tall giant covered in furs. N:279:Griffon @@ -4364,8 +6821,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:HIT:HURT:3d4 B:BITE:HURT:2d6 -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | -F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:It is half lion, half eagle. It flies menacingly towards you. N:280:Aewrog @@ -4376,9 +6841,17 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:PARALYZE:1d2 B:HIT:HURT:1d10 -F:OPEN_DOOR | BASH_DOOR | NONLIVING | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND | HAS_LITE -S:1_IN_50 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:EVIL +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_FEAR +F:OPEN_DOOR +S:1_IN_50 S:BR_NETH D:A minor demonic servant of evil. It resembles a bird - in fact, D:the Aewroeg are the result of the corruption of smaller birds by Morgoth. @@ -4390,12 +6863,21 @@ W:15:2:900:40 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLINK | DARKNESS | BO_COLD | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_4 +S:BLINK +S:BO_COLD +S:DARKNESS S:S_MONSTER D:A mage of short stature. @@ -4408,10 +6890,15 @@ O:0:0:0:0 B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 -F:ATTR_CLEAR | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:INVISIBLE | BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:ATTR_CLEAR +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:INVISIBLE +F:MORTAL D:A faint sense of motion in the air, hound-shaped, stands before you. N:283:Umber hulk @@ -4424,11 +6911,19 @@ B:GAZE:CONFUSE B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:2d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. @@ -4442,10 +6937,15 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:STUPID | WEIRD_MIND | KILL_ITEM | -F:IM_ACID | IM_POIS | DROP_CORPSE | -F:NO_CONF | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:KILL_ITEM +F:MORTAL +F:NO_CONF +F:STUPID +F:WEIRD_MIND D:It is a weird, small animal with two antennae popping forth from D:its forehead. It looks hungry. @@ -4457,10 +6957,17 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:2d10 B:HIT:HURT:2d10 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | ORC | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:ORC D:An unnatural hybrid of ogre and orc. N:286:Gelatinous cube @@ -4472,12 +6979,26 @@ O:40:30:20:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | -F:DROP_1D2 | DROP_4D2 | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:It is a strange, vast gelatinous structure that assumes cubic proportions D:as it lines all four walls of the corridors it patrols. Through its D:transparent jelly structure you can see treasures it has engulfed, and a @@ -4490,11 +7011,19 @@ W:16:2:150:65 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | WILD_TOO | WILD_SWAMP | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_POIS D:A large, foul-smelling dragonfly. @@ -4506,10 +7035,22 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:FIRE:6d8 B:HIT:FIRE:6d8 -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_VOLCANO | SUSCEP_COLD | -F:EVIL | GIANT | MALE | AURA_FIRE | DROP_SKELETON | DROP_CORPSE | -F:IM_FIRE | BASEANGBAND | HAS_LITE | MORTAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A glowing fourteen-foot-tall giant. Flames surround his red skin. N:289:Hummerhorn @@ -4519,8 +7060,13 @@ W:16:4:100:4 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:2d2 -F:RAND_50 | RAND_25 | CAN_FLY | WILD_TOO | -F:WEIRD_MIND | ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_TOO S:MULTIPLY D:A giant buzzing wasp, its stinger drips venom. @@ -4532,11 +7078,20 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:MALE | CAN_SWIM | IM_ACID | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_SHORE | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON -F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_TOO D:Intelligent lizard being from the depths. N:291:Ulfast, Son of Ulfang @@ -4549,12 +7104,22 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:MALE | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE D:A short and swarthy Easterling. He professed to follow D:Caranthir, but turned on the Sons of Feanor, and so D:brought about their defeat. @@ -4567,10 +7132,26 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 -F:ANIMAL | EVIL | MORTAL | FRIENDS | BASEANGBAND | DROP_CORPSE | HAS_EGG | -F:WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD | WILD_VOLCANO | -F:WILD_GRASS | WILD_SWAMP | WILD_SHORE | WILD_OCEAN | CAN_FLY | AQUATIC -S:1_IN_8 | SHRIEK +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:HAS_EGG +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +F:WILD_VOLCANO +F:WILD_WASTE +F:WILD_WOOD +S:1_IN_8 +S:SHRIEK D:A type of crow, specially bred by the forces of evil as spies; their D:rudimentary intelligence guided by an evil mind has tracked you down, D:and now they seek to alert other evil creatures to your presence. @@ -4584,10 +7165,20 @@ O:20:80:0:0 B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:HIT:HURT:7d7 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | HASTE | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +S:1_IN_4 +S:HASTE +S:SCARE D:He can drive himself into such a terrible battle-frenzy that he D:can survive blows which should kill him, and still apparently feel D:no pain. He tramples weaker creatures underfoot in his eagerness @@ -4603,13 +7194,27 @@ O:0:50:30:10 B:BITE:LOSE_DEX:1d6 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:FORCE_SLEEP | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | INVISIBLE | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | NONLIVING | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:INVISIBLE +F:NONLIVING +F:ONLY_ITEM +F:RAND_25 +F:SMART +S:1_IN_10 +S:BLIND +S:BLINK +S:CONF +S:SCARE +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:Draugroeg are doglike demons, dogs corrupted by Morgoth. N:295:Sphinx @@ -4620,12 +7225,21 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_1D2 | CAN_FLY | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_11 | -S:SCARE | CONF +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_11 +S:CONF +S:SCARE D:It will eat you if you cannot answer its riddle. D:Unfortunately, you do not understand the language D:it speaks. @@ -4638,13 +7252,30 @@ E:0:1:1:0:1:0 O:30:20:50:0 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:FORCE_SLEEP | CAN_FLY | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | INVISIBLE | COLD_BLOOD | BASH_DOOR | -F:EVIL | DEMON | IM_FIRE | RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_10 | -S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:INVISIBLE +F:ONLY_ITEM +F:RAND_25 +F:RES_TELE +F:SMART +S:1_IN_10 +S:BLIND +S:BLINK +S:BO_FIRE +S:CONF +S:SCARE +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:A minor demonic servant of evil. It resembles a rat - in fact, D:the Narroeg are the result of the corruption of rats by Morgoth. @@ -4657,10 +7288,21 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_TOO +F:WILD_WOOD D:Trolls were made by Melkor Bauglir in mockery of the Ents. This one D:is green-skinned and very ugly. @@ -4671,9 +7313,21 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:COLD:8d8 -F:FORCE_SLEEP | CAN_FLY | SUSCEP_FIRE | RAND_50 | RAND_25 | -F:EMPTY_MIND | AURA_COLD | -F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_COLD +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:SUSCEP_FIRE D:A semi-sentient snowball, hurling itself at targets at random. N:299:Jumping fireball @@ -4683,9 +7337,21 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:FIRE:8d8 -F:FORCE_SLEEP | CAN_FLY | SUSCEP_COLD | -F:EMPTY_MIND | AURA_FIRE | RAND_50 | RAND_25 | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:SUSCEP_COLD D:A semi-sentient fireball that moves around randomly. N:300:Ball lightning @@ -4695,9 +7361,20 @@ W:17:1:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:ELEC:8d8 -F:FORCE_SLEEP | CAN_FLY | RAND_25 | RAND_50 | -F:EMPTY_MIND | AURA_ELEC | -F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE |NO_CUT +F:AURA_ELEC +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:RAND_50 D:A crackling ball of energy, zooming about seemingly at random. N:301:2-headed hydra @@ -4708,11 +7385,24 @@ E:0:1:0:2:2:0 O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_1D2 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | HAS_EGG | IMPRESED | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_11 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:HAS_EGG +F:IMPRESED +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_11 S:SCARE D:A strange reptilian creature with two heads, guarding its hoard. @@ -4724,8 +7414,13 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:TERRIFY:2d5 B:CLAW:TERRIFY:5d2 -F:CAN_SWIM | OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_SWAMP -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:MORTAL +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO D:A creature that was once human, but is now as green as moss. N:303:Water spirit @@ -4736,10 +7431,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_POIS | IM_ACID | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 D:A whirlpool of sentient liquid. N:304:Giant red scorpion @@ -4750,9 +7453,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d4 B:STING:LOSE_STR:1d7 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is fast and poisonous. N:305:Earth spirit @@ -4763,11 +7470,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | -F:PASS_WALL | CAN_FLY | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 D:A whirling form of sentient rock. N:306:Fire spirit @@ -4778,10 +7495,22 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:FIRE:2d6 B:HIT:FIRE:2d6 -F:RAND_25 | -F:EMPTY_MIND | BASH_DOOR | CAN_FLY | SUSCEP_COLD | -F:IM_FIRE | IM_POIS | WILD_TOO | WILD_VOLCANO | -F:NO_CONF | NO_SLEEP | NO_FEAR | AURA_FIRE | BASEANGBAND | HAS_LITE | NO_CUT +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_25 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO D:A whirlwind of sentient flame. N:307:Fire hound @@ -4793,12 +7522,18 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:FIRE:2d6 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | SUSCEP_COLD | -F:ANIMAL | IM_FIRE | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +S:1_IN_10 S:BR_FIRE D:Flames lick at its feet and its tongue is a blade of fire. You can feel a D:furnace heat radiating from this creature. @@ -4812,12 +7547,17 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:COLD:2d6 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_COLD | SUSCEP_FIRE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:MORTAL +F:SUSCEP_FIRE +S:1_IN_10 S:BR_COLD D:A hound as tall as a man, this creature appears to be composed of angular D:planes of ice. Cold radiates from it and freezes your breath in the air. @@ -4831,12 +7571,17 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:ELEC:2d6 -F:FORCE_SLEEP | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | IM_ELEC | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ELEC +F:MORTAL +S:1_IN_10 S:BR_ELEC D:An aura of lightning forms a ghostly halo around this hound, and D:sparks sting your fingers as energy builds up in the air around you. @@ -4850,12 +7595,23 @@ O:10:10:10:10 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_COLD | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_COLD +S:1_IN_6 +S:BLIND +S:BO_COLD +S:CAUSE_2 +S:CONF +S:SCARE D:A strange creature that disguises itself as some object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -4868,12 +7624,22 @@ O:0:0:0:0 B:HIT:POISON:3d4 B:HIT:CONFUSE:2d3 B:HIT:PARALYZE:2d3 -F:CHAR_MULTI | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_6 +S:BLIND +S:BO_COLD +S:CAUSE_2 +S:CONF +S:SCARE D:A strange creature that disguises itself as a door to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -4884,9 +7650,18 @@ W:18:2:400:50 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 -F:RAND_25 | FRIENDS | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | RES_TELE | MORTAL | BASEANGBAND -S:1_IN_4 | BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:RAND_25 +F:RES_TELE +S:1_IN_4 +S:BLINK +S:TELE_TO D:A strange magical member of the canine race, its form seems to shimmer and D:fade in front of your very eyes. @@ -4898,12 +7673,21 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:MALE | -F:FORCE_MAXHP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +S:1_IN_9 S:ARROW_2 D:It is a cunning orc of power, as tall as a man, and stronger. It fears D:little. His armour bears the mark of Saruman - a large white hand. @@ -4918,13 +7702,25 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:He has power and great cunning, as leader of the garrison at Cirith Ungol. D:He is a large Uruk with an evil face, protruding fangs and long arms. @@ -4938,13 +7734,24 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | -F:ESCORT | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:He is an orc of power and great cunning, leader of the garrison at Minas Morgul. N:316:Shambling mound @@ -4955,10 +7762,21 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:ONLY_GOLD | DROP_90 | WILD_TOO | WILD_SWAMP | -F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:OPEN_DOOR +F:STUPID +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 S:SHRIEK D:A pile of rotting vegetation that slides towards you with a disgusting D:stench, waking all it nears. @@ -4972,8 +7790,18 @@ O:0:0:0:0 B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 -F:NEVER_MOVE | EMPTY_MIND | STUPID | CHAR_CLEAR | CHAR_MULTI | BASEANGBAND | -F:WILD_ONLY | WILD_WOOD | WILD_SWAMP | ANIMAL | SUSCEP_FIRE | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CHAR_CLEAR +F:CHAR_MULTI +F:EMPTY_MIND +F:NEVER_MOVE +F:NO_CUT +F:STUPID +F:SUSCEP_FIRE +F:WILD_ONLY +F:WILD_SWAMP +F:WILD_WOOD D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut D:around its prey and releases paralysing enzymes to stop its struggles. @@ -4988,11 +7816,29 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:ARROW_1 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 +S:MISSILE D:The youngest son of Feanor along with his twin brother Amras. D:He is bound by the Oath of Feanor and searches forever for the D:Silmarils. @@ -5008,12 +7854,34 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP | -F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 | -F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS | -S:1_IN_3 | -S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 | MISSILE | -S:TPORT | BLINK | TELE_TO | TELE_AWAY | S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:NO_FEAR +F:NO_STUN +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +S:1_IN_3 +S:ARROW_1 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 +S:BLINK +S:MISSILE +S:S_MONSTER +S:TELE_AWAY +S:TELE_TO +S:TPORT D:The youngest son of Feanor along with his twin brother Amrod. D:He is bound by the Oath of Feanor and searches forever for the D:Silmarils. @@ -5025,11 +7893,20 @@ W:18:2:150:80 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | CAN_FLY | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_CONF D:This gleaming dragonfly's wings beat mesmerizingly fast. @@ -5041,9 +7918,19 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:DROP_60 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | MALE | WILD_TOO | WILD_MOUNTAIN | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_TOO D:He is eighteen feet tall and looking at you. N:322:Giant black dragonfly @@ -5053,11 +7940,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ACID +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_ACID D:The size of a large bird, this dragonfly drips caustic acid. @@ -5069,10 +7964,20 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:COLD_BLOOD | EMPTY_MIND | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is a massive animated statue of hard stone. N:324:Red mold @@ -5082,10 +7987,18 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:FIRE:4d4 -F:NEVER_MOVE | SUSCEP_COLD | -F:STUPID | EMPTY_MIND | -F:IM_FIRE | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_COLD D:It is a strange growth on the dungeon floor, glowing red. N:325:Giant gold dragonfly @@ -5095,12 +8008,19 @@ W:22:2:150:75 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | WILD_TOO | WILD_MOUNTAIN | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_FLY | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_SOUN D:Large beating wings support this dazzling insect. A loud buzzing noise D:pervades the air. @@ -5115,11 +8035,24 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SMART | PET | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_GREAT -F:OPEN_DOOR | BASH_DOOR -F:GOOD | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_MAXHP +F:GOOD +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:SMART +F:UNIQUE D:A Dwarf of Nogrod in the Blue Mountains, and one of the D:greatest smiths in the history of Middle-earth. Among his D:works were Angrist, Narsil, and the Dragon-helm of Dor-lómin. @@ -5136,9 +8069,21 @@ B:CLAW:PARALYZE:2d4 B:CLAW:PARALYZE:2d4 B:BITE:LOSE_CON:2d4 B:BITE:LOSE_CHR:2d4 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | ESCORT | -F:NO_SLEEP | NO_CONF | UNDEAD | EVIL | IM_POIS | IM_COLD | -F:COLD_BLOOD | HURT_LITE | CAN_SWIM | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_60 +F:ESCORT +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD D:This vile abomination is a relative of ghouls, and often leads packs D:of them. It smells foul, and its bite carries a rotting disease. @@ -5147,10 +8092,17 @@ G:I:g I:120:3d2:8:18:10 W:19:4:100:4 B:BITE:POISON:2d2 -F:RAND_50 | RAND_25 | CAN_FLY | WILD_SWAMP | WILD_TOO | -F:WEIRD_MIND | ANIMAL | EVIL | BASEANGBAND -S:MULTIPLY | -S:1_IN_12 | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:EVIL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_12 +S:MULTIPLY S:SHRIEK D:Believed to be an evil relative of the cricket, this creature gets its name D:from its incessant squeaking, which can best be described as "neek-breek, @@ -5167,11 +8119,22 @@ B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 -F:DROP_60 | NO_SLEEP | NO_CONF | ANIMAL | WEIRD_MIND | SUSCEP_FIRE | -F:RES_WATE | IM_COLD | NEVER_MOVE | WILD_ONLY | WILD_WOOD | -F:BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:DROP_60 +F:IM_COLD +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_WATE +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_ONLY +F:WILD_WOOD S:1_IN_9 -S:BLINK | TELE_TO +S:BLINK +S:TELE_TO D:A very strong near-sentient tree, which has become hostile to other living things. N:330:Bolg, Son of Azog @@ -5184,13 +8147,25 @@ B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:A large and powerful orc, he looks just like his father. He is tall and D:fast, and he hates all dwarves and their friends. @@ -5203,12 +8178,22 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 -F:FRIENDS | WILD_TOO | WILD_WOOD | DROP_SKELETON | -F:WEIRD_MIND | BASH_DOOR | CAN_SWIM | -F:ANIMAL | SPIDER | IM_POIS | RES_TELE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_SKELETON +F:FRIENDS +F:IM_POIS +F:MORTAL +F:RES_TELE +F:SPIDER +F:WEIRD_MIND +F:WILD_TOO +F:WILD_WOOD +S:1_IN_5 +S:BLINK +S:TELE_TO D:A spider that never seems quite there. Everywhere you look it is just D:half-seen in the corner of one eye. @@ -5221,11 +8206,21 @@ O:50:50:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:WAIL:TERRIFY -F:MALE | CAN_SWIM | IM_ACID | IM_POIS | WILD_SHORE | -F:DROP_60 | DROP_1D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | FORCE_MAXHP | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_SHORE D:A leader of lizard men, coming from the depths. N:333:Landmine @@ -5235,10 +8230,19 @@ W:20:5:300:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:HURT:25d2 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT +F:ATTR_CLEAR +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It was left here to be used against intruders. # New monster added by furiosity for the Theme module @@ -5250,11 +8254,26 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:2d4 B:BITE:HURT:2d4 -F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | PET | -F:WILD_ONLY | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | WILD_WASTE | -F:ANIMAL | CAN_FLY | DROP_CORPSE | SMART | GOOD | MORTAL | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:PET +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_WASTE +F:WILD_WOOD S:1_IN_2 -S:S_MONSTER | S_MONSTERS +S:S_MONSTER +S:S_MONSTERS D:One of the ravens who lived on Ravenhill, one of the foothills of Erebor, D:the Lonely Mountain. Roac is a very ancient bird indeed: his father Carc D:had seen Smaug descend on the mountain, and Roac was no less than 153 years @@ -5270,9 +8289,21 @@ O:0:0:0:0 B:CLAW:HURT:6d3 B:CLAW:HURT:6d3 B:BITE:HURT:3d6 -F:CAN_FLY | NEUTRAL | NO_TARGET | -F:WILD_MOUNTAIN | WILD_VOLCANO | WILD_WASTE | WILD_WOOD | WILD_ONLY | -F:ANIMAL | GOOD | DROP_CORPSE | BASEANGBAND | IMPRESED | HAS_EGG | AQUATIC | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:IMPRESED +F:NEUTRAL +F:NO_TARGET +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO +F:WILD_WASTE +F:WILD_WOOD D:Greater and more intelligent than most of its kind, this eagle is D:a messenger between the forces of good. It answers to Manwe Sulimo. @@ -5284,9 +8315,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:NEVER_MOVE | IM_COLD | COLD_BLOOD | IM_ACID | IM_ELEC | NO_FEAR | -F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | FRIENDS | CHAR_MULTI | HURT_ROCK | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CHAR_MULTI +F:COLD_BLOOD +F:FRIENDS +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP S:MULTIPLY D:A sentient section of wall. @@ -5300,11 +8343,16 @@ B:BITE:HURT:1d8 B:BITE:HURT:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | MORTAL | BASEANGBAND | NO_CUT -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CUT +S:1_IN_10 S:BR_SHAR D:A beautiful crystalline shape does not disguise the danger this hound D:clearly presents. Your flesh tingles as it approaches. @@ -5319,11 +8367,17 @@ B:BITE:POISON:1d8 B:BITE:POISON:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | CAN_FLY | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_POIS +F:MORTAL +S:1_IN_10 S:BR_POIS D:Swirling vapours surround this beast as it floats towards you, seemingly D:walking on air. Noxious gases sting your throat. @@ -5338,9 +8392,15 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:1d10 B:BITE:HURT:1d10 -F:BASH_DOOR | WILD_WOOD | WILD_TOO | WILD_GRASS | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A fierce and dangerous cat, its huge tusks and sharp claws would lacerate D:even the strongest armour. @@ -5354,15 +8414,21 @@ B:BITE:ACID:1d8 B:BITE:ACID:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_ACID | MORTAL | BASEANGBAND -S:1_IN_10 | -S:BR_ACID -D:Footprints are burned in the ground behind this hound as it pads -D:around the dungeon. An acrid smell of acid rises from its pelt. - +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_ACID +F:MORTAL +S:1_IN_10 +S:BR_ACID +D:Footprints are burned in the ground behind this hound as it pads +D:around the dungeon. An acrid smell of acid rises from its pelt. + N:341:Chimaera G:H:r I:110:20d15:12:15:10 @@ -5372,10 +8438,18 @@ O:0:0:0:0 B:BUTT:HURT:2d8 B:BITE:HURT:2d10 B:BITE:FIRE:2d6 -F:FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:IM_FIRE | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_FIRE D:It is a strange hybrid of goat, lion and dragon, with the heads of all D:three beasts. @@ -5386,11 +8460,18 @@ I:110:6d8:10:1:0 W:20:1:3000:250 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW -F:EMPTY_MIND | INVISIBLE | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_4 | -S:BLINK | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_4 +S:BLINK S:S_MONSTER D:It is a strange pulsing mound of flesh. It looks harmless. @@ -5403,9 +8484,18 @@ O:0:0:0:0 B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_WASTE | -F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_COLD +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD D:A tall shaggy, furry humanoid, related to the yeti. # New monster added by furiosity for the Theme module @@ -5417,11 +8507,26 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:4d8 B:BITE:HURT:4d8 -F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | PET | -F:WILD_ONLY | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | WILD_WASTE | -F:ANIMAL | CAN_FLY | DROP_CORPSE | SMART | GOOD | MORTAL | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:PET +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_WASTE +F:WILD_WOOD S:1_IN_2 -S:S_ANIMAL | S_ANIMALS +S:S_ANIMAL +S:S_ANIMALS D:One of the ravens who lived on Ravenhill, one of the foothills of Erebor, D:the Lonely Mountain. Carc seems to have been the chief of those birds, D:and dwelt with his wife above the Dwarves' guard-chamber on the hill. @@ -5435,12 +8540,23 @@ E:1:1:1:2:1:1 O:20:50:20:0 B:HIT:HURT:5d4 B:HIT:HURT:5d4 -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:DROP_SKELETON | DROP_CORPSE | BASEANGBAND | MORTAL | HAS_LITE -S:1_IN_4 | -S:ARROW_2 | MISSILE | BO_COLD | BO_ELEC | BLINK | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:ARROW_2 +S:BLINK +S:BO_COLD +S:BO_ELEC +S:MISSILE +S:S_ANIMAL D:A warrior who is at one with nature. A master of both bow and sword, with D:minor spellcasting skills. @@ -5452,12 +8568,23 @@ E:1:1:1:2:1:1 O:20:60:0:10 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:MALE | GOOD | DROP_SKELETON | DROP_CORPSE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:BASEANGBAND | MORTAL | HAS_LITE -S:1_IN_4 | -S:HEAL | CAUSE_2 | SLOW | SCARE | BLIND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:BLIND +S:CAUSE_2 +S:HEAL +S:SCARE +S:SLOW D:A warrior devoted to Tulkas Astaldo. He considers you to be an D:agent of Morgoth. @@ -5470,9 +8597,15 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 -F:RAND_25 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:ANIMAL | EVIL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM D:It is a huge wolf with eyes that glow with manly intelligence. N:348:Dark elven lord @@ -5483,12 +8616,26 @@ E:1:1:1:2:1:1 O:0:80:20:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:MALE | FORCE_SLEEP | -F:ONLY_ITEM | DROP_2D2 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HASTE | BLIND | CONF | DARKNESS | BO_FIRE | BO_COLD | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BLIND +S:BO_COLD +S:BO_FIRE +S:CONF +S:DARKNESS +S:HASTE +S:MISSILE D:A dark elven figure in armour, radiating evil power. N:349:Cloud giant @@ -5499,9 +8646,18 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:8d8 B:HIT:ELEC:8d8 -F:DROP_90 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | IM_ELEC | MALE | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:GIANT +F:HAS_LITE +F:IM_ELEC +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM D:It is a twenty-foot-tall humanoid, wreathed in clouds. N:350:Ugluk, the Uruk @@ -5514,13 +8670,26 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_FIRE | IM_COLD | IM_POIS -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A strong and cunning orc warrior, the commander of Saruman's orcish horde. D:He was raised on man-flesh at Isengard, and bears the mark of the White Hand. @@ -5531,12 +8700,16 @@ W:21:1:100:54 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:ELEC:1d3 -F:FORCE_SLEEP | -F:RAND_50 | -F:BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_ELEC | AI_ANNOY -F:MORTAL | BASEANGBAND -S:1_IN_4 | +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ELEC +F:MORTAL +F:RAND_50 +S:1_IN_4 S:BR_ELEC D:It is a glowing blue bat with a sharp tail. @@ -5550,12 +8723,23 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD | SUSCEP_FIRE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BLIND | CONF | SCARE | CAUSE_2 | BO_FIRE | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_FIRE +S:1_IN_5 +S:BLIND +S:BO_FIRE +S:CAUSE_2 +S:CONF +S:SCARE S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -5570,12 +8754,22 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | -F:EMPTY_MIND | COLD_BLOOD -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BLIND | CONF | SCARE | CAUSE_2 | BA_POIS | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_5 +S:BA_POIS +S:BLIND +S:CAUSE_2 +S:CONF +S:SCARE S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -5588,11 +8782,25 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_VOLCANO | WILD_TOO | SUSCEP_COLD | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_FIRE | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF F:NO_CUT -S:1_IN_6 | +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:SUSCEP_COLD +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_FIRE D:A whirling maelstrom of fire. @@ -5603,10 +8811,20 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ACID:3d3 -F:FORCE_SLEEP | RAND_50 | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:IM_ACID | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_6 S:BR_ACID D:A caustic spinning whirlpool of foaming, steaming water. @@ -5620,13 +8838,24 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A large and powerful orc, captain of one of Saruman's orcish regiments. # New monster added by furiosity for the Theme module @@ -5638,18 +8867,60 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:UN_BONUS:8d12 B:HIT:TERRIFY:7d7 -F:BASEANGBAND | FORCE_DEPTH | FORCE_MAXHP | FORCE_SLEEP | -F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE | -F:REFLECTING | RES_TELE | SMART | GOOD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | HAS_LITE | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | -F:RES_NETH | NO_CONF | NO_SLEEP | NO_FEAR | -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS | CAUSE_4 | -S:BA_FIRE | BA_MANA | BO_FIRE | BO_MANA | BO_PLAS | BR_PLAS | -S:S_MONSTERS | S_HI_DRAGON | S_KIN | S_ANIMALS | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REFLECTING +F:RES_NETH +F:RES_TELE +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BA_FIRE +S:BA_MANA +S:BLIND +S:BO_FIRE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:BR_PLAS +S:CAUSE_4 +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_ANIMALS +S:S_HI_DRAGON +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY +S:TPORT +S:TRAPS D:He is dressed in blue from head to toe. He is one of the five Istari D:who came to the northwest of Middle-earth in the Third Age; he D:journeyed into the east with Pallando, and never returned to the western @@ -5664,10 +8935,23 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:COLD:3d3 -F:FORCE_SLEEP | RAND_50 | AURA_COLD | COLD_BLOOD | SUSCEP_FIRE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:SUSCEP_FIRE +S:1_IN_6 S:BR_COLD D:A twisting whirlpool of frost. @@ -5678,10 +8962,22 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ELEC:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | HAS_LITE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_ELEC | -F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_6 S:BR_ELEC D:A shimmering tornado of air; sparks crackle along its length. @@ -5693,10 +8989,18 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:10d5 B:BITE:POISON:10d5 -F:EMPTY_MIND | BASH_DOOR | POWERFUL | AQUATIC | -F:IM_POIS | NO_STUN | WILD_TOO | COLD_BLOOD | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_POIS +F:MORTAL +F:NO_STUN +F:POWERFUL +F:WILD_TOO +S:1_IN_8 S:BR_POIS D:This fish is among the most poisonous creatures there are. @@ -5705,8 +9009,13 @@ G:I:r I:120:3d2:8:18:10 W:24:4:100:4 B:BITE:BLIND:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | HAS_LITE | -F:WEIRD_MIND | ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:HAS_LITE +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:Clouds of these monsters light up the dungeon - so brightly that you can D:barely see through them. @@ -5719,11 +9028,21 @@ E:1:1:1:2:1:1 O:10:70:0:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:DROP_90 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:UNDEAD D:It is an orc-like figure covered in wrappings. N:363:Wolf chieftain @@ -5734,10 +9053,22 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 B:WAIL:TERRIFY -F:ESCORTS | FORCE_MAXHP | IM_COLD | IM_ACID | -F:SMART | ESCORT | ANIMAL | EVIL | MORTAL | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | NO_FEAR | MALE -S:1_IN_8 | DARKNESS +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:NO_FEAR +F:OPEN_DOOR +F:SMART +S:1_IN_8 +S:DARKNESS D:A great Wolf leader whose pack is in the service of the Dark Lord, D:and whose howls strike fear into the boldest hearts. @@ -5750,18 +9081,57 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:UN_BONUS:10d14 B:HIT:TERRIFY:9d9 -F:BASEANGBAND | FORCE_DEPTH | FORCE_MAXHP | FORCE_SLEEP | -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:REFLECTING | RES_TELE | SMART | EVIL | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | HAS_LITE | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | -F:RES_NETH | NO_CONF | NO_SLEEP | NO_FEAR | -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS | -S:BA_FIRE | BA_MANA | BO_FIRE | BO_MANA | BO_PLAS | BR_PLAS | -S:S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:EVIL +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:RES_NETH +F:RES_TELE +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BA_FIRE +S:BA_MANA +S:BLIND +S:BO_FIRE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:BR_PLAS +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:TELE_AWAY +S:TPORT +S:TRAPS D:He is dressed in blue from head to toe. He is one of the five Istari D:who came to the northwest of Middle-earth in the Third Age; he D:journeyed into the east with Alatar, and never returned to the western @@ -5777,9 +9147,21 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_20:1d6 B:ENGULF:EXP_20:1d6 -F:RAND_25 | SUSCEP_ELEC | UNDEAD | -F:IM_COLD | IM_POIS | IM_ACID | RES_NETH | WILD_TOO | WILD_SWAMP | -F:EVIL | EMPTY_MIND | COLD_BLOOD | FRIENDS | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_CUT +F:RAND_25 +F:RES_NETH +F:SUSCEP_ELEC +F:UNDEAD +F:WILD_SWAMP +F:WILD_TOO D:A cloud of evil, sentient mist. N:366:Killer stag beetle @@ -5790,9 +9172,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 -F:RAND_25 | WILD_TOO | DROP_CORPSE | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle with vicious claws. N:367:Iron golem @@ -5802,11 +9190,22 @@ W:22:2:3800:160 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 -F:FORCE_SLEEP | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_7 | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID +S:1_IN_7 S:SLOW D:It is a massive metal statue that moves steadily towards you. @@ -5820,9 +9219,21 @@ B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 B:CRUSH:HURT:1d8 -F:FORCE_SLEEP | RES_TELE -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE D:It looks like a huge spiked roller, moving on its own towards you. N:369:Giant yellow scorpion @@ -5833,9 +9244,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 B:STING:POISON:2d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | -F:ANIMAL | DROP_SKELETON | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant scorpion with a sharp stinger. # New monster added by furiosity for the Theme module @@ -5850,10 +9265,25 @@ B:HIT:HURT:3d11 B:HIT:HURT:3d11 B:HIT:HURT:3d10 B:HIT:HURT:3d10 -F:UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | SMART | CAN_SPEAK | -F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SMART +F:UNIQUE D:A friend of Lagduf's, he is no less evil but more cunning. N:371:Black ooze @@ -5863,13 +9293,23 @@ W:23:1:400:7 E:0:0:0:0:0:0 O:30:0:40:15 B:TOUCH:ACID:2d6 -F:RAND_50 | DROP_60 | STUPID | EMPTY_MIND | CAN_SWIM | -F:TAKE_ITEM | KILL_BODY | OPEN_DOOR | BASH_DOOR | -F:IM_POIS | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT -S:MULTIPLY -S:1_IN_11 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:EMPTY_MIND +F:IM_POIS +F:KILL_BODY +F:MORTAL +F:NO_CUT +F:NO_FEAR +F:OPEN_DOOR +F:RAND_50 +F:STUPID +F:TAKE_ITEM +S:1_IN_11 S:DRAIN_MANA +S:MULTIPLY D:It is a strangely moving puddle. N:372:Hardened warrior @@ -5880,10 +9320,17 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:6d5 B:HIT:HURT:6d5 -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:A scarred warrior who moves with confidence. N:373:Azog, King of the Uruk-Hai @@ -5895,13 +9342,26 @@ O:10:90:0:0 B:HIT:HURT:5d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | ESCORTS | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPECIAL_GENE +F:UNIQUE D:A large, strong and agile orc, the slayer of dwarven king Thror. # New monster added for the Theme module @@ -5915,9 +9375,19 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:HIT:EAT_GOLD:1d8 -F:BASEANGBAND | UNIQUE | MALE | FORCE_MAXHP | CAN_SPEAK | -F:OPEN_DOOR | BASH_DOOR | HAS_LITE | SMART | EVIL | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE D:A swarthy man of Bree. He has heavy black brows and dark scornful D:eyes; his large mouth is curled in a sneer. He sells anything to D:anybody and enjoys making mischief for his personal amusement. @@ -5930,13 +9400,25 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | FRIENDS -F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:CONF | MISSILE | DARKNESS | BO_MANA +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_5 +S:BO_MANA +S:CONF +S:DARKNESS +S:MISSILE D:A dark elven mage with spells of frighteningly destructive power. N:376:Master rogue @@ -5948,10 +9430,18 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:EAT_GOLD:4d4 -F:MALE | DROP_SKELETON | DROP_CORPSE | -F:DROP_2D2 | SUSCEP_ELEC | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SUSCEP_ELEC +F:TAKE_ITEM D:A thief of great power and shifty speed. N:377:Red dragon bat @@ -5961,10 +9451,17 @@ W:23:1:100:60 E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 -F:FORCE_SLEEP | RAND_50 | SUSCEP_COLD | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | AI_ANNOY -F:ANIMAL | IM_FIRE | BASEANGBAND -S:1_IN_4 | +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:RAND_50 +F:SUSCEP_COLD +S:1_IN_4 S:BR_FIRE D:It is a sharp-tailed bat, wreathed in fire. @@ -5975,9 +9472,15 @@ W:23:1:500:85 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:4d5 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is looking for prey. N:379:Ice skeleton @@ -5988,10 +9491,21 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:CLAW:COLD:2d3 B:CLAW:COLD:2d3 -F:ONLY_ITEM | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD D:It is a skeleton covered in frost. N:380:Angamaite of Umbar @@ -6004,14 +9518,28 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_ELEC -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:SLOW | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:FORGET +S:SLOW D:A Black Numenorean who hates the men of the West. He is a descendant D:of Castamir, the Usurper of Gondor. @@ -6024,13 +9552,26 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:FORCE_SLEEP | RAND_25 | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:SCARE | DRAIN_MANA +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RAND_25 +F:UNDEAD +S:1_IN_10 +S:DRAIN_MANA +S:SCARE D:It is a ghostly apparition, arisen when a humanoid was killed violently D:in a forest. It remembers its past life and wants revenge. @@ -6044,14 +9585,28 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:HEAL | SLOW | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNIQUE +S:1_IN_8 +S:BO_FIRE +S:HEAL +S:SLOW D:One of the last of the Petty-Dwarves. Khim is a tricky sorcerous little D:being, full of mischief. @@ -6065,14 +9620,28 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:HEAL | SLOW | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:UNIQUE +S:1_IN_8 +S:BO_FIRE +S:HEAL +S:SLOW D:One of the last of the Petty-Dwarves. Ibun is a tricky sorcerous little D:being, full of mischief. @@ -6085,9 +9654,18 @@ O:0:0:0:0 B:CLAW:HURT:7d3 B:CLAW:HURT:7d3 B:BITE:HURT:3d7 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:Among all the eagles of Middle-earth he is the swiftest, and in his time D:has borne messages between all of the Wise. It was Meneldor who bore the D:Ring-bearer away from the destruction of Mount Doom. @@ -6100,8 +9678,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d33 B:HIT:HURT:2d44 -F:PASS_WALL | NO_SLEEP | COLD_BLOOD | NONLIVING | NO_FEAR | -F:FORCE_MAXHP | RES_TELE | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:RES_TELE D:A creature that is half real, half illusion. N:386:Giant silver ant @@ -6111,9 +9698,15 @@ W:23:1:800:45 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:4d4 -F:RAND_25 | -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | -F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:A giant silver ant with a caustic bite. N:387:4-headed hydra @@ -6126,11 +9719,21 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_SHORE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_7 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_7 S:SCARE D:A strange reptilian creature with four heads, guarding its hoard. @@ -6144,12 +9747,35 @@ O:30:60:0:10 B:CLAW:HURT:8d11 B:CLAW:EAT_LITE:8d11 B:CLAW:LOSE_INT:8d11 -F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | -F:UNIQUE | FEMALE | CAN_SPEAK | SMART | FORCE_MAXHP | EVIL | MORTAL | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | ANIMAL | FORCE_SLEEP | -F:HURT_LITE | IM_FIRE | IM_POIS | RES_NETH | NO_SLEEP | NO_CONF | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:RES_NETH +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD S:1_IN_5 -S:S_KIN | SHRIEK | S_ANIMALS | BLINK | S_MONSTERS +S:BLINK +S:SHRIEK +S:S_ANIMALS +S:S_KIN +S:S_MONSTERS D:The dark and mournful Queen to Tarannon Falastur, the twelfth King D:of Gondor. She owned ten marvellous and magical cats, that she set D:to spy on the doings of the people of Gondor. Her scheming was her @@ -6170,12 +9796,29 @@ B:HIT:UN_BONUS:5d10 B:HIT:EXP_80:5d10 B:HIT:ABOMINATION:5d10 B:HIT:DISEASE:5d10 -F:BASEANGBAND | UNIQUE | FORCE_MAXHP | -F:ELDRITCH_HORROR | REFLECTING | -F:NO_SLEEP | NO_CUT | NO_STUN | NO_CONF | NO_FEAR | -F:ONLY_ITEM | DROP_4D2 | DROP_GREAT | DROP_RANDART | -F:IM_FIRE | IM_COLD | IM_ACID | IM_POIS | SPECIAL_GENE | -F:RES_NETH | RES_PLAS | EVIL | EMPTY_MIND | +F:BASEANGBAND +F:DROP_4D2 +F:DROP_GREAT +F:DROP_RANDART +F:ELDRITCH_HORROR +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:REFLECTING +F:RES_NETH +F:RES_PLAS +F:SPECIAL_GENE +F:UNIQUE D:A shadowy creature of Elvish legend, said to have plagued the D:newly-awakened Elves at Cuivienen. Those Elves captured by the D:Hunter were thought to have been corrupted by Melkor to form @@ -6192,10 +9835,21 @@ E:1:1:1:2:1:1 O:20:40:20:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:ONLY_ITEM | DROP_90 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_90 +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD D:It is a human form encased in mouldy wrappings. N:391:Vampire bat @@ -6206,9 +9860,20 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:EXP_40:1d4 B:BITE:EXP_40:1d4 -F:RAND_50 | COLD_BLOOD | REGENERATE | CAN_FLY | -F:EVIL | ANIMAL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RAND_50 +F:REGENERATE +F:UNDEAD D:A blood-sucking bat that flies at your neck hungrily. N:392:Sangahyando of Umbar @@ -6221,14 +9886,28 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_ELEC -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:SLOW | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:FORGET +S:SLOW D:A Black Numenorean with a blacker heart. He is a descendant D:of Castamir, the usurper of Gondor's throne. @@ -6242,14 +9921,47 @@ B:GAZE:BLIND:8d8 B:TOUCH:TERRIFY B:GAZE:EXP_40 B:TOUCH:EAT_ITEM -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | DROP_GREAT | DROP_CORPSE | -F:CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR | INVISIBLE | COLD_BLOOD | -F:NO_CONF | UNIQUE | FORCE_MAXHP | NO_SLEEP | CAN_SPEAK | REFLECTING | -F:IM_FIRE | IM_ELEC | EMPTY_MIND | EVIL | SMART | RES_TELE | CAN_FLY | +F:ATTR_CLEAR +F:CAN_FLY +F:CAN_SPEAK +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE F:JOKEANGBAND +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE S:1_IN_4 -S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF | S_UNDEAD | S_MONSTER | -S:HEAL | TELE_AWAY | DARKNESS | S_HYDRA | TRAPS | FORGET | TELE_TO | SHRIEK +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HEAL +S:SCARE +S:SHRIEK +S:S_HYDRA +S:S_MONSTER +S:S_UNDEAD +S:TELE_AWAY +S:TELE_TO +S:TRAPS D:Nobody has ever seen It. N:394:Banshee @@ -6260,13 +9972,25 @@ E:0:0:0:0:0:0 O:80:0:0:15 B:WAIL:TERRIFY B:TOUCH:EXP_20 -F:FEMALE | -F:RAND_50 | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FEMALE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_15 | -S:TPORT | DRAIN_MANA +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:DRAIN_MANA +S:TPORT D:It is a ghostly woman's form that wails mournfully. # New monster added by furiosity for the Theme module @@ -6279,13 +10003,38 @@ E:1:1:1:2:1:1 O:0:40:60:0 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 -F:UNIQUE | MALE | MORTAL | BASEANGBAND | HAS_LITE | CAN_SPEAK | -F:FORCE_MAXHP | SMART | IM_FIRE | IM_COLD | IM_POIS | IM_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_NETH | RES_NEXU | RES_PLAS | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | EVIL | SPECIAL_GENE | -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_3 | BA_NETH | BA_FIRE | BO_PLAS -S:S_MONSTERS | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_5 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:CAUSE_3 +S:SCARE +S:S_DEMON +S:S_MONSTERS D:One of the many Numenoreans who fell under the shadow of Sauron D:after Ar-Pharazon brought the Dark Lord to Numenor. With another D:named Fuinur, he settled among the Haradrim on Middle-Earth, and @@ -6304,12 +10053,34 @@ B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | SUSCEP_FIRE | -F:WILD_ONLY | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | WILD_SHORE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | DROP_CORPSE | -F:SMART | TAKE_ITEM | BASH_DOOR | KILL_WALL | NO_SLEEP | -F:GOOD | NEUTRAL | NO_TARGET | BASEANGBAND | NO_CUT | FEMALE | CAN_FLY | -F:DG_CURSE | WYRM_PROTECT | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DG_CURSE +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NEUTRAL +F:NO_CUT +F:NO_SLEEP +F:NO_TARGET +F:ONLY_ITEM +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_WOOD +F:WYRM_PROTECT D:She is one of the Ent-wives who disappeared into the East a D:long time ago. She was the wife of Fangorn the Treebeard when D:the separation occurred, and she seems to have taken it quite @@ -6326,12 +10097,34 @@ B:GAZE:TERRIFY B:GAZE:PARALYZE B:GAZE:LOSE_STR B:GAZE:HALLU -F:EMPTY_MIND | COLD_BLOOD | NONLIVING | NEVER_MOVE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | EVIL | -F:HURT_ROCK | COLD_BLOOD | HURT_LITE | NO_FEAR | -F:NO_CONF | NO_SLEEP | NO_STUN | NONLIVING | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:SHRIEK | S_MONSTER | S_MONSTERS | HOLD | CONF | MIND_BLAST | DRAIN_MANA +F:BASEANGBAND +F:COLD_BLOOD +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NONLIVING +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_TELE +S:1_IN_3 +S:CONF +S:DRAIN_MANA +S:HOLD +S:MIND_BLAST +S:SHRIEK +S:S_MONSTER +S:S_MONSTERS D:A figure carved from stone, with three vulture faces whose eyes glow D:with a malevolent light. None escape its vigilance. @@ -6343,13 +10136,24 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:3d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:SLOW | CONF | BO_ACID +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +S:1_IN_4 +S:BO_ACID +S:CONF +S:SLOW D:A stumpy figure carved from stone, with glittering eyes. # New monster added by furiosity for the Theme module @@ -6364,13 +10168,24 @@ B:HIT:HURT:4d8 B:HIT:HURT:4d8 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:UNIQUE D:A large and powerful orc, captain of one of Saruman's orcish regiments. N:400:Dark elven druid @@ -6382,14 +10197,28 @@ O:10:0:80:10 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:HIT:HURT:3d8 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | CONF | DARKNESS | -S:S_MONSTER | S_SPIDER | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:CONF +S:DARKNESS +S:HEAL +S:S_ANIMAL +S:S_MONSTER +S:S_SPIDER D:A powerful dark elf, with mighty nature-controlling enchantments. N:401:Stone troll @@ -6401,10 +10230,20 @@ O:0:100:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:HURT_ROCK +F:MALE +F:NO_CUT +F:OPEN_DOOR +F:REGENERATE +F:TROLL D:It is said that Melkor created trolls in mockery of the Ents. D:This giant creature has scabby black skin and powerful fists. @@ -6419,12 +10258,32 @@ B:HIT:HURT B:HIT:HURT B:WAIL:TERRIFY B:INSULT:* -F:BASEANGBAND | SPECIAL_GENE | UNIQUE | MALE | CAN_SPEAK | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | HAS_LITE | SUSCEP_POIS | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_RANDART | FORCE_MAXHP | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | RES_NETH | RES_WATE | -S:1_IN_8 | -S:S_UNDEAD | S_KIN | S_DEMON | S_DRAGON | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_GOOD +F:DROP_RANDART +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_WATE +F:SPECIAL_GENE +F:SUSCEP_POIS +F:TAKE_ITEM +F:UNIQUE +S:1_IN_8 +S:S_DEMON +S:S_DRAGON +S:S_KIN +S:S_UNDEAD D:The proud ruler of the gray-eyed Men of Dol Amroth, Imrahil D:had been aligned with the forces of good for most of his life. D:However, Sauron has managed to sway Imrahil to the Shadow by @@ -6442,11 +10301,22 @@ O:30:70:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:HURT:2d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE D:It is said that Melkor created trolls in mockery of the Ents. D:This creature has an extremely tough hide, covered with warts. @@ -6460,9 +10330,16 @@ B:GAZE:EXP_20 B:CRAWL:ACID:2d4 B:BITE:HURT:1d10 B:BITE:POISON:1d6 -F:BASH_DOOR | EVIL | CAN_SWIM | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul D:monster that breeds on death. @@ -6473,9 +10350,15 @@ W:25:1:600:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:4d4 -F:RAND_25 | WILD_TOO | -F:WEIRD_MIND | BASH_DOOR | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:A giant beetle with poisonous mandibles. N:406:Disenchanter bat @@ -6486,8 +10369,16 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:HIT:UN_BONUS B:HIT:UN_BONUS -F:FORCE_SLEEP | RAND_50 | ANIMAL | MORTAL | ATTR_MULTI | -F:DROP_CORPSE | AI_ANNOY | CAN_FLY | BASEANGBAND | WEIRD_MIND +F:AI_ANNOY +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WEIRD_MIND D:A giant bat that feeds on raw magical energy. # New monster added for the Theme module @@ -6502,13 +10393,28 @@ B:HIT:CONFUSE:12d12 B:TOUCH:LOSE_CHR:2d12 B:HIT:BLIND:10d5 B:HIT:TERRIFY:15d1 -F:UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | -F:EVIL | OPEN_DOOR | BASH_DOOR | ANIMAL | -F:INVISIBLE | NO_SLEEP | NO_FEAR | MORTAL | -F:DROP_4D2 | DROP_GOOD | ONLY_ITEM | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE S:1_IN_3 -S:TELE_AWAY | S_KIN | +S:S_KIN +S:TELE_AWAY D:A giant cat, servant of Tevildo. His yellow eyes look D:upon you with a baleful stare. @@ -6519,9 +10425,13 @@ W:26:1:700:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 -F:RAND_25 | KILL_BODY | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:KILL_BODY +F:RAND_25 +F:WEIRD_MIND D:It is an ant encased in shaggy grey fur. # New monster added for the Theme module @@ -6536,13 +10446,28 @@ B:HIT:CONFUSE:12d12 B:TOUCH:LOSE_DEX:2d12 B:HIT:BLIND:10d5 B:HIT:PARALYZE:15d1 -F:UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | -F:EVIL | OPEN_DOOR | BASH_DOOR | ANIMAL | -F:INVISIBLE | NO_STUN | NO_SLEEP | MORTAL | -F:DROP_4D2 | DROP_GOOD | ONLY_ITEM | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | -S:1_IN_3 | -S:TELE_TO | S_KIN | +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_3 +S:S_KIN +S:TELE_TO D:A fierce and warlike cat, serving as a bodyguard of Tevildo. D:This giant cat looks down upon you with disdain. @@ -6555,9 +10480,18 @@ O:0:0:0:0 B:CLAW:HURT:15d2 B:CLAW:HURT:15d2 B:BITE:HURT:3d10 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:The greatest of eagles in the Third Age of Middle-earth, Gwaihir rescued D:Gandalf the Wizard from Orthanc, and has twice brought his flock to the D:aid of Sauron's enemies in battle - first outside the gates of Erebor in @@ -6570,10 +10504,16 @@ W:26:2:200:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 -F:RAND_25 | SUSCEP_COLD | -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_FIRE | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD +F:WEIRD_MIND D:It is smoking and burning with great heat. # New monster added by furiosity for the Theme module @@ -6586,11 +10526,23 @@ E:1:1:1:2:1:1 O:40:60:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND | WILD_TOO | WILD_TOWN | MORTAL | -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:HAS_LITE | OPEN_DOOR | BASH_DOOR | EVIL | -F:FORCE_MAXHP | FORCE_SLEEP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_TOO +F:WILD_TOWN D:The 'Chief Shiriff' of Bag End. Using money obtained from Isengard D:and the sale of pipe-weed, he bought up much property in the Shire D:and supported the ruffians known as `The Chief's Men'. After @@ -6606,12 +10558,23 @@ O:40:60:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE | -F:FORCE_MAXHP | WILD_TOO | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO D:A short and swarthy Easterling, faithless and treacherous. D:Along with his brother, he brought about the fall of the D:Sons of Feanor. @@ -6626,9 +10589,16 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 B:CRUSH:HURT:2d6 -F:BASH_DOOR | OPEN_DOOR | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ANIMAL | EVIL | DROP_1D2 | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:In the eyes of this bear, there glimmers the faintest light of intelligence. D:And then its form begins to change... The combination of animal cunning, D:human intelligence and the great physical strength of the bear makes for @@ -6642,10 +10612,16 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR D:A giant orc-like figure with an awesomely muscled frame. N:416:White wraith @@ -6657,13 +10633,25 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:FORCE_SLEEP | -F:DROP_1D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:SCARE D:It is a tangible but ghostly form made of white fog. # New monster added for the Theme module @@ -6678,16 +10666,44 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 #Force him into Mirkwood: -F:FORCE_DEPTH | ONLY_DEPTH | -F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:UNIQUE | MALE | CAN_SPEAK | MORTAL | TAKE_ITEM | -F:CAN_SWIM | OPEN_DOOR | BASH_DOOR | HAS_LITE | -F:PET | NO_CONF | NO_SLEEP | GOOD | -F:ONLY_ITEM | DROP_2D2| DROP_GREAT | NO_FEAR | -F:IM_POIS | IM_COLD | RES_WATE | RES_TELE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_2D2 +F:DROP_GREAT +F:FORCE_DEPTH +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_DEPTH +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:RES_TELE +F:RES_WATE +F:TAKE_ITEM +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD S:1_IN_5 -S:BO_FIRE | BO_COLD | BLIND | CONF | HASTE | S_KIN | -S:DARKNESS | S_MONSTER | S_ANIMALS | S_SPIDER | +S:BLIND +S:BO_COLD +S:BO_FIRE +S:CONF +S:DARKNESS +S:HASTE +S:S_ANIMALS +S:S_KIN +S:S_MONSTER +S:S_SPIDER D:A strong wood-elf with a penchant for treasure. He is D:wise and powerful, and it is said that even the independent D:dark elves will rally to his side when he travels. @@ -6701,11 +10717,24 @@ O:0:45:35:10 B:CLAW:DISEASE:1d4 B:CLAW:DISEASE:1d4 B:BITE:PARALYZE:1d5 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | UNDEAD | FRIENDS | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD S:1_IN_9 -S:SCARE | HOLD +S:HOLD +S:SCARE D:Flesh is falling off in chunks from this decaying abomination. N:419:Mim, Betrayer of Turin @@ -6718,15 +10747,36 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:UN_BONUS:3d12 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_DISE | RES_TELE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | SCARE | BO_ACID | BA_ACID | TPORT | S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +F:RES_TELE +F:UNIQUE +S:1_IN_6 +S:BA_ACID +S:BO_ACID +S:HEAL +S:SCARE +S:S_MONSTER +S:TPORT D:A Petty-Dwarf, one of the last of his race. He betrayed Turin D:Turambar and gave him up to Morgoth's forces. @@ -6738,10 +10788,23 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_20:2d13 B:HIT:EXP_20:2d13 -F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_ACID | -F:COLD_BLOOD | BASH_DOOR | NONLIVING | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID D:A deadly blade of chaos, moving of its own volition. N:421:Killer fire beetle @@ -6752,9 +10815,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:FIRE:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_VOLCANO | DROP_CORPSE | -F:ANIMAL | IM_FIRE | CAN_FLY | SUSCEP_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND +F:WILD_TOO +F:WILD_VOLCANO D:It is a giant beetle wreathed in flames. # New monster added by furiosity for the Theme module @@ -6767,16 +10839,48 @@ E:1:1:1:2:1:1 O:20:50:10:5 B:HIT:FIRE:9d12 B:HIT:HURT:10d10 -F:UNIQUE | MALE | SMART | CAN_SPEAK | MORTAL | -F:BASEANGBAND | FORCE_MAXHP | WEIRD_MIND | EVIL | -F:HAS_LITE | ESCORT | ESCORTS | ONLY_ITEM | -F:DROP_4D2 | DROP_3D2 | DROP_GOOD | TAKE_ITEM | -F:OPEN_DOOR | BASH_DOOR | DROP_USEFUL | -F:IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | RES_PLAS | -S:1_IN_2 | -S:BA_FIRE | BRAIN_SMASH | CAUSE_2 | BO_FIRE | BO_MANA | -S:BO_PLAS | SCARE | CONF | HASTE | HEAL | TPORT | -S:TELE_TO | TELE_AWAY | TRAPS | FORGET | S_KIN | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_USEFUL +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_PLAS +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WEIRD_MIND +S:1_IN_2 +S:BA_FIRE +S:BO_FIRE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_2 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_KIN +S:TELE_AWAY +S:TELE_TO +S:TPORT +S:TRAPS D:The proud former 'king' of Gondor, he has been driven mad D:by his contact with Sauron through the Palantir. You see D:the glint of a terrible fire in his eyes. @@ -6791,9 +10895,19 @@ B:BITE:POISON:3d4 B:TOUCH:POISON:3d5 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:ONLY_GOLD | DROP_90 | DROP_2D2 | -F:COLD_BLOOD | BASH_DOOR | CHAR_MULTI | -F:IM_ELEC | IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:IM_ACID +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It appears to be a pile of coins made of precious adamant, slithering toward D:you on lots of tiny legs. @@ -6806,9 +10920,19 @@ O:10:80:0:10 B:CLAW:POISON:3d3 B:CLAW:POISON:3d3 B:BITE:HURT:1d6 -F:FRIENDS | DROP_60 | WILD_WOOD | WILD_MOUNTAIN | WILD_TOO | WILD_SWAMP | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | REGENERATE | -F:EVIL | TROLL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:Trolls were created by Melkor in mockery of the Ents. This one is D:a powerful troll form. Venom drips from its needle-like claws. @@ -6824,13 +10948,26 @@ O:10:80:0:10 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND | WILD_TOO | WILD_WOOD | -F:UNIQUE | MALE | CAN_SPEAK | SMART | -F:FORCE_MAXHP | MORTAL | HAS_LITE | PET | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | -F:DROP_2D2 | DROP_GOOD | ONLY_ITEM | -S:1_IN_10 | -S:ARROW_2 | S_KIN | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD +S:1_IN_10 +S:ARROW_2 +S:S_KIN D:A noble son of the Steward of Gondor. N:426:Roper @@ -6843,13 +10980,32 @@ B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 -F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | NEVER_MOVE | -F:ONLY_GOLD | DROP_2D2 | DROP_60 | DROP_1D2 | EVIL | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | IM_COLD | IM_FIRE | BASEANGBAND +F:BASEANGBAND +F:DROP_1D2 +F:DROP_2D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF F:NO_CUT -S:1_IN_5 | -S:BA_FIRE | BA_ELEC | BA_POIS | HASTE | -S:TRAPS | SHRIEK | HOLD | CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +S:1_IN_5 +S:BA_ELEC +S:BA_FIRE +S:BA_POIS +S:CONF +S:HASTE +S:HOLD +S:SHRIEK +S:TRAPS D:This creature look like a pillar of rock. However, a closer D:inspection reveals a glaring eye and powerful tentacles, D:which crush its prey and feed it to the creature's hungry @@ -6863,9 +11019,17 @@ E:1:1:1:2:0:1 O:0:100:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:FRIENDS | DROP_60 | OPEN_DOOR | BASH_DOOR | WILD_TOO | -F:WILD_MOUNTAIN | WILD_WASTE | DROP_SKELETON | DROP_CORPSE | -F:EVIL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE S:1_IN_6 S:SCARE D:Headless humanoid abomination, ever hungry for blood. @@ -6880,12 +11044,17 @@ B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_SOUN D:A blurry canine form which seems to be moving as fast as the eye can D:follow. You can feel the earth resonating beneath your feet. @@ -6900,11 +11069,18 @@ B:BITE:HURT:2d8 B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | RES_NEXU | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | -F:BASH_DOOR | -F:ANIMAL | RES_TELE | NO_SLEEP | MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_SLEEP +F:RES_NEXU +F:RES_TELE +S:1_IN_5 S:BR_NEXU D:A locus of conflicting points coalesce to form the vague shape of a huge D:hound. Or is it just your imagination? @@ -6917,10 +11093,17 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | SMART | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:SMART D:A giant, brutish figure, as ugly as an orc, but with some of the D:intelligence of his half-human ancestry. @@ -6933,12 +11116,27 @@ O:5:85:0:5 B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:HIT:HURT:6d7 -F:UNIQUE | MALE | CAN_SPEAK | WILD_TOO | WILD_SWAMP | WILD_SHORE | -F:FORCE_MAXHP | ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | GIANT | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:GIANT +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO D:An ogre renowned for acts of surprising cruelty, Lokkak is the leader of a large D:band of violent ogres. @@ -6952,13 +11150,32 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a humanoid with an aura of power. You notice a sharp set of front D:teeth. @@ -6971,11 +11188,15 @@ O:0:0:0:0 B:BUTT:HURT:2d10 B:BITE:FIRE:2d10 B:GAZE:PARALYZE:2d6 -F:FORCE_SLEEP | SUSCEP_COLD | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:IM_FIRE | BASEANGBAND -S:1_IN_8 | -S:BR_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:SUSCEP_COLD +S:1_IN_8 +S:BR_FIRE D:It has three heads - goat, dragon and gorgon - all attached to a D:lion's body. @@ -6991,12 +11212,25 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | PET | -F:WILD_TOO | WILD_WOOD | FORCE_MAXHP | MORTAL | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | HAS_LITE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -S:1_IN_10 | -S:ARROW_2 | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD +S:1_IN_10 +S:ARROW_2 +S:S_KIN D:The noble son of the Steward of Gondor guards the depths D:of Ithilien against the Enemy. @@ -7008,11 +11242,22 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:ELEC:3d8 B:HIT:ELEC:3d8 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | CAN_FLY | -F:IM_ELEC | IM_POIS | AURA_ELEC | REFLECTING | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ELEC +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +S:1_IN_3 S:BO_ELEC D:A man-shaped form of living lightning, sparks and shocks crackle all over D:this madly capering figure, as it leaps and whirls around and about you. @@ -7027,13 +11272,26 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:FORCE_SLEEP | CAN_FLY | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HEAL | BLIND | MIND_BLAST | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_4 +S:BLIND +S:DARKNESS +S:HEAL +S:MIND_BLAST D:A wraithly snake-like form with the torso of a beautiful woman, it is the D:most powerful of its kind. @@ -7049,10 +11307,21 @@ B:GAZE:* B:WAIL:* B:INSULT:* B:CHARGE:HURT:1d2 -F:BASEANGBAND | WILD_TOO | WILD_TOWN | WILD_WOOD | -F:UNIQUE | CAN_SPEAK | MALE | HAS_LITE | MORTAL | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +F:WILD_TOO +F:WILD_TOWN +F:WILD_WOOD D:The suspicious and gruff keeper of the West-gate of Bree. He betrayed his D:people by letting Saruman's thugs into the city, and so has been turned out. @@ -7069,14 +11338,37 @@ B:GAZE:TERRIFY:5d8 B:GAZE:PARALYZE:5d8 B:GAZE:LOSE_STR:5d8 B:GAZE:HALLU:5d8 -F:UNIQUE | FORCE_MAXHP | INVISIBLE | WEIRD_MIND | -F:EMPTY_MIND | COLD_BLOOD | NONLIVING | NEVER_MOVE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | EVIL | -F:HURT_ROCK | COLD_BLOOD | HURT_LITE | NO_FEAR | -F:NO_CONF | NO_SLEEP | NO_STUN | NONLIVING | RES_TELE | -F:BASEANGBAND | NO_CUT | REGENERATE | -S:1_IN_3 | -S:SHRIEK | S_SPIDER | S_HI_UNDEAD | MIND_BLAST | DRAIN_MANA +F:BASEANGBAND +F:COLD_BLOOD +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NEVER_MOVE +F:NONLIVING +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:REGENERATE +F:RES_TELE +F:UNIQUE +F:WEIRD_MIND +S:1_IN_3 +S:DRAIN_MANA +S:MIND_BLAST +S:SHRIEK +S:S_HI_UNDEAD +S:S_SPIDER D:It looks like a great figure seated upon a throne, with three joined D:bodies and three vulture-like heads. It seems to be carved out of huge D:blocks of stone, immovable, and yet strangely aware of your presence. @@ -7093,11 +11385,27 @@ B:WAIL:UN_BONUS B:WAIL:EXP_20 B:WAIL:EAT_GOLD B:WAIL:EAT_ITEM -F:CHAR_MULTI | COLD_BLOOD | EVIL | NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | -F:UNDEAD | FORCE_MAXHP | IM_FIRE | IM_ELEC | IM_POIS | IM_ACID | EMPTY_MIND -F:NEVER_MOVE | JOKEANGBAND | HAS_LITE | NO_CUT +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:1_IN_15 -S:S_DEMON | SHRIEK +S:SHRIEK +S:S_DEMON D:Often found in graveyards. N:440:5-headed hydra @@ -7110,13 +11418,25 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 -F:FORCE_SLEEP | -F:ONLY_GOLD | DROP_1D2 | DROP_4D2 | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | MOVE_BODY | CAN_SWIM | -F:ANIMAL | IM_POIS | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:SCARE | BA_POIS +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_POIS +S:SCARE D:A strange reptilian creature with five heads dripping venom. # New monster added for the Theme module @@ -7128,18 +11448,66 @@ W:127:5:0:0 E:1:1:1:2:1:1 O:0:0:0:0 B:SHOW:* -F:BASEANGBAND | WILD_ONLY | WILD_GRASS | WILD_WOOD | WILD_SHORE | -F:UNIQUE | MALE | FORCE_MAXHP | GOOD | HAS_LITE | CAN_SPEAK | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | -F:WYRM_PROTECT | DG_CURSE | GOOD | OPEN_DOOR | BASH_DOOR | SMART | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | PET | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | -S:1_IN_5 | -S:CONF | MIND_BLAST | BRAIN_SMASH | -S:BA_MANA | CAUSE_4 | MISSILE | SCARE | SLOW | HOLD | BO_MANA | -S:HASTE | HAND_DOOM | HEAL | BLINK | BR_MANA | S_MONSTERS | +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FORCE_MAXHP +F:GOOD +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NEVER_BLOW +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_THEFT +F:OPEN_DOOR +F:PET +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY +F:WILD_SHORE +F:WILD_WOOD +F:WYRM_PROTECT +S:1_IN_5 +S:BA_MANA +S:BLINK +S:BO_MANA +S:BRAIN_SMASH +S:BR_MANA +S:CAUSE_4 +S:CONF +S:HAND_DOOM +S:HASTE +S:HEAL +S:HOLD +S:MIND_BLAST +S:MISSILE +S:SCARE +S:SLOW +S:S_MONSTERS D:A mysterious figure in a blue coat, his face creased in laughter. D:Legend has it that he is older than Arda itself, and will aid D:the forces of good in any way he can. @@ -7153,12 +11521,22 @@ O:0:90:10:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLIND | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_8 +S:BLIND +S:CAUSE_3 +S:DARKNESS +S:SCARE D:He is a figure riding a majestic war chariot; he looks at you D:menacingly. @@ -7171,11 +11549,25 @@ O:0:0:0:0 B:BITE:PARALYZE:4d5 B:BITE:LOSE_DEX:4d5 B:BITE:LOSE_CON:4d5 -F:FORCE_SLEEP | AQUATIC | GOOD | ANIMAL | NEUTRAL | NO_TARGET | -F:IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | WILD_ONLY | WILD_OCEAN -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BO_WATE | BO_COLD | BO_ICEE | BO_MANA +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:FORCE_SLEEP +F:GOOD +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_OCEAN +F:WILD_ONLY +S:1_IN_5 +S:BO_COLD +S:BO_ICEE +S:BO_MANA +S:BO_WATE D:Your mind is filled with admiration as you view this wondrous, D:magical seahorse. @@ -7187,12 +11579,26 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:9d9 B:HIT:HURT:9d9 -F:FORCE_SLEEP | -F:DROP_1D2 | TAKE_ITEM | WILD_TOO | WILD_SHORE | WILD_MOUNTAIN | -F:BASH_DOOR | OPEN_DOOR | MOVE_BODY | DROP_CORPSE | -F:EVIL | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_SHORE +F:WILD_TOO +S:1_IN_8 S:ARROW_4 D:A gigantic humanoid with only one eye. @@ -7204,12 +11610,25 @@ E:1:1:1:2:1:1 O:0:0:90:10 B:HIT:CONFUSE:5d5 B:HIT:TERRIFY:5d5 -F:MALE | -F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | SMART | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLIND | MIND_BLAST | HOLD | CAUSE_3 | FORGET | S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_8 +S:BLIND +S:CAUSE_3 +S:FORGET +S:HOLD +S:MIND_BLAST +S:S_MONSTER D:He is using his supernatural talents to bring about your D:destruction. @@ -7222,9 +11641,14 @@ O:0:0:0:0 B:HIT:HURT:1d8 B:BITE:ACID:2d8 B:STING:POISON:1d8 -F:BASH_DOOR | DROP_CORPSE | -F:ANIMAL | IM_ACID | IM_POIS | CAN_SWIM | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:MORTAL D:It is a massive worm form, many feet in length. Its vast maw drips acid D:and poison. @@ -7238,10 +11662,17 @@ B:GAZE:TERRIFY:2d4 B:GAZE:BLIND:2d4 B:BUTT:HURT:2d6 B:BITE:HURT:2d12 -F:ONLY_GOLD | DROP_2D2 | DROP_CORPSE -F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_POIS -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:WILD_SWAMP +F:WILD_TOO D:A strange ox-like form with a huge head but a thin, weak neck. N:448:Lesser wall monster @@ -7253,9 +11684,24 @@ O:0:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | KILL_WALL | RAND_50 | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RAND_50 S:MULTIPLY D:A sentient, moving section of wall. @@ -7267,15 +11713,29 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:MALE | -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | TPORT | TELE_TO | BLIND | CONF | -S:BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:BLIND +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CONF +S:HASTE S:S_MONSTER +S:TELE_TO +S:TPORT D:A fat mage with glasses. And considerable power, too - as you can D:tell from the size of his hat. @@ -7287,13 +11747,26 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:CRUSH:LOSE_INT:2d6 B:GAZE:INSANITY:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:ONLY_ITEM | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND -S:1_IN_8 | -S:BLIND | HOLD | SCARE | MIND_BLAST | BRAIN_SMASH | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_8 +S:BLIND +S:BRAIN_SMASH +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE D:A humanoid form with a gruesome head, tentacular mouth, and piercing D:eyes. Claws reach out for you and you feel a presence invade your mind. @@ -7307,9 +11780,26 @@ B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 B:CRUSH:HURT:2d10 -F:FORCE_SLEEP | FORCE_MAXHP | KILL_BODY | KILL_ITEM | UNIQUE | REFLECTING | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS -F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | RES_TELE | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_BODY +F:KILL_ITEM +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING +F:RES_TELE +F:UNIQUE D:It looks like a huge spiked roller. It was designed to keep this dungeon D:clean, and you are the biggest spot of dirt in sight. @@ -7323,12 +11813,27 @@ E:0:0:0:0:0:0 O:40:30:10:10 B:CRAWL:POISON:5d7 B:CRAWL:EAT_FOOD:5d7 -F:BASEANGBAND | EMPTY_MIND | SMART | IM_POIS | -F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_FEAR | -F:FORCE_MAXHP | UNIQUE | FEMALE | REGENERATE | -F:ONLY_ITEM | DROP_2D2 | DROP_GREAT | ESCORT | ESCORTS | +F:BASEANGBAND +F:CAN_SWIM +F:DROP_2D2 +F:DROP_GREAT +F:EMPTY_MIND +F:ESCORT +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_POIS +F:NO_FEAR +F:ONLY_ITEM +F:RAND_50 +F:REGENERATE +F:SMART +F:UNDEAD +F:UNIQUE S:1_IN_5 -S:ANIM_DEAD | S_KIN +S:ANIM_DEAD +S:S_KIN D:A ruler of mewlips. She might not be the most powerful of D:them all, but she is the smartest, and has her minions D:at her beck and call. @@ -7343,11 +11848,22 @@ B:GAZE:PARALYZE B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | -F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM | -F:MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_8 S:BR_POIS D:An evil reptile that preys on unsuspecting travellers. Its eyes stare D:deeply at you and your soul starts to wilt! @@ -7362,10 +11878,22 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:COLD:2d6 B:BITE:COLD:2d6 -F:MALE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | IM_COLD | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL +F:WILD_TOO +F:WILD_WASTE D:Melkor created trolls in mockery of Yavanna's Ents. This D:is a white troll with powerfully clawed hands. @@ -7380,13 +11908,28 @@ O:5:85:0:5 B:HIT:HURT:11d10 B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 -F:UNIQUE | CAN_SPEAK | FEMALE | -F:RAND_25 | EVIL | GIANT | FORCE_MAXHP | -F:DROP_GOOD | ONLY_ITEM | DROP_4D2 | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | KILL_ITEM | -F:IM_ACID | IM_FIRE | IM_COLD | IM_POIS | +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:GIANT +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE S:1_IN_5 -S:BA_ACID | BA_WATE | BO_ICEE +S:BA_ACID +S:BA_WATE +S:BO_ICEE D:A powerful, fierce ogress, consort to Morgoth, rumoured to D:be the mother of Gothmog, high captain of Balrogs. @@ -7402,12 +11945,24 @@ O:5:85:0:5 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:POISON:8d8 -F:UNIQUE | FEMALE | CAN_SPEAK | -F:EVIL | GIANT | FORCE_MAXHP | -F:DROP_GOOD | DROP_2D2 | ONLY_ITEM | -F:OPEN_DOOR | ESCORTS | IM_POIS | -S:1_IN_9 | -S:CONF | SCARE | HEAL | SHRIEK | S_KIN +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:GIANT +F:IM_POIS +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_9 +S:CONF +S:HEAL +S:SCARE +S:SHRIEK +S:S_KIN D:A powerful ogress, consort to Morgoth, rumoured to be D:the mother of Gothmog, high captain of Balrogs, also D:rumoured to be related to Lokkak, the Ogre Chieftain. @@ -7422,11 +11977,26 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | ESCORT | ESCORTS | CAN_SPEAK | -F:FORCE_MAXHP | SMART | SPECIAL_GENE -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_GREAT -F:OPEN_DOOR | BASH_DOOR -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SPECIAL_GENE +F:UNIQUE D:The slayer of Thingol, and the thief of the Nauglamir. He leads the dark D:dwarves who escaped from Nogrod. @@ -7440,13 +12010,27 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:MIMIC | -F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | CONF | SCARE | CAUSE_2 | FORGET | -S:BO_ACID | BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:MIMIC +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:SUSCEP_ACID +S:1_IN_4 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_2 +S:CONF +S:FORGET +S:SCARE S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -7460,13 +12044,25 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_10 S:BR_ELEC +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:deep blue in hue. Sparks crackle along its length. @@ -7479,13 +12075,25 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WASTE | -F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | -F:EVIL | DRAGON | IM_COLD | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +S:1_IN_10 S:BR_COLD +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:frosty white in hue. Icy blasts of cold air come from it as it breathes. @@ -7498,13 +12106,24 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_SWAMP | -F:DROP_2D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_POIS | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_POIS +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:deep green in hue. Foul gas seeps through its scales. @@ -7517,13 +12136,23 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_2D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | NO_CONF | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:NO_CONF +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_CONF +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:rich bronze hue, and its shape masks its true form. @@ -7539,13 +12168,25 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ESCORT | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE D:A member of a band of outlaws, he was spared his life when D:Neithan (that is, Turin) killed Forweg, the previous leader. @@ -7559,10 +12200,22 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:ONLY_GOLD | DROP_2D2 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:REFLECTING D:It is a massive statue of pure mithril. It looks expensive. N:465:Skeleton troll @@ -7574,10 +12227,20 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | TROLL | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:TROLL +F:UNDEAD D:It is a troll skeleton animated by dark magic. # New monster added for the Theme module @@ -7593,14 +12256,30 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | RES_TELE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HEAL | SLOW | TRAPS | BO_COLD | BA_POIS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_5 +S:BA_POIS +S:BO_COLD +S:HEAL +S:SLOW +S:TRAPS D:He's a trustworthy man... or is he? Morgoth seem's sending spies in D:disguise, and perhaps this is one of them. @@ -7614,11 +12293,26 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 -F:UNIQUE | MALE | FORCE_MAXHP | FORCE_SLEEP | -F:BASH_DOOR | ANIMAL | MOVE_BODY | SMART | PET | CAN_SPEAK | -F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | BASEANGBAND -S:1_IN_6 | S_ANIMAL +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:PET +F:SMART +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_6 +S:S_ANIMAL D:Beorn is only occasionally seen in human form these days, preferring to D:appear in the shape of a giant black bear: he also prefers the company of D:beasts to that of humans. He has never taken kindly to strangers, even in @@ -7633,9 +12327,18 @@ O:0:0:0:0 B:CLAW:HURT:16d2 B:CLAW:HURT:16d2 B:BITE:HURT:4d10 -F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET | -F:ANIMAL | GOOD | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:PET +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_VOLCANO D:Among the mightiest of birds, Thorondor is the messenger of the Valar, and D:brings news of Middle-earth to Valinor itself. Nothing that can be seen D:from the airs of the world is hidden from him. @@ -7647,10 +12350,15 @@ W:30:2:600:80 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:5d5 -F:RAND_25 | WILD_TOO | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_ELEC -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:WEIRD_MIND +F:WILD_TOO D:It is a giant ant that crackles with energy. N:470:Grave wight @@ -7662,13 +12370,27 @@ O:0:50:50:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EXP_20 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_1D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNDEAD +S:1_IN_8 +S:CAUSE_3 +S:DARKNESS +S:SCARE D:It is a ghostly form with eyes that haunt you. It appeared when a D:humanoid creature died a violent death in a graveyard. It remembers D:its past life and seeks revenge. @@ -7682,12 +12404,28 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:EXP_10:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | PASS_WALL | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BR_NETH | SLOW | CONF | SCARE | DARKNESS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +S:1_IN_6 +S:BR_NETH +S:CONF +S:DARKNESS +S:SCARE +S:SLOW D:It is a dragon-like form wrapped in shadow. Glowing red eyes shine out in D:the dark, and it is surrounded by an aura of unearthly cold that chills D:the soul rather than the body. @@ -7702,10 +12440,17 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | -F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND -S:1_IN_5 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:WILD_TOO +F:WILD_WOOD +S:1_IN_5 S:ARROW_4 D:It is a winged lion's body with a human torso and a tail covered in D:vicious spikes. @@ -7717,10 +12462,15 @@ W:30:3:600:90 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 -F:RAND_25 | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FRIENDS +F:KILL_BODY +F:MORTAL +F:RAND_25 +F:WEIRD_MIND D:An armoured form moving with purpose. Powerful on its own, flee when D:hordes of them march. @@ -7732,8 +12482,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:5d8 B:BITE:HURT:5d8 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS | DROP_CORPSE -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO D:It is a beetle with deadly sharp cutting mandibles and a rock-hard D:carapace. @@ -7747,10 +12504,18 @@ B:BUTT:HURT:3d9 B:BUTT:HURT:3d9 B:BITE:POISON:1d10 B:KICK:HURT:2d4 -F:FORCE_SLEEP | ANIMAL | MOVE_BODY | WILD_TOO | WILD_WOOD | -F:BASH_DOOR | IM_POIS | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_8 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:WILD_TOO +F:WILD_WOOD +S:1_IN_8 S:BR_POIS D:A bull-like creature whose skin is made of steel plates. @@ -7765,23 +12530,56 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:6d4 B:HIT:HURT:6d4 -F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:GOOD | IM_COLD | IM_FIRE | -F:IM_ELEC | IM_POIS | RES_WATE | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | HASTE | BLINK | TPORT | BLIND | CONF | SCARE | -S:CAUSE_2 | FORGET | TRAPS | -S:BA_ELEC | BA_COLD | BA_WATE | BO_WATE | BO_ICEE | BO_ELEC | -S:S_ANIMAL | -D:Sometimes belittled as a bird-loving fool, Radagast is weaker -D:mentally and magically than his fellows among the Istari. -D:Nonetheless, his knowledge of woodcraft and command over the -D:sky-borne elements makes Radagast a force to be reckoned with. - -N:477:Ghost +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REFLECTING +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +S:1_IN_6 +S:BA_COLD +S:BA_ELEC +S:BA_WATE +S:BLIND +S:BLINK +S:BO_ELEC +S:BO_ICEE +S:BO_WATE +S:CAUSE_2 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_ANIMAL +S:TPORT +S:TRAPS +D:Sometimes belittled as a bird-loving fool, Radagast is weaker +D:mentally and magically than his fellows among the Istari. +D:Nonetheless, his knowledge of woodcraft and command over the +D:sky-borne elements makes Radagast a force to be reckoned with. + +N:477:Ghost G:G:w I:120:13d8:20:30:10 W:31:1:0:350 @@ -7791,12 +12589,27 @@ B:WAIL:TERRIFY B:TOUCH:EXP_20 B:CLAW:LOSE_INT:1d6 B:CLAW:LOSE_WIS:1d6 -F:FORCE_SLEEP | RAND_25 | DROP_60 | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | CAN_FLY | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:HOLD D:An apparition from beyond. It does not seem friendly. N:478:Death watch beetle @@ -7807,8 +12620,14 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:5d4 B:WAIL:TERRIFY:5d6 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle that produces a chilling sound. N:479:Mountain ogre @@ -7819,10 +12638,16 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR D:The largest breed of ogre, he is awesomely strong and awesomely ugly. N:480:Nexus quylthulg @@ -7831,11 +12656,21 @@ I:110:10d12:10:1:0 W:32:1:3000:300 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | RES_NEXU | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND -S:1_IN_1 | -S:BLINK | TELE_AWAY +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_NEXU +F:RES_TELE +S:1_IN_1 +S:BLINK +S:TELE_AWAY D:It is a very unstable, strange pulsing mound of flesh. N:481:Shelob, Spider of Darkness @@ -7848,16 +12683,41 @@ B:CLAW:POISON:5d6 B:CLAW:POISON:5d6 B:BITE:PARALYZE:5d10 B:STING:LOSE_STR:5d4 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE | -F:ESCORT | ESCORTS | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_RANDART -F:SMART | BASH_DOOR | IM_POIS | IM_ACID | -F:ANIMAL | SPIDER | EVIL | HURT_LITE | NO_SLEEP | BASEANGBAND -S:1_IN_4 | -S:HEAL | BLIND | SLOW | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:TRAPS | BR_DARK | BR_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:ESCORT +F:ESCORTS +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +F:SPECIAL_GENE +F:SPIDER +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BR_DARK +S:BR_POIS +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:HEAL +S:SCARE +S:SLOW S:S_SPIDER +S:TRAPS D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the D:Unlight. She normally guards the pass through Cirith Ungol, but D:occasionally goes out foraging for food to feed her voracious appetite. @@ -7871,10 +12731,21 @@ O:0:0:0:0 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 -F:IM_ACID | RES_WATE | AQUATIC | ANIMAL | IM_COLD | MOVE_BODY -F:FORCE_MAXHP | WILD_TOO | WILD_OCEAN | BASEANGBAND | COLD_BLOOD +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:MOVE_BODY +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO S:1_IN_8 -S:BR_ELEC | BR_ACID | BR_POIS +S:BR_ACID +S:BR_ELEC +S:BR_POIS D:Besides being capable of dragging whole ships underwater, D:this creature can also reach you from a distance. @@ -7888,12 +12759,31 @@ B:CLAW:LOSE_STR:3d4 B:CLAW:DISEASE:3d4 B:CLAW:DISEASE:3d4 B:BITE:PARALYZE:3d5 -F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:DROP_1D2 | FORCE_MAXHP | ESCORT | FORCE_SLEEP | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD S:1_IN_7 -S:SCARE | HOLD | DARKNESS | SCARE | S_UNDEAD | ANIM_DEAD +S:ANIM_DEAD +S:DARKNESS +S:HOLD +S:SCARE +S:SCARE +S:S_UNDEAD D:Flesh is falling off in chunks from this decaying abomination. N:484:Doombat @@ -7905,9 +12795,16 @@ O:0:0:0:0 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 B:BITE:FIRE:5d4 -F:WEIRD_MIND | BASH_DOOR | AURA_FIRE | CAN_FLY | DROP_CORPSE | -F:IM_FIRE | AI_ANNOY | -F:ANIMAL | MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:IM_FIRE +F:MORTAL +F:WEIRD_MIND D:It is a fast moving creature of chaos, a gigantic black bat D:surrounded by flickering bright red flames. @@ -7920,11 +12817,19 @@ O:0:100:0:0 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | FRIENDS | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR D:One of the Swarthy Men, allied with the Dark since time D:immemorable. @@ -7936,11 +12841,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:1d4 B:HIT:CONFUSE:1d4 -F:FORCE_SLEEP | NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_6 S:FORGET D:A mass of vegetation. You don't remember seeing anything like it D:before. @@ -7953,11 +12864,31 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_ELEC | DROP_SKELETON | DROP_CORPSE | -F:EVIL | GIANT | IM_COLD | IM_ELEC | MALE | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BLINK | TELE_TO | CONF | SCARE | BO_ELEC | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_8 +S:BA_ELEC +S:BLINK +S:BO_ELEC +S:CONF +S:SCARE +S:TELE_TO D:It is a twenty-five-foot tall giant wreathed in lightning. N:488:Spectator @@ -7969,12 +12900,22 @@ O:0:0:0:0 B:GAZE:PARALYZE:1d4 B:GAZE:CONFUSE:1d4 B:BITE:HURT:1d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:STUPID | EMPTY_MIND | CAN_FLY | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND -S:1_IN_6 | -S:FORGET | CAUSE_2 | HOLD | SLOW +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_6 +S:CAUSE_2 +S:FORGET +S:HOLD +S:SLOW D:A lesser relative of the beholder: a globular body with a large toothy mouth, D:a large central eye, and four smaller eyes on stalks protruding from the top D:of its body. @@ -7990,13 +12931,38 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 -F:JOKEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_SHORE | -F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | CAN_SPEAK | -F:ANIMAL | MOVE_BODY | GOOD | SMART | BASH_DOOR | ONLY_ITEM | -F:DROP_2D2 | DROP_GOOD | DROP_GREAT | FORCE_SLEEP | NO_CUT | -F:NO_SLEEP | IM_ACID | IM_ELEC | IM_COLD | SUSCEP_POIS | IM_FIRE | -S:1_IN_5 | -S:BLINK | TELE_TO | TELE_AWAY | TPORT +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:DROP_GREAT +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +F:SUSCEP_POIS +F:UNIQUE +F:WILD_GRASS +F:WILD_SHORE +F:WILD_TOO +F:WILD_WOOD +S:1_IN_5 +S:BLINK +S:TELE_AWAY +S:TELE_TO +S:TPORT D:He is a descendant of Beorn to the 3.79th degree (his mother was D:Swedish, hence his name). He has blue eyes, bleached blond hair, D:and a tanned complexion. He signed up at the Adventurer's Guild @@ -8010,17 +12976,59 @@ I:200:440d100:255:1000:0 W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | -F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | -F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FEMALE +F:FORCE_DEPTH +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_DEATH +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:NO_THEFT +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_TOWN +F:WILD_WOOD +F:WYRM_PROTECT S:1_IN_1 -S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM +S:BR_MANA +S:BR_MANA +S:HAND_DOOM +S:HAND_DOOM +S:HAND_DOOM D:A Queen of the Valar, the spouse of Mandos, who weaves the D:tales of the history of Arda. @@ -8034,11 +13042,19 @@ B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:MALE | -F:FRIENDS | -F:ONLY_ITEM | DROP_90 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TROLL D:An unwholesome breed between a human and a troll. It is D:somewhat smarter than regular trolls. @@ -8049,17 +13065,59 @@ I:200:440d100:255:1000:0 W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | -F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | POWERFUL | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | -F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FORCE_DEPTH +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_DEATH +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:NO_THEFT +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_TOWN +F:WILD_WOOD +F:WYRM_PROTECT S:1_IN_1 -S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM +S:BR_MANA +S:BR_MANA +S:HAND_DOOM +S:HAND_DOOM +S:HAND_DOOM D:A Vala more commonly called Lorien, from the gardens of D:Lorien in Valinor. @@ -8073,12 +13131,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bill and Tom. @@ -8091,12 +13168,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bert and Tom. @@ -8109,12 +13205,31 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:SPECIAL_GENE +F:TAKE_ITEM +F:TROLL +F:UNIQUE +F:WILD_TOO +F:WILD_WOOD D:Big, brawny, powerful and with a taste for hobbit. He has friends called D:Bert and Bill. @@ -8128,10 +13243,20 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:MALE | -F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE | -F:EVIL | TROLL | IM_POIS | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL D:Trolls were created by Morgoth in mockery of the Ents. D:He is a vicious monster, feared for his ferocity. @@ -8142,17 +13267,59 @@ I:200:440d100:255:1000:0 W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | -F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | -F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FEMALE +F:FORCE_DEPTH +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_DEATH +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:NO_THEFT +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_TOWN +F:WILD_WOOD +F:WYRM_PROTECT S:1_IN_1 -S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM +S:BR_MANA +S:BR_MANA +S:HAND_DOOM +S:HAND_DOOM +S:HAND_DOOM D:A lady of the Valar, the spouse of Irmo. # New monster added by furiosity for the Theme module @@ -8190,12 +13357,27 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FRIENDS | DROP_60 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:HOLD | SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:HOLD +S:SCARE D:An evil spirit sent to dwell in the Barrow-downs by the Witch-king D:of Angmar during his wars with Arnor. @@ -8209,11 +13391,21 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:1d5 B:BITE:HURT:1d5 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | TROLL | UNDEAD | -F:IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:TROLL +F:UNDEAD D:It is the animated skeleton of a massive two-headed troll. N:501:Chaos drake @@ -8225,15 +13417,30 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:ATTR_MULTI | ATTR_ANY | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | RES_DISE | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | -F:IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_DISE | BR_CHAO +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +S:1_IN_6 +S:BR_CHAO +S:BR_DISE +S:CONF +S:SCARE +S:SLOW D:A dragon twisted by the forces of chaos. It seems first ugly, then fair, D:as its form shimmers and changes in front of your eyes. @@ -8246,14 +13453,29 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:DRAGON | EVIL | -F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_SOUN | BR_SHAR +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:SLOW D:This dragon is clever and cunning. You hear strange humming and D:rustling sounds as it approaches. @@ -8266,15 +13488,33 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | RES_DISE | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE -F:EVIL | DRAGON | CAN_FLY | -F:IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_SOUN | BR_SHAR | BR_DISE | BR_CHAO +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_DISE +S:1_IN_6 +S:BR_CHAO +S:BR_DISE +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:SLOW D:A mighty dragon, the balance drake seeks to maintain balance, D:and despises your efforts to upset it. @@ -8287,13 +13527,26 @@ O:40:50:10:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | CAN_FLY | -F:INVISIBLE | PASS_WALL | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_LITE | BR_DARK | BR_CONF +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +S:1_IN_6 +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF +S:SCARE +S:SLOW D:A dragon of great power with control over light and dark, the D:ethereal drake's eyes glare with white hatred from the shadows. @@ -8307,12 +13560,22 @@ B:HIT:HURT:9d1 B:HIT:HURT:6d5 B:HIT:HURT:25d1 B:HIT:HURT:6d5 -F:UNIQUE | MALE | WEIRD_MIND | CAN_SPEAK | -F:FORCE_MAXHP | WILD_TOO | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:DROP_CHOSEN | -F:OPEN_DOOR | BASH_DOOR | -F:IM_COLD | IM_POIS | JOKEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WEIRD_MIND +F:WILD_TOO D:He who laughs at Groo's brains will find there is nothing to laugh D:about... erm, nobody laughs at Groo and lives. @@ -8323,17 +13586,59 @@ I:200:440d100:255:1000:0 W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | -F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | -F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FEMALE +F:FORCE_DEPTH +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_DEATH +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:NO_THEFT +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_TOWN +F:WILD_WOOD +F:WYRM_PROTECT S:1_IN_1 -S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM +S:BR_MANA +S:BR_MANA +S:HAND_DOOM +S:HAND_DOOM +S:HAND_DOOM D:The spouse of Tulkas and sister to Orome, who delights in dancing D:on the green lawns of Valimar. @@ -8346,13 +13651,29 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:FORGET +S:HOLD D:A shadowy form clutches at you from the darkness. A powerful undead with D:a deadly touch. @@ -8365,13 +13686,28 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_WIS:5d5 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY | -F:COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | DRAIN_MANA | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:DRAIN_MANA +S:FORGET +S:HOLD D:A phantasmal shrieking spirit. Its wail drives the intense cold of pure D:evil deep within your body. @@ -8385,11 +13721,25 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HURT:2d2 B:HIT:HURT:2d2 -F:MALE | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:FRIENDS | DROP_60 | REGENERATE | -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO D:Trolls are said to have been created by Melkor in mockery of D:the Ents. He reeks of brackish water and mud. @@ -8401,12 +13751,28 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | AURA_FIRE | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BO_FIRE D:It is a towering inferno of flames. @@ -8441,12 +13807,25 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | CAN_FLY | -F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL | -F:IM_POIS | IM_ACID | IM_FIRE | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +S:1_IN_6 S:BO_COLD D:It is a towering tempest of water. @@ -8460,14 +13839,29 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d4 B:BITE:HURT:4d4 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | ATTR_MULTI | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:IM_ELEC | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BR_ACID | BR_POIS | BR_COLD | BR_FIRE | BR_ELEC +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS D:Shimmering in rainbow hues, this hound is beautiful and deadly. N:514:Invisible stalker @@ -8479,13 +13873,23 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:RAND_50 | -F:RES_TELE | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_ELEC +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:POWERFUL +F:RAND_50 +F:RES_TELE D:It is impossible to define its form but its violence is legendary. # New monster added by furiosity for the Theme module @@ -8495,17 +13899,59 @@ I:200:440d100:255:1000:0 W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | -F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL | -F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | -F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | -F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH | -F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | -F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC | +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEATH_ORB +F:DG_CURSE +F:FEMALE +F:FORCE_DEPTH +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_DEATH +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:NO_THEFT +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_ONLY +F:WILD_SHORE +F:WILD_TOWN +F:WILD_WOOD +F:WYRM_PROTECT S:1_IN_1 -S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM +S:BR_MANA +S:BR_MANA +S:HAND_DOOM +S:HAND_DOOM +S:HAND_DOOM D:The sister of Yavanna and spouse of Orome. D:Flowers open and birds sing at her passing. @@ -8519,12 +13965,22 @@ B:HIT:HURT:2d8 B:HIT:HURT:3d4 B:HIT:EAT_GOLD:4d4 B:HIT:EAT_ITEM:4d5 -F:MALE | -F:DROP_90 | DROP_2D2 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM S:1_IN_6 -S:TRAPS | ARROW_2 | BLINK +S:ARROW_2 +S:BLINK +S:TRAPS D:Cool and confident, fast and lithe; protect your possessions quickly! N:517:The Watcher in the Water @@ -8536,11 +13992,36 @@ O:50:50:0:0 B:CRUSH:ACID:8d8 B:CRUSH:POISON:8d8 B:CRUSH:PARALYZE:8d8 -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | AQUATIC | ANIMAL | -F:IM_ACID | IM_COLD | IM_POIS | RES_WATE | RES_TELE | DROP_CORPSE | -F:NO_CONF | NO_FEAR | EVIL | COLD_BLOOD | BASEANGBAND | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_1D2 | SPECIAL_GENE | DROP_RANDART -S:1_IN_5 | BA_WATE | BO_WATE | HOLD | BR_POIS | BO_ICEE | TELE_TO +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:ONLY_ITEM +F:RES_TELE +F:RES_WATE +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_5 +S:BA_WATE +S:BO_ICEE +S:BO_WATE +S:BR_POIS +S:HOLD +S:TELE_TO D:A vile creature which seems to consist mostly of tentacles, it seeks to D:drag people to their doom in the water. Few have ever escaped its grasp. @@ -8554,25 +14035,51 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d8 B:TOUCH:LOSE_DEX:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLINK | TELE_TO | TELE_AWAY | BLIND | HOLD | SLOW | SCARE | -S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH -D:It is a skeletal form dressed in robes. It radiates vast evil power. - -N:519:Gas spore -G:e:g +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:UNDEAD +S:1_IN_4 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:SLOW +S:TELE_AWAY +S:TELE_TO +D:It is a skeletal form dressed in robes. It radiates vast evil power. + +N:519:Gas spore +G:e:g I:110:25d10:30:1:5 W:34:4:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:DISEASE:30d2 -F:FORCE_SLEEP | -F:STUPID | EMPTY_MIND | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It does not look dangerous, yet you don't want to get D:any closer. @@ -8586,14 +14093,33 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_6 | -S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | -S:DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a humanoid form dressed in robes. Power emanates from its chilling D:frame. @@ -8607,14 +14133,36 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_4D2 | CAN_FLY | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | INVISIBLE | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | -F:BASEANGBAND | NO_CUT -S:1_IN_6 | -S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET | -S:DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:This ancient creature can transform into a mist at will. N:522:Greater mummy @@ -8627,15 +14175,46 @@ B:CLAW:LOSE_CON:3d6 B:CLAW:DISEASE:3d6 B:GAZE:EXP_40:3d4 B:GAZE:TERRIFY:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | NO_FEAR | EVIL | UNDEAD |COLD_BLOOD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_TELE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:HEAL | HASTE | BLIND | SCARE | S_UNDEAD | ANIM_DEAD | -S:BA_POIS | BA_NETH | BA_COLD | DRAIN_MANA | -S:MIND_BLAST | CAUSE_3 | DARKNESS | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:TAKE_ITEM +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_COLD +S:BA_NETH +S:BA_POIS +S:BLIND +S:CAUSE_3 +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HASTE +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_UNDEAD D:Once a powerful ruler, now an even more powerful undead menace. # New monster added for the Theme module @@ -8651,25 +14230,85 @@ B:GAZE:EAT_GOLD:10d10 B:CRUSH:HURT:10d10 B:TOUCH:UN_BONUS B:TOUCH:UN_POWER -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | FEMALE | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON | -F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | INVISIBLE | -F:SMART | MOVE_BODY | TAKE_ITEM | POWERFUL | RES_TELE | -F:REGENERATE | CAN_FLY | CAN_SWIM | DG_CURSE | WYRM_PROTECT | -F:GOOD | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_PLAS | RES_DISE | RES_NETH | RES_NEXU | RES_WATE | -F:NO_CONF | NO_FEAR | NO_SLEEP | NO_STUN | RES_TELE -F:MORTAL | PET | JOKEANGBAND | HAS_LITE -S:1_IN_2 | -S:S_BUG | S_HI_DRAGON | S_KIN | S_RNG | S_UNIQUE | -S:TELE_AWAY | TELE_LEVEL | TELE_TO | TPORT | -S:HAND_DOOM | HEAL | -S:BO_ICEE | BO_MANA | BO_PLAS | -S:BA_COLD | BA_MANA | BA_WATE | ROCKET | -S:BR_LITE | BR_DISE | BR_INER | BR_MANA | BR_NEXU | BR_SOUN | BR_TIME | -S:BRAIN_SMASH | FORGET | +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DG_CURSE +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PET +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_TELE +F:RES_WATE +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_2 +S:BA_COLD +S:BA_MANA +S:BA_WATE +S:BO_ICEE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:BR_DISE +S:BR_INER +S:BR_LITE +S:BR_MANA +S:BR_NEXU +S:BR_SOUN +S:BR_TIME +S:FORGET +S:HAND_DOOM +S:HEAL +S:ROCKET +S:S_BUG +S:S_HI_DRAGON +S:S_KIN +S:S_RNG +S:S_UNIQUE +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:A heavy-set, fair-haired figure who cruises through the dungeon in D:a strangely made magical cart of some kind. Wherever she travels, D:monsters and magical devices appear which no one on Arda has seen @@ -8685,9 +14324,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:STING:POISON:1d4 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON | F:ANIMAL -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant grey scorpion. It looks poisonous. N:525:Earth elemental @@ -8699,12 +14342,24 @@ O:0:0:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_8 | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +S:1_IN_8 S:BO_ACID D:It is a towering form composed of rock with fists of awesome power. @@ -8717,12 +14372,25 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:CONFUSE:1d4 B:HIT:HURT:1d10 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | COLD_BLOOD | CAN_FLY | -F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +S:1_IN_8 S:BO_ELEC D:It is a towering tornado of winds. @@ -8732,10 +14400,17 @@ I:110:32d8:2:24:70 W:27:1:0:140 B:SPORE:ELEC:5d4 B:SPORE:ELEC:5d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_ELEC | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_ELEC +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange growth on the dungeon floor, glowing and crackling with sparks. N:528:Sarnrog @@ -8747,12 +14422,26 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:1d6 -F:DROP_60 | ONLY_GOLD | EVIL | DEMON | FRIENDS | HURT_LITE | -F:WILD_TOO | WILD_MOUNTAIN | WILD_WASTE | -F:IM_POIS | IM_FIRE | IM_COLD | IM_ELEC | HURT_ROCK | NONLIVING | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DEMON +F:DROP_60 +F:EVIL +F:FRIENDS +F:HURT_LITE +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CUT +F:ONLY_GOLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE S:1_IN_12 -S:BR_ELEC | BR_FIRE +S:BR_ELEC +S:BR_FIRE D:A minor demonic servant of evil, it looks like it is made of stone. N:529:Malicious leprawn @@ -8763,12 +14452,22 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD | -F:HURT_LITE | EVIL | OPEN_DOOR | MALE | -F:MORTAL | BASEANGBAND -S:MULTIPLY | -S:1_IN_6 | -S:BLINK | TPORT | TELE_TO | CAUSE_1 +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:INVISIBLE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +S:1_IN_6 +S:BLINK +S:CAUSE_1 +S:MULTIPLY +S:TELE_TO +S:TPORT D:This little gnome has a fiendish gleam in his eyes. N:530:Eog golem @@ -8781,10 +14480,22 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:ONLY_GOLD | DROP_2D2 | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_GOLD +F:REFLECTING D:It is a massive deep brown statue, striding towards you with an D:all-too-familiar purpose. @@ -8802,19 +14513,56 @@ B:HIT:HURT:10d8 # Wearing a Greater Mimic for a symbiote B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | PET | -F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | CAN_SWIM | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_NETH | RES_DISE | AURA_FIRE | CAN_FLY | +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:PET +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD #Spells chez archery S:1_IN_3 -S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 | +S:ARROW_1 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 #Spells chez a Greater Mimic named Glorp -S:CAUSE_3 | BO_ACID | BO_ELEC | BO_FIRE | BO_COLD | -S:SCARE | BLIND | CONF | FORGET | S_MONSTER +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_3 +S:CONF +S:FORGET +S:SCARE +S:S_MONSTER D:An elf cloaked in green wielding a crossbow. He has sky blue D:eyes, straight black hair, and a fair face. He is the only D:child of a Telerin mage, and serves in King Thranduil's army. @@ -8831,11 +14579,18 @@ B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 B:HIT:POISON:3d4 -F:MALE | -F:DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR D:A human warrior from Khand, moving with lightning speed. N:533:Headless ghost @@ -8848,13 +14603,29 @@ B:TOUCH:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:5d5 B:CLAW:LOSE_WIS:5d5 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY | -F:COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | DRAIN_MANA | SCARE | BO_COLD | FORGET +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_90 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_COLD +S:DRAIN_MANA +S:FORGET +S:SCARE D:A phantasmal apparition with no head. N:534:Dread @@ -8866,13 +14637,30 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | RAND_25 | -F:ONLY_ITEM | DROP_60 | DROP_2D2 | -F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_NETH +S:CONF +S:DRAIN_MANA +S:HOLD D:Death incarnate, its hideous black body seems to struggle D:against reality as the universe itself struggles to banish it. @@ -8889,16 +14677,45 @@ O:50:0:50:0 B:BITE:HURT:1d1 B:INSULT:* B:WAIL:* -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | ANIMAL | -F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:AI_ANNOY | WEIRD_MIND | TAKE_ITEM | IM_POIS | -F:IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | POWERFUL | -S:1_IN_1 | +F:AI_ANNOY +F:ANIMAL +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MORTAL +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:TAKE_ITEM +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD +S:1_IN_1 # Good at sorcery: -S:BO_MANA | BO_MANA | BR_ELEC | BR_ACID | BO_MANA | -S:BR_LITE | BR_WALL | BR_FIRE | BR_COLD | BR_POIS | +S:BO_MANA +S:BO_MANA +S:BO_MANA +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_LITE +S:BR_POIS +S:BR_WALL D:He is one of five children of a brown Yeek. He is a credit to the D:family. He has dark brown eyes, straight black hair, and a dark D:complexion. He has an annoying habit of making strange "zizz" noises, @@ -8915,10 +14732,21 @@ B:GAZE:UN_BONUS:5d2 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_POWER:5d2 B:GAZE:UN_POWER:5d2 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | EVIL | BASEANGBAND | MORTAL -S:1_IN_5 | -S:CAUSE_2 | TELE_AWAY | BA_COLD | BO_ELEC | HOLD | DRAIN_MANA +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:MORTAL +S:1_IN_5 +S:BA_COLD +S:BO_ELEC +S:CAUSE_2 +S:DRAIN_MANA +S:HOLD +S:TELE_AWAY D:This six-eyed creature feeds on magic. N:537:Smoke elemental @@ -8929,13 +14757,25 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:2d6 B:ENGULF:HURT:2d6 -F:FORCE_SLEEP | -F:EMPTY_MIND | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_FLY | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:DARKNESS | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +S:1_IN_5 +S:BO_FIRE +S:DARKNESS D:It is a towering blackened form, crackling with heat. N:538:Olog @@ -8948,9 +14788,19 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:HURT:2d3 B:BITE:HURT:2d3 -F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_60 | REGENERATE | -F:SMART | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_POIS +F:OPEN_DOOR +F:REGENERATE +F:SMART +F:TROLL D:They say Melkor created trolls in mockery of the Ents. This is a D:massive troll, more intelligent than most of its kind, with needle- D:sharp fangs. @@ -8963,9 +14813,20 @@ E:1:1:1:2:1:1 O:100:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_90 | -F:SMART | EVIL | IM_POIS | IM_COLD | MALE | DROP_SKELETON | DROP_CORPSE -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART S:1_IN_3 S:ARROW_4 D:A rebel halfling who has rejected the tradition of archery. @@ -8980,11 +14841,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_GRAV D:Unfettered by the usual constraints of gravity, these unnatural creatures D:are walking on the walls and even the ceiling! The earth suddenly feels @@ -9000,11 +14867,26 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | TAKE_ITEM | COLD_BLOOD | -F:DROP_1D2 | DROP_4D2 | CAN_SWIM | -F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A disgusting animated blob of destruction. N:542:Inertia hound @@ -9017,11 +14899,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE | -F:BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_INER D:Bizarrely, this hound seems to be hardly moving at all, yet it approaches D:you with deadly menace. It makes you tired just to look at it. @@ -9036,12 +14924,17 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:FORCE_SLEEP | -F:FRIENDS | -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_WALL D:A deep brown shape is visible before you, its canine form strikes you with D:an almost physical force. The dungeon floor buckles as if struck by a @@ -9054,10 +14947,19 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:6d6 -F:FORCE_SLEEP | RAND_50 | NONLIVING | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +S:1_IN_4 S:BR_SHAR D:A howling blast of razor-sharp mountain fragments. @@ -9070,13 +14972,29 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_FIRE | CAN_SWIM | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_ACID +S:BO_ACID D:It is a towering mass of filth and ooze. N:546:Young black dragon @@ -9088,13 +15006,23 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_SWAMP | -F:DROP_3D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_ACID | BASEANGBAND | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:OPEN_DOOR +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_ACID +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:darkest black hue. Acid drips from its body. @@ -9107,8 +15035,11 @@ O:0:0:0:0 B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 -F:BASH_DOOR | DROP_CORPSE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:MORTAL D:A massive elephantine form with eyes twisted by madness. N:548:Giant fire ant @@ -9119,10 +15050,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | SUSCEP_COLD | -F:ANIMAL | IM_FIRE -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:IM_FIRE +F:KILL_BODY +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND D:A giant ant covered in shaggy fur. Its powerful jaws glow with heat. N:549:Cold-drake @@ -9134,13 +15072,28 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND | -F:HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +S:1_IN_9 S:BR_COLD +S:SCARE D:A large dragon, scales gleaming bright white. N:550:Xorn @@ -9153,11 +15106,20 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL D:A huge creature of the Earth. Able to merge with its element, it D:has four huge arms protruding from its enormous torso. @@ -9171,12 +15133,24 @@ B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:BITE:HURT:4d10 B:SPIT:ACID:4d8 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ESCORT | MOVE_BODY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | IM_COLD | IM_POIS | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TAKE_ITEM +F:TROLL +F:UNIQUE D:Trolls are abominations created by Melkor in mockery of the Ents. D:A massive and cruel troll of great power, drool slides caustically down D:his muscular frame. Despite his bulk, he strikes with stunning speed. @@ -9193,20 +15167,57 @@ O:25:25:25:25 B:HIT:HURT:5d12 B:HIT:HURT:5d12 B:HIT:SHATTER:5d12 -F:JOKEANGBAND | WILD_TOO | WILD_MOUNTAIN | WILD_WASTE | -F:UNIQUE | FEMALE | GOOD | DROP_CORPSE | SMART | -F:OPEN_DOOR | BASH_DOOR | HAS_LITE | CAN_SWIM | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_NETH | RES_DISE | CAN_FLY | NO_FEAR | PASS_WALL | -F:REFLECTING | REGENERATE | WEIRD_MIND | -F:KILL_BODY | RES_TELE | INVISIBLE | NO_STUN | -S:1_IN_4 | +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:KILL_BODY +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_TELE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WASTE +S:1_IN_4 # Spells chez Thaumaturgy, dead Morgy, and her being Maia: -S:BR_POIS | ROCKET | SHRIEK | BR_WALL | BR_INER | +S:BR_INER +S:BR_POIS +S:BR_WALL +S:ROCKET +S:SHRIEK # Spells chez Master Q named 'Fear' (though not all, she *is* Maia): -S:BLINK | TELE_TO | S_MONSTERS | S_ANIMALS | +S:BLINK +S:S_ANIMALS +S:S_MONSTERS +S:TELE_TO D:A mighty Maia of legend, associated with Vana. In the past, she D:dwelt on Middle-earth in the form of a beneficent but unseen force. D:She looks like she is a wall. It is rumoured that she has once @@ -9224,13 +15235,24 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:FORCE_SLEEP | -F:ONLY_ITEM | DROP_1D2 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_5 | -S:FORGET | MIND_BLAST +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +S:1_IN_5 +S:FORGET +S:MIND_BLAST D:An unholy creature of darkness. The aura emanating from this evil being D:saps your very soul. @@ -9243,13 +15265,27 @@ O:0:50:50:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:HOLD | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_7 +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE D:A tangible but ghostly form, made of grey fog. The air around it feels D:deathly cold. @@ -9263,13 +15299,29 @@ B:GAZE:PARALYZE B:CLAW:LOSE_CON:1d10 B:CLAW:LOSE_CON:1d10 B:GAZE:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | -F:DROP_60 | DROP_90 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:CONF | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_7 +S:CAUSE_3 +S:CONF +S:DARKNESS +S:SCARE D:Back from the grave, to wreak vengeance upon the living. A skeletal figure D:wearing a black robe, with eyes that burn with undying hatred. @@ -9282,15 +15334,33 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:3d8 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_1D2 | DROP_3D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_8 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:SCARE D:It has a form that legends are made of. Beautiful scales of shimmering D:and magical colours cover it. @@ -9306,14 +15376,41 @@ O:50:50:0:0 B:CLAW:HURT:10d8 B:CLAW:HURT:10d8 B:CLAW:HURT:10d8 -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | -F:UNIQUE | FEMALE | CAN_SPEAK | GOOD | DROP_CORPSE | -F:SMART | PET | OPEN_DOOR | BASH_DOOR | HAS_LITE | -F:CAN_FLY | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | DRAGON | -F:NO_SLEEP | NO_CONF | NO_FEAR | MOVE_BODY | POWERFUL | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -S:1_IN_4 | -S:BR_FIRE | BR_COLD | BR_ELEC | BR_ACID | BR_POIS | +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:PET +F:POWERFUL +F:SMART +F:UNIQUE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_4 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS D:She is a small, but fierce dragon - so fierce that in her fury she D:appears to be one of the Great Worms. She has turned away from D:Morgoth and worships Tulkas Astaldo. She intensely dislikes vampires @@ -9330,12 +15427,22 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NONLIVING | REFLECTING | -F:NO_CONF | NO_SLEEP | NO_FEAR -F:MORTAL | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:REFLECTING S:1_IN_8 S:ARROW_4 D:An enormous construct resembling a titan made from stone. It strides @@ -9351,13 +15458,24 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_3D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | -F:EVIL | DRAGON | BASEANGBAND | NO_STUN | HAS_LITE | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_STUN +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_10 S:BR_SOUN +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:tarnished gold hue, and light is reflected from its form. @@ -9370,14 +15488,26 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_4D2 | DROP_CORPSE -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 S:BR_ELEC +S:SCARE D:A large dragon, scales tinted deep blue. N:561:Green drake @@ -9389,14 +15519,26 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_4D2 | DROP_CORPSE | -F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD +S:1_IN_9 S:BR_POIS +S:SCARE D:A large dragon, scales tinted deep green. N:562:Bronze drake @@ -9408,13 +15550,25 @@ O:50:50:0:0 B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_4D2 | CAN_FLY | -F:BASH_DOOR | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_9 S:BR_CONF +S:CONF +S:SCARE D:A large dragon with scales of rich bronze. N:563:Young red dragon @@ -9426,13 +15580,26 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD | -F:DROP_3D2 | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE -F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_10 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:OPEN_DOOR +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_10 S:BR_FIRE +S:SCARE D:It has a form that legends are made of. Its still-tender scales are a D:deepest red hue. Heat radiates from its form. @@ -9450,20 +15617,58 @@ B:CHARGE:HURT:10d8 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:WILD_WASTE | WILD_MOUNTAIN | WILD_SHORE | -F:UNIQUE | MALE | GOOD | SMART | UNDEAD | REFLECTING | -F:OPEN_DOOR | BASH_DOOR | HAS_LITE | CAN_SWIM | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_NETH | RES_DISE | AURA_FIRE | CAN_FLY | REGENERATE | -F:NO_STUN | KILL_BODY | NO_FEAR | WEIRD_MIND | +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_4D2 +F:DROP_GREAT +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_BODY +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:SMART +F:UNDEAD +F:UNIQUE +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_SHORE +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD #Spells chez Mindcraft S:1_IN_3 -S:BRAIN_SMASH | FORGET | MIND_BLAST | +S:BRAIN_SMASH +S:FORGET +S:MIND_BLAST #Spells chez an Ultimate Mimic: -S:CAUSE_3 | BA_POIS | SCARE | BLIND | CONF | S_MONSTER +S:BA_POIS +S:BLIND +S:CAUSE_3 +S:CONF +S:SCARE +S:S_MONSTER D:He is the head of the unholy holy order of Nosferatu. His nephew D:Sir Otilc played with swords and died as a result. Sir Physt is D:out to rectify the situation with his fists and his mind. Tulkas @@ -9481,11 +15686,19 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:PARALYZE:15d1 B:HIT:PARALYZE:15d1 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:INVISIBLE | EMPTY_MIND | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | BASEANGBAND +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP D:This creature traps unsuspecting victims D:and paralyzes them, to be slowly digested later. @@ -9498,13 +15711,24 @@ O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:GAZE:EXP_20 -F:FORCE_SLEEP | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_FIRE | NONLIVING | -F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:EVIL +F:FORCE_SLEEP F:HAS_LITE -S:1_IN_4 | -S:BO_FIRE | BA_FIRE | -S:S_DEMON | +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_4 +S:BA_FIRE +S:BO_FIRE +S:S_DEMON D:It is a humanoid form composed of flames and hatred. Adanroeg are D:humans corrupted by the evil forces of Morgoth into demonic slaves D:to evil. @@ -9516,10 +15740,19 @@ W:36:5:0:50 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:TIME:30d2 -F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI | -F:NEVER_MOVE | FORCE_MAXHP | -F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT +F:ATTR_CLEAR +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:INVISIBLE +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It was left here to be used against intruders. N:568:Rawrog @@ -9530,12 +15763,24 @@ E:1:1:1:0:1:1 O:0:0:0:0 B:CLAW:HURT:5d6 B:CLAW:HURT:5d6 -F:FORCE_SLEEP | PASS_WALL | INVISIBLE | -F:IM_POIS | IM_COLD | IM_ACID | IM_FIRE | -F:NO_SLEEP | NO_CONF | NO_STUN | NONLIVING | -F:EVIL | DEMON | BASEANGBAND -S:1_IN_4 | -S:BLINK | DARKNESS | S_DEMON +F:BASEANGBAND +F:DEMON +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:PASS_WALL +S:1_IN_4 +S:BLINK +S:DARKNESS +S:S_DEMON D:It resembles a lion standing on two feet. In fact, Rawroeg are D:lions corrupted by Morgoth into demonic servants of evil. @@ -9552,20 +15797,58 @@ O:25:25:25:25 B:HIT:HURT:1d1 B:INSULT:* B:SHOW:* -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | -F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | ANIMAL | -F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | CAN_SWIM | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:PASS_WALL | NO_SLEEP | REGENERATE | REFLECTING | -F:AURA_FIRE | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | -F:IM_POIS | NO_CONF | RES_PLAS | RES_DISE | RES_NEXU | -F:RES_NETH | RES_WATE | +F:ANIMAL +F:AURA_FIRE +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:PASS_WALL +F:REFLECTING +F:REGENERATE +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD S:1_IN_5 # Spells chez symbiote skull druj: -S:BA_WATE | MIND_BLAST | BRAIN_SMASH | CAUSE_2 | -S:BO_PLAS | SLOW | TRAPS | S_UNDEAD | BO_NETH | +S:BA_WATE +S:BO_NETH +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_2 +S:MIND_BLAST +S:SLOW +S:S_UNDEAD +S:TRAPS # Spells chez thaumaturgy and having killed Morgy: -S:BR_SOUN | BR_MANA | BR_NUKE | BR_DISI | ROCKET | +S:BR_DISI +S:BR_MANA +S:BR_NUKE +S:BR_SOUN +S:ROCKET D:A yeek bard more famous for his buff physique and marriage to the beautiful D:but dumb Jessica Yeekson than his music. The dark forces of Morgoth killed D:his friend Justin TimberYeek and kidnapped poor Jessica Yeekson, and Nick @@ -9583,13 +15866,27 @@ O:0:0:0:0 B:TOUCH:COLD:4d3 B:HIT:HURT:4d6 B:TOUCH:COLD:4d3 -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | AURA_COLD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_COLD | IM_ELEC | CAN_SWIM | IM_POIS | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ICEE | BA_COLD +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +S:1_IN_5 +S:BA_COLD +S:BO_ICEE D:It is a towering glacier. N:571:Necromancer @@ -9600,16 +15897,32 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HASTE | TPORT | TELE_TO | BLIND | HOLD | SCARE | CAUSE_3 | -S:BO_NETH | MIND_BLAST | FORGET | -S:S_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:FORGET +S:HASTE +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_UNDEAD +S:TELE_TO +S:TPORT D:A gaunt figure, clothed in black robes. # New monster added by furiosity for the Theme module @@ -9625,15 +15938,38 @@ B:HIT:HURT:10d8 B:PUNCH:HURT:10d8 B:KICK:HURT:10d8 B:CHARGE:HURT:10d8 -F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS| -F:UNIQUE | FEMALE | GOOD | DROP_CORPSE | SMART | -F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | -F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | -F:NO_SLEEP | NO_CONF | CAN_SWIM | REGENERATE | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_NEXU | MOVE_BODY | KILL_WALL | CAN_FLY | +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GREAT +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:KILL_WALL +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_NEXU +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD #Well, she has a boomerang: -S:1_IN_4 | +S:1_IN_4 S:ARROW_2 D:A lithe female wood-elf wearing no armour - she is D:a monk of Manwe Sulimo, one of the most feared of her order. @@ -9652,14 +15988,26 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:TELE_TO | S_MONSTERS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_4 +S:S_MONSTERS +S:TELE_TO D:A mighty warrior from the east, Lorgan hates everything that he cannot D:control. @@ -9673,9 +16021,17 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | IM_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_COLD +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large feline that is well-adapted to extremely cold D:environments. @@ -9687,11 +16043,23 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_MAXHP | -F:DROP_60 | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | TROLL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_60 +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:UNDEAD D:It is a massive figure clothed in wrappings. You are wary of its massive D:fists. @@ -9703,13 +16071,24 @@ B:ENGULF:EXP_80:5d5 B:ENGULF:UN_POWER:5d5 B:ENGULF:UN_BONUS:5d5 B:HIT:LOSE_ALL:5d5 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_50 | RAND_25 | NONLIVING | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_TIME | BR_DISE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_DISE +S:BR_TIME D:Howling through the disintegrating dungeon, this awesome whirlpool of Unmagic D:rips the enchantments from everything it touches. @@ -9723,13 +16102,31 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d10 B:TOUCH:LOSE_DEX:2d10 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | RES_TELE | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | TELE_AWAY | TELE_LEVEL | -S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:TELE_AWAY +S:TELE_LEVEL +S:TELE_TO D:It is a skeletal form dressed in robes. It looks evil and devious. N:578:Chaos butterfly @@ -9741,12 +16138,19 @@ O:0:0:0:0 B:CLAW:HURT:3d7 B:CLAW:HURT:3d7 B:CRUSH:HURT:10d5 -F:FORCE_SLEEP | -F:CAN_FLY | -F:WEIRD_MIND | BASH_DOOR | ATTR_MULTI | ATTR_ANY | -F:NO_CONF | NO_SLEEP | MORTAL | JOKEANGBAND +F:ATTR_ANY +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:JOKEANGBAND +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:WEIRD_MIND S:1_IN_9 -S:BR_CONF | BR_CHAO +S:BR_CHAO +S:BR_CONF D:With fractal patterns on its wings, it is clearly one of those butterflies D:that mathematicians keep talking about - the ones that flap their wings on the D:other side of the world to cause storms here. Now's your chance to stop it. @@ -9759,11 +16163,23 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TIME:3d4 B:TOUCH:TIME:3d4 -F:PASS_WALL | IM_POIS | IM_FIRE | IM_ELEC | IM_FIRE | IM_ACID | CAN_FLY | -F:NO_CONF | NO_SLEEP | EMPTY_MIND | KILL_ITEM | RAND_50 | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 S:1_IN_7 -S:SLOW | BR_TIME | +S:BR_TIME +S:SLOW D:You have not seen it yet. N:580:Blue yeek @@ -9773,10 +16189,14 @@ W:2:1:700:4 E:1:1:1:2:1:1 O:25:0:0:55 B:HIT:HURT:1d5 -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR D:A small humanoid figure. N:581:The Queen Ant @@ -9789,14 +16209,25 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d8 B:BITE:HURT:2d8 -F:UNIQUE | FEMALE | GOOD | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:WEIRD_MIND | OPEN_DOOR | BASH_DOOR | -F:ANIMAL | -F:MORTAL | BASEANGBAND -S:1_IN_2 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +F:WEIRD_MIND +S:1_IN_2 S:S_KIN D:She's upset because she thinks you hurt her children. @@ -9810,13 +16241,34 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HALLU:1d9 B:HIT:HALLU:1d9 -F:FORCE_SLEEP | FORCE_MAXHP | RAND_50 | -F:SMART | EMPTY_MIND | INVISIBLE | -F:PASS_WALL | POWERFUL | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_2 | -S:BLINK | TPORT | CONF | CAUSE_2 +F:BASEANGBAND +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:RAND_50 +F:SMART +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_2 +S:BLINK +S:CAUSE_2 +S:CONF +S:TPORT D:A strange ball of glowing light. It disappears and reappears and seems to D:draw you to it. You seem somehow compelled to stand still and watch its D:strange dancing motion. @@ -9828,10 +16280,14 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR D:It is a strange small humanoid. N:584:Magma elemental @@ -9843,13 +16299,28 @@ O:0:0:0:0 B:HIT:FIRE:3d7 B:HIT:HURT:4d6 B:HIT:FIRE:3d7 -F:FORCE_SLEEP | -F:EMPTY_MIND | AURA_FIRE | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_ELEC | IM_ACID | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_7 | -S:BO_PLAS | BA_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_7 +S:BA_FIRE +S:BO_PLAS D:It is a towering glowing form of molten rock. N:585:Black pudding @@ -9862,13 +16333,28 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:FORCE_MAXHP | -F:FRIENDS | -F:DROP_60 | DROP_90 | DROP_1D2 | -F:STUPID | EMPTY_MIND | COLD_BLOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_SWIM | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:DROP_90 +F:EMPTY_MIND +F:FORCE_MAXHP +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:STUPID +F:TAKE_ITEM D:A lump of rotting black flesh that slurps across the dungeon floor. N:586:Killer iridescent beetle @@ -9880,10 +16366,18 @@ O:0:0:0:0 B:CLAW:ELEC:1d12 B:CLAW:ELEC:1d12 B:GAZE:PARALYZE -F:ATTR_MULTI | FORCE_MAXHP | -F:WEIRD_MIND | BASH_DOOR | AURA_ELEC | DROP_CORPSE | -F:ANIMAL | IM_ELEC | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:ATTR_MULTI +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ELEC +F:MORTAL +F:WEIRD_MIND D:It is a giant beetle, whose carapace shimmers with vibrant energies. N:587:Nexus vortex @@ -9893,11 +16387,23 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:5d5 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | RES_NEXU | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_NEXU +F:RES_TELE +S:1_IN_6 S:BR_NEXU D:A maelstrom of potent magical energy. @@ -9909,12 +16415,26 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:4d8 B:ENGULF:ELEC:4d8 -F:FORCE_SLEEP | SUSCEP_COLD | -F:RAND_50 | RAND_25 | RES_PLAS | AURA_FIRE | AURA_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:IM_FIRE | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_PLAS +F:SUSCEP_COLD +S:1_IN_6 S:BR_PLAS D:A whirlpool of intense flame, charring the stones at your feet. @@ -9927,14 +16447,29 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO | -F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE | SUSCEP_COLD | -F:BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:SUSCEP_COLD +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_9 S:BR_FIRE +S:CONF +S:SCARE D:A large dragon, scales tinted deep red. N:590:Golden drake @@ -9946,13 +16481,26 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | -F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_SLEEP +F:NO_STUN +F:WILD_MOUNTAIN +F:WILD_TOO +S:1_IN_9 S:BR_SOUN +S:CONF +S:SCARE D:A large dragon with scales of gleaming gold. N:591:Crystal drake @@ -9964,14 +16512,29 @@ O:50:50:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_3D2 | REFLECTING | -F:OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +S:1_IN_6 S:BR_SHAR +S:CONF +S:SCARE +S:SLOW D:A dragon of strange crystalline form. Light shines through it, dazzling D:your eyes with spectra of colour. @@ -9984,13 +16547,26 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:DROP_1D2 | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_MOUNTAIN | -F:BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:NO_CONF +F:NO_SLEEP +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_9 S:BR_ACID +S:SCARE D:A large dragon, with scales of deepest black. N:593:Multi-hued drake @@ -10002,15 +16578,35 @@ O:50:50:0:0 B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:4d12 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_2D2 | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_7 | -S:BLIND | CONF | SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_7 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A large dragon, scales shimmering many colours. N:594:Master yeek @@ -10020,14 +16616,23 @@ W:12:2:600:28 E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d8 -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL | IM_ACID | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:BLINK | TPORT | BLIND | SLOW | BA_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:MORTAL +F:OPEN_DOOR +S:1_IN_4 +S:BA_POIS +S:BLIND +S:BLINK +S:SLOW S:S_MONSTER +S:TPORT D:A small humanoid that radiates some power. N:595:Orfax, son of Boldor @@ -10040,16 +16645,32 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d9 B:INSULT:* B:INSULT:* -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:ANIMAL | EVIL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:HEAL | BLINK | TELE_TO | SLOW | CONF | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_4 +S:BLINK +S:CONF +S:HEAL +S:SLOW S:S_MONSTER +S:TELE_TO D:The son of the yeek King, he has some power, but he's still a yeek. N:596:Boldor, King of the Yeeks @@ -10061,16 +16682,34 @@ O:0:90:10:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d9 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_CORPSE | -F:ANIMAL | EVIL | IM_ACID | -F:MORTAL | BASEANGBAND -S:1_IN_2 | -S:HEAL | BLINK | TPORT | BLIND | SLOW | -S:S_KIN | S_MONSTER +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:BLIND +S:BLINK +S:HEAL +S:SLOW +S:S_KIN +S:S_MONSTER +S:TPORT D:A great yeek, powerful in magic and sorcery, but a yeek all the same. N:597:Black Numenorean @@ -10082,12 +16721,26 @@ O:0:90:0:10 B:HIT:EXP_20:6d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_NETH | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_COLD | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_3 | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:NO_CUT +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:SMART +S:1_IN_5 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:SCARE S:S_MONSTERS D:It is a humanoid figure dressed in armour of an ancient form. From beneath D:its helmet, eyes glow a baleful red and seem to pierce you like lances of @@ -10104,13 +16757,27 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | TAKE_ITEM | BASH_DOOR | -F:EVIL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | TRAPS | BO_FIRE | BO_COLD | BO_ELEC | BO_ICEE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_2 +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:BO_ICEE +S:HEAL +S:TRAPS D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and D:evil. @@ -10121,13 +16788,22 @@ W:38:4:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:TIME:5d5 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_TIME -D:You haven't seen it yet. +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_TIME +D:You haven't seen it yet. N:600:Shimmering vortex G:v:o @@ -10137,12 +16813,24 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:BLIND:4d4 B:ENGULF:BLIND:4d4 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BR_LITE | SHRIEK +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_TELE +S:1_IN_4 +S:BR_LITE +S:SHRIEK D:A strange pillar of shining light that hurts your eyes. Its shape changes D:constantly as it cuts through the air towards you. It is like a beacon, D:waking monsters from their slumber. @@ -10156,14 +16844,29 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:ELEC:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_ELEC +S:CONF +S:SCARE D:A huge draconic form. Lightning crackles along its length. N:602:Ancient bronze dragon @@ -10175,13 +16878,28 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_CONF +S:CONF +S:SCARE D:A huge draconic form enveloped in a cascade of colour. N:603:Beholder @@ -10194,12 +16912,30 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY | -F:BASH_DOOR | DROP_CORPSE | -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | -S:FORGET | DARKNESS | BO_ACID | BO_FIRE | BO_COLD | BO_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SCARE +S:SLOW D:A vile creature with one huge central eye, twelve smaller eyes on stalks, and D:a huge mouth filled with sharp teeth. @@ -10213,13 +16949,29 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | CAN_FLY | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:HOLD | SCARE | CAUSE_3 | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +S:1_IN_6 +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:Your life force is torn from your body as this powerful unearthly being D:approaches. @@ -10232,10 +16984,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:3d12 B:BITE:POISON:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | -F:ANIMAL | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:IM_POIS +F:KILL_BODY +F:MORTAL +F:WEIRD_MIND D:A giant ant covered in shaggy fur. Its powerful jaws drip venom. N:606:Vargo, Tyrant of Fire @@ -10248,14 +17006,33 @@ B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 -F:UNIQUE | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | CAN_SPEAK | -F:EMPTY_MIND | CAN_SPEAK | MALE | AURA_FIRE | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_ACID | IM_POIS | IM_ELEC | NO_STUN | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_4 | -S:BO_PLAS | BA_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SPEAK +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:RAND_25 +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_4 +S:BA_FIRE +S:BO_PLAS D:A towering fire elemental, Vargo burns everything beyond recognition. N:607:Black wraith @@ -10268,13 +17045,30 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_40 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP -F:BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:A figure that seems made of void, its strangely human shape is cloaked in D:shadow. It reaches out at you. @@ -10287,9 +17081,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:BLIND:3d12 B:BITE:BLIND:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | ANIMAL | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:KILL_BODY +F:MORTAL +F:WEIRD_MIND D:A giant ant covered in shaggy fur. Its powerful jaws click with blinding speed. # New monster added by furiosity for the Theme module @@ -10301,9 +17101,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:3d12 B:BITE:CONFUSE:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | ANIMAL | NO_CONF | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:KILL_BODY +F:MORTAL +F:NO_CONF +F:WEIRD_MIND D:A giant ant covered in shaggy fur. Its powerful jaws make puzzling D:noises as they snap shut. @@ -10316,10 +17123,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d12 B:BITE:HURT:3d12 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | CAN_SWIM | -F:ANIMAL | RES_WATE | AQUATIC | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:KILL_BODY +F:MORTAL +F:RES_WATE +F:WEIRD_MIND S:1_IN_4 S:BA_WATE D:A strange antlike creature, animated by a powerful wizard you @@ -10335,14 +17150,37 @@ B:KICK:HURT:24d1 B:KICK:HURT:24d1 B:CLAW:EXP_80:4d2 B:CLAW:LOSE_DEX:4d2 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SMART | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:SCARE +S:TELE_TO D:A skeletal form wrapped in priestly robes. Before its un-death, it D:was a monk in an evil order. @@ -10356,13 +17194,31 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BLIND | SCARE | CAUSE_3 | MIND_BLAST | DARKNESS | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +S:1_IN_6 +S:BLIND +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:MIND_BLAST +S:SCARE D:A form that hurts the eye, death permeates the air around it. As it nears D:you, a coldness saps your soul. @@ -10375,11 +17231,22 @@ O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD | -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE | -S:1_IN_5 | BR_FIRE +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_5 +S:BR_FIRE D:It is a giant dog that glows with heat. Flames pour from its nostrils. N:614:7-headed hydra @@ -10392,13 +17259,25 @@ B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:SPIT:BLIND:1d2 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | CAN_SWIM | DROP_CORPSE -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND -S:1_IN_5 | -S:SCARE | BA_POIS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_POIS S:BR_POIS +S:SCARE D:A strange reptilian creature with seven heads dripping venom. N:615:Waldern, King of Water @@ -10411,14 +17290,29 @@ B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:UNIQUE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_FIRE | IM_POIS | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BO_ICEE | BO_WATE | BA_COLD | BA_WATE +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BA_COLD +S:BA_WATE +S:BO_ICEE +S:BO_WATE D:A towering water elemental, Waldern is master of all things liquid. D:Wave after wave drowns your frail body. @@ -10431,10 +17325,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 -F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON -F:WEIRD_MIND | BASH_DOOR | SUSCEP_FIRE | -F:ANIMAL | AI_ANNOY | KILL_TREES | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:FORCE_MAXHP +F:FRIENDS +F:KILL_BODY +F:KILL_TREES +F:MORTAL +F:SUSCEP_FIRE +F:WEIRD_MIND S:MULTIPLY D:An extremely annoying antlike creature. Its bulbous eyes seem D:almost covetous as they focus on your wooden paraphernalia. @@ -10448,14 +17350,29 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:COLD:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND -F:HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +F:SUSCEP_FIRE +S:1_IN_6 +S:BLIND S:BR_COLD +S:CONF +S:SCARE D:A huge draconic form. Frost covers it from head to tail. N:618:Ancient green dragon @@ -10467,14 +17384,29 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:POISON:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_POIS +S:CONF +S:SCARE D:A huge draconic form enveloped in clouds of poisonous vapour. # New monster added by furiosity for the Theme module @@ -10487,9 +17419,19 @@ O:0:0:0:0 B:BITE:TERRIFY:1d3 B:CLAW:COLD:1d2 B:CLAW:COLD:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | IM_COLD | -F:SUSCEP_FIRE | MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_COLD +F:MORTAL +F:RAND_50 +F:SUSCEP_FIRE +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat adapted to extremely cold temperatures. N:620:Eldrak @@ -10502,10 +17444,23 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:HURT:3d4 B:BITE:HURT:3d4 -F:FORCE_MAXHP | MOVE_BODY | -F:ONLY_ITEM | DROP_2D2 | REGENERATE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_SHORE | WILD_WOOD | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | DROP_CORPSE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TAKE_ITEM +F:TROLL +F:WILD_SHORE +F:WILD_WOOD D:Melkor created trolls in mockery of the Ents. A massive troll of D:huge strength, extremely stupid and extremely violent. @@ -10519,10 +17474,24 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 B:BITE:HURT:3d8 -F:FORCE_MAXHP | REGENERATE | MOVE_BODY | -F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_SWAMP | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:TROLL +F:WILD_MOUNTAIN +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:Melkor created trolls in mockery of the Ents. A massive two-headed troll, D:larger and stronger than many men together. @@ -10536,11 +17505,22 @@ B:BITE:EXP_80:2d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:CONFUSE:6d6 -F:FORCE_MAXHP | -F:ONLY_GOLD | DROP_2D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:HAS_LITE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:OPEN_DOOR +F:UNDEAD D:A fearsome skeletal horse with glowing eyes that watch you with little D:more than hatred for all that lives. Its flying hooves do not touch the D:ground. @@ -10555,14 +17535,35 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_80:4d6 B:BITE:EXP_80:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_60 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE D:A foul wind chills your bones as this ghastly figure approaches. N:624:Ancient black dragon @@ -10574,13 +17575,28 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:ACID:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_3D2 | DROP_4D2 | DROP_CORPSE | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_ACID +S:CONF +S:SCARE D:A huge draconic form. Pools of acid melt the floor around it. N:625:Weird fume @@ -10591,13 +17607,29 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:CONFUSE:8d4 B:ENGULF:CONFUSE:8d4 -F:FORCE_SLEEP | -F:RAND_50 | RAND_25 | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:CAN_FLY | ATTR_MULTI | ATTR_ANY | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | JOKEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_CHAO | BR_NEXU | BR_NUKE +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_ELEC +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_NEXU +S:1_IN_6 +S:BR_CHAO +S:BR_NEXU +S:BR_NUKE D:A swirling spiral of mist, constantly changing its appearance. # New monster added by furiosity for the Theme module @@ -10610,9 +17642,17 @@ O:0:0:0:0 B:BITE:TERRIFY:1d3 B:CLAW:PARALYZE:1d2 B:CLAW:HURT:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat whose very presence makes you feel weary. # New monster added by furiosity for the Theme module @@ -10625,9 +17665,17 @@ O:0:0:0:0 B:BITE:LOSE_DEX:1d3 B:CLAW:HALLU:1d2 B:CLAW:HURT:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat, its wings shimmering a pale mesmerizing silver. # New monster added by furiosity for the Theme module @@ -10640,9 +17688,17 @@ O:0:0:0:0 B:BITE:LOSE_CHR:1d3 B:CLAW:EAT_LITE:1d2 B:CLAW:EAT_LITE:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat which seems to absorb all light as it passes. N:629:Shadowfax, steed of Gandalf @@ -10654,10 +17710,25 @@ O:0:0:0:0 B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:BITE:HURT:6d6 -F:FORCE_MAXHP | UNIQUE | ANIMAL | GOOD | NEUTRAL | NO_TARGET | -F:REGENERATE | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | -F:IM_POIS | NO_FEAR | DROP_CORPSE | WILD_ONLY | WILD_WOOD | WILD_GRASS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_MAXHP +F:GOOD +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NEUTRAL +F:NO_FEAR +F:NO_TARGET +F:REGENERATE +F:UNIQUE +F:WILD_GRASS +F:WILD_ONLY +F:WILD_WOOD D:Shadowfax is the chief of the Mearas, the greatest of all horses that are D:bred in the fields of Rohan. Although the Mearas should technically be only D:ridden by the royal family of Rohan, only Gandalf the Wizard has ever @@ -10673,11 +17744,20 @@ O:10:90:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:FORCE_MAXHP | -F:DROP_90 | -F:INVISIBLE | PASS_WALL | CAN_FLY | -F:EVIL | TROLL | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_FLY +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:TROLL D:A ghostly troll-like being from the ethereal plane. N:631:War troll @@ -10690,10 +17770,22 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:FORCE_MAXHP | SUSCEP_FIRE | REGENERATE | -F:DROP_90 | REGENERATE | FRIENDS | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:REGENERATE +F:SUSCEP_FIRE +F:TROLL D:An corruption of Morgoth, it was made in mockery of the Ents. D:A massive troll, equipped with a scimitar and heavy armour. @@ -10704,9 +17796,18 @@ W:40:3:50:30 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:UN_BONUS:1d4 -F:RAND_50 | RES_DISE | ATTR_MULTI | CAN_SWIM | -F:STUPID | WEIRD_MIND | BASH_DOOR | -F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:HURT_LITE +F:NO_CUT +F:NO_FEAR +F:RAND_50 +F:RES_DISE +F:STUPID +F:WEIRD_MIND S:MULTIPLY D:It is a strange mass of squirming worms. Magical energy crackles D:around its disgusting form. @@ -10717,12 +17818,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_UNDEAD +S:TPORT D:It is a pulsing flesh mound that reeks of death and putrefaction. N:634:Lesser titan @@ -10735,13 +17845,26 @@ B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 -F:FORCE_SLEEP | FORCE_MAXHP | -F:DROP_GOOD | DROP_4D2 | DROP_SKELETON | DROP_CORPSE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | TELE_TO | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:MALE +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:HEAL +S:SCARE S:S_MONSTERS +S:TELE_TO D:It is a humanoid figure thirty feet tall that gives off an aura of power D:and hate. @@ -10755,12 +17878,26 @@ B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_3D2 | DROP_4D2 | CAN_SWIM | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CORPSE | -F:ANIMAL | IM_FIRE | MORTAL | BASEANGBAND -S:1_IN_4 | -S:SCARE | BO_FIRE | BR_FIRE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 +S:BO_FIRE +S:BR_FIRE +S:SCARE D:A strange reptilian creature with nine smouldering heads. N:636:Enchantress @@ -10772,14 +17909,24 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d8 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLIND | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:BLIND S:S_DRAGON D:This elusive female spellcaster has a special affinity for dragons, whom D:she rarely fights without. @@ -10793,16 +17940,40 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:MALE | INVISIBLE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | TAKE_ITEM | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:S_MONSTERS | -S:ARROW_2 | ARROW_3 | ARROW_4 | MISSILE | BO_FIRE | BO_ELEC | BA_COLD | -S:HASTE | BLINK | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_4 +S:ARROW_2 +S:ARROW_3 +S:ARROW_4 +S:BA_COLD +S:BLINK +S:BO_ELEC +S:BO_FIRE +S:HASTE +S:MISSILE +S:S_ANIMALS +S:S_MONSTERS D:A chieftain among the Rangers. His understanding of nature gives him D:powerful elemental spells to use against you, in addition to his skills D:as an archer and a warrior. Furthermore, he is a master of camouflage, so @@ -10817,16 +17988,35 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | TRAPS | -S:BO_ACID | BA_FIRE | BA_COLD | -S:S_MONSTER | S_UNDEAD | S_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CONF +S:S_DRAGON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spellcasting. @@ -10840,12 +18030,23 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:FORCE_MAXHP | SUSCEP_ACID | -F:EMPTY_MIND | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:PASS_WALL +F:SUSCEP_ACID D:It is a tougher relative of the Xorn. Its hide glitters with metal ores. # New monster added by furiosity for the Theme module @@ -10858,9 +18059,17 @@ O:0:0:0:0 B:BITE:TERRIFY:1d3 B:CLAW:LOSE_INT:1d2 B:CLAW:DISEASE:1d2 -F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | -F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | -F:MORTAL | BASEANGBAND +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:FORCE_SLEEP +F:MORTAL +F:RAND_50 +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A giant bat which is an expert at disguise in a forest. # New monster added by furiosity for the Theme module @@ -10874,13 +18083,34 @@ B:ENGULF:LOSE_ALL:5d5 B:ENGULF:EXP_80:5d5 B:ENGULF:LOSE_ALL:5d5 B:ENGULF:EXP_80:5d5 -F:FORCE_SLEEP | CAN_FLY | -F:RAND_50 | RAND_25 | RES_DISE | RES_NETH | RES_NEXU | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | BASEANGBAND | NO_CUT -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RES_PLAS | -S:1_IN_6 | -S:ANIM_DEAD | BO_MANA | DARKNESS | BA_DARK | DRAIN_MANA | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +S:1_IN_6 +S:ANIM_DEAD +S:BA_DARK +S:BO_MANA +S:DARKNESS +S:DRAIN_MANA D:A whirlpool of darkness that smells like death and decay. # New monster added by furiosity for the Theme module @@ -10891,12 +18121,24 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:POISON:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | WILD_TOO | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | -F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT | -S:1_IN_6 | -S:BR_POIS | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:WILD_TOO +F:WILD_WASTE +S:1_IN_6 +S:BR_POIS D:A whirlpool of noxious gases. N:643:Death drake @@ -10908,15 +18150,32 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:EXP_80:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | RES_TELE -F:INVISIBLE | TAKE_ITEM | CAN_FLY | -F:PASS_WALL | POWERFUL | MOVE_BODY | RES_NETH | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | -S:BR_NETH -D:It is a dragon-like form wrapped in darkness. You cannot make out its +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:RES_NETH +F:RES_TELE +F:TAKE_ITEM +S:1_IN_6 +S:BR_NETH +S:CONF +S:SCARE +S:SLOW +D:It is a dragon-like form wrapped in darkness. You cannot make out its D:true form but you sense its evil. N:644:Ancient red dragon @@ -10928,14 +18187,30 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:FIRE:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_3D2 | DROP_4D2 | CAN_FLY | SUSCEP_COLD | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +F:SUSCEP_COLD +S:1_IN_6 +S:BLIND S:BR_FIRE +S:CONF +S:SCARE D:A huge draconic form. Wisps of smoke steam from its nostrils and the D:extreme heat surrounding it makes you gasp for breath. @@ -10948,13 +18223,28 @@ O:50:50:0:0 B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:HURT:7d9 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:DROP_3D2 | DROP_4D2 | CAN_FLY | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:SMART +S:1_IN_6 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A huge draconic form wreathed in a nimbus of light. Its roar stuns and D:deafens you. @@ -10967,14 +18257,32 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | CAN_FLY | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:SLOW | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +S:1_IN_6 S:BR_SHAR +S:CONF +S:SCARE +S:SLOW D:A huge crystalline dragon. Its claws could cut you to shreds and its D:teeth are razor sharp. Strange colours ripple through it as it moves in D:the light. @@ -10987,12 +18295,24 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:LOSE_ALL:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE | -F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | -F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT | -S:1_IN_8 | -S:BR_MANA | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:WILD_TOO +F:WILD_WASTE +S:1_IN_8 +S:BR_MANA D:A whirlpool of pure magical energy. N:648:Helcungol @@ -11005,13 +18325,25 @@ B:STING:POISON:3d4 B:SPIT:COLD:3d4 B:HIT:HURT:3d4 B:CRUSH:HURT:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | -F:FRIENDS | -F:ONLY_ITEM | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | IM_FIRE | -F:EVIL | DEMON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_8 | -S:BLIND | CONF | SLOW +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_8 +S:BLIND +S:CONF +S:SLOW D:One of the spider demons, spawn of Ungoliant. It looks like D:a giant bloated spider and its claws are icy cold. @@ -11024,13 +18356,32 @@ O:0:50:50:0 B:BITE:LOSE_DEX:3d6 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_4D2 | NONLIVING | -F:SMART | INVISIBLE | PASS_WALL | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | IM_POIS | RES_TELE -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_10 | -S:BLIND | CONF | SCARE | CAUSE_3 | FORGET | +F:BASEANGBAND +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NONLIVING +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RES_TELE +F:SMART +S:1_IN_10 +S:BLIND +S:CAUSE_3 +S:CONF +S:FORGET +S:SCARE S:S_DEMON D:Lygroeg are corrupted demonic snakelike forms, an evil creation D:of Morgoth. @@ -11043,12 +18394,24 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:PARALYZE:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE | -F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL | -F:NO_FEAR | NO_CONF | NO_SLEEP | -F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT | -S:1_IN_8 | -S:BR_INER | BR_GRAV | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:WILD_TOO +F:WILD_WASTE +S:1_IN_8 +S:BR_GRAV +S:BR_INER D:A whirlpool of inertia and gravity, twisting slowly. # New monster added by furiosity for the Theme module @@ -11059,12 +18422,24 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_40:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE | -F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | -F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT | -S:1_IN_8 | -S:BR_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:WILD_TOO +F:WILD_WASTE +S:1_IN_8 +S:BR_NETH D:A whirlpool of nether forces. # New monster added by furiosity for the Theme module @@ -11075,12 +18450,24 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:CONFUSE:3d3 -F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE | -F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL | -F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | -F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT | -S:1_IN_8 | -S:BR_CONF | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_50 +F:WILD_TOO +F:WILD_WASTE +S:1_IN_8 +S:BR_CONF D:A whirlpool of something strange. # New monster added by furiosity for the Theme module @@ -11091,12 +18478,17 @@ W:8:1:800:15 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:3d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR S:1_IN_9 -S:S_KIN | CAUSE_1 +S:CAUSE_1 +S:S_KIN D:It is a strange small humanoid with a malevolent stare. N:654:Judge Fire @@ -11109,15 +18501,44 @@ B:HIT:FIRE:5d5 B:HIT:FIRE:5d5 B:GAZE:EXP_80 B:WAIL:TERRIFY -F:UNIQUE | MALE | CAN_SPEAK | SUSCEP_COLD | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | POWERFUL | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | SUSCEP_COLD | IM_POIS | IM_FIRE | RES_PLAS | -F:NO_CONF | NO_SLEEP | JOKEANGBAND | HAS_LITE | NO_CUT | NO_STUN -S:1_IN_3 | -S:CAUSE_3 | BO_FIRE | BA_FIRE | BR_FIRE | BO_PLAS -S:DARKNESS | S_MONSTER | S_DEMON | S_UNDEAD | TPORT | BLINK | SCARE +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_PLAS +F:SUSCEP_COLD +F:SUSCEP_COLD +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BLINK +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:CAUSE_3 +S:DARKNESS +S:SCARE +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD +S:TPORT D:One of the Dark Judges, he has come to punish your crime of living. D:He looks like a skeleton enveloped in flames. @@ -11129,12 +18550,18 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | IM_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:IM_COLD +F:MORTAL +F:OPEN_DOOR S:1_IN_10 -S:BO_COLD | BO_ICEE | +S:BO_COLD +S:BO_ICEE D:It is a strange small humanoid adapted to cold environments. N:656:Judge Mortis @@ -11147,16 +18574,42 @@ B:HIT:POISON:5d5 B:HIT:DISEASE:5d5 B:TOUCH:LOSE_ALL B:TOUCH:EXP_80 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | SUSCEP_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | SCARE | CAUSE_3 | BO_ACID | BO_NETH | BR_POIS | -S:BR_NETH | BO_NETH | BLINK | TPORT | ANIM_DEAD -S:BO_POIS | S_UNDEAD +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BO_ACID +S:BO_NETH +S:BO_NETH +S:BO_POIS +S:BR_NETH +S:BR_POIS +S:CAUSE_3 +S:SCARE +S:S_UNDEAD +S:TPORT D:Another Dark Judge, he is a rotting humanoid with a cow's skull as D:his head. @@ -11169,15 +18622,39 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE -F:ONLY_ITEM | DROP_90 | DROP_4D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | DARKNESS | -S:BO_ACID | BA_FIRE | BA_COLD | ANIM_DEAD -S:S_MONSTER | S_UNDEAD | S_DEMON | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CONF +S:DARKNESS +S:HEAL +S:MISSILE +S:S_DEMON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO D:A dark elven figure, dressed in deepest black. Power seems to crackle D:from his slender frame. @@ -11191,14 +18668,36 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d12 B:TOUCH:LOSE_DEX:2d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD +S:TELE_TO D:A skeletal form wrapped in robes. Powerful magic crackles along its D:bony fingers. @@ -11210,12 +18709,16 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR S:1_IN_6 -S:BO_ACID | +S:BO_ACID D:It is a strange small humanoid cloaked in gray. You notice D:some suspicious-looking vials in his pack. @@ -11228,16 +18731,47 @@ O:10:40:40:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD | DROP_CHOSEN | -F:SMART | IM_ELEC | IM_COLD | IM_POIS | IM_FIRE | -F:REFLECTING | OPEN_DOOR | BASH_DOOR | SPECIAL_GENE | -F:HURT_LITE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_4 | DARKNESS | -S:BA_NETH | BA_ELEC | BA_ACID | BA_FIRE | BA_COLD | BO_MANA | -S:S_MONSTERS | S_UNDEAD | S_DRAGON | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:HURT_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_3 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BLINK +S:BO_MANA +S:CAUSE_4 +S:CONF +S:DARKNESS +S:HEAL +S:S_DEMON +S:S_DRAGON +S:S_MONSTERS +S:S_UNDEAD +S:TELE_TO D:A lord of the Teleri, Eol is a mighty metalsmith, the first D:one to ever forge weapons of meteorite iron. His dark D:countenance glares at you in disdain. @@ -11250,11 +18784,16 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_7 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +S:1_IN_7 S:BA_POIS D:It is a strange small humanoid. He's strangely stinky. @@ -11267,10 +18806,15 @@ W:8:1:800:11 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | PET | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:OPEN_DOOR +F:PET D:It is a strange small humanoid, a fellow adventurer. # New monster added by furiosity for the Theme module @@ -11281,11 +18825,17 @@ W:8:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EXP_10:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_10 | +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +S:1_IN_10 S:DARKNESS D:Yum! It looks quite tasty. @@ -11299,15 +18849,38 @@ B:GAZE:EXP_40:3d6 B:GAZE:UN_POWER:3d6 B:GAZE:INSANITY:3d6 B:BITE:EXP_40:7d6 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:COLD_BLOOD | BASH_DOOR | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:SLOW | CONF | CAUSE_4 | DRAIN_MANA | MIND_BLAST | FORGET | -S:BO_MANA | BO_NETH | BRAIN_SMASH | BA_FIRE | BA_COLD | BO_ACID | -S:S_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_TELE +F:UNDEAD +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_FIRE +S:BO_ACID +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SLOW +S:S_UNDEAD D:A beholder which has cheated death. Black nether storms rage around the D:bloodshot pupil of its central giant eye, and light seems to bend as it D:sucks its power from the very air around it. Your soul chills as it drains @@ -11323,13 +18896,29 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:FORCE_SLEEP | CAN_FLY | -F:ONLY_ITEM | DROP_1D2 | POWERFUL | REGENERATE | HURT_LITE | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | RES_NETH | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_8 | -S:BO_NETH | TELE_TO | SLOW +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:UNDEAD +S:1_IN_8 +S:BO_NETH +S:SLOW +S:TELE_TO D:A mighty spirit of darkness of vaguely humanoid form. Razor-edged claws D:reach out to end your life as it glides towards you, seeking to suck the D:energy from your soul to feed its power. @@ -11343,15 +18932,39 @@ O:0:0:100:0 B:BUTT:COLD:3d6 B:BUTT:FIRE:3d6 B:BUTT:ELEC:3d6 -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | -F:COLD_BLOOD | BASH_DOOR | CAN_FLY | SUSCEP_ACID | -F:EVIL | UNDEAD | POWERFUL | SMART | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE | -F:ONLY_ITEM | DROP_60 | DROP_GOOD | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BA_WATE | BA_FIRE | BO_ICEE | BA_ELEC | BA_COLD | -S:CAUSE_4 | DRAIN_MANA | BRAIN_SMASH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:RES_TELE +F:SMART +F:SUSCEP_ACID +F:UNDEAD +S:1_IN_2 +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_WATE +S:BO_ICEE +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:S_UNDEAD D:It is a huge, twisted grey skull floating through the air. Its cold eyes D:burn with hatred towards all who live. @@ -11364,14 +18977,30 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | -F:RAND_25 | FRIENDS | CAN_FLY | -F:ONLY_ITEM | DROP_60 | -F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_15 | -S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:TAKE_ITEM +F:UNDEAD +S:1_IN_15 +S:BLIND +S:BO_NETH +S:CONF +S:DRAIN_MANA +S:HOLD D:Death incarnate, its hideous black body seems to struggle against D:reality as the universe itself struggles to banish it. @@ -11385,12 +19014,25 @@ B:GAZE:PARALYZE:3d12 B:GAZE:PARALYZE:3d12 B:BITE:POISON:2d12 B:BITE:POISON:2d12 -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | POWERFUL | -F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL S:1_IN_8 -S:BR_POIS | BR_DARK | BR_NEXU +S:BR_DARK +S:BR_NEXU +S:BR_POIS D:A large basilisk, whose shape resembles that of a great worm. # New monster added by furiosity for the Theme module @@ -11401,10 +19043,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:COLD:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. # New monster added by furiosity for the Theme module @@ -11415,10 +19063,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:DISEASE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. # New monster added by furiosity for the Theme module @@ -11429,10 +19083,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EAT_LITE:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. # New monster added by furiosity for the Theme module @@ -11443,10 +19103,16 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:Yum! It looks quite tasty. N:673:Mumak @@ -11458,8 +19124,12 @@ O:0:0:0:0 B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 -F:FRIENDS | DROP_CORPSE | -F:BASH_DOOR | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FRIENDS +F:MORTAL D:A massive elephantine form with eyes twisted by madness. N:674:Judge Fear @@ -11472,15 +19142,41 @@ B:GAZE:TERRIFY B:GAZE:EXP_40 B:GAZE:EXP_40 B:GAZE:HURT:2d20 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | MIND_BLAST | BRAIN_SMASH | -S:S_UNDEAD | DRAIN_MANA | FORGET | ANIM_DEAD +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_UNDEAD D:A Dark Judge, reputedly so frightening that his gaze can kill. N:675:Ancient multi-hued dragon @@ -11492,15 +19188,40 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | CONF | SCARE | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +S:1_IN_5 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A huge draconic form. Many colours ripple down its massive frame. Few D:live to see another. @@ -11513,14 +19234,27 @@ O:50:50:0:0 B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | -F:INVISIBLE | CAN_FLY | -F:PASS_WALL | POWERFUL | MOVE_BODY | -F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BLIND | CONF | -S:BR_LITE | BR_DARK | BR_CONF +F:ATTR_MULTI +F:BASEANGBAND +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_4D2 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +S:1_IN_6 +S:BLIND +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF D:A huge dragon emanating from the ethereal plane, this terrible dragon is D:a master of light and dark. Its form disappears from sight as it cloaks D:itself in unearthly shadows. @@ -11534,12 +19268,27 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:BLIND:4d6 B:HIT:EAT_LITE:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_DARK D:It is a twisting pillar of pure darkness. @@ -11552,12 +19301,27 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:4d6 B:HIT:PARALYZE:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_INER D:It is a slowly twisting pillar of energy. @@ -11571,15 +19335,32 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:SHATTER:10d10 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:EMPTY_MIND | COLD_BLOOD | KILL_WALL | -F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT | NO_STUN -S:1_IN_6 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:CAN_SPEAK +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:KILL_WALL +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:PASS_WALL +F:POWERFUL +F:UNIQUE +S:1_IN_6 +S:BA_ACID +S:BO_ACID D:A towering stone elemental stands before you. The walls and ceiling are D:reduced to rubble as Quaker advances. @@ -11592,28 +19373,59 @@ O:0:0:0:0 B:TOUCH:EXP_40:1d10 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD | SMART | -F:HURT_LITE | EVIL | OPEN_DOOR | MALE | UNDEAD | RES_NETH | JOKEANGBAND | NO_CUT -S:MULTIPLY | -S:1_IN_6 | -S:BLINK | TPORT | TELE_TO | CAUSE_3 | ANIM_DEAD -D:Nasty undead little gnomes. - -# New monster added by furiosity for the Theme module -N:681:Chaos elemental -G:E:v -I:110:30d8:12:50:50 +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:INVISIBLE +F:JOKEANGBAND +F:MALE +F:NO_CUT +F:OPEN_DOOR +F:RAND_25 +F:RES_NETH +F:SMART +F:TAKE_ITEM +F:UNDEAD +S:1_IN_6 +S:ANIM_DEAD +S:BLINK +S:CAUSE_3 +S:MULTIPLY +S:TELE_TO +S:TPORT +D:Nasty undead little gnomes. + +# New monster added by furiosity for the Theme module +N:681:Chaos elemental +G:E:v +I:110:30d8:12:50:50 W:33:2:0:350 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_40:4d6 B:HIT:INSANITY:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | ELDRITCH_HORROR | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:ELDRITCH_HORROR +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_CHAO D:It is a massive tornado of raw chaos. @@ -11626,12 +19438,27 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:4d6 B:HIT:CONFUSE:4d6 -F:FORCE_SLEEP | RAND_25 | -F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_6 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:WILD_TOO +F:WILD_VOLCANO +S:1_IN_6 S:BR_CONF D:It is confusing sight to behold. @@ -11644,8 +19471,17 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:ELEC:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND | IM_ELEC | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long, its lithe form crackling with sparks. # New monster added by furiosity for the Theme module @@ -11657,8 +19493,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:EAT_LITE:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long, and seems to feed on light. # New monster added by furiosity for the Theme module @@ -11670,8 +19514,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:LOSE_CON:1d4 B:CRUSH:HURT:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long and looks diseased. N:686:Judge Death @@ -11684,15 +19536,42 @@ B:CLAW:POISON:10d5 B:CLAW:POISON:10d5 B:CLAW:EXP_40:10d1 B:GAZE:TERRIFY -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_ELEC | IM_COLD | SUSCEP_FIRE | -F:IM_POIS | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_4 | BA_FIRE | BA_NETH | ANIM_DEAD -S:S_MONSTERS | S_UNDEAD | S_HI_UNDEAD | DRAIN_MANA | +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_FIRE +S:BA_NETH +S:BLIND +S:CAUSE_4 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNDEAD D:The most powerful Dark Judge, whose touch means death. N:687:Ariel, Queen of Air @@ -11705,15 +19584,33 @@ B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 -F:UNIQUE | FEMALE | AURA_ELEC | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:RAND_25 | CAN_FLY | -F:EMPTY_MIND | COLD_BLOOD | -F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BO_ELEC | BA_COLD | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:EMPTY_MIND +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:UNIQUE +S:1_IN_5 +S:BA_COLD +S:BA_ELEC +S:BO_ELEC D:A towering air elemental, Ariel the sorceress avoids your blows D:with her extreme speed. @@ -11727,13 +19624,28 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | IM_FIRE | CAN_SWIM | -F:MORTAL | BASEANGBAND -S:1_IN_4 | -S:SCARE | BO_FIRE | BO_PLAS | BA_FIRE | BR_FIRE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 +S:BA_FIRE +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:SCARE D:A strange reptilian hybrid with eleven smouldering heads. N:689:Patriarch @@ -11745,15 +19657,32 @@ O:0:10:90:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d5 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | BLIND | HOLD | CAUSE_4 | CAUSE_3 | ANIM_DEAD | -S:S_MONSTERS | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +S:1_IN_2 +S:ANIM_DEAD +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:HEAL +S:HOLD +S:S_MONSTERS +S:S_UNDEAD D:An evil priest, dressed all in black. Deadly spells hit you at an D:alarming rate as his black spiked mace rains down blow after blow on your D:pitiful frame. @@ -11768,14 +19697,35 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | CAN_FLY | -F:SMART | TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF F:NO_CUT -S:1_IN_9 | -S:TELE_LEVEL | BLIND | HOLD | CONF | CAUSE_4 | DRAIN_MANA | BO_NETH | +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RAND_25 +F:SMART +F:TAKE_ITEM +F:UNDEAD +S:1_IN_9 +S:BLIND +S:BO_NETH +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD S:S_UNDEAD +S:TELE_LEVEL D:It is an unlife of power almost unequalled. An affront to existence, its D:very touch abuses and disrupts the flow of life, and its unearthly limbs, D:of purest black, crush rock and flesh with ease. @@ -11790,15 +19740,32 @@ B:CLAW:HURT:3d10 B:CLAW:HURT:3d10 B:BITE:POISON:5d10 B:BITE:POISON:5d10 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:DRAGON | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT F:ATTR_MULTI -S:1_IN_6 | -S:BLIND | SLOW | CONF | ARROW_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DRAGON +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +S:1_IN_6 +S:ARROW_3 +S:BLIND S:BR_POIS +S:CONF +S:SLOW D:A constructed dragon, the drolem has massive strength. Powerful spells D:weaved during its creation make it a fearsome adversary. Its eyes show D:little intelligence, but it has been instructed to destroy all it meets. @@ -11813,14 +19780,30 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:COLD:4d14 B:BITE:COLD:4d14 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CORPSE -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | IM_COLD | NO_CONF | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MALE +F:MOVE_BODY +F:NO_CONF +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_FIRE +F:UNIQUE +S:1_IN_4 S:BR_COLD +S:CAUSE_3 +S:CONF D:An ancient and wise Dragon. Scatha has grown clever over the long years. D:His scales are covered with frost, and his breath sends a shower of ice D:into the air. @@ -11833,10 +19816,19 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | -F:NO_SLEEP | NO_FEAR | -F:FRIENDS | -F:MALE | OPEN_DOOR | BASH_DOOR | JOKEANGBAND | HAS_LITE +F:BASH_DOOR +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR D:Fierce, barbaric warriors, armed with great spiked clubs, and surrounded D:in an aura of scarlet. Whenever one of them is slain, another appears D:out of nowhere to take his place. @@ -11851,15 +19843,37 @@ B:HIT:UN_BONUS:4d8 B:HIT:UN_BONUS:4d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | CAN_SWIM | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE -F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR -F:BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | DRAIN_MANA | -S:MIND_BLAST | BA_NETH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:CONF +S:DRAIN_MANA +S:HOLD +S:MIND_BLAST +S:TELE_TO D:A humanoid form, black as night, advancing steadily and unstoppably. # New monster added by furiosity for the Theme module @@ -11871,8 +19885,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:FIRE:1d6 -F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:RAND_25 +F:WILD_TOO D:It is about ten feet long, its form glowing with fire. N:696:Grand master thief @@ -11885,11 +19907,20 @@ B:HIT:EAT_ITEM:5d5 B:HIT:EAT_ITEM:5d5 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_GOLD:5d5 -F:MALE | DROP_2D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | TELE_TO | CONF | TRAPS | ARROW_2 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:MALE +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_2 +S:ARROW_2 +S:BLINK +S:CONF +S:TELE_TO +S:TPORT +S:TRAPS D:A class of its own: you are already too late to protect your possessions - D:and he seems to have studied magic too, and is a master of setting traps. @@ -11903,15 +19934,33 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:FIRE:5d14 -F:UNIQUE | MALE | REFLECTING | CAN_FLY | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | SPECIAL_GENE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:SMART | EVIL | DRAGON | IM_FIRE | BASEANGBAND -F:HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_4 S:BR_FIRE +S:CAUSE_3 +S:CONF D:Smaug is one of the great dragons that still survive, a fire-drake of immense D:cunning and intelligence. His speed through air is matched by few other D:dragons, his dragonfire is what legends are made of, and his hide is @@ -11928,10 +19977,26 @@ B:WAIL:TERRIFY B:HIT:EXP_80:64d1 B:HIT:EXP_80:64d1 B:HIT:EXP_80:8d8 -F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD | IM_FIRE | RES_NETH | -F:FORCE_SLEEP | UNIQUE | FORCE_MAXHP | CAN_FLY | -F:COLD_BLOOD | BASH_DOOR | NONLIVING | -F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | HAS_LITE | NO_CUT | NO_STUN +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_NETH +F:UNIQUE D:The mightiest of hellblades, a black runesword which thirsts for D:your soul. @@ -11944,14 +20009,39 @@ O:0:100:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | GOOD | -F:RES_NETH | RES_NEXU | RES_DISE | RES_TELE | DROP_SKELETON | DROP_CORPSE -F:NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN | -F:DROP_2D2 | DROP_90 | REFLECTING | -F:MALE | OPEN_DOOR | BASH_DOOR | FORCE_MAXHP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:HEAL | CAUSE_3 | CAUSE_4 | HASTE | SCARE | BLIND | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_TELE +S:1_IN_4 +S:BLIND +S:CAUSE_3 +S:CAUSE_4 +S:HASTE +S:HEAL +S:SCARE D:It seems that the more devout the person, the more likely they are to cross D:the boundary between piety and sanctimoniousness. And such is the case with D:the Order of the Knights Templar; they are among the most pious and @@ -11968,8 +20058,19 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:TERRIFY:1d6 -F:RAND_25 | CAN_SWIM | WILD_ONLY | DROP_SKELETON | DROP_CORPSE | WILD_SHORE -F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_EGG +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:RAND_25 +F:WILD_ONLY +F:WILD_SHORE D:It is about ten feet long. Its survival depends on being D:confused for a much more dangerous snake. @@ -11982,15 +20083,34 @@ O:10:50:40:0 B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:EXP_80:7d14 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | RES_TELE | -F:COLD_BLOOD | CAN_FLY | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | ATTR_MULTI -S:1_IN_6 | -S:CONF | SCARE | -S:BR_COLD | BR_NETH +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DRAGON +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:TAKE_ITEM +F:UNDEAD +S:1_IN_6 +S:BR_COLD +S:BR_NETH +S:CONF +S:SCARE D:The skeletal form of a once-great dragon, enchanted by magic most D:perilous. Its animated form strikes with speed and drains life from its D:prey to satisfy its hunger. @@ -12005,13 +20125,28 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_1D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | TELE_TO | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +S:1_IN_3 +S:HEAL S:S_MONSTERS +S:TELE_TO D:A forty foot tall humanoid that shakes the ground as it walks. The power D:radiating from its frame shakes your courage, its hatred inspired by your D:defiance. @@ -12026,14 +20161,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:7d14 B:GAZE:PARALYZE -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | RES_NEXU | RES_TELE | -F:ANIMAL | EVIL | DRAGON | IM_ACID | IM_FIRE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:HOLD | SCARE | -S:BR_FIRE | BR_NEXU +F:ANIMAL +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NEXU +F:RES_TELE +S:1_IN_6 +S:BR_FIRE +S:BR_NEXU +S:HOLD +S:SCARE D:A mixture of dragon and basilisk, the dracolisk stares at you with deep D:piercing eyes, its evil breath burning the ground where it stands. @@ -12045,10 +20197,22 @@ B:CLAW:HURT:3d8 B:CLAW:HURT:3d8 B:BITE:EXP_40:4d6 B:BITE:EXP_40:4d6 -F:ANIMAL | MORTAL | EVIL | CAN_FLY | BASH_DOOR | IM_COLD | IM_POIS -F:WILD_TOO | WILD_WASTE | WILD_WOOD | WILD_SWAMP | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EVIL +F:IM_COLD +F:IM_POIS +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE +F:WILD_WOOD S:1_IN_6 -S:BR_NETH | BR_DARK | BR_POIS +S:BR_DARK +S:BR_NETH +S:BR_POIS D:A terrifying sight: a winged creature greater than any bird you have ever D:seen, and with no feathers on its horrid black leathery wings. Descended D:from a creature of an older world perhaps, bred by Sauron to be a winged @@ -12063,9 +20227,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:ACID:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | IM_ACID | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:IM_ACID +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle surrounded by droplets of acid. # New monster added by furiosity for the Theme module @@ -12077,9 +20248,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:BLIND:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle with a corrosive spit. # New monster added by furiosity for the Theme module @@ -12091,9 +20268,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:ELEC:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | IM_ELEC | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:IM_ELEC +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle surrounded by sparks. N:708:Ent @@ -12106,10 +20290,21 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | PET | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | -F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR | -F:GOOD | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM D:Ents are some of the oldest creatures that awoke on Arda. It is a D:tree-herd: a sentient, moving tree. Its wrath is fearsome, and it could D:split stones and even the very rock of Isengard with its roots. @@ -12124,10 +20319,22 @@ B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 B:HIT:SHATTER:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | HURT_ROCK | -F:ONLY_GOLD | DROP_4D2 | MOVE_BODY | KILL_WALL | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | GIANT | MALE | HAS_LITE | NO_CUT +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CUT +F:ONLY_GOLD +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM D:A being made of living stone. N:710:Itangast the Fire Drake @@ -12140,14 +20347,29 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:FIRE:4d14 B:BITE:FIRE:4d14 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | CAUSE_3 | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_4 S:BR_FIRE +S:CAUSE_3 +S:CONF D:A mighty ancient dragon, Itangast's form scorches your flesh. Wisps of D:smoke curl up from his nostrils as he regards you with disdain. @@ -12161,9 +20383,20 @@ B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:EXP_80:5d5 -F:FORCE_SLEEP | NEVER_MOVE | CAN_SWIM | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:It is the epitome of all that is evil, in a mold. Its lifeless form draws D:power from sucking the souls of those that approach it, a nimbus of pure D:evil surrounds it. Luckily for you, it can't move... @@ -12177,9 +20410,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:EAT_LITE:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | HURT_LITE | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:HURT_LITE +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle surrounded by a strange dark light. # New monster added by furiosity for the Theme module @@ -12191,9 +20431,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:CONFUSE:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | NO_CONF | CAN_FLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle surrounded by a puzzling green aura. N:714:Quickbeam, the Ent @@ -12206,10 +20453,23 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | SUSCEP_FIRE | -F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR | -F:GOOD | PET | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE D:Also known as Bregalad. Unusually hasty, for an ent. He hates evil creatures, D:orcs in particular, since the destruction of his beloved rowan-trees to feed the D:fires of Orthanc. @@ -12224,15 +20484,39 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:FIRE:8d14 B:BITE:POISON:8d14 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_RANDART | KILL_TREES | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:SMART | EVIL | DRAGON | IM_POIS | IM_FIRE | -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | BRAIN_SMASH | -S:BR_FIRE | BR_POIS | BR_SOUN | S_HI_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DRAGON +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_RANDART +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:IM_POIS +F:KILL_TREES +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BRAIN_SMASH +S:BR_FIRE +S:BR_POIS +S:BR_SOUN +S:CONF +S:SCARE +S:S_HI_DRAGON D:Glaurung is the father of all dragons, and was for a long time the most D:powerful. Though this is no longer so, he still has full command over D:his brood and can command them to appear whenever he so wishes. He is @@ -12248,10 +20532,26 @@ B:BITE:HURT:5d8 B:BITE:HURT:5d8 B:CRUSH:HURT:3d15 B:CRUSH:HURT:3d15 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | ANIMAL | AQUATIC | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | DROP_CORPSE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NEUTRAL | NO_TARGET | -F:WILD_ONLY | WILD_SHORE | WILD_OCEAN | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NEUTRAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_TARGET +F:WILD_OCEAN +F:WILD_ONLY +F:WILD_SHORE D:A great water-beast, with an almost unpenetrable skin. # New monster added by furiosity for the Theme module @@ -12263,9 +20563,18 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:COLD:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | RES_WATE | CAN_FLY | SUSCEP_FIRE | -F:MORTAL | BASEANGBAND | HAS_LITE | AQUATIC | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:MORTAL +F:RES_WATE +F:SUSCEP_FIRE +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle that prefers to live in water. N:718:Greater wall monster @@ -12277,11 +20586,26 @@ O:0:0:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | RAND_50 | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | CAN_FLY | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF F:NO_CUT -S:MULTIPLY | +F:NO_SLEEP +F:PASS_WALL +F:RAND_50 +S:MULTIPLY D:A sentient, moving section of wall. N:719:Menelrog @@ -12294,13 +20618,34 @@ B:GAZE:TERRIFY B:HIT:POISON:6d6 B:SPIT:FIRE:6d6 B:SPIT:ACID:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | NONLIVING | -F:REGENERATE | IM_ACID | IM_COLD | IM_FIRE | CAN_FLY | -F:NO_SLEEP | NO_STUN | NO_CONF | EVIL | DEMON | SMART | -F:KILL_WALL | WILD_TOO | -F:ONLY_ITEM | DROP_GREAT | DROP_GOOD | BASEANGBAND -S:1_IN_4 | -S:HOLD | BLINK | CONF | S_DEMON | BRAIN_SMASH | BO_PLAS +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:DEMON +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:REGENERATE +F:SMART +F:WILD_TOO +S:1_IN_4 +S:BLINK +S:BO_PLAS +S:BRAIN_SMASH +S:CONF +S:HOLD +S:S_DEMON D:Morgoth's horrific corruption of Manwe's Great Eagles, with the feathers D:devolved into scales, and the talons so powerful they can tear down D:stone walls. This demon is a power to be reckoned with; it is powerful @@ -12316,12 +20661,24 @@ B:HIT:HURT:4d10 B:HIT:LOSE_CHR:10d2 B:SPIT:ACID:4d10 B:STING:POISON:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | -F:ONLY_ITEM | DROP_1D2 | NONLIVING | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_POIS | NO_CONF | NO_SLEEP -S:1_IN_7 | -S:SCARE | CONF +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_7 +S:CONF +S:SCARE D:One of the spider demons, spawn of Ungoliant. It looks like D:a giant bloated spider, and its claws are dripping with acid. @@ -12334,9 +20691,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:HALLU:4d5 -F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE | -F:ANIMAL | KILL_TREES | CAN_FLY | SUSCEP_COLD | -F:MORTAL | BASEANGBAND | HAS_LITE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:HAS_LITE +F:KILL_TREES +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND +F:WILD_TOO D:It is a giant beetle, a relative of the termite. N:722:Nightwing @@ -12349,14 +20714,35 @@ B:TOUCH:POISON:6d5 B:TOUCH:POISON:6d5 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:SCARE +S:S_UNDEAD D:Everywhere colours seem paler and the air chiller. At the centre of the D:cold stands a mighty figure. Its wings envelop you in the chill of death D:as the nightwing reaches out to draw you into oblivion. Your muscles sag @@ -12375,12 +20761,28 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY | -F:IM_POIS | SUSCEP_FIRE | ONLY_GOLD | DROP_4D2 | DROP_2D2 | IM_COLD | -S:1_IN_5 | -S:SCARE | BA_POIS | BR_POIS | -D:A strange reptilian creature with 6 heads dripping venom. It has +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:SUSCEP_FIRE +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_POIS +S:BR_POIS +S:SCARE +D:A strange reptilian creature with 6 heads dripping venom. It has D:adapted to living in cold environments. N:724:Nether hound @@ -12393,12 +20795,20 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | -F:FRIENDS | RES_NETH | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | NO_CUT -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_NETH +S:1_IN_5 S:BR_NETH D:You feel a soul-tearing chill upon viewing this beast, a ghostly form of D:darkness in the shape of a large dog. @@ -12413,12 +20823,18 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | -F:FRIENDS | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +S:1_IN_5 S:BR_TIME D:You get a terrible sense of deja vu, or is it a premonition? All at once D:you see a little puppy and a toothless old dog. Perhaps you should give @@ -12434,12 +20850,23 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 -F:FORCE_SLEEP | SUSCEP_COLD | -F:FRIENDS | RES_PLAS | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | IM_FIRE | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:RES_PLAS +F:SUSCEP_COLD +S:1_IN_5 S:BR_PLAS D:The very air warps as pure elemental energy stalks towards you in the D:shape of a giant hound. Your hair stands on end and your palms itch as @@ -12451,12 +20878,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_DEMON +S:TPORT D:A pile of pulsing flesh that glows with an inner dark fire. The world D:itself seems to cry out against it. @@ -12470,14 +20906,32 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ELEC:6d14 B:BITE:ELEC:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_ELEC +S:CONF +S:SCARE D:A vast dragon of power. Storms and lightning crash around its titanic D:form. Deep blue scales reflect the flashes and highlight the creature's D:great muscles. It regards you with contempt. @@ -12491,13 +20945,31 @@ O:0:100:0:0 B:HIT:SHATTER:20d12 B:HIT:SHATTER:20d12 B:BITE:POISON:6d14 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:DROP_90 | REGENERATE | KILL_WALL | RES_TELE | KILL_BODY | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | -F:EVIL | TROLL | IM_POIS | -F:IM_ELEC | IM_COLD | IM_FIRE | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_WALL +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SPECIAL_GENE +F:TROLL +F:UNIQUE D:Trolls are said to be corruptions of Morgoth, made in mockery of Ents. D:Ulik is the strongest troll who has ever lived. He could challenge D:the immortals and pound them to dust with his great strength. @@ -12514,11 +20986,26 @@ B:BITE:ACID:3d8 B:BITE:ACID:3d8 B:SPIT:ACID:3d4 B:SPIT:ACID:3d4 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY | -F:IM_ACID | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_2D2 | -S:1_IN_5 | -S:SCARE | BR_ACID | BA_ACID +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_ACID +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_5 +S:BA_ACID +S:BR_ACID +S:SCARE D:A strange reptilian creature with eight heads spewing acid. N:731:Oathbreaker @@ -12531,14 +21018,35 @@ B:HIT:HURT:10d5 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | IM_FIRE | IM_COLD | IM_POIS | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_NETH | RES_NEXU | RES_PLAS | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_COLD | -F:UNDEAD | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:BLIND | SCARE | CAUSE_3 | BA_NETH | BA_FIRE | BO_PLAS -S:S_MONSTERS | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:SMART +F:UNDEAD +S:1_IN_5 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:CAUSE_3 +S:SCARE +S:S_DEMON +S:S_MONSTERS D:He is one of the warriors of old who broke their promise to the D:King of Gondor. A terrible curse now haunts all of them. @@ -12554,11 +21062,26 @@ B:BITE:FIRE:3d9 B:BITE:ACID:3d9 B:BITE:ELEC:3d9 B:BITE:COLD:3d9 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY | -F:IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | BASH_DOOR | -F:ONLY_GOLD | DROP_4D2 | DROP_2D2 | -S:1_IN_4 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 S:SCARE D:A strange reptilian creature with ten multicoloured heads. @@ -12574,11 +21097,30 @@ B:BITE:FIRE:4d12 B:BITE:FIRE:4d12 B:BITE:POISON:4d12 B:BITE:POISON:4d12 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY | -F:IM_FIRE | IM_POIS | RES_PLAS | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_2D2 | -S:1_IN_4 | -S:SCARE | BA_FIRE | BA_POIS | BO_FIRE | BO_PLAS | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:RES_PLAS +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_4 +S:BA_FIRE +S:BA_POIS +S:BO_FIRE +S:BO_PLAS +S:SCARE D:A strange reptilian creature with twelve smouldering heads. # New monster added by furiosity for the Theme module @@ -12593,12 +21135,34 @@ B:BITE:POISON:8d6 B:BITE:POISON:8d6 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | -F:IM_FIRE | IM_POIS | RES_PLAS | NO_CONF | NO_SLEEP | BASH_DOOR | -F:ONLY_GOLD | DROP_4D2 | DROP_2D2 | DROP_2D2 | SMART | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_GOLD +F:RES_PLAS +F:SMART +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO S:1_IN_3 -S:SCARE | BA_FIRE | BA_POIS | BO_FIRE | BO_PLAS | S_KIN +S:BA_FIRE +S:BA_POIS +S:BO_FIRE +S:BO_PLAS +S:SCARE +S:S_KIN D:A strange reptilian creature with thirteen smouldering heads dripping venom. # New monster added by furiosity for the Theme module @@ -12612,13 +21176,37 @@ B:BITE:FIRE:4d10 B:BITE:ACID:4d10 B:BITE:ELEC:4d10 B:BITE:COLD:4d10 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | SMART | -F:NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_4D2 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_4D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_GOLD +F:RES_PLAS +F:SMART +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO S:1_IN_3 -S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID -S:S_KIN | +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_POIS +S:SCARE +S:S_KIN D:A cunning reptilian creature with fourteen multicoloured heads. # New monster added by furiosity for the Theme module @@ -12632,13 +21220,43 @@ B:BITE:FIRE:5d11 B:BITE:ACID:5d11 B:BITE:COLD:5d11 B:BITE:ELEC:5d11 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | AQUATIC | DROP_CORPSE | WILD_OCEAN | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | SMART | -F:NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_4D2 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_4D2 +F:DROP_4D2 +F:DROP_CORPSE +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_GOLD +F:RES_PLAS +F:SMART +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO S:1_IN_3 -S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID | CONF | -S:BO_FIRE | BO_COLD | BO_ELEC | BO_ACID | S_KIN | +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_POIS +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CONF +S:SCARE +S:S_KIN D:A cunning reptilian creature with fifteen multicoloured heads. # New monster added by furiosity for the Theme module @@ -12652,15 +21270,54 @@ B:BITE:FIRE:6d12 B:BITE:ACID:6d12 B:BITE:COLD:6d12 B:BITE:ELEC:6d12 -F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:FORCE_SLEEP | CAN_SWIM | AQUATIC | DROP_CORPSE | WILD_OCEAN | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | RES_NETH | -F:RES_TELE | SMART | NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 | -F:RES_NEXU | DROP_4D2 | RES_WATE | NO_STUN | EVIL | -S:1_IN_3 | -S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID | CONF | -S:BO_FIRE | BO_COLD | BO_ICEE | BA_WATE | BO_ELEC | BO_ACID | BR_NETH | -S:S_KIN | S_ANIMALS | S_MONSTERS | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_4D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_GOLD +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:RES_WATE +F:SMART +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_3 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BA_POIS +S:BA_WATE +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:BO_ICEE +S:BR_NETH +S:CONF +S:SCARE +S:S_ANIMALS +S:S_KIN +S:S_MONSTERS D:A cunning, evil reptile from the depths. It has so many heads that you D:give up after losing count twice. @@ -12673,15 +21330,35 @@ O:0:0:100:0 B:HIT:HURT:6d8 B:HIT:HURT:6d8 B:HIT:HURT:6d8 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | -F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | CAUSE_4 | TRAPS | -S:BO_ACID | BA_FIRE | BA_COLD | BA_POIS | -S:S_MONSTER | S_DEMON | S_HI_DRAGON | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BA_POIS +S:BLIND +S:BLINK +S:BO_ACID +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:S_DEMON +S:S_HI_DRAGON +S:S_MONSTER +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spellcasting. You stagger at the mighty sound of his D:spells as they echo hollowly through the dungeon. @@ -12696,11 +21373,16 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 -F:FORCE_SLEEP | FRIENDS | -F:INVISIBLE | PASS_WALL | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:BASEANGBAND +F:FORCE_SLEEP +F:FRIENDS +F:INVISIBLE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PASS_WALL +S:1_IN_5 S:BR_NETH D:A pale green hound. Pulsing red lines and strange fluorescent light D:hints at internal organs best left to the imagination. @@ -12715,13 +21397,37 @@ B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE | -F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND -S:1_IN_4 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | -S:BA_WATE | DARKNESS | BR_DARK | TELE_TO +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_WATE +F:SMART +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_4 +S:BA_WATE +S:BLIND +S:BR_DARK +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DARKNESS +S:SCARE +S:TELE_TO D:An enormously fearsome and powerful inhabitant of the depths. It D:resembles a gargantuan octopus and its evil is almost tangible. @@ -12735,14 +21441,32 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:COLD:6d14 B:BITE:COLD:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE -F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_FIRE +S:1_IN_4 +S:BLIND S:BR_COLD +S:CONF +S:SCARE D:An immense dragon capable of awesome destruction. You have never felt D:such extreme cold, or witnessed such an icy stare. Begone quickly or feel D:its wrath! @@ -12757,15 +21481,44 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:4d12 B:TOUCH:LOSE_DEX:4d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | S_UNDEAD | FORGET | S_DEMON | -S:TPORT | HEAL | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:FORGET +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:S_UNDEAD +S:TELE_TO +S:TPORT D:A lich who is partially immaterial, on its way to a new, ethereal form. N:743:The Phoenix @@ -12778,15 +21531,36 @@ B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 -F:UNIQUE | CAN_SPEAK | RES_PLAS | AURA_FIRE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:ANIMAL | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP -F:JOKEANGBAND | HAS_LITE | REGENERATE -S:1_IN_3 | -S:BO_FIRE | BO_PLAS | BA_FIRE | -S:BR_FIRE | BR_LITE | BR_PLAS +F:ANIMAL +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_PLAS +F:SUSCEP_COLD +F:UNIQUE +S:1_IN_3 +S:BA_FIRE +S:BO_FIRE +S:BO_PLAS +S:BR_FIRE +S:BR_LITE +S:BR_PLAS D:A massive glowing eagle bathed in flames. The searing heat chars your D:skin and melts your armour. @@ -12800,14 +21574,38 @@ B:STING:LOSE_CON:8d8 B:STING:LOSE_CON:8d8 B:BITE:ACID:10d10 B:BITE:ACID:10d10 -F:FORCE_SLEEP | SMART | KILL_WALL | CAN_SWIM | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | RES_TELE | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | BR_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:BR_NETH +S:SCARE +S:S_UNDEAD D:This intensely evil creature bears the form of a gargantuan black worm. D:Its gaping maw is a void of blackness, acid drips from its steely hide. D:It is like nothing you have ever seen before, and a terrible chill runs @@ -12822,11 +21620,21 @@ E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:3d9 B:BITE:POISON:2d8 -F:FRIENDS | -F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | IM_POIS | CAN_FLY -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A hideous, smallish giant that is often found near or with orcs. D:This ogre prefers living in the forest and can pass through D:thick forests with ease. @@ -12840,10 +21648,19 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | PET | -F:GOOD | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:GIANT +F:GOOD +F:HAS_LITE +F:MORTAL +F:OPEN_DOOR +F:PET +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A rebel among ogres, who has joined the forces of the Light to D:fight agains the Shadow. @@ -12857,10 +21674,20 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:DROP_60 | WILD_TOO | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | PET | -F:GOOD | GIANT | MALE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:GIANT +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:WILD_MOUNTAIN +F:WILD_TOO D:A ten foot tall humanoid with powerful muscles. This giant has D:abandoned the Darkness in favour of the forces of good. Thus he D:is a rebel and hated among his kind. @@ -12871,13 +21698,35 @@ I:130:60d10:20:110:10 W:57:2:10:18000 E:0:0:0:1:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE | -F:SMART | COLD_BLOOD | CAN_SWIM | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:TELE_AWAY | BLIND | CONF | SCARE | CAUSE_3 | FORGET | DARKNESS | -S:BO_FIRE | BO_ACID | BO_COLD | BO_ELEC +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_3 +S:CONF +S:DARKNESS +S:FORGET +S:SCARE +S:TELE_AWAY D:A skeletal hand floating in the air, motionless except for its flexing D:fingers. @@ -12887,13 +21736,30 @@ I:130:10d100:20:90:10 W:58:2:2:21000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE | -F:SMART | COLD_BLOOD | -F:EVIL | UNDEAD | CAN_SWIM | -F:IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:BO_MANA | BO_NETH | BA_NETH | BRAIN_SMASH | S_UNDEAD +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BA_NETH +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:S_UNDEAD D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it D:harmless. @@ -12903,14 +21769,33 @@ I:130:14d100:20:120:10 W:59:2:1000:24000 E:0:0:0:0:1:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | RES_TELE | -F:SMART | COLD_BLOOD | -F:EVIL | UNDEAD | CAN_SWIM | -F:IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:SLOW | CAUSE_4 | MIND_BLAST | BRAIN_SMASH | TRAPS | BO_PLAS | -S:BO_NETH | BA_WATE | S_UNDEAD +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_1 +S:BA_WATE +S:BO_NETH +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:MIND_BLAST +S:SLOW +S:S_UNDEAD +S:TRAPS D:A glowing skull possessed by sorcerous power. It need not move, but D:merely blast you with mighty magic. @@ -12924,11 +21809,22 @@ B:ENGULF:CONFUSE:5d5 B:ENGULF:CONFUSE:5d5 B:ENGULF:HURT:5d5 B:ENGULF:HURT:5d5 -F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP | -F:RAND_50 | RAND_25 | CAN_FLY | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_6 | +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +S:1_IN_6 S:BR_CHAO D:Void, nothingness, spinning destructively. @@ -12942,15 +21838,53 @@ B:ENGULF:ELEC:5d5 B:ENGULF:FIRE:5d5 B:ENGULF:ACID:5d5 B:ENGULF:COLD:5d5 -F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP | CAN_FLY | -F:RAND_50 | RAND_25 | AURA_COLD | RES_WATE | RES_DISE | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_NETH | RES_NEXU | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | AURA_FIRE | AURA_ELEC | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RES_PLAS | BASEANGBAND | NO_CUT -S:1_IN_6 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | BR_LITE | -S:BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | BR_NETH | -S:BR_WALL | BR_INER | BR_TIME | BR_GRAV | BR_PLAS | BR_NEXU +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RAND_25 +F:RAND_50 +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_WATE +S:1_IN_6 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL D:An awesome vortex of pure magic, power radiates from its frame. # New monster added by furiosity for the Theme module @@ -12960,12 +21894,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_SPIDER +S:TPORT D:It is a pulsing flesh mound that was once a spider. # New monster added by furiosity for the Theme module @@ -12975,12 +21918,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_HOUND +S:TPORT D:It is a pulsing flesh mound that was once a hound. N:755:Thuringwethil, the Vampire Messenger @@ -12993,15 +21945,45 @@ B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 B:HIT:CONFUSE:6d6 B:HIT:CONFUSE:6d6 -F:UNIQUE | FEMALE | SPECIAL_GENE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SPEAK | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | NO_STUN -F:RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_NETH | S_KIN | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_KIN D:Chief messenger between Sauron and Morgoth, she is the most deadly of the D:vampire race on Middle-earth. At first she is charming to meet, but her D:wings and eyes give away her true form. @@ -13016,14 +21998,33 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:6d14 B:BITE:FIRE:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | AURA_FIRE | -F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SUSCEP_COLD +S:1_IN_4 +S:BLIND S:BR_FIRE +S:CONF +S:SCARE D:A vast dragon of immense power. Fire leaps continuously from its huge D:form. The air around it scalds you. Its slightest glance burns you, and D:you realise how truly insignificant you are. @@ -13035,12 +22036,22 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | AQUATIC | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_HYDRA +S:TPORT D:It is a pulsing flesh mound that was once a many-headed reptile. # New monster added by furiosity for the Theme module @@ -13050,12 +22061,22 @@ I:120:48d10:20:1:0 W:45:3:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | PET | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:PET +S:1_IN_2 +S:BLINK S:S_KIN +S:TPORT D:It is a pulsing flesh mound that was once a fellow adventurer. N:759:Draconic quylthulg @@ -13064,12 +22085,21 @@ I:120:48d10:20:1:0 W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TPORT | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +S:1_IN_2 +S:BLINK S:S_DRAGON +S:TPORT D:It looks like it was once a dragon corpse, now deeply infected with D:bacteria that make it pulse in a foul way. @@ -13084,11 +22114,22 @@ B:GAZE:CONFUSE B:HIT:COLD:2d6 B:HIT:HURT:2d6 B:BITE:COLD:3d6 -F:EMPTY_MIND | COLD_BLOOD | IM_COLD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | SUSCEP_FIRE | AURA_COLD | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SUSCEP_FIRE D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It is adapted to extreme cold environments. @@ -13103,13 +22144,25 @@ B:GAZE:CONFUSE B:HIT:EXP_40:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 -F:EMPTY_MIND | COLD_BLOOD | SMART | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | RES_NETH | HURT_LITE | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:DARKNESS | S_UNDEAD +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_NETH +F:SMART +S:1_IN_8 +S:DARKNESS +S:S_UNDEAD D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It seems to be surrounded by an impenetrable D:shadow. @@ -13124,15 +22177,40 @@ B:HIT:HURT:10d10 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | PET | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:HEAL | BLIND | CONF | SCARE | CAUSE_3 | CAUSE_4 | BRAIN_SMASH | -S:FORGET | S_MONSTERS | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:HEAL +S:SCARE +S:S_ANIMALS +S:S_MONSTERS D:He is one of the greatest Dwarven priests to walk the earth. Fundin has D:earned a high position in the church, and his skill with both weapon and D:spell only justify his position further. His combination of Dwarven @@ -13148,14 +22226,31 @@ B:HIT:ACID:4d12 B:HIT:ACID:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_ACID | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | HASTE | -S:BR_ACID | +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_ACID +S:CONF +S:HASTE +S:SCARE S:S_DEMON D:The greatest of the demons, potent in both magical might D:and sheer battle power. This corrupted Maia's form is @@ -13172,11 +22267,19 @@ B:GAZE:CONFUSE B:HIT:POISON:2d6 B:HIT:HURT:2d6 B:BITE:POISON:3d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It looks poisonous. @@ -13191,11 +22294,22 @@ B:GAZE:CONFUSE B:HIT:FIRE:2d6 B:HIT:HURT:2d6 B:BITE:FIRE:3d6 -F:EMPTY_MIND | COLD_BLOOD | IM_FIRE | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | SUSCEP_COLD | AURA_FIRE | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SUSCEP_COLD D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It is surrounded by flames. @@ -13209,17 +22323,41 @@ B:CLAW:HURT:10d12 B:CLAW:HURT:10d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:UNIQUE | MALE | CAN_FLY | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | -F:BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BR_ACID | BR_FIRE | BR_DISI | BR_WALL | BR_TIME | -S:S_HI_DRAGON | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BR_ACID +S:BR_DISI +S:BR_FIRE +S:BR_TIME +S:BR_WALL +S:S_HI_DRAGON +S:S_KIN D:"Rushing Jaws" is his name, and death is his game; the greatest and most D:terrible of all dragonkind, his power dismayed even the Valar for a time. @@ -13234,11 +22372,18 @@ B:GAZE:CONFUSE B:HIT:POISON:2d6 B:HIT:HURT:2d6 B:BITE:PARALYZE:3d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. Its preferred habitat is a forest, however. @@ -13252,14 +22397,36 @@ B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:7d7 B:HIT:UN_BONUS:7d7 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | CAN_SWIM | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:BLIND | SCARE | BRAIN_SMASH | -S:BO_MANA | BO_NETH | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:SCARE +S:S_UNDEAD D:A huge giant garbed in black, more massive than a titan and stronger than D:a dragon. With terrible blows, it breaks your armour from your back, D:leaving you defenceless against its evil wrath. It can smell your fear, @@ -13277,11 +22444,20 @@ B:GAZE:CONFUSE B:HIT:BLIND:2d6 B:HIT:HURT:2d6 B:BITE:EAT_LITE:3d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | HURT_LITE | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_LITE +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It prefers to dwell in dark caves where there is D:no sun. @@ -13297,11 +22473,20 @@ B:GAZE:CONFUSE B:HIT:HALLU:2d6 B:HIT:HURT:2d6 B:BITE:INSANITY:3d6 -F:EMPTY_MIND | COLD_BLOOD | IM_COLD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It is an extremely confusing sight to behold. @@ -13315,18 +22500,56 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:UNIQUE | MALE | ATTR_MULTI | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:DROP_GREAT | DROP_CHOSEN | SPECIAL_GENE -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | MIND_BLAST | FORGET | TRAPS | ANIM_DEAD | BO_MANA | -S:BO_ICEE | BA_ACID | BA_FIRE | BA_COLD | BA_WATE | BA_CHAO | -S:S_UNDEAD | S_DEMON | S_HI_DRAGON | S_ANIMALS | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_ACID +S:BA_CHAO +S:BA_COLD +S:BA_FIRE +S:BA_WATE +S:BLIND +S:BO_ICEE +S:BO_MANA +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:MIND_BLAST +S:SCARE +S:S_ANIMALS +S:S_DEMON +S:S_HI_DRAGON +S:S_UNDEAD +S:TELE_AWAY +S:TPORT +S:TRAPS D:Originally known as the White, Saruman fell prey to Sauron's wiles. He D:searches forever for the One Ring, to become a mighty Sorcerer-King of the D:world. @@ -13341,13 +22564,25 @@ B:TOUCH:EAT_GOLD:5d5 B:TOUCH:EAT_ITEM:5d5 B:HIT:BLIND:10d5 B:HIT:POISON:8d5 -F:UNIQUE | MALE | CAN_SPEAK | SMART | -F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:IM_POIS | BASEANGBAND -S:1_IN_6 | -S:TELE_TO | TRAPS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:TELE_TO +S:TRAPS D:He is a master of disguise, an expert of stealth, a genius at traps, and D:moves with blinding speed. @@ -13361,14 +22596,32 @@ B:HIT:ELEC:4d12 B:HIT:ELEC:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_ELEC | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | HASTE | -S:BR_ELEC | +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_ELEC +S:CONF +S:HASTE +S:SCARE S:S_DEMON D:The greatest of the demons, potent in both magical might D:and sheer battle power. This corrupted Maia's form is @@ -13384,15 +22637,39 @@ B:HIT:EXP_40:6d6 B:HIT:EXP_40:6d6 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | -F:EVIL | UNDEAD | CAN_FLY | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:HOLD | DRAIN_MANA | BLIND | S_UNDEAD | CONF | -S:SCARE | TELE_TO | TPORT | BRAIN_SMASH | ANIM_DEAD -S:BA_NETH | DARKNESS +F:BASEANGBAND +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:RES_TELE +F:TAKE_ITEM +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD +S:TELE_TO +S:TPORT D:It is a massive form of animated death, its colour deeper than black. It D:drinks in light, and space around it is twisted and torn by the weight of D:its evil. It is unlife and it knows nothing but the stealing of souls and @@ -13408,13 +22685,40 @@ B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE | -F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE | -F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND -S:1_IN_3 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | TELE_TO | TELE_AWAY | -S:BA_WATE | DARKNESS | BR_DARK | BR_ACID | BR_POIS +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_WATE +F:SMART +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_3 +S:BA_WATE +S:BLIND +S:BR_ACID +S:BR_DARK +S:BR_POIS +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DARKNESS +S:SCARE +S:TELE_AWAY +S:TELE_TO D:An enormously fearsome and powerful inhabitant of the depths. It D:resembles a gargantuan octopus and its evil is almost tangible. @@ -13428,15 +22732,43 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:8d12 B:TOUCH:LOSE_DEX:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | CAN_FLY | -F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:BLINK | TELE_TO | BLIND | HOLD | SCARE | CAUSE_4 | -S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | FORGET | -S:TPORT | HEAL | S_DEMON | BA_NETH | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:FORGET +S:HEAL +S:HOLD +S:SCARE +S:S_DEMON +S:S_HI_UNDEAD +S:TELE_TO +S:TPORT D:A lich who has reached its ultimate evolutionary stage: a completely D:immaterial state. @@ -13451,14 +22783,26 @@ B:CLAW:CONFUSE:12d12 B:CLAW:LOSE_DEX:2d12 B:CLAW:BLIND:10d5 B:BITE:PARALYZE:15d1 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | BASEANGBAND -S:1_IN_3 | -S:TELE_TO | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE +S:1_IN_3 +S:S_KIN +S:TELE_TO D:Master of all things feline and mighty servant of Morgoth. A great cat, coal-black and evil to look upon. His eyes are long and very narrow and slanted, and gleam both red and green. His great grey whiskers are as stout and sharp as needles. His purr is like the roll of drums and his growl like thunder. N:778:Jabberwock @@ -13471,14 +22815,22 @@ B:CLAW:HURT:10d10 B:CLAW:HURT:10d10 B:BITE:HURT:10d10 B:BITE:HURT:10d10 -F:ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | -F:ONLY_ITEM | DROP_60 | DROP_90 | -F:BASH_DOOR | CAN_FLY | DROP_CORPSE | -F:ANIMAL | MORTAL | JOKEANGBAND | -S:1_IN_5 | -S:CAUSE_4 | +F:ANIMAL +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_FLY +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:JOKEANGBAND +F:MORTAL +F:ONLY_ITEM +F:RES_TELE +S:1_IN_5 S:BR_CHAO +S:CAUSE_4 D:"Beware the Jabberwock, my son! The jaws that bite, the claws that catch!" N:779:Chaos hound @@ -13491,10 +22843,18 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 -F:ATTR_MULTI | ATTR_ANY | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | FRIENDS | BASH_DOOR | -F:ANIMAL | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_5 | +F:ANIMAL +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:NO_CONF +F:NO_SLEEP +S:1_IN_5 S:BR_CHAO D:A constantly changing canine form, this hound rushes towards you as if D:expecting mayhem and chaos ahead. It appears to have an almost kamikaze @@ -13511,11 +22871,19 @@ B:GAZE:CONFUSE B:HIT:HALLU:2d6 B:HIT:LOSE_ALL:2d6 B:BITE:EXP_40:3d6 -F:EMPTY_MIND | COLD_BLOOD | -F:BASH_DOOR | KILL_WALL | DROP_SKELETON | -F:ANIMAL | EVIL | -F:IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_SKELETON +F:EMPTY_MIND +F:EVIL +F:HURT_ROCK +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP D:This bizarre creature has glaring eyes and large mandibles capable of D:slicing through rock. It is surrounded by an aura of chaotic forces. @@ -13529,12 +22897,32 @@ B:BITE:EXP_80:6d6 B:GAZE:PARALYZE:5d5 B:GAZE:INSANITY:5d5 B:GAZE:UN_POWER:5d5 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY | -F:BASH_DOOR | FEMALE | SMART | DROP_CORPSE | -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH | -S:BA_DARK | BO_MANA | BA_ACID | BA_FIRE | BA_COLD | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +F:SMART +S:1_IN_2 +S:BA_ACID +S:BA_COLD +S:BA_DARK +S:BA_FIRE +S:BLIND +S:BO_MANA +S:BO_NETH +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE S:S_KIN D:A mother of the race of beholders, she can summon her brood to her aid D:whenever she wishes. @@ -13549,12 +22937,32 @@ B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 B:CRUSH:HURT:6d15 B:CRUSH:HURT:6d15 -F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:ANIMAL | NO_CONF | NO_SLEEP | NO_FEAR | DROP_CORPSE | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:WILD_OCEAN +F:WILD_TOO S:1_IN_9 -S:BR_FIRE | BR_ACID | BR_DARK | BR_POIS | BA_WATE | -S:S_DRAGON | S_HYDRA | HEAL | CONF | DARKNESS +S:BA_WATE +S:BR_ACID +S:BR_DARK +S:BR_FIRE +S:BR_POIS +S:CONF +S:DARKNESS +S:HEAL +S:S_DRAGON +S:S_HYDRA D:An enormous, terrible sea-monster, the true master of the ocean. N:783:Great Worm of Chaos @@ -13567,15 +22975,35 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 -F:ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | FORCE_MAXHP | RES_DISE | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_CHAO | BR_DISE | -S:S_DRAGON | S_HI_DRAGON +F:ATTR_ANY +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_DISE +S:1_IN_4 +S:BLIND +S:BR_CHAO +S:BR_DISE +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon of changing form. As you watch, it appears first fair D:and then foul. Its body is twisted by chaotic forces as it strives to D:stay real. Its very existence distorts the universe around it. @@ -13590,15 +23018,34 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY | -F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_SOUN | BR_SHAR | -S:S_DRAGON | S_HI_DRAGON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon of powerful intellect. It seeks to dominate the universe D:and despises all other life. It sees all who do not obey it as mere D:insects to be crushed underfoot. @@ -13613,15 +23060,38 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:BITE:HURT:8d14 B:BITE:HURT:8d14 -F:DRAGON | EVIL | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | RES_DISE | -F:NO_STUN | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_SOUN | BR_CHAO | BR_SHAR | BR_DISE | -S:S_DRAGON | S_HI_DRAGON +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:RES_DISE +S:1_IN_4 +S:BLIND +S:BR_CHAO +S:BR_DISE +S:BR_SHAR +S:BR_SOUN +S:CONF +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:A massive dragon, it is thousands of D:years old and seeks to maintain the Cosmic Balance. It sees you as an D:upstart troublemaker without the wisdom to control your actions. @@ -13637,12 +23107,24 @@ B:HIT:ACID:3d4 B:HIT:ACID:3d4 B:HIT:ACID:3d4 B:HIT:ACID:3d4 -F:FORCE_MAXHP | IM_ACID | HURT_LITE | -F:EMPTY_MIND | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:PASS_WALL D:It is a tougher relative of the Xorn. Its hide glitters with drops of acid. N:787:White Balrog @@ -13655,14 +23137,32 @@ B:HIT:COLD:4d12 B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_COLD | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | HASTE | -S:BR_COLD | +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_COLD +S:CONF +S:HASTE +S:SCARE S:S_DEMON D:The greatest of the demons, potent in both magical might D:and sheer battle power. This corrupted Maia's form is @@ -13679,12 +23179,25 @@ B:HIT:FIRE:3d4 B:HIT:FIRE:3d4 B:HIT:FIRE:3d4 B:HIT:FIRE:3d4 -F:FORCE_MAXHP | IM_ACID | SUSCEP_COLD | -F:EMPTY_MIND | COLD_BLOOD | HURT_LITE | -F:ONLY_GOLD | DROP_2D2 | AURA_FIRE | -F:KILL_ITEM | PASS_WALL | -F:IM_FIRE | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:AURA_FIRE +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD +F:PASS_WALL +F:SUSCEP_COLD D:It is a tougher relative of the Xorn. Its hide is wreathed in flames. N:789:Trone, the Rebel Thunderlord @@ -13697,15 +23210,37 @@ B:HIT:HURT:12d10 B:HIT:HURT:12d10 B:CHARGE:HURT:10d10 B:CHARGE:HURT:10d10 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | SPECIAL_GENE | -F:FORCE_MAXHP | REGENERATE | THUNDERLORD | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | IM_POIS | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TELE_TO | SCARE | BR_TIME | BR_FIRE | -S:BO_MANA | S_THUNDERLORD +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BO_MANA +S:BR_FIRE +S:BR_TIME +S:SCARE +S:S_THUNDERLORD +S:TELE_TO D:As the Thunderlords came from afar to help the Elves, Trone and his rebel D:wing came to defend Morgoth. He is an evil and powerful Thunderlord. @@ -13719,15 +23254,42 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:CLAW:HURT:8d14 B:BITE:HURT:8d14 -F:ATTR_MULTI | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | AURA_ELEC | RES_TELE | -F:IM_FIRE | IM_ACID | IM_POIS | IM_COLD | IM_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BR_POIS | BR_ELEC | BR_ACID | BR_FIRE | BR_COLD | -S:CONF | SCARE | BLIND +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +S:1_IN_4 +S:BLIND +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:CONF +S:SCARE D:A huge dragon whose scales shimmer in myriad hues. N:791:Marda, rider of gold Laronth @@ -13740,15 +23302,44 @@ B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 -F:UNIQUE | FEMALE | CAN_SPEAK | THUNDERLORD | ONLY_ITEM | RES_TELE | -F:DROP_CHOSEN | DROP_CORPSE | DROP_SKELETON | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | -F:EVIL | IM_POIS | IM_ELEC | SMART | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:MORTAL | HAS_LITE | AQUATIC | -S:1_IN_4 | -S:SCARE | BLIND | TPORT | BLINK | TELE_AWAY | TELE_TO | -S:BR_FIRE | BA_MANA | S_THUNDERLORD +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BA_MANA +S:BLIND +S:BLINK +S:BR_FIRE +S:SCARE +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:Former leader among the Thunderlords, she and Trone have fallen under the D:control of Morgoth. Laronth, her eagle, can summon Thunderlords to her aid. D:She has somehow broken through to the Lonely Isle and is killing the swans @@ -13766,16 +23357,38 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | CAN_FLY | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | -F:EVIL | UNDEAD | IM_COLD | AURA_COLD | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | NO_STUN -S:1_IN_3 | -S:BLIND | HOLD | CONF | -S:BA_DARK | BA_NETH | -S:S_WRAITH | S_HI_UNDEAD | S_KIN +F:AURA_COLD +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_DARK +S:BA_NETH +S:BLIND +S:CONF +S:HOLD +S:S_HI_UNDEAD +S:S_KIN +S:S_WRAITH D:This huge affront to existence twists and tears at the fabric of space. D:Darkness itself recoils from the touch of Tselakus as he leaves a trail D:of death and destruction. Mighty claws rend reality as he @@ -13791,16 +23404,37 @@ B:CLAW:HURT:6d12 B:CLAW:HURT:6d12 B:BITE:ELEC:8d14 B:BITE:ELEC:8d14 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | AURA_COLD | DROP_CORPSE | -F:IM_ELEC | EVIL | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | -F:DRAGON | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BR_ELEC | BR_GRAV | BR_LITE | -S:S_DRAGON | S_HI_DRAGON | -S:SCARE | BLIND +F:AURA_COLD +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:RES_TELE +S:1_IN_4 +S:BLIND +S:BR_ELEC +S:BR_GRAV +S:BR_LITE +S:SCARE +S:S_DRAGON +S:S_HI_DRAGON D:The mightiest elemental dragon of air, it can destroy you with ease. N:794:Eilinel the Entrapped @@ -13813,13 +23447,33 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:TOUCH:UN_POWER:3d3 B:TOUCH:UN_BONUS:3d3 -F:UNIQUE | FEMALE | -F:FORCE_MAXHP | -F:DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | NO_STUN -S:1_IN_2 | -S:BLINK | TELE_TO | HEAL | S_MONSTER | BO_ACID | BO_MANA | CAUSE_3 +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_COLD +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:BLINK +S:BO_ACID +S:BO_MANA +S:CAUSE_3 +S:HEAL +S:S_MONSTER +S:TELE_TO D:In life, she was the wife of Gorlim. In death, her shade was D:entrapped by Morgoth and used to trick her husband into betraying D:Barahir. Now she is totally entrapped by Morgoth's power, and uses @@ -13835,13 +23489,34 @@ B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | KILL_BODY | POWERFUL | -F:EVIL | DEMON | NO_CONF | NO_SLEEP | CAN_FLY | -F:IM_FIRE | IM_COLD | IM_POIS | IM_ACID | IM_ELEC -S:1_IN_5 | -S:HASTE | SLOW | SCARE | S_HI_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +S:1_IN_5 +S:HASTE +S:SCARE +S:SLOW +S:S_HI_DEMON D:Festooned with horns and fierce claws, these monstrous forms are the D:shock troops of Morgoth, known for their strength and fierce weapons. D:A giant humanoid demon wielding a massive, heavy and sharp scythe. @@ -13860,12 +23535,24 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:FORCE_MAXHP | IM_ACID | HURT_LITE | -F:EMPTY_MIND | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | -F:KILL_ITEM | KILL_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It is a tougher relative of the Xorn. Its hide glitters with drops of venom. # New monster added by furiosity for the Theme module @@ -13879,12 +23566,25 @@ B:HIT:ELEC:3d4 B:HIT:ELEC:3d4 B:HIT:ELEC:3d4 B:HIT:ELEC:3d4 -F:FORCE_MAXHP | IM_ACID | HURT_LITE | -F:EMPTY_MIND | COLD_BLOOD | -F:ONLY_GOLD | DROP_2D2 | AURA_ELEC | -F:KILL_ITEM | KILL_WALL | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT +F:AURA_ELEC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_2D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:HURT_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_ITEM +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_GOLD D:It is a tougher relative of the Xorn. It is surrounded by sparks. N:798:Black reaver @@ -13897,15 +23597,40 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SWIM | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE | -F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR | -F:BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_MANA | BA_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:KILL_WALL +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +S:1_IN_3 +S:BA_MANA +S:BA_NETH +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:DRAIN_MANA +S:HOLD +S:S_UNDEAD +S:TELE_TO D:A humanoid form, black as night, advancing steadily and unstoppably, even D:the very rock of the dungeon cannot prevent it reaching you. @@ -13918,13 +23643,39 @@ O:20:40:40:0 B:HIT:HURT:4d5 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:MALE | ONLY_ITEM | FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 | -F:SMART | BASH_DOOR | TAKE_ITEM | MOVE_BODY | -F:EVIL | IM_FIRE | IM_ELEC | IM_POIS | BASEANGBAND | -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR -S:1_IN_2 | -S:HEAL | BLIND | HOLD | CONF | SCARE | TPORT | BA_COLD | BA_FIRE | -S:MIND_BLAST | BRAIN_SMASH | S_MONSTERS | TELE_AWAY | BLINK | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:SMART +F:TAKE_ITEM +S:1_IN_2 +S:BA_COLD +S:BA_FIRE +S:BLIND +S:BLINK +S:BO_NETH +S:BRAIN_SMASH +S:CONF +S:HEAL +S:HOLD +S:MIND_BLAST +S:SCARE +S:S_MONSTERS +S:TELE_AWAY +S:TPORT D:A mindcrafter of the highest order. Powerful and evil, and a dangerous D:enemy: a master of mind over matter, of his own mind, and of the minds of D:others, who slavishly follow him into battle when he calls them. @@ -13935,12 +23686,22 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_DEMON +S:TELE_TO D:A massive pulsating mound of flesh, glowing with an inner hellish light. N:801:Greater draconic quylthulg @@ -13949,12 +23710,22 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_DRAGON +S:TELE_TO D:A massive mound of scaled flesh, throbbing and pulsating with multi-hued D:light. @@ -13964,12 +23735,23 @@ I:120:15d100:20:1:0 W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND |NO_CUT -S:1_IN_2 | -S:BLINK | TELE_TO | +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK S:S_HI_UNDEAD +S:TELE_TO D:A massive pile of rotting flesh. A disgusting stench fills the air as it D:throbs and writhes. @@ -13985,12 +23767,30 @@ B:CHARGE:TERRIFY B:CHARGE:TERRIFY B:CHARGE:TERRIFY B:CHARGE:TERRIFY -F:CHAR_CLEAR | ATTR_CLEAR | FORCE_MAXHP | SMART | -F:INVISIBLE | COLD_BLOOD | EMPTY_MIND | WEIRD_MIND | -F:PASS_WALL | UNDEAD | EVIL | NONLIVING | HURT_LITE | -F:IM_POIS | RES_TELE | NO_FEAR | NO_STUN | NO_SLEEP | -F:CAN_SWIM | NO_TARGET | AI_ANNOY | NO_CUT | CAN_SPEAK | +F:AI_ANNOY +F:ATTR_CLEAR +F:CAN_SPEAK +F:CAN_SWIM +F:CHAR_CLEAR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_POIS +F:INVISIBLE F:JOKEANGBAND +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:NO_TARGET +F:PASS_WALL +F:RES_TELE +F:SMART +F:UNDEAD +F:WEIRD_MIND S:1_IN_2 S:SCARE D:You can't see it. @@ -14005,18 +23805,46 @@ B:TOUCH:EXP_80:6d12 B:TOUCH:UN_POWER:6d12 B:TOUCH:LOSE_DEX:6d12 B:TOUCH:LOSE_DEX:6d12 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | -F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:BLINK | TELE_TO | HOLD | SCARE | CAUSE_4 | -S:BRAIN_SMASH | TRAPS | BA_MANA | -S:BO_MANA | BA_NETH | -S:S_MONSTERS | S_UNDEAD | S_KIN | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_MANA +S:BA_NETH +S:BLINK +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:HOLD +S:SCARE +S:S_KIN +S:S_MONSTERS +S:S_UNDEAD +S:TELE_TO +S:TRAPS D:A stench of corruption and decay surrounds this sorcerer, who has D:risen from the dead to continue his foul plots and schemes. @@ -14030,12 +23858,25 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:EAT_LITE:1d8 B:TOUCH:EXP_40 -F:FORCE_SLEEP | DROP_60 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:HOLD | SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:HOLD +S:SCARE D:An almost imperceptible silvery shimmer in the air. It D:seems to absorb light wherever it goes. @@ -14050,12 +23891,26 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:FORCE_SLEEP | DROP_60 | PET | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:GOOD | UNDEAD | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:HOLD | SCARE | CAUSE_2 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:FORCE_SLEEP +F:GOOD +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:PET +F:UNDEAD +S:1_IN_8 +S:CAUSE_2 +S:DARKNESS +S:HOLD +S:SCARE D:A fellow adventurer wraith. N:807:Balrog Captain @@ -14068,15 +23923,41 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:7d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | KILL_WALL | -F:RES_NETH | RES_PLAS | REGENERATE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | BRAIN_SMASH | -S:BR_FIRE | BA_NETH | BA_FIRE | BR_PLAS | BO_PLAS | -S:S_HI_DEMON | S_DEMON | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_PLAS +F:SMART +S:1_IN_3 +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_PLAS +S:BRAIN_SMASH +S:BR_FIRE +S:BR_PLAS +S:CONF +S:S_DEMON +S:S_HI_DEMON D:Originally of the semi-divine Maiar, this evil spirit swore allegiance D:to Morgoth at the beginning of time and is now one of his most terrible D:demonic servants. With its flaming whip and sword it seeks to destroy you. @@ -14091,15 +23972,36 @@ B:CLAW:POISON:8d6 B:CLAW:POISON:8d6 B:BITE:PARALYZE:8d10 B:STING:LOSE_STR:8d4 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | IM_ACID | -F:ANIMAL | SPIDER | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP -F:BASEANGBAND -S:1_IN_3 | -S:HEAL | BLIND | SLOW | CONF | SCARE | DARKNESS | BA_DARK | -S:BR_POIS | BR_DARK | S_SPIDER +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +F:SPIDER +F:UNIQUE +S:1_IN_3 +S:BA_DARK +S:BLIND +S:BR_DARK +S:BR_POIS +S:CONF +S:DARKNESS +S:HEAL +S:SCARE +S:SLOW +S:S_SPIDER D:This enormous, hideous spirit of void is in the form of a spider of D:immense proportions. She is surrounded by a cloud of Unlight as she sucks D:in all living light into her bloated body, and breathes out the blackest of @@ -14117,13 +24019,34 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | ORC | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:ORC +F:REGENERATE +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is an orc with an aura of power. You notice a sharp set of front D:teeth. @@ -14138,13 +24061,33 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | STUPID | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:STUPID +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a yeek with an aura of power. You notice a sharp set of front D:teeth. @@ -14158,18 +24101,51 @@ B:BITE:HURT:3d12 B:BITE:HURT:3d12 B:CLAW:HURT:3d12 B:CLAW:HURT:3d12 -F:ATTR_MULTI | ATTR_ANY | -F:FORCE_SLEEP | CAN_FLY | -F:FRIENDS | RES_NETH | RES_PLAS | RES_NEXU | RES_DISE | -F:BASH_DOOR | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:DROP_CORPSE | DROP_SKELETON | -F:ANIMAL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_5 | -S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS | -S:BR_LITE | BR_DARK | BR_SOUN | BR_CONF | BR_CHAO | BR_SHAR | -S:BR_NETH | BR_DISE | BR_WALL | BR_INER | BR_TIME | -S:BR_GRAV | BR_PLAS | BR_NEXU +F:ANIMAL +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +S:1_IN_5 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL D:A shifting, swirling form. It seems to be all colours and sizes and D:shapes, though the dominant form is that of a huge dog. You feel very D:uncertain all of a sudden. @@ -14184,13 +24160,39 @@ B:CLAW:FIRE:8d10 B:CLAW:FIRE:8d10 B:BITE:POISON:7d10 B:BITE:LOSE_CON:7d10 -F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING | SMART | -F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | POWERFUL | CAN_FLY | -F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP -S:1_IN_5 | -S:S_HI_DEMON | S_HI_DRAGON | BR_FIRE | BR_POIS | BR_CHAO | BA_CHAO | -S:SCARE | BA_FIRE | CAUSE_4 | ARROW_4 | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REGENERATE +F:SMART +S:1_IN_5 +S:ARROW_4 +S:BA_CHAO +S:BA_FIRE +S:BR_CHAO +S:BR_FIRE +S:BR_POIS +S:CAUSE_4 +S:MISSILE +S:SCARE +S:S_HI_DEMON +S:S_HI_DRAGON D:Appearing as a giant, clawed and winged humanoid with a scaly red body D:and massive fangs dripping a foul green liquid, the Greater Balrog is a D:dreadful enemy from the lowest depths of Morgoth's realm. They are often @@ -14207,13 +24209,35 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | STUPID | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | GIANT | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:GIANT +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:STUPID +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is an ogre with an aura of power. You notice a sharp set of front D:teeth. @@ -14228,13 +24252,34 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | TROLL | STUPID | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:STUPID +F:TROLL +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a troll with an aura of power. You notice a sharp set of front D:teeth. @@ -14249,13 +24294,32 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a dwarf with an aura of power. You notice a sharp set of front D:teeth. @@ -14270,13 +24334,33 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:SMART +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is an elf with an aura of power. You notice a sharp set of front D:teeth. @@ -14291,13 +24375,33 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | STUPID | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:STUPID +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is a gnome with an aura of power. You notice a sharp set of front D:teeth. @@ -14311,16 +24415,38 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:TOUCH:UN_POWER B:TOUCH:UN_POWER -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | -F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TELE_TO | HOLD | CAUSE_3 | TRAPS | ANIM_DEAD | -S:BO_PLAS | BA_DARK | BA_MANA | BA_FIRE | BA_WATE | BA_NETH -S:S_HI_DEMON | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_4D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BO_PLAS +S:CAUSE_3 +S:HOLD +S:S_HI_DEMON +S:S_HI_UNDEAD +S:TELE_TO +S:TRAPS D:The Mouth of Sauron is a mighty spellcaster. So old that even he cannot D:remember his own name, his power and evil are undeniable. He believes D:unshakably that he is unbeatable and laughs as he weaves his awesome @@ -14336,16 +24462,47 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_POWER:6d8 B:HIT:BLIND:6d8 B:HIT:CONFUSE:6d8 -F:UNIQUE | MALE | CAN_SPEAK | POWERFUL | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | DROP_GREAT | DROP_GOOD | SPECIAL_GENE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_FIRE | IM_COLD | -F:IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:CAUSE_3 | TELE_TO | BA_FIRE | DRAIN_MANA | HOLD | -S:TRAPS | BA_WATE | BO_PLAS | BA_NETH | -S:BA_MANA | BA_DARK | S_HI_UNDEAD | BA_CHAO | HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:INVISIBLE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BO_PLAS +S:CAUSE_3 +S:DRAIN_MANA +S:HAND_DOOM +S:HOLD +S:S_HI_UNDEAD +S:TELE_TO +S:TRAPS D:The dark master of the terrible fortress of southern Mirkwood. It is D:rumoured that this is in fact none other than Sauron in disguise: D:although if this is so, he has yet to reveal his full power - and perhaps @@ -14361,15 +24518,45 @@ B:HIT:HURT:10d15 B:HIT:HURT:10d15 B:HIT:HURT:10d15 B:HIT:HURT:10d15 -F:UNIQUE | FEMALE | THUNDERLORD | RES_TELE | CAN_FLY | GOOD | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | PET | AQUATIC | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM | -F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | REGENERATE | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TPORT | TELE_TO | BR_FIRE | S_THUNDERLORD | -S:TELE_AWAY | HEAL | BA_NETH | BO_NETH | BA_FIRE | BO_FIRE +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BA_FIRE +S:BA_NETH +S:BO_FIRE +S:BO_NETH +S:BR_FIRE +S:HEAL +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:A leader among the Thunderlords of good, she came to help you. N:821:Master quylthulg @@ -14378,11 +24565,26 @@ I:120:30d100:20:1:0 W:76:2:7000:15000 E:0:0:0:0:0:0 O:0:0:0:0 -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_2 | -S:S_MONSTERS | S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_ANIMALS | BLINK | TELE_TO +F:ANIMAL +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +S:1_IN_2 +S:BLINK +S:S_ANIMALS +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:TELE_TO D:A giant seething mass of flesh, overwhelming you with monster after monster. N:822:Qlzqqlzuup, the Lord of Flesh @@ -14391,14 +24593,34 @@ I:130:50d100:30:1:0 W:79:3:10000:20000 E:0:0:0:0:0:0 O:20:20:20:20 -F:UNIQUE | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | -F:ONLY_ITEM | DROP_4D2 | -F:INVISIBLE | EMPTY_MIND | ANIMAL | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND -S:1_IN_1 | -S:S_MONSTERS | S_HOUND | S_HYDRA | S_SPIDER | S_ANT | S_ANIMALS | -S:S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_WRAITH | S_UNIQUE | S_KIN +F:ANIMAL +F:BASEANGBAND +F:DROP_4D2 +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:INVISIBLE +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:RES_TELE +F:UNIQUE +S:1_IN_1 +S:S_ANIMALS +S:S_ANT +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_HOUND +S:S_HYDRA +S:S_KIN +S:S_MONSTERS +S:S_SPIDER +S:S_UNIQUE +S:S_WRAITH D:A gigantic seething mass of flesh, Qlzqqlzuup changes colours in front D:of your eyes. Pulsating first one colour then the next, it knows only it D:must bring help to protect itself. @@ -14414,13 +24636,33 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:FORCE_SLEEP | FORCE_MAXHP | -F:COLD_BLOOD | DROP_60 | DROP_1D2 | PET | -F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY | -F:GOOD | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_9 | -S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_1D2 +F:DROP_60 +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:PET +F:REGENERATE +F:UNDEAD +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:FORGET +S:HOLD +S:MIND_BLAST +S:SCARE +S:TELE_TO D:It is an adventurer with an aura of power. You notice a sharp set D:of front teeth. @@ -14434,15 +24676,45 @@ B:HIT:HURT:15d15 B:HIT:HURT:15d15 B:HIT:HURT:15d15 B:HIT:HURT:15d15 -F:UNIQUE | MALE | THUNDERLORD | RES_TELE | CAN_FLY | CAN_SPEAK | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON | -F:FORCE_SLEEP | FORCE_MAXHP | PET | GOOD | AQUATIC | -F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM | -F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | IM_FIRE | REGENERATE | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:SCARE | TPORT | TELE_TO | S_THUNDERLORD | -S:TELE_LEVEL | HEAL | BR_FIRE | BR_TIME | ROCKET +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_4D2 +F:DROP_60 +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:BR_TIME +S:HEAL +S:ROCKET +S:SCARE +S:S_THUNDERLORD +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:A leader from afar, he has come with his eagle to help you in D:your battle. Having already saved his home, he now wants to save Arda. @@ -14456,16 +24728,41 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 -F:UNIQUE | MALE | -F:FORCE_MAXHP | CAN_SPEAK | SMART | EVIL | AI_SPECIAL | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | KILL_WALL | MOVE_BODY | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_POIS | SPECIAL_GENE | -F:REGENERATE | REFLECTING | DROP_SKELETON | DROP_CORPSE | BASEANGBAND -F:HAS_LITE -S:1_IN_6 | -S:S_MONSTERS | S_WRAITH | S_HI_UNDEAD | -S:S_HI_DRAGON | S_HI_DEMON | S_UNIQUE | S_ANIMALS +F:AI_SPECIAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:REGENERATE +F:SMART +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:S_ANIMALS +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH D:The son of Eol the Dark Elf, Maeglin is every bit as evil as his father D:and more. His greed for gold led him to betray the Hidden Kingdom of D:Gondolin to Morgoth's forces. He is a mighty warrior himself, and some @@ -14479,9 +24776,17 @@ W:7:1:200:16 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:2d4 -F:RAND_50 | WILD_TOO | WILD_SHORE | WILD_SWAMP | -F:BASH_DOOR | DROP_CORPSE | IM_COLD | WILD_WASTE | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:IM_COLD +F:MORTAL +F:RAND_50 +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WASTE D:It is a strange frog adapted to cold environments. # New monster added by furiosity for the Theme module @@ -14493,9 +24798,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:POISON:2d4 -F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP | -F:DROP_CORPSE | HAS_EGG | IMPRESED | IM_POIS | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:IM_POIS +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:It is a small lizard that usually lives in the D:marshlands. It looks poisonous. @@ -14508,9 +24821,16 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:EAT_LITE:2d4 -F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP | -F:DROP_CORPSE | IM_POIS | HURT_LITE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HURT_LITE +F:IM_POIS +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:A frog that seems to emit a strange dark light. N:829:Greater Hellhound @@ -14522,11 +24842,22 @@ O:0:0:0:0 B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE -F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD | -F:BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE | -S:1_IN_5 | BR_FIRE +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_FIRE +F:MOVE_BODY +F:RAND_25 +F:SUSCEP_COLD +S:1_IN_5 +S:BR_FIRE D:It is a giant dog that glows with heat. Flames pour from its nostrils. N:830:Cantoras, the Skeletal Lord @@ -14539,16 +24870,44 @@ B:GAZE:EXP_80:5d5 B:GAZE:EXP_80:5d5 B:TOUCH:POISON:5d5 B:TOUCH:POISON:5d5 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_TO | SLOW | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BO_ICEE | BO_MANA | BA_WATE | BA_NETH | -S:S_HI_UNDEAD | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_NETH +S:BA_WATE +S:BO_ICEE +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:SCARE +S:SLOW +S:S_HI_UNDEAD +S:TELE_TO D:A legion of evil undead druj animating the skeleton of a once mighty D:sorcerer. His power is devastating and his speed unmatched in the D:underworld. @@ -14562,9 +24921,17 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:ELEC:2d4 -F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP | -F:DROP_CORPSE | HAS_EGG | IMPRESED | IM_ELEC | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:HAS_EGG +F:IMPRESED +F:IM_ELEC +F:MORTAL +F:WILD_SWAMP +F:WILD_TOO +F:WILD_WOOD D:It is a small lizard with powerful jaws which cause D:sparks to fly as they snap shut. @@ -14576,11 +24943,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EXP_40:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | RES_NETH | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:RAND_25 +F:RAND_50 +F:RES_NETH +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_NETH D:The size of a large bird, this fly carries with it the D:stench of decay. @@ -14593,11 +24968,18 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:TERRIFY:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_NUKE D:The size of a large bird, this fly comes from a dark swamp. @@ -14609,11 +24991,20 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | AURA_FIRE | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_FIRE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_FIRE D:The size of a large bird, this fly is surrounded by flames. @@ -14625,11 +25016,20 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:PARALYZE:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ACID | IM_POIS | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ACID +F:IM_POIS +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_DARK D:The size of a large bird, this fly prefers to dwell in D:the forest, and is rather stealthy. @@ -14642,11 +25042,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | IM_ELEC | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_ELEC D:The size of a large bird, this fly crackles with sparks. @@ -14658,11 +25066,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | NO_CUT | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_SHAR D:The size of a large bird, this fly dives from the earth D:into the air, and back. @@ -14677,13 +25093,28 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:UN_POWER:10d10 B:TOUCH:UN_POWER:10d10 -F:UNIQUE | ATTR_MULTI | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | IM_FIRE | IM_COLD | NO_SLEEP | BASEANGBAND -S:1_IN_2 | -S:BR_FIRE | BR_COLD | BR_DISE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_FIRE +F:MOVE_BODY +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_2 +S:BR_COLD +S:BR_DISE +S:BR_FIRE D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable D:and immune to magic. Fear its anger, for its devastation is unmatched. @@ -14697,17 +25128,37 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | -S:BR_FIRE | BR_PLAS | -S:S_HI_DEMON | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_4 +S:BLIND +S:BR_FIRE +S:BR_PLAS +S:CONF +S:SCARE +S:S_HI_DEMON +S:S_UNDEAD D:A massive form cloaked in flame. Lungorthin stares balefully at you with D:eyes that smoulder red. The dungeon floor where he stands is scorched by D:the heat of his body. @@ -14722,15 +25173,30 @@ B:CLAW:HURT:6d8 B:CLAW:HURT:6d8 B:BITE:POISON:6d6 B:BITE:POISON:6d6 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | ESCORTS | DROP_CORPSE | -F:RAND_25 | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_POIS | BASEANGBAND -S:1_IN_3 | -S:SCARE | S_MONSTERS | S_HOUND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:TAKE_ITEM +F:UNIQUE +S:1_IN_3 +S:SCARE +S:S_HOUND +S:S_MONSTERS D:Draugluin provides Sauron with a fearsome personal guard. He is an D:enormous wolf inhabited by a human spirit. He is chief of all his kind. @@ -14742,11 +25208,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | NO_CUT | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_INER D:The size of a large bird, this fly moves slowly. @@ -14758,11 +25232,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | NO_CUT | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_CHAO D:The size of a large bird, this fly is surrounded by an D:aura of raw chaos. @@ -14775,11 +25257,19 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | NO_CUT | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BR_PLAS D:The size of a large bird, this fly seems to scorch the D:very air around it. @@ -14794,18 +25284,48 @@ B:HIT:EXP_80:7d12 B:HIT:LOSE_DEX:7d12 B:HIT:UN_POWER:7d12 B:HIT:UN_POWER:7d12 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ESCORT | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_SLEEP | BASEANGBAND -F:NO_CUT -S:1_IN_3 | -S:TPORT | BLIND | SCARE | CAUSE_4 | BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_FIRE | BA_NETH | -S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_KIN | HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_4 +S:HAND_DOOM +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:TPORT D:The greatest of all undead sorcerers, even the gods once feared him. This D:ancient shadow of death wilts every living thing it passes. @@ -14817,11 +25337,21 @@ W:20:2:150:70 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FORCE_SLEEP | RAND_50 | RAND_25 | -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP | -F:ANIMAL | NO_CUT | AQUATIC | RES_WATE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:FORCE_SLEEP +F:MORTAL +F:NO_CUT +F:RAND_25 +F:RAND_50 +F:RES_WATE +F:WEIRD_MIND +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_10 S:BA_WATE D:The size of a large bird, this fly prefers watery regions. @@ -14833,8 +25363,14 @@ W:4:1:200:3 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d2 -F:RAND_25 | SUSCEP_COLD | ANIMAL | IM_FIRE | -F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:IM_FIRE +F:MORTAL +F:RAND_25 +F:SUSCEP_COLD S:MULTIPLY D:It is about three feet long with large teeth and red fur. D:It is a corrupted creature of Melkor. @@ -14849,20 +25385,69 @@ B:CLAW:HURT:8d12 B:CLAW:HURT:8d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | RES_NETH | RES_DISE | -F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | AQUATIC | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT +F:AQUATIC F:ATTR_MULTI -S:1_IN_4 | -S:S_HI_DRAGON | S_DRAGON | S_KIN | -S:BR_NUKE | BR_ACID | BR_ELEC | BR_FIRE | -S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK | -S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU | -S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS | -S:BR_WALL | BR_MANA | BR_DISI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MOVE_BODY +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +S:1_IN_4 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_DISI +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_MANA +S:BR_NETH +S:BR_NEXU +S:BR_NUKE +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL +S:S_DRAGON +S:S_HI_DRAGON +S:S_KIN D:The mightiest of all dragonkind, a great worm of power is seldom D:encountered in our world. It can crush stars with its might. @@ -14874,8 +25459,13 @@ W:4:1:200:3 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:1d2 -F:RAND_25 | ANIMAL | IM_ELEC | -F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:IM_ELEC +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is about three feet long with large teeth and blue fur. D:Its teeth produce sparks on impact. @@ -14888,8 +25478,13 @@ W:4:1:200:3 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d2 -F:RAND_25 | ANIMAL | IM_ACID | -F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:IM_ACID +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is about three feet long with large teeth and yellow fur. D:Its teeth produce a corrosive substance. @@ -14904,13 +25499,31 @@ B:CLAW:POISON:9d12 B:CLAW:POISON:9d12 B:BITE:FIRE:9d12 B:BITE:FIRE:9d12 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_FIRE | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | EVIL | IM_FIRE | IM_POIS | BASEANGBAND -S:1_IN_3 | -S:BR_DARK | BR_POIS | BR_FIRE | BR_NETH | S_HOUND +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_3 +S:BR_DARK +S:BR_FIRE +S:BR_NETH +S:BR_POIS +S:S_HOUND D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is D:the largest wolf to ever walk the earth. He is highly intelligent and a D:deadly opponent in combat. @@ -14923,8 +25536,13 @@ W:9:1:250:2 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:1d4 -F:RAND_25 | ANIMAL | DROP_SKELETON | -F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is a rodent of unusual size with no fur covering it. @@ -14937,8 +25555,15 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d4 B:BITE:HURT:2d4 -F:RAND_25 | ANIMAL | DROP_SKELETON | IM_POIS | CAN_FLY | -F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM | +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:RAND_25 S:MULTIPLY D:A large rat that lives in the trees. @@ -14952,15 +25577,39 @@ B:CLAW:COLD:9d12 B:CLAW:COLD:9d12 B:BITE:COLD:9d12 B:BITE:COLD:9d12 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | NEUTRAL | NO_TARGET | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:SMART | OPEN_DOOR | BASH_DOOR | KILL_BODY | -F:ANIMAL | GOOD | WILD_ONLY | WILD_GRASS | WILD_GRASS | -F:WILD_WASTE | WILD_WOOD | WILD_SHORE | -F:IM_COLD | IM_ACID | IM_ELEC | BASEANGBAND -S:1_IN_5 | -S:BR_COLD | BR_SHAR | BR_SOUN | BR_LITE | +F:ANIMAL +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:KILL_BODY +F:MALE +F:NEUTRAL +F:NO_TARGET +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +F:WILD_GRASS +F:WILD_GRASS +F:WILD_ONLY +F:WILD_SHORE +F:WILD_WASTE +F:WILD_WOOD +S:1_IN_5 +S:BR_COLD +S:BR_LITE +S:BR_SHAR +S:BR_SOUN D:The wolfhound of the Valar, Huan has served many masters in his time, from D:Celegorm son of Feanor to Beren son of Barahir: but now he runs wild and D:acknowledges no master save himself, as he hunts alone for his nemesis - @@ -14976,8 +25625,15 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE -F:ANIMAL | MORTAL | BASEANGBAND | IM_COLD | WILD_TOO | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_COLD +F:MORTAL +F:WEIRD_MIND +F:WILD_TOO D:A huge white bear, accustomed to extremely cold temperatures. # New monster added by furiosity for the Theme module @@ -14990,9 +25646,16 @@ O:0:0:0:0 B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE -F:ANIMAL | HURT_LITE | IM_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:MORTAL +F:WEIRD_MIND D:A huge blue-black bear with thick fur. It can withstand D:extremely cold temperatures and usually hunts at night, D:and always in packs. @@ -15007,17 +25670,42 @@ B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | CAN_SPEAK | CAN_FLY | -F:FORCE_SLEEP | FORCE_MAXHP | ATTR_MULTI | -F:ESCORT | ESCORTS | KILL_WALL | AURA_FIRE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | -F:IM_FIRE | IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | -S:BR_FIRE | S_KIN | -S:S_HI_DEMON | S_HI_UNDEAD +F:ATTR_MULTI +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NONLIVING +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BR_FIRE +S:CONF +S:SCARE +S:S_HI_DEMON +S:S_HI_UNDEAD +S:S_KIN D:Gothmog is the offspring of Morgoth and an ogress. He is renowned D:for slaying three High Kings of the Noldor Elves, and he has never been D:defeated in combat. With his whip of flame and awesome fiery breath he @@ -15033,9 +25721,19 @@ O:0:0:0:0 B:CLAW:HURT:4d4 B:CLAW:HURT:4d4 B:BITE:HURT:4d6 -F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE -F:ANIMAL | NEUTRAL | NO_TARGET | WILD_ONLY | WILD_WOOD | -F:WILD_GRASS | WILD_SHORE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_ONLY +F:WILD_SHORE +F:WILD_WOOD D:An experienced bear whose fur is silvery white. It just D:wants to eat its dinner in peace. @@ -15049,16 +25747,48 @@ B:HIT:HURT:12d12 B:HIT:HURT:12d12 B:HIT:FIRE:12d12 B:HIT:FIRE:12d12 -F:UNIQUE | FEMALE | DROP_CORPSE | -F:ATTR_MULTI | THUNDERLORD | RES_TELE | PET | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | GOOD | AQUATIC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:DROP_CHOSEN | REFLECTING | AURA_FIRE | AURA_ELEC | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | POWERFUL | -F:MORTAL | HAS_LITE -S:1_IN_4 | -S:TPORT | TELE_TO | BR_FIRE | BR_TIME | S_THUNDERLORD | TELE_AWAY | +F:AQUATIC +F:ATTR_MULTI +F:AURA_ELEC +F:AURA_FIRE +F:BASH_DOOR +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:BR_TIME +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:Foronth is the first Eagle queen, and Sarko the first to discover D:the Firebirds, the ancestors of the Thunderlord eagles. She will try to D:help you. @@ -15070,10 +25800,20 @@ I:110:10d10:10:35:10 W:9:1:2000:25 E:0:1:0:2:1:0 O:0:0:0:0 -F:WEIRD_MIND | BASH_DOOR | NONLIVING | JOKEANGBAND | NEVER_BLOW | -F:NO_CUT | NO_FEAR | NO_CONF | RES_TELE | NO_STUN | PET | +F:BASH_DOOR +F:JOKEANGBAND +F:NEVER_BLOW +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_STUN +F:PET +F:RES_TELE +F:WEIRD_MIND S:1_IN_2 -S:CONF | BLINK | +S:BLINK +S:CONF D:A cute cuddly creature made of a strange soft material. It has D:been animated by a jokester wizard, and searches for a child to D:play with. @@ -15088,18 +25828,61 @@ B:HIT:UN_BONUS:10d12 B:HIT:UN_BONUS:10d12 B:HIT:UN_POWER:8d12 B:HIT:UN_POWER:8d12 -F:UNIQUE | MALE | CAN_SPEAK | REFLECTING | -F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | NO_SLEEP | NO_FEAR | NO_CONF | -F:EVIL | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TPORT | TELE_LEVEL | BLIND | CONF | SCARE | CAUSE_4 | -S:BRAIN_SMASH | FORGET | BO_ICEE | BO_MANA | BO_PLAS | -S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | BA_CHAO | -S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | S_WRAITH | S_UNIQUE | -S:HAND_DOOM | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_FIRE +S:BA_MANA +S:BA_NETH +S:BA_WATE +S:BLIND +S:BO_ICEE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:CONF +S:FORGET +S:HAND_DOOM +S:SCARE +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH +S:TELE_LEVEL +S:TPORT D:Mighty in spells and enchantments, he created the One Ring. D:His eyes glow with power and with his gaze he seeks to destroy D:your soul. He has many servants, and rarely fights without them. @@ -15114,21 +25897,74 @@ B:GAZE:EAT_GOLD:20d10 B:HIT:SHATTER:20d10 B:BITE:LOSE_ALL:10d12 B:TOUCH:UN_POWER -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | MALE | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON | -F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE | -F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE | -F:REGENERATE | CAN_FLY | CAN_SWIM | DG_CURSE | WYRM_PROTECT | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF |NO_FEAR | NO_STUN | RES_TELE -F:MORTAL | JOKEANGBAND | HAS_LITE -S:1_IN_2 | -S:S_THUNDERLORD | BR_CHAO | BA_CHAO | ROCKET | BRAIN_SMASH | S_HI_DEMON | -S:BR_NETH | HASTE | BR_MANA | S_HI_UNDEAD | S_HI_DRAGON | TRAPS | FORGET | -S:BR_NUKE | BR_POIS | BR_DISI | HAND_DOOM | HEAL | TPORT | TELE_TO | -S:S_BUG | S_RNG | +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DG_CURSE +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:KILL_BODY +F:KILL_WALL +F:MALE +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_TELE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_2 +S:BA_CHAO +S:BRAIN_SMASH +S:BR_CHAO +S:BR_DISI +S:BR_MANA +S:BR_NETH +S:BR_NUKE +S:BR_POIS +S:FORGET +S:HAND_DOOM +S:HASTE +S:HEAL +S:ROCKET +S:S_BUG +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_RNG +S:S_THUNDERLORD +S:TELE_TO +S:TPORT +S:TRAPS D:He is the master of coding; none can match his skill. He created the D:Variant Maintainer, the RNGs, and the software bugs. Bull Gates is D:nothing next to him. Do not think that since he loves the novels of @@ -15146,19 +25982,58 @@ B:HIT:SHATTER:24d10 B:HIT:SHATTER:24d10 B:HIT:LOSE_ALL:10d12 B:TOUCH:UN_POWER -F:UNIQUE | CAN_SPEAK | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH | -F:SMART | KILL_WALL | MOVE_BODY | AURA_COLD | -F:REGENERATE | POWERFUL | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD | -S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | -S:ROCKET | BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH +F:AURA_COLD +F:BASEANGBAND +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_DEPTH +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_3 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_MANA +S:BA_NETH +S:BO_MANA +S:BRAIN_SMASH +S:BR_DISI +S:BR_NETH +S:HAND_DOOM +S:ROCKET +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH D:He was the most powerful of the Valar, the equal of Manwe. D:He is the Master of the Pits of Angband. His figure is like a black D:mountain crowned with Lightning. He rages with everlasting anger, his @@ -15178,12 +26053,18 @@ W:0:20:1700:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY D:They are used as the main assault force of the human kings. N:864:Elven archer @@ -15193,14 +26074,23 @@ W:0:20:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_1 | -S:ARROW_2 | ARROW_1 | ARROW_2 | ARROW_1 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY +S:1_IN_1 +S:ARROW_1 +S:ARROW_1 +S:ARROW_2 +S:ARROW_2 D:They are used as the main assault force of the elven kings. N:865:Dwarven warrior @@ -15210,12 +26100,18 @@ W:0:20:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:6d8 -F:MALE | -F:PET | FRIENDS | WILD_ONLY | -F:ONLY_GOLD | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR -F:DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:FRIENDS +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:PET +F:WILD_ONLY D:They are used as the main assault force of the dwarven kings. N:866:Elite uruk @@ -15226,12 +26122,21 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:MALE | -F:FORCE_MAXHP | FRIENDS | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | ORC | IM_POIS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_8 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HAS_LITE +F:IM_POIS +F:MALE +F:MORTAL +F:OPEN_DOOR +F:ORC +S:1_IN_8 S:ARROW_2 D:It is a cunning orc of power, taller than a man, and stronger. It fears D:little. @@ -15246,9 +26151,16 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:FIRE:1d4 B:BITE:HURT:3d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE -F:ANIMAL | IM_FIRE | SUSCEP_COLD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:IM_FIRE +F:MORTAL +F:SUSCEP_COLD +F:WEIRD_MIND D:A fierce bear trained to withstand the hottest environments. N:868:The Variant Maintainer @@ -15260,12 +26172,24 @@ O:20:20:20:20 B:INSULT:* B:HIT:INSANITY:1d8 B:HIT:LOSE_WIS:1d8 -F:ONLY_ITEM | DROP_2D2 | UNIQUE | CAN_FLY | -F:DROP_GOOD | WEIRD_MIND | CAN_SPEAK | -F:RAND_50 | RAND_25 | INVISIBLE | EVIL | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:CAN_FLY +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:HAS_LITE +F:INVISIBLE +F:JOKEANGBAND +F:MORTAL +F:ONLY_ITEM +F:RAND_25 +F:RAND_50 +F:UNIQUE +F:WEIRD_MIND S:1_IN_2 -S:S_BUG | S_RNG | BR_CONF +S:BR_CONF +S:S_BUG +S:S_RNG D:A deranged programmer, scattering bizarre ideas and bad code everywhere. N:869:Random Number Generator @@ -15277,8 +26201,12 @@ O:20:20:20:20 B:INSULT:* B:MOAN:* B:HIT:CONFUSE:1d6 -F:DROP_1D2 | EVIL | -F:EMPTY_MIND | RAND_50 | RAND_25 | JOKEANGBAND +F:DROP_1D2 +F:EMPTY_MIND +F:EVIL +F:JOKEANGBAND +F:RAND_25 +F:RAND_50 S:MULTIPLY D:A feared creation of the Variant Maintainer, it tries to generate Morgoth D:in the town and the One Ring in the magic shop. @@ -15290,10 +26218,19 @@ W:50:10:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:10d5 -F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID | -F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CUT +F:STUPID +F:UNDEAD S:1_IN_4 -S:ROCKET | ARROW_4 +S:ARROW_4 +S:ROCKET D:It was left here to be used against intruders. N:871:Bouncing mine @@ -15303,10 +26240,23 @@ W:70:10:0:200 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:10d5 -F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID | -F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NONLIVING +F:NO_CUT +F:STUPID +F:UNDEAD S:1_IN_3 -S:ROCKET | ARROW_4 | BLINK | BR_POIS | BR_CHAO | BR_NEXU +S:ARROW_4 +S:BLINK +S:BR_CHAO +S:BR_NEXU +S:BR_POIS +S:ROCKET D:It was left here to be used against intruders. N:872:Durin's Bane @@ -15319,17 +26269,39 @@ B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 B:TOUCH:UN_POWER -F:UNIQUE | MALE | SPECIAL_GENE | DROP_RANDART -F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL | -F:ESCORT | ESCORTS | DROP_CORPSE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CHOSEN | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | -F:NO_CONF | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:CONF | SCARE | -S:BR_FIRE | -S:S_UNDEAD | S_DEMON +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:ESCORT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_4 +S:BR_FIRE +S:CONF +S:SCARE +S:S_DEMON +S:S_UNDEAD D:A huge Balrog surrounded by raging pillars of fire, this is indeed a D:terrible opponent. Wielding a great whip of fire and a blazing sword, his D:fury blisters your skin and melts your flesh. @@ -15344,9 +26316,17 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:CONFUSE:1d4 B:BITE:PARALYZE:1d6 -F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE -F:ANIMAL | RES_WATE | CAN_SWIM | AQUATIC | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:MORTAL +F:RES_WATE +F:WEIRD_MIND D:A strange bear the prefers to live in the water. N:874:Rot jelly @@ -15357,10 +26337,17 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_FOOD:2d3 B:TOUCH:LOSE_CHR:2d3 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | CAN_SWIM | -F:HURT_LITE | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:HURT_LITE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a large pile of rotting flesh, whose touch spoils your food. The terrible D:smell it exudes is also very hard to get rid of... @@ -15374,11 +26361,23 @@ B:HIT:HURT:20d5 B:HIT:HURT:20d5 B:TOUCH:EXP_80:20d5 B:TOUCH:EXP_80:20d5 -F:UNIQUE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE D:The leader of the horsemen of the apocalypse, before you lies Death. D:A bony skeleton in a huge dark robe wielding a great scythe, Death rides D:a horse of purest black and comes to bring your death. @@ -15393,11 +26392,24 @@ B:TOUCH:EAT_FOOD:20d4 B:GAZE:UN_BONUS:20d4 B:WAIL:LOSE_INT:10d5 B:WAIL:LOSE_DEX:10d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_STUN | NO_SLEEP | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE D:One of the horsemen of the apocalypse, before you lies Famine. A D:figure so gaunt that the shape of the bones beneath are revealed, D:Famine rides a pale grey mare that appears near death. @@ -15412,13 +26424,27 @@ B:TOUCH:POISON:20d4 B:TOUCH:POISON:20d4 B:TOUCH:DISEASE:16d5 B:TOUCH:DISEASE:16d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT -S:1_IN_2 | -S:S_ANT | S_SPIDER +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:S_ANT +S:S_SPIDER D:One of the horsemen of the apocalypse, before you lies Pestilence. D:At first, it looks like a human, but then you notice ants, worms, and D:worse peeking out of the flesh. Pestilence rides a purple horse with @@ -15434,12 +26460,26 @@ B:TOUCH:PARALYZE:20d4 B:WAIL:CONFUSE:20d4 B:GAZE:BLIND:20d4 B:WAIL:TERRIFY:20d4 -F:UNIQUE | MALE | -F:FORCE_MAXHP | DROP_CORPSE | -F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | NO_FEAR | -F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT -S:1_IN_2 | +F:BASH_DOOR +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:PASS_WALL +F:UNDEAD +F:UNIQUE +S:1_IN_2 S:S_MONSTER D:One of the horsemen of the apocalypse, before you lies War. A healthy and D:hearty warrior, War grins a little too wide at you as he prepares for @@ -15455,8 +26495,13 @@ W:2:1:100:7 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d3 -F:ANIMAL | AQUATIC | STUPID | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:MORTAL +F:STUPID D:It's a common fresh-water predatory fish. N:880:Electric eel @@ -15468,9 +26513,16 @@ O:0:0:0:0 B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 -F:AQUATIC | ANIMAL | RAND_25 | IM_ELEC | RES_WATE | -F:WILD_TOO | WILD_OCEAN | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_ELEC +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO D:This serpentine creature can create a deadly voltage. N:881:Giant crayfish @@ -15481,8 +26533,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CLAW:HURT:3d4 B:CLAW:HURT:3d4 -F:ANIMAL | AQUATIC | STUPID | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:MORTAL +F:STUPID +F:WEIRD_MIND D:A man-sized, heavily armoured fresh-water relative of the lobster. N:882:Mermaid @@ -15494,8 +26552,15 @@ O:20:50:10:5 B:TOUCH:LOSE_WIS B:TOUCH:INSANITY:2d3 B:TOUCH:CONFUSE -F:FEMALE | RAND_25 | DROP_60 | SMART | AQUATIC | NO_CONF | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:FEMALE +F:MORTAL +F:NO_CONF +F:RAND_25 +F:SMART D:A green-skinned humanoid with a fishtail. Beware - there are rumours D:of adventures losing their minds under the fearsome charms of mermaids. @@ -15507,8 +26572,13 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:PARALYZE:1d6 B:TOUCH:PARALYZE:1d6 -F:ANIMAL | AQUATIC | IM_POIS | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_POIS +F:MORTAL +F:WILD_TOO D:A strange water creature whose touch can be deadly. N:884:Giant piranha @@ -15519,9 +26589,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:5d1 B:BITE:HURT:5d1 -F:NO_SLEEP | WILD_TOO | COLD_BLOOD | -F:FRIENDS | AQUATIC | ANIMAL | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FRIENDS +F:MORTAL +F:NO_SLEEP +F:WILD_TOO D:A very large and bloodthirsty fish. N:885:Piranha @@ -15531,8 +26606,13 @@ W:3:1:200:8 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d6 -F:FRIENDS | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FRIENDS +F:MORTAL +F:WILD_TOO D:Bloodthirsty fish who can smell your blood from a great distance. # New monster added by furiosity for the Theme module @@ -15544,10 +26624,21 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:2d10 B:BITE:POISON:2d4 -F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:RAND_25 | DROP_90 | AQUATIC | IM_POIS | -F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | IM_ACID | -F:EVIL | MORTAL | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:IM_ACID +F:IM_POIS +F:MORTAL +F:RAND_25 +F:TAKE_ITEM +F:WILD_SHORE +F:WILD_TOO D:A large orange snake with a woman's torso. She prefers to live D:in the swamp and can withstand marshland elements. @@ -15560,12 +26651,24 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:4d10 B:BITE:ACID:3d6 -F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:DROP_90 | AQUATIC | WILD_OCEAN | IM_ACID | -F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | RES_WATE | -F:EVIL | MORTAL | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:IM_ACID +F:MORTAL +F:RES_WATE +F:TAKE_ITEM +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_TOO S:1_IN_8 -S:BA_WATE | BO_ICEE | +S:BA_WATE +S:BO_ICEE D:A large dark blue snake with a woman's torso. She prefers to live D:in deep water. @@ -15577,8 +26680,16 @@ W:1:2:1:0 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 -F:ANIMAL | EMPTY_MIND | CAN_SWIM | WILD_ONLY | WILD_GRASS | -F:DROP_CORPSE | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:EMPTY_MIND +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:WILD_GRASS +F:WILD_ONLY D:A harmless shell-bearing gastropod mollusc D:crawling slowly on the dungeon floor. D:It is a favourite prey of birds. @@ -15591,9 +26702,14 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CRUSH:HURT:1d20 B:CRUSH:HURT:1d20 -F:RAND_25 | FORCE_MAXHP | RES_WATE | -F:ANIMAL | AQUATIC | WILD_TOO | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:FORCE_MAXHP +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_TOO D:Although it looks like a fish and lives in water, it is in fact D:a mammal. And it is huge. @@ -15605,9 +26721,16 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:POISON:3d6 B:BITE:POISON:3d6 -F:AQUATIC | ANIMAL | IM_POIS | FRIENDS | -F:CHAR_CLEAR | ATTR_CLEAR | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:ATTR_CLEAR +F:BASEANGBAND +F:CHAR_CLEAR +F:COLD_BLOOD +F:DROP_CORPSE +F:FRIENDS +F:IM_POIS +F:MORTAL S:MULTIPLY D:A relative of crabs and shrimp, this is a tiny creature that inhabits sandy D:bottoms. It has a pair of dangerous-looking claws. @@ -15622,8 +26745,15 @@ B:SPIT:BLIND:1d3 B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 -F:RAND_25 | IM_COLD | RES_WATE | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:IM_COLD +F:MORTAL +F:RAND_25 +F:RES_WATE +F:WILD_TOO D:It doesn't move very fast, but when it does - watch out. N:892:Giant octopus @@ -15636,11 +26766,24 @@ B:SPIT:BLIND:1d4 B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 B:CRUSH:PARALYZE:8d4 -F:AQUATIC | SMART | IM_POIS | ANIMAL | NO_CONF | NO_SLEEP | -F:NO_FEAR | SMART | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD | -F:MORTAL | BASEANGBAND -S:1_IN_15 | -S:DARKNESS | SLOW | CONF | SCARE +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_CORPSE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:SMART +F:SMART +F:WEIRD_MIND +S:1_IN_15 +S:CONF +S:DARKNESS +S:SCARE +S:SLOW D:A cunning and dangerous undersea opponent. N:893:Eye of the deep @@ -15653,12 +26796,31 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | AQUATIC | -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | RES_TELE | -F:SMART | DROP_CORPSE | BASEANGBAND -S:1_IN_2 | -S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST | -S:FORGET | DARKNESS | BO_WATE | BO_ICEE | BO_MANA | BO_COLD +F:AQUATIC +F:BASEANGBAND +F:CAN_FLY +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:RES_TELE +F:SMART +S:1_IN_2 +S:BLIND +S:BO_COLD +S:BO_ICEE +S:BO_MANA +S:BO_WATE +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:MIND_BLAST +S:SCARE +S:SLOW D:A beholder that inhabits the depths of the sea, sleeping and pondering D:alien thoughts for centuries. Occasionally, it will float to the D:surface to wreck the lives of surface dwellers. @@ -15673,12 +26835,28 @@ B:BITE:POISON:5d10 B:CLAW:PARALYZE B:STING:INSANITY:5d10 B:STING:UN_BONUS -F:AQUATIC | ANIMAL | WEIRD_MIND | FORCE_MAXHP | HURT_LITE | -F:EVIL | SMART | NO_CONF | NO_SLEEP | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_5 | -S:BA_POIS | BR_DARK | BLIND | BR_POIS | SLOW | CONF | MIND_BLAST | -S:BRAIN_SMASH | DARKNESS +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:SMART +F:WEIRD_MIND +S:1_IN_5 +S:BA_POIS +S:BLIND +S:BRAIN_SMASH +S:BR_DARK +S:BR_POIS +S:CONF +S:DARKNESS +S:MIND_BLAST +S:SLOW D:A gigantic aquatic monster, somewhat resembling a cross between a D:lobster and a spider. It is coated in poisonous slime and noxious D:parasites. This foul creature hides in the silt of the deep ocean floor, @@ -15693,10 +26871,23 @@ O:0:0:0:0 B:TOUCH:BLIND:3d3 B:TOUCH:POISON:2d4 B:WAIL:TERRIFY -F:COLD_BLOOD | EMPTY_MIND | EVIL | AQUATIC | UNDEAD | IM_COLD | INVISIBLE | -F:IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNDEAD S:1_IN_8 -S:BLIND | HOLD | CONF +S:BLIND +S:CONF +S:HOLD D:A ghastly victim of drowning, forever doomed to wander the ocean waters D:looking for revenge. @@ -15707,8 +26898,13 @@ W:12:1:3000:40 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:4d4 -F:RAND_25 | AQUATIC | ANIMAL | STUPID | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:STUPID D:A small species of shark, although the teeth are still as deadly. N:897:Hammerhead shark @@ -15720,8 +26916,12 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:BUTT:HURT:3d4 B:BITE:HURT:3d4 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A hungry shark with a strange head. N:898:Great white shark @@ -15733,8 +26933,12 @@ O:0:0:0:0 B:BITE:HURT:4d6 B:BITE:HURT:4d6 B:BITE:HURT:4d6 -F:FORCE_SLEEP | AQUATIC | COLD_BLOOD | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:FORCE_SLEEP +F:MORTAL D:A very large carnivorous fish. N:899:Aquatic golem @@ -15745,9 +26949,18 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:3d10 B:HIT:HURT:3d10 -F:COLD_BLOOD | EMPTY_MIND | AQUATIC | -F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP D:An ingenious gnomish invention -- a golem designed for underwater D:usage. @@ -15760,10 +26973,20 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:2d10 B:BITE:LOSE_CHR:3d6 -F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE | -F:RAND_25 | DROP_60 | NO_CUT | WILD_GRASS | -F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:NO_CUT +F:RAND_25 +F:TAKE_ITEM +F:WILD_GRASS +F:WILD_SHORE +F:WILD_TOO S:1_IN_7 S:BR_SHAR D:A large brown snake with a woman's torso. It burrows deep into @@ -15778,8 +27001,12 @@ O:0:0:0:0 B:BITE:HURT:3d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:COLD_BLOOD +F:MORTAL +F:WILD_TOO D:A fast-moving hunter of the depths. When this creature moves, D:everybody in the water is in danger. @@ -15793,11 +27020,23 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:3d2 B:HIT:HURT:3d2 -F:MALE | -F:FORCE_MAXHP | AQUATIC | REGENERATE | -F:FRIENDS | DROP_60 | WILD_TOO | WILD_OCEAN | -F:OPEN_DOOR | BASH_DOOR | RES_WATE | -F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:REGENERATE +F:RES_WATE +F:TROLL +F:WILD_OCEAN +F:WILD_TOO D:It is said that Morgoth created trolls in mockery of the Ents. D:A troll of the sea, he reeks of brine. @@ -15811,11 +27050,22 @@ B:BITE:HURT:11d2 B:BITE:HURT:22d1 B:BITE:HURT:11d2 B:BITE:HURT:22d1 -F:FORCE_MAXHP | UNIQUE | MOVE_BODY | -F:WILD_OCEAN | WILD_TOO | COLD_BLOOD | -F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC | -F:NO_CONF | NO_SLEEP | -F:MORTAL | JOKEANGBAND +F:ANIMAL +F:AQUATIC +F:BASH_DOOR +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:UNIQUE +F:WILD_OCEAN +F:WILD_TOO D:The biggest white shark who has ever lived, it is hunting for you now. # New monster added by furiosity for the Theme module @@ -15828,12 +27078,22 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:COLD:1d8 -F:FEMALE | -F:RAND_25 | DROP_60 | DROP_1D2 | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | IM_POIS | -F:EVIL | MORTAL | BASEANGBAND | IM_COLD | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:IM_COLD +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:RAND_25 S:1_IN_7 -S:BO_ICEE | BO_COLD | +S:BO_COLD +S:BO_ICEE D:A giant snake-like figure with a woman's torso, partially covered D:in silvery scales. @@ -15845,8 +27105,16 @@ E:1:1:1:2:1:0 O:20:60:10:10 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:MALE | AQUATIC | FRIENDS | SMART | DROP_60 | DROP_CORPSE | BASEANGBAND | -F:HAS_LITE | PET | GOOD +F:AQUATIC +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:PET +F:SMART D:An aquatic elf trained in all forms of combat. N:906:Aquatic elven mage @@ -15856,10 +27124,19 @@ W:10:1:1400:35 E:1:1:1:2:1:0 O:10:10:70:10 B:TOUCH:UN_BONUS -F:MALE | AQUATIC | SMART | DROP_2D2 | DROP_CORPSE | BASEANGBAND | -F:HAS_LITE | PET | GOOD -S:1_IN_12 | -S:BO_MANA | BO_COLD | S_MONSTERS +F:AQUATIC +F:BASEANGBAND +F:DROP_2D2 +F:DROP_CORPSE +F:GOOD +F:HAS_LITE +F:MALE +F:PET +F:SMART +S:1_IN_12 +S:BO_COLD +S:BO_MANA +S:S_MONSTERS D:A wizened aquatic elf skilled in the magical arts. You can see an D:iridescent film coating the water around him. @@ -15870,9 +27147,14 @@ W:21:1:800:60 E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE -F:AQUATIC | ANIMAL | SMART | RAND_25 | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:RAND_25 +F:SMART +S:1_IN_10 S:S_MONSTER D:A giant fish shaped like a flounder. There are two enormous eyes D:occupying half of the creature's body. @@ -15885,9 +27167,13 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE B:GAZE:CONFUSE -F:AQUATIC | ANIMAL | SMART | DROP_CORPSE | -F:MORTAL | BASEANGBAND -S:1_IN_10 | +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL +F:SMART +S:1_IN_10 S:S_MONSTERS D:A stargazer a bit larger than average, covered with barnacles. @@ -15898,8 +27184,14 @@ W:13:1:700:55 E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:2d6 -F:AQUATIC | ANIMAL | RAND_25 | INVISIBLE | ATTR_CLEAR | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:ATTR_CLEAR +F:BASEANGBAND +F:DROP_CORPSE +F:INVISIBLE +F:MORTAL +F:RAND_25 D:A flattened fish which is able to change body colouring for D:camouflage. @@ -15911,8 +27203,11 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d2 B:BITE:HURT:2d2 -F:ANIMAL | AQUATIC | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:MORTAL D:A giant turtle with flippers, adapted for life in the ocean. N:911:Hatchling dragon turtle @@ -15924,10 +27219,18 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 -F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE | -F:ONLY_GOLD | DROP_60 | DROP_1D2 | -F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI -S:1_IN_12 | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_1D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:ONLY_GOLD +S:1_IN_12 S:BR_SOUN D:A newly-hatched dragon turtle. It still hasn't grown a proper shell. @@ -15940,12 +27243,18 @@ O:50:50:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_3D2 | -F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI -S:1_IN_11 | -S:SCARE | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_3D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +S:1_IN_11 S:BR_SOUN +S:SCARE D:A dragon-like creature inhabiting lightless reaches of ocean caves. It has D:a long neck with a tiny head, and four massive flippers. It has a soft and D:flexible shell. @@ -15959,13 +27268,21 @@ O:50:50:0:0 B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_4D2 | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | AQUATIC | BASEANGBAND | HAS_LITE +F:AQUATIC F:ATTR_MULTI -S:1_IN_9 | -S:SCARE | +F:BASEANGBAND +F:DRAGON +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +S:1_IN_9 S:BR_SOUN +S:SCARE D:A large dragon turtle, covered with a tough white shell. N:914:Ancient dragon turtle @@ -15977,13 +27294,27 @@ O:50:50:0:0 B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | -F:DROP_1D2 | DROP_4D2 | -F:SMART | AQUATIC | POWERFUL | MOVE_BODY | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_9 | -S:BLIND | CONF | SCARE | +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:DROP_1D2 +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:POWERFUL +F:SMART +S:1_IN_9 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A huge dragon turtle. You can see many barnacles covering its body. N:915:Fastitocalon @@ -15996,11 +27327,27 @@ B:BITE:HURT:5d8 B:BITE:HURT:5d8 B:CRUSH:POISON:3d10 B:CRUSH:POISON:3d10 -F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | AQUATIC | WILD_TOO | WILD_OCEAN | -F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:DRAGON | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | ATTR_MULTI -S:1_IN_6 | -S:BR_FIRE | BR_ACID | BR_SOUN | BA_WATE +F:AQUATIC +F:ATTR_MULTI +F:BASEANGBAND +F:DRAGON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:RES_TELE +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_6 +S:BA_WATE +S:BR_ACID +S:BR_FIRE +S:BR_SOUN D:A huge aquatic dragon-turtle, its shell is as large as a small island. N:916:Undead stargazer @@ -16011,9 +27358,16 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:GAZE:PARALYZE B:GAZE:EXP_20 -F:AQUATIC | ANIMAL | SMART | INVISIBLE | UNDEAD | BASEANGBAND | NO_CUT -S:1_IN_10 | -S:S_UNDEAD | S_MONSTER +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:INVISIBLE +F:NO_CUT +F:SMART +F:UNDEAD +S:1_IN_10 +S:S_MONSTER +S:S_UNDEAD D:A stargazer brought back from the dead under control of some evil D:sorceror. @@ -16025,8 +27379,12 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:7d4 B:BITE:HURT:7d4 -F:AQUATIC | WILD_TOO | WILD_OCEAN | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:MORTAL +F:WILD_OCEAN +F:WILD_TOO D:An almost beautiful, deadly beast. N:918:Merrow @@ -16037,10 +27395,22 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:FRIENDS | DROP_60 | DROP_CORPSE | AQUATIC | WILD_TOO | WILD_OCEAN | -F:OPEN_DOOR | BASH_DOOR | RES_WATE | IM_COLD | IM_POIS | -F:EVIL | GIANT | -F:MORTAL | BASEANGBAND | HAS_LITE +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:GIANT +F:HAS_LITE +F:IM_COLD +F:IM_POIS +F:MORTAL +F:OPEN_DOOR +F:RES_WATE +F:WILD_OCEAN +F:WILD_TOO D:A great ogre of the sea, it is violent and stupid. N:919:Water naga @@ -16053,13 +27423,22 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:POISON:1d8 -F:FEMALE | -F:AQUATIC | DROP_CORPSE | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | -F:EVIL | NO_CONF | NO_SLEEP | SMART | -F:MORTAL | BASEANGBAND -S:1_IN_7 | -S:DARKNESS | CAUSE_3 | BO_ICEE +F:AQUATIC +F:BASEANGBAND +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:SMART +S:1_IN_7 +S:BO_ICEE +S:CAUSE_3 +S:DARKNESS D:A naga adapted to underwater life. She has a fish-like tail and a pair D:of gills. @@ -16074,13 +27453,25 @@ B:CRUSH:TERRIFY:2d8 B:CRUSH:HURT:2d8 B:BITE:BLIND:1d8 B:BITE:HURT:1d8 -F:FEMALE | CAN_SWIM | -F:FORCE_SLEEP | CAN_FLY | HURT_LITE | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | -S:1_IN_4 | -S:BLIND | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SWIM +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_SLEEP +F:HURT_LITE +F:INVISIBLE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_4 +S:BLIND +S:DARKNESS D:A dark snake-like form with the torso of a beautiful woman, it D:prefers to roam in the night. @@ -16095,13 +27486,28 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:FORCE_SLEEP | CAN_FLY | CAN_SWIM | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | IM_POIS | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HEAL | BR_POIS | BA_POIS | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CAN_SWIM +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_SLEEP +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_4 +S:BA_POIS +S:BR_POIS +S:DARKNESS +S:HEAL D:A green snake-like form with the torso of a beautiful woman, it D:dwells in the trees. @@ -16115,11 +27521,22 @@ B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 B:CRUSH:HURT:10d10 -F:FORCE_MAXHP | UNIQUE | MOVE_BODY | -F:WILD_OCEAN | WILD_TOO | COLD_BLOOD | -F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC | -F:MORTAL | JOKEANGBAND -S:1_IN_6 | BA_WATE +F:ANIMAL +F:AQUATIC +F:BASH_DOOR +F:COLD_BLOOD +F:FORCE_MAXHP +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:MOVE_BODY +F:UNIQUE +F:WILD_OCEAN +F:WILD_TOO +S:1_IN_6 +S:BA_WATE D:The mightiest whale of the seas, he has sunk many ships in his time. With D:a mere flick of his tail he can create a mighty whirlpool, to the ruin D:of all who would travel the ocean. @@ -16133,11 +27550,15 @@ O:0:0:0:0 B:BITE:CONFUSE:2d8 B:BITE:HURT:2d8 B:CLAW:POISON:2d8 -F:FRIENDS | DROP_CORPSE | -F:ANIMAL | AQUATIC | -F:MORTAL | BASEANGBAND -S:1_IN_10 | -S:BO_ICEE | BO_WATE +F:ANIMAL +F:AQUATIC +F:BASEANGBAND +F:DROP_CORPSE +F:FRIENDS +F:MORTAL +S:1_IN_10 +S:BO_ICEE +S:BO_WATE D:A hound with a finned tail and large, muscular flippers for hind legs. D:It has a rubbery skin instead of fur. @@ -16150,13 +27571,24 @@ O:20:60:20:0 B:HIT:HURT:3d4 B:GAZE:POISON:8d12 B:CLAW:INSANITY:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | -F:FRIENDS | SMART | -F:ONLY_ITEM | DROP_60 | -F:AQUATIC | POWERFUL | -F:EVIL | DEMON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE -S:1_IN_8 | -S:BO_ICEE | BA_WATE +F:AQUATIC +F:BASEANGBAND +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:FRIENDS +F:HAS_LITE +F:IM_ACID +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SMART +S:1_IN_8 +S:BA_WATE +S:BO_ICEE D:A hideous scaled demon, it is a sleek form with many fins but no visible D:arms or legs. It has a toothed gaping maw, reminiscent of a caricature D:of a shark's jaws. @@ -16172,13 +27604,28 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:FEMALE | -F:FORCE_SLEEP | CAN_FLY | -F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | NO_STUN | PET | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HEAL | BLIND | CONF | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_SLEEP +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +S:1_IN_4 +S:BLIND +S:CONF +S:DARKNESS +S:HEAL D:A large brown snake with a woman's torso. She is a fellow D:adventurer. @@ -16190,10 +27637,18 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:COLD:4d4 -F:NEVER_MOVE | SUSCEP_FIRE | -F:STUPID | EMPTY_MIND | -F:IM_COLD | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_COLD +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID +F:SUSCEP_FIRE D:It is a strange white growth on the dungeon floor; it seems to sparkle D:with ice. @@ -16205,10 +27660,16 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EAT_LITE:4d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange silvery growth on the dungeon floor; it seems to glow with D:a dark light. @@ -16218,11 +27679,23 @@ I:110:220d100:40:10:3 W:0:4:1100:0 E:0:1:1:2:1:1 O:20:20:20:20 -F:UNIQUE | FEMALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | RAND_25 -F:ONLY_ITEM | DROP_90 | DROP_GOOD | -F:OPEN_DOOR | DG_CURSE | -F:MORTAL | JOKEANGBAND | HAS_LITE +F:CAN_SPEAK +F:DG_CURSE +F:DROP_90 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:She loves joking, and she's constantly giggling. A very happy girl. D:Beware, it is rumoured that DarkGod has put a mighty curse on her. @@ -16234,9 +27707,20 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:3d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:GOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:930:Young spirit @@ -16247,9 +27731,20 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:9d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:GOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:931:Mature spirit @@ -16260,9 +27755,20 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:18d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:GOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:932:Experienced spirit @@ -16273,9 +27779,20 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:20d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:GOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:933:Wise spirit @@ -16286,9 +27803,20 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:30d4 -F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD | -F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:COLD_BLOOD +F:GOOD +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:PET +F:SMART +F:UNDEAD +F:UNDEAD D:A helpful spirit from beyond the grave. N:934:Fangorn the Treebeard, Lord of the Ents @@ -16301,10 +27829,25 @@ B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | DROP_CORPSE | -F:SMART | TAKE_ITEM | BASH_DOOR | KILL_WALL | NO_SLEEP | -F:GOOD | PET | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:KILL_WALL +F:MOVE_BODY +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PET +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:UNIQUE D:The first being to awoke on Arda, apart from the Valar themselves. He is the D:first, oldest, greatest and most respected of all the Ents: and though he is D:slow to anger, he is a terrible foe when roused. @@ -16319,17 +27862,50 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:TERRIFY:5d5 B:HIT:TERRIFY:5d5 -F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE | -F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:GOOD | IM_FIRE | IM_COLD | -F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE | -S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS | -S:BA_FIRE | BO_FIRE | BO_PLAS | BO_MANA | CAUSE_4 | -S:S_MONSTERS | S_DRAGON | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MALE +F:ONLY_ITEM +F:OPEN_DOOR +F:PET +F:REFLECTING +F:RES_TELE +F:SMART +F:UNIQUE +S:1_IN_2 +S:BA_FIRE +S:BLIND +S:BO_FIRE +S:BO_MANA +S:BO_PLAS +S:BRAIN_SMASH +S:CAUSE_4 +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:SCARE +S:S_DRAGON +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY +S:TPORT +S:TRAPS D:The wizard who opposed Sauron and, in the end, was the only D:one of the Istari to succeed in his task. Gandalf is very D:wise and specialises in fire magic. @@ -16344,13 +27920,25 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:UNIQUE | MALE | -F:FORCE_MAXHP | FORCE_SLEEP | -F:OPEN_DOOR | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_POIS | -F:DROP_CORPSE | DROP_SKELETON | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | BLIND | CONF | CAUSE_2 | MIND_BLAST +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MALE +F:OPEN_DOOR +F:UNIQUE +S:1_IN_6 +S:BLIND +S:CAUSE_2 +S:CONF +S:HEAL +S:MIND_BLAST D:The friend and companion of the dwarven king Thror, he went mad with D:grief after Thror's death at the hands of Azog the Orc. With torn beard D:and ragged clothes, he seems to have fixed on you as a convenient target @@ -16363,10 +27951,22 @@ W:8:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | WILD_TOO | FRIENDS | -F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP -S:1_IN_12 | BLIND | SLOW | CONF | SCARE +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_12 +S:BLIND +S:CONF +S:SCARE +S:SLOW D:A novice in the arts of mind over matter. N:938:Great Swamp Worm @@ -16379,14 +27979,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:POISON:6d14 B:BITE:POISON:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_POIS +S:CONF +S:SCARE D:A truly enormous dragon with great powers. The foul gases issuing D:from the beast nearly make you vomit; and while you may try to hold D:your breath as you fight it, it sees no reason to do likewise. @@ -16401,14 +28018,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:ACID:6d14 B:BITE:ACID:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_ACID +S:CONF +S:SCARE D:A huge and very powerful dragon. Great steaming pools of acid drip from D:its form onto the ground. You shudder when you see the acid eating away D:the very stones of the dungeon - what could it do to you? @@ -16421,11 +28055,23 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:3d4 B:CLAW:FIRE:5d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC | -F:MORTAL | HAS_LITE +F:AQUATIC +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16437,11 +28083,23 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:4d4 B:CLAW:FIRE:5d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC | -F:MORTAL | HAS_LITE +F:AQUATIC +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16453,11 +28111,23 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:5d4 B:CLAW:FIRE:7d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC | -F:MORTAL | HAS_LITE +F:AQUATIC +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16469,11 +28139,23 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:6d4 B:CLAW:FIRE:7d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC | -F:MORTAL | HAS_LITE +F:AQUATIC +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16485,11 +28167,23 @@ E:0:1:0:6:1:0 O:0:0:0:0 B:CLAW:HURT:6d4 B:CLAW:FIRE:8d4 -F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED | -F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC | -F:MORTAL | HAS_LITE +F:AQUATIC +F:CAN_FLY +F:DROP_CORPSE +F:GOOD +F:HAS_EGG +F:HAS_LITE +F:IMPRESED +F:IM_COLD +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:PET +F:SMART S:1_IN_10 -S:TELE_TO | +S:TELE_TO D:The ancestors of the Eagles of the Thunderlords, these are D:friendly funny flying creatures with power. @@ -16501,11 +28195,23 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:MALE | FRIENDS | OPEN_DOOR | BASH_DOOR | -F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET | -F:IM_ACID | IM_COLD | RES_WATE | RES_NETH | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:RES_NETH +F:RES_WATE +F:SMART +S:1_IN_2 S:ARROW_4 D:An elf cloaked in green wielding a longbow. @@ -16519,12 +28225,29 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:EXP_80:4d6 B:HIT:EXP_80:4d6 -F:UNIQUE | MALE | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NAZGUL | SUSCEP_FIRE | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CHOSEN | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | SPECIAL_GENE | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SPECIAL_GENE +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE D:A tall black Ringwraith, he is a master of horsemanship. He longs D:to taste your blood. @@ -16538,15 +28261,38 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:TOUCH:EXP_80:5d6 B:TOUCH:EXP_80:5d6 -F:UNIQUE | FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | -F:BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | FORGET | -S:BO_ACID | BO_COLD | BO_NETH | +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:PASS_WALL +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_NETH +S:CAUSE_3 +S:FORGET +S:HOLD +S:SCARE S:S_MONSTER D:A sorceress in life, Adunaphel quickly fell under Sauron's sway and the D:power of the Rings of Power. @@ -16561,15 +28307,37 @@ B:HIT:HURT:7d6 B:HIT:HURT:7d6 B:GAZE:EXP_80:6d6 B:WAIL:TERRIFY:6d6 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS | -S:BO_COLD | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BO_COLD +S:BO_NETH +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE S:S_MONSTERS D:A mighty sorcerer king, Akhorahil was blind in life. With powerful D:enchantments, he created jewelled eyes that enabled him to see better than @@ -16585,14 +28353,37 @@ B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BLIND +S:BO_FIRE +S:BO_NETH +S:CAUSE_3 +S:HOLD +S:SCARE S:S_MONSTER D:Ren was an insane eastern king who believed himself to be the son of a D:volcano god. At an early age his sanity was destroyed by a plague that @@ -16608,15 +28399,39 @@ B:HIT:HURT:8d7 B:HIT:HURT:8d7 B:TOUCH:EXP_40:6d7 B:TOUCH:EXP_40:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN | -F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | SUSCEP_FIRE | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | -S:BA_NETH | BA_COLD | BA_ELEC | BA_ACID | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:INVISIBLE +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:HOLD +S:SCARE S:S_UNDEAD D:This Ringwraith was a weak-minded sorcerer-king who fell easily under D:Sauron's power. @@ -16631,15 +28446,39 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:BITE:EXP_40:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN | -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | BA_NETH | -S:S_MONSTERS | S_UNDEAD | S_HOUND +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_NETH +S:BLIND +S:CAUSE_3 +S:HOLD +S:SCARE +S:S_HOUND +S:S_MONSTERS +S:S_UNDEAD D:Dwar had a special affinity for dogs in life, and can still command them D:at will. He howls manically as he reaches out to destroy you. @@ -16653,15 +28492,41 @@ B:HIT:HURT:9d9 B:HIT:HURT:9d9 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | SMART | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | NAZGUL | DROP_CHOSEN | -F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | MIND_BLAST | -S:BO_COLD | BA_COLD | BA_NETH | +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_3 +S:BA_COLD +S:BA_NETH +S:BLIND +S:BO_COLD +S:CAUSE_3 +S:CAUSE_4 +S:HOLD +S:MIND_BLAST +S:SCARE S:S_UNDEAD D:A Ringwraith powerful in fell sorcery, he yearns for the life he has D:exchanged for an unlife of everlasting torment. @@ -16676,16 +28541,47 @@ B:HIT:HURT:9d10 B:HIT:HURT:9d10 B:TOUCH:EXP_80:7d7 B:TOUCH:EXP_80:7d7 -F:UNIQUE | MALE | CAN_SPEAK | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN | -F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:EVIL | UNDEAD | IM_ACID | IM_COLD | IM_POIS | SUSCEP_FIRE | -F:HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_LEVEL | BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | BO_MANA | -S:BA_COLD | BA_NETH | ANIM_DEAD | -S:S_HI_UNDEAD | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_ACID +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_COLD +S:BA_NETH +S:BLIND +S:BO_MANA +S:CAUSE_3 +S:CAUSE_4 +S:HOLD +S:SCARE +S:S_HI_UNDEAD +S:S_KIN +S:TELE_LEVEL D:He was the warrior-king of the East, now a ringwraith. Khamul is a powerful opponent, his skill in D:combat awesome and his form twisted by evil cunning. @@ -16699,16 +28595,48 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:EXP_80:7d7 B:HIT:EXP_80:7d7 -F:UNIQUE | MALE | CAN_SPEAK | RES_TELE -F:FORCE_SLEEP | FORCE_MAXHP | SMART | SUSCEP_FIRE | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | NAZGUL | -F:EVIL | UNDEAD | DROP_CHOSEN | -F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:TELE_AWAY | BLIND | HOLD | SCARE | CAUSE_3 | BRAIN_SMASH | -S:BO_MANA | BA_NETH | S_WRAITH | -S:S_KIN | S_HI_UNDEAD | S_HI_DRAGON | S_MONSTERS | ANIM_DEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:MALE +F:MOVE_BODY +F:NAZGUL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_TELE +F:SMART +F:SUSCEP_FIRE +F:UNDEAD +F:UNIQUE +S:1_IN_2 +S:ANIM_DEAD +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CAUSE_3 +S:HOLD +S:SCARE +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:S_WRAITH +S:TELE_AWAY D:The Chief of the Ringwraiths. A fell being of devastating power. His D:spells are lethal and his combat blows crushingly hard. He moves at D:speed, and commands legions of evil to do his bidding. It is said that he @@ -16722,14 +28650,27 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:FEMALE | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | AQUATIC | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:BLINK | TELE_AWAY +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TELE_AWAY D:A Thunderlord. Among the weaker breeds, but still dangerous. N:956:Blue Thunderlord @@ -16740,14 +28681,28 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d7 B:HIT:HURT:8d7 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:TPORT | BLINK +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TPORT D:A Thunderlord. Among the weaker breeds, but still dangerous. N:957:Brown Thunderlord @@ -16758,14 +28713,28 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:8d9 B:HIT:HURT:8d9 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | -S:TPORT | BLINK +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:TPORT D:A Thunderlord. Beware its flame. N:958:Bronze Thunderlord @@ -16776,14 +28745,29 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:10d9 B:HIT:HURT:10d9 -F:MALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | BR_TIME | -S:TPORT | BLINK +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:HAS_LITE +F:IM_FIRE +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:BR_TIME +S:TPORT D:A Thunderlord, mightiest among the males. N:959:Gold Thunderlord @@ -16796,15 +28780,32 @@ B:HIT:HURT:10d9 B:HIT:HURT:10d9 B:HIT:HURT:10d9 B:HIT:HURT:10d9 -F:FEMALE | SMART | -F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC | -F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR | -F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE -S:1_IN_4 | -S:BR_FIRE | BR_TIME | -S:TPORT | BLINK | TELE_TO | TELE_AWAY | +F:AQUATIC +F:BASH_DOOR +F:CAN_FLY +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FEMALE +F:HAS_LITE +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SMART +F:THUNDERLORD +S:1_IN_4 +S:BLINK +S:BR_FIRE +S:BR_TIME S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT D:A Thunderlord, among the queens of their kind. N:960:Blood Sprout @@ -16817,10 +28818,17 @@ B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 B:TOUCH:HURT:3d15 -F:STUPID | EMPTY_MIND | KILL_TREES | -F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD | -F:NO_CONF | NO_SLEEP | NO_FEAR | +F:EMPTY_MIND +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_TREES F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:STUPID S:MULTIPLY D:A kind of giant mycorrhiza, corrupted into a carnivore by Morgoth. @@ -16834,14 +28842,30 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:UNIQUE | MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND -F:HAS_LITE -S:1_IN_2 | -S:CAUSE_3 | BO_WATE | BO_MANA +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MALE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_2 +S:BO_MANA +S:BO_WATE +S:CAUSE_3 D:This sad creature - once a mighty warrior - betrayed his former friends to D:Morgoth's army in return for, he thought, safety for himself and his wife. D:And so he fell under Morgoth's power and became little more than a mindless @@ -16855,10 +28879,16 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:LOSE_STR:4d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange red growth on the dungeon floor; it seems to glow with D:an eerie pink aura. @@ -16872,11 +28902,23 @@ B:CLAW:POISON:2d8 B:CLAW:POISON:2d8 B:BITE:POISON:2d6 B:BITE:POISON:2d6 -F:DROP_SKELETON | FORCE_MAXHP | FRIENDS | -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | -F:ANIMAL | SPIDER | EVIL | IM_POIS | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FRIENDS +F:HURT_LITE +F:IM_POIS +F:OPEN_DOOR +F:SPIDER S:1_IN_4 -S:BO_FIRE | SLOW | HOLD | CAUSE_3 | MISSILE +S:BO_FIRE +S:CAUSE_3 +S:HOLD +S:MISSILE +S:SLOW D:A red arachnid with legs weaving spells in the air. N:964:Elder aranea @@ -16889,12 +28931,28 @@ B:CLAW:POISON:5d8 B:CLAW:POISON:5d8 B:BITE:HALLU:5d6 B:BITE:HALLU:5d6 -F:DROP_SKELETON | FORCE_MAXHP | -F:OPEN_DOOR | BASH_DOOR | HURT_LITE | SMART | -F:ANIMAL | SPIDER | EVIL | IM_FIRE | IM_POIS | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIDER S:1_IN_6 -S:SLOW | HOLD | DRAIN_MANA | MIND_BLAST | HEAL | -S:BA_FIRE | BO_FIRE | CAUSE_3 | S_SPIDER +S:BA_FIRE +S:BO_FIRE +S:CAUSE_3 +S:DRAIN_MANA +S:HEAL +S:HOLD +S:MIND_BLAST +S:SLOW +S:S_SPIDER D:A vast, bloated arachnid, master of its brood: among the more terrible of D:Ungoliant's descendants, this is a monster such as those who haunted the dread D:valley of Nan Dungortheb long ago. @@ -16907,8 +28965,13 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 B:STING:BLIND:1d1 -F:WEIRD_MIND | BASH_DOOR | CAN_FLY | -F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:IM_POIS +F:MORTAL +F:WEIRD_MIND D:It is moving slowly towards you. N:966:Wavelord @@ -16921,13 +28984,34 @@ B:HIT:HURT:8d9 B:HIT:COLD:8d9 B:HIT:HURT:8d9 B:HIT:COLD:8d9 -F:SMART | PET | DROP_CORPSE | FRIENDS | WILD_SHORE | WILD_OCEAN | WILD_TOO | -F:IM_POIS | AQUATIC | CAN_SWIM | DROP_USEFUL | -F:NO_CONF | NO_SLEEP | NO_FEAR | DROP_GOOD | DROP_3D2 | -F:MORTAL | REGENERATE | TAKE_ITEM | GOOD | SUSCEP_FIRE | -F:RES_WATE | RES_NEXU | HAS_LITE +F:AQUATIC +F:CAN_SWIM +F:DROP_3D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_USEFUL +F:FRIENDS +F:GOOD +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:PET +F:REGENERATE +F:RES_NEXU +F:RES_WATE +F:SMART +F:SUSCEP_FIRE +F:TAKE_ITEM +F:WILD_OCEAN +F:WILD_SHORE +F:WILD_TOO S:1_IN_4 -S:BO_WATE | BA_WATE | BO_ICEE +S:BA_WATE +S:BO_ICEE +S:BO_WATE D:The Dolphiners came with the Thunderlords from their far home. D:These friendly beings ride their sharks into combat to assist you. @@ -16937,8 +29021,10 @@ I:110:1d1:30:1:10 W:10:3:10:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART D:It does not look that powerful. N:968:Bat of Gorgoroth @@ -16949,11 +29035,24 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:POISON:1d10 B:CLAW:HURT:1d4 -F:DROP_60 | RAND_25 | MOVE_BODY | CAN_FLY | DROP_CORPSE | -F:BASH_DOOR | MOVE_BODY | FRIENDS | WEIRD_MIND | -F:ANIMAL | IM_POIS | AI_ANNOY | MORTAL | BASEANGBAND -S:1_IN_8 | -S:SCARE | BR_POIS | BR_DARK +F:AI_ANNOY +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_60 +F:DROP_CORPSE +F:FRIENDS +F:IM_POIS +F:MORTAL +F:MOVE_BODY +F:MOVE_BODY +F:RAND_25 +F:WEIRD_MIND +S:1_IN_8 +S:BR_DARK +S:BR_POIS +S:SCARE D:Fed with horrid meats and grown to enormous size, this slavering creature D:seeks livelier prey. @@ -16963,10 +29062,20 @@ I:110:1d1:40:250:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:0:1:0 -F:FEMALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE | NO_TARGET -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_DEATH | RES_TELE -F:MORTAL | BASEANGBAND | UNIQUE | PET | +F:BASEANGBAND +F:CAN_SPEAK +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:MORTAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:PET +F:RES_TELE +F:SPECIAL_GENE +F:UNIQUE D:The princess of an unknown kingdom, you need to save her. N:970:Merton Proudfoot, the lost hobbit @@ -16975,10 +29084,21 @@ I:110:1d1:40:250:3 W:0:0:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:MALE | CAN_SPEAK -F:FORCE_MAXHP | NEVER_GENE | WILD_ONLY | WILD_TOWN | -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | PET | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:NEVER_BLOW +F:NEVER_GENE +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:PET +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:The poor hobbit got lost in the dreadful maze. N:971:The Wight-King of the Barrow-downs @@ -16991,12 +29111,30 @@ B:HIT:HURT:2d10 B:WAIL:PARALYZE:2d6 B:TOUCH:EXP_80:4d8 B:TOUCH:EXP_80:4d8 -F:SPECIAL_GENE | FORCE_MAXHP | SMART | CAN_SPEAK | -F:DROP_4D2 | DROP_2D2 | COLD_BLOOD | UNIQUE | -F:CAN_SWIM | CAN_FLY | EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_4 | -S:HOLD | SCARE | CAUSE_3 | BA_NETH +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_4D2 +F:EVIL +F:FORCE_MAXHP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SMART +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +S:1_IN_4 +S:BA_NETH +S:CAUSE_3 +S:HOLD +S:SCARE D:He has lived in the Barrow-Downs for centuries after his first death at the D:hands of the Witch-King of Angmar. A once loyal captain under the D:Witch-King's command, he now awaits a time when his undead forces shall @@ -17010,9 +29148,14 @@ O:50:50:0:0 B:HIT:HURT:2d6 B:PUNCH:HURT:1d7 B:KICK:HURT:1d8 -F:SPECIAL_GENE | SMART | OPEN_DOOR -F:FORCE_MAXHP | CAN_SWIM | BASEANGBAND | -F:NO_SLEEP | NO_CONF +F:BASEANGBAND +F:CAN_SWIM +F:FORCE_MAXHP +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:SPECIAL_GENE D:A great warrior who misplaces his sword once in a while. N:973:Experienced possessor (soul) @@ -17020,8 +29163,10 @@ G:G:D I:120:5d5:30:50:10 W:30:3:10:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART S:1_IN_9 S:S_KIN D:It does not look that powerful. @@ -17031,8 +29176,10 @@ G:G:D I:130:10d10:30:100:10 W:95:3:10:0 O:0:0:0:0 -F:SMART | POSSESSOR | -F:BASEANGBAND | NO_CUT +F:BASEANGBAND +F:NO_CUT +F:POSSESSOR +F:SMART S:1_IN_4 S:S_KIN D:It does not look that powerful. @@ -17045,10 +29192,16 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:4d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange green growth that likes to live in D:the trees. @@ -17061,13 +29214,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_CONF | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_CONF +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:NO_CONF +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_CONF +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its scales glitter in D:a multitude of perplexing and distracting ways. @@ -17081,13 +29243,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | NO_STUN | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_SOUN +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:MORTAL +F:NO_STUN +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_SOUN +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. You can feel the air itself D:vibrating as you near it. @@ -17098,11 +29269,20 @@ I:100:1d1:1:1:0 W:1:1:20:3 E:0:0:0:0:0:0 O:0:0:0:0 -F:NEVER_MOVE | UNIQUE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | FORCE_DEPTH | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:MORTAL | WYRM_PROTECT | ONLY_DEPTH | JOKEANGBAND | NO_CUT +F:EMPTY_MIND +F:FORCE_DEPTH +F:IM_POIS +F:JOKEANGBAND +F:MORTAL +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:ONLY_DEPTH +F:STUPID +F:UNIQUE +F:WYRM_PROTECT D:A small strange growth. It seems to be defenceless. # New monster added by furiosity for the Theme module @@ -17113,10 +29293,16 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HALLU:4d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | -F:IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:STUPID D:It is a strange blue growth on the dungeon floor; it seems to glow with D:a puzzling aura. @@ -17130,12 +29316,33 @@ B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 -F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SPECIAL_GENE | AQUATIC | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE | -F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY | BASEANGBAND | -F:HAS_LITE | CAN_SWIM | MALE | -S:1_IN_6 | -S:HEAL | HASTE | TELE_AWAY | S_MONSTERS | S_KIN +F:AQUATIC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:CAN_SWIM +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_6 +S:HASTE +S:HEAL +S:S_KIN +S:S_MONSTERS +S:TELE_AWAY D:Last and proudest king of ancient Numenor. Corrupted by power and D:avarice, he fell victim to Sauron's wiles, tried to fight the immortals D:themselves, and condemned Numenor to oblivion. @@ -17146,7 +29353,11 @@ I:110:1d1:1:1:1 W:1:1:0:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:AI_ANNOY | NEVER_BLOW | DOPPLEGANGER | JOKEANGBAND | HAS_LITE | +F:AI_ANNOY +F:DOPPLEGANGER +F:HAS_LITE +F:JOKEANGBAND +F:NEVER_BLOW D:It looks like you. N:982:Marylene, Heartbreakeress of the Netherworld @@ -17159,21 +29370,79 @@ B:GAZE:PARALYZE:20d15 B:HIT:EXP_80:20d17 B:BITE:LOSE_ALL:10d12 B:TOUCH:INSANITY:12d9 -F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | FEMALE | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON | -F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE | -F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE | -F:REGENERATE | CAN_FLY | CAN_SWIM | WYRM_PROTECT | -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | RES_TELE | DEMON | -F:MORTAL | DG_CURSE | JOKEANGBAND | HAS_LITE -S:1_IN_1 | -S:BR_CHAO | BA_CHAO | BRAIN_SMASH | SHRIEK | BR_CONF | BR_SOUN | -S:BR_NETH | HASTE | TRAPS | FORGET | BR_DISE | BR_TIME | MIND_BLAST | -S:HEAL | TPORT | TELE_TO | CAUSE_1 | CAUSE_2 | CAUSE_3 | CAUSE_4 | BLIND | -S:CONF | SLOW | HOLD | S_UNIQUE +F:ATTR_ANY +F:ATTR_MULTI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DEMON +F:DG_CURSE +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:DROP_SKELETON +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:KILL_BODY +F:KILL_WALL +F:MORTAL +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_TELE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_1 +S:BA_CHAO +S:BLIND +S:BRAIN_SMASH +S:BR_CHAO +S:BR_CONF +S:BR_DISE +S:BR_NETH +S:BR_SOUN +S:BR_TIME +S:CAUSE_1 +S:CAUSE_2 +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:HASTE +S:HEAL +S:HOLD +S:MIND_BLAST +S:SHRIEK +S:SLOW +S:S_UNIQUE +S:TELE_TO +S:TPORT +S:TRAPS D:A woman of mind-shattering beauty, none can match her beauty. She is perfect, D:and totaly evil. She loves nothing but herself and her evilness is as D:great as her beauty. No one can stand against her, even DarkGod. @@ -17190,10 +29459,18 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:4d4 B:SPORE:HURT:4d4 -F:NEVER_MOVE | -F:STUPID | EMPTY_MIND | PET | -F:IM_FIRE | IM_POIS | CAN_SWIM | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:CAN_SWIM +F:EMPTY_MIND +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:PET +F:STUPID D:It is a fellow adventurer, mold though it is. # New monster added by furiosity for the Theme module @@ -17206,13 +29483,23 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | FRIENDS | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_9 | -S:SCARE | CAUSE_2 | DARKNESS | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:CAUSE_2 +S:DARKNESS +S:SCARE D:A paladin of short stature. He considers you a spy for Morgoth. N:985:Bandobras Took @@ -17223,11 +29510,20 @@ E:1:1:1:2:1:1 O:25:55:0:20 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:UNIQUE D:He is a sturdy hobbit who is renowned for his unusual strength and D:vigour. He can prove a troublesome opponent. @@ -17240,11 +29536,22 @@ O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | CAN_SWIM | -F:DROP_CORPSE | DROP_SKELETON | ONLY_GOLD | DROP_2D2 | -F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | -F:ANIMAL | MORTAL | BASEANGBAND -S:1_IN_9 | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:MORTAL +F:MOVE_BODY +F:ONLY_GOLD +F:OPEN_DOOR +F:WILD_SHORE +F:WILD_SWAMP +F:WILD_TOO +S:1_IN_9 S:SCARE D:A strange reptilian creature with three heads, guarding its hoard. @@ -17258,12 +29565,24 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:UNIQUE +S:1_IN_10 +S:S_KIN D:An evil and cunning man from the East. Having once sworn allegiance to the D:sons of Feanor, it was Uldor's treachery that turned the tide of the Battle D:of Unnumbered Tears in Morgoth's favour. @@ -17278,15 +29597,27 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | -S:S_SPIDER | S_ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:HEAL +S:S_ANIMAL +S:S_SPIDER D:An adept at unarmed combat, the mystic strikes with stunning power. He D:can summon help from nature and is able to focus his power to ease any D:pain. @@ -17301,14 +29632,37 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:BITE:EXP_80:5d6 B:BITE:EXP_80:5d6 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:DROP_60 | DROP_4D2 | DROP_GOOD | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_7 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH | S_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:UNDEAD +S:1_IN_7 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE +S:S_UNDEAD D:A terrible robed undead figure, this creature has existed in its D:unlife for many centuries by stealing the life of others. It can D:summon the very shades of its victims from beyond the grave to @@ -17324,12 +29678,30 @@ B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON | -F:FORCE_MAXHP | IM_FIRE | IM_COLD | IM_ELEC | SPECIAL_GENE | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_RANDART -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_10 | S_KIN | S_MONSTERS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_RANDART +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:HAS_LITE +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:SPECIAL_GENE +F:TAKE_ITEM +F:UNIQUE +S:1_IN_10 +S:S_KIN +S:S_MONSTERS D:A short and swarthy Easterling dressed in black. He and his three sons D:once openly swore allegiance to the High Elves, but were secretly in the D:pay of Morgoth. @@ -17343,15 +29715,27 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON -F:RES_NETH | RES_NEXU | -F:ONLY_ITEM | DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:TPORT | HOLD | -S:S_DEMON | BO_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:RES_NETH +F:RES_NEXU +F:SMART +S:1_IN_2 +S:BO_FIRE +S:HOLD +S:S_DEMON +S:TPORT D:A figure twisted by evil standing in robes of deepest crimson. N:992:Ungorrog @@ -17364,14 +29748,31 @@ B:HIT:HURT:3d4 B:STING:POISON:3d4 B:SPIT:FIRE:3d4 B:SPIT:ELEC:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | ESCORTS | -F:ONLY_ITEM | DROP_GREAT | AURA_FIRE | AURA_ELEC | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CONF | SCARE | HOLD -S:S_DEMON | BO_COLD | BO_ACID +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_GREAT +F:ESCORTS +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:BO_ACID +S:BO_COLD +S:CONF +S:HOLD +S:SCARE +S:S_DEMON D:The most powerful of the spider demons, Morgoth's corrupted D:spiders. It looks like a huge bloated spider, with claws D:that sparkle with all the elements. @@ -17386,13 +29787,25 @@ B:HIT:HURT:3d4 B:STING:POISON:3d4 B:SPIT:ELEC:3d4 B:CRUSH:HURT:6d8 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_90 | AURA_ELEC | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | IM_ELEC | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | +F:AURA_ELEC F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CONF | +F:BASH_DOOR +F:DEMON +F:DROP_90 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:CONF D:One of the spider demons, spawn of Ungoliant. It looks like D:a giant bloated spider surrounded by blazing sparks. @@ -17406,14 +29819,23 @@ B:HIT:HURT:3d4 B:STING:POISON:3d4 B:SPIT:FIRE:3d4 B:HIT:LOSE_STR:3d4 -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | -F:ONLY_ITEM | DROP_1D2 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | -F:IM_FIRE | NO_CONF | NO_SLEEP | -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CONF | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:CONF D:One of the spider demons, spawn of Ungoliant. It looks like D:a giant bloated spider glowing with malevolent flames. @@ -17427,14 +29849,26 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:FEMALE | -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_1D2 | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CAUSE_2 | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_CORPSE +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:CAUSE_2 +S:SCARE S:S_DEMON D:A corrupted Maia of female form, whose skin drips with blood. D:It has several arms, and fights with three grim daggers. @@ -17449,14 +29883,32 @@ B:HIT:FIRE:4d12 B:HIT:FIRE:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | KILL_WALL | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING | -F:BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:BLIND | CONF | SCARE | HASTE | -S:BR_FIRE | +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_1D2 +F:DROP_2D2 +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_4 +S:BLIND +S:BR_FIRE +S:CONF +S:HASTE +S:SCARE S:S_DEMON D:The greatest of the demons, potent in both magical might D:and sheer battle power. This corrupted Maia's form is @@ -17472,16 +29924,31 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | -S:S_SPIDER | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_3 +S:HEAL +S:S_ANIMALS +S:S_SPIDER D:A lord of all that is natural, skilled in the mystic ways. He is a master D:of martial arts and is at one with nature, able to summon help from the D:wild if need be. @@ -17496,15 +29963,32 @@ B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_4D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HEAL | MIND_BLAST | -S:S_SPIDER | S_HOUND | S_ANIMALS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_2 +S:HEAL +S:MIND_BLAST +S:S_ANIMALS +S:S_HOUND +S:S_SPIDER D:He is one of the few true masters of the art, being extremely skillful in D:all forms of unarmed combat and controlling the world's natural creatures D:with disdainful ease. @@ -17518,15 +30002,34 @@ O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:UN_BONUS:3d4 B:HIT:UN_POWER:1d5 -F:FORCE_SLEEP | FORCE_MAXHP | -F:ONLY_ITEM | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:EVIL | DEMON | NO_CONF | NO_SLEEP | -F:IM_FIRE | IM_POIS | IM_ELEC | IM_COLD | -F:BASEANGBAND -S:1_IN_9 | -S:BLIND | CONF | SCARE | HASTE | HEAL | S_KIN -S:TRAPS | SLOW | HOLD | SHRIEK | BLINK +F:BASEANGBAND +F:BASH_DOOR +F:DEMON +F:DROP_60 +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +S:1_IN_9 +S:BLIND +S:BLINK +S:CONF +S:HASTE +S:HEAL +S:HOLD +S:SCARE +S:SHRIEK +S:SLOW +S:S_KIN +S:TRAPS D:A twisted elemental spirit, this creature serves the Dark with D:perversions of the magics of nature. @@ -17537,10 +30040,21 @@ W:4:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:DROP_60 | WILD_TOO | -F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP -S:1_IN_9 | BLIND | SLOW | CONF | SCARE +F:BASEANGBAND +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_9 +S:BLIND +S:CONF +S:SCARE +S:SLOW D:A novice in the arts of mind over matter. # New monster added by furiosity for the Theme module @@ -17553,13 +30067,24 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:MALE | EVIL | WILD_TOO | DROP_SKELETON | DROP_CORPSE | -F:FORCE_SLEEP | -F:DROP_60 | -F:OPEN_DOOR | BASH_DOOR | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_5 | -S:HASTE | BLIND | CONF | DARKNESS | MISSILE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:WILD_TOO +S:1_IN_5 +S:BLIND +S:CONF +S:DARKNESS +S:HASTE +S:MISSILE D:A lord among gnomes. N:1002:Great Worm of Perplexity @@ -17572,13 +30097,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:CONFUSE:6d14 B:BITE:CONFUSE:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:POWERFUL +F:SMART +S:1_IN_4 +S:BLIND S:BR_CONF +S:CONF +S:SCARE D:A dragon of great size and power. Its polished bronze scales reflect the D:light in strange and confusing patterns, and you find it hard to keep your D:mind on the job of fighting for your life. @@ -17595,14 +30138,25 @@ B:KICK:HURT:8d2 B:KICK:HURT:8d2 B:KICK:HURT:8d2 B:KICK:HURT:8d2 -F:MALE | -F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON | -F:ONLY_ITEM | DROP_1D2 | -F:INVISIBLE | OPEN_DOOR | BASH_DOOR | -F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_6 | -S:HEAL | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_POIS +F:INVISIBLE +F:MALE +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +S:1_IN_6 +S:HEAL S:S_ANIMAL D:A mystic of short stature. He is quite skilled at unarmed D:combat and even has some control over the forces of nature. @@ -17617,14 +30171,31 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:HURT:6d14 B:BITE:HURT:6d14 -F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | -F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE | -F:EVIL | DRAGON | NO_CONF | NO_SLEEP | NO_STUN | BASEANGBAND | HAS_LITE F:ATTR_MULTI -S:1_IN_4 | -S:BLIND | CONF | SCARE | +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +S:1_IN_4 +S:BLIND S:BR_SOUN +S:CONF +S:SCARE D:A dragon of gigantic proportions, with destructive abilities to match. The D:sheer loudness of its roar leaves you stunned and unable to think clearly D:enough to defend yourself adequately. @@ -17636,8 +30207,12 @@ W:4:1:200:1 E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d2 -F:RAND_25 | CAN_SWIM | ANIMAL | -F:DROP_CORPSE | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_SWIM +F:DROP_CORPSE +F:MORTAL +F:RAND_25 S:MULTIPLY D:It is about three feet long with large teeth. As the light of your lamp falls D:on it, it seems to grow stronger. @@ -17652,9 +30227,16 @@ B:CLAW:HURT:3d2 B:CLAW:HURT:3d2 B:BITE:DISEASE:4d2 B:BITE:DISEASE:4d2 -F:UNIQUE | ESCORT | ESCORTS | FORCE_MAXHP | -F:BASH_DOOR | ANIMAL | NO_CONF | NO_SLEEP -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:MORTAL +F:NO_CONF +F:NO_SLEEP +F:UNIQUE D:A massive rat. He's the leader of the pack. # New monster added by furiosity for the Theme module @@ -17667,13 +30249,22 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:MALE | GOOD | -F:FORCE_SLEEP | -F:DROP_1D2 | -F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:HEAL | SCARE | CAUSE_2 | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +S:1_IN_3 +S:CAUSE_2 +S:HEAL +S:SCARE S:S_MONSTER D:A priest of short stature. He looks comically solemn. @@ -17684,8 +30275,13 @@ W:14:1:100:3 E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 -F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND | -F:ANIMAL | MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:CAN_FLY +F:MORTAL +F:RAND_25 +F:RAND_50 +F:WEIRD_MIND S:MULTIPLY D:It is an evil relative of the moth, native to marshlands. @@ -17696,13 +30292,32 @@ W:34:5:0:1200 E:0:0:0:0:0:0 O:0:0:100:0 B:HIT:HURT:5d5 -F:UNIQUE | MALE | CAN_SPEAK -F:FORCE_MAXHP | UNDEAD | NO_CONF | NO_SLEEP | REGENERATE | NO_STUN | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | PASS_WALL | -F:MORTAL | JOKEANGBAND | HAS_LITE | NO_CUT +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_GOOD +F:FORCE_MAXHP +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MORTAL +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:OPEN_DOOR +F:PASS_WALL +F:REGENERATE +F:TAKE_ITEM +F:UNDEAD +F:UNIQUE S:1_IN_6 -S:BR_FIRE | HOLD | CONF | SCARE | MIND_BLAST +S:BR_FIRE +S:CONF +S:HOLD +S:MIND_BLAST +S:SCARE D:He's back from the grave for vengeance on those who D:burnt him. He has no mercy for those in his way. @@ -17713,15 +30328,33 @@ W:36:2:1500:1200 E:1:1:1:2:1:1 O:20:20:20:20 B:HIT:HURT:3d8 -F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI | -F:FORCE_MAXHP | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE -F:OPEN_DOOR | BASH_DOOR | RAND_25 | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR -F:JOKEANGBAND | HAS_LITE -S:1_IN_4 | -S:TELE_TO | SHRIEK | SCARE +F:ATTR_MULTI +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_2D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_SKELETON +F:FORCE_MAXHP +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:MALE +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:RAND_25 +F:UNIQUE +S:1_IN_4 +S:SCARE +S:SHRIEK +S:TELE_TO D:Once a powerful adventurer, this poor fighter has seen a few too many D:software bugs in his time. Any shred of lucidity is long gone, but D:he still remains dangerous. He wanders aimlessly through the dungeon @@ -17740,12 +30373,22 @@ B:HIT:HURT:1d7 B:HIT:HURT:2d3 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_ITEM:5d6 -F:MALE | -F:DROP_90 | DROP_2D2 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM S:1_IN_6 -S:TRAPS | ARROW_2 | BLINK +S:ARROW_2 +S:BLINK +S:TRAPS D:A little gnome, fast and stealthy. He is eyeing your backpack. N:1012:Vermicious Knid @@ -17757,11 +30400,20 @@ O:40:30:20:10 B:TOUCH:TERRIFY:4d6 B:CRAWL:HURT:4d6 B:ENGULF:HURT:4d6 -F:FRIENDS | EVIL | IM_COLD | SMART | -F:COLD_BLOOD | NO_FEAR | WEIRD_MIND | -F:OPEN_DOOR | ONLY_ITEM | DROP_2D2 | HURT_ROCK | -F:NONLIVING | -F:JOKEANGBAND | NO_CUT +F:COLD_BLOOD +F:DROP_2D2 +F:EVIL +F:FRIENDS +F:HURT_ROCK +F:IM_COLD +F:JOKEANGBAND +F:NONLIVING +F:NO_CUT +F:NO_FEAR +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:WEIRD_MIND D:An amorphous shape that looks like wet grey clay with two pale eyes. D:It is totally silent as it oozes towards you. @@ -17775,13 +30427,32 @@ B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 B:HIT:LOSE_STR:6d6 B:HIT:LOSE_STR:6d6 -F:FORCE_SLEEP | FORCE_MAXHP | EMPTY_MIND | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:TELE_TO | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | BA_NETH | S_HI_UNDEAD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:RES_TELE +F:UNDEAD +S:1_IN_3 +S:BA_NETH +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:S_HI_UNDEAD +S:TELE_TO D:A skeletal form, black as night, constructed from the bones of its D:previous victims. @@ -17795,10 +30466,18 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d3 B:HIT:HURT:4d3 -F:MALE | -F:DROP_1D2 | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE | KILL_BODY | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_1D2 +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:HAS_LITE +F:KILL_BODY +F:MALE +F:MORTAL +F:OPEN_DOOR +F:TAKE_ITEM D:A warrior of short stature but great ferocity. N:1015:Bronze golem @@ -17811,11 +30490,30 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:FORCE_MAXHP | FORCE_SLEEP | EMPTY_MIND | COLD_BLOOD | -F:OPEN_DOOR | BASH_DOOR | IM_FIRE | IM_ELEC | IM_POIS | RES_TELE | -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT -S:1_IN_3 | -S:BO_PLAS | BA_FIRE | BR_FIRE | BA_ELEC | S_HI_DEMON | TELE_TO +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:OPEN_DOOR +F:RES_TELE +S:1_IN_3 +S:BA_ELEC +S:BA_FIRE +S:BO_PLAS +S:BR_FIRE +S:S_HI_DEMON +S:TELE_TO D:A gigantic four-armed animated bronze statue, glowing with great heat. # New monster added by furiosity for the Theme module @@ -17827,14 +30525,21 @@ W:14:2:900:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:MALE | -F:FORCE_SLEEP | DROP_60 | -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | -F:EVIL | MORTAL | BASEANGBAND | HAS_LITE -S:1_IN_4 | -S:DARKNESS | BO_COLD | -S:S_MONSTER +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_SKELETON +F:EVIL +F:FORCE_SLEEP +F:HAS_LITE +F:MALE +F:MORTAL +F:OPEN_DOOR +S:1_IN_4 +S:BO_COLD +S:DARKNESS S:MULTIPLY +S:S_MONSTER D:A short little gnome, waving his hands in the air. # New monster added by furiosity for the Theme module @@ -17848,9 +30553,18 @@ B:TOUCH:EAT_ITEM:5d5 B:TOUCH:EAT_ITEM:5d5 B:TOUCH:EAT_ITEM:5d5 B:TOUCH:EAT_ITEM:5d5 -F:JOKEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD | -F:MORTAL | GOOD | HAS_LITE | FORCE_SLEEP | -F:DROP_60 | DROP_GREAT | OPEN_DOOR | RES_TELE | +F:DROP_60 +F:DROP_GREAT +F:FORCE_SLEEP +F:GOOD +F:HAS_LITE +F:JOKEANGBAND +F:MORTAL +F:OPEN_DOOR +F:RES_TELE +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A funny, smiling humanoid of short stature, with a pony- D:tail and an enormous pouch. He is very polite, but also D:very curious. So curious, in fact, that the contents of @@ -17864,9 +30578,20 @@ I:110:9d8:10:10:3 W:15:3:1000:0 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD | -F:MORTAL | GOOD | HAS_LITE | FORCE_SLEEP | NO_FEAR | -F:PET | FRIENDS | DROP_60 | OPEN_DOOR | BASH_DOOR | +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:FORCE_SLEEP +F:FRIENDS +F:GOOD +F:HAS_LITE +F:MORTAL +F:NO_FEAR +F:OPEN_DOOR +F:PET +F:WILD_GRASS +F:WILD_TOO +F:WILD_WOOD D:A fellow adventurer of rather short stature. # New monster added by furiosity for the Theme module @@ -17880,9 +30605,18 @@ B:BITE:HURT:1d8 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND | -F:IM_POIS | CAN_FLY | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_POIS +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large cat that prefers to dwell in the trees and is very D:adept at navigating through the thickest forests while it D:stalks its prey. @@ -17897,9 +30631,19 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND | -F:EMPTY_MIND | KILL_BODY | HURT_LITE | +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EMPTY_MIND +F:HURT_LITE +F:KILL_BODY +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A huge dark shape pouncing on you from the darkness, this cat D:mostly hunts at night and is extremely good at evading detection. @@ -17913,9 +30657,16 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | -F:MORTAL | BASEANGBAND +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:MORTAL +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large cat with sleek brown spotted fur. It is fast and lithe, D:and none escape its notice. @@ -17929,9 +30680,21 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 -F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN | -F:ANIMAL | DROP_SKELETON | DROP_CORPSE | SMART | PET | -F:MORTAL | JOKEANGBAND | IM_POIS | WEIRD_MIND | INVISIBLE | +F:ANIMAL +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:IM_POIS +F:INVISIBLE +F:JOKEANGBAND +F:MORTAL +F:PET +F:SMART +F:WEIRD_MIND +F:WILD_GRASS +F:WILD_MOUNTAIN +F:WILD_TOO +F:WILD_WOOD D:A large cat with a huge smile. In fact, sometimes the smile D:is all you see of it. @@ -17944,13 +30707,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ELEC | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_ELEC +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ELEC +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ELEC +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Sparks fly from its jaws. @@ -17963,13 +30735,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_COLD | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_COLD +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_COLD +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_COLD +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its breath condenses in the air. @@ -17982,13 +30763,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_POIS | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_POIS +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. You can smell foul gases D:on its breath. @@ -18002,13 +30792,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ACID | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_ACID +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ACID +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Acidic drool drips from its jaws. @@ -18021,13 +30820,22 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_FIRE | -F:MORTAL | BASEANGBAND | ATTR_MULTI -S:MULTIPLY | -S:1_IN_6 | BR_FIRE +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_FIRE +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_FIRE +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Smoke comes from its mouth. @@ -18040,13 +30848,30 @@ O:0:0:0:0 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 -F:RAND_50 | RAND_25 | ATTR_MULTI | -F:DROP_60 | ONLY_GOLD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | DRAGON | IM_ELEC | IM_FIRE | IM_ACID | IM_COLD | IM_POIS | -F:MORTAL | BASEANGBAND -S:MULTIPLY | -S:1_IN_6 | BR_ELEC | BR_COLD | BR_FIRE | BR_ACID | BR_POIS +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DRAGON +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_25 +F:RAND_50 +S:1_IN_6 +S:BR_ACID +S:BR_COLD +S:BR_ELEC +S:BR_FIRE +S:BR_POIS +S:MULTIPLY D:You thought dragons used eggs, but this worm has the scales, and the bad D:breath, and the fiery eyes, of a real dragon. Its scales shimmer different D:colours as you watch. @@ -18061,9 +30886,14 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 -F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:EVIL | UNIQUE | SPECIAL_GENE | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:EVIL +F:MORTAL +F:SPECIAL_GENE +F:UNIQUE D:It is a cross between a human and a bull. The last of its kind, D:it guards its treasure jealously. @@ -18077,11 +30907,33 @@ B:CLAW:ACID:5d4 B:CLAW:POISON:5d4 B:BITE:FIRE:5d4 B:BITE:ELEC:5d4 -F:FORCE_MAXHP | DROP_60 | ONLY_ITEM | DROP_GREAT | DROP_GOOD | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | FEMALE | POWERFUL | SPECIAL_GENE | REFLECTING | -F:EVIL | ANIMAL | IM_ELEC | IM_FIRE | IM_ACID | IM_POIS | ESCORT | -F:MORTAL | BASEANGBAND | EMPTY_MIND | UNIQUE | NO_CONF -S:1_IN_2 | BR_POIS | S_KIN +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_60 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EMPTY_MIND +F:ESCORT +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_2 +S:BR_POIS +S:S_KIN D:Queen and Mother of the sandworms, fear her and her prolific children. N:1031:Sandworm @@ -18094,10 +30946,17 @@ B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:BITE:HURT:5d5 -F:RAND_25 | -F:FORCE_MAXHP | DROP_CORPSE | POWERFUL | -F:EVIL | IM_ELEC | IM_FIRE | IM_POIS | EMPTY_MIND | -F:MORTAL | BASEANGBAND +F:BASEANGBAND +F:DROP_CORPSE +F:EMPTY_MIND +F:EVIL +F:FORCE_MAXHP +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:POWERFUL +F:RAND_25 S:MULTIPLY D:Offbreed of the Sandworm Queen, it is harmless alone. @@ -18111,17 +30970,42 @@ B:GAZE:UN_BONUS:10d10 B:GAZE:TIME:10d10 B:GAZE:INSANITY:10d10 B:GAZE:INSANITY:10d5 -F:UNIQUE | SPECIAL_GENE | -F:FORCE_MAXHP | POWERFUL | -F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT | -F:INVISIBLE | COLD_BLOOD | PASS_WALL | WEIRD_MIND | -F:EVIL | UNDEAD | IM_COLD | IM_FIRE | IM_ACID | IM_ELEC | AURA_COLD | -F:IM_POIS | RES_NETH | BASEANGBAND | NO_CUT -S:1_IN_2 | -S:S_UNDEAD | S_DEMON | S_DRAGON | -S:S_UNIQUE | S_WRAITH | S_HI_DEMON | -S:S_HI_UNDEAD | S_HI_DRAGON | S_KIN | -S:BR_DISE | BA_NETH +F:AURA_COLD +F:BASEANGBAND +F:COLD_BLOOD +F:DROP_3D2 +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:INVISIBLE +F:NO_CUT +F:ONLY_ITEM +F:PASS_WALL +F:POWERFUL +F:RES_NETH +F:SPECIAL_GENE +F:UNDEAD +F:UNIQUE +F:WEIRD_MIND +S:1_IN_2 +S:BA_NETH +S:BR_DISE +S:S_DEMON +S:S_DRAGON +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_UNDEAD +S:S_UNIQUE +S:S_WRAITH D:A disembodied and barely sentient mind, Tik'srvzllat floated D:through the void for eons before being awakened by sorcery, pulled D:into the nether realm, and shaped into the being you see before you. @@ -18139,13 +31023,38 @@ B:HIT:INSANITY:5d6 B:HIT:INSANITY:6d6 B:HIT:INSANITY:7d6 B:HIT:INSANITY:6d6 -F:COLD_BLOOD | EMPTY_MIND | KILL_WALL | FORCE_MAXHP | POWERFUL | SPECIAL_GENE | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING | -F:ESCORTS | ESCORT | UNIQUE | NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN -F:CHAR_MULTI | CAN_FLY | BASEANGBAND | NO_CUT +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:ESCORT +F:ESCORTS +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_WALL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:POWERFUL +F:SPECIAL_GENE +F:UNIQUE S:1_IN_4 -S:BR_CONF | BR_LITE | BR_DARK | BR_WALL -S:S_KIN | TELE_LEVEL | SHRIEK +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:BR_WALL +S:SHRIEK +S:S_KIN +S:TELE_LEVEL D:One of the last creations of the Petty-Dwarves of Ludarin, its existence D:explains their destruction. A creation of finest glass, the body of this D:creature bends and amplifies light in a way that makes you unsure of its @@ -18162,14 +31071,39 @@ B:HIT:COLD:4d12 B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | CAN_FLY | -F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING | DROP_RANDART -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART | -F:EVIL | DEMON | IM_COLD | NO_CONF | KILL_WALL | BASEANGBAND | -F:HAS_LITE | FEMALE | SPECIAL_GENE -S:1_IN_4 | -S:BLIND | CONF | BRAIN_SMASH | -S:BR_COLD | BO_COLD | BA_NETH | S_UNDEAD | S_DEMON +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:DROP_GOOD +F:DROP_RANDART +F:EVIL +F:FEMALE +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_COLD +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:NO_CONF +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SMART +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_4 +S:BA_NETH +S:BLIND +S:BO_COLD +S:BRAIN_SMASH +S:BR_COLD +S:CONF +S:S_DEMON +S:S_UNDEAD D:She was once the wife of Turgon and mother of Idril Celebrindal. She was D:lost when the Noldor crossed the Grinding Ice after Feanor and his sons D:betrayed Fingolfin's host by burning the white ships of Alqualonde. @@ -18185,11 +31119,32 @@ O:60:0:40:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | KILL_BODY | ESCORT | -F:BASH_DOOR | IM_COLD | IM_ACID | IM_ELEC | IM_POIS | NONLIVING | UNIQUE -F:HURT_ROCK | NO_CONF | NO_SLEEP | NO_CUT | CHAR_MULTI | BASEANGBAND | SPECIAL_GENE -F:NO_CUT | DROP_RANDART -S:1_IN_10 | S_KIN | BO_ACID | BA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CHAR_MULTI +F:COLD_BLOOD +F:DROP_RANDART +F:EMPTY_MIND +F:ESCORT +F:FORCE_SLEEP +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:KILL_BODY +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_CUT +F:NO_SLEEP +F:PASS_WALL +F:SPECIAL_GENE +F:UNIQUE +S:1_IN_10 +S:BA_FIRE +S:BO_ACID +S:S_KIN D:Deep in the heart of the earth, even the rock itself is sentient D:and has learned to despise intruders. @@ -18201,10 +31156,23 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:INSULT:* -F:MALE | RAND_50 | CAN_SPEAK | NEUTRAL | NO_TARGET | -F:ONLY_GOLD | DROP_60 | DROP_SKELETON | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY | -F:MORTAL | BASEANGBAND | HAS_LITE | AI_ANNOY | +F:AI_ANNOY +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_60 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:ONLY_GOLD +F:OPEN_DOOR +F:RAND_50 +F:WILD_ONLY +F:WILD_TOWN D:He thinks you are not pious enough. He will try to D:get you to change your ways. @@ -18216,10 +31184,21 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:MALE | NEUTRAL | NO_TARGET | -F:ONLY_ITEM | DROP_90 | DROP_SKELETON | DROP_CORPSE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:MALE +F:MORTAL +F:NEUTRAL +F:NO_TARGET +F:ONLY_ITEM +F:OPEN_DOOR +F:TAKE_ITEM +F:WILD_ONLY +F:WILD_TOWN D:He's wearing fancy clothes of foreign make. He looks tired. N:1038:Water hound @@ -18231,9 +31210,18 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 E:0:1:0:2:1:0 O:0:0:0:0 -F:FORCE_SLEEP | BASH_DOOR | DROP_CORPSE | FRIENDS -F:ANIMAL | IM_COLD | MORTAL | BASEANGBAND | RES_WATE | NO_CUT -S:1_IN_5 | BA_WATE +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:FORCE_SLEEP +F:FRIENDS +F:IM_COLD +F:MORTAL +F:NO_CUT +F:RES_WATE +S:1_IN_5 +S:BA_WATE D:The sound of a hundred waterfalls rushes through your ears as D:a huge wave of water, vaguely hound-shaped, rushes towards you. @@ -18247,18 +31235,49 @@ B:SPORE:UN_BONUS:10d10 B:SPORE:EXP_80:10d10 B:SPORE:TIME:10d10 B:SPORE:TIME:10d10 -F:UNIQUE | NEVER_MOVE | CAN_SWIM | CAN_SPEAK | -F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | -F:REFLECTING | AURA_ELEC | ONLY_ITEM | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | FORCE_SLEEP | RES_NETH | -F:SMART | POWERFUL | RES_TELE | REGENERATE | CAN_FLY | -F:DG_CURSE | WYRM_PROTECT | EVIL | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | -F:JOKEANGBAND | HAS_LITE | RES_WATE | NO_CUT -S:1_IN_2 | -S:S_HI_DRAGON | S_KIN | BR_DISI | HEAL | TPORT | -S:TELE_LEVEL | TELE_TO +F:AURA_ELEC +F:CAN_FLY +F:CAN_SPEAK +F:CAN_SWIM +F:DG_CURSE +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:HAS_LITE +F:IM_ACID +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:JOKEANGBAND +F:NEVER_MOVE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:RES_WATE +F:SMART +F:UNIQUE +F:WEIRD_MIND +F:WYRM_PROTECT +S:1_IN_2 +S:BR_DISI +S:HEAL +S:S_HI_DRAGON +S:S_KIN +S:TELE_LEVEL +S:TELE_TO +S:TPORT D:An assistant to DarkGod, Improv has chosen the form of a dense D:purple smog for his incarnation into Middle-earth. It travels the D:dungeons, killing software bugs and creating random artifacts for @@ -18274,15 +31293,37 @@ B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 -F:MIMIC | UNIQUE -F:FORCE_SLEEP | -F:EMPTY_MIND | COLD_BLOOD | -F:IM_ACID | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS | -F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT -S:1_IN_1 | -S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | FORGET | -S:BA_ACID | BA_FIRE | BA_COLD | BA_ELEC | -S:S_MONSTER | S_KIN | SHRIEK | BRAIN_SMASH | TRAPS +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:FORCE_SLEEP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:MIMIC +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:UNIQUE +S:1_IN_1 +S:BA_ACID +S:BA_COLD +S:BA_ELEC +S:BA_FIRE +S:BLIND +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:CONF +S:FORGET +S:SCARE +S:SHRIEK +S:S_KIN +S:S_MONSTER +S:TRAPS D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -18292,10 +31333,22 @@ I:110:1d1:40:250:3 W:0:0:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:FEMALE | CAN_SPEAK | WILD_ONLY | WILD_TOWN | -F:FORCE_MAXHP | NEVER_GENE -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_TARGET | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FEMALE +F:FORCE_MAXHP +F:GOOD +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_GENE +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:NO_TARGET +F:UNIQUE +F:WILD_ONLY +F:WILD_TOWN D:She seems to seek someone, you may help. N:1042:Thrain, the King Under the Mountain @@ -18304,10 +31357,20 @@ I:110:1d1:40:250:3 W:60:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:MALE | CAN_SPEAK -F:FORCE_MAXHP | SPECIAL_GENE -F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET -F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_TARGET | NO_DEATH +F:BASEANGBAND +F:CAN_SPEAK +F:FORCE_MAXHP +F:GOOD +F:MALE +F:MORTAL +F:NEUTRAL +F:NEVER_BLOW +F:NEVER_MOVE +F:NO_DEATH +F:NO_TARGET +F:NO_TARGET +F:SPECIAL_GENE +F:UNIQUE D:He must have suffered horrible tortures. N:1043:Fire golem @@ -18320,11 +31383,21 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:FIRE:3d6 B:HIT:FIRE:3d6 -F:BASH_DOOR | AURA_FIRE | HAS_LITE -F:IM_FIRE | SPECIAL_GENE -F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | NO_STUN -F:MORTAL | BASEANGBAND | NO_CUT | AI_PLAYER -S:1_IN_10 | +F:AI_PLAYER +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:HAS_LITE +F:IM_FIRE +F:MORTAL +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:SPECIAL_GENE +S:1_IN_10 S:BR_FIRE D:A sentient mass of pure fire. @@ -18338,20 +31411,65 @@ B:HIT:ABOMINATION:3d10 B:HIT:TIME:24d10 B:HIT:INSANITY:24d10 B:HIT:LOSE_ALL:24d10 -F:UNIQUE | CAN_SPEAK | MALE | -F:FORCE_MAXHP | SPIRIT -F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 | -F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH | -F:SMART | KILL_WALL | MOVE_BODY | AURA_FIRE | -F:REGENERATE | POWERFUL | SPECIAL_GENE | CAN_FLY | KILL_TREES -F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | -F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND | -S:1_IN_4 | -S:BRAIN_SMASH | -S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD | S_KIN | -S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | -S:BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH | HEAL | BRAIN_SMASH | -S:DRAIN_MANA | TELE_TO | DARKNESS | SHRIEK +F:AURA_FIRE +F:BASEANGBAND +F:CAN_FLY +F:CAN_SPEAK +F:DROP_1D2 +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CHOSEN +F:DROP_GOOD +F:DROP_GREAT +F:EVIL +F:FORCE_MAXHP +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_TREES +F:KILL_WALL +F:MALE +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_ITEM +F:POWERFUL +F:REGENERATE +F:RES_NETH +F:RES_TELE +F:SMART +F:SPECIAL_GENE +F:SPIRIT +F:UNIQUE +S:1_IN_4 +S:ANIM_DEAD +S:BA_CHAO +S:BA_DARK +S:BA_MANA +S:BA_NETH +S:BO_MANA +S:BRAIN_SMASH +S:BRAIN_SMASH +S:BR_DISI +S:BR_NETH +S:DARKNESS +S:DRAIN_MANA +S:HAND_DOOM +S:HEAL +S:SHRIEK +S:S_HI_DEMON +S:S_HI_DRAGON +S:S_HI_UNDEAD +S:S_KIN +S:S_MONSTERS +S:S_UNIQUE +S:S_WRAITH +S:TELE_TO D:He was the most powerful of the Valar, the equal of Manwe. D:You banned him here, in the Void, and now you must destroy him D:forever. However here in the Void, his spirit gained much power @@ -18371,9 +31489,14 @@ E:0:1:1:2:0:0 O:25:0:75:0 B:TOUCH:EXP_80:10d10 B:TOUCH:EXP_80:10d10 -F:SPIRIT | BASEANGBAND | NEVER_MOVE | EMPTY_MIND | NO_CUT | -F:COLD_BLOOD | INVISIBLE -S:1_IN_1 | +F:BASEANGBAND +F:COLD_BLOOD +F:EMPTY_MIND +F:INVISIBLE +F:NEVER_MOVE +F:NO_CUT +F:SPIRIT +S:1_IN_1 S:BA_NETH D:This strange, almost intangible spirit keeps assaulting you! @@ -18388,8 +31511,12 @@ B:TOUCH:POISON:10d10 B:CRAWL:POISON:10d10 B:CRAWL:EAT_ITEM:10d9 B:BITE:UN_BONUS:9d9 -F:SPIRIT | BASEANGBAND | WEIRD_MIND | FRIENDS | -F:AI_ANNOY | PASS_WALL +F:AI_ANNOY +F:BASEANGBAND +F:FRIENDS +F:PASS_WALL +F:SPIRIT +F:WEIRD_MIND S:MULTIPLY D:These things multiply at an apparently unstoppable rate! @@ -18403,9 +31530,16 @@ O:0:0:0:0 B:TOUCH:LOSE_DEX:2d3 B:TOUCH:PARALYZE:1d12 B:TOUCH:PARALYZE:1d12 -F:SPIRIT | BASEANGBAND | NO_SLEEP | PASS_WALL | WEIRD_MIND -S:1_IN_2 | -S:SLOW | BLINK | HOLD | HASTE +F:BASEANGBAND +F:NO_SLEEP +F:PASS_WALL +F:SPIRIT +F:WEIRD_MIND +S:1_IN_2 +S:BLINK +S:HASTE +S:HOLD +S:SLOW D:Coming towards you quickly, it seems intent on moving faster than you. # Spirit of confusion @@ -18419,11 +31553,26 @@ B:ENGULF:HALLU:16d8 B:ENGULF:HALLU:16d8 B:ENGULF:CONFUSE:16d8 B:ENGULF:CONFUSE:16d8 -F:SPIRIT | BASEANGBAND | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC | -F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | ATTR_MULTI | -F:NO_CONF | NO_SLEEP | NO_FEAR | NO_CUT -S:1_IN_3 | -S:BR_CHAO | BR_NEXU | BR_NUKE | BR_CONF +F:ATTR_MULTI +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EMPTY_MIND +F:IM_ELEC +F:IM_FIRE +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:POWERFUL +F:RES_NEXU +F:SPIRIT +S:1_IN_3 +S:BR_CHAO +S:BR_CONF +S:BR_NEXU +S:BR_NUKE D:A swirling mass, constantly changing its appearance. # Spirit of brawn @@ -18437,10 +31586,25 @@ B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 -F:SPIRIT | BASEANGBAND | DROP_4D2 | KILL_BODY | KILL_WALL | -F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | KILL_TREES | -F:EVIL | GIANT | HURT_ROCK | BASEANGBAND | HAS_LITE | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASEANGBAND +F:BASH_DOOR +F:DROP_4D2 +F:DROP_CORPSE +F:EVIL +F:GIANT +F:HAS_LITE +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_TREES +F:KILL_WALL +F:OPEN_DOOR +F:SPIRIT D:Strong and swarthy, this spirit could bend metal with his bare hands. # Spirit of Wyrms @@ -18454,19 +31618,67 @@ B:CLAW:HURT:10d15 B:CLAW:HURT:10d15 B:BITE:HURT:14d18 B:BITE:HURT:14d18 -F:SPIRIT | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC | -F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | RES_NETH | RES_DISE | -F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | KILL_TREES | -F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | -F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT -S:1_IN_3 | -S:S_HI_DRAGON | S_DRAGON | S_KIN | -S:BR_NUKE | BR_ACID | BR_ELEC | BR_FIRE | -S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK | -S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU | -S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS | -S:BR_WALL | BR_MANA | BR_DISI +F:AURA_COLD +F:AURA_ELEC +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:FORCE_MAXHP +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_TREES +F:MOVE_BODY +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS +F:RES_TELE +F:SPIRIT +S:1_IN_3 +S:BR_ACID +S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK +S:BR_DISE +S:BR_DISI +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE +S:BR_MANA +S:BR_NETH +S:BR_NEXU +S:BR_NUKE +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL +S:S_DRAGON +S:S_HI_DRAGON +S:S_KIN D:This spirit bears a remarkable similarity to some of the most powerful D:types of dragonkind found in Middle-earth. It appears to be even more D:fearsome, though! @@ -18481,11 +31693,23 @@ O:25:20:25:20 B:BITE:POISON:15d15 B:BITE:POISON:15d15 B:BITE:LOSE_ALL:10d12 -F:SPIRIT | CAN_SWIM | IM_POIS | IM_ACID | -F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE | -F:OPEN_DOOR | BASH_DOOR | EVIL | BASEANGBAND -S:1_IN_4 | -S:BA_POIS | S_MONSTER | SCARE | HOLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SWIM +F:DROP_2D2 +F:DROP_60 +F:DROP_CORPSE +F:EVIL +F:FRIENDS +F:IM_ACID +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_4 +S:BA_POIS +S:HOLD +S:SCARE +S:S_MONSTER D:It slides towards you, a horrible scaly, slidy thing. # Spirit of seeing @@ -18499,11 +31723,25 @@ B:GAZE:UN_BONUS:12d12 B:GAZE:UN_POWER:12d10 B:GAZE:INSANITY:12d14 B:GAZE:LOSE_ALL:6d6 -F:SPIRIT | BASH_DOOR | EVIL | IM_POIS | -F:CAN_FLY | BASEANGBAND -S:1_IN_2 | -S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH | -S:BA_DARK | BO_MANA | BA_NETH | BA_ACID | BA_FIRE | BA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:EVIL +F:IM_POIS +F:SPIRIT +S:1_IN_2 +S:BA_ACID +S:BA_COLD +S:BA_DARK +S:BA_FIRE +S:BA_NETH +S:BLIND +S:BO_MANA +S:BRAIN_SMASH +S:CONF +S:DRAIN_MANA +S:FORGET +S:SCARE D:You will find it difficult to avoid being seen by this spirit! And D:once it has you in its sight, beware! @@ -18518,12 +31756,31 @@ B:TOUCH:UN_BONUS:12d12 B:TOUCH:UN_POWER:12d10 B:TOUCH:INSANITY:12d14 B:TOUCH:LOSE_ALL:6d6 -F:SPIRIT | CAN_FLY | REFLECTING | -F:SMART | BASH_DOOR | COLD_BLOOD | INVISIBLE | EMPTY_MIND | -F:EVIL | BASEANGBAND | CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR -S:1_IN_3 | -S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF | -S:HEAL | TELE_AWAY | DARKNESS | TRAPS | FORGET | SHRIEK +F:ATTR_CLEAR +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:CHAR_CLEAR +F:CHAR_MULTI +F:COLD_BLOOD +F:EMPTY_MIND +F:EVIL +F:INVISIBLE +F:REFLECTING +F:SMART +F:SPIRIT +S:1_IN_3 +S:BLIND +S:BLINK +S:CONF +S:DARKNESS +S:DRAIN_MANA +S:FORGET +S:HEAL +S:SCARE +S:SHRIEK +S:TELE_AWAY +S:TRAPS D:Hopefully you will kill this spirit before you realise it exists. # Spirit of ickyness @@ -18537,12 +31794,24 @@ B:CRAWL:POISON:12d14 B:CRAWL:EAT_FOOD:12d14 B:TOUCH:ACID:13d15 B:HIT:HURT:13d15 -F:SPIRIT | BASEANGBAND | -F:EMPTY_MIND | OPEN_DOOR | BASH_DOOR | -F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | IM_POIS | -F:EMPTY_MIND -S:1_IN_4 | -S:DRAIN_MANA | BLIND | CONF | SCARE | S_KIN +F:BASEANGBAND +F:BASH_DOOR +F:EMPTY_MIND +F:EMPTY_MIND +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_4 +S:BLIND +S:CONF +S:DRAIN_MANA +S:SCARE +S:S_KIN D:A horrible slimy spirit, that seems to ooze evilness. I wouldn't get D:too close to it if I were you. @@ -18557,10 +31826,13 @@ B:BITE:HURT:12d12 B:BITE:HURT:12d12 B:BITE:HURT:12d8 B:BITE:HURT:12d8 -F:SPIRIT | BASEANGBAND | -F:ESCORT | ESCORTS | -F:OPEN_DOOR | BASH_DOOR -S:1_IN_2 | +F:BASEANGBAND +F:BASH_DOOR +F:ESCORT +F:ESCORTS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 S:S_KIN D:This spirit appears to have lots of friends! @@ -18575,11 +31847,22 @@ B:WAIL:TERRIFY:8d9 B:HIT:HURT:10d10 B:HIT:ABOMINATION:6d10 B:HIT:ABOMINATION:6d10 -F:SPIRIT | BASEANGBAND | -F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP | -F:COLD_BLOOD | HURT_LITE | NO_CUT -S:1_IN_3 | -S:SCARE | HOLD | DARKNESS | SCARE +F:BASEANGBAND +F:COLD_BLOOD +F:EVIL +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:SPIRIT +F:UNDEAD +S:1_IN_3 +S:DARKNESS +S:HOLD +S:SCARE +S:SCARE D:It seems to have been woken from the dead, this spirit. It lumbers D:towards you, seeking to turn you into a form as hideous as its own! @@ -18595,9 +31878,20 @@ O:0:100:0:0 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 -F:SPIRIT | BASEANGBAND | DROP_2D2 | KILL_BODY | KILL_WALL | -F:BASH_DOOR | EVIL | GIANT | HURT_ROCK | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:GIANT +F:HURT_ROCK +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:KILL_BODY +F:KILL_WALL +F:SPIRIT D:It is coming for you, this massive imposing tower of strength. D:It appears almost unstoppable! @@ -18611,12 +31905,27 @@ O:0:0:100:0 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | SMART | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:HASTE | TPORT | TELE_TO | BLIND | CONF | -S:BO_MANA | BO_FIRE | BO_COLD | BO_ELEC | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_2 +S:BLIND +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:BO_MANA +S:CONF +S:HASTE +S:TELE_TO +S:TPORT D:This spirit looks very clever, cunning almost. # Spirit of wisdom @@ -18629,12 +31938,24 @@ O:0:50:50:0 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:HEAL | MIND_BLAST | CAUSE_4 | SCARE | -S:DRAIN_MANA | BRAIN_SMASH | FORGET | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 +S:BRAIN_SMASH +S:CAUSE_4 +S:DRAIN_MANA +S:FORGET +S:HEAL +S:MIND_BLAST +S:SCARE D:This spirit has something of a priestly look about it. # Spirit of dexterity @@ -18647,10 +31968,18 @@ O:0:50:25:25 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | SMART | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_1 | +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_1 S:ARROW_4 D:This spirit moves almost too quickly for you to see him. @@ -18664,8 +31993,16 @@ O:0:50:0:50 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 -F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | BASH_DOOR | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:SPIRIT D:This spirit moves slower than most, but thunders on and on D:towards you. @@ -18679,11 +32016,23 @@ O:70:10:10:10 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 -F:SPIRIT | BASEANGBAND | DROP_2D2 | -F:OPEN_DOOR | EVIL | TAKE_ITEM | -F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS -S:1_IN_2 | -S:TRAPS | ARROW_3 | BLINK | TELE_TO | CONF +F:BASEANGBAND +F:DROP_2D2 +F:EVIL +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:SPIRIT +F:TAKE_ITEM +S:1_IN_2 +S:ARROW_3 +S:BLINK +S:CONF +S:TELE_TO +S:TRAPS D:There is something attractive about this spirit, and it seems D:to have a full purse. @@ -18699,9 +32048,15 @@ O:25:60:0:15 B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 -F:SPIRIT | BASEANGBAND | AI_ANNOY | IM_FIRE | AURA_FIRE | HAS_LITE -S:1_IN_2 | -S:BO_FIRE | BA_FIRE +F:AI_ANNOY +F:AURA_FIRE +F:BASEANGBAND +F:HAS_LITE +F:IM_FIRE +F:SPIRIT +S:1_IN_2 +S:BA_FIRE +S:BO_FIRE D:Flickering towards you, and then away, this spirit will burn you badly! # Spirit of icy cold @@ -18714,10 +32069,15 @@ O:25:60:0:15 B:HIT:COLD:10d8 B:HIT:COLD:10d8 B:HIT:COLD:10d8 -F:SPIRIT | BASEANGBAND | IM_COLD | AURA_COLD | -F:COLD_BLOOD | BASH_DOOR -S:1_IN_2 | -S:BO_COLD | BA_COLD +F:AURA_COLD +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:IM_COLD +F:SPIRIT +S:1_IN_2 +S:BA_COLD +S:BO_COLD D:The temperature around you drops as soon as you set eyes on this spirit. # Spirit of corrosion (acid) @@ -18730,9 +32090,14 @@ O:25:60:0:15 B:HIT:ACID:10d8 B:HIT:ACID:10d8 B:HIT:ACID:10d8 -F:SPIRIT | BASEANGBAND | IM_ACID | BASH_DOOR | KILL_TREES -S:1_IN_2 | -S:BO_ACID | BA_ACID +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:KILL_TREES +F:SPIRIT +S:1_IN_2 +S:BA_ACID +S:BO_ACID D:The very fabric of the void heals itself where this spirit walks. # Spirit of shocking (electricity) @@ -18745,9 +32110,14 @@ O:25:60:0:15 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 -F:SPIRIT | BASEANGBAND | IM_ELEC | AURA_ELEC | BASH_DOOR -S:1_IN_2 | -S:BO_ELEC | BA_ELEC +F:AURA_ELEC +F:BASEANGBAND +F:BASH_DOOR +F:IM_ELEC +F:SPIRIT +S:1_IN_2 +S:BA_ELEC +S:BO_ELEC D:The air crackles as this spirit approaches, and you smell singed flesh. # Spirit of Valaraukar (Balrogs) @@ -18761,12 +32131,28 @@ B:HIT:FIRE:11d12 B:HIT:FIRE:11d12 B:CRUSH:HURT:10d12 B:TOUCH:UN_POWER -F:SPIRIT | CAN_FLY | KILL_WALL | AURA_FIRE | NONLIVING | -F:ONLY_ITEM | DROP_2D2 | EVIL | DEMON | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | -F:IM_FIRE | IM_ELEC | BASEANGBAND | HAS_LITE -S:1_IN_3 | -S:BLIND | CONF | SCARE | BR_FIRE +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:DEMON +F:DROP_2D2 +F:EVIL +F:HAS_LITE +F:IM_ELEC +F:IM_FIRE +F:KILL_WALL +F:MOVE_BODY +F:NONLIVING +F:ONLY_ITEM +F:OPEN_DOOR +F:POWERFUL +F:SPIRIT +S:1_IN_3 +S:BLIND +S:BR_FIRE +S:CONF +S:SCARE D:Carrying a whip of fire, this spirit looks not dissimilar to a certain D:Balrog. @@ -18781,11 +32167,27 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EXP_80:20d8 B:TOUCH:EXP_40:20d8 -F:SPIRIT | BASEANGBAND | REFLECTING | REGENERATE | -F:IM_ACID | IM_ELEC | IM_COLD | IM_FIRE | IM_POIS | RES_TELE | -F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL -S:1_IN_3 | -S:BLIND | HEAL | BA_DARK | HASTE | CONF +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_FIRE +F:IM_POIS +F:OPEN_DOOR +F:POWERFUL +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SMART +F:SPIRIT +F:TAKE_ITEM +S:1_IN_3 +S:BA_DARK +S:BLIND +S:CONF +S:HASTE +S:HEAL D:Deriving his strength from the shadows, this spirit D:steals only for the challenge. @@ -18800,14 +32202,36 @@ B:HIT:HURT:10d9 B:HIT:HURT:9d9 B:BITE:EXP_80:9d9 B:BITE:EXP_80:9d9 -F:SPIRIT | FORCE_SLEEP | CAN_FLY | -F:DROP_60 | DROP_4D2 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | SPIRIT -S:1_IN_3 | -S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA | -S:BRAIN_SMASH | DARKNESS | BO_NETH +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:REGENERATE +F:RES_TELE +F:SPIRIT +F:SPIRIT +F:UNDEAD +S:1_IN_3 +S:BLIND +S:BO_NETH +S:BRAIN_SMASH +S:CAUSE_3 +S:CAUSE_4 +S:DARKNESS +S:DRAIN_MANA +S:HOLD +S:SCARE D:Your blood curdles and your bones chill as this spirit approaches. # Spirit of unresistability (hehehehe) @@ -18821,13 +32245,29 @@ B:HIT:SHATTER:18d10 B:HIT:SHATTER:18d10 B:HIT:LOSE_ALL:8d8 B:TOUCH:UN_POWER -F:BASEANGBAND | SPIRIT | SMART | -F:OPEN_DOOR | BASH_DOOR | POWERFUL | -F:RES_NEXU | RES_NETH | -F:NO_CONF | NO_SLEEP | NO_FEAR | -F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD | -S:1_IN_2 | -S:BA_MANA | BR_PLAS | BR_TIME | ROCKET | HAND_DOOM | FORGET | BA_WATE +F:BASEANGBAND +F:BASH_DOOR +F:IM_ACID +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:OPEN_DOOR +F:POWERFUL +F:RES_NETH +F:RES_NEXU +F:SMART +F:SPIRIT +S:1_IN_2 +S:BA_MANA +S:BA_WATE +S:BR_PLAS +S:BR_TIME +S:FORGET +S:HAND_DOOM +S:ROCKET D:This spirit appears to be afraid of very little, and confident in its D:ability to destroy you. @@ -18842,11 +32282,20 @@ B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 -F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE | -F:ANIMAL | NO_CONF | NO_SLEEP | -F:SPIRIT | BASEANGBAND -S:1_IN_2 | -S:BR_TIME | SLOW | HASTE | HOLD +F:ANIMAL +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SPIRIT +S:1_IN_2 +S:BR_TIME +S:HASTE +S:HOLD +S:SLOW D:All at once you see that which is to come and that which has gone before. # Spirit of Gold @@ -18860,12 +32309,29 @@ B:TOUCH:EAT_GOLD:7d15 B:TOUCH:EAT_GOLD:7d15 B:HIT:POISON:6d12 B:HIT:POISON:6d12 -F:ONLY_GOLD | SPIRIT | BASEANGBAND | -F:DROP_4D2 | DROP_4D2 | DROP_4D2 | REFLECTING | COLD_BLOOD | REGENERATE | -F:BASH_DOOR | MOVE_BODY | IM_ELEC | IM_COLD | IM_POIS | -F:RES_TELE | NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP -S:1_IN_4 | -S:ARROW_4 | HEAL | FORGET +F:BASEANGBAND +F:BASH_DOOR +F:COLD_BLOOD +F:DROP_4D2 +F:DROP_4D2 +F:DROP_4D2 +F:IM_COLD +F:IM_ELEC +F:IM_POIS +F:MOVE_BODY +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:ONLY_GOLD +F:REFLECTING +F:REGENERATE +F:RES_TELE +F:SPIRIT +S:1_IN_4 +S:ARROW_4 +S:FORGET +S:HEAL D:It is the very essence of financial greed... # Spirit of doom @@ -18878,11 +32344,19 @@ O:0:10:90:0 B:HIT:HURT:14d14 B:HIT:HURT:14d14 B:HIT:HURT:14d14 -F:SMART | OPEN_DOOR | BASH_DOOR | -F:EVIL | NO_CONF | NO_SLEEP | -F:SPIRIT | BASEANGBAND | HAS_LITE -S:1_IN_2 | -S:HAND_DOOM | CAUSE_4 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:NO_CONF +F:NO_SLEEP +F:OPEN_DOOR +F:SMART +F:SPIRIT +S:1_IN_2 +S:CAUSE_4 +S:DARKNESS +S:HAND_DOOM D:The very presence of this creature fills the air with an aura of doom. D:You feel waves of depression descending on you as it approaches. @@ -18895,12 +32369,24 @@ E:0:1:0:6:1:0 B:CLAW:HURT:14d10 B:CLAW:HURT:14d10 B:BITE:HURT:17d10 -F:INVISIBLE | CAN_FLY | SPIRIT | WEIRD_MIND | -F:PASS_WALL | POWERFUL | MOVE_BODY | -F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | SPIRIT -S:1_IN_2 | -S:BLIND | CONF | -S:BR_LITE | BR_DARK | BR_CONF +F:BASEANGBAND +F:CAN_FLY +F:EVIL +F:INVISIBLE +F:MOVE_BODY +F:NO_CONF +F:NO_SLEEP +F:PASS_WALL +F:POWERFUL +F:SPIRIT +F:SPIRIT +F:WEIRD_MIND +S:1_IN_2 +S:BLIND +S:BR_CONF +S:BR_DARK +S:BR_LITE +S:CONF D:This sprit seems to flicker in and out of this plane, and is a master D:of light and dark. @@ -18914,9 +32400,16 @@ O:10:90:0:0 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:OPEN_DOOR | BASH_DOOR | -F:EVIL | ORC | IM_POIS | ONLY_ITEM | -F:MORTAL | BASEANGBAND | HAS_LITE | SPIRIT +F:BASEANGBAND +F:BASH_DOOR +F:EVIL +F:HAS_LITE +F:IM_POIS +F:MORTAL +F:ONLY_ITEM +F:OPEN_DOOR +F:ORC +F:SPIRIT D:Stupid but strong, this spirit has an orcish aura about him. ### Here endeth the Spirits ### @@ -18932,23 +32425,42 @@ O:0:5:90:5 # Sorceror, not warrior B:HIT:HURT:1d1 B:HIT:HURT:1d1 -F:OPEN_DOOR | SMART | MALE | DROP_SKELETON | DROP_CORPSE -F:MORTAL | HAS_LITE | JOKEANGBAND | UNIQUE +F:DROP_CORPSE +F:DROP_SKELETON +F:HAS_LITE +F:JOKEANGBAND +F:MALE +F:MORTAL +F:OPEN_DOOR +F:SMART +F:UNIQUE # Trone, of course -F:CAN_FLY | REFLECTING | IM_FIRE +F:CAN_FLY +F:IM_FIRE +F:REFLECTING # Thorin -F:IM_ACID | FORCE_MAXHP +F:FORCE_MAXHP +F:IM_ACID # No cold or random gen... waiting on elven rings only at bottom of Erebor F:SPECIAL_GENE # Dig F:KILL_WALL # Obvious resistances -F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR +F:NO_CONF +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN # Well, he's been there a while -F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT +F:DROP_4D2 +F:DROP_GOOD +F:DROP_GREAT +F:ONLY_ITEM # Essence of speed, Manathrust, Noxious Cloud, and Fireflash -S:1_IN_1 | -S:HASTE | BO_MANA | BA_POIS | BA_FIRE +S:1_IN_1 +S:BA_FIRE +S:BA_POIS +S:BO_MANA +S:HASTE D:He looks like he is looking for something, and the flecks of dragon D:blood on his face tell you he means business! @@ -18963,12 +32475,27 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:POISON:1d8 B:TOUCH:EXP_40 -F:FORCE_SLEEP | FRIENDS | DROP_60 | -F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY | -F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | -F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT -S:1_IN_8 | -S:HOLD | SCARE | CAUSE_3 | DARKNESS +F:BASEANGBAND +F:BASH_DOOR +F:CAN_FLY +F:COLD_BLOOD +F:DROP_60 +F:EVIL +F:FORCE_SLEEP +F:FRIENDS +F:HURT_LITE +F:IM_COLD +F:IM_POIS +F:NO_CONF +F:NO_CUT +F:NO_SLEEP +F:OPEN_DOOR +F:UNDEAD +S:1_IN_8 +S:CAUSE_3 +S:DARKNESS +S:HOLD +S:SCARE D:An evil spirit from the marshlands, related to the mewlips. N:1078:Knight of the Swan @@ -18982,10 +32509,22 @@ B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:MALE | FRIENDS | OPEN_DOOR | BASH_DOOR | -F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET | -F:IM_ACID | IM_COLD | RES_WATE | RES_NETH | -F:MORTAL | BASEANGBAND | HAS_LITE +F:BASEANGBAND +F:BASH_DOOR +F:DROP_CORPSE +F:DROP_SKELETON +F:FRIENDS +F:GOOD +F:HAS_LITE +F:IM_ACID +F:IM_COLD +F:MALE +F:MORTAL +F:OPEN_DOOR +F:PET +F:RES_NETH +F:RES_WATE +F:SMART D:A stately man dressed in armour emblazoned with a picture of a beautiful D:white swan, from Dol Amroth of old. @@ -19001,9 +32540,24 @@ B:EXPLODE:HURT:20d20 B:EXPLODE:HURT:20d20 B:EXPLODE:HURT:20d20 B:EXPLODE:HURT:20d20 -F:FORCE_MAXHP | NEVER_MOVE | IM_FIRE | IM_POIS | BASEANGBAND -F:NO_FEAR | NO_STUN | NO_CUT | NO_SLEEP | NO_CONF | RES_TELE -F:RES_NETH | AURA_FIRE | STUPID | EMPTY_MIND | NONLIVING -F:SPECIAL_GENE | FORCE_DEPTH | SUSCEP_COLD +F:AURA_FIRE +F:BASEANGBAND +F:EMPTY_MIND +F:FORCE_DEPTH +F:FORCE_MAXHP +F:IM_FIRE +F:IM_POIS +F:NEVER_MOVE +F:NONLIVING +F:NO_CONF +F:NO_CUT +F:NO_FEAR +F:NO_SLEEP +F:NO_STUN +F:RES_NETH +F:RES_TELE +F:SPECIAL_GENE +F:STUPID +F:SUSCEP_COLD D:An ensorcelled machine of Saruman's creation, this gnarled D:totem of blackened steel defends Orthanc from intruders. diff --git a/lib/mods/theme/edit/ra_info.txt b/lib/mods/theme/edit/ra_info.txt index 2220a4f0..bbf28db3 100644 --- a/lib/mods/theme/edit/ra_info.txt +++ b/lib/mods/theme/edit/ra_info.txt @@ -1529,14 +1529,16 @@ X:20:1 T:35:0:255 W:10:1:17 C:0:0:0:0 -F:SH_FIRE | RES_FIRE +F:RES_FIRE +F:SH_FIRE N:338 X:22:1 T:35:0:255 W:10:1:20 C:0:0:0:0 -F:SH_ELEC | RES_ELEC +F:RES_ELEC +F:SH_ELEC N:339 X:18:1 @@ -1949,7 +1951,8 @@ T:40:0:255 T:45:0:255 W:5:1:15 C:0:0:0:0 -F:SPELL_CONTAIN | WIELD_CAST +F:SPELL_CONTAIN +F:WIELD_CAST # High-level soft and hard armour and DSM can get nether immunity - Theme, adapted from FuryMod N:516 @@ -1978,4 +1981,4 @@ F:LEVELS # T:tval:min sval:max sval (up to 20 T: lines) # W:mininum player level to create it:rarity1:rarity2 # C:max to dam:max to hit:max to AC:max to pval -# F:flags \ No newline at end of file +# F:flags diff --git a/lib/mods/theme/edit/re_info.txt b/lib/mods/theme/edit/re_info.txt index c1fb01c8..2b111067 100644 --- a/lib/mods/theme/edit/re_info.txt +++ b/lib/mods/theme/edit/re_info.txt @@ -33,11 +33,35 @@ G:s:* I:%100:+1d+1:+0:+5:-5 W:+5:13:%30:%95:B F:DROP_SKELETON -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:DROP_SKELETON | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF | -M:NO_SLEEP | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL -O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART | -O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:DROP_SKELETON +M:EMPTY_MIND +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:STUPID +M:UNDEAD +O:DROP_CORPSE +O:DROP_GOOD +O:DROP_GREAT +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +O:SMART T:MF_ALL N:2:Zombie @@ -45,11 +69,36 @@ G:z:* I:%95:%110d%100:%90:+10:-5 W:+10:14:%70:%100:B F:DROP_CORPSE -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:DROP_CORPSE | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | EVIL | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL -O:GOOD | DROP_SKELETON | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART -O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:DROP_CORPSE +M:EMPTY_MIND +M:EVIL +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:STUPID +M:UNDEAD +O:DROP_GOOD +O:DROP_GREAT +O:DROP_SKELETON +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +O:SMART T:MF_ALL N:3:Lich @@ -60,15 +109,49 @@ B:TOUCH:LOSE_DEX:+0d+0 B:TOUCH:LOSE_DEX:+0d+0 B:TOUCH:UN_POWER:+0d+0 B:TOUCH:EXP_40:+0d+0 -F:DROP_SKELETON | SMART | R_CHAR_h | R_CHAR_p | R_CHAR_P | R_CHAR_O -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | SMART | EVIL | COLD_BLOOD -O:DROP_SKELETON | GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | -O:DROP_GREAT | RAND_25 | RAND_50 | MORTAL -S:1_IN_4 | -S:BLINK | TELE_TO | TELE_AWAY | BRAIN_SMASH | DRAIN_MANA | CAUSE_3 | -S:BLIND | HOLD | SLOW | SCARE +F:DROP_SKELETON +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_h +F:R_CHAR_p +F:SMART +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:SMART +M:UNDEAD +O:DROP_CORPSE +O:DROP_GREAT +O:DROP_SKELETON +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_25 +O:RAND_50 +S:1_IN_4 +S:BLIND +S:BLINK +S:BRAIN_SMASH +S:CAUSE_3 +S:DRAIN_MANA +S:HOLD +S:SCARE +S:SLOW +S:TELE_AWAY +S:TELE_TO N:4:Spectral G:G:* @@ -77,12 +160,35 @@ W:+20:20:%10:%110:B B:*:EXP_20:+0d+0 B:*:EXP_20:+0d+0 F:DROP_CORPSE -H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g -M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF -M:NO_SLEEP | PASS_WALL | EVIL | COLD_BLOOD -O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | -O:DROP_GREAT | EMPTY_MIND | RAND_50 | MORTAL -S:1_IN_5 | BLIND | HOLD | SCARE +H:NONLIVING +H:R_CHAR_A +H:R_CHAR_E +H:R_CHAR_Z +H:R_CHAR_g +H:UNDEAD +M:COLD_BLOOD +M:EVIL +M:IM_COLD +M:IM_POIS +M:NO_CONF +M:NO_FEAR +M:NO_SLEEP +M:PASS_WALL +M:UNDEAD +O:DROP_CORPSE +O:DROP_GREAT +O:EMPTY_MIND +O:ESCORT +O:ESCORTS +O:FRIEND +O:FRIENDS +O:GOOD +O:MORTAL +O:RAND_50 +S:1_IN_5 +S:BLIND +S:HOLD +S:SCARE T:MF_ALL N:5:Captain @@ -93,8 +199,14 @@ B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 -F:R_CHAR_o | R_CHAR_y | R_CHAR_k | BASEANGBAND -M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART N:6:Chieftain G:*:* @@ -104,25 +216,52 @@ B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 -F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND -M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_T +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART N:7:Shaman G:*:r I:+0:%90d%100:+10:%90:+0 W:+2:1:%90:%120:A -F:R_CHAR_o | R_CHAR_k | R_CHAR_n | BASEANGBAND -M:SMART | FORCE_MAXHP | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_k +F:R_CHAR_n +F:R_CHAR_o +M:DROP_1D2 +M:FORCE_MAXHP +M:SMART O:FRIENDS -S:1_IN_6 | MISSILE | CAUSE_1 | CONF | BLINK +S:1_IN_6 +S:BLINK +S:CAUSE_1 +S:CONF +S:MISSILE N:8:Priest G:*:G I:+0:%90d%100:+10:%90:+0 W:+3:2:%90:%120:A -F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND -M:FRIENDS | SMART | FORCE_MAXHP | DROP_1D2 -S:1_IN_6 | CAUSE_2 | MISSILE | DARKNESS | CONF | SCARE | BLINK +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_P +F:R_CHAR_T +M:DROP_1D2 +M:FORCE_MAXHP +M:FRIENDS +M:SMART +S:1_IN_6 +S:BLINK +S:CAUSE_2 +S:CONF +S:DARKNESS +S:MISSILE +S:SCARE N:9:Mage G:*:r @@ -132,24 +271,41 @@ B:*:*:+0d+0 B:*:*:+0d+0 B:HIT:HURT:=2d=8 B:HIT:HURT:=2d=8 -F:R_CHAR_O | BASEANGBAND -M:SMART | FORCE_MAXHP | DROP_1D2 +F:BASEANGBAND +F:R_CHAR_O +M:DROP_1D2 +M:FORCE_MAXHP +M:SMART O:FRIENDS -S:1_IN_6 | BA_COLD | BO_FIRE | TRAPS | HEAL | HOLD | S_MONSTER | TPORT +S:1_IN_6 +S:BA_COLD +S:BO_FIRE +S:HEAL +S:HOLD +S:S_MONSTER +S:TPORT +S:TRAPS N:10:Archer G:*:W I:+0:+0d+0:+0:+0:+0 W:+1:1:%100:%110:A -F:R_CHAR_y | R_CHAR_k | R_CHAR_O | R_CHAR_o | BASEANGBAND -S:1_IN_4 | ARROW_2 +F:BASEANGBAND +F:R_CHAR_O +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y +S:1_IN_4 +S:ARROW_2 N:11:Rogue G:*:b I:+2:+0d+0:+0:+10:-30 W:+1:2:%90:%100:A B:*:EAT_GOLD:+0d+0 -F:R_CHAR_y | R_CHAR_k | R_CHAR_o +F:R_CHAR_k +F:R_CHAR_o +F:R_CHAR_y # For townpeople N:12:Elven diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt index 46c5cd9b..b3d8e485 100644 --- a/lib/mods/theme/edit/s_info.txt +++ b/lib/mods/theme/edit/s_info.txt @@ -261,7 +261,8 @@ G:70 N:47:Bearform-combat D:Ability to fight in bear form I:1000 -F:HIDDEN | AUTO_HIDE +F:AUTO_HIDE +F:HIDDEN N:52:Critical-hits D:Ability to deal critical hits with swords < 5lb diff --git a/lib/mods/theme/edit/set_info.txt b/lib/mods/theme/edit/set_info.txt index d36ce59c..716bf66d 100644 --- a/lib/mods/theme/edit/set_info.txt +++ b/lib/mods/theme/edit/set_info.txt @@ -18,10 +18,13 @@ N:0:Elven Gifts D:It is one of two Elven items once entrusted to Hobbits. # Phial of Galadriel P:1:2:1 -F:WIS | CHR | RES_DARK +F:CHR +F:RES_DARK +F:WIS # Sting P:88:2:2 -F:STEALTH | REGEN +F:REGEN +F:STEALTH # The Dragon Slayer @@ -30,7 +33,9 @@ N:1:Dragon Slayer D:It is one of two items rumoured to be the bane of dragons. # Bow of bard P:125:2:3 -F:DEX | CON | RES_FIRE +F:CON +F:DEX +F:RES_FIRE # Arrow of Bard P:63:2:5 F:SPEED @@ -42,13 +47,21 @@ N:2:The Trinity D:It is one of the 3 legendary daggers. # Dagger of Samwise P:66:3:1 -F:STR | KILL_DRAGON | REGEN | SH_FIRE +F:KILL_DRAGON +F:REGEN +F:SH_FIRE +F:STR # Dagger of Peregrin P:67:3:1 -F:KILL_DEMON | IM_COLD | CON +F:CON +F:IM_COLD +F:KILL_DEMON # Dagger of Meriadoc P:68:3:1 -F:KILL_UNDEAD | SH_ELEC | FLY | DEX +F:DEX +F:FLY +F:KILL_UNDEAD +F:SH_ELEC # Gothmog's Armoury -- Demonologists' set @@ -58,13 +71,20 @@ D:It is one of three items that once belonged to Gothmog, D:the High Captain of the Balrogs. # The demonblade of Gothmog P:181:3:7 -F:STR | CON | SPEED | VAMPIRIC +F:CON +F:SPEED +F:STR +F:VAMPIRIC # The demonshield of Gothmog P:182:3:0 -F:IM_FIRE | IM_COLD | SH_ELEC +F:IM_COLD +F:IM_FIRE +F:SH_ELEC # The demonhorn of Gothmog P:183:3:0 -F:ESP_EVIL | ESP_GOOD | AUTO_ID +F:AUTO_ID +F:ESP_EVIL +F:ESP_GOOD ### New sets added in Theme ### @@ -75,13 +95,16 @@ D:It is one of three items that once belonged to D:Thorin Oakenshield, King under the Mountain. # The small metal shield of Thorin P:30:3:2 -F:CHR | ESP_TROLL +F:CHR +F:ESP_TROLL # The golden harp of Thorin P:135:3:4 -F:INT | SUST_INT +F:INT +F:SUST_INT # The mithril helm of Thorin P:136:3:4 -F:WIS | SUST_WIS +F:SUST_WIS +F:WIS # Peregrin Took's gear - adapted from T-Plus by Ingeborg S. Norden @@ -90,10 +113,16 @@ D:It is one of two items that once belonged to the hobbit D:hero, Peregrin Took. # Chain Mail of Peregrin Took P:165:2:0 -F:RES_CONF | RES_NEXUS | SUST_STR +F:RES_CONF +F:RES_NEXUS +F:SUST_STR # Elven Cloak of Peregrin Took P:184:2:2 -F:DEX | SUST_DEX | CHR | SUST_CHR | SLOW_DIGEST | +F:CHR +F:DEX +F:SLOW_DIGEST +F:SUST_CHR +F:SUST_DEX # Ghan-buri-Ghan's Garb - suggested by ShinesmanOffWhite in the forums @@ -102,7 +131,8 @@ D:It is one of two items that once belonged to D:the leader of the Druedain. # The Filthy Rag of Ghan-Buri-Ghan P:189:2:0 -F:IM_COLD | IM_ACID +F:IM_ACID +F:IM_COLD # The Cloak of Ghan-buri-Ghan P:190:2:0 F:ESP_ALL @@ -114,7 +144,11 @@ D:It is one of three items belonging to the Kings of D:Gondor. # The Long Sword 'Anduril' P:83:3:0 -F:BRAND_ELEC | KILL_DEMON | KILL_DRAGON | SLAY_UNDEAD | IM_FIRE | +F:BRAND_ELEC +F:IM_FIRE +F:KILL_DEMON +F:KILL_DRAGON +F:SLAY_UNDEAD # The Black Banner of Gondor P:191:3:0 F:LITE3 @@ -128,10 +162,16 @@ N:8:Saruman's Travel Gear D:It is one of three items belonging to the Istari wizard Saruman. # The Mage Staff of Saruman P:192:3:0 -F:REFLECT | FREE_ACT +F:FREE_ACT +F:REFLECT # The Robe of Curunir P:193:3:0 -F:RES_FIRE | RES_ACID | RES_POIS | RES_DARK | RES_BLIND | RES_SOUND | +F:RES_ACID +F:RES_BLIND +F:RES_DARK +F:RES_FIRE +F:RES_POIS +F:RES_SOUND # The Palantir of Orthanc P:202:3:0 F:AUTO_ID @@ -142,13 +182,21 @@ N:9:Elendil's Heirlooms D:It is one of three items belonging to the House of Elendil. # The Ring of Barahir P:8:3:0 -F:RES_LITE | RES_BLIND | +F:RES_BLIND +F:RES_LITE # The Star of Elendil P:2:3:1 -F:STR | INT | WIS | DEX | CON | CHR | LUCK | +F:CHR +F:CON +F:DEX +F:INT +F:LUCK +F:STR +F:WIS # The Rod of Annuminas P:199:3:0 -F:RES_FEAR | ESP_EVIL +F:ESP_EVIL +F:RES_FEAR # Flame of Wrath - from Oangband @@ -156,10 +204,14 @@ N:10:Flame of Wrath D:It is one of two items infused with holy fire. # The Amulet of Annatar P:4:2:1 -F:WIS | IM_FIRE | RES_FEAR +F:IM_FIRE +F:RES_FEAR +F:WIS # The Morning Star 'Naurgil' P:115:2:4 -F:STR | SLAY_EVIL | SLAY_UNDEAD +F:SLAY_EVIL +F:SLAY_UNDEAD +F:STR # Light/Dark Set - from Oangband @@ -167,10 +219,12 @@ N:11:Shadow Ward D:It is one of two items rumoured to defy the Shadow. # The Soft Leather Armour 'Hithlomir' P:168:2:2 -F:SEARCH | RES_BLIND +F:RES_BLIND +F:SEARCH # The Set of Leather Gloves 'Cammithrim' P:53:2:2 -F:DEX | SUST_DEX +F:DEX +F:SUST_DEX # Eorl/Rohan Set - from Oangband @@ -182,7 +236,8 @@ P:100:2:1 F:FREE_ACT # The Metal Brigandine Armour of the Rohirrim P:21:2:0 -F:CON | REGEN +F:CON +F:REGEN # Gil-Galad's Set - from Oangband @@ -191,10 +246,13 @@ D:It is one of three pieces of the battle gear of Gil-Galad, D:mighty Elven king of old. # The Shield of Deflection of Gil-Galad P:169:3:0 -F:RES_FIRE | RES_POIS | SUST_CON +F:RES_FIRE +F:RES_POIS +F:SUST_CON # The Spear 'Aiglos' P:97:3:0 -F:SLAY_DEMON | RES_NETHER +F:RES_NETHER +F:SLAY_DEMON # The Mithril Helm of Gil-Galad P:26:3:0 #Why *shouldn't* warrior-types get a chance for AUTO_ID without penalties to luck before they kill Morgy? @@ -207,13 +265,19 @@ N:14:Dwarven Heritage D:It is one of three Dwarven items of legend. # The Arkenstone of Thrain P:3:3:0 -F:SUST_STR | FREE_ACT | SUST_CON +F:FREE_ACT +F:SUST_CON +F:SUST_STR # Mattock of Nain P:174:3:6 F:CON # Lochaber Axe of the Dwarves P:105:3:0 -F:IM_ACID | RES_SHARDS | SUST_DEX | SUST_WIS | REFLECT +F:IM_ACID +F:REFLECT +F:RES_SHARDS +F:SUST_DEX +F:SUST_WIS # Woodland Realm (bow of Legolas, staff of Thranduil, cap of Thranduil) @@ -221,10 +285,13 @@ N:15:Woodland Realm D:It is one of three items belonging to the Wood-elves of Mirkwood. # The Hard Leather Cap of Thranduil P:36:3:1 -F:SUST_INT | SUST_WIS | SPEED +F:SPEED +F:SUST_INT +F:SUST_WIS # The Long Bow of Legolas P:224:3:2 -F:SUST_DEX | SPEED +F:SPEED +F:SUST_DEX # The Quarterstaff of Thranduil P:74:3:0 # What can I say. I love archers. :P @@ -236,10 +303,14 @@ N:16:Gimli's Gear D:It is one of three items belonging to Gimli the dwarf. # The Small Metal Shield of Gimli P:132:3:0 -F:SUST_STR | SUST_CON | SUST_INT +F:SUST_CON +F:SUST_INT +F:SUST_STR # The Bearded Axe of Gimli P:133:3:0 -F:SLAY_EVIL | SLAY_GIANT | BRAND_FIRE +F:BRAND_FIRE +F:SLAY_EVIL +F:SLAY_GIANT # The Pair of Metal Shod Boots of Gimli P:180:3:5 F:LUCK diff --git a/lib/mods/theme/edit/st_info.txt b/lib/mods/theme/edit/st_info.txt index 585dc657..512258ca 100644 --- a/lib/mods/theme/edit/st_info.txt +++ b/lib/mods/theme/edit/st_info.txt @@ -247,7 +247,8 @@ N:6:Black Market A:30:0:1:2:3:4 O:25:26:27:28 G:7:D -F:ALL_ITEM | MEDIUM_LEVEL +F:ALL_ITEM +F:MEDIUM_LEVEL W:24 N:7:Home @@ -583,7 +584,8 @@ T:100:24:256 A:0:0:1:2:3:4 O:118:119:120:121 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:39:Hafted Smith @@ -591,7 +593,8 @@ T:100:21:256 A:0:0:1:2:3:4 O:122:123:124:125 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:40:Polearm Smith @@ -599,7 +602,8 @@ T:100:22:256 A:0:0:1:2:3:4 O:126:127:128:129 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:41:Sword Smith @@ -607,7 +611,8 @@ T:100:23:256 A:0:0:1:2:3:4 O:130:131:132:133 G:3:w -F:RANDOM | MEDIUM_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:42:Rare Jewelry Shop @@ -616,7 +621,10 @@ T:100:45:256 A:0:0:1:2:3:4 O:134:135:136:137 G:6:v -F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL | FORCE_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:FORCE_LEVEL +F:RANDOM F:VERY_RARE W:10 @@ -626,7 +634,10 @@ T:100:45:256 A:0:0:1:2:3:4 O:138:139:140:141 G:6:y -F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL | FORCE_LEVEL +F:DEPEND_LEVEL +F:FORCE_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:RARE W:20 @@ -635,8 +646,9 @@ T:100:30:256 A:0:0:1:2:3:4 O:142:143:144:145 G:2:r -F:RANDOM | MEDIUM_LEVEL F:COMMON +F:MEDIUM_LEVEL +F:RANDOM W:12 N:45:Rare Footwear Shop @@ -644,7 +656,9 @@ T:100:30:256 A:0:0:1:2:3:4 O:146:147:148:149 G:2:r -F:RANDOM | DEEP_LEVEL | MEDIUM_LEVEL +F:DEEP_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:VERY_RARE W:8 @@ -668,7 +682,9 @@ T:100:125:256 A:27:0:1:2:3:4 O:150:151:152:153 G:9:y -F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:24 N:47:Forbidden Library @@ -691,7 +707,9 @@ T:100:125:256 A:27:0:1:2:3:4 O:150:151:152:153 G:9:v -F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:RANDOM F:RARE W:12 @@ -699,7 +717,11 @@ N:48:Expensive Black Market A:0:0:1:2:3:4 O:154:155:156:157 G:7:v -F:RANDOM | ALL_ITEM | DEEP_LEVEL | DEPEND_LEVEL | MEDIUM_LEVEL +F:ALL_ITEM +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:49:Common Shop @@ -727,7 +749,9 @@ T:100:38:256 A:0:0:1:2:3:4 O:162:163:164:165 G:2:v -F:RANDOM | DEEP_LEVEL | DEPEND_LEVEL +F:DEEP_LEVEL +F:DEPEND_LEVEL +F:RANDOM F:VERY_RARE W:12 @@ -736,7 +760,9 @@ T:100:45:31 A:0:0:1:2:3:4 O:166:167:168:169 G:6:G -F:RANDOM | SHALLOW_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:RANDOM +F:SHALLOW_LEVEL F:VERY_RARE W:6 @@ -745,7 +771,9 @@ T:100:70:256 A:0:0:1:2:3:4 O:170:171:172:173 G:5:B -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:53:Potion Store @@ -754,7 +782,9 @@ T:100:72:256 A:0:0:1:2:3:4 O:174:175:176:177 G:5:B -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM W:12 N:54:Recaller @@ -762,7 +792,8 @@ I:100:Word of Recall A:33:0:1:2:3:0 O:82:83:84:85 G:+:b -F:RANDOM | COMMON +F:COMMON +F:RANDOM W:2 N:55:Master Archer @@ -777,7 +808,9 @@ T:50:18:256 A:0:0:1:2:3:4 O:178:179:180:181 G:3:g -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM F:RARE W:24 @@ -918,7 +951,9 @@ T:25:67:160 T:5:67:200 A:0:0:1:2:3:4 O:198:199:200:201 -F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL +F:DEPEND_LEVEL +F:MEDIUM_LEVEL +F:RANDOM G:6:b W:12 @@ -1136,4 +1171,4 @@ N:88:Forge A:23:24:25:32:64:0 O:43:43:43:43 G:+:y -W:0 \ No newline at end of file +W:0 diff --git a/lib/mods/theme/edit/tr_info.txt b/lib/mods/theme/edit/tr_info.txt index 7a5eb3b7..aa3cdc3f 100644 --- a/lib/mods/theme/edit/tr_info.txt +++ b/lib/mods/theme/edit/tr_info.txt @@ -42,92 +42,128 @@ N:1:Weakness Trap I:2:100:5:5:2:0d0:b D:A poisoned needle weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:2:Weakness Trap I:5:100:5:5:20:0d0:b D:A poisoned needle seriously weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:3:Weakness Trap I:7:100:5:8:40:0d0:b D:A poisoned needle permanently weakens you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:4:Intelligence Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:5:Intelligence Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:6:Intelligence Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently stupid! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:7:Wisdom Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:8:Wisdom Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:9:Wisdom Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently naive! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:10:Fumbling Fingers Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:11:Fumbling Fingers Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:12:Fumbling Fingers Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently clumsy! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:13:Wasting Trap I:2:100:5:2:2:0d0:b D:A poisoned needle makes you feel sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:14:Wasting Trap I:5:100:5:5:20:0d0:b D:A poisoned needle makes you feel very sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:15:Wasting Trap I:7:100:5:8:40:0d0:b D:A poisoned needle makes you feel permanently sickly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:16:Beauty Trap I:2:100:5:2:2:0d0:b D:A poisoned needle scars you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:17:Beauty Trap I:5:100:5:5:20:0d0:b D:A poisoned needle scars you horribly! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:18:Beauty Trap I:7:100:5:8:40:0d0:b D:A poisoned needle scars you permanently! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # miscellaneous traps @@ -136,177 +172,244 @@ F:FLOOR | CHEST | DOOR N:20:Trap of Curse Weapon I:5:10:0:12:20:0d0:y D:Your weapon will never be the same... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:21:Trap of Curse Armour I:5:15:0:12:20:0d0:y D:Your armour doesn't exactly get better by setting off this trap... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:22:Earthquake Trap I:5:20:0:10:10:0d0:o D:The ceiling collapses around you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:23:Poison Needle Trap I:1:50:50:3:2:0d0:r D:A poisoned needle pricks you! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:24:Summon Monster Trap I:2:50:40:4:2:0d0:v D:Monsters defend the memory of the owner... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:25:Summon Undead Trap I:4:25:40:6:10:0d0:v D:Undead rise from the grave to defend this! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:26:Summon Greater Undead Trap I:8:10:50:20:20:0d0:v D:Greater undead defend this! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:27:Teleport Trap I:3:100:50:3:2:0d0:w D:Now you know why nobody ever got close enough to disarm this trap... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:28:Paralysing Trap I:1:100:20:2:2:0d0:r D:You suddenly cannot move! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:29:Explosive Device I:3:100:80:0:3:3d8:r D:Ha! It explodes before your hands can illegally touch it! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:30:Teleport Item Trap I:3:50:50:3:5:0d0:w D:The item magically disappears from your greedy hands! -F:FLOOR | CHEST +F:CHEST +F:FLOOR N:31:Lose Memory Trap I:6:30:30:6:10:0d0:r D:You suddenly can't remember what you were doing here... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:32:Bitter Regret Trap I:9:15:20:9:20:0d0:r D:You already regret trying this... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:33:Bowel Cramps Trap I:1:90:20:1:6:0d0:r D:Your stomach twists with a sharp pang! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:34:Blindness/Confusion Trap I:4:100:50:4:6:0d0:r D:You suddenly can't see, and thinking is difficult too.... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:35:Aggravation Trap I:2:100:50:2:3:0d0:o D:Your hear a high-pitched humming noise... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:36:Multiplication Trap I:3:90:0:3:5:0d0:o D:The floor around you doesn't seem the same... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:37:Steal Item Trap I:3:100:50:3:6:0d0:y D:The chest seems to swell, while your backpack feels lighter.. -F:FLOOR | CHEST +F:CHEST +F:FLOOR N:38:Summon Fast Quylthulgs Trap I:8:50:10:10:25:0d0:v D:Parts of the owner seem to return from somewhere else, as you slow in awe. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:39:Trap of Sinking I:2:50:0:0:3:0d0:w D:A trapdoor opens up under you! -F:FLOOR | DOOR +F:DOOR +F:FLOOR N:40:Trap of Mana Drain I:4:100:50:3:4:0d0:r D:You suddenly can't think so clearly any more... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:41:Trap of Missing Money I:2:100:50:2:2:0d0:y D:Money isn't everything, they say... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:42:Trap of No Return I:5:20:10:4:8:0d0:y D:Do stay a while! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:43:Trap of Silent Switching I:4:100:50:3:6:0d0:y D:You suddenly are a different person! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:44:Trap of Walls I:6:100:50:2:10:0d0:o D:The room seems to shrink! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:45:Trap of Calling Out I:10:100:100:5:15:0d0:v D:You hear something coming closer, much closer. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:46:Trap of Sliding I:8:50:50:4:8:0d0:r D:Your feet seem to have a life of their own! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:47:Trap of Charges Drain I:6:100:70:2:3:0d0:y D:You feel as if you've just lost something... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:48:Trap of Stair Movement I:6:100:50:3:4:0d0:o D:The dungeon seems different... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:49:Trap of New Trap I:5:100:5:0:4:0d0:o D:Somehow, disarming isn't over, you feel... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:50:Trap of Scatter Items I:10:50:50:6:12:0d0:w D:You hear crashing sounds from all over the dungeon! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:51:Trap of Decay I:4:100:50:4:4:0d0:r D:Your stomach isn't empty, but suddenly you think of food. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:52:Trap of Wasting Wands I:6:100:40:4:5:0d0:y D:Your wands seem different... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:53:Trap of Filling I:10:100:0:10:25:0d0:o D:The whole room vibrates in a strange way... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:54:Trap of Drain Speed I:8:50:10:25:80:0d0:y D:You suddenly seem to have more time to self-reflect... -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # bolt traps @@ -315,112 +418,178 @@ F:FLOOR | CHEST | DOOR N:60:Lightning Bolt Trap I:2:80:5:3:2:2d8:g D:You are jolted with electricity! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:61:Poison Bolt Trap I:2:80:5:3:2:2d8:g D:A blast of poison gas hits you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:62:Acid Bolt Trap I:2:80:5:3:2:2d8:g D:A jet of acid shoots out at you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:63:Cold Bolt Trap I:2:80:5:3:2:2d8:g D:You are suddenly very cold! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:64:Fire Bolt Trap I:2:80:5:3:2:2d8:g D:You are suddenly very hot! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:65:Plasma Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of plasma hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:66:Water Bolt Trap I:4:80:5:5:8:5d10:g D:A gush of water hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:67:Light Bolt Trap I:4:80:5:5:8:5d10:g D:There is a sudden flash of light around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:68:Dark Bolt Trap I:4:80:5:5:8:5d10:g D:A bolt of pure elemental darkness hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:69:Shards Bolt Trap I:6:80:5:6:15:6d10:g D:A blast of crystal shards hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:70:Sound Bolt Trap I:6:80:5:6:15:10d12:g D:A sudden roar of sound hurts your eardrums! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:71:Confusion Bolt Trap I:4:80:5:5:8:6d10:g D:A blast of confusion gas engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:72:Force Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of pure force hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:73:Inertia Bolt Trap I:6:80:5:6:15:10d12:g D:Your feet feel like lead! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:74:Mana Bolt Trap I:8:80:5:9:25:15d16:g D:A bolt of pure magic hits you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:75:Ice Bolt Trap I:4:80:5:5:8:5d10:g D:A bolt of ice hits you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:76:Chaos Bolt Trap I:6:80:5:6:15:10d12:g D:A blast of raw chaos hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:77:Nether Bolt Trap I:8:80:5:9:25:15d16:g D:A bolt of negative energy hits you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:78:Disenchantment Bolt Trap I:8:80:5:9:25:15d16:g D:There is a static feeling in the air... -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:79:Nexus Bolt Trap I:6:80:5:6:15:10d12:g D:A bolt of nexus hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:80:Time Bolt Trap I:8:80:5:9:25:15d16:g D:Suddenly, several months pass by in a second! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:81:Gravity Bolt Trap I:6:80:5:6:15:10d12:g D:Gravity suddenly warps around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # # ball traps @@ -429,92 +598,146 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:82:Lightning Ball Trap I:3:60:5:5:8:3d10:B D:A massive electrical charge shoots through you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:83:Poison Ball Trap I:3:60:5:5:8:3d10:B D:A large cloud of poison gas envelops you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:84:Acid Ball Trap I:3:60:5:5:8:3d10:B D:You are suddenly drenched in acid! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:85:Cold Ball Trap I:3:60:5:5:8:3d10:B D:A blast of hideously cold air envelops you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:86:Fire Ball Trap I:3:60:5:5:8:3d10:B D:You are suddenly in the centre of a raging inferno! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:87:Plasma Ball Trap I:8:60:5:8:20:12d18:B D:You are engulfed in plasma! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:88:Water Ball Trap I:5:60:5:6:15:8d12:B D:A whirlpool engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:89:Light Ball Trap I:5:60:5:6:15:8d12:B D:A massive flash of light erupts around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:90:Darkness Ball Trap I:5:60:5:6:15:8d12:B D:A large patch of darkness erupts around you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:91:Shards Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of crystal shards hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:92:Sound Ball Trap I:8:60:5:8:20:12d18:B D:BOOM! Your eardrums nearly explode! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:93:Confusion Ball Trap I:5:60:5:6:15:8d12:B D:You are enveloped in a cloud of confusion gas! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:94:Force Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of pure force smashes down around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:95:Inertia Ball Trap I:8:60:5:8:20:12d18:B D:Suddenly, your entire body feels like lead! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:96:Mana Ball Trap I:10:60:5:10:30:16d20:B D:You are hit by a blast of pure magic! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:97:Ice Ball Trap I:5:60:5:6:15:8d12:B D:A massive blast of ice crystals engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL2 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL2 N:98:Chaos Ball Trap I:8:60:5:8:20:12d18:B D:A violent blast of raw chaos engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:99:Nether Ball Trap I:10:60:5:10:30:16d20:g D:A blast of energy from the netherworld engulfs you! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 # N:type:name # I:diff:prob:another:pval:minlevel:color @@ -523,82 +746,118 @@ F:FLOOR | CHEST | DOOR | LEVEL4 N:100:Disenchantment Ball Trap I:10:60:5:10:30:16d20:B D:You are hit by a blast of pure anti-magic! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:101:Nexus Ball Trap I:8:60:5:8:20:12d18:B D:A ball of nexus hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:102:Time Ball Trap I:10:60:5:10:30:16d20:B D:Suddenly, several years pass by in a second! -F:FLOOR | CHEST | DOOR | LEVEL4 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL4 N:103:Gravity Ball Trap I:8:60:5:8:20:12d18:B D:You suddenly feel gravity warp violently around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:110:Arrow Trap I:2:100:0:5:2:0d0:R D:An arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:111:Bolt Trap I:2:100:0:5:5:0d0:R D:A bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:112:Seeker Arrow Trap I:2:100:0:6:10:0d0:R D:A seeker arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:113:Seeker Bolt Trap I:2:100:0:6:12:0d0:R D:A seeker bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:114:Poison Arrow Trap I:2:100:0:5:4:0d0:R D:A poisoned arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:115:Poison Bolt Trap I:2:100:0:6:6:0d0:R D:A poisoned bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:116:Poison Seeker Arrow Trap I:2:100:0:7:12:0d0:R D:A poisoned seeker arrow shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:117:Poison Seeker Bolt Trap I:2:100:0:7:15:0d0:R D:A poisoned seeker bolt shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:118:Broken Dagger Trap I:2:100:0:5:2:0d0:R D:An broken dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:119:Dagger Trap I:2:100:0:5:5:0d0:R D:A dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:120:Poison Broken Dagger Trap I:2:100:0:5:4:0d0:R D:A poisoned broken dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:121:Poison Dagger Trap I:2:100:0:6:6:0d0:R D:A poisoned dagger shoots out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # # multiple arrows/daggers traps @@ -607,98 +866,137 @@ F:FLOOR | CHEST | DOOR N:122:Arrows Trap I:4:100:0:7:16:0d0:R D:Some arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:123:Bolts Trap I:4:100:0:7:18:0d0:R D:Some bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:124:Seeker Arrow Trap I:5:100:0:8:20:0d0:R D:Some seeker arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:125:Seeker Bolt Trap I:5:100:0:8:24:0d0:R D:Some seeker bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:126:Poison Arrows Trap I:5:100:0:8:18:0d0:R D:Some poisoned arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:127:Poison Bolt Trap I:6:100:0:8:20:0d0:R D:Some poisoned bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:128:Poison Seeker Arrows Trap I:7:100:0:9:27:0d0:R D:Some poisoned seeker arrows shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:129:Poison Seeker Bolts Trap I:9:100:0:9:30:0d0:R D:Some poisoned seeker bolts shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:130:Broken Daggers Trap I:4:100:0:6:12:0d0:R D:Some broken daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:131:Dagger Trap I:4:100:0:6:15:0d0:R D:Some daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:132:Poison Broken Daggers Trap I:5:100:0:7:18:0d0:R D:Some poisoned broken daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:133:Poison Daggers Trap I:6:100:0:7:23:0d0:R D:Some poisoned daggers shoot out at you. -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:140:Trap of Drop Item I:3:50:0:2:5:0d0:y D:A sudden sound startles you and you drop something! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:141:Trap of Drop Items I:5:50:0:5:12:0d0:y D:A sudden sound startles you and you drop several things! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:142:Trap of Drop Everything I:8:50:0:8:20:0d0:y D:A sudden sound startles you and you drop everything! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:158:Trap of Divine Anger I:6:100:5:0:15:0d0:G D:A voice booms out "Have a care, mortal!" -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:159:Trap of Divine Wrath I:9:50:5:0:30:0d0:G D:A voice booms out "Sacrilege!" -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR N:160:Hallucination Trap I:3:100:10:0:4:0d0:r D:Your vision is clouded by a blast of kaleidoscopic light! -F:FLOOR | CHEST | DOOR +F:CHEST +F:DOOR +F:FLOOR # Bolt traps N:161:Greater Magic Missile Trap I:6:80:5:6:75:25d20:g D:A greater magic missile hits you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 #N:162:Foulness Trap #I:6:80:5:6:15:10d12:g @@ -713,22 +1011,34 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:164:Trap of Holy Fire I:6:80:5:6:15:10d12:g D:Holy fire rises around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:165:Trap of Hell Fire I:6:80:5:6:15:10d12:g D:Hellfire rises around you! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:166:Psi Bolt Trap I:6:80:5:6:15:10d12:g D:Your mind is suddenly blasted! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 N:167:Psi Drain Trap I:6:80:5:6:15:8d10:r D:You suddenly can't think clearly any more... -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # Ball Traps @@ -743,38 +1053,57 @@ F:FLOOR | CHEST | DOOR | LEVEL3 N:169:Psi Ball Trap I:8:60:5:8:20:12d18:B D:Your brain is suddenly blasted! -F:FLOOR | CHEST | DOOR | LEVEL3 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL3 # Useful traps N:170:Acquirement Trap I:1:40:5:5:18:0d0:v D:Whoa! -F:FLOOR | DOOR +F:DOOR +F:FLOOR # More bolt traps N:171:Greater Lightning Bolt Trap I:3:60:5:3:6:6d6:g D:You are jolted with electricity! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:172:Greater Poison Bolt Trap I:3:60:5:3:6:6d6:g D:A blast of deadly poison gas hits you! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:173:Greater Acid Bolt Trap I:3:60:5:3:6:6d6:g D:A jet of acid shoots out at you! It burns severely! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:174:Greater Cold Bolt Trap I:3:60:5:3:6:6d6:g D:You are suddenly extremely cold! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 N:175:Greater Fire Bolt Trap I:3:60:5:3:6:6d6:g D:You are suddenly extremely hot! -F:FLOOR | CHEST | DOOR | LEVEL1 +F:CHEST +F:DOOR +F:FLOOR +F:LEVEL1 diff --git a/src/init1.cc b/src/init1.cc index 5decdfaa..56b1a3ac 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2034,24 +2034,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'R') && (buf[2] == 'G')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + if (0 != grab_one_player_race_flag(&rp_ptr->flags1, &rp_ptr->flags2, buf + 4)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_player_race_flag(&rp_ptr->flags1, &rp_ptr->flags2, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2061,24 +2046,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'F' for "level Flags" (multiple lines) */ if ((buf[0] == 'R') && (buf[2] == 'F')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + 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)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - 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], s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2116,24 +2086,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'C' for "Class choice flags" (multiple lines) */ if ((buf[0] == 'R') && (buf[2] == 'C')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + if (0 != grab_one_class_flag(rp_ptr->choice, buf + 4)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_class_flag(rp_ptr->choice, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2375,24 +2330,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'S') && (buf[2] == 'G')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + if (0 != grab_one_player_race_flag(&rmp_ptr->flags1, &rmp_ptr->flags2, buf + 4)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_player_race_flag(&rmp_ptr->flags1, &rmp_ptr->flags2, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2402,24 +2342,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'F' for "level Flags" (multiple lines) */ if ((buf[0] == 'S') && (buf[2] == 'F')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + 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)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - 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], s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2457,24 +2382,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'A' for "Allowed races" (multiple lines) */ if ((buf[0] == 'S') && (buf[2] == 'A')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + if (0 != grab_one_race_allow_flag(rmp_ptr->choice, buf + 4)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_race_allow_flag(rmp_ptr->choice, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -2484,32 +2394,23 @@ errr init_player_info_txt(FILE *fp) /* Process 'C' for "Class choice flags" (multiple lines) */ if ((buf[0] == 'S') && (buf[2] == 'C')) { - u32b choice[2] = {0, 0}, z; - - /* Parse every entry */ - for (s = buf + 6; *s; ) + u32b choice[2] = {0, 0}; + if (0 != grab_one_class_flag(choice, buf + 6)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_class_flag(choice, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } - for (z = 0; z < 2; z++) + /* Combine into the class flags */ + for (int z = 0; z < 2; z++) { - if (buf[4] == 'A') rmp_ptr->pclass[z] |= choice[z]; - else rmp_ptr->mclass[z] |= choice[z]; + if (buf[4] == 'A') + { + rmp_ptr->pclass[z] |= choice[z]; + } + else + { + rmp_ptr->mclass[z] |= choice[z]; + } } /* Next... */ @@ -2869,24 +2770,9 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'C') && (buf[2] == 'G')) { - /* Parse every entry */ - for (s = buf + 4; *s; ) + if (0 != grab_one_player_race_flag(&c_ptr->flags1, &c_ptr->flags2, buf + 4)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_player_race_flag(&c_ptr->flags1, &c_ptr->flags2, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -3359,7 +3245,7 @@ errr init_f_info_txt(FILE *fp) { int i; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ feature_type *f_ptr = NULL; @@ -3580,32 +3466,15 @@ errr init_f_info_txt(FILE *fp) /* Hack -- Process 'F' for flags */ if (buf[0] == 'F') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_feature_flag(&f_ptr->flags1, buf + 2)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_feature_flag(&f_ptr->flags1, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ continue; } - - /* Oops */ return (6); } @@ -3945,24 +3814,9 @@ errr init_k_info_txt(FILE *fp) /* Hack -- Process 'F' for flags */ if (buf[0] == 'F') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_kind_flag(k_ptr, buf + 2, FALSE)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_kind_flag(k_ptr, s, FALSE)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -3972,24 +3826,9 @@ errr init_k_info_txt(FILE *fp) /* Hack -- Process 'f' for obvious flags */ if (buf[0] == 'f') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_kind_flag(k_ptr, buf + 2, TRUE)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_kind_flag(k_ptr, s, TRUE)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -4048,7 +3887,7 @@ errr init_a_info_txt(FILE *fp) { int i; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ artifact_type *a_ptr = NULL; @@ -4241,25 +4080,7 @@ errr init_a_info_txt(FILE *fp) /* Hack -- Process 'F' for flags */ if (buf[0] == 'F') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_artifact_flag(a_ptr, s, FALSE)) return (5); - - /* Start the next entry */ - s = t; - } + if (0 != grab_one_artifact_flag(a_ptr, buf+2, FALSE)) return (5); /* Next... */ continue; @@ -4268,25 +4089,7 @@ errr init_a_info_txt(FILE *fp) /* Hack -- Process 'f' for obvious flags */ if (buf[0] == 'f') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_artifact_flag(a_ptr, s, TRUE)) return (5); - - /* Start the next entry */ - s = t; - } + if (0 != grab_one_artifact_flag(a_ptr, buf+2, TRUE)) return (5); /* Next... */ continue; @@ -4323,7 +4126,7 @@ errr init_set_info_txt(FILE *fp) int cur_art = 0, cur_num = 0; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ set_type *set_ptr = NULL; @@ -4456,30 +4259,16 @@ errr init_set_info_txt(FILE *fp) /* Process 'F' for flags */ if (buf[0] == 'F') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + /* 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)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* 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], - s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -4774,27 +4563,10 @@ errr init_s_info_txt(FILE *fp) /* Process 'F' for flags */ if (buf[0] == 'F') { - char *t; - - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_skill_flag(&s_ptr->flags1, buf + 2)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_skill_flag(&(s_ptr->flags1), s)) return (5); - - /* Start the next entry */ - s = t; - } + return (5); + } /* Next... */ continue; @@ -5419,24 +5191,9 @@ errr init_e_info_txt(FILE *fp) /* Hack -- Process 'r:F' for forbidden flags */ if ((buf[0] == 'r') && (buf[2] == 'F')) { - /* Parse every entry textually */ - for (s = buf + 4; *s; ) + if (0 != grab_one_ego_item_flag_restrict(e_ptr, buf + 4, FALSE)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_ego_item_flag_restrict(e_ptr, s, FALSE)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -5563,7 +5320,7 @@ errr init_ra_info_txt(FILE *fp) { int i, cur_t = 0, j, cur_g = 0; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ randart_part_type *ra_ptr = NULL; @@ -5749,24 +5506,9 @@ errr init_ra_info_txt(FILE *fp) /* Hack -- Process 'F' for flags */ if (buf[0] == 'F') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_randart_item_flag(ra_ptr, buf + 2, 'F')) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_randart_item_flag(ra_ptr, s, 'F')) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -5776,24 +5518,9 @@ errr init_ra_info_txt(FILE *fp) /* Hack -- Process 'A' for antagonic flags */ if (buf[0] == 'A') { - /* Parse every entry textually */ - for (s = buf + 2; *s; ) + if (0 != grab_one_randart_item_flag(ra_ptr, buf + 2, 'A')) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_randart_item_flag(ra_ptr, s, 'A')) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -6128,24 +5855,9 @@ errr init_r_info_txt(FILE *fp) /* Process 'F' for "Basic Flags" (multiple lines) */ if (buf[0] == 'F') { - /* Parse every entry */ - for (s = buf + 2; *s; ) + if (0 != grab_one_basic_flag(r_ptr, buf + 2)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_basic_flag(r_ptr, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -6155,37 +5867,22 @@ errr init_r_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - /* Parse every entry */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + s = buf + 2; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } + /* XXX XXX XXX Hack -- Read spell frequency */ + if (1 == sscanf(s, "1_IN_%d", &i)) + { + /* Extract a "frequency" */ + r_ptr->freq_spell = r_ptr->freq_inate = 100 / i; + } - /* XXX XXX XXX Hack -- Read spell frequency */ - if (1 == sscanf(s, "1_IN_%d", &i)) + /* Parse this entry */ + else + { + if (0 != grab_one_spell_flag(r_ptr, s)) { - /* Extract a "frequency" */ - r_ptr->freq_spell = r_ptr->freq_inate = 100 / i; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_spell_flag(r_ptr, s)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -6533,39 +6230,24 @@ errr init_re_info_txt(FILE *fp) char r_char; /* Parse every entry */ - for (s = buf + 2; *s; ) + s = buf + 2; + + /* XXX XXX XXX Hack -- Read monster symbols */ + if (1 == sscanf(s, "R_CHAR_%c", &r_char)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + /* Limited to 5 races */ + if (r_char_number >= 5) continue; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } + /* Extract a "frequency" */ + re_ptr->r_char[r_char_number++] = r_char; + } - /* XXX XXX XXX Hack -- Read monster symbols */ - if (1 == sscanf(s, "R_CHAR_%c", &r_char)) + /* Parse this entry */ + else { + if (0 != grab_one_ego_flag(re_ptr, s, TRUE)) { - /* Limited to 5 races */ - if (r_char_number >= 5) continue; - - /* Extract a "frequency" */ - re_ptr->r_char[r_char_number++] = r_char; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_ego_flag(re_ptr, s, TRUE)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -6578,39 +6260,24 @@ errr init_re_info_txt(FILE *fp) char r_char; /* Parse every entry */ - for (s = buf + 2; *s; ) + s = buf + 2; + + /* XXX XXX XXX Hack -- Read monster symbols */ + if (1 == sscanf(s, "R_CHAR_%c", &r_char)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + /* Limited to 5 races */ + if (nr_char_number >= 5) continue; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } + /* Extract a "frequency" */ + re_ptr->nr_char[nr_char_number++] = r_char; + } - /* XXX XXX XXX Hack -- Read monster symbols */ - if (1 == sscanf(s, "R_CHAR_%c", &r_char)) + /* Parse this entry */ + else { + if (0 != grab_one_ego_flag(re_ptr, s, FALSE)) { - /* Limited to 5 races */ - if (nr_char_number >= 5) continue; - - /* Extract a "frequency" */ - re_ptr->nr_char[nr_char_number++] = r_char; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_ego_flag(re_ptr, s, FALSE)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -6620,24 +6287,9 @@ errr init_re_info_txt(FILE *fp) /* Process 'M' for "Basic Monster Flags" (multiple lines) */ if (buf[0] == 'M') { - /* Parse every entry */ - for (s = buf + 2; *s; ) + if (0 != grab_one_basic_ego_flag(re_ptr, buf + 2, TRUE)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_basic_ego_flag(re_ptr, s, TRUE)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -6647,37 +6299,21 @@ errr init_re_info_txt(FILE *fp) /* Process 'O' for "Basic Monster -Flags" (multiple lines) */ if (buf[0] == 'O') { - /* Parse every entry */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + s = buf + 2; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } + /* XXX XXX XXX Hack -- Read no flags */ + if (!strcmp(s, "MF_ALL")) + { + /* No flags */ + re_ptr->nflags1 = re_ptr->nflags2 = re_ptr->nflags3 = re_ptr->nflags7 = re_ptr->nflags8 = re_ptr->nflags9 = 0xFFFFFFFF; + } - /* XXX XXX XXX Hack -- Read no flags */ - if (!strcmp(s, "MF_ALL")) + /* Parse this entry */ + else { + if (0 != grab_one_basic_ego_flag(re_ptr, s, FALSE)) { - /* No flags */ - re_ptr->nflags1 = re_ptr->nflags2 = re_ptr->nflags3 = re_ptr->nflags7 = re_ptr->nflags8 = re_ptr->nflags9 = 0xFFFFFFFF; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_basic_ego_flag(re_ptr, s, FALSE)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -6687,37 +6323,21 @@ errr init_re_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - /* Parse every entry */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + s = buf + 2; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } + /* XXX XXX XXX Hack -- Read spell frequency */ + if (1 == sscanf(s, "1_IN_%d", &i)) + { + /* Extract a "frequency" */ + re_ptr->freq_spell = re_ptr->freq_inate = 100 / i; + } - /* XXX XXX XXX Hack -- Read spell frequency */ - if (1 == sscanf(s, "1_IN_%d", &i)) + /* Parse this entry */ + else { + if (0 != grab_one_spell_ego_flag(re_ptr, s, TRUE)) { - /* Extract a "frequency" */ - re_ptr->freq_spell = re_ptr->freq_inate = 100 / i; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_spell_ego_flag(re_ptr, s, TRUE)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -7021,7 +6641,7 @@ errr init_d_info_txt(FILE *fp) byte r_char_number = 0; - char *s, *t; + char *s; /* Current entry */ dungeon_info_type *d_ptr = NULL; @@ -7327,104 +6947,57 @@ errr init_d_info_txt(FILE *fp) int artif = 0, monst = 0, obj = 0; int ix = -1, iy = -1, ox = -1, oy = -1; int fill_method; + s = buf + 2; - /* Parse every entry */ - for (s = buf + 2; *s; ) + /* Read dungeon in/out coords */ + if (4 == sscanf(s, "WILD_%d_%d__%d_%d", &ix, &iy, &ox, &oy)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Read dungeon in/out coords */ - if (4 == sscanf(s, "WILD_%d_%d__%d_%d", &ix, &iy, &ox, &oy)) - { - d_ptr->ix = ix; - d_ptr->iy = iy; - d_ptr->ox = ox; - d_ptr->oy = oy; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; - } - - /* Read dungeon size */ - if (2 == sscanf(s, "SIZE_%d_%d", &ix, &iy)) - { - d_ptr->size_x = ix; - d_ptr->size_y = iy; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; - } - - /* Read dungeon fill method */ - if (1 == sscanf(s, "FILL_METHOD_%d", &fill_method)) - { - d_ptr->fill_method = fill_method; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; - } - - /* Read Final Object */ - if (1 == sscanf(s, "FINAL_OBJECT_%d", &obj)) - { - /* Extract a "Final Artifact" */ - d_ptr->final_object = obj; + d_ptr->ix = ix; + d_ptr->iy = iy; + d_ptr->ox = ox; + d_ptr->oy = oy; + } - /* Start at next entry */ - s = t; + /* Read dungeon size */ + else if (2 == sscanf(s, "SIZE_%d_%d", &ix, &iy)) + { + d_ptr->size_x = ix; + d_ptr->size_y = iy; + } - /* Continue */ - continue; - } + /* Read dungeon fill method */ + else if (1 == sscanf(s, "FILL_METHOD_%d", &fill_method)) + { + d_ptr->fill_method = fill_method; + } - /* Read Final Artifact */ - if (1 == sscanf(s, "FINAL_ARTIFACT_%d", &artif )) - { - /* Extract a "Final Artifact" */ - d_ptr->final_artifact = artif ; + /* Read Final Object */ + else if (1 == sscanf(s, "FINAL_OBJECT_%d", &obj)) + { + /* Extract a "Final Artifact" */ + d_ptr->final_object = obj; + } - /* Start at next entry */ - s = t; + /* Read Final Artifact */ + else if (1 == sscanf(s, "FINAL_ARTIFACT_%d", &artif )) + { + /* Extract a "Final Artifact" */ + d_ptr->final_artifact = artif ; + } - /* Continue */ - continue; - } + /* Read Artifact Guardian */ + else if (1 == sscanf(s, "FINAL_GUARDIAN_%d", &monst)) + { + /* Extract a "Artifact Guardian" */ + d_ptr->final_guardian = monst; + } - /* Read Artifact Guardian */ - if (1 == sscanf(s, "FINAL_GUARDIAN_%d", &monst)) + /* Parse this entry */ + else { + if (0 != grab_one_dungeon_flag(&(d_ptr->flags1), &(d_ptr->flags2), s)) { - /* Extract a "Artifact Guardian" */ - d_ptr->final_guardian = monst; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_dungeon_flag(&(d_ptr->flags1), &(d_ptr->flags2), s)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -7470,41 +7043,24 @@ errr init_d_info_txt(FILE *fp) if (buf[0] == 'M') { byte r_char; + s = buf + 2; - /* Parse every entry */ - for (s = buf + 2; *s; ) + /* Read monster symbols */ + if (1 == sscanf(s, "R_CHAR_%c", &r_char)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; + /* Limited to 5 races */ + if (r_char_number >= 5) continue; - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } + /* Extract a "frequency" */ + d_ptr->rules[rule_num].r_char[r_char_number++] = r_char; + } - /* Read monster symbols */ - if (1 == sscanf(s, "R_CHAR_%c", &r_char)) + /* Parse this entry */ + else { + if (0 != grab_one_basic_monster_flag(d_ptr, s, rule_num)) { - /* Limited to 5 races */ - if (r_char_number >= 5) continue; - - /* Extract a "frequency" */ - d_ptr->rules[rule_num].r_char[r_char_number++] = r_char; - - /* Start at next entry */ - s = t; - - /* Continue */ - continue; + return (5); } - - /* Parse this entry */ - if (0 != grab_one_basic_monster_flag(d_ptr, s, rule_num)) return (5); - - /* Start the next entry */ - s = t; } /* Next... */ @@ -7514,24 +7070,12 @@ errr init_d_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - /* Parse every entry */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while ((*t == ' ') || (*t == '|')) t++; - } - - /* Parse this entry */ - if (0 != grab_one_spell_monster_flag(d_ptr, s, rule_num)) return (5); + s = buf + 2; - /* Start the next entry */ - s = t; + /* Parse this entry */ + if (0 != grab_one_spell_monster_flag(d_ptr, s, rule_num)) + { + return (5); } /* Next... */ @@ -7599,7 +7143,7 @@ errr init_st_info_txt(FILE *fp) { int i = 0, item_idx = 0; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ store_info_type *st_ptr = NULL; @@ -7763,25 +7307,7 @@ errr init_st_info_txt(FILE *fp) /* Process 'F' for "store Flags" (multiple lines) */ if (buf[0] == 'F') { - /* Parse every entry */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_store_flag(st_ptr, s)) return (5); - - /* Start the next entry */ - s = t; - } + if (0 != grab_one_store_flag(st_ptr, buf + 2)) return (5); /* Next... */ continue; @@ -7957,7 +7483,7 @@ errr init_ow_info_txt(FILE *fp) { int i; char buf[1024]; - char *s, *t; + char *s; /* Current entry */ owner_type *ow_ptr = NULL; @@ -8060,24 +7586,9 @@ errr init_ow_info_txt(FILE *fp) /* Process 'L' for "Liked races/classes" (multiple lines) */ if (buf[0] == 'L') { - /* Parse every entry */ - for (s = buf + 2; *s; ) + if (0 != grab_one_race_flag(ow_ptr, STORE_LIKED, buf + 2)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_race_flag(ow_ptr, STORE_LIKED, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ @@ -8086,24 +7597,9 @@ errr init_ow_info_txt(FILE *fp) /* Process 'H' for "Hated races/classes" (multiple lines) */ if (buf[0] == 'H') { - /* Parse every entry */ - for (s = buf + 2; *s; ) + if (0 != grab_one_race_flag(ow_ptr, STORE_HATED, buf + 2)) { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_race_flag(ow_ptr, STORE_HATED, s)) return (5); - - /* Start the next entry */ - s = t; + return (5); } /* Next... */ -- cgit v1.2.3 From 4fbb684dead05e8579046b997888abc6bb76af25 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Avoid hardcoding most artifact numbers --- lib/edit/a_info.txt | 39 +++++++++ lib/mods/theme/edit/a_info.txt | 39 +++++++++ src/defines.h | 194 +---------------------------------------- src/init1.cc | 6 +- src/object2.cc | 75 ++++------------ 5 files changed, 101 insertions(+), 252 deletions(-) diff --git a/lib/edit/a_info.txt b/lib/edit/a_info.txt index a586b5ff..645af426 100644 --- a/lib/edit/a_info.txt +++ b/lib/edit/a_info.txt @@ -264,6 +264,7 @@ F:IM_COLD F:INSTA_ART F:INT F:LUCK +F:RANDOM_POWER F:RES_BLIND F:SEE_INVIS F:SPEED @@ -297,6 +298,7 @@ F:IM_ELEC F:INSTA_ART F:INT F:LUCK +F:RANDOM_POWER F:REGEN F:RES_DISEN F:RES_POIS @@ -344,6 +346,8 @@ F:INT F:INVIS F:MANA F:PERMA_CURSE +F:RANDOM_POWER +F:RANDOM_RESIST F:REGEN F:RES_BLIND F:RES_DISEN @@ -539,6 +543,7 @@ W:30:3:200:30000 P:19:1d4:0:0:15 F:DEX F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_CONF @@ -588,6 +593,7 @@ F:ACTIVATE F:CHR F:ESP_ORC F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_DARK @@ -609,6 +615,7 @@ W:20:3:220:32000 P:14:1d4:-2:0:15 F:CHR F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -631,6 +638,7 @@ F:ACTIVATE F:CON F:HIDE_TYPE F:INT +F:RANDOM_RESIST F:RES_ACID F:RES_CONF F:RES_POIS @@ -687,6 +695,7 @@ F:ESP_THUNDERLORD F:FLY F:IM_FIRE F:INT +F:RANDOM_RESIST F:REFLECT F:RES_ACID F:RES_COLD @@ -708,6 +717,7 @@ W:20:3:60:25000 P:11:1d1:-1:0:25 F:DEX F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_SHARDS F:SPECIAL_GENE @@ -752,6 +762,7 @@ F:ESP_ORC F:FREE_ACT F:HIDE_TYPE F:IM_ACID +F:RANDOM_RESIST F:RES_CHAOS F:RES_SOUND F:STR @@ -765,6 +776,7 @@ N:31:of Celegorm I:34:4:0 W:30:3:60:12000 P:4:1d2:0:0:20 +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_DARK @@ -783,6 +795,7 @@ I:34:5:0 W:40:9:120:160000 P:5:1d3:0:0:20 F:ESP_EVIL +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -876,6 +889,7 @@ F:ESP_EVIL F:ESP_NONLIVING F:FREE_ACT F:HIDE_TYPE +F:RANDOM_POWER F:SEE_INVIS F:STR D:The midnight-hued steel circlet of the sorceress-queen Beruthiel, which @@ -894,6 +908,7 @@ F:ESP_ORC F:ESP_TROLL F:HIDE_TYPE F:INT +F:RANDOM_RESIST F:RES_BLIND F:WIS D:The hunting cap of King Thranduil, to whose ears come all the secrets of @@ -1025,6 +1040,8 @@ F:ACTIVATE F:CON F:HIDE_TYPE F:LITE1 +F:RANDOM_POWER +F:RANDOM_RESIST F:REGEN F:RES_BLIND F:RES_CHAOS @@ -1122,6 +1139,7 @@ F:CHR F:DEX F:FREE_ACT F:HIDE_TYPE +F:RANDOM_POWER F:RES_ACID F:RES_COLD F:RES_FIRE @@ -1174,6 +1192,7 @@ F:HIDE_TYPE F:INT F:INVIS F:LUCK +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_FIRE @@ -1352,6 +1371,7 @@ F:DEX F:FREE_ACT F:HIDE_TYPE F:LUCK +F:RANDOM_POWER F:RES_ACID F:SHOW_MODS a:BO_MISS_2 @@ -1406,6 +1426,7 @@ P:6:1d1:0:0:20 F:CLIMB F:CON F:HIDE_TYPE +F:RANDOM_RESIST F:RES_FEAR F:SPEED F:STR @@ -1454,6 +1475,7 @@ F:DEX F:FREE_ACT F:HIDE_TYPE F:INT +F:RANDOM_RES_OR_POWER F:SEE_INVIS F:SHOW_MODS F:SLAY_GIANT @@ -1499,6 +1521,7 @@ F:ACTIVATE F:BRAND_FIRE F:LEVELS F:LITE1 +F:RANDOM_RESIST F:RES_FIRE F:SHOW_MODS a:BO_FIRE_1 @@ -1514,6 +1537,7 @@ P:0:1d4:4:6:0 F:ACTIVATE F:BRAND_COLD F:LEVELS +F:RANDOM_RESIST F:RES_COLD F:SHOW_MODS a:BO_COLD_1 @@ -1529,6 +1553,7 @@ P:0:1d4:4:6:0 F:ACTIVATE F:BRAND_ELEC F:LEVELS +F:RANDOM_RESIST F:RES_ELEC F:SHOW_MODS a:BO_ELEC_1 @@ -1647,6 +1672,7 @@ F:BRAND_FIRE F:ESP_ORC F:HIDE_TYPE F:LITE1 +F:RANDOM_RES_OR_POWER F:RES_FIRE F:RES_LITE F:SEARCH @@ -1699,6 +1725,7 @@ F:ESP_DRAGON F:ESP_ORC F:HIDE_TYPE F:LITE1 +F:RANDOM_RES_OR_POWER F:RES_COLD F:RES_COLD F:RES_DARK @@ -1726,6 +1753,7 @@ F:FREE_ACT F:HIDE_TYPE F:KILL_DRAGON F:MUST2H +F:RANDOM_RES_OR_POWER F:REGEN F:RES_FIRE F:RES_POIS @@ -1755,6 +1783,7 @@ F:HIDE_TYPE F:INFRA F:KILL_DRAGON F:MUST2H +F:RANDOM_RES_OR_POWER F:RES_CHAOS F:RES_FIRE F:SEE_INVIS @@ -1913,6 +1942,7 @@ F:FREE_ACT F:HIDE_TYPE F:LITE1 F:LUCK +F:RANDOM_RES_OR_POWER F:RES_DISEN F:RES_FEAR F:RES_FIRE @@ -2030,6 +2060,7 @@ F:ESP_UNDEAD F:FREE_ACT F:LEVELS F:LITE1 +F:RANDOM_RESIST F:RES_LITE F:SEE_INVIS F:SHOW_MODS @@ -2054,6 +2085,7 @@ P:0:2d5:9:11:0 F:BLESSED F:BLOWS F:INT +F:RANDOM_RES_OR_POWER F:RES_CHAOS F:RES_DISEN F:RES_NEXUS @@ -2524,6 +2556,7 @@ F:FREE_ACT F:HIDE_TYPE F:HOLD_LIFE F:IM_ACID +F:RANDOM_POWER F:REGEN F:RES_NETHER F:SEE_INVIS @@ -2577,6 +2610,7 @@ F:CLONE F:FREE_ACT F:INFRA F:LEVELS +F:RANDOM_RES_OR_POWER F:REGEN F:RES_BLIND F:RES_FEAR @@ -2741,6 +2775,8 @@ F:COULD2H F:FREE_ACT F:HIDE_TYPE F:KILL_DRAGON +F:RANDOM_POWER +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -2813,6 +2849,7 @@ F:CHR F:HIDE_TYPE F:HOLD_LIFE F:INT +F:RANDOM_POWER F:RES_FIRE F:RES_NETHER F:SEARCH @@ -2877,6 +2914,7 @@ F:ESP_ORC F:ESP_TROLL F:HIDE_TYPE F:INFRA +F:RANDOM_RESIST F:REGEN F:RES_COLD F:RES_LITE @@ -2961,6 +2999,7 @@ W:50:25:110:50000 P:0:0d0:10:14:0 F:ACTIVATE F:HIDE_TYPE +F:RANDOM_RES_OR_POWER F:RES_FIRE F:SHOW_MODS F:SPEED diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt index 2e5a1f43..f1e19dbf 100644 --- a/lib/mods/theme/edit/a_info.txt +++ b/lib/mods/theme/edit/a_info.txt @@ -286,6 +286,7 @@ F:IM_COLD F:INSTA_ART F:INT F:LUCK +F:RANDOM_POWER F:RES_BLIND F:SEE_INVIS F:SPEED @@ -319,6 +320,7 @@ F:IM_ELEC F:INSTA_ART F:INT F:LUCK +F:RANDOM_POWER F:REGEN F:RES_DISEN F:RES_POIS @@ -366,6 +368,8 @@ F:INT F:INVIS F:MANA F:PERMA_CURSE +F:RANDOM_POWER +F:RANDOM_RESIST F:REGEN F:RES_BLIND F:RES_DISEN @@ -559,6 +563,7 @@ W:30:3:200:30000 P:19:1d4:0:0:15 F:DEX F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_CONF @@ -608,6 +613,7 @@ F:ACTIVATE F:CHR F:ESP_ORC F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_DARK @@ -629,6 +635,7 @@ W:20:3:220:32000 P:14:1d4:-2:0:15 F:CHR F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -651,6 +658,7 @@ F:ACTIVATE F:CON F:HIDE_TYPE F:INT +F:RANDOM_RESIST F:RES_ACID F:RES_CONF F:RES_POIS @@ -692,6 +700,7 @@ F:CON F:DEX F:HIDE_TYPE F:INT +F:RANDOM_RESIST F:STR F:WIS Z:teleport @@ -708,6 +717,7 @@ W:20:3:60:25000 P:11:1d1:-1:0:25 F:DEX F:HIDE_TYPE +F:RANDOM_RESIST F:RES_ACID F:RES_SHARDS F:SPECIAL_GENE @@ -752,6 +762,7 @@ F:ESP_ORC F:FREE_ACT F:HIDE_TYPE F:IM_ACID +F:RANDOM_RESIST F:RES_CHAOS F:RES_SOUND F:STR @@ -765,6 +776,7 @@ N:31:of Celegorm I:34:4:0 W:30:3:60:12000 P:4:1d2:0:0:20 +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_DARK @@ -783,6 +795,7 @@ I:34:5:0 W:40:9:120:160000 P:5:1d3:0:0:20 F:ESP_EVIL +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -876,6 +889,7 @@ F:ESP_EVIL F:ESP_NONLIVING F:FREE_ACT F:HIDE_TYPE +F:RANDOM_POWER F:SEE_INVIS F:STR D:The midnight-hued steel circlet of the sorceress-queen Beruthiel, which @@ -894,6 +908,7 @@ F:ESP_ORC F:ESP_TROLL F:HIDE_TYPE F:INT +F:RANDOM_RESIST F:RES_BLIND F:WIS D:The hunting cap of King Thranduil, to whose ears come all the secrets of @@ -1025,6 +1040,8 @@ F:ACTIVATE F:CON F:HIDE_TYPE F:LITE1 +F:RANDOM_POWER +F:RANDOM_RESIST F:REGEN F:RES_BLIND F:RES_CHAOS @@ -1121,6 +1138,7 @@ F:CHR F:DEX F:FREE_ACT F:HIDE_TYPE +F:RANDOM_POWER F:RES_ACID F:RES_COLD F:RES_FIRE @@ -1173,6 +1191,7 @@ F:HIDE_TYPE F:INT F:INVIS F:LUCK +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_FIRE @@ -1360,6 +1379,7 @@ F:DEX F:FREE_ACT F:HIDE_TYPE F:LUCK +F:RANDOM_POWER F:RES_ACID F:SHOW_MODS a:BO_MISS_2 @@ -1414,6 +1434,7 @@ P:6:1d1:0:0:20 F:CLIMB F:CON F:HIDE_TYPE +F:RANDOM_RESIST F:RES_FEAR F:SPEED F:STR @@ -1462,6 +1483,7 @@ F:DEX F:FREE_ACT F:HIDE_TYPE F:INT +F:RANDOM_RES_OR_POWER F:SEE_INVIS F:SHOW_MODS F:SLAY_GIANT @@ -1509,6 +1531,7 @@ F:ACTIVATE F:BRAND_FIRE F:LEVELS F:LITE1 +F:RANDOM_RESIST F:RES_FIRE F:SHOW_MODS a:BO_FIRE_1 @@ -1524,6 +1547,7 @@ P:0:1d4:4:6:0 F:ACTIVATE F:BRAND_COLD F:LEVELS +F:RANDOM_RESIST F:RES_COLD F:SHOW_MODS a:BO_COLD_1 @@ -1539,6 +1563,7 @@ P:0:1d4:4:6:0 F:ACTIVATE F:BRAND_ELEC F:LEVELS +F:RANDOM_RESIST F:RES_ELEC F:SHOW_MODS a:BO_ELEC_1 @@ -1658,6 +1683,7 @@ F:BRAND_FIRE F:ESP_ORC F:HIDE_TYPE F:LITE1 +F:RANDOM_RES_OR_POWER F:RES_FIRE F:RES_LITE F:SEARCH @@ -1701,6 +1727,7 @@ F:ESP_DRAGON F:ESP_ORC F:HIDE_TYPE F:LITE1 +F:RANDOM_RES_OR_POWER F:RES_COLD F:RES_COLD F:RES_DARK @@ -1727,6 +1754,7 @@ F:FREE_ACT F:HIDE_TYPE F:KILL_DRAGON F:MUST2H +F:RANDOM_RES_OR_POWER F:REGEN F:RES_FIRE F:RES_POIS @@ -1757,6 +1785,7 @@ F:HIDE_TYPE F:INFRA F:KILL_DRAGON F:MUST2H +F:RANDOM_RES_OR_POWER F:RES_CHAOS F:RES_FIRE F:SEE_INVIS @@ -1917,6 +1946,7 @@ F:FREE_ACT F:HIDE_TYPE F:LITE1 F:LUCK +F:RANDOM_RES_OR_POWER F:RES_DISEN F:RES_FEAR F:RES_FIRE @@ -2035,6 +2065,7 @@ F:ESP_UNDEAD F:FREE_ACT F:LEVELS F:LITE1 +F:RANDOM_RESIST F:RES_LITE F:SEE_INVIS F:SHOW_MODS @@ -2058,6 +2089,7 @@ P:0:2d5:9:11:0 F:BLESSED F:BLOWS F:INT +F:RANDOM_RES_OR_POWER F:RES_CHAOS F:RES_DISEN F:RES_NEXUS @@ -2520,6 +2552,7 @@ F:FREE_ACT F:HIDE_TYPE F:HOLD_LIFE F:IM_ACID +F:RANDOM_POWER F:REGEN F:RES_NETHER F:SEE_INVIS @@ -2573,6 +2606,7 @@ F:HOLD_LIFE F:KILL_UNDEAD F:LITE1 F:LUCK +F:RANDOM_RES_OR_POWER F:RES_DISEN F:RES_FEAR F:RES_MORGUL @@ -2733,6 +2767,8 @@ F:COULD2H F:FREE_ACT F:HIDE_TYPE F:KILL_DRAGON +F:RANDOM_POWER +F:RANDOM_RESIST F:RES_ACID F:RES_COLD F:RES_ELEC @@ -2805,6 +2841,7 @@ F:CHR F:HIDE_TYPE F:HOLD_LIFE F:INT +F:RANDOM_POWER F:RES_FIRE F:RES_NETHER F:SEARCH @@ -2867,6 +2904,7 @@ F:ESP_ORC F:ESP_TROLL F:HIDE_TYPE F:INFRA +F:RANDOM_RESIST F:REGEN F:RES_COLD F:RES_LITE @@ -2951,6 +2989,7 @@ W:50:25:110:50000 P:0:0d0:10:14:0 F:ACTIVATE F:HIDE_TYPE +F:RANDOM_RES_OR_POWER F:RES_FIRE F:SHOW_MODS F:SPEED diff --git a/src/defines.h b/src/defines.h index 224f5bd9..dc9dbfb8 100644 --- a/src/defines.h +++ b/src/defines.h @@ -678,208 +678,19 @@ /*** Artifact indexes (see "lib/edit/a_info.txt") ***/ - -/* Lites */ -#define ART_GALADRIEL 1 -#define ART_ELENDIL 2 -#define ART_THRAIN 3 #define ART_PALANTIR 202 -#define ART_UNDEATH 200 -#define ART_STONE_LORE 15 -#define ART_PALANTIR_ITHIL 208 - -/* Amulets */ -#define ART_CARLAMMAS 4 -#define ART_INGWE 5 -#define ART_DWARVES 6 #define ART_ANCHOR 14 -#define ART_ELESSAR 206 -#define ART_EVENSTAR 207 - -/* Rings */ -#define ART_FLAR 7 -#define ART_BARAHIR 8 -#define ART_TULKAS 9 -#define ART_NARYA 10 -#define ART_NENYA 11 -#define ART_VILYA 12 #define ART_POWER 13 -/* 14 used by the anchor of space-time */ -/* 15 used by the stone of lore */ - -/* Dragon Scale */ -#define ART_RAZORBACK 16 -#define ART_BLADETURNER 17 -#define ART_MEDIATOR 166 - -/* Hard Armour */ -#define ART_HIMRING 167 -#define ART_SOULKEEPER 19 -#define ART_ISILDUR 20 -#define ART_ROHIRRIM 21 -#define ART_BELEGENNON 22 -#define ART_CELEBORN 23 -#define ART_ARVEDUI 24 -#define ART_CASPANION 25 - -/* Thunderlord flying suit */ #define ART_MARDA 26 -#define ART_TRON 27 - -/* Soft Armour */ -#define ART_THALKETTOTH 28 - -/* Shields */ -#define ART_THORIN 30 -#define ART_CELEGORM 31 -#define ART_ANARION 32 -#define ART_GILGALAD 169 -#define ART_HARADRIM 176 - -/* Helms and Crowns */ #define ART_MORGOTH 34 -#define ART_BERUTHIEL 35 -#define ART_THRANDUIL 36 -#define ART_THENGEL 37 -#define ART_HAMMERHAND 38 -#define ART_DOR 39 -#define ART_HOLHENNETH 40 -#define ART_GORLIM 41 -#define ART_GONDOR 42 -#define ART_KNOWLEDGE 160 -#define ART_NUMENOR 43 -#define ART_CELEBRIMBOR 170 - -/* Cloaks */ -#define ART_COLLUIN 44 -#define ART_HOLCOLLETH 45 -#define ART_THINGOL 46 -#define ART_THORONGIL 47 -#define ART_COLANNON 48 -#define ART_LUTHIEN 49 -#define ART_TUOR 50 - -/* Gloves */ -#define ART_CAMBELEG 52 -#define ART_CAMMITHRIM 53 -#define ART_PAURHACH 54 -#define ART_PAURNIMMEN 55 -#define ART_PAURAEGEN 56 -#define ART_PAURNEN 57 -#define ART_CAMLOST 58 -#define ART_FINGOLFIN 59 -#define ART_EOL 178 - -/* Boots */ -#define ART_FEANOR 60 -#define ART_DAL 61 -#define ART_THROR 62 - -/* Swords */ #define ART_NARSIL 164 -#define ART_MAEDHROS 64 -#define ART_ANGRIST 65 -#define ART_NARTHANC 66 -#define ART_NIMTHANC 67 -#define ART_DETHANC 68 -#define ART_RILIA 69 -#define ART_BELANGIL 70 #define ART_CALRIS 71 -#define ART_ARUNRUTH 72 #define ART_GLAMDRING 73 -#define ART_AEGLIN 74 -#define ART_ORCRIST 75 -#define ART_GURTHANG 76 -#define ART_ZARCUTHRA 77 -#define ART_MORMEGIL 78 -#define ART_GONDRICAM 79 -#define ART_CRISDURIAN 80 -#define ART_AGLARANG 81 -#define ART_RINGIL 82 #define ART_ANDURIL 83 #define ART_ANGUIREL 84 -#define ART_ELVAGIL 85 -#define ART_FORASGIL 86 -#define ART_CARETH 87 -#define ART_STING 88 -#define ART_HARADEKKET 89 -#define ART_GILETTAR 90 -#define ART_DOOMCALLER 91 -#define ART_VORPAL_BLADE 92 -#define ART_ERU 147 - -/* Polearms */ -#define ART_THEODEN 93 -#define ART_PAIN 94 -#define ART_OSONDIR 95 -#define ART_TIL 96 -#define ART_AEGLOS 97 -#define ART_OROME 98 #define ART_NIMLOTH 99 -#define ART_EORLINGAS 100 -#define ART_DURIN 101 -#define ART_EONWE 102 -#define ART_BALLI 103 -#define ART_LOTHARANG 104 -#define ART_MUNDWINE 105 -#define ART_BARUKKHELED 106 -#define ART_WRATH 107 -#define ART_ULMO 108 -#define ART_AVAVIR 109 -#define ART_FUNDIN 175 - -/* The sword of the Dawn */ -#define ART_DAWN 110 - -/* Hafted */ -#define ART_MELKOR 18 -#define ART_HURIN 33 #define ART_GROND 111 -#define ART_TOTILA 112 -#define ART_THUNDERFIST 113 -#define ART_BLOODSPIKE 114 -#define ART_FIRESTAR 115 -#define ART_TARATOL 116 -#define ART_AULE 117 -#define ART_NAR 118 -#define ART_ERIRIL 119 -#define ART_OLORIN 120 -#define ART_DEATHWREAKER 121 -#define ART_TURMIL 122 #define ART_GOTHMOG 123 -#define ART_AXE_GOTHMOG 145 -#define ART_SKULLCLEAVER 177 - -#define ART_NAIN 174 - -/* Bows */ -#define ART_BELTHRONDING 124 -#define ART_BARD 125 -#define ART_CUBRAGOL 126 -#define ART_UMBAR 171 - -/* Mage Staffs */ -#define ART_GANDALF 127 - -/* Boomerangs */ -#define ART_BEOR 128 -#define ART_GLIMDRIR 129 - -/* Musical Instrument */ -#define ART_MAGLOR 137 -#define ART_SKY 138 -#define ART_DAERON 139 -#define ART_DRUEDAIN 141 -#define ART_ROHAN 142 -#define ART_HELM 143 -#define ART_BOROMIR 144 - -/* Diggers */ -#define ART_EREBOR 140 - -#define ART_ORCHAST 156 -#define ART_NIGHT 157 -#define ART_NATUREBANE 158 /* Spell for various object */ #define SPELL_ID_PLAIN 1 @@ -2663,7 +2474,10 @@ #define TR5_ACTIVATE_NO_WIELD 0x00002000L /* Can be 'A'ctivated without being wielded */ #define TR5_MAGIC_BREATH 0x00004000L /* Can breath anywere */ #define TR5_WATER_BREATH 0x00008000L /* Can breath underwater */ -#define TR5_WIELD_CAST 0x00010000L /* Need to be wielded to cast spelsl fomr it(if it can be wiekded) */ +#define TR5_WIELD_CAST 0x00010000L /* Must be wielded to cast spell from it */ +#define TR5_RANDOM_RESIST 0x00020000L /* Grants random resistance */ +#define TR5_RANDOM_POWER 0x00040000L /* Grants random power */ +#define TR5_RANDOM_RES_OR_POWER 0x00080000L /* Grants random resistance OR power (50-50 chance) */ /* ESP defines */ #define ESP_ORC 0x00000001L diff --git a/src/init1.cc b/src/init1.cc index 56b1a3ac..75a75d3a 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -722,9 +722,9 @@ cptr k_info_flags5[] = "MAGIC_BREATH", "WATER_BREATH", "WIELD_CAST", - "XXX8X17", - "XXX8X18", - "XXX8X19", + "RANDOM_RESIST", + "RANDOM_POWER", + "RANDOM_RES_OR_POWER", "XXX8X20", "XXX8X21", "XXX8X22", diff --git a/src/object2.cc b/src/object2.cc index c9853932..145aab4c 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -2043,76 +2043,33 @@ static void object_mention(object_type *o_ptr) void random_artifact_resistance(object_type * o_ptr) { - bool_ give_resistance = FALSE, give_power = FALSE; - - switch (o_ptr->name1) - { - case ART_CELEBORN: - case ART_ARVEDUI: - case ART_CASPANION: - case ART_TRON: - case ART_ROHIRRIM: - case ART_CELEGORM: - case ART_ANARION: - case ART_THRANDUIL: - case ART_LUTHIEN: - case ART_THROR: - case ART_THORIN: - case ART_NIMTHANC: - case ART_DETHANC: - case ART_NARTHANC: - case ART_STING: - case ART_TURMIL: - case ART_THALKETTOTH: - { - /* Give a resistance */ - give_resistance = TRUE; - } - break; - case ART_MAEDHROS: - case ART_GLAMDRING: - case ART_ORCRIST: - case ART_ANDURIL: - case ART_ZARCUTHRA: - case ART_GURTHANG: - case ART_HARADEKKET: - case ART_CUBRAGOL: - case ART_DAWN: - { - /* Give a resistance OR a power */ - if (randint(2) == 1) give_resistance = TRUE; - else give_power = TRUE; - } - break; - case ART_NENYA: - case ART_VILYA: - case ART_BERUTHIEL: - case ART_FINGOLFIN: - case ART_THINGOL: - case ART_ULMO: - case ART_OLORIN: + auto f5 = a_info[o_ptr->name1].flags5; + + // Check flags + bool give_resistance = (f5 & TR5_RANDOM_RESIST); + bool give_power = (f5 & TR5_RANDOM_POWER); + if (f5 & TR5_RANDOM_RES_OR_POWER) + { + if (randint(2) == 1) { - /* Give a power */ - give_power = TRUE; + give_resistance = true; } - break; - case ART_POWER: - case ART_GONDOR: - case ART_AULE: + else { - /* Give both */ - give_power = TRUE; - give_resistance = TRUE; + give_power = true; } - break; } + // Grant the resistance/power if (give_power) { o_ptr->xtra1 = EGO_XTRA_ABILITY; /* Randomize the "xtra" power */ - if (o_ptr->xtra1) o_ptr->xtra2 = randint(256); + if (o_ptr->xtra1) + { + o_ptr->xtra2 = randint(256); + } } artifact_bias = 0; -- cgit v1.2.3 From d1f01115fe9df36800191f1aa55d3ee45eb8cd02 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 27 Mar 2016 15:46:59 +0200 Subject: Move "drops artifact N at %chance" to edit r_info --- lib/edit/r_info.txt | 6 ++++++ lib/mods/theme/edit/r_info.txt | 6 ++++++ src/defines.h | 6 ------ src/init1.cc | 19 +++++++++++++++++++ src/monster_race.hpp | 3 +++ src/xtra2.cc | 38 +++----------------------------------- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 92fc173a..252c1f2d 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -129,6 +129,7 @@ # S: spell frequency | # S: spell type | spell type | etc # D: Description +# A: a_ptr_index : %chance # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. Entry 0 is used for the player. @@ -17660,6 +17661,7 @@ I:130:80d30:20:100:60 W:49:2:1400:25000 E:1:1:1:2:1:1 O:10:40:40:10 +A:84:50 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 @@ -22144,6 +22146,7 @@ I:120:70d100:100:100:0 W:60:1:1600:35000 E:1:1:1:2:1:1 O:0:0:100:0 +A:202:30 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 @@ -22993,6 +22996,7 @@ I:130:100d85:100:100:50 W:75:6:420000:35000 E:1:1:1:2:1:1 O:50:50:0:0 +A:26:50 B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 @@ -26067,6 +26071,7 @@ I:130:120d100:100:140:0 W:95:1:17000:43000 E:1:1:1:2:1:1 O:0:100:0:0 +A:123:50 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 @@ -26765,6 +26770,7 @@ I:130:30d100:20:100:80 W:50:3:13000:30000 E:1:1:1:2:1:1 O:0:50:50:0 +A:71:60 B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index 87294e8b..f238fec8 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -130,6 +130,7 @@ # S: spell frequency | # S: spell type | spell type | etc # D: Description +# A: a_ptr_index : %chance # 'N' indicates the beginning of an entry. The serial number must # increase for each new item. Entry 0 is used for the player. @@ -18728,6 +18729,7 @@ I:130:80d30:20:100:60 W:49:2:1400:25000 E:1:1:1:2:1:1 O:10:40:40:10 +A:84:50 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 @@ -22496,6 +22498,7 @@ I:120:70d100:100:100:0 W:60:1:1600:35000 E:1:1:1:2:1:1 O:0:0:100:0 +A:202:30 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 @@ -23298,6 +23301,7 @@ I:130:100d85:100:100:50 W:75:6:420000:35000 E:1:1:1:2:1:1 O:50:50:0:0 +A:26:50 B:HIT:HURT:12d15 B:HIT:HURT:12d15 B:HIT:HURT:12d15 @@ -25666,6 +25670,7 @@ I:130:120d100:100:140:0 W:95:1:17000:43000 E:1:1:1:2:1:1 O:0:100:0:0 +A:123:50 B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 @@ -26265,6 +26270,7 @@ I:130:30d100:20:100:80 W:50:3:13000:30000 E:1:1:1:2:1:1 O:0:50:50:0 +A:71:60 B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 diff --git a/src/defines.h b/src/defines.h index dc9dbfb8..519dc535 100644 --- a/src/defines.h +++ b/src/defines.h @@ -678,19 +678,13 @@ /*** Artifact indexes (see "lib/edit/a_info.txt") ***/ -#define ART_PALANTIR 202 #define ART_ANCHOR 14 #define ART_POWER 13 -#define ART_MARDA 26 #define ART_MORGOTH 34 #define ART_NARSIL 164 -#define ART_CALRIS 71 #define ART_GLAMDRING 73 #define ART_ANDURIL 83 -#define ART_ANGUIREL 84 -#define ART_NIMLOTH 99 #define ART_GROND 111 -#define ART_GOTHMOG 123 /* Spell for various object */ #define SPELL_ID_PLAIN 1 diff --git a/src/init1.cc b/src/init1.cc index 75a75d3a..10698d2d 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5769,6 +5769,25 @@ errr init_r_info_txt(FILE *fp) continue; } + /* Process 'A' for standard artifact drop (one line only) */ + if (buf[0] == 'A') + { + int artifact_idx; + int artifact_chance; + + /* Scan for values */ + if (2 != sscanf(buf + 2, "%d:%d", + &artifact_idx, + &artifact_chance)) return (1); + + /* Save the values */ + r_ptr->artifact_idx = artifact_idx; + r_ptr->artifact_chance = artifact_chance; + + /* Next... */ + continue; + } + /* Process 'W' for "More Info" (one line only) */ if (buf[0] == 'W') { diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 7e5d5082..f756d6ff 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -59,6 +59,9 @@ struct monster_race byte body_parts[BODY_MAX]; /* To help to decide what to use when body changing */ + byte artifact_idx; /* Artifact index of standard artifact dropped; 0 if none. */ + int artifact_chance; /* Percentage chance of dropping the artifact. */ + byte level; /* Level of creature */ byte rarity; /* Rarity of creature */ diff --git a/src/xtra2.cc b/src/xtra2.cc index 707005cd..d3e01b71 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2771,40 +2771,8 @@ void monster_death(int m_idx) } else { - byte a_idx = 0; - int chance = 0; - int I_kind = 0; - - if (strstr(r_ptr->name, "Marda, rider of the Gold Laronth")) - { - a_idx = ART_MARDA; - chance = 50; - } - else if (strstr(r_ptr->name, "Saruman of Many Colours")) - { - a_idx = ART_PALANTIR; - chance = 30; - } - else if (strstr(r_ptr->name, "Hagen, son of Alberich")) - { - a_idx = ART_NIMLOTH; - chance = 66; - } - else if (strstr(r_ptr->name, "Durin's Bane")) - { - a_idx = ART_CALRIS; - chance = 60; - } - else if (strstr(r_ptr->name, "Gothmog, the High Captain of Balrogs")) - { - a_idx = ART_GOTHMOG; - chance = 50; - } - else if (strstr(r_ptr->name, "Eol, the Dark Elf")) - { - a_idx = ART_ANGUIREL; - chance = 50; - } + byte a_idx = r_ptr->artifact_idx; + int chance = r_ptr->artifact_chance; if ((a_idx > 0) && ((randint(99) < chance) || (wizard))) { @@ -2819,7 +2787,7 @@ void monster_death(int m_idx) object_wipe(q_ptr); /* Acquire the "kind" index */ - I_kind = lookup_kind(a_ptr->tval, a_ptr->sval); + int I_kind = lookup_kind(a_ptr->tval, a_ptr->sval); /* Create the artifact */ object_prep(q_ptr, I_kind); -- cgit v1.2.3 From 0ec2cec5fad1f5cb1aa048b49bb67bfe493785e6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Have RANDOM_{RESIST,POWER} avoid existing flags --- src/defines.h | 3 --- src/object1.cc | 51 ++++++------------------------------- src/object2.cc | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 78 insertions(+), 55 deletions(-) diff --git a/src/defines.h b/src/defines.h index 519dc535..91d3065d 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2247,9 +2247,6 @@ /* High resist */ #define EGO_XTRA_POWER 2 -/* Special ability */ -#define EGO_XTRA_ABILITY 3 - /*** Object flag values ***/ diff --git a/src/object1.cc b/src/object1.cc index 78206f68..ae0317c7 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -850,40 +850,6 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b break; } - case EGO_XTRA_ABILITY: - { - /* Choose an ability */ - switch (o_ptr->xtra2 % 8) - { - case 0: - (*f3) |= (TR3_FEATHER); - break; - case 1: - (*f3) |= (TR3_LITE1); - break; - case 2: - (*f3) |= (TR3_SEE_INVIS); - break; - case 3: - (*esp) |= (ESP_ALL); - break; - case 4: - (*f3) |= (TR3_SLOW_DIGEST); - break; - case 5: - (*f3) |= (TR3_REGEN); - break; - case 6: - (*f2) |= (TR2_FREE_ACT); - break; - case 7: - (*f2) |= (TR2_HOLD_LIFE); - break; - } - - break; - } - } } @@ -920,16 +886,13 @@ void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b * apply_flags_set(o_ptr->name1, a_ptr->set, f1, f2, f3, f4, f5, esp); } - /* Random artifact ! */ - if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3 || o_ptr->art_flags4 || o_ptr->art_flags5 || o_ptr->art_esp) - { - (*f1) |= o_ptr->art_flags1; - (*f2) |= o_ptr->art_flags2; - (*f3) |= o_ptr->art_flags3; - (*f4) |= o_ptr->art_flags4; - (*f5) |= o_ptr->art_flags5; - (*esp) |= o_ptr->art_esp; - } + /* Mix in art_{flagsX,esp} */ + (*f1) |= o_ptr->art_flags1; + (*f2) |= o_ptr->art_flags2; + (*f3) |= o_ptr->art_flags3; + (*f4) |= o_ptr->art_flags4; + (*f5) |= o_ptr->art_flags5; + (*esp) |= o_ptr->art_esp; /* Extra powers */ if (!(o_ptr->art_name)) diff --git a/src/object2.cc b/src/object2.cc index 145aab4c..18d0e980 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -2040,6 +2040,63 @@ static void object_mention(object_type *o_ptr) } } +static void random_artifact_power(object_type *o_ptr) +{ + // Shorthand + auto f2 = &o_ptr->art_flags2; + auto f3 = &o_ptr->art_flags3; + auto esp = &o_ptr->art_esp; + + // Choose ability + auto try_choose = [&o_ptr, &f2, &f3, &esp](int choice) { + switch (choice) + { + case 0: + (*f3) |= (TR3_FEATHER); + break; + case 1: + (*f3) |= (TR3_LITE1); + break; + case 2: + (*f3) |= (TR3_SEE_INVIS); + break; + case 3: + (*esp) |= (ESP_ALL); + break; + case 4: + (*f3) |= (TR3_SLOW_DIGEST); + break; + case 5: + (*f3) |= (TR3_REGEN); + break; + case 6: + (*f2) |= (TR2_FREE_ACT); + break; + case 7: + (*f2) |= (TR2_HOLD_LIFE); + break; + } + }; + + // Save old values for comparison + u32b const old_f2 = *f2; + u32b const old_f3 = *f3; + u32b const old_esp = *esp; + + // Choose an ability; make sure we choose one that isn't already chosen + for (int tries = 0; tries < 1000; tries++) + { + // Tentative choice + int choice = rand_int(8); + try_choose(choice); + + // If there's any difference, then we chose a non-overlapping power. + if ((*f2 != old_f2) || (*f3 != old_f3) || (*esp != old_esp)) + { + break; + } + } +} void random_artifact_resistance(object_type * o_ptr) { @@ -2063,20 +2120,26 @@ void random_artifact_resistance(object_type * o_ptr) // Grant the resistance/power if (give_power) { - o_ptr->xtra1 = EGO_XTRA_ABILITY; - - /* Randomize the "xtra" power */ - if (o_ptr->xtra1) - { - o_ptr->xtra2 = randint(256); - } + random_artifact_power(o_ptr); } artifact_bias = 0; if (give_resistance) { - random_resistance(o_ptr, FALSE, ((randint(22)) + 16)); + // Save resistance flags + u32b const f2 = o_ptr->art_flags2; + // We'll be a little generous here and make sure that the object + // gets a resistance that it doesn't actually already have. + for (int tries = 0; tries < 1000; tries++) + { + random_resistance(o_ptr, FALSE, ((randint(22)) + 16)); + // Picked up a new resistance? + if (f2 != o_ptr->art_flags2) + { + break; + } + } } } -- cgit v1.2.3 From 168767170d481b9cc5fad6abe84af36e022fbf83 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Add missing "static" qualifiers in init1.cc --- src/init1.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 10698d2d..03966464 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -507,7 +507,7 @@ static cptr r_info_flags9[] = /* * Object flags */ -cptr k_info_flags1[] = +static cptr k_info_flags1[] = { "STR", "INT", @@ -546,7 +546,7 @@ cptr k_info_flags1[] = /* * Object flags */ -cptr k_info_flags2[] = +static cptr k_info_flags2[] = { "SUST_STR", "SUST_INT", @@ -585,7 +585,7 @@ cptr k_info_flags2[] = /* * Trap flags */ -cptr k_info_flags2_trap[] = +static cptr k_info_flags2_trap[] = { "AUTOMATIC_5", "AUTOMATIC_99", @@ -625,7 +625,7 @@ cptr k_info_flags2_trap[] = /* * Object flags */ -cptr k_info_flags3[] = +static cptr k_info_flags3[] = { "SH_FIRE", "SH_ELEC", @@ -664,7 +664,7 @@ cptr k_info_flags3[] = /* * Object flags */ -cptr k_info_flags4[] = +static cptr k_info_flags4[] = { "NEVER_BLOW", "PRECOGNITION", @@ -703,7 +703,7 @@ cptr k_info_flags4[] = /* * Object flags */ -cptr k_info_flags5[] = +static cptr k_info_flags5[] = { "TEMPORARY", "DRAIN_MANA", @@ -742,7 +742,7 @@ cptr k_info_flags5[] = /* * ESP flags */ -cptr esp_flags[] = +static cptr esp_flags[] = { "ESP_ORC", "ESP_TROLL", @@ -1011,7 +1011,7 @@ static cptr st_info_flags1[] = /* * Race flags */ -cptr rp_info_flags1[] = +static cptr rp_info_flags1[] = { "EXPERIMENTAL", "XXX", @@ -1050,7 +1050,7 @@ cptr rp_info_flags1[] = /* * Race flags */ -cptr rp_info_flags2[] = +static cptr rp_info_flags2[] = { "XXX", "ASTRAL", -- cgit v1.2.3 From 493333206ea94eb0592e52629a0a628fa34eb266 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Change dungeon_info_type to non-POD type --- src/dungeon_info_type.hpp | 116 ++++++++++++++++++++++++---------------------- src/init2.cc | 2 +- src/rule_type.hpp | 24 +++++----- 3 files changed, 74 insertions(+), 68 deletions(-) diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index b7b61a53..77c037a7 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -4,6 +4,8 @@ #include "rule_type.hpp" #include "obj_theme.hpp" +#include + /** * Maximum number of towns per dungeon */ @@ -12,60 +14,64 @@ constexpr int TOWN_DUNGEON = 4; /* A structure for the != dungeon types */ struct dungeon_info_type { - const char *name; /* Name */ - char *text; /* Description */ - char short_name[3]; /* Short name */ - - char generator[30]; /* Name of the level generator */ - - s16b floor1; /* Floor tile 1 */ - byte floor_percent1[2]; /* Chance of type 1 */ - s16b floor2; /* Floor tile 2 */ - byte floor_percent2[2]; /* Chance of type 2 */ - s16b floor3; /* Floor tile 3 */ - byte floor_percent3[2]; /* Chance of type 3 */ - s16b outer_wall; /* Outer wall tile */ - s16b inner_wall; /* Inner wall tile */ - s16b fill_type1; /* Cave tile 1 */ - byte fill_percent1[2]; /* Chance of type 1 */ - s16b fill_type2; /* Cave tile 2 */ - byte fill_percent2[2]; /* Chance of type 2 */ - s16b fill_type3; /* Cave tile 3 */ - byte fill_percent3[2]; /* Chance of type 3 */ - byte fill_method; /* Smoothing parameter for the above */ - - s16b mindepth; /* Minimal depth */ - s16b maxdepth; /* Maximal depth */ - - bool_ principal; /* If it's a part of the main dungeon */ - byte min_plev; /* Minimal plev needed to enter -- it's an anti-cheating mesure */ - - int min_m_alloc_level; /* Minimal number of monsters per level */ - int max_m_alloc_chance; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */ - - u32b flags1; /* Flags 1 */ - u32b flags2; /* Flags 1 */ - - int size_x, size_y; /* Desired numers of panels */ - - byte rule_percents[100]; /* Flat rule percents */ - rule_type rules[5]; /* Monster generation rules */ - - int final_object; /* The object you'll find at the bottom */ - int final_artifact; /* The artifact you'll find at the bottom */ - int final_guardian; /* The artifact's guardian. If an artifact is specified, then it's NEEDED */ - - int ix, iy, ox, oy; /* Wilderness coordinates of the entrance/output of the dungeon */ - - obj_theme objs; /* The drops type */ - - int d_dice[4]; /* Number of dices */ - int d_side[4]; /* Number of sides */ - int d_frequency[4]; /* Frequency of damage (1 is the minimum) */ - int d_type[4]; /* Type of damage */ - - s16b t_idx[TOWN_DUNGEON]; /* The towns */ - s16b t_level[TOWN_DUNGEON]; /* The towns levels */ - s16b t_num; /* Number of towns */ + const char *name = nullptr; /* Name */ + char *text = nullptr; /* Description */ + char short_name[3] = { 0 }; /* Short name */ + + char generator[30] = { 0 }; /* Name of the level generator */ + + s16b floor1 = 0; /* Floor tile 1 */ + byte floor_percent1[2] = { 0 }; /* Chance of type 1 */ + s16b floor2 = 0; /* Floor tile 2 */ + byte floor_percent2[2] = { 0 }; /* Chance of type 2 */ + s16b floor3 = 0; /* Floor tile 3 */ + byte floor_percent3[2] = { 0 }; /* Chance of type 3 */ + s16b outer_wall = 0; /* Outer wall tile */ + s16b inner_wall = 0; /* Inner wall tile */ + s16b fill_type1 = 0; /* Cave tile 1 */ + byte fill_percent1[2] = { 0 }; /* Chance of type 1 */ + s16b fill_type2 = 0; /* Cave tile 2 */ + byte fill_percent2[2] = { 0 }; /* Chance of type 2 */ + s16b fill_type3 = 0; /* Cave tile 3 */ + byte fill_percent3[2] = { 0 }; /* Chance of type 3 */ + byte fill_method = 0; /* Smoothing parameter for the above */ + + s16b mindepth = 0; /* Minimal depth */ + s16b maxdepth = 0; /* Maximal depth */ + + bool_ principal = 0; /* If it's a part of the main dungeon */ + byte min_plev = 0; /* Minimal plev needed to enter -- it's an anti-cheating mesure */ + + int min_m_alloc_level = 0; /* Minimal number of monsters per level */ + int max_m_alloc_chance = 0; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */ + + u32b flags1 = 0; /* Dungeon flags 1 */ + u32b flags2 = 0; /* Dungeon flags 2 */ + + int size_x = 0; + int size_y = 0; + + byte rule_percents[100] = {0}; /* Flat rule percents */ + std::array rules { }; /* Monster generation rules */ + + int final_object = 0; /* The object you'll find at the bottom */ + int final_artifact = 0; /* The artifact you'll find at the bottom */ + int final_guardian = 0; /* The artifact's guardian. If an artifact is specified, then it's NEEDED */ + + int ix = 0; /* Wilderness coordinates of entrance */ + int iy = 0; /* Wilderness coordinates of entrance */ + int ox = 0; /* Wilderness coordinates of exit */ + int oy = 0; /* Wilderness coordinates of exit */ + + obj_theme objs = obj_theme { 0, 0, 0, 0 }; /* The drops type */ + + int d_dice[4] = { 0 }; /* Number of dices */ + int d_side[4] = { 0 }; /* Number of sides */ + int d_frequency[4] = { 0 }; /* Frequency of damage (1 is the minimum) */ + int d_type[4] = { 0 }; /* Type of damage */ + + s16b t_idx[TOWN_DUNGEON] = { 0 }; /* The towns */ + s16b t_level[TOWN_DUNGEON] = { 0 }; /* The towns levels */ + s16b t_num = 0; /* Number of towns */ }; diff --git a/src/init2.cc b/src/init2.cc index ea85cb29..b921ddc9 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -436,7 +436,7 @@ namespace { static void allocate() { - d_info = make_array(max_d_idx); + d_info = new dungeon_info_type[max_d_idx]; } static errr parse(FILE *fp) diff --git a/src/rule_type.hpp b/src/rule_type.hpp index a8b35ffa..d2e510a7 100644 --- a/src/rule_type.hpp +++ b/src/rule_type.hpp @@ -5,18 +5,18 @@ /* Define monster generation rules */ struct rule_type { - byte mode; /* Mode of combination of the monster flags */ - byte percent; /* Percent of monsters affected by the rule */ + byte mode = 0; /* Mode of combination of the monster flags */ + byte percent = 0; /* Percent of monsters affected by the rule */ - u32b mflags1; /* The monster flags that are allowed */ - u32b mflags2; - u32b mflags3; - u32b mflags4; - u32b mflags5; - u32b mflags6; - u32b mflags7; - u32b mflags8; - u32b mflags9; + u32b mflags1 = 0; /* The monster flags that are allowed */ + u32b mflags2 = 0; + u32b mflags3 = 0; + u32b mflags4 = 0; + u32b mflags5 = 0; + u32b mflags6 = 0; + u32b mflags7 = 0; + u32b mflags8 = 0; + u32b mflags9 = 0; - char r_char[5]; /* Monster race allowed */ + char r_char[5] = { 0 }; /* Monster race allowed */ }; -- cgit v1.2.3 From 1a8a922f380a6401972f57beae602f3e8eca37e7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Fix grammar/spelling --- src/cmd2.cc | 2 +- src/dungeon.cc | 2 +- src/spells1.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd2.cc b/src/cmd2.cc index cfdeab44..8f4831bf 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -451,7 +451,7 @@ void do_cmd_go_down(void) if (dungeon_flags2 & DF2_NO_EASY_MOVE) { - msg_print("Some powerfull force prevents your from teleporting."); + msg_print("Some powerful force prevents your from teleporting."); return; } diff --git a/src/dungeon.cc b/src/dungeon.cc index bf14926e..bc3e4a71 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -2566,7 +2566,7 @@ static void process_world(void) } if ((dungeon_flags2 & DF2_NO_BREATH) && (!p_ptr->magical_breath)) { - cmsg_print(TERM_L_RED, "There is no air there! You suffocate!"); + cmsg_print(TERM_L_RED, "There is no air here! You suffocate!"); take_hit(damroll(3, p_ptr->lev), "suffocating"); } diff --git a/src/spells1.cc b/src/spells1.cc index 5d6722af..d1930ad2 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -886,7 +886,7 @@ void teleport_player_level(void) } if (dungeon_flags2 & DF2_NO_EASY_MOVE) { - msg_print("Some powerfull force prevents your from teleporting."); + msg_print("Some powerful force prevents your from teleporting."); return; } -- cgit v1.2.3 From c8df88d8c61197d8f019efa0ba373ed14a28d914 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Introduce new way of handling flags --- src/CMakeLists.txt | 1 + src/flag_set.hpp | 144 +++++++++++++++++++++++++++++++ src/include/tome/pp/global_constexpr.hpp | 21 +++++ tests/flag_set.cc | 85 ++++++++++++++++++ 4 files changed, 251 insertions(+) create mode 100644 src/flag_set.hpp create mode 100644 src/include/tome/pp/global_constexpr.hpp create mode 100644 tests/flag_set.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d942dfe..a68e056b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -118,6 +118,7 @@ SET(SRCS_TESTS ../tests/get_level_device.cc ../tests/harness.cc ../tests/lua_get_level.cc + ../tests/flag_set.cc ) ADD_LIBRARY(game diff --git a/src/flag_set.hpp b/src/flag_set.hpp new file mode 100644 index 00000000..cbc4e7aa --- /dev/null +++ b/src/flag_set.hpp @@ -0,0 +1,144 @@ +#pragma once + +#include +#include +#include + +#include "tome/pp/global_constexpr.hpp" + +/** + * Set of binary flags. + */ +template struct flag_set +{ +private: + static constexpr std::size_t tiers = Tiers; + std::uint32_t m_data[tiers]; + +public: + + constexpr flag_set() + : m_data { 0 } + { + // It is *extremely* important that there are absolutely + // NO dependencies on any global objects in here; lest we + // fall into SIOF territory; see DECLARE_FLAG_ZERO_IMPL + } + + // This method is a workaround for a a segmentation fault + // when compiling with GCC 5.3.0 (Arch Linux). We should be + // able to use make() directly in DECLARE_FLAG_MAKE_INIT, + // but GCC segfaults. + template static constexpr flag_set make_static() + { + static_assert(tier < tiers, "tier >= tiers"); + static_assert(index < 32, "index >= 32"); + flag_set f; + f.m_data[tier] = (1UL << index); + return f; + } + + static constexpr flag_set make(std::uint32_t tier, std::size_t index) + { + assert(tier < tiers); + assert(index < 32); + flag_set f; + f.m_data[tier] = (1UL << index); + return f; + } + + constexpr std::size_t size() const + { + return tiers; + } + + constexpr bool empty() const + { + for (std::size_t i = 0; i < tiers; i++) + { + if (m_data[i]) + { + return false; + } + } + return true; + } + + uint32_t &operator[](std::size_t i) + { + assert(i < tiers); + return m_data[i]; + } + + constexpr uint32_t const &operator [](std::size_t i) const + { + assert(i < tiers); + return m_data[i]; + } + + constexpr operator bool() const + { + return !empty(); + } + + flag_set &operator |= (flag_set const &other) + { + for (std::size_t i = 0; i < tiers; i++) + { + m_data[i] |= other.m_data[i]; + } + return *this; + } + + constexpr flag_set operator | (flag_set const &other) const + { + flag_set f; + for (std::size_t i = 0; i < tiers; i++) + { + f.m_data[i] = m_data[i] | other.m_data[i]; + } + return f; + } + + flag_set &operator &= (flag_set const &other) + { + for (std::size_t i = 0; i < tiers; i++) + { + m_data[i] &= other.m_data[i]; + } + return *this; + } + + constexpr flag_set operator & (flag_set const &other) const + { + flag_set f; + for (std::size_t i = 0; i < tiers; i++) + { + f.m_data[i] = m_data[i] & other.m_data[i]; + } + return f; + } + +}; + +// Implementation details, because preprocessor. +#define DECLARE_FLAG_MAKE_INIT(type, tier, index) \ + type::make_static() + +/** + * Macro for declaring a "flag" constant. + */ +#define DECLARE_FLAG(type, name, tier, index) \ + PP_GLOBAL_CONSTEXPR_CONST(type, name, DECLARE_FLAG_MAKE_INIT(type, tier, index)) + +/** + * Macro for declaring a zero'ed "flag" variable. + */ +#define DECLARE_FLAG_ZERO_INTF(type, name) \ + extern type name + +/** + * Macro for declaring the implementation of a zero'ed "flag" variable. + */ +#define DECLARE_FLAG_ZERO_IMPL(type, name) \ + type name { }; diff --git a/src/include/tome/pp/global_constexpr.hpp b/src/include/tome/pp/global_constexpr.hpp new file mode 100644 index 00000000..83168c59 --- /dev/null +++ b/src/include/tome/pp/global_constexpr.hpp @@ -0,0 +1,21 @@ +#pragma once + +/** + * Macro for declaring a global constexpr variable without + * violating the ODR and without running into the SIOF. + * + * Shamelessly cribbed from http://stackoverflow.com/a/20374473 + */ +#define PP_GLOBAL_CONSTEXPR_CONST(type, var, value) \ +namespace global_constexpr { namespace var { \ +template \ +struct wrapper \ +{ \ + static constexpr type var = value; \ +}; \ +template \ +constexpr type wrapper::var; \ +} } \ +namespace { \ +auto const& var = global_constexpr::var::wrapper<>::var; \ +} diff --git a/tests/flag_set.cc b/tests/flag_set.cc new file mode 100644 index 00000000..125d8a81 --- /dev/null +++ b/tests/flag_set.cc @@ -0,0 +1,85 @@ +#include "flag_set.hpp" +#include +using namespace bandit; + +// +// Tests +// + +go_bandit([]() { + + describe("flag_set", []() { + + // Convenience typedef + typedef flag_set<2> fs_t; + + it("make function should handle tier=0, index=31 properly", [&] { + // Setup + fs_t fs = fs_t::make(0, 31); + // Exercise + auto result = fs; + // Verify + AssertThat(result[0], Equals(2147483648UL)); + AssertThat(result[1], Equals(0UL)); + }); + + it("make function should handle tier=1, index=31 properly", [&] { + // Setup + fs_t fs = fs_t::make(1, 31); + // Exercise + auto result = fs; + // Verify + AssertThat(result[0], Equals(0UL)); + AssertThat(result[1], Equals(2147483648UL)); + }); + + it("make function should respect the tier and index", [&] { + // Exercise + fs_t fs = fs_t::make(1, 7); + // Verify + AssertThat(fs[0], Equals(0UL)); + AssertThat(fs[1], Equals(128UL)); + }); + + it("bool conversion should return false for zero flags", [&] { + // Setup + fs_t fs = fs_t(); + // Exercise + bool result = fs; + // Verify + AssertThat(result, Equals(false)); + }); + + it("bool conversion should return true for non-zero flags", [&] { + // Setup + fs_t fs = fs_t::make(1, 3); + // Exercise + bool result = fs; + // Verify + AssertThat(result, Equals(true)); + }); + + it("| operator should respect the tier and index", [&] { + // Setup + fs_t fs1 = fs_t::make(0, 31); + fs_t fs2 = fs_t::make(1, 3); + // Exercise + fs_t fs = fs1 | fs2; + // Verify + AssertThat(fs[0], Equals(2147483648UL)); + AssertThat(fs[1], Equals(8UL)); + }); + + it("& operator should respect the tier and index", [&] { + // Setup + fs_t fs = fs_t::make(0, 31) | fs_t::make(1, 3); + // Exercise + fs_t result = fs & fs; + // Verify + AssertThat(result[0], Equals(2147483648UL)); + AssertThat(result[1], Equals(8UL)); + }); + + }); + +}); -- cgit v1.2.3 From 899041ce6b7cbc33e8cb3124aaa54b518c4a4b72 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 29 Mar 2016 20:32:55 +0200 Subject: Convert dungeon_info_type to use new flag_set --- src/birth.cc | 3 +- src/cave.cc | 3 +- src/cmd2.cc | 19 +++++----- src/cmd4.cc | 7 ++-- src/cmd5.cc | 11 +++--- src/cmd6.cc | 9 +++-- src/cmd7.cc | 3 +- src/defines.h | 52 ------------------------- src/dungeon.cc | 35 ++++++++--------- src/dungeon_flag.hpp | 12 ++++++ src/dungeon_flag_list.hpp | 55 +++++++++++++++++++++++++++ src/dungeon_flag_set.hpp | 7 ++++ src/dungeon_info_type.hpp | 4 +- src/generate.cc | 89 +++++++++++++++++++++---------------------- src/init1.cc | 97 +++++------------------------------------------ src/init1.hpp | 3 +- src/levels.cc | 2 +- src/loadsave.cc | 22 +++++------ src/melee2.cc | 5 ++- src/monster2.cc | 13 ++++--- src/powers.cc | 7 ++-- src/q_betwen.cc | 3 +- src/q_dragons.cc | 3 +- src/q_evil.cc | 3 +- src/q_fireprof.cc | 3 +- src/q_god.cc | 94 ++++++++++++++++++++++++++++----------------- src/q_haunted.cc | 3 +- src/q_library.cc | 3 +- src/q_rand.cc | 13 ++++--- src/q_thief.cc | 3 +- src/q_wolves.cc | 3 +- src/spells1.cc | 19 +++++----- src/spells2.cc | 19 +++++----- src/traps.cc | 7 ++-- src/variable.cc | 4 +- src/variable.hpp | 4 +- src/xtra1.cc | 5 ++- 37 files changed, 319 insertions(+), 328 deletions(-) create mode 100644 src/dungeon_flag.hpp create mode 100644 src/dungeon_flag_list.hpp create mode 100644 src/dungeon_flag_set.hpp diff --git a/src/birth.cc b/src/birth.cc index 4c9ff06a..09dabe24 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -12,6 +12,7 @@ #include "corrupt.hpp" #include "cmd4.hpp" #include "cmd5.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.h" #include "files.hpp" @@ -3126,7 +3127,7 @@ void player_birth(void) d_ptr->t_idx[z] = 0; d_ptr->t_level[z] = 0; } - if (!(d_ptr->flags1 & DF1_RANDOM_TOWNS)) continue; + if (!(d_ptr->flags & DF_RANDOM_TOWNS)) continue; /* Can we add a town ? */ while (magik(TOWN_CHANCE - (num * 10))) diff --git a/src/cave.cc b/src/cave.cc index 5ff31019..4c5c4ae0 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -1,6 +1,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_enter_dungeon_in.hpp" #include "monster2.hpp" @@ -4467,7 +4468,7 @@ void disturb(int stop_search) static int random_quest_number() { if ((dun_level >= 1) && (dun_level < MAX_RANDOM_QUEST) && - (dungeon_flags1 & DF1_PRINCIPAL) && + (dungeon_flags & DF_PRINCIPAL) && (random_quests[dun_level].type) && (!random_quests[dun_level].done) && (!is_randhero(dun_level))) diff --git a/src/cmd2.cc b/src/cmd2.cc index 8f4831bf..023f49f7 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -13,6 +13,7 @@ #include "cave_type.hpp" #include "cmd1.hpp" #include "dungeon_info_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -160,7 +161,7 @@ void do_cmd_go_up(void) { go_up = TRUE; } - else if ((dungeon_flags2 & DF2_ASK_LEAVE)) + else if (dungeon_flags & DF_ASK_LEAVE) { go_up = get_check("Leave this unique level forever? "); } @@ -181,7 +182,7 @@ void do_cmd_go_up(void) { go_up = TRUE; } - else if ((dungeon_flags2 & DF2_ASK_LEAVE)) + else if (dungeon_flags & DF_ASK_LEAVE) { go_up = get_check("Leave this unique level forever? "); } @@ -200,7 +201,7 @@ void do_cmd_go_up(void) { leaving_quest = p_ptr->inside_quest; - if ((dungeon_flags2 & DF2_ASK_LEAVE) && + if ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? ")) return; @@ -214,12 +215,12 @@ void do_cmd_go_up(void) } /* Exits to previous area in flat terrains */ - else if (!(dungeon_flags1 & DF1_FLAT) && + else if (!(dungeon_flags & DF_FLAT) && p_ptr->prob_travel && !p_ptr->inside_quest) { if (d_ptr->mindepth == dun_level) return; - if (dungeon_flags2 & DF2_NO_EASY_MOVE) + if (dungeon_flags & DF_NO_EASY_MOVE) { msg_print("Some powerful force prevents your from teleporting."); return; @@ -366,7 +367,7 @@ void do_cmd_go_down(void) if (c_ptr->t_idx == TRAP_OF_SINKING) fall_trap = TRUE; /* test if on special level */ - if ((dungeon_flags2 & DF2_ASK_LEAVE)) + if (dungeon_flags & DF_ASK_LEAVE) { prt("Leave this unique level forever (y/n) ? ", 0, 0); flush(); @@ -444,12 +445,12 @@ void do_cmd_go_down(void) return; } - else if (!(dungeon_flags1 & DF1_FLAT) && + else if (!(dungeon_flags & DF_FLAT) && p_ptr->prob_travel && !p_ptr->inside_quest) { if (d_ptr->maxdepth == dun_level) return; - if (dungeon_flags2 & DF2_NO_EASY_MOVE) + if (dungeon_flags & DF_NO_EASY_MOVE) { msg_print("Some powerful force prevents your from teleporting."); return; @@ -4259,7 +4260,7 @@ static bool_ tport_vertically(bool_ how) return (FALSE); } - if (dungeon_flags2 & DF2_NO_EASY_MOVE) + if (dungeon_flags & DF_NO_EASY_MOVE) { msg_print("Some powerful force prevents you from teleporting."); return FALSE; diff --git a/src/cmd4.cc b/src/cmd4.cc index 9df90887..71ca24fe 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -10,6 +10,7 @@ #include "artifact_type.hpp" #include "cave_type.hpp" #include "corrupt.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "files.hpp" @@ -2722,7 +2723,7 @@ void do_cmd_feeling(void) if (feeling > 10) feeling = 10; /* Feeling of the fate */ - if (fate_flag && !(dungeon_flags2 & DF2_SPECIAL) && !p_ptr->inside_quest) + if (fate_flag && !(dungeon_flags & DF_SPECIAL) && !p_ptr->inside_quest) { msg_print("You feel that you will meet your fate here."); } @@ -2734,11 +2735,11 @@ void do_cmd_feeling(void) } /* No useful feeling in special levels */ - if (dungeon_flags2 & DF2_DESC) + if (dungeon_flags & DF_DESC) { char buf[1024]; - if ((get_dungeon_save(buf)) || (generate_special_feeling) || (dungeon_flags2 & DF2_DESC_ALWAYS)) + if (get_dungeon_save(buf) || generate_special_feeling || (dungeon_flags & DF_DESC_ALWAYS)) { if (!get_level_desc(buf)) msg_print("Someone forgot to describe this level!"); else msg_print(buf); diff --git a/src/cmd5.cc b/src/cmd5.cc index 986ed18f..6dccbc8c 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -12,6 +12,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "corrupt.hpp" +#include "dungeon_flag.hpp" #include "lua_bind.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -1586,7 +1587,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) /* BLINK */ case 68: { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); break; @@ -1600,7 +1601,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) /* TPORT */ case 69: { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); break; @@ -1616,7 +1617,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) { int ii, ij; - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); break; @@ -1644,7 +1645,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) /* TELE_AWAY */ case 71: { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); break; @@ -1661,7 +1662,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) /* TELE_LEVEL */ case 72: { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); break; diff --git a/src/cmd6.cc b/src/cmd6.cc index 16756331..24ede94f 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -14,6 +14,7 @@ #include "cmd1.hpp" #include "cmd7.hpp" #include "corrupt.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" #include "files.hpp" @@ -3127,7 +3128,7 @@ void do_cmd_read_scroll(void) case SV_SCROLL_WORD_OF_RECALL: { - if ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? ")) + if ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? ")) { used_up = FALSE; } @@ -4301,7 +4302,7 @@ void do_cmd_zap_rod(void) case SV_ROD_RECALL: { - if ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? ")) + if ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? ")) { use_charge = FALSE; } @@ -6849,7 +6850,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_DIM_DOOR: { if (!doit) return "dimension door every 100 turns"; - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("Not on special levels!"); break; @@ -6892,7 +6893,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_RECALL: { - if (!(dungeon_flags2 & DF2_ASK_LEAVE) || ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? "))) + if (!(dungeon_flags & DF_ASK_LEAVE) || ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? "))) { if (!doit) return "word of recall every 200 turns"; msg_print("It glows soft white..."); diff --git a/src/cmd7.cc b/src/cmd7.cc index 7b6cd8d2..6e7aefc3 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -13,6 +13,7 @@ #include "cmd1.hpp" #include "cmd5.hpp" #include "cmd6.hpp" +#include "dungeon_flag.hpp" #include "ego_item_type.hpp" #include "files.hpp" #include "hooks.hpp" @@ -531,7 +532,7 @@ void do_cmd_mindcraft(void) { int ii, ij; - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("Not on special levels!"); break; diff --git a/src/defines.h b/src/defines.h index 91d3065d..bcae8ae5 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2558,58 +2558,6 @@ #define FF1_ATTR_MULTI 0x00020000L #define FF1_SUPPORT_GROWTH 0x00040000L -/*** Dungeon type flags -- DG ***/ -#define DF1_PRINCIPAL 0x00000001L /* Is a principal dungeon */ -#define DF1_MAZE 0x00000002L /* Is a maze-type dungeon */ -#define DF1_SMALLEST 0x00000004L /* Creates VERY small levels like The Maze */ -#define DF1_SMALL 0x00000008L /* Creates small levels like Dol Goldor */ -#define DF1_BIG 0x00000010L /* Creates big levels like Moria, and Angband dungeons */ -#define DF1_NO_DOORS 0x00000020L /* No doors on rooms, like Barrowdowns, Old Forest etc) */ -#define DF1_WATER_RIVER 0x00000040L /* Allow a single water streamer on a level */ -#define DF1_LAVA_RIVER 0x00000080L /* Allow a single lava streamer on a level */ -#define DF1_WATER_RIVERS 0x00000100L /* Allow multiple water streamers on a level */ -#define DF1_LAVA_RIVERS 0x00000200L /* Allow multiple lava streamers on a level */ -#define DF1_CAVE 0x00000400L /* Allow rooms */ -#define DF1_CAVERN 0x00000800L /* Allow cavern rooms */ -#define DF1_NO_UP 0x00001000L /* Disallow up stairs */ -#define DF1_HOT 0x00002000L /* Corpses on ground and in pack decay quicker through heat */ -#define DF1_COLD 0x00004000L /* Corpses on ground and in pack decay quicker through cold */ -#define DF1_FORCE_DOWN 0x00008000L /* No up stairs generated */ -#define DF1_FORGET 0x00010000L /* Features are forgotten, like the Maze and Illusory Castle */ -#define DF1_NO_DESTROY 0x00020000L /* No destroyed levels in dungeon */ -#define DF1_SAND_VEIN 0x00040000L /* Like in the sandworm lair */ -#define DF1_CIRCULAR_ROOMS 0x00080000L /* Allow circular rooms */ -#define DF1_EMPTY 0x00100000L /* Allow arena levels */ -#define DF1_DAMAGE_FEAT 0x00200000L -#define DF1_FLAT 0x00400000L /* Creates paths to next areas at edge of level, like Barrowdowns */ -#define DF1_TOWER 0x00800000L /* You start at bottom and go up rather than the reverse */ -#define DF1_RANDOM_TOWNS 0x01000000L /* Allow random towns */ -#define DF1_DOUBLE 0x02000000L /* Creates double-walled dungeon like Helcaraxe and Erebor */ -#define DF1_LIFE_LEVEL 0x04000000L /* Creates dungeon level on modified 'game of life' algorithm */ -#define DF1_EVOLVE 0x08000000L /* Evolving, pulsing levels like Heart of the Earth */ -#define DF1_ADJUST_LEVEL_1 0x10000000L /* Minimum monster level will be equal to dungeon level */ -#define DF1_ADJUST_LEVEL_2 0x20000000L /* Minimum monster level will be double the dungeon level */ -#define DF1_NO_RECALL 0x40000000L /* No recall allowed */ -#define DF1_NO_STREAMERS 0x80000000L /* No streamers */ - -#define DF2_ADJUST_LEVEL_1_2 0x00000001L /* Minimum monster level will be half the dungeon level */ -#define DF2_NO_SHAFT 0x00000002L /* No shafts */ -#define DF2_ADJUST_LEVEL_PLAYER 0x00000004L /* Uses player level*2 instead of dungeon level for other ADJUST_LEVEL flags */ -#define DF2_NO_TELEPORT 0x00000008L -#define DF2_ASK_LEAVE 0x00000010L -#define DF2_NO_STAIR 0x00000020L -#define DF2_SPECIAL 0x00000040L -#define DF2_NO_NEW_MONSTER 0x00000080L -#define DF2_DESC 0x00000100L -#define DF2_NO_GENO 0x00000200L -#define DF2_NO_BREATH 0x00000400L /* Oups, cannot breath here */ -#define DF2_WATER_BREATH 0x00000800L /* Oups, cannot breath here, need water breathing */ -#define DF2_ELVEN 0x00001000L /* Try to create elven monster ego */ -#define DF2_DWARVEN 0x00002000L /* Try to create dwarven monster ego */ -#define DF2_NO_EASY_MOVE 0x00004000L /* Forbid stuff like teleport level, probability travel, ... */ -#define DF2_NO_RECALL_OUT 0x00008000L /* Cannot recall out of the place */ -#define DF2_DESC_ALWAYS 0x00010000L /* Always shows the desc */ - /*** Town flags ***/ #define TOWN_REAL 0x01 /* Town is really present */ #define TOWN_KNOWN 0x02 /* Town is found by the player */ diff --git a/src/dungeon.cc b/src/dungeon.cc index bc3e4a71..b2592979 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -20,6 +20,7 @@ #include "cmd6.hpp" #include "cmd7.hpp" #include "corrupt.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "files.h" @@ -1402,7 +1403,7 @@ static void process_world(void) (rand_int(d_info[(dun_level) ? dungeon_type : DUNGEON_WILDERNESS].max_m_alloc_chance) == 0)) { /* Make a new monster */ - if (!(dungeon_flags2 & DF2_NO_NEW_MONSTER)) + if (!(dungeon_flags & DF_NO_NEW_MONSTER)) { (void)alloc_monster(MAX_SIGHT + 5, FALSE); } @@ -2326,7 +2327,7 @@ static void process_world(void) { int l, dam = 0; - if (!(dungeon_flags1 & DF1_DAMAGE_FEAT)) + if (!(dungeon_flags & DF_DAMAGE_FEAT)) { /* If the grid is empty, skip it */ if ((cave[j][k].o_idxs.empty()) && @@ -2559,12 +2560,12 @@ static void process_world(void) } /* Arg cannot breath? */ - if ((dungeon_flags2 & DF2_WATER_BREATH) && (!p_ptr->water_breath)) + if ((dungeon_flags & DF_WATER_BREATH) && (!p_ptr->water_breath)) { cmsg_print(TERM_L_RED, "You cannot breathe water! You suffocate!"); take_hit(damroll(3, p_ptr->lev), "suffocating"); } - if ((dungeon_flags2 & DF2_NO_BREATH) && (!p_ptr->magical_breath)) + if ((dungeon_flags & DF_NO_BREATH) && (!p_ptr->magical_breath)) { cmsg_print(TERM_L_RED, "There is no air here! You suffocate!"); take_hit(damroll(3, p_ptr->lev), "suffocating"); @@ -2922,11 +2923,11 @@ static void process_world(void) { if (o_ptr->timeout > 0) { - if (dungeon_flags1 & DF1_HOT) + if (dungeon_flags & DF_HOT) { o_ptr->pval -= 2; } - else if ((dungeon_flags1 & DF1_COLD) && rand_int(2)) + else if ((dungeon_flags & DF_COLD) && rand_int(2)) { if (magik(50)) o_ptr->pval--; } @@ -3040,11 +3041,11 @@ static void process_world(void) { if (o_ptr->timeout > 0) { - if (dungeon_flags1 & DF1_HOT) + if (dungeon_flags & DF_HOT) { o_ptr->pval -= 2; } - else if ((dungeon_flags1 & DF1_COLD) && rand_int(2)) + else if ((dungeon_flags & DF_COLD) && rand_int(2)) { if (magik(50)) o_ptr->pval--; } @@ -3098,7 +3099,7 @@ static void process_world(void) } /* No recall. sorry */ - else if (dungeon_flags2 & DF2_NO_RECALL_OUT) + else if (dungeon_flags & DF_NO_RECALL_OUT) { cmsg_print(TERM_L_DARK, "You cannot recall from here."); p_ptr->word_recall = 0; @@ -4651,7 +4652,7 @@ static void process_player(void) * * Forget everything when requested hehe I'm *NASTY* */ - if (dun_level && (dungeon_flags1 & DF1_FORGET)) + if (dun_level && (dungeon_flags & DF_FORGET)) { wiz_dark(); } @@ -4736,8 +4737,8 @@ static void dungeon(void) if (!dungeon_stair) create_down_shaft = create_up_shaft = FALSE; /* no connecting stairs on special levels */ - if (!(dungeon_flags2 & DF2_NO_STAIR)) create_down_stair = create_up_stair = FALSE; - if (!(dungeon_flags2 & DF2_NO_STAIR)) create_down_shaft = create_up_shaft = FALSE; + if (!(dungeon_flags & DF_NO_STAIR)) create_down_stair = create_up_stair = FALSE; + if (!(dungeon_flags & DF_NO_STAIR)) create_down_shaft = create_up_shaft = FALSE; /* Make a stairway. */ if ((create_up_stair || create_down_stair || @@ -4753,19 +4754,19 @@ static void dungeon(void) /* Make stairs */ if (create_down_stair) { - cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_MORE); + cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_MORE); } else if (create_down_shaft) { - cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN); + cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN); } else if (create_up_shaft) { - cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP); + cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP); } else { - cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_LESS); + cave_set_feat(p_ptr->py, p_ptr->px, (dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_LESS); } } @@ -4981,7 +4982,7 @@ static void dungeon(void) process_hooks_new(HOOK_END_TURN, NULL, NULL); /* Make it pulsate and live !!!! */ - if ((dungeon_flags1 & DF1_EVOLVE) && dun_level) + if ((dungeon_flags & DF_EVOLVE) && dun_level) { if (!(turn % 10)) evolve_level(TRUE); } diff --git a/src/dungeon_flag.hpp b/src/dungeon_flag.hpp new file mode 100644 index 00000000..bf8d77d8 --- /dev/null +++ b/src/dungeon_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "dungeon_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define DF(tier, index, name) \ + DECLARE_FLAG(dungeon_flag_set, BOOST_PP_CAT(DF_,name), tier, index) +#include "dungeon_flag_list.hpp" +#undef DF diff --git a/src/dungeon_flag_list.hpp b/src/dungeon_flag_list.hpp new file mode 100644 index 00000000..8fdefc95 --- /dev/null +++ b/src/dungeon_flag_list.hpp @@ -0,0 +1,55 @@ +/** + * X-macro list of all the dungeon flags + */ + +/* DF(, , ) */ +DF(1, 0, PRINCIPAL) +DF(1, 1, MAZE) +DF(1, 2, SMALLEST) +DF(1, 3, SMALL) +DF(1, 4, BIG) +DF(1, 5, NO_DOORS) +DF(1, 6, WATER_RIVER) +DF(1, 7, LAVA_RIVER) +DF(1, 8, WATER_RIVERS) +DF(1, 9, LAVA_RIVERS) +DF(1, 10, CAVE) +DF(1, 11, CAVERN) +DF(1, 12, NO_UP) +DF(1, 13, HOT) +DF(1, 14, COLD) +DF(1, 15, FORCE_DOWN) +DF(1, 16, FORGET) +DF(1, 17, NO_DESTROY) +DF(1, 18, SAND_VEIN) +DF(1, 19, CIRCULAR_ROOMS) +DF(1, 20, EMPTY) +DF(1, 21, DAMAGE_FEAT) +DF(1, 22, FLAT) +DF(1, 23, TOWER) +DF(1, 24, RANDOM_TOWNS) +DF(1, 25, DOUBLE) +DF(1, 26, LIFE_LEVEL) +DF(1, 27, EVOLVE) +DF(1, 28, ADJUST_LEVEL_1) +DF(1, 29, ADJUST_LEVEL_2) +DF(1, 30, NO_RECALL) +DF(1, 31, NO_STREAMERS) + +DF(2, 0, ADJUST_LEVEL_1_2) +DF(2, 1, NO_SHAFT) +DF(2, 2, ADJUST_LEVEL_PLAYER) +DF(2, 3, NO_TELEPORT) +DF(2, 4, ASK_LEAVE) +DF(2, 5, NO_STAIR) +DF(2, 6, SPECIAL) +DF(2, 7, NO_NEW_MONSTER) +DF(2, 8, DESC) +DF(2, 9, NO_GENO) +DF(2, 10, NO_BREATH) +DF(2, 11, WATER_BREATH) +DF(2, 12, ELVEN) +DF(2, 13, DWARVEN) +DF(2, 14, NO_EASY_MOVE) +DF(2, 15, NO_RECALL_OUT) +DF(2, 16, DESC_ALWAYS) diff --git a/src/dungeon_flag_set.hpp b/src/dungeon_flag_set.hpp new file mode 100644 index 00000000..539a574a --- /dev/null +++ b/src/dungeon_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t DF_MAX_TIERS = 2; + +typedef flag_set dungeon_flag_set; diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index 77c037a7..c4edc770 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -3,6 +3,7 @@ #include "h-basic.h" #include "rule_type.hpp" #include "obj_theme.hpp" +#include "dungeon_flag_set.hpp" #include @@ -45,8 +46,7 @@ struct dungeon_info_type int min_m_alloc_level = 0; /* Minimal number of monsters per level */ int max_m_alloc_chance = 0; /* There is a 1/max_m_alloc_chance chance per round of creating a new monster */ - u32b flags1 = 0; /* Dungeon flags 1 */ - u32b flags2 = 0; /* Dungeon flags 2 */ + dungeon_flag_set flags { }; /* Dungeon flags */ int size_x = 0; int size_y = 0; diff --git a/src/generate.cc b/src/generate.cc index 250686fd..ca0022e1 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -12,6 +12,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_info_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_build_room1_in.hpp" #include "hooks.hpp" @@ -406,7 +407,7 @@ static void place_up_stairs(int y, int x) cave_type *c_ptr = &cave[y][x]; /* Create up stairs */ - if ((rand_int(3) != 0) || (dungeon_flags2 & DF2_NO_SHAFT)) + if ((rand_int(3) != 0) || (dungeon_flags & DF_NO_SHAFT)) { cave_set_feat(y, x, FEAT_LESS); } @@ -431,7 +432,7 @@ static void place_down_stairs(int y, int x) * All thoses tests are necesary because a shaft can jump up to 4 levels */ if ((dun_level + 4 > d_info[dungeon_type].maxdepth) || - (rand_int(3) != 0) || (dungeon_flags2 & DF2_NO_SHAFT)) + (rand_int(3) != 0) || (dungeon_flags & DF_NO_SHAFT)) { cave_set_feat(y, x, FEAT_MORE); } @@ -706,7 +707,7 @@ bool_ new_player_spot(int branch) int max_attempts = 5000; /* Place the player */ - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { place_new_way(&y, &x); } @@ -739,13 +740,13 @@ bool_ new_player_spot(int branch) p_ptr->px = x; /* XXX XXX XXX */ - if (dungeon_stair && !(dungeon_flags2 & DF2_NO_STAIR) && dun_level && + if (dungeon_stair && !(dungeon_flags & DF_NO_STAIR) && dun_level && (!is_quest(dun_level) || (old_dun_level < dun_level)) && !branch) { if (old_dun_level < dun_level) { place_up_stairs(p_ptr->py , p_ptr->px); - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { cave_set_feat(p_ptr->py, p_ptr->px, FEAT_WAY_LESS); } @@ -753,7 +754,7 @@ bool_ new_player_spot(int branch) else { place_down_stairs(p_ptr->py , p_ptr->px); - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { cave_set_feat(p_ptr->py, p_ptr->px, FEAT_WAY_MORE); } @@ -1024,7 +1025,7 @@ static void alloc_stairs(int feat, int num, int walls, int branch) /* Try several times, then decrease "walls" */ for (j = 0; j <= SAFE_MAX_ATTEMPTS; j++) { - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { place_new_way(&y, &x); } @@ -1045,11 +1046,11 @@ static void alloc_stairs(int feat, int num, int walls, int branch) if (!dun_level) { /* Clear previous contents, add down stairs */ - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { cave_set_feat(y, x, FEAT_WAY_MORE); } - else if ((rand_int(3) == 0) && (!(dungeon_flags2 & DF2_NO_SHAFT))) + else if ((rand_int(3) == 0) && (!(dungeon_flags & DF_NO_SHAFT))) { cave_set_feat(y, x, FEAT_SHAFT_DOWN); } @@ -1062,14 +1063,14 @@ static void alloc_stairs(int feat, int num, int walls, int branch) /* Quest -- must go up */ else if ((is_quest(dun_level) && (dun_level >= 1)) || ((dun_level >= d_info[dungeon_type].maxdepth) && - (!(dungeon_flags1 & DF1_FORCE_DOWN)))) + (!(dungeon_flags & DF_FORCE_DOWN)))) { /* Clear previous contents, add up stairs */ - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { cave_set_feat(y, x, FEAT_WAY_LESS); } - else if ((rand_int(3) == 0) && (!(dungeon_flags2 & DF2_NO_SHAFT))) + else if ((rand_int(3) == 0) && (!(dungeon_flags & DF_NO_SHAFT))) { cave_set_feat(y, x, FEAT_SHAFT_UP); } @@ -1726,7 +1727,7 @@ static void check_room_boundary(int x1, int y1, int x2, int y2) bool_ old_is_floor, new_is_floor; /* Avoid doing this in irrelevant places -- pelpel */ - if (!(dungeon_flags1 & DF1_CAVERN)) return; + if (!(dungeon_flags & DF_CAVERN)) return; /* Initialize */ count = 0; @@ -6359,7 +6360,7 @@ static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water) place_floor(y, x); /* Occasional doorway */ - if (!(dungeon_flags1 & DF1_NO_DOORS) && + if (!(dungeon_flags & DF_NO_DOORS) && (rand_int(100) < DUN_TUN_PEN)) { /* Place a random door */ @@ -6463,7 +6464,7 @@ static void try_doors(int y, int x) /* if (!in_bounds(y, x)) return; */ /* Some dungeons don't have doors at all */ - if (dungeon_flags1 & (DF1_NO_DOORS)) return; + if (dungeon_flags & DF_NO_DOORS) return; /* Reset tally */ n = 0; @@ -6703,7 +6704,7 @@ bool_ level_generate_dungeon() } /* Check for arena level */ - if ((dungeon_flags1 & (DF1_EMPTY)) || + if ((dungeon_flags & DF_EMPTY) || (empty_levels && (rand_int(EMPTY_LEVEL) == 0))) { empty_level = TRUE; @@ -6718,7 +6719,7 @@ bool_ level_generate_dungeon() } /* Possible cavern */ - if ((dungeon_flags1 & DF1_CAVERN) && (rand_int(dun_level / 2) > DUN_CAVERN)) + if ((dungeon_flags & DF_CAVERN) && (rand_int(dun_level / 2) > DUN_CAVERN)) { cavern = TRUE; @@ -6744,7 +6745,7 @@ bool_ level_generate_dungeon() if ((cur_wid != MAX_WID) || (cur_hgt != MAX_HGT)) destroyed = FALSE; /* Hack -- No destroyed levels */ - if (dungeon_flags1 & DF1_NO_DESTROY) destroyed = FALSE; + if (dungeon_flags & DF_NO_DESTROY) destroyed = FALSE; /* Actual maximum number of rooms on this level */ dun->row_rooms = cur_hgt / BLOCK_HGT; @@ -6819,7 +6820,7 @@ bool_ level_generate_dungeon() else { /* Attempt a "trivial" room */ - if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) && + if ((dungeon_flags & DF_CIRCULAR_ROOMS) && room_build(y, x, 9)) { continue; @@ -6894,7 +6895,7 @@ bool_ level_generate_dungeon() /* Hack - build standard rectangular rooms if needed */ if (k < 90) { - if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) && room_build(y, x, 1)) continue; + if ((dungeon_flags & DF_CIRCULAR_ROOMS) && room_build(y, x, 1)) continue; else if (room_build(y, x, 9)) continue; } @@ -6903,13 +6904,13 @@ bool_ level_generate_dungeon() } /* Attempt a trivial room */ - if (dungeon_flags1 & DF1_CAVE) + if (dungeon_flags & DF_CAVE) { if (room_build(y, x, 10)) continue; } else { - if ((dungeon_flags1 & DF1_CIRCULAR_ROOMS) && room_build(y, x, 9)) continue; + if ((dungeon_flags & DF_CIRCULAR_ROOMS) && room_build(y, x, 9)) continue; else if (room_build(y, x, 1)) continue; } } @@ -6993,7 +6994,7 @@ bool_ level_generate_dungeon() } /* Add some sand streamers */ - if ((dungeon_flags1 & DF1_SAND_VEIN) && !rand_int(4)) + if ((dungeon_flags & DF_SAND_VEIN) && !rand_int(4)) { if ((cheat_room) || (p_ptr->precognition)) msg_print("Sand vein."); build_streamer(FEAT_SANDWALL, DUN_STR_SC); @@ -7009,18 +7010,18 @@ bool_ level_generate_dungeon() } /* Hack -- Add some rivers if requested */ - if ((dungeon_flags1 & DF1_WATER_RIVER) && !rand_int(4)) + if ((dungeon_flags & DF_WATER_RIVER) && !rand_int(4)) { if (cheat_room || p_ptr->precognition) msg_print("River of water."); add_river(FEAT_DEEP_WATER, FEAT_SHAL_WATER); } - if ((dungeon_flags1 & DF1_LAVA_RIVER) && !rand_int(4)) + if ((dungeon_flags & DF_LAVA_RIVER) && !rand_int(4)) { if ((cheat_room) || (p_ptr->precognition)) msg_print("River of lava."); add_river(FEAT_DEEP_LAVA, FEAT_SHAL_LAVA); } - if (dungeon_flags1 & DF1_WATER_RIVERS) + if (dungeon_flags & DF_WATER_RIVERS) { int max = 3 + rand_int(2); bool_ said = FALSE; @@ -7036,7 +7037,7 @@ bool_ level_generate_dungeon() } } - if (dungeon_flags1 & DF1_LAVA_RIVERS) + if (dungeon_flags & DF_LAVA_RIVERS) { int max = 2 + rand_int(2); bool_ said = FALSE; @@ -7053,7 +7054,7 @@ bool_ level_generate_dungeon() } /* Add streamers of trees, water, or lava -KMW- */ - if (!(dungeon_flags1 & DF1_NO_STREAMERS)) + if (!(dungeon_flags & DF_NO_STREAMERS)) { int num; @@ -7062,7 +7063,7 @@ bool_ level_generate_dungeon() * * Small trees (penetrate walls) */ - if ((dungeon_flags1 & DF1_FLAT) && (randint(20) > 15)) + if ((dungeon_flags & DF_FLAT) && (randint(20) > 15)) { num = randint(DUN_STR_QUA); @@ -7599,7 +7600,7 @@ static bool_ cave_gen(void) * width/height, generate the dungeon normally, then double it * in both directions */ - if (dungeon_flags1 & DF1_DOUBLE) + if (dungeon_flags & DF_DOUBLE) { cur_wid /= 2; cur_hgt /= 2; @@ -7662,22 +7663,22 @@ static bool_ cave_gen(void) alloc_stairs(FEAT_LESS, 5, 3, branch); } - if ((dun_level < d_ptr->maxdepth) || ((dun_level == d_ptr->maxdepth) && (dungeon_flags1 & DF1_FORCE_DOWN))) + if ((dun_level < d_ptr->maxdepth) || ((dun_level == d_ptr->maxdepth) && (dungeon_flags & DF_FORCE_DOWN))) { /* Place 3 or 4 down stairs near some walls */ - alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_MORE, rand_range(3, 4), 3, 0); + alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_MORE, rand_range(3, 4), 3, 0); /* Place 0 or 1 down shafts near some walls */ - if (!(dungeon_flags2 & DF2_NO_SHAFT)) alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN, rand_range(0, 1), 3, 0); + if (!(dungeon_flags & DF_NO_SHAFT)) alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_MORE : FEAT_SHAFT_DOWN, rand_range(0, 1), 3, 0); } - if ((dun_level > d_ptr->mindepth) || ((dun_level == d_ptr->mindepth) && (!(dungeon_flags1 & DF1_NO_UP)))) + if ((dun_level > d_ptr->mindepth) || ((dun_level == d_ptr->mindepth) && (!(dungeon_flags & DF_NO_UP)))) { /* Place 1 or 2 up stairs near some walls */ - alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_LESS, rand_range(1, 2), 3, 0); + alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_LESS, rand_range(1, 2), 3, 0); /* Place 0 or 1 up shafts near some walls */ - if (!(dungeon_flags2 & DF2_NO_SHAFT)) alloc_stairs((dungeon_flags1 & DF1_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP, rand_range(0, 1), 3, 0); + if (!(dungeon_flags & DF_NO_SHAFT)) alloc_stairs((dungeon_flags & DF_FLAT) ? FEAT_WAY_LESS : FEAT_SHAFT_UP, rand_range(0, 1), 3, 0); } } @@ -8051,7 +8052,7 @@ static bool_ cave_gen(void) wiz_lite(); /* Now double the generated dungeon */ - if (dungeon_flags1 & DF1_DOUBLE) + if (dungeon_flags & DF_DOUBLE) { /* * We begin at the bottom-right corner and move upwards @@ -8266,13 +8267,11 @@ void generate_cave(void) /* Initialize the flags with the basic dungeon flags */ if (!dun_level) { - dungeon_flags1 = d_info[DUNGEON_WILDERNESS].flags1; - dungeon_flags2 = d_info[DUNGEON_WILDERNESS].flags2; + dungeon_flags = d_info[DUNGEON_WILDERNESS].flags; } else { - dungeon_flags1 = d_ptr->flags1; - dungeon_flags2 = d_ptr->flags2; + dungeon_flags = d_ptr->flags; } /* Is it a town level ? */ @@ -8462,8 +8461,8 @@ void generate_cave(void) } } /* Very small (1 x 1 panel) level */ - else if (!(dungeon_flags1 & DF1_BIG) && - (dungeon_flags1 & DF1_SMALLEST)) + else if (!(dungeon_flags & DF_BIG) && + (dungeon_flags & DF_SMALLEST)) { if (cheat_room || p_ptr->precognition) { @@ -8488,9 +8487,9 @@ void generate_cave(void) } /* Small level */ - else if (!(dungeon_flags1 & DF1_BIG) && + else if (!(dungeon_flags & DF_BIG) && (always_small_level || - (dungeon_flags1 & DF1_SMALL) || + (dungeon_flags & DF_SMALL) || (small_levels && rand_int(SMALL_LEVEL) == 0))) { if (cheat_room || p_ptr->precognition) diff --git a/src/init1.cc b/src/init1.cc index 03966464..7ff179fb 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5,6 +5,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_info_type.hpp" +#include "dungeon_flag.hpp" #include "ego_item_type.hpp" #include "feature_type.hpp" #include "files.hpp" @@ -855,81 +856,6 @@ static cptr f_info_flags1[] = "XXX1" }; -/* - * Dungeon flags - */ -static cptr d_info_flags1[] = -{ - "PRINCIPAL", - "MAZE", - "SMALLEST", - "SMALL", - "BIG", - "NO_DOORS", - "WATER_RIVER", - "LAVA_RIVER", - "WATER_RIVERS", - "LAVA_RIVERS", - "CAVE", - "CAVERN", - "NO_UP", - "HOT", - "COLD", - "FORCE_DOWN", - "FORGET", - "NO_DESTROY", - "SAND_VEIN", - "CIRCULAR_ROOMS", - "EMPTY", - "DAMAGE_FEAT", - "FLAT", - "TOWER", - "RANDOM_TOWNS", - "DOUBLE", - "LIFE_LEVEL", - "EVOLVE", - "ADJUST_LEVEL_1", - "ADJUST_LEVEL_2", - "NO_RECALL", - "NO_STREAMERS" -}; - -static cptr d_info_flags2[] = -{ - "ADJUST_LEVEL_1_2", - "NO_SHAFT", - "ADJUST_LEVEL_PLAYER", - "NO_TELEPORT", - "ASK_LEAVE", - "NO_STAIR", - "SPECIAL", - "NO_NEW_MONSTER", - "DESC", - "NO_GENO", - "NO_BREATH", - "WATER_BREATH", - "ELVEN", - "DWARVEN", - "NO_EASY_MOVE", - "NO_RECALL_OUT", - "DESC_ALWAYS", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1" -}; - /* * Trap flags */ @@ -6585,20 +6511,15 @@ errr init_t_info_txt(FILE *fp) return (0); } -/* - * Grab one flag for a dungeon type from a textual string - */ -errr grab_one_dungeon_flag(u32b *f1, u32b *f2, cptr what) +errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str) { - if (lookup_flags(what, - flag_tie(f1, d_info_flags1), - flag_tie(f2, d_info_flags2))) - { - return (0); - } +#define DF(tier, index, name) \ + if (streq(str, #name)) { *flags |= DF_##name; return 0; } +#include "dungeon_flag_list.hpp" +#undef DF /* Oops */ - msg_format("Unknown dungeon type flag '%s'.", what); + msg_format("Unknown dungeon type flag '%s'.", str); /* Failure */ return (1); @@ -7013,7 +6934,7 @@ errr init_d_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_dungeon_flag(&(d_ptr->flags1), &(d_ptr->flags2), s)) + if (0 != grab_one_dungeon_flag(&d_ptr->flags, s)) { return (5); } @@ -8044,7 +7965,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst } /* Parse this entry */ - if (0 != grab_one_dungeon_flag(&dungeon_flags1, &dungeon_flags2, s)) return 1; + if (0 != grab_one_dungeon_flag(&dungeon_flags, s)) return 1; /* Start the next entry */ s = t; diff --git a/src/init1.hpp b/src/init1.hpp index 766e467d..3f0198a7 100644 --- a/src/init1.hpp +++ b/src/init1.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "dungeon_flag_set.hpp" extern int color_char_to_attr(char c); extern byte conv_color[16]; @@ -22,5 +23,5 @@ extern errr init_ba_info_txt(FILE *fp); extern errr init_st_info_txt(FILE *fp); extern errr init_ow_info_txt(FILE *fp); extern errr init_wf_info_txt(FILE *fp); -extern errr grab_one_dungeon_flag(u32b *flags1, u32b *flags2, cptr what); +extern errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str); extern errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full); diff --git a/src/levels.cc b/src/levels.cc index ac3aa3d3..726ebd1a 100644 --- a/src/levels.cc +++ b/src/levels.cc @@ -213,7 +213,7 @@ void get_level_flags() } /* Parse this entry */ - if (0 != grab_one_dungeon_flag(&dungeon_flags1, &dungeon_flags2, s)) return; + if (0 != grab_one_dungeon_flag(&dungeon_flags, s)) return; /* Start the next entry */ s = t; diff --git a/src/loadsave.cc b/src/loadsave.cc index d358e271..6b3ad713 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1311,8 +1311,6 @@ static void my_sentinel(const char *place, u16b value, ls_flag_t flag) */ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { - int i; - cave_type *c_ptr; /* Read specific */ @@ -1331,8 +1329,10 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) do_s16b(&max_panel_rows, flag); do_s16b(&max_panel_cols, flag); - do_u32b(&dungeon_flags1, flag); - do_u32b(&dungeon_flags2, flag); + for (std::size_t i = 0; i < dungeon_flags.size(); i++) + { + do_u32b(&dungeon_flags[i], flag); + } /* Last teleportation */ do_s16b(&last_teleportation_y, flag); @@ -1347,7 +1347,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) quit("Too many spell effects"); } - for (i = 0; i < tmp16b; ++i) + for (std::size_t i = 0; i < tmp16b; ++i) { do_s16b(&effects[i].type, flag); do_s16b(&effects[i].dam, flag); @@ -1359,7 +1359,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* TO prevent bugs with evolving dungeons */ - for (i = 0; i < 100; i++) + for (std::size_t i = 0; i < 100; i++) { do_s16b(&floor_type[i], flag); do_s16b(&fill_type[i], flag); @@ -1393,7 +1393,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) if (no_companions) { - for (i = 1; i < o_max; i++) + for (int i = 1; i < o_max; i++) { object_type *o_ptr = &o_list[i]; @@ -1418,7 +1418,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* Dungeon items */ - for (i = 1; i < tmp16b; i++) + for (int i = 1; i < tmp16b; i++) { int o_idx; @@ -1481,7 +1481,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) if (no_companions) { - for (i = 1; i < m_max; i++) + for (int i = 1; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; @@ -1506,7 +1506,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) } /* Read the monsters */ - for (i = 1; i < tmp16b; i++) + for (int i = 1; i < tmp16b; i++) { int m_idx; monster_type *m_ptr; @@ -1569,7 +1569,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) note(format("Too many (%d) monster entries!", tmp16b)); return (FALSE); } - for (i = 1; i < tmp16b; i++) + for (std::size_t i = 1; i < tmp16b; i++) { monster_type *m_ptr; diff --git a/src/melee2.cc b/src/melee2.cc index 5a643132..e4f0802a 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -16,6 +16,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "cmd1.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "hook_mon_speak_in.hpp" @@ -2259,7 +2260,7 @@ static bool_ monst_spell_monst(int m_idx) /* RF6_TPORT */ case 160 + 5: { - if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ else { if (disturb_other) disturb(1); @@ -2279,7 +2280,7 @@ static bool_ monst_spell_monst(int m_idx) /* RF6_TELE_AWAY */ case 160 + 7: { - if (dungeon_flags2 & DF2_NO_TELEPORT) break; + if (dungeon_flags & DF_NO_TELEPORT) break; if (!direct) break; else diff --git a/src/monster2.cc b/src/monster2.cc index 4649f446..e166950f 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -11,6 +11,7 @@ #include "artifact_type.hpp" #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" #include "hook_new_monster_in.hpp" @@ -215,7 +216,7 @@ static int pick_ego_monster(monster_race const *r_ptr) int tries = max_re_idx + 10; monster_ego *re_ptr; - if ((!(dungeon_flags2 & DF2_ELVEN)) && (!(dungeon_flags2 & DF2_DWARVEN))) + if ((!(dungeon_flags & DF_ELVEN)) && (!(dungeon_flags & DF_DWARVEN))) { /* No townspeople ego */ if (!r_ptr->level) return 0; @@ -250,9 +251,9 @@ static int pick_ego_monster(monster_race const *r_ptr) /* Bypass restrictions for themed townspeople */ else { - if (dungeon_flags2 & DF2_ELVEN) + if (dungeon_flags & DF_ELVEN) ego = test_mego_name("Elven"); - else if (dungeon_flags2 & DF2_DWARVEN) + else if (dungeon_flags & DF_DWARVEN) ego = test_mego_name("Dwarven"); if (mego_ok(r_ptr, ego)) @@ -2548,18 +2549,18 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } - if (dungeon_flags2 & DF2_ADJUST_LEVEL_1_2) + if (dungeon_flags & DF_ADJUST_LEVEL_1_2) { min_level = max_level = dun_level / 2; add_level = TRUE; } - if (dungeon_flags1 & DF1_ADJUST_LEVEL_1) + if (dungeon_flags & DF_ADJUST_LEVEL_1) { if (!min_level) min_level = dun_level; max_level = dun_level; add_level = TRUE; } - if (dungeon_flags1 & DF1_ADJUST_LEVEL_2) + if (dungeon_flags & DF_ADJUST_LEVEL_2) { if (!min_level) min_level = dun_level * 2; max_level = dun_level * 2; diff --git a/src/powers.cc b/src/powers.cc index a7db2968..632fb338 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -13,6 +13,7 @@ #include "cmd1.hpp" #include "cmd2.hpp" #include "cmd7.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "hooks.hpp" @@ -390,7 +391,7 @@ static void power_activate(int power) } if (amber_power == 2) { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels ..."); break; @@ -417,7 +418,7 @@ static void power_activate(int power) } if (amber_power == 3) { - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No recall on special levels.."); break; @@ -978,7 +979,7 @@ static void power_activate(int power) case PWR_RECALL: { - if (!(dungeon_flags2 & DF2_ASK_LEAVE) || ((dungeon_flags2 & DF2_ASK_LEAVE) && !get_check("Leave this unique level forever? "))) + if (!(dungeon_flags & DF_ASK_LEAVE) || ((dungeon_flags & DF_ASK_LEAVE) && !get_check("Leave this unique level forever? "))) { recall_player(21, 15); } diff --git a/src/q_betwen.cc b/src/q_betwen.cc index 2bebe452..541be9f9 100644 --- a/src/q_betwen.cc +++ b/src/q_betwen.cc @@ -1,6 +1,7 @@ #include "q_betwen.hpp" #include "cave.hpp" +#include "dungeon_flag.hpp" #include "cave_type.hpp" #include "hook_chardump_in.hpp" #include "hook_init_quest_in.hpp" @@ -96,7 +97,7 @@ static bool_ quest_between_gen_hook(void *, void *, void *) /* Otherwise instadeath */ energy_use = 0; - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; return TRUE; } diff --git a/src/q_dragons.cc b/src/q_dragons.cc index 6c6084d1..45666e77 100644 --- a/src/q_dragons.cc +++ b/src/q_dragons.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -47,7 +48,7 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("dragons.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; /* Place some columns */ for (i = 35; i > 0; ) diff --git a/src/q_evil.cc b/src/q_evil.cc index 3bc953cd..5e93bdf1 100644 --- a/src/q_evil.cc +++ b/src/q_evil.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -47,7 +48,7 @@ static bool_ quest_evil_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("evil.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; /* Place some random balrogs */ for (i = 6; i > 0; ) diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 0942a71c..1e75b1b1 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -1,6 +1,7 @@ #include "q_fireprof.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_get_in.hpp" #include "hooks.hpp" @@ -488,7 +489,7 @@ static bool_ fireproof_gen_hook(void *, void *, void *) } /* no teleport */ - dungeon_flags2 = DF2_NO_TELEPORT; + dungeon_flags = DF_NO_TELEPORT; /* determine type of item */ fireproof_set_sval(randint(settings->sval_max)); diff --git a/src/q_god.cc b/src/q_god.cc index 79213146..3714e457 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -1,6 +1,7 @@ #include "q_god.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "hook_chardump_in.hpp" @@ -450,13 +451,17 @@ static void quest_god_set_god_dungeon_attributes_eru() /* F: A large pillar, with stairs created at edges. (You can't * climb a rock through the middle, can you?) */ - d_info[DUNGEON_GOD].flags1 = - DF1_BIG | DF1_NO_DOORS | DF1_CIRCULAR_ROOMS | - DF1_EMPTY | DF1_TOWER | DF1_FLAT | DF1_ADJUST_LEVEL_2; - d_info[DUNGEON_GOD].flags2 = - DF2_ADJUST_LEVEL_1_2 | - DF2_NO_SHAFT | - DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_BIG | + DF_NO_DOORS | + DF_CIRCULAR_ROOMS | + DF_EMPTY | + DF_TOWER | + DF_FLAT | + DF_ADJUST_LEVEL_2 | + DF_ADJUST_LEVEL_1_2 | + DF_NO_SHAFT | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -505,11 +510,13 @@ static void quest_god_set_god_dungeon_attributes_manwe() /* F: It's open, goes up like a tower, give it a few * interesting rooms, make the monsters hard(ish). */ - d_info[DUNGEON_GOD].flags1 = - DF1_NO_DOORS | DF1_TOWER | - DF1_CAVERN | DF1_ADJUST_LEVEL_2; - d_info[DUNGEON_GOD].flags2 = - DF2_NO_SHAFT | DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DOORS | + DF_TOWER | + DF_CAVERN | + DF_ADJUST_LEVEL_2 | + DF_NO_SHAFT | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -564,8 +571,10 @@ static void quest_god_set_god_dungeon_attributes_tulkas() d_info[DUNGEON_GOD].objs.tools = 15; /* F: fairly standard */ - d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2; - d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DESTROY | + DF_ADJUST_LEVEL_2 | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -609,8 +618,12 @@ static void quest_god_set_god_dungeon_attributes_melkor() d_info[DUNGEON_GOD].objs.tools = 25; /* F: Small, lava rivers, nasty monsters hehehehehe */ - d_info[DUNGEON_GOD].flags1 = DF1_SMALL | DF1_LAVA_RIVERS | DF1_ADJUST_LEVEL_1; - d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_1_2 | DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_SMALL | + DF_LAVA_RIVERS | + DF_ADJUST_LEVEL_1 | + DF_ADJUST_LEVEL_1_2 | + DF_ADJUST_LEVEL_PLAYER; /* R: No restrictions on monsters here */ d_info[DUNGEON_GOD].rules[0].mode = 0; @@ -655,13 +668,16 @@ static void quest_god_set_god_dungeon_attributes_yavanna() d_info[DUNGEON_GOD].objs.tools = 40; /* F: Natural looking */ - d_info[DUNGEON_GOD].flags1 = - DF1_NO_DOORS | DF1_WATER_RIVERS | - DF1_NO_DESTROY | DF1_ADJUST_LEVEL_1 | - DF1_NO_RECALL; - d_info[DUNGEON_GOD].flags2 = - DF2_ADJUST_LEVEL_1_2 | DF2_NO_SHAFT | - DF2_NO_GENO | DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DOORS | + DF_WATER_RIVERS | + DF_NO_DESTROY | + DF_ADJUST_LEVEL_1 | + DF_NO_RECALL | + DF_ADJUST_LEVEL_1_2 | + DF_NO_SHAFT | + DF_NO_GENO | + DF_ADJUST_LEVEL_PLAYER; /* R: Demons, Undead, non-living */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -703,9 +719,11 @@ static void quest_god_set_god_dungeon_attributes_aule() /* F: Small, no destroyed levels, min monster level = dungeon * level */ - d_info[DUNGEON_GOD].flags1 = - DF1_SMALL | DF1_NO_DESTROY | - DF1_ADJUST_LEVEL_1 | DF1_NO_STREAMERS; + d_info[DUNGEON_GOD].flags = + DF_SMALL | + DF_NO_DESTROY | + DF_ADJUST_LEVEL_1 | + DF_NO_STREAMERS; /* R: No restrictions on monsters here */ d_info[DUNGEON_GOD].rules[0].mode = 0; @@ -743,11 +761,13 @@ static void quest_god_set_god_dungeon_attributes_varda() /* F: It's open, goes up like a tower, give it a few * interesting rooms, make the monsters hard(ish). */ - d_info[DUNGEON_GOD].flags1 = - DF1_NO_DOORS | DF1_TOWER | - DF1_CAVERN | DF1_ADJUST_LEVEL_1; - d_info[DUNGEON_GOD].flags2 = - DF2_NO_SHAFT | DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DOORS | + DF_TOWER | + DF_CAVERN | + DF_ADJUST_LEVEL_1 | + DF_NO_SHAFT | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -795,8 +815,10 @@ static void quest_god_set_god_dungeon_attributes_ulmo() d_info[DUNGEON_GOD].objs.tools = 5; /* F: fairly standard */ - d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2; - d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DESTROY | + DF_ADJUST_LEVEL_2 | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; @@ -838,8 +860,10 @@ static void quest_god_set_god_dungeon_attributes_mandos() d_info[DUNGEON_GOD].objs.tools = 15; /* F: fairly standard */ - d_info[DUNGEON_GOD].flags1 = DF1_NO_DESTROY | DF1_ADJUST_LEVEL_2; - d_info[DUNGEON_GOD].flags2 = DF2_ADJUST_LEVEL_PLAYER; + d_info[DUNGEON_GOD].flags = + DF_NO_DESTROY | + DF_ADJUST_LEVEL_2 | + DF_ADJUST_LEVEL_PLAYER; /* R: */ d_info[DUNGEON_GOD].rules[0].mode = 3; diff --git a/src/q_haunted.cc b/src/q_haunted.cc index 57daa40e..5295945d 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -48,7 +49,7 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("haunted.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; /* Place some ghosts */ for (i = 12; i > 0; ) diff --git a/src/q_library.cc b/src/q_library.cc index 48c9d0cf..47246f60 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -1,6 +1,7 @@ #include "q_library.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "hooks.hpp" #include "lua_bind.hpp" #include "monster2.hpp" @@ -324,7 +325,7 @@ static bool_ quest_library_gen_hook(void *, void *, void *) int y = 2; int x = 2; load_map("library.map", &y, &x); - dungeon_flags2 = DF2_NO_GENO; + dungeon_flags = DF_NO_GENO; } /* Generate monsters */ diff --git a/src/q_rand.cc b/src/q_rand.cc index 8fb49b34..c5d2adac 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -3,6 +3,7 @@ #include "artifact_type.hpp" #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "generate.hpp" #include "hook_build_room1_in.hpp" @@ -84,7 +85,7 @@ void initialize_random_quests(int n) { dungeon_info_type *d_ptr = &d_info[j]; - if (!(d_ptr->flags1 & DF1_PRINCIPAL)) continue; + if (!(d_ptr->flags & DF_PRINCIPAL)) continue; if ((d_ptr->mindepth <= rl) && (rl <= d_ptr->maxdepth)) { @@ -408,7 +409,7 @@ static bool_ quest_random_death_hook(void *, void *in_, void *) s32b m_idx = in->m_idx; int r_idx = m_list[m_idx].r_idx; - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE); + if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); if (!random_quests[dun_level].type) return (FALSE); if (random_quests[dun_level].done) return (FALSE); @@ -439,7 +440,7 @@ static bool_ quest_random_turn_hook(void *, void *, void *) static bool_ quest_random_feeling_hook(void *, void *, void *) { - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE); + if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); if (!random_quests[dun_level].type) return (FALSE); if (random_quests[dun_level].done) return (FALSE); @@ -460,7 +461,7 @@ static bool_ quest_random_gen_hero_hook(void *, void *, void *) { int i; - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE); + if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); if (!random_quests[dun_level].type) return (FALSE); if (random_quests[dun_level].done) return (FALSE); @@ -498,7 +499,7 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *) int y2, x2, yval, xval; int y1, x1, xsize, ysize; - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE); + if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); if (!random_quests[dun_level].type) return (FALSE); if (random_quests[dun_level].done) return (FALSE); @@ -620,7 +621,7 @@ std::string quest_random_describe() { // Only emit description if we're actually on a // random quest level. - if (!(dungeon_flags1 & DF1_PRINCIPAL)) return ""; + if (!(dungeon_flags & DF_PRINCIPAL)) return ""; if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return ""; if (!random_quests[dun_level].type) return ""; if (random_quests[dun_level].done) return ""; diff --git a/src/q_thief.cc b/src/q_thief.cc index 0f6543cc..35ecdfbb 100644 --- a/src/q_thief.cc +++ b/src/q_thief.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -52,7 +53,7 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("thieves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; /* Rip the inventory from the player */ cmsg_print(TERM_YELLOW, "You feel a vicious blow on your head."); diff --git a/src/q_wolves.cc b/src/q_wolves.cc index c5863b59..96869fc9 100644 --- a/src/q_wolves.cc +++ b/src/q_wolves.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "dungeon_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -48,7 +49,7 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("wolves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); - dungeon_flags2 |= DF2_NO_GENO; + dungeon_flags |= DF_NO_GENO; /* Place some random wolves */ for (i = damroll(4, 4); i > 0; ) diff --git a/src/spells1.cc b/src/spells1.cc index d1930ad2..7a203bb8 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -13,6 +13,7 @@ #include "cmd1.hpp" #include "cmd3.hpp" #include "cmd5.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" #include "feature_type.hpp" @@ -508,7 +509,7 @@ void teleport_player(int dis) return; } - if ((dungeon_flags2 & DF2_NO_TELEPORT) && (!teleport_player_bypass)) + if ((dungeon_flags & DF_NO_TELEPORT) && (!teleport_player_bypass)) { msg_print("No teleport on special levels..."); return; @@ -797,7 +798,7 @@ void teleport_player_to(int ny, int nx) return; } - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); return; @@ -879,12 +880,12 @@ void teleport_player_level(void) msg_print("There is no effect."); return; } - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("No teleport on special levels..."); return; } - if (dungeon_flags2 & DF2_NO_EASY_MOVE) + if (dungeon_flags & DF_NO_EASY_MOVE) { msg_print("Some powerful force prevents your from teleporting."); return; @@ -2403,7 +2404,7 @@ static void apply_nexus(monster_type *m_ptr) { if (m_ptr == NULL) return; - if (!(dungeon_flags2 & DF2_NO_TELEPORT)) + if (!(dungeon_flags & DF_NO_TELEPORT)) { switch (randint(7)) { @@ -6245,7 +6246,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_AWAY_UNDEAD: { - if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect undead */ if (r_ptr->flags3 & (RF3_UNDEAD)) { @@ -6291,7 +6292,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Teleport evil (Use "dam" as "power") */ case GF_AWAY_EVIL: { - if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect evil */ if (r_ptr->flags3 & (RF3_EVIL)) { @@ -6339,7 +6340,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { bool_ resists_tele = FALSE; - if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ if (r_ptr->flags3 & (RF3_RES_TELE)) { if (r_ptr->flags1 & (RF1_UNIQUE)) @@ -7812,7 +7813,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad /* Gravity -- stun plus slowness plus teleport */ case GF_GRAVITY: { - if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ if (fuzzy) msg_print("You are hit by something heavy!"); msg_print("Gravity warps around you."); if (!unsafe) diff --git a/src/spells2.cc b/src/spells2.cc index 08a643c9..3882a914 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -12,6 +12,7 @@ #include "cave_type.hpp" #include "cmd1.hpp" #include "cmd7.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "files.hpp" @@ -2622,13 +2623,13 @@ void stair_creation(void) return; } - if (dungeon_flags1 & DF1_FLAT) + if (dungeon_flags & DF_FLAT) { msg_print("No stair creation in non dungeons..."); return; } - if (dungeon_flags2 & DF2_SPECIAL) + if (dungeon_flags & DF_SPECIAL) { msg_print("No stair creation on special levels..."); return; @@ -4096,7 +4097,7 @@ bool_ genocide(bool_ player_cast) { char typ; - if (dungeon_flags2 & DF2_NO_GENO) return (FALSE); + if (dungeon_flags & DF_NO_GENO) return (FALSE); /* Hack -- when you are fated to die, you cant cheat :) */ if (dungeon_type == DUNGEON_DEATH) @@ -4122,7 +4123,7 @@ bool_ mass_genocide(bool_ player_cast) int msec = delay_factor * delay_factor * delay_factor; int dam = 0; - if (dungeon_flags2 & DF2_NO_GENO) return (FALSE); + if (dungeon_flags & DF_NO_GENO) return (FALSE); /* Hack -- when you are fated to die, you cant cheat :) */ if (dungeon_type == DUNGEON_DEATH) @@ -4324,7 +4325,7 @@ void destroy_area(int y1, int x1, int r) bool_ flag = FALSE; - if (dungeon_flags2 & DF2_NO_GENO) + if (dungeon_flags & DF_NO_GENO) { msg_print("Not on special levels!"); return; @@ -6156,7 +6157,7 @@ bool_ passwall(int dir, bool_ safe) if (p_ptr->wild_mode) return FALSE; if (p_ptr->inside_quest) return FALSE; - if (dungeon_flags2 & DF2_NO_TELEPORT) return FALSE; + if (dungeon_flags & DF_NO_TELEPORT) return FALSE; /* Must go somewhere */ if (dir == 5) return FALSE; @@ -6305,7 +6306,7 @@ static int reset_recall_aux() for (size_t i = 1; i < max_d_idx; i++) { /* skip "blocked" dungeons */ - if (d_info[i].flags1 & DF1_NO_RECALL) continue; + if (d_info[i].flags & DF_NO_RECALL) continue; if (max_dlv[i]) { @@ -6372,7 +6373,7 @@ static int reset_recall_aux() msg_print(NULL); continue; } - else if (d_info[i].flags1 & DF1_NO_RECALL) + else if (d_info[i].flags & DF_NO_RECALL) { msg_print("This place blocks my magic!"); msg_print(NULL); @@ -6457,7 +6458,7 @@ void create_between_gate(int dist, int y, int x) { int ii, ij, plev = get_skill(SKILL_CONVEYANCE); - if (dungeon_flags2 & DF2_NO_TELEPORT) + if (dungeon_flags & DF_NO_TELEPORT) { msg_print("Not on special levels!"); return; diff --git a/src/traps.cc b/src/traps.cc index 9c9f2b64..7b286434 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -14,6 +14,7 @@ #include "cave_type.hpp" #include "cmd1.hpp" #include "cmd2.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "files.hpp" @@ -838,7 +839,7 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) if (p_ptr->ffall) { - if (dungeon_flags1 & DF1_TOWER) + if (dungeon_flags & DF_TOWER) { msg_print("You float gently down to the previous level."); } @@ -858,7 +859,7 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) autosave_checkpoint(); } - if (dungeon_flags1 & DF1_TOWER) dun_level--; + if (dungeon_flags & DF_TOWER) dun_level--; else dun_level++; /* Leaving */ @@ -1977,7 +1978,7 @@ void place_trap(int y, int x) */ if ((trap == TRAP_OF_SINKING) && ((d_ptr->maxdepth == dun_level) || - (dungeon_flags1 & DF1_FLAT) || (is_quest(dun_level))) ) + (dungeon_flags & DF_FLAT) || is_quest(dun_level)) ) { continue; } diff --git a/src/variable.cc b/src/variable.cc index 98d2c1c0..6fa38470 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -10,6 +10,7 @@ #include "variable.h" #include "cli_comm_fwd.hpp" +#include "dungeon_flag_set.hpp" #include "player_type.hpp" #include "randart_gen_type.hpp" #include "util.hpp" @@ -909,8 +910,7 @@ bool_ generate_special_feeling = FALSE; /* * Dungeon flags */ -u32b dungeon_flags1; -u32b dungeon_flags2; +DECLARE_FLAG_ZERO_IMPL(dungeon_flag_set, dungeon_flags); /* * The last character displayed diff --git a/src/variable.hpp b/src/variable.hpp index 3723a8fb..9c4340a0 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -7,6 +7,7 @@ #include "birther.hpp" #include "cave_type_fwd.hpp" #include "deity_type.hpp" +#include "dungeon_flag_set.hpp" #include "dungeon_info_type_fwd.hpp" #include "effect_type.hpp" #include "ego_item_type_fwd.hpp" @@ -276,8 +277,7 @@ extern s16b plots[MAX_PLOTS]; extern random_quest random_quests[MAX_RANDOM_QUEST]; extern bool_ *special_lvl[MAX_DUNGEON_DEPTH]; extern bool_ generate_special_feeling; -extern u32b dungeon_flags1; -extern u32b dungeon_flags2; +DECLARE_FLAG_ZERO_INTF(dungeon_flag_set, dungeon_flags); extern birther previous_char; extern int max_bg_idx; extern s16b schools_count; diff --git a/src/xtra1.cc b/src/xtra1.cc index ab521c61..140d9edc 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -13,6 +13,7 @@ #include "cave_type.hpp" #include "corrupt.hpp" #include "cmd7.hpp" +#include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -540,7 +541,7 @@ static void prt_depth(int row, int col) { /* Empty */ } - else if (dungeon_flags2 & DF2_SPECIAL) + else if (dungeon_flags & DF_SPECIAL) { strcpy(depths, "Special"); } @@ -561,7 +562,7 @@ static void prt_depth(int row, int col) } else { - if (dungeon_flags1 & DF1_TOWER) + if (dungeon_flags & DF_TOWER) { (void)strnfmt(depths, 32, "%c%c%c -%d", d_ptr->short_name[0], -- cgit v1.2.3 From 7f7462188e2a213518acc979e3698746f098d7ab Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 12 May 2016 21:51:55 +0200 Subject: Add missing include --- src/cmd4.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd4.cc b/src/cmd4.cc index 71ca24fe..fa436115 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -42,6 +42,7 @@ #include #include #include +#include #include #include -- cgit v1.2.3 From 7137a17f77fd3b6c3bbcefa2d621b3a11f161679 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove monster memory Instead of having monster memory, the player automatically knows everything about all monsters from the start. --- lib/edit/a_info.txt | 2 - lib/edit/ba_info.txt | 4 - lib/edit/k_info.txt | 8 - lib/edit/st_info.txt | 3 +- lib/help/defines.txt | 1 - lib/help/m_divin.txt | 2 +- lib/help/m_music.txt | 3 +- lib/mods/theme/edit/a_info.txt | 2 - lib/mods/theme/edit/ba_info.txt | 6 +- lib/mods/theme/edit/k_info.txt | 13 -- lib/mods/theme/edit/st_info.txt | 3 +- lib/mods/theme/help/defines.txt | 1 - lib/mods/theme/help/m_divin.txt | 2 +- lib/mods/theme/help/m_music.txt | 3 +- src/birth.cc | 1 - src/bldg.cc | 6 - src/cmd1.cc | 236 +++---------------------- src/cmd3.cc | 226 +----------------------- src/cmd3.hpp | 1 - src/cmd4.cc | 31 ++-- src/cmd6.cc | 73 +------- src/defines.h | 11 -- src/loadsave.cc | 81 +++------ src/melee1.cc | 357 ++++++-------------------------------- src/melee2.cc | 268 ---------------------------- src/monster1.cc | 374 +++++++--------------------------------- src/monster1.hpp | 2 +- src/monster2.cc | 111 ++---------- src/monster2.hpp | 2 - src/monster3.cc | 7 - src/monster_race.hpp | 28 --- src/object2.cc | 1 - src/spells1.cc | 144 +--------------- src/spells2.cc | 121 +------------ src/spells2.hpp | 2 - src/spells5.cc | 5 +- src/variable.cc | 1 - src/variable.hpp | 1 - src/xtra1.cc | 4 +- src/xtra2.cc | 27 +-- 40 files changed, 212 insertions(+), 1962 deletions(-) diff --git a/lib/edit/a_info.txt b/lib/edit/a_info.txt index 645af426..4f52a413 100644 --- a/lib/edit/a_info.txt +++ b/lib/edit/a_info.txt @@ -1067,7 +1067,6 @@ N:43:of Numenor I:33:12:3 W:60:30:40:50000 P:0:1d1:0:0:18 -F:ACTIVATE F:CHR F:DEX F:DRAIN_MANA @@ -1084,7 +1083,6 @@ F:RES_SOUND F:SEARCH F:SEE_INVIS F:SPEED -a:NUMENOR D:A crown of massive gold, set with wondrous jewels of thought and warding, D:worn by the kings of ancient Numenor. Its wearer may go into battle D:always knowing what he faces - unless his own folly blinds him to the diff --git a/lib/edit/ba_info.txt b/lib/edit/ba_info.txt index e5c49759..20e7bb77 100644 --- a/lib/edit/ba_info.txt +++ b/lib/edit/ba_info.txt @@ -85,10 +85,6 @@ N:17:Look at busts of Kings C:0:0:0 I:5:0:l -N:18:Research monster -C:1600:1500:1400 -I:20:0:r - N:21:Get quest monster C:0:0:0 I:54:0:q diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 8683b4bd..7bc01b5e 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -3338,14 +3338,6 @@ A:5/1:10/1:20/1 P:0:1d1:0:0:0 D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares. -N:353:Probing -G:-:d -I:66:7:50 -W:40:0:15:4000 -A:40/4 -P:0:1d1:0:0:0 -D:A rod of knowledge which will tell you about nearby creatures' health. - N:354:Recall G:-:d I:66:3:80 diff --git a/lib/edit/st_info.txt b/lib/edit/st_info.txt index 83b29b44..f2e6f281 100644 --- a/lib/edit/st_info.txt +++ b/lib/edit/st_info.txt @@ -224,7 +224,6 @@ I:100:Lightning Resistance I:100:Searching I:100:Cure Light Wounds # Rods -I:100:Probing I:25:& Wooden Rod~ of# # Book T:100:111:50 @@ -337,7 +336,7 @@ G:+:s W:0 N:16:Beastmaster Shanty -A:18:0:21:22:0:0 +A:0:0:21:22:0:0 O:19:19:19:19 G:+:g W:0 diff --git a/lib/help/defines.txt b/lib/help/defines.txt index 147e61a1..5093d994 100644 --- a/lib/help/defines.txt +++ b/lib/help/defines.txt @@ -396,7 +396,6 @@ TV_BOOK 111 /* spell books */ SV_ROD_ILLUMINATION 4 SV_ROD_MAPPING 5 SV_ROD_DETECTION 6 - SV_ROD_PROBING 7 SV_ROD_CURING 8 SV_ROD_HEALING 9 SV_ROD_RESTORATION 10 diff --git a/lib/help/m_divin.txt b/lib/help/m_divin.txt index 9d3455fc..e6490df8 100644 --- a/lib/help/m_divin.txt +++ b/lib/help/m_divin.txt @@ -25,7 +25,7 @@ There are six spells available for the divination school. These Spells are: Asks for an object and identifies it. At spell level 17 it identifies all objects in the inventory. At spell level 27 it identifies all objects in the inventory and in a - radius on the floor, as well as probing monsters in that radius. + radius on the floor. 4. [[[[[sReveal Ways] (school level 9) Detects the doors/stairs/ways in a certain radius around you. 5. [[[[[sVision] (school level 15) diff --git a/lib/help/m_music.txt b/lib/help/m_music.txt index 0f84f08f..40116252 100644 --- a/lib/help/m_music.txt +++ b/lib/help/m_music.txt @@ -61,8 +61,7 @@ of instrument contains a different family of musical songs: Consumes mana each turn. 5. [[[[[vClairaudience(IV)] (School level 25) Allows you to sense monster minds as long as you sing. - At level 10 it identifies all objects in a radius on the floor, - as well as probing monsters in that radius. + At level 10 it identifies all objects in a radius on the floor. Consumes mana each turn. #####GHorns diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt index f1e19dbf..b822ab60 100644 --- a/lib/mods/theme/edit/a_info.txt +++ b/lib/mods/theme/edit/a_info.txt @@ -1067,7 +1067,6 @@ N:43:of Numenor I:33:12:3 W:60:30:40:50000 P:0:1d1:0:0:18 -F:ACTIVATE F:CHR F:DEX F:DRAIN_MANA @@ -1084,7 +1083,6 @@ F:RES_SOUND F:SEARCH F:SEE_INVIS F:SPEED -a:NUMENOR D:A crown of massive gold, set with wondrous jewels of thought and warding, D:worn by the kings of ancient Numenor. Its wearer may go into battle D:always knowing what he faces - unless his own folly blinds him to the diff --git a/lib/mods/theme/edit/ba_info.txt b/lib/mods/theme/edit/ba_info.txt index b0270989..c8c7f9c5 100644 --- a/lib/mods/theme/edit/ba_info.txt +++ b/lib/mods/theme/edit/ba_info.txt @@ -85,10 +85,6 @@ N:17:Look at busts of Kings C:0:0:0 I:5:0:l -N:18:Research monster -C:1600:1500:1400 -I:20:0:r - N:21:Get quest monster C:0:0:0 I:54:0:q @@ -257,4 +253,4 @@ I:18:2:f # Ask Bard for directions to Erebor N:66:Ask about Erebor C:0:0:0 -I:66:0:a \ No newline at end of file +I:66:0:a diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index 055f9e5e..a4c5d2db 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -3277,19 +3277,6 @@ F:IGNORE_ELEC F:IGNORE_FIRE D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares. -N:353:Probing -G:-:d -I:66:7:50 -W:40:0:15:4000 -A:40/4 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rod of knowledge which will tell you about nearby creatures' health. -D:If they are sleeping, the intrusion will wake them. - N:354:Recall G:-:d I:66:3:80 diff --git a/lib/mods/theme/edit/st_info.txt b/lib/mods/theme/edit/st_info.txt index 512258ca..d00e3415 100644 --- a/lib/mods/theme/edit/st_info.txt +++ b/lib/mods/theme/edit/st_info.txt @@ -218,7 +218,6 @@ T:100:40:7 I:100:Searching I:100:Cure Light Wounds # Rods -I:100:Probing I:25:& Wooden Rod~ of# # Book T:100:111:50 @@ -377,7 +376,7 @@ T:65:8:17 T:60:8:18 # Monstrous Compendium 11 T:55:8:19 -A:18:2:21:22:3:0 +A:0:2:21:22:3:0 O:94:95:96:97 G:+:g W:24 diff --git a/lib/mods/theme/help/defines.txt b/lib/mods/theme/help/defines.txt index 147e61a1..5093d994 100644 --- a/lib/mods/theme/help/defines.txt +++ b/lib/mods/theme/help/defines.txt @@ -396,7 +396,6 @@ TV_BOOK 111 /* spell books */ SV_ROD_ILLUMINATION 4 SV_ROD_MAPPING 5 SV_ROD_DETECTION 6 - SV_ROD_PROBING 7 SV_ROD_CURING 8 SV_ROD_HEALING 9 SV_ROD_RESTORATION 10 diff --git a/lib/mods/theme/help/m_divin.txt b/lib/mods/theme/help/m_divin.txt index df92c11b..e03bd334 100644 --- a/lib/mods/theme/help/m_divin.txt +++ b/lib/mods/theme/help/m_divin.txt @@ -26,7 +26,7 @@ There are six spells available for the divination school. These Spells are: Asks for an object and identifies it. At spell level 17 it identifies all objects in the inventory. At spell level 27 it identifies all objects in the inventory and in a - radius on the floor, as well as probing monsters in that radius. + radius on the floor. 4. [[[[[sReveal Ways] (school level 9) Detects the doors/stairs/ways in a certain radius around you. 5. [[[[[sVision] (school level 15) diff --git a/lib/mods/theme/help/m_music.txt b/lib/mods/theme/help/m_music.txt index 0f84f08f..40116252 100644 --- a/lib/mods/theme/help/m_music.txt +++ b/lib/mods/theme/help/m_music.txt @@ -61,8 +61,7 @@ of instrument contains a different family of musical songs: Consumes mana each turn. 5. [[[[[vClairaudience(IV)] (School level 25) Allows you to sense monster minds as long as you sing. - At level 10 it identifies all objects in a radius on the floor, - as well as probing monsters in that radius. + At level 10 it identifies all objects in a radius on the floor. Consumes mana each turn. #####GHorns diff --git a/src/birth.cc b/src/birth.cc index 09dabe24..fb0c2a0d 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -823,7 +823,6 @@ static void player_wipe(void) cheat_hear = FALSE; cheat_room = FALSE; cheat_xtra = FALSE; - cheat_know = FALSE; cheat_live = FALSE; /* Assume no winning game */ diff --git a/src/bldg.cc b/src/bldg.cc index dc82f4ac..db76b92a 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -1218,12 +1218,6 @@ bool_ bldg_process_command(store_type *s_ptr, int i) break; } - case BACT_RESEARCH_MONSTER: - { - paid = !research_mon(); - break; - } - case BACT_COMPARE_WEAPONS: { paid = compare_weapons(); diff --git a/src/cmd1.cc b/src/cmd1.cc index 0228412f..112bd376 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -261,109 +261,60 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Slay Animal */ if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags3 & (RF3_ANIMAL))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_ANIMAL); - } - if (mult < 2) mult = 2; } /* Slay Evil */ if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags3 & (RF3_EVIL))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_EVIL); - } - if (mult < 2) mult = 2; } /* Slay Undead */ if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_UNDEAD); - } - if (mult < 3) mult = 3; } /* Slay Demon */ if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags3 & (RF3_DEMON))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_DEMON); - } - if (mult < 3) mult = 3; } /* Slay Orc */ if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags3 & (RF3_ORC))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_ORC); - } - if (mult < 3) mult = 3; } /* Slay Troll */ if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags3 & (RF3_TROLL))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_TROLL); - } - if (mult < 3) mult = 3; } /* Slay Giant */ if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags3 & (RF3_GIANT))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_GIANT); - } - if (mult < 3) mult = 3; } /* Slay Dragon */ if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_DRAGON); - } - if (mult < 3) mult = 3; } /* Execute Dragon */ if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_DRAGON); - } - if (mult < 5) mult = 5; } /* Execute Undead */ if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_UNDEAD); - } if (mult < 5) mult = 5; } @@ -371,11 +322,6 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Execute Demon */ if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags3 & (RF3_DEMON))) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_DEMON); - } - if (mult < 5) mult = 5; } @@ -383,26 +329,14 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Acid) */ if (f1 & (TR1_BRAND_ACID)) { - /* Notice immunity */ if (r_ptr->flags3 & (RF3_IM_ACID)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_ACID); - } + // No additional multiplier } - - /* Notice susceptibility */ else if (r_ptr->flags9 & (RF9_SUSCEP_ACID)) { - if (m_ptr->ml) - { - r_ptr->r_flags9 |= (RF9_SUSCEP_ACID); - } if (mult < 6) mult = 6; } - - /* Otherwise, take the damage */ else { if (mult < 3) mult = 3; @@ -412,26 +346,14 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Elec) */ if (f1 & (TR1_BRAND_ELEC)) { - /* Notice immunity */ if (r_ptr->flags3 & (RF3_IM_ELEC)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_ELEC); - } + // No additional multiplier } - - /* Notice susceptibility */ else if (r_ptr->flags9 & (RF9_SUSCEP_ELEC)) { - if (m_ptr->ml) - { - r_ptr->r_flags9 |= (RF9_SUSCEP_ELEC); - } if (mult < 6) mult = 6; } - - /* Otherwise, take the damage */ else { if (mult < 3) mult = 3; @@ -441,26 +363,14 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Fire) */ if (f1 & (TR1_BRAND_FIRE)) { - /* Notice immunity */ if (r_ptr->flags3 & (RF3_IM_FIRE)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_FIRE); - } + // No additional multiplier } - - /* Notice susceptibility */ else if (r_ptr->flags3 & (RF3_SUSCEP_FIRE)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_SUSCEP_FIRE); - } if (mult < 6) mult = 6; } - - /* Otherwise, take the damage */ else { if (mult < 3) mult = 3; @@ -470,26 +380,14 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Cold) */ if (f1 & (TR1_BRAND_COLD)) { - /* Notice immunity */ if (r_ptr->flags3 & (RF3_IM_COLD)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_COLD); - } + // No additional multiplier } - - /* Notice susceptibility */ else if (r_ptr->flags3 & (RF3_SUSCEP_COLD)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_SUSCEP_COLD); - } if (mult < 6) mult = 6; } - - /* Otherwise, take the damage */ else { if (mult < 3) mult = 3; @@ -499,27 +397,15 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Poison) */ if (f1 & (TR1_BRAND_POIS) || (p_ptr->tim_poison)) { - /* Notice immunity */ if (r_ptr->flags3 & (RF3_IM_POIS)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_POIS); - } + // No additional damage } - - /* Notice susceptibility */ else if (r_ptr->flags9 & (RF9_SUSCEP_POIS)) { - if (m_ptr->ml) - { - r_ptr->r_flags9 |= (RF9_SUSCEP_POIS); - } if (mult < 6) mult = 6; if (magik(95)) *special |= SPEC_POIS; } - - /* Otherwise, take the damage */ else { if (mult < 3) mult = 3; @@ -530,16 +416,10 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Wounding */ if (f5 & (TR5_WOUNDING)) { - /* Notice immunity */ if (r_ptr->flags8 & (RF8_NO_CUT)) { - if (m_ptr->ml) - { - r_info[m_ptr->r_idx].r_flags8 |= (RF8_NO_CUT); - } + // No additional damage } - - /* Otherwise, take the damage */ else { if (magik(50)) *special |= SPEC_CUT; @@ -703,7 +583,6 @@ void touch_zap_player(monster_type *m_ptr) if (p_ptr->sensible_fire) aura_damage = (aura_damage + 2) * 2; take_hit(aura_damage, aura_dam); - r_ptr->r_flags2 |= RF2_AURA_FIRE; handle_stuff(); } } @@ -726,7 +605,6 @@ void touch_zap_player(monster_type *m_ptr) msg_print("You get zapped!"); take_hit(aura_damage, aura_dam); - r_ptr->r_flags2 |= RF2_AURA_ELEC; handle_stuff(); } } @@ -792,9 +670,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, /* Scan through all four blows */ for (ap_cnt = 0; ap_cnt < 4; ap_cnt++) { - bool_ visible = FALSE; - bool_ obvious = FALSE; - int power = 0; int damage = 0; @@ -818,9 +693,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, /* break; */ } - /* Extract visibility (before blink) */ - visible = TRUE; - /* Extract the attack "power" */ power = get_attack_power(effect); @@ -1007,9 +879,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } - /* Hack -- assume all attacks are obvious */ - obvious = TRUE; - /* Roll out the damage */ damage = damroll(d_dice, d_side); @@ -1173,8 +1042,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { blinked = FALSE; msg_format("You are suddenly very hot!"); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_FIRE; } project(m_idx, 0, p_ptr->py, p_ptr->px, damroll(1 + ((t_ptr->level) / 26), @@ -1190,8 +1057,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { blinked = FALSE; msg_format("You get zapped!"); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_ELEC; } project(m_idx, 0, p_ptr->py, p_ptr->px, damroll(1 + ((t_ptr->level) / 26), @@ -1230,21 +1095,6 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } } } - - - /* Analyze "visible" monsters only */ - if (visible) - { - /* Count "obvious" attacks (and ones that cause damage) */ - if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) - { - /* Count attacks of this type */ - if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) - { - r_ptr->r_blows[ap_cnt]++; - } - } - } } /* Blink away */ @@ -1310,9 +1160,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, for (ap_cnt = 0; ap_cnt < (p_ptr->num_blow > 4) ? 4 : p_ptr->num_blow; ap_cnt++) { - bool_ visible = FALSE; - bool_ obvious = FALSE; - int power = 0; int damage = 0; @@ -1336,9 +1183,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, /* break; */ } - /* Extract visibility (before blink) */ - visible = TRUE; - /* Extract the attack "power" */ power = get_attack_power(effect); @@ -1525,9 +1369,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } - /* Hack -- assume all attacks are obvious */ - obvious = TRUE; - /* Roll out the damage */ damage = damroll(d_dice, d_side) + p_ptr->to_d; @@ -1689,8 +1530,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { blinked = FALSE; msg_format("You are suddenly very hot!"); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_FIRE; } project(m_idx, 0, p_ptr->py, p_ptr->px, damroll(1 + ((t_ptr->level) / 26), @@ -1706,8 +1545,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { blinked = FALSE; msg_format("You get zapped!"); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_ELEC; } project(m_idx, 0, p_ptr->py, p_ptr->px, damroll(1 + ((t_ptr->level) / 26), @@ -1748,21 +1585,6 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } } } - - - /* Analyze "visible" monsters only */ - if (visible) - { - /* Count "obvious" attacks (and ones that cause damage) */ - if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) - { - /* Count attacks of this type */ - if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) - { - r_ptr->r_blows[ap_cnt]++; - } - } - } } /* Blink away */ @@ -1838,22 +1660,20 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Cut monster */ if (special & SPEC_CUT) { - /* Cut the monster */ if (r_ptr->flags8 & (RF8_NO_CUT)) { - if (m_ptr->ml) - { - r_info[m_ptr->r_idx].r_flags8 |= (RF8_NO_CUT); - } + // No damage } else if (rand_int(100) >= r_ptr->level) { - /* Already partially poisoned */ - if (m_ptr->bleeding) msg_format("%^s is bleeding more strongly.", - m_name); - /* Was not poisoned */ + if (m_ptr->bleeding) + { + msg_format("%^s is bleeding more strongly.", m_name); + } else + { msg_format("%^s is bleeding.", m_name); + } m_ptr->bleeding += dam * 2; } @@ -1862,36 +1682,33 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Poison monster */ if (special & SPEC_POIS) { - /* Poison the monster */ if (r_ptr->flags3 & (RF3_IM_POIS)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_IM_POIS); - } + // No damage } - /* Notice susceptibility */ else if (r_ptr->flags9 & (RF9_SUSCEP_POIS)) { - if (m_ptr->ml) + if (m_ptr->poisoned) { - r_ptr->r_flags9 |= (RF9_SUSCEP_POIS); + msg_format("%^s is more poisoned.", m_name); } - /* Already partially poisoned */ - if (m_ptr->poisoned) msg_format("%^s is more poisoned.", m_name); - /* Was not poisoned */ else + { msg_format("%^s is poisoned.", m_name); + } m_ptr->poisoned += dam * 2; } else if (rand_int(100) >= r_ptr->level) { - /* Already partially poisoned */ - if (m_ptr->poisoned) msg_format("%^s is more poisoned.", m_name); - /* Was not poisoned */ + if (m_ptr->poisoned) + { + msg_format("%^s is more poisoned.", m_name); + } else + { msg_format("%^s is poisoned.", m_name); + } m_ptr->poisoned += dam; } @@ -2634,11 +2451,6 @@ void py_attack(int y, int x, int max_blow) /* Confuse the monster */ if (r_ptr->flags3 & (RF3_NO_CONF)) { - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_NO_CONF); - } - msg_format("%^s is unaffected.", m_name); } else if (rand_int(100) < m_ptr->level) diff --git a/src/cmd3.cc b/src/cmd3.cc index ef0dfa28..ac27d926 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -1279,23 +1279,6 @@ static bool compare_monster_level(int w1, int w2) return compare_monster_experience(w1, w2); } -/** - * Sort by total number of kills - */ -static bool compare_total_kills(int w1, int w2) -{ - /* Extract total kills */ - s16b z1 = r_info[w1].r_tkills; - s16b z2 = r_info[w2].r_tkills; - - /* Compare total kills */ - if (z1 < z2) return true; - if (z1 > z2) return false; - - /* Punt to monster level. */ - return compare_monster_level(w1, w2); -} - /* * Sort by player kills */ @@ -1309,8 +1292,8 @@ static bool compare_player_kills(int w1, int w2) if (z1 < z2) return true; if (z1 > z2) return false; - /* Punt to total number of kills. */ - return compare_total_kills(w1, w2); + /* Punt to monster level. */ + return compare_monster_level(w1, w2); } @@ -1451,9 +1434,6 @@ void do_cmd_query_symbol(void) { monster_race *r_ptr = &r_info[i]; - /* Nothing to recall */ - if (!cheat_know && !r_ptr->r_sights) continue; - /* Require non-unique monsters if needed */ if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; @@ -1555,7 +1535,7 @@ void do_cmd_query_symbol(void) Term_save(); /* Recall on screen */ - screen_roff(who[i], 0, 0); + screen_roff(who[i], 0); /* Hack -- Complete the prompt (again) */ Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC]"); @@ -1608,206 +1588,6 @@ void do_cmd_query_symbol(void) } -/* - * research_mon - * -KMW- - */ -bool_ research_mon() -{ - int i, r_idx; - - char sym, query; - - char buf[128]; - - - s16b oldkills; - - byte oldwake; - - bool_ oldcheat; - - - bool_ all = FALSE; - - bool_ uniq = FALSE; - - bool_ norm = FALSE; - - bool_ notpicked; - - - bool_ recall = FALSE; - - monster_race *r2_ptr; - - /* Hack -- Remember "cheat_know" flag */ - oldcheat = cheat_know; - - - /* Get a character, or abort */ - if (!get_com("Enter character of monster: ", &sym)) return (TRUE); - - /* Find that character info, and describe it */ - for (i = 0; ident_info[i]; ++i) - { - if (sym == ident_info[i][0]) break; - } - - if (ident_info[i]) - { - strnfmt(buf, 128, "%c - %s.", sym, ident_info[i] + 2); - } - else - { - strnfmt(buf, 128, "%c - %s.", sym, "Unknown Symbol"); - } - - /* Display the result */ - prt(buf, 16, 10); - - - /* Collect matching monsters */ - std::vector who; - for (i = 1; i < max_r_idx; i++) - { - monster_race *r_ptr = &r_info[i]; - - /* Hack -- Force "cheat_know" */ - cheat_know = TRUE; - - /* Nothing to recall */ - if (!cheat_know && !r_ptr->r_sights) continue; - - /* Require non-unique monsters if needed */ - if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Require unique monsters if needed */ - if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue; - - /* Collect "appropriate" monsters */ - if (all || (r_ptr->d_char == sym)) { - who.push_back(i); - } - } - - /* Nothing to recall */ - if (who.empty()) - { - /* Restore the "cheat_know" flag */ - cheat_know = oldcheat; - - return (TRUE); - } - - - query = 'y'; - - /* Sort by level */ - std::sort(std::begin(who), std::end(who), compare_monster_level); - - - /* Start at the end */ - i = who.size() - 1; - - notpicked = TRUE; - - /* Scan the monster memory */ - while (notpicked) - { - /* Extract a race */ - r_idx = who[i]; - - /* Hack -- Auto-recall */ - monster_race_track(r_idx, 0); - - /* Hack -- Handle stuff */ - handle_stuff(); - - /* Hack -- Begin the prompt */ - roff_top(r_idx); - - /* Hack -- Complete the prompt */ - Term_addstr( -1, TERM_WHITE, " [(r)ecall, ESC, space to continue]"); - - /* Interact */ - while (1) - { - /* Recall */ - if (recall) - { - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Recall on screen */ - r2_ptr = &r_info[r_idx]; - - oldkills = r2_ptr->r_tkills; - oldwake = r2_ptr->r_wake; - screen_roff(who[i], 0, 1); - r2_ptr->r_tkills = oldkills; - r2_ptr->r_wake = oldwake; - r2_ptr->r_sights = 1; - cheat_know = oldcheat; - notpicked = FALSE; - break; - - } - - /* Command */ - query = inkey(); - - /* Unrecall */ - if (recall) - { - /* Restore */ - Term_load(); - character_icky = FALSE; - } - - /* Normal commands */ - if (query != 'r') break; - - /* Toggle recall */ - recall = !recall; - } - - /* Stop scanning */ - if (query == ESCAPE) break; - - /* Move to "prev" monster */ - if (query == '-') - { - i++; - assert(i >= 0); - if (static_cast(i) == who.size()) - { - i = 0; - } - } - - /* Move to "next" monster */ - else - { - if (i-- == 0) - { - i = who.size() - 1; - } - } - } - - - /* Re-display the identity */ - /* prt(buf, 5, 5);*/ - - /* Restore the "cheat_know" flag */ - cheat_know = oldcheat; - - return (notpicked); -} - - /* * Try to "sense" the grid's mana */ diff --git a/src/cmd3.hpp b/src/cmd3.hpp index 48677b77..5c664118 100644 --- a/src/cmd3.hpp +++ b/src/cmd3.hpp @@ -21,4 +21,3 @@ extern void do_cmd_look(void); extern void do_cmd_locate(void); extern void do_cmd_query_symbol(void); extern bool_ do_cmd_sense_grid_mana(void); -extern bool_ research_mon(void); diff --git a/src/cmd4.cc b/src/cmd4.cc index fa436115..27f2e46f 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -625,7 +625,6 @@ static option_type cheat_info[6] = { &cheat_hear, FALSE, 0, 1, "cheat_hear", "Peek into monster creation" }, { &cheat_room, FALSE, 0, 2, "cheat_room", "Peek into dungeon creation" }, { &cheat_xtra, FALSE, 0, 3, "cheat_xtra", "Peek into something else" }, - { &cheat_know, FALSE, 0, 4, "cheat_know", "Know complete monster info" }, { &cheat_live, FALSE, 0, 5, "cheat_live", "Allow player to avoid death" } }; @@ -3303,24 +3302,20 @@ static void do_cmd_knowledge_uniques(void) { bool_ dead = (r_ptr->max_num == 0); - /* Only display "known" uniques */ - if (dead || cheat_know || r_ptr->r_sights) + /* Print a message */ + if (dead) { - /* Print a message */ - if (dead) - { - w.write("[[[[[{}{}] [[[[[R{:<68} is dead]\n", - static_cast(conv_color[r_ptr->d_attr]), - static_cast(r_ptr->d_char), - r_ptr->name); - } - else - { - w.write("[[[[[{}{}] [[[[[w{:<68} is alive]\n", - static_cast(conv_color[r_ptr->d_attr]), - static_cast(r_ptr->d_char), - r_ptr->name); - } + w.write("[[[[[{}{}] [[[[[R{:<68} is dead]\n", + static_cast(conv_color[r_ptr->d_attr]), + static_cast(r_ptr->d_char), + r_ptr->name); + } + else + { + w.write("[[[[[{}{}] [[[[[w{:<68} is alive]\n", + static_cast(conv_color[r_ptr->d_attr]), + static_cast(r_ptr->d_char), + r_ptr->name); } } } diff --git a/src/cmd6.cc b/src/cmd6.cc index 24ede94f..387a236e 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -4341,15 +4341,6 @@ void do_cmd_zap_rod(void) break; } - case SV_ROD_PROBING: - { - probing(); - - ident = TRUE; - - break; - } - case SV_ROD_CURING: { if (set_blind(0)) ident = TRUE; @@ -5228,67 +5219,6 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) break; } - case ACT_NUMENOR: - { - /* Give full knowledge */ - /* Hack -- Maximal info */ - monster_race *r_ptr; - cave_type *c_ptr; - int x, y, m; - - if (!doit) return "analyze monster every 500+d200 turns"; - - if (!tgt_pt(&x, &y)) break; - - c_ptr = &cave[y][x]; - if (!c_ptr->m_idx) break; - - r_ptr = &r_info[c_ptr->m_idx]; - - /* Observe "maximal" attacks */ - for (m = 0; m < 4; m++) - { - /* Examine "actual" blows */ - if (r_ptr->blow[m].effect || r_ptr->blow[m].method) - { - /* Hack -- maximal observations */ - r_ptr->r_blows[m] = MAX_UCHAR; - } - } - - /* Hack -- maximal drops */ - r_ptr->r_drop_gold = r_ptr->r_drop_item = - (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) + - ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) + - ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) + - ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) + - ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) + - ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0)); - - /* Hack -- but only "valid" drops */ - if (r_ptr->flags1 & (RF1_ONLY_GOLD)) r_ptr->r_drop_item = 0; - if (r_ptr->flags1 & (RF1_ONLY_ITEM)) r_ptr->r_drop_gold = 0; - - /* Hack -- observe many spells */ - r_ptr->r_cast_inate = MAX_UCHAR; - r_ptr->r_cast_spell = MAX_UCHAR; - - /* Hack -- know all the flags */ - r_ptr->r_flags1 = r_ptr->flags1; - r_ptr->r_flags2 = r_ptr->flags2; - r_ptr->r_flags3 = r_ptr->flags3; - r_ptr->r_flags4 = r_ptr->flags4; - r_ptr->r_flags5 = r_ptr->flags5; - r_ptr->r_flags6 = r_ptr->flags6; - r_ptr->r_flags7 = r_ptr->flags7; - r_ptr->r_flags8 = r_ptr->flags8; - r_ptr->r_flags9 = r_ptr->flags9; - - o_ptr->timeout = rand_int(200) + 500; - - break; - } - case ACT_KNOWLEDGE: { if (!doit) return "whispers from beyond(sanity drain) every 100+d200 turns"; @@ -6739,10 +6669,9 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_DETECT_XTRA: { - if (!doit) return "detection, probing and identify true every 1000 turns"; + if (!doit) return "detection and identify true every 1000 turns"; msg_print("It glows brightly..."); detect_all(DEFAULT_RADIUS); - probing(); identify_fully(); o_ptr->timeout = 1000; diff --git a/src/defines.h b/src/defines.h index bcae8ae5..fcbb5342 100644 --- a/src/defines.h +++ b/src/defines.h @@ -788,7 +788,6 @@ #define ACT_FUNDIN 30 #define ACT_EOL 31 #define ACT_UMBAR 32 -#define ACT_NUMENOR 33 #define ACT_KNOWLEDGE 34 #define ACT_UNDEATH 35 #define ACT_THRAIN 36 @@ -834,10 +833,6 @@ #define ACT_GANDALF 76 #define ACT_MARDA 77 #define ACT_PALANTIR 78 -/* - 79 - 80 -*/ #define ACT_CURE_LW 81 #define ACT_CURE_MW 82 #define ACT_CURE_POISON 83 @@ -845,9 +840,6 @@ #define ACT_REST_ALL 85 #define ACT_CURE_700 86 #define ACT_CURE_1000 87 -/* - 88 -*/ #define ACT_EREBOR 89 #define ACT_DRUEDAIN 90 #define ACT_ESP 91 @@ -1428,12 +1420,10 @@ #define SV_ROD_ILLUMINATION 4 #define SV_ROD_MAPPING 5 #define SV_ROD_DETECTION 6 -#define SV_ROD_PROBING 7 #define SV_ROD_CURING 8 #define SV_ROD_HEALING 9 #define SV_ROD_RESTORATION 10 #define SV_ROD_SPEED 11 -/* xxx (aimed) */ #define SV_ROD_TELEPORT_AWAY 13 #define SV_ROD_DISARMING 14 #define SV_ROD_LITE 15 @@ -3086,7 +3076,6 @@ #define BACT_REST 17 #define BACT_FOOD 18 #define BACT_RUMORS 19 -#define BACT_RESEARCH_MONSTER 20 #define BACT_COMPARE_WEAPONS 21 #define BACT_ENCHANT_WEAPON 23 #define BACT_ENCHANT_ARMOR 24 diff --git a/src/loadsave.cc b/src/loadsave.cc index 6b3ad713..32d401af 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1637,62 +1637,39 @@ bool_ file_exist(cptr buf) */ static void do_lore(int r_idx, ls_flag_t flag) { + byte tmp_u8 = 0; + u32b tmp_u32 = 0; + s16b tmp_s16 = 0; monster_race *r_ptr = &r_info[r_idx]; - /* Count sights/deaths/kills */ - do_s16b(&r_ptr->r_sights, flag); - do_s16b(&r_ptr->r_deaths, flag); + do_s16b(&tmp_s16, flag); + do_s16b(&tmp_s16, flag); do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&r_ptr->r_tkills, flag); - - /* Count wakes and ignores */ - do_byte(&r_ptr->r_wake, flag); - do_byte(&r_ptr->r_ignore, flag); - - /* Extra stuff */ - do_byte(&r_ptr->r_xtra1, flag); - do_byte(&r_ptr->r_xtra2, flag); - - /* Count drops */ - do_byte(&r_ptr->r_drop_gold, flag); - do_byte(&r_ptr->r_drop_item, flag); - - /* Count spells */ - do_byte(&r_ptr->r_cast_inate, flag); - do_byte(&r_ptr->r_cast_spell, flag); - - /* Count blows of each type */ - do_byte(&r_ptr->r_blows[0], flag); - do_byte(&r_ptr->r_blows[1], flag); - do_byte(&r_ptr->r_blows[2], flag); - do_byte(&r_ptr->r_blows[3], flag); - - /* Memorize flags */ - do_u32b(&r_ptr->r_flags1, flag); /* Just to remind you */ - do_u32b(&r_ptr->r_flags2, flag); /* flag is unrelated to */ - do_u32b(&r_ptr->r_flags3, flag); /* the other argument */ - do_u32b(&r_ptr->r_flags4, flag); - do_u32b(&r_ptr->r_flags5, flag); - do_u32b(&r_ptr->r_flags6, flag); - do_u32b(&r_ptr->r_flags7, flag); - do_u32b(&r_ptr->r_flags8, flag); - do_u32b(&r_ptr->r_flags9, flag); - - /* Read the "Racial" monster tmp16b per level */ - do_s16b(&r_ptr->max_num, flag); + do_s16b(&tmp_s16, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_byte(&tmp_u8, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_u32b(&tmp_u32, flag); + do_s16b(&r_ptr->max_num, flag); do_byte((byte*)&r_ptr->on_saved, flag); - - if (flag == ls_flag_t::LOAD) - { - /* Lore flag repair? */ - r_ptr->r_flags1 &= r_ptr->flags1; - r_ptr->r_flags2 &= r_ptr->flags2; - r_ptr->r_flags3 &= r_ptr->flags3; - r_ptr->r_flags4 &= r_ptr->flags4; - r_ptr->r_flags5 &= r_ptr->flags5; - r_ptr->r_flags6 &= r_ptr->flags6; - } } @@ -1806,7 +1783,6 @@ static void do_options(ls_flag_t flag) cheat_hear = (c & 0x0200) ? TRUE : FALSE; cheat_room = (c & 0x0400) ? TRUE : FALSE; cheat_xtra = (c & 0x0800) ? TRUE : FALSE; - cheat_know = (c & 0x1000) ? TRUE : FALSE; cheat_live = (c & 0x2000) ? TRUE : FALSE; } if (flag == ls_flag_t::SAVE) @@ -1817,7 +1793,6 @@ static void do_options(ls_flag_t flag) if (cheat_hear) c |= 0x0200; if (cheat_room) c |= 0x0400; if (cheat_xtra) c |= 0x0800; - if (cheat_know) c |= 0x1000; if (cheat_live) c |= 0x2000; do_u16b(&c, ls_flag_t::SAVE); } diff --git a/src/melee1.cc b/src/melee1.cc index fb2b1749..2753f78c 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -232,7 +232,7 @@ bool_ carried_make_attack_normal(int r_idx) char ddesc[80] = "your symbiote"; cptr sym_name = symbiote_name(TRUE); - bool_ touched = FALSE, alive = TRUE; + bool_ alive = TRUE; /* Not allowed to attack */ if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE); @@ -246,9 +246,6 @@ bool_ carried_make_attack_normal(int r_idx) /* Scan through all four blows */ for (ap_cnt = 0; ap_cnt < 4; ap_cnt++) { - bool_ visible = FALSE; - bool_ obvious = FALSE; - int power = 0; int damage = 0; @@ -271,9 +268,6 @@ bool_ carried_make_attack_normal(int r_idx) /* Handle "leaving" */ if (p_ptr->leaving) break; - /* Extract visibility (before blink) */ - visible = TRUE; - /* Extract the attack "power" */ power = get_attack_power(effect); @@ -290,9 +284,6 @@ bool_ carried_make_attack_normal(int r_idx) (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { - /* Remember the Evil-ness */ - r_ptr->r_flags3 |= (RF3_EVIL); - /* Message */ msg_format("%s is repelled.", sym_name); @@ -306,9 +297,6 @@ bool_ carried_make_attack_normal(int r_idx) (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { - /* Remember the Good-ness */ - r_ptr->r_flags3 |= (RF3_GOOD); - /* Message */ msg_format("%s is repelled.", sym_name); @@ -326,7 +314,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "hits you."; do_cut = do_stun = 1; - touched = TRUE; sound(SOUND_HIT); break; } @@ -334,7 +321,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_TOUCH: { act = "touches you."; - touched = TRUE; sound(SOUND_TOUCH); break; } @@ -342,7 +328,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_PUNCH: { act = "punches you."; - touched = TRUE; do_stun = 1; sound(SOUND_HIT); break; @@ -351,7 +336,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_KICK: { act = "kicks you."; - touched = TRUE; do_stun = 1; sound(SOUND_HIT); break; @@ -360,7 +344,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_CLAW: { act = "claws you."; - touched = TRUE; do_cut = 1; sound(SOUND_CLAW); break; @@ -370,7 +353,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "bites you."; do_cut = 1; - touched = TRUE; sound(SOUND_BITE); break; } @@ -378,7 +360,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_STING: { act = "stings you."; - touched = TRUE; sound(SOUND_STING); break; } @@ -393,7 +374,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "butts you."; do_stun = 1; - touched = TRUE; sound(SOUND_HIT); break; } @@ -402,7 +382,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "crushes you."; do_stun = 1; - touched = TRUE; sound(SOUND_CRUSH); break; } @@ -410,7 +389,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_ENGULF: { act = "engulfs you."; - touched = TRUE; sound(SOUND_CRUSH); break; } @@ -418,7 +396,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_CHARGE: { act = "charges you."; - touched = TRUE; sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */ break; } @@ -426,7 +403,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_CRAWL: { act = "crawls on you."; - touched = TRUE; sound(SOUND_SLIME); break; } @@ -513,9 +489,6 @@ bool_ carried_make_attack_normal(int r_idx) if (act) msg_format("%s %s", sym_name, act); - /* Hack -- assume all attacks are obvious */ - obvious = TRUE; - /* Roll out the damage */ damage = damroll(d_dice, d_side); @@ -524,9 +497,6 @@ bool_ carried_make_attack_normal(int r_idx) { case 0: { - /* Hack -- Assume obvious */ - obvious = TRUE; - /* Hack -- No damage */ damage = 0; @@ -535,9 +505,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_HURT: { - /* Obvious */ - obvious = TRUE; - /* Hack -- Player armor reduces total damage */ damage -= (damage * ((ac < 150) ? ac : 150) / 250); @@ -550,9 +517,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_ABOMINATION: { - /* Obvious */ - obvious = TRUE; - /* Morph, but let mimicry skill have a chance to stop this */ if (magik(60 - get_skill(SKILL_MIMICRY))) { @@ -572,8 +536,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_SANITY: { - obvious = TRUE; - take_sanity_hit(damage, ddesc); break; } @@ -587,10 +549,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Take "poison" effect */ if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { - if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5)) - { - obvious = TRUE; - } + set_poisoned(p_ptr->poisoned + randint(rlev) + 5); } break; @@ -606,7 +565,7 @@ bool_ carried_make_attack_normal(int r_idx) if (!p_ptr->resist_disen) { /* Apply disenchantment */ - if (apply_disenchant(0)) obvious = TRUE; + apply_disenchant(0); } break; @@ -654,9 +613,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_ACID: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are covered in acid!"); @@ -669,9 +625,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_ELEC: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are struck by electricity!"); @@ -685,9 +638,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_FIRE: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are enveloped in flames!"); @@ -701,9 +651,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_COLD: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are covered with frost!"); @@ -724,10 +671,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Increase "blind" */ if (!p_ptr->resist_blind) { - if (set_blind(p_ptr->blind + 10 + randint(rlev))) - { - obvious = TRUE; - } + set_blind(p_ptr->blind + 10 + randint(rlev)); } @@ -743,10 +687,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Increase "confused" */ if (!p_ptr->resist_conf) { - if (set_confused(p_ptr->confused + 3 + randint(rlev))) - { - obvious = TRUE; - } + set_confused(p_ptr->confused + 3 + randint(rlev)); } @@ -763,19 +704,14 @@ bool_ carried_make_attack_normal(int r_idx) if (p_ptr->resist_fear) { msg_print("You stand your ground!"); - obvious = TRUE; } else if (rand_int(100) < p_ptr->skill_sav) { msg_print("You stand your ground!"); - obvious = TRUE; } else { - if (set_afraid(p_ptr->afraid + 3 + randint(rlev))) - { - obvious = TRUE; - } + set_afraid(p_ptr->afraid + 3 + randint(rlev)); } @@ -795,19 +731,14 @@ bool_ carried_make_attack_normal(int r_idx) if (p_ptr->free_act) { msg_print("You are unaffected!"); - obvious = TRUE; } else if (rand_int(100) < p_ptr->skill_sav) { msg_print("You resist the effects!"); - obvious = TRUE; } else { - if (set_paralyzed(3 + randint(rlev))) - { - obvious = TRUE; - } + set_paralyzed(3 + randint(rlev)); } @@ -821,7 +752,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_STR, STAT_DEC_NORMAL); break; } @@ -833,7 +764,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_INT, STAT_DEC_NORMAL); break; } @@ -845,7 +776,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_WIS, STAT_DEC_NORMAL); break; } @@ -857,7 +788,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_DEX, STAT_DEC_NORMAL); break; } @@ -869,7 +800,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_CON, STAT_DEC_NORMAL); break; } @@ -881,7 +812,7 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_CHR, STAT_DEC_NORMAL); break; } @@ -893,21 +824,18 @@ bool_ carried_make_attack_normal(int r_idx) take_hit(damage, ddesc); /* Damage (stats) */ - if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_DEX, STAT_DEC_NORMAL); + do_dec_stat(A_CON, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_CHR, STAT_DEC_NORMAL); break; } case RBE_SHATTER: { - /* Obvious */ - obvious = TRUE; - /* Hack -- Reduce damage based on the player armor class */ damage -= (damage * ((ac < 150) ? ac : 150) / 250); @@ -928,9 +856,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_EXP_10: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ carried_monster_hit = TRUE; take_hit(damage, ddesc); @@ -958,9 +883,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_EXP_20: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ carried_monster_hit = TRUE; take_hit(damage, ddesc); @@ -988,9 +910,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_EXP_40: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ carried_monster_hit = TRUE; take_hit(damage, ddesc); @@ -1018,9 +937,6 @@ bool_ carried_make_attack_normal(int r_idx) case RBE_EXP_80: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ carried_monster_hit = TRUE; take_hit(damage, ddesc); @@ -1055,10 +971,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Take "poison" effect */ if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { - if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5)) - { - obvious = TRUE; - } + set_poisoned(p_ptr->poisoned + randint(rlev) + 5); } /* Damage CON (10% chance)*/ @@ -1066,16 +979,13 @@ bool_ carried_make_attack_normal(int r_idx) { /* 1% chance for perm. damage */ bool_ perm = (randint(10) == 1); - if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE; + dec_stat(A_CON, randint(10), perm); } break; } case RBE_PARASITE: { - /* Obvious */ - obvious = TRUE; - if (!p_ptr->parasite) set_parasite(damage, r_idx); break; @@ -1088,10 +998,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Increase "image" */ if (!p_ptr->resist_chaos) { - if (set_image(p_ptr->image + 3 + randint(rlev / 2))) - { - obvious = TRUE; - } + set_image(p_ptr->image + 3 + randint(rlev / 2)); } break; @@ -1265,20 +1172,6 @@ bool_ carried_make_attack_normal(int r_idx) /* Apply the stun */ if (k) (void)set_stun(p_ptr->stun + k); } - - if (touched) - { - if (p_ptr->sh_fire && alive) - { - r_ptr->r_flags3 |= RF3_IM_FIRE; - } - - if (p_ptr->sh_elec && alive) - { - r_ptr->r_flags3 |= RF3_IM_ELEC; - } - touched = FALSE; - } } /* Monster missed player */ @@ -1309,21 +1202,6 @@ bool_ carried_make_attack_normal(int r_idx) break; } } - - - /* Analyze "visible" monsters only */ - if (visible) - { - /* Count "obvious" attacks (and ones that cause damage) */ - if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) - { - /* Count attacks of this type */ - if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) - { - r_ptr->r_blows[ap_cnt]++; - } - } - } } /* Assume we attacked */ return (TRUE); @@ -1403,9 +1281,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Scan through all four blows */ for (ap_cnt = 0; ap_cnt < 4; ap_cnt++) { - bool_ visible = FALSE; - bool_ obvious = FALSE; - int power = 0; int damage = 0; @@ -1428,9 +1303,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Handle "leaving" */ if (p_ptr->leaving) break; - /* Extract visibility (before blink) */ - if (m_ptr->ml) visible = TRUE; - /* Extract the attack "power" */ switch (effect) { @@ -1565,9 +1437,6 @@ bool_ make_attack_normal(int m_idx, byte divis) if ((randint(100000) < chance) && (r_ptr->flags3 & (RF3_EVIL))) { - /* Remember the Evil-ness */ - r_ptr->r_flags3 |= (RF3_EVIL); - /* Message */ msg_format("The hand of Eru Iluvatar stops %s blow.", m_name); @@ -1582,12 +1451,6 @@ bool_ make_attack_normal(int m_idx, byte divis) (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { - /* Remember the Evil-ness */ - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_EVIL); - } - /* Message */ msg_format("%^s is repelled.", m_name); @@ -1601,12 +1464,6 @@ bool_ make_attack_normal(int m_idx, byte divis) (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { - /* Remember the Good-ness */ - if (m_ptr->ml) - { - r_ptr->r_flags3 |= (RF3_GOOD); - } - /* Message */ msg_format("%^s is repelled.", m_name); @@ -1832,9 +1689,6 @@ bool_ make_attack_normal(int m_idx, byte divis) black_breath_attack(450 - m_ptr->level); } - /* Hack -- assume all attacks are obvious */ - obvious = TRUE; - /* Roll out the damage */ damage = damroll(d_dice, d_side); @@ -1846,9 +1700,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { case 0: { - /* Hack -- Assume obvious */ - obvious = TRUE; - /* Hack -- No damage */ damage = 0; @@ -1857,9 +1708,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_HURT: { - /* Obvious */ - obvious = TRUE; - /* Hack -- Player armor reduces total damage */ damage -= (damage * ((ac < 150) ? ac : 150) / 250); @@ -1871,9 +1719,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_ABOMINATION: { - /* Obvious */ - obvious = TRUE; - /* Morph, but let mimicry skill have a chance to stop this */ if (magik(60 - get_skill(SKILL_MIMICRY))) { @@ -1893,8 +1738,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_SANITY: { - obvious = TRUE; - take_sanity_hit(damage, ddesc); break; } @@ -1907,10 +1750,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Take "poison" effect */ if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { - if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5)) - { - obvious = TRUE; - } + set_poisoned(p_ptr->poisoned + randint(rlev) + 5); } /* Learn about the player */ @@ -1927,8 +1767,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Allow complete resist */ if (!p_ptr->resist_disen) { - /* Apply disenchantment */ - if (apply_disenchant(0)) obvious = TRUE; + apply_disenchant(0); } /* Learn about the player */ @@ -1964,9 +1803,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Message */ msg_print("Energy drains from your pack!"); - /* Obvious */ - obvious = TRUE; - /* Heal */ j = rlev; m_ptr->hp += j * o_ptr->pval * o_ptr->number; @@ -1997,9 +1833,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Take some damage */ take_hit(damage, ddesc); - /* Obvious */ - obvious = TRUE; - /* Saving throw (unless paralyzed) based on dex and level */ if (!p_ptr->paralyzed && (rand_int(100) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] + @@ -2082,9 +1915,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Occasional "blink" anyway */ blinked = TRUE; - /* Obvious */ - obvious = TRUE; - /* Done */ break; } @@ -2157,9 +1987,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Steal the items */ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE); - /* Obvious */ - obvious = TRUE; - /* Blink away */ blinked = TRUE; @@ -2201,9 +2028,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Steal the items */ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE); - /* Obvious */ - obvious = TRUE; - /* Done */ break; } @@ -2230,7 +2054,6 @@ bool_ make_attack_normal(int m_idx, byte divis) if (!p_ptr->blind) { msg_print("Your light dims."); - obvious = TRUE; } /* Window stuff */ @@ -2242,9 +2065,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_ACID: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are covered in acid!"); @@ -2259,9 +2079,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_ELEC: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are struck by electricity!"); @@ -2276,9 +2093,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_FIRE: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are enveloped in flames!"); @@ -2293,9 +2107,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_COLD: { - /* Obvious */ - obvious = TRUE; - /* Message */ msg_print("You are covered with frost!"); @@ -2316,10 +2127,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Increase "blind" */ if (!p_ptr->resist_blind) { - if (set_blind(p_ptr->blind + 10 + randint(rlev))) - { - obvious = TRUE; - } + set_blind(p_ptr->blind + 10 + randint(rlev)); } /* Learn about the player */ @@ -2336,10 +2144,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Increase "confused" */ if (!p_ptr->resist_conf) { - if (set_confused(p_ptr->confused + 3 + randint(rlev))) - { - obvious = TRUE; - } + set_confused(p_ptr->confused + 3 + randint(rlev)); } /* Learn about the player */ @@ -2357,19 +2162,14 @@ bool_ make_attack_normal(int m_idx, byte divis) if (p_ptr->resist_fear) { msg_print("You stand your ground!"); - obvious = TRUE; } else if (rand_int(100) < p_ptr->skill_sav) { msg_print("You stand your ground!"); - obvious = TRUE; } else { - if (set_afraid(p_ptr->afraid + 3 + randint(rlev))) - { - obvious = TRUE; - } + set_afraid(p_ptr->afraid + 3 + randint(rlev)); } /* Learn about the player */ @@ -2390,19 +2190,14 @@ bool_ make_attack_normal(int m_idx, byte divis) if (p_ptr->free_act) { msg_print("You are unaffected!"); - obvious = TRUE; } else if (rand_int(100) < p_ptr->skill_sav) { msg_print("You resist the effects!"); - obvious = TRUE; } else { - if (set_paralyzed(3 + randint(rlev))) - { - obvious = TRUE; - } + set_paralyzed(3 + randint(rlev)); } /* Learn about the player */ @@ -2417,7 +2212,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_STR, STAT_DEC_NORMAL); break; } @@ -2428,7 +2223,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_INT, STAT_DEC_NORMAL); break; } @@ -2439,7 +2234,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_WIS, STAT_DEC_NORMAL); break; } @@ -2450,7 +2245,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_DEX, STAT_DEC_NORMAL); break; } @@ -2461,7 +2256,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_CON, STAT_DEC_NORMAL); break; } @@ -2472,7 +2267,7 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stat) */ - if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_CHR, STAT_DEC_NORMAL); break; } @@ -2483,21 +2278,18 @@ bool_ make_attack_normal(int m_idx, byte divis) take_hit(damage, ddesc); /* Damage (stats) */ - if (do_dec_stat(A_STR, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_DEX, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_CON, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_INT, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_WIS, STAT_DEC_NORMAL)) obvious = TRUE; - if (do_dec_stat(A_CHR, STAT_DEC_NORMAL)) obvious = TRUE; + do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_DEX, STAT_DEC_NORMAL); + do_dec_stat(A_CON, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_CHR, STAT_DEC_NORMAL); break; } case RBE_SHATTER: { - /* Obvious */ - obvious = TRUE; - /* Hack -- Reduce damage based on the player armor class */ damage -= (damage * ((ac < 150) ? ac : 150) / 250); @@ -2517,9 +2309,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_EXP_10: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ take_hit(damage, ddesc); @@ -2546,9 +2335,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_EXP_20: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ take_hit(damage, ddesc); @@ -2575,9 +2361,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_EXP_40: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ take_hit(damage, ddesc); @@ -2604,9 +2387,6 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBE_EXP_80: { - /* Obvious */ - obvious = TRUE; - /* Take damage */ take_hit(damage, ddesc); @@ -2639,10 +2419,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Take "poison" effect */ if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { - if (set_poisoned(p_ptr->poisoned + randint(rlev) + 5)) - { - obvious = TRUE; - } + set_poisoned(p_ptr->poisoned + randint(rlev) + 5); } /* Damage CON (10% chance)*/ @@ -2650,7 +2427,7 @@ bool_ make_attack_normal(int m_idx, byte divis) { /* 1% chance for perm. damage */ bool_ perm = (randint(10) == 1); - if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE; + dec_stat(A_CON, randint(10), perm); } break; @@ -2663,10 +2440,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Increase "image" */ if (!p_ptr->resist_chaos) { - if (set_image(p_ptr->image + 3 + randint(rlev / 2))) - { - obvious = TRUE; - } + set_image(p_ptr->image + 3 + randint(rlev / 2)); } /* Learn about the player */ @@ -2745,9 +2519,6 @@ bool_ make_attack_normal(int m_idx, byte divis) } case RBE_PARASITE: { - /* Obvious */ - obvious = TRUE; - if (!p_ptr->parasite) set_parasite(damage, m_ptr->r_idx); break; @@ -2877,11 +2648,6 @@ bool_ make_attack_normal(int m_idx, byte divis) alive = FALSE; } } - else - { - if (m_ptr->ml) - r_ptr->r_flags3 |= RF3_IM_FIRE; - } } if (p_ptr->sh_elec && alive) @@ -2896,12 +2662,8 @@ bool_ make_attack_normal(int m_idx, byte divis) alive = FALSE; } } - else - { - if (m_ptr->ml) - r_ptr->r_flags3 |= RF3_IM_ELEC; - } } + if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_COUNTER) && alive) { msg_format("%^s gets bashed by your mystic shield!", m_name); @@ -2912,6 +2674,7 @@ bool_ make_attack_normal(int m_idx, byte divis) alive = FALSE; } } + if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_FIRE) && alive) { if (!(r_ptr->flags3 & RF3_IM_FIRE)) @@ -2924,12 +2687,8 @@ bool_ make_attack_normal(int m_idx, byte divis) alive = FALSE; } } - else - { - if (m_ptr->ml) - r_ptr->r_flags3 |= RF3_IM_FIRE; - } } + if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_GREAT_FIRE) && alive) { msg_format("%^s gets burned by your fiery shield!", m_name); @@ -2940,6 +2699,7 @@ bool_ make_attack_normal(int m_idx, byte divis) alive = FALSE; } } + if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_FEAR) && alive) { int tmp; @@ -2993,21 +2753,6 @@ bool_ make_attack_normal(int m_idx, byte divis) break; } } - - - /* Analyze "visible" monsters only */ - if (visible) - { - /* Count "obvious" attacks (and ones that cause damage) */ - if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) - { - /* Count attacks of this type */ - if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) - { - r_ptr->r_blows[ap_cnt]++; - } - } - } } @@ -3018,13 +2763,7 @@ bool_ make_attack_normal(int m_idx, byte divis) teleport_away(m_idx, MAX_SIGHT * 2 + 5); } - - /* Always notice cause of death */ - if (death && (r_ptr->r_deaths < MAX_SHORT)) - { - r_ptr->r_deaths++; - } - + /* Fear */ if (m_ptr->ml && fear) { sound (SOUND_FLEE); diff --git a/src/melee2.cc b/src/melee2.cc index e4f0802a..080208f1 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -1712,12 +1712,6 @@ static bool_ monst_spell_monst(int m_idx) (tr_ptr->flags3 & (RF3_NO_CONF)) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { - /* Memorize a flag */ - if (tr_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) tr_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* No obvious effect */ if (see_t) { @@ -1756,11 +1750,6 @@ static bool_ monst_spell_monst(int m_idx) (tr_ptr->flags3 & (RF3_NO_CONF)) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { - /* Memorize a flag */ - if (tr_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) tr_ptr->r_flags3 |= (RF3_NO_CONF); - } /* No obvious effect */ if (see_t) { @@ -2296,7 +2285,6 @@ static bool_ monst_spell_monst(int m_idx) { if (see_t) { - tr_ptr->r_flags3 |= RF3_RES_TELE; monster_msg("%^s is unaffected!", t_name); } resists_tele = TRUE; @@ -2305,7 +2293,6 @@ static bool_ monst_spell_monst(int m_idx) { if (see_t) { - tr_ptr->r_flags3 |= RF3_RES_TELE; monster_msg("%^s resists!", t_name); } resists_tele = TRUE; @@ -2713,39 +2700,6 @@ static bool_ monst_spell_monst(int m_idx) t_ptr->csleep = 0; } - - /* Remember what the monster did, if we saw it */ - if (seen) - { - /* Inate spell */ - if (thrown_spell < 32*4) - { - r_ptr->r_flags4 |= (1L << (thrown_spell - 32 * 3)); - if (r_ptr->r_cast_inate < MAX_UCHAR) r_ptr->r_cast_inate++; - } - - /* Bolt or Ball */ - else if (thrown_spell < 32*5) - { - r_ptr->r_flags5 |= (1L << (thrown_spell - 32 * 4)); - if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++; - } - - /* Special spell */ - else if (thrown_spell < 32*6) - { - r_ptr->r_flags6 |= (1L << (thrown_spell - 32 * 5)); - if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++; - } - } - - /* Always take note of monsters that kill you --- - * even accidentally */ - if (death && (r_ptr->r_deaths < MAX_SHORT)) - { - r_ptr->r_deaths++; - } - /* A spell was cast */ return (TRUE); } @@ -4554,38 +4508,6 @@ static bool_ make_attack_spell(int m_idx) } } - /* Remember what the monster did to us */ - if (seen) - { - /* Inate spell */ - if (thrown_spell < 32*4) - { - r_ptr->r_flags4 |= (1L << (thrown_spell - 32 * 3)); - if (r_ptr->r_cast_inate < MAX_UCHAR) r_ptr->r_cast_inate++; - } - - /* Bolt or Ball */ - else if (thrown_spell < 32*5) - { - r_ptr->r_flags5 |= (1L << (thrown_spell - 32 * 4)); - if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++; - } - - /* Special spell */ - else if (thrown_spell < 32*6) - { - r_ptr->r_flags6 |= (1L << (thrown_spell - 32 * 5)); - if (r_ptr->r_cast_spell < MAX_UCHAR) r_ptr->r_cast_spell++; - } - } - - - /* Always take note of monsters that kill you */ - if (death && (r_ptr->r_deaths < MAX_SHORT)) - { - r_ptr->r_deaths++; - } - /* A spell was cast */ return (TRUE); } @@ -5449,9 +5371,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) /* Scan through all four blows */ for (int ap_cnt = 0; ap_cnt < 4; ap_cnt++) { - bool_ visible = FALSE; - bool_ obvious = FALSE; - int power = 0; int damage = 0; @@ -5482,9 +5401,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) /* break; */ } - /* Extract visibility (before blink) */ - if (m_ptr->ml) visible = TRUE; - /* Extract the attack "power" */ power = get_attack_power(effect); @@ -5680,9 +5596,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) } - /* Hack -- assume all attacks are obvious */ - obvious = TRUE; - /* Roll out the damage */ damage = damroll(d_dice, d_side); @@ -5846,8 +5759,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) { blinked = FALSE; monster_msg("%^s is suddenly very hot!", m_name); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_FIRE; } project(t_idx, 0, m_ptr->fy, m_ptr->fx, damroll (1 + ((t_ptr->level) / 26), @@ -5862,8 +5773,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) { blinked = FALSE; monster_msg("%^s gets zapped!", m_name); - if (t_ptr->ml) - tr_ptr->r_flags2 |= RF2_AURA_ELEC; } project(t_idx, 0, m_ptr->fy, m_ptr->fx, damroll (1 + ((t_ptr->level) / 26), @@ -5908,21 +5817,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) } } } - - - /* Analyze "visible" monsters only */ - if (visible) - { - /* Count "obvious" attacks (and ones that cause damage) */ - if (obvious || damage || (r_ptr->r_blows[ap_cnt] > 10)) - { - /* Count attacks of this type */ - if (r_ptr->r_blows[ap_cnt] < MAX_UCHAR) - { - r_ptr->r_blows[ap_cnt]++; - } - } - } } if (explode) @@ -6137,18 +6031,7 @@ static void process_monster(int m_idx, bool_ is_frien) { /* Monster wakes up "a little bit" */ m_ptr->csleep -= d; - - /* Notice the "not waking up" */ - if (m_ptr->ml) - { - /* Hack -- Count the ignores */ - if (r_ptr->r_ignore < MAX_UCHAR) - { - r_ptr->r_ignore++; - } - } } - /* Just woke up */ else { @@ -6165,12 +6048,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Dump a message */ msg_format("%^s wakes up.", m_name); - - /* Hack -- Count the wakings */ - if (r_ptr->r_wake < MAX_UCHAR) - { - r_ptr->r_wake++; - } } } } @@ -6399,10 +6276,6 @@ static void process_monster(int m_idx, bool_ is_frien) (r_ptr->flags1 & (RF1_RAND_25)) && (rand_int(100) < 75)) { - /* Memorize flags */ - if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_50); - if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_25); - /* Try four "random" directions */ mm[0] = mm[1] = mm[2] = mm[3] = 5; } @@ -6411,9 +6284,6 @@ static void process_monster(int m_idx, bool_ is_frien) else if ((r_ptr->flags1 & (RF1_RAND_50)) && (rand_int(100) < 50)) { - /* Memorize flags */ - if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_50); - /* Try four "random" directions */ mm[0] = mm[1] = mm[2] = mm[3] = 5; } @@ -6422,9 +6292,6 @@ static void process_monster(int m_idx, bool_ is_frien) else if ((r_ptr->flags1 & (RF1_RAND_25)) && (rand_int(100) < 25)) { - /* Memorize flags */ - if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_RAND_25); - /* Try four "random" directions */ mm[0] = mm[1] = mm[2] = mm[3] = 5; } @@ -6448,12 +6315,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Assume nothing */ bool_ did_open_door = FALSE; bool_ did_bash_door = FALSE; - bool_ did_take_item = FALSE; - bool_ did_kill_item = FALSE; - bool_ did_move_body = FALSE; - bool_ did_kill_body = FALSE; - bool_ did_pass_wall = FALSE; - bool_ did_kill_wall = FALSE; /* Take a zero-terminated array of "directions" */ for (i = 0; mm[i]; i++) @@ -6566,9 +6427,6 @@ static void process_monster(int m_idx, bool_ is_frien) { /* Pass through walls/doors/rubble */ do_move = TRUE; - - /* Monster went through a wall */ - did_pass_wall = TRUE; } /* Monster destroys walls (and doors) */ @@ -6577,9 +6435,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Eat through walls/doors/rubble */ do_move = TRUE; - /* Monster destroyed a wall */ - did_kill_wall = TRUE; - if (randint(GRINDNOISE) == 1) { msg_print("There is a grinding sound."); @@ -6600,9 +6455,6 @@ static void process_monster(int m_idx, bool_ is_frien) { /* Pass through walls/doors/rubble */ do_move = TRUE; - - /* Monster went through a wall */ - did_pass_wall = TRUE; } /* Monster moves through webs */ @@ -6843,11 +6695,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Allow movement */ do_move = TRUE; - /* Monster ate another monster */ - did_kill_body = TRUE; - - /* XXX XXX XXX Message */ - /* Kill the monster */ delete_monster(ny, nx); @@ -6879,11 +6726,6 @@ static void process_monster(int m_idx, bool_ is_frien) { /* Allow movement */ do_move = TRUE; - - /* Monster pushed past another monster */ - did_move_body = TRUE; - - /* XXX XXX XXX Message */ } } @@ -7044,9 +6886,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Only give a message for "take_item" */ if (r_ptr->flags2 & (RF2_TAKE_ITEM)) { - /* Take note */ - did_take_item = TRUE; - /* Describe observable situations */ if (m_ptr->ml && player_has_los_bold(ny, nx)) { @@ -7060,9 +6899,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Pick up the item */ else if (r_ptr->flags2 & (RF2_TAKE_ITEM)) { - /* Take note */ - did_take_item = TRUE; - /* Describe observable situations */ if (player_has_los_bold(ny, nx)) { @@ -7092,9 +6928,6 @@ static void process_monster(int m_idx, bool_ is_frien) /* Destroy the item */ else { - /* Take note */ - did_kill_item = TRUE; - /* Describe observable situations */ if (player_has_los_bold(ny, nx)) { @@ -7135,35 +6968,6 @@ static void process_monster(int m_idx, bool_ is_frien) } - /* Learn things from observable monster */ - if (m_ptr->ml) - { - /* Monster opened a door */ - if (did_open_door) r_ptr->r_flags2 |= (RF2_OPEN_DOOR); - - /* Monster bashed a door */ - if (did_bash_door) r_ptr->r_flags2 |= (RF2_BASH_DOOR); - - /* Monster tried to pick something up */ - if (did_take_item) r_ptr->r_flags2 |= (RF2_TAKE_ITEM); - - /* Monster tried to crush something */ - if (did_kill_item) r_ptr->r_flags2 |= (RF2_KILL_ITEM); - - /* Monster pushed past another monster */ - if (did_move_body) r_ptr->r_flags2 |= (RF2_MOVE_BODY); - - /* Monster ate another monster */ - if (did_kill_body) r_ptr->r_flags2 |= (RF2_KILL_BODY); - - /* Monster passed through a wall */ - if (did_pass_wall) r_ptr->r_flags2 |= (RF2_PASS_WALL); - - /* Monster destroyed a wall */ - if (did_kill_wall) r_ptr->r_flags2 |= (RF2_KILL_WALL); - } - - /* Hack -- get "bold" if out of options */ if (!do_turn && !do_move && m_ptr->monfear) { @@ -7270,56 +7074,10 @@ void process_monsters(void) monster_type *m_ptr; - int old_monster_race_idx; - - u32b old_r_flags1 = 0L; - u32b old_r_flags2 = 0L; - u32b old_r_flags3 = 0L; - u32b old_r_flags4 = 0L; - u32b old_r_flags5 = 0L; - u32b old_r_flags6 = 0L; - - byte old_r_blows0 = 0; - byte old_r_blows1 = 0; - byte old_r_blows2 = 0; - byte old_r_blows3 = 0; - - byte old_r_cast_inate = 0; - byte old_r_cast_spell = 0; - /* Check the doppleganger */ if (doppleganger && !(r_info[m_list[doppleganger].r_idx].flags9 & RF9_DOPPLEGANGER)) doppleganger = 0; - /* Memorize old race */ - old_monster_race_idx = monster_race_idx; - - /* Acquire knowledge */ - if (monster_race_idx) - { - /* Acquire current monster */ - monster_race *r_ptr = &r_info[monster_race_idx]; - - /* Memorize flags */ - old_r_flags1 = r_ptr->r_flags1; - old_r_flags2 = r_ptr->r_flags2; - old_r_flags3 = r_ptr->r_flags3; - old_r_flags4 = r_ptr->r_flags4; - old_r_flags5 = r_ptr->r_flags5; - old_r_flags6 = r_ptr->r_flags6; - - /* Memorize blows */ - old_r_blows0 = r_ptr->r_blows[0]; - old_r_blows1 = r_ptr->r_blows[1]; - old_r_blows2 = r_ptr->r_blows[2]; - old_r_blows3 = r_ptr->r_blows[3]; - - /* Memorize castings */ - old_r_cast_inate = r_ptr->r_cast_inate; - old_r_cast_spell = r_ptr->r_cast_spell; - } - - /* Hack -- calculate the "player noise" */ noise = (1L << (30 - p_ptr->skill_stl)); @@ -7447,30 +7205,4 @@ void process_monsters(void) /* Reset global index */ hack_m_idx = 0; - - - /* Tracking a monster race (the same one we were before) */ - if (monster_race_idx && (monster_race_idx == old_monster_race_idx)) - { - /* Acquire monster race */ - monster_race *r_ptr = &r_info[monster_race_idx]; - - /* Check for knowledge change */ - if ((old_r_flags1 != r_ptr->r_flags1) || - (old_r_flags2 != r_ptr->r_flags2) || - (old_r_flags3 != r_ptr->r_flags3) || - (old_r_flags4 != r_ptr->r_flags4) || - (old_r_flags5 != r_ptr->r_flags5) || - (old_r_flags6 != r_ptr->r_flags6) || - (old_r_blows0 != r_ptr->r_blows[0]) || - (old_r_blows1 != r_ptr->r_blows[1]) || - (old_r_blows2 != r_ptr->r_blows[2]) || - (old_r_blows3 != r_ptr->r_blows[3]) || - (old_r_cast_inate != r_ptr->r_cast_inate) || - (old_r_cast_spell != r_ptr->r_cast_spell)) - { - /* Window stuff */ - p_ptr->window |= (PW_MONSTER); - } - } } diff --git a/src/monster1.cc b/src/monster1.cc index 4e3e2c42..b1570382 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -33,63 +33,6 @@ static cptr wd_his[3] = { "its", "his", "her" }; - - - -/* - * Determine if the "armor" is known - * The higher the level, the fewer kills needed. - */ -static bool_ know_armour(std::shared_ptr r_ptr) -{ - s32b level = r_ptr->level; - - s32b kills = r_ptr->r_tkills; - - /* Normal monsters */ - if (kills > 304 / (4 + level)) return (TRUE); - - /* Skip non-uniques */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) return (FALSE); - - /* Unique monsters */ - if (kills > 304 / (38 + (5*level) / 4)) return (TRUE); - - /* Assume false */ - return (FALSE); -} - - -/* - * Determine if the "damage" of the given attack is known - * the higher the level of the monster, the fewer the attacks you need, - * the more damage an attack does, the more attacks you need - */ -static bool_ know_damage(std::shared_ptr r_ptr, int i) -{ - s32b level = r_ptr->level; - - s32b a = r_ptr->r_blows[i]; - - s32b d1 = r_ptr->blow[i].d_dice; - s32b d2 = r_ptr->blow[i].d_side; - - s32b d = d1 * d2; - - /* Normal monsters */ - if ((4 + level) * a > 80 * d) return (TRUE); - - /* Skip non-uniques */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) return (FALSE); - - /* Unique monsters */ - if ((4 + level) * (2 * a) > 80 * d) return (TRUE); - - /* Assume false */ - return (FALSE); -} - - /* * Hack -- display monster information using "text_out()" * @@ -102,7 +45,7 @@ static bool_ know_damage(std::shared_ptr r_ptr, int i) * left edge of the screen, on a cleared line, in which the recall is * to take place. One extra blank line is left after the recall. */ -static void roff_aux(std::shared_ptr r_ptr, int remem) +static void roff_aux(std::shared_ptr r_ptr) { bool_ old = FALSE; bool_ sin = FALSE; @@ -111,194 +54,43 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) cptr p, q; - int msex = 0; - bool_ breath = FALSE; bool_ magic = FALSE; - u32b flags1; - u32b flags2; - u32b flags3; - u32b flags4; - u32b flags5; - u32b flags6; - u32b flags7; - u32b flags9; - int vn = 0; byte color[64]; cptr vp[64]; - monster_race save_mem; + /* Shorthand */ + u32b const flags1 = r_ptr->flags1; + u32b const flags2 = r_ptr->flags2; + u32b const flags3 = r_ptr->flags3; + u32b const flags4 = r_ptr->flags4; + u32b const flags5 = r_ptr->flags5; + u32b const flags6 = r_ptr->flags6; + u32b const flags7 = r_ptr->flags7; + u32b const flags9 = r_ptr->flags9; - /* Cheat -- Know everything */ - if (cheat_know) + /* Extract a gender (if applicable) */ + int msex = 0; + if (flags1 & (RF1_FEMALE)) { - /* XXX XXX XXX */ - - /* Save the "old" memory */ - save_mem = *r_ptr; - - /* Hack -- Maximal kills */ - r_ptr->r_tkills = MAX_SHORT; - - /* Hack -- Maximal info */ - r_ptr->r_wake = r_ptr->r_ignore = MAX_UCHAR; - - /* Observe "maximal" attacks */ - for (m = 0; m < 4; m++) - { - /* Examine "actual" blows */ - if (r_ptr->blow[m].effect || r_ptr->blow[m].method) - { - /* Hack -- maximal observations */ - r_ptr->r_blows[m] = MAX_UCHAR; - } - } - - /* Hack -- maximal drops */ - r_ptr->r_drop_gold = r_ptr->r_drop_item = - (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) + - ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) + - ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) + - ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) + - ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) + - ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0)); - - /* Hack -- but only "valid" drops */ - if (r_ptr->flags1 & (RF1_ONLY_GOLD)) r_ptr->r_drop_item = 0; - if (r_ptr->flags1 & (RF1_ONLY_ITEM)) r_ptr->r_drop_gold = 0; - - /* Hack -- observe many spells */ - r_ptr->r_cast_inate = MAX_UCHAR; - r_ptr->r_cast_spell = MAX_UCHAR; - - /* Hack -- know all the flags */ - r_ptr->r_flags1 = r_ptr->flags1; - r_ptr->r_flags2 = r_ptr->flags2; - r_ptr->r_flags3 = r_ptr->flags3; - r_ptr->r_flags4 = r_ptr->flags4; - r_ptr->r_flags5 = r_ptr->flags5; - r_ptr->r_flags6 = r_ptr->flags6; - r_ptr->r_flags7 = r_ptr->flags7; - r_ptr->r_flags8 = r_ptr->flags8; - r_ptr->r_flags9 = r_ptr->flags9; + msex = 2; } - - - /* Extract a gender (if applicable) */ - if (r_ptr->flags1 & (RF1_FEMALE)) msex = 2; - else if (r_ptr->flags1 & (RF1_MALE)) msex = 1; - - - /* Obtain a copy of the "known" flags */ - flags1 = (r_ptr->flags1 & r_ptr->r_flags1); - flags2 = (r_ptr->flags2 & r_ptr->r_flags2); - flags3 = (r_ptr->flags3 & r_ptr->r_flags3); - flags4 = (r_ptr->flags4 & r_ptr->r_flags4); - flags5 = (r_ptr->flags5 & r_ptr->r_flags5); - flags6 = (r_ptr->flags6 & r_ptr->r_flags6); - flags7 = (r_ptr->flags7 & r_ptr->r_flags7); - flags9 = (r_ptr->flags9 & r_ptr->r_flags9); - - - /* Assume some "obvious" flags */ - if (r_ptr->flags1 & (RF1_UNIQUE)) flags1 |= (RF1_UNIQUE); - if (r_ptr->flags1 & (RF1_MALE)) flags1 |= (RF1_MALE); - if (r_ptr->flags1 & (RF1_FEMALE)) flags1 |= (RF1_FEMALE); - - /* Assume some "creation" flags */ - if (r_ptr->flags1 & (RF1_FRIEND)) flags1 |= (RF1_FRIEND); - if (r_ptr->flags1 & (RF1_FRIENDS)) flags1 |= (RF1_FRIENDS); - if (r_ptr->flags1 & (RF1_ESCORT)) flags1 |= (RF1_ESCORT); - if (r_ptr->flags1 & (RF1_ESCORTS)) flags1 |= (RF1_ESCORTS); - - /* Killing a monster reveals some properties */ - if (r_ptr->r_tkills) - { - /* Know "race" flags */ - if (r_ptr->flags3 & (RF3_ORC)) flags3 |= (RF3_ORC); - if (r_ptr->flags3 & (RF3_TROLL)) flags3 |= (RF3_TROLL); - if (r_ptr->flags3 & (RF3_GIANT)) flags3 |= (RF3_GIANT); - if (r_ptr->flags3 & (RF3_DRAGON)) flags3 |= (RF3_DRAGON); - if (r_ptr->flags3 & (RF3_DEMON)) flags3 |= (RF3_DEMON); - if (r_ptr->flags3 & (RF3_UNDEAD)) flags3 |= (RF3_UNDEAD); - if (r_ptr->flags3 & (RF3_EVIL)) flags3 |= (RF3_EVIL); - if (r_ptr->flags3 & (RF3_GOOD)) flags3 |= (RF3_GOOD); - if (r_ptr->flags3 & (RF3_ANIMAL)) flags3 |= (RF3_ANIMAL); - if (r_ptr->flags3 & (RF3_THUNDERLORD)) flags3 |= (RF3_THUNDERLORD); - if (r_ptr->flags7 & (RF7_SPIDER)) flags7 |= (RF7_SPIDER); - - /* Know "forced" flags */ - if (r_ptr->flags1 & (RF1_FORCE_DEPTH)) flags1 |= (RF1_FORCE_DEPTH); - if (r_ptr->flags1 & (RF1_FORCE_MAXHP)) flags1 |= (RF1_FORCE_MAXHP); + else if (flags1 & (RF1_MALE)) + { + msex = 1; } - /* Treat uniques differently */ if (flags1 & (RF1_UNIQUE)) { - /* Hack -- Determine if the unique is "dead" */ - bool_ dead = (r_ptr->max_num == 0) ? TRUE : FALSE; - - /* We've been killed... */ - if (r_ptr->r_deaths) - { - /* Killed ancestors */ - text_out(format("%^s has slain %d of your ancestors", - wd_he[msex], r_ptr->r_deaths)); - - /* But we've also killed it */ - if (dead) - { - text_out(format(", but you have avenged them! ") ); - } - - /* Unavenged (ever) */ - else - { - text_out(format(", who %s unavenged. ", - plural(r_ptr->r_deaths, "remains", "remain"))); - } - } - - /* Dead unique who never hurt us */ - else if (dead) + if (r_ptr->max_num == 0) { text_out("You have slain this foe. "); } } - /* Not unique, but killed us */ - else if (r_ptr->r_deaths) - { - /* Dead ancestors */ - text_out(format("%d of your ancestors %s been killed by this creature, ", - r_ptr->r_deaths, plural(r_ptr->r_deaths, "has", "have"))); - - /* Some kills this life */ - if (r_ptr->r_pkills) - { - text_out("and you have exterminated at least "); - text_out_c(TERM_L_GREEN, format("%d", r_ptr->r_pkills)); - text_out(" of the creatures. "); - } - - /* Some kills past lives */ - else if (r_ptr->r_tkills) - { - text_out(format("and %s have exterminated at least %d of the creatures. ", - "your ancestors", r_ptr->r_tkills)); - } - - /* No kills */ - else - { - text_out(format("and %s is not ever known to have been defeated. ", - wd_he[msex])); - } - } - /* Normal monsters */ else { @@ -310,13 +102,6 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) text_out(" of these creatures. "); } - /* Killed some last life */ - else if (r_ptr->r_tkills) - { - text_out(format("Your ancestors have killed at least %d of these creatures. ", - r_ptr->r_tkills)); - } - /* Killed none */ else { @@ -327,13 +112,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Descriptions */ { - char buf[2048]; - - /* Simple method */ - strcpy(buf, r_ptr->text); - - /* Dump it */ - text_out(buf); + text_out(r_ptr->text); text_out(" "); } @@ -360,7 +139,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) text_out_c(TERM_L_GREEN, "lives in the town or the wilderness"); old = TRUE; } - else if (r_ptr->r_tkills) + else { if (old) text_out(", "); @@ -382,7 +161,6 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Describe movement */ - if (TRUE) { /* Introduction */ if (old) @@ -466,7 +244,6 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Describe experience if known */ - if (r_ptr->r_tkills) { /* Introduction */ if (flags1 & (RF1_UNIQUE)) @@ -765,30 +542,14 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* End the sentence about inate/other spells */ if (breath || magic) { - /* Total casting */ - m = r_ptr->r_cast_inate + r_ptr->r_cast_spell; - /* Average frequency */ n = (r_ptr->freq_inate + r_ptr->freq_spell) / 2; /* Describe the spell frequency */ - if (m > 100) - { - text_out("; "); - text_out_c(TERM_L_GREEN, "1"); - text_out(" time in "); - text_out_c(TERM_L_GREEN, format("%d", 100 / n)); - } - - /* Guess at the frequency */ - else if (m) - { - n = ((n + 9) / 10) * 10; - text_out("; about "); - text_out_c(TERM_L_GREEN, "1"); - text_out(" time in "); - text_out_c(TERM_L_GREEN, format("%d", 100 / n)); - } + text_out("; "); + text_out_c(TERM_L_GREEN, "1"); + text_out(" time in "); + text_out_c(TERM_L_GREEN, format("%d", 100 / n)); /* End this sentence */ text_out(". "); @@ -796,7 +557,6 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Describe monster "toughness" */ - if (know_armour(r_ptr)) { /* Armor */ text_out(format("%^s has an armor rating of ", wd_he[msex])); @@ -1065,10 +825,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) } - /* Do we know how aware it is? */ - if (((static_cast(r_ptr->r_wake) * static_cast(r_ptr->r_wake)) > r_ptr->sleep) || - (r_ptr->r_ignore == MAX_UCHAR) || - ((r_ptr->sleep == 0) && (r_ptr->r_tkills >= 10))) + /* How aware is it? */ { cptr act; @@ -1123,34 +880,46 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Drops gold and/or items */ - if (r_ptr->r_drop_gold || r_ptr->r_drop_item) { + /* Calculate drops */ + byte drop_gold; + byte drop_item; + + drop_gold = drop_item = + (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) + + ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) + + ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) + + ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) + + ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) + + ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0)); + + if (r_ptr->flags1 & RF1_ONLY_GOLD) drop_item = 0; + if (r_ptr->flags1 & RF1_ONLY_ITEM) drop_gold = 0; + /* No "n" needed */ sin = FALSE; - /* Intro */ - text_out(format("%^s may carry", wd_he[msex])); - /* Count maximum drop */ - n = MAX(r_ptr->r_drop_gold, r_ptr->r_drop_item); + n = MAX(drop_gold, drop_item); - /* One drop (may need an "n") */ - if (n == 1) + /* Intro text */ + if (n == 0) { - text_out(" a"); + text_out(format("%^s carries no items", wd_he[msex])); + + } + else if (n == 1) + { + text_out(format("%^s may carry a", wd_he[msex])); sin = TRUE; } - - /* Two drops */ else if (n == 2) { - text_out(" one or two"); + text_out(format("%^s may carry one or two", wd_he[msex])); } - - /* Many drops */ else { - text_out(format(" up to %d", n)); + text_out(format("%^s may carry up to %d", wd_he[msex], n)); } @@ -1175,7 +944,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* Objects */ - if (r_ptr->r_drop_item) + if (drop_item) { /* Handle singular "an" */ if (sin) text_out("n"); @@ -1191,7 +960,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) } /* Treasures */ - if (r_ptr->r_drop_gold) + if (drop_gold) { /* Cancel prefix */ if (!p) sin = FALSE; @@ -1211,33 +980,27 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) } - /* Count the number of "known" attacks */ + /* Count the number of attacks */ for (n = 0, m = 0; m < 4; m++) { /* Skip non-attacks */ if (!r_ptr->blow[m].method) continue; /* Count known attacks */ - if (r_ptr->r_blows[m]) n++; + n++; } - /* Examine (and count) the actual attacks */ + /* Examine the actual attacks */ for (r = 0, m = 0; m < 4; m++) { - int method, effect, d1, d2; - /* Skip non-attacks */ if (!r_ptr->blow[m].method) continue; - /* Skip unknown attacks */ - if (!r_ptr->r_blows[m]) continue; - - /* Extract the attack info */ - method = r_ptr->blow[m].method; - effect = r_ptr->blow[m].effect; - d1 = r_ptr->blow[m].d_dice; - d2 = r_ptr->blow[m].d_side; + int method = r_ptr->blow[m].method; + int effect = r_ptr->blow[m].effect; + int d1 = r_ptr->blow[m].d_dice; + int d2 = r_ptr->blow[m].d_side; /* No method yet */ @@ -1457,7 +1220,7 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) text_out_c(TERM_YELLOW, q); /* Describe damage (if known) */ - if (d1 && d2 && know_damage(r_ptr, m)) + if (d1 && d2) { /* Display the damage */ text_out(" with damage"); @@ -1491,13 +1254,6 @@ static void roff_aux(std::shared_ptr r_ptr, int remem) /* All done */ text_out("\n"); - - /* Cheat -- know everything */ - if ((cheat_know) && (remem == 0)) - { - /* Hack -- restore memory */ - *r_ptr = save_mem; - } } /* @@ -1566,7 +1322,7 @@ static void roff_top(int r_idx, int ego) /* * Hack -- describe the given monster race at the top of the screen */ -void screen_roff(int r_idx, int ego, int remember) +void screen_roff(int r_idx, int ego) { auto r_ptr = race_info_idx(r_idx, ego); @@ -1577,7 +1333,7 @@ void screen_roff(int r_idx, int ego, int remember) Term_erase(0, 1, 255); /* Recall monster */ - roff_aux(r_ptr, remember); + roff_aux(r_ptr); /* Describe monster */ roff_top(r_idx, ego); @@ -1590,7 +1346,7 @@ void monster_description_out(int r_idx, int ego) { auto r_ptr = race_info_idx(r_idx, ego); roff_name(r_idx, ego); - roff_aux(r_ptr, 0); + roff_aux(r_ptr); } /* @@ -1614,7 +1370,7 @@ void display_roff(int r_idx, int ego) /* Recall monster */ auto r_ptr = race_info_idx(r_idx, ego); - roff_aux(r_ptr, 0); + roff_aux(r_ptr); /* Describe monster */ roff_top(r_idx, ego); diff --git a/src/monster1.hpp b/src/monster1.hpp index 1d71fef1..9f7128ea 100644 --- a/src/monster1.hpp +++ b/src/monster1.hpp @@ -1,5 +1,5 @@ #pragma once -extern void screen_roff(int r_idx, int ego, int remember); +extern void screen_roff(int r_idx, int ego); extern void display_roff(int r_idx, int ego); extern void monster_description_out(int r_idx, int ego); diff --git a/src/monster2.cc b/src/monster2.cc index e166950f..2beb671f 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1468,66 +1468,6 @@ void monster_race_desc(char *desc, int r_idx, int ego) -/* - * Learn about a monster (by "probing" it) - */ -void lore_do_probe(int m_idx) -{ - monster_type *m_ptr = &m_list[m_idx]; - - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Hack -- Memorize some flags */ - r_ptr->r_flags1 = r_ptr->flags1; - r_ptr->r_flags2 = r_ptr->flags2; - r_ptr->r_flags3 = r_ptr->flags3; - - /* Update monster recall window */ - if (monster_race_idx == m_ptr->r_idx) - { - /* Window stuff */ - p_ptr->window |= (PW_MONSTER); - } -} - - -/* - * Take note that the given monster just dropped some treasure - * - * Note that learning the "GOOD"/"GREAT" flags gives information - * about the treasure (even when the monster is killed for the first - * time, such as uniques, and the treasure has not been examined yet). - * - * This "indirect" method is used to prevent the player from learning - * exactly how much treasure a monster can drop from observing only - * a single example of a drop. This method actually observes how much - * gold and items are dropped, and remembers that information to be - * described later by the monster recall code. - */ -void lore_treasure(int m_idx, int num_item, int num_gold) -{ - monster_type *m_ptr = &m_list[m_idx]; - - monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Note the number of things dropped */ - if (num_item > r_ptr->r_drop_item) r_ptr->r_drop_item = num_item; - if (num_gold > r_ptr->r_drop_gold) r_ptr->r_drop_gold = num_gold; - - /* Hack -- memorize the good/great flags */ - if (r_ptr->flags1 & (RF1_DROP_GOOD)) r_ptr->r_flags1 |= (RF1_DROP_GOOD); - if (r_ptr->flags1 & (RF1_DROP_GREAT)) r_ptr->r_flags1 |= (RF1_DROP_GREAT); - - /* Update monster recall window */ - if (monster_race_idx == m_ptr->r_idx) - { - /* Window stuff */ - p_ptr->window |= (PW_MONSTER); - } -} - - - static void sanity_blast(monster_type * m_ptr, bool_ necro) { bool_ happened = FALSE; @@ -1592,9 +1532,6 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) /* Something frightening happens... */ msg_format("You behold the %s visage of %s!", horror_desc[(randint(MAX_HORROR)) - 1], m_name); - - r_ptr->r_flags2 |= RF2_ELDRITCH_HORROR; - } /* Undead characters are 50% likely to be unaffected */ @@ -1742,15 +1679,6 @@ void update_mon(int m_idx, bool_ full) /* Seen by vision */ bool_ easy = FALSE; - /* Seen by telepathy */ - bool_ hard = FALSE; - - /* Various extra flags */ - bool_ do_empty_mind = FALSE; - bool_ do_weird_mind = FALSE; - bool_ do_invisible = FALSE; - bool_ do_cold_blood = FALSE; - auto const r_ptr = m_ptr->race(); /* Calculate distance */ @@ -1789,20 +1717,21 @@ void update_mon(int m_idx, bool_ full) { /* Infravision only works on "warm" creatures */ /* Below, we will need to know that infravision failed */ - if (r_ptr->flags2 & (RF2_COLD_BLOOD)) do_cold_blood = TRUE; - - /* Infravision works */ - if (!do_cold_blood) easy = flag = TRUE; + if (!(r_ptr->flags2 & RF2_COLD_BLOOD)) + { + /* Infravision works */ + easy = flag = TRUE; + } } /* Use "illumination" */ if (player_can_see_bold(fy, fx)) { - /* Take note of invisibility */ - if (r_ptr->flags2 & (RF2_INVISIBLE)) do_invisible = TRUE; - /* Visible, or detectable, monsters get seen */ - if (!do_invisible || p_ptr->see_inv) easy = flag = TRUE; + if (p_ptr->see_inv || !(r_ptr->flags2 & RF2_INVISIBLE)) + { + easy = flag = TRUE; + } } } @@ -1834,16 +1763,14 @@ void update_mon(int m_idx, bool_ full) /* Empty mind, no telepathy */ if (r_ptr->flags2 & (RF2_EMPTY_MIND)) { - do_empty_mind = TRUE; + /* No telepathy */ } /* Weird mind, occasional telepathy */ else if (r_ptr->flags2 & (RF2_WEIRD_MIND)) { - do_weird_mind = TRUE; if (rand_int(100) < 10) { - hard = TRUE; flag = TRUE; } } @@ -1851,7 +1778,6 @@ void update_mon(int m_idx, bool_ full) /* Normal mind, allow telepathy */ else { - hard = TRUE; flag = TRUE; } } @@ -1883,29 +1809,12 @@ void update_mon(int m_idx, bool_ full) /* Update monster list window */ p_ptr->window |= (PW_M_LIST); - /* Hack -- Count "fresh" sightings */ - if (r_ptr->r_sights < MAX_SHORT) r_ptr->r_sights++; - /* Disturb on appearance */ if (disturb_move) { if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1); } } - - /* Apply telepathy */ - if (hard) - { - /* Hack -- Memorize mental flags */ - if (r_ptr->flags2 & (RF2_SMART)) r_ptr->r_flags2 |= (RF2_SMART); - if (r_ptr->flags2 & (RF2_STUPID)) r_ptr->r_flags2 |= (RF2_STUPID); - } - - /* Memorize various observable flags */ - if (do_empty_mind) r_ptr->r_flags2 |= (RF2_EMPTY_MIND); - if (do_weird_mind) r_ptr->r_flags2 |= (RF2_WEIRD_MIND); - if (do_cold_blood) r_ptr->r_flags2 |= (RF2_COLD_BLOOD); - if (do_invisible) r_ptr->r_flags2 |= (RF2_INVISIBLE); } /* The monster is not visible */ diff --git a/src/monster2.hpp b/src/monster2.hpp index 84f79e36..5ef5eaf9 100644 --- a/src/monster2.hpp +++ b/src/monster2.hpp @@ -23,8 +23,6 @@ extern errr get_mon_num_prep(void); extern s16b get_mon_num(int level); extern void monster_desc(char *desc, monster_type *m_ptr, int mode); extern void monster_race_desc(char *desc, int r_idx, int ego); -extern void lore_do_probe(int m_idx); -extern void lore_treasure(int m_idx, int num_item, int num_gold); extern void update_mon(int m_idx, bool_ full); extern void update_monsters(bool_ full); extern void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr); diff --git a/src/monster3.cc b/src/monster3.cc index 75227699..d01545ec 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -107,7 +107,6 @@ bool_ change_side(monster_type *m_ptr) bool_ ai_multiply(int m_idx) { monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; int k, y, x, oy = m_ptr->fy, ox = m_ptr->fx; bool_ is_frien = (is_friend(m_ptr) > 0); @@ -135,12 +134,6 @@ bool_ ai_multiply(int m_idx) /* Try to multiply */ if (multiply_monster(m_idx, (is_frien), FALSE)) { - /* Take note if visible */ - if (m_ptr->ml) - { - r_ptr->r_flags4 |= (RF4_MULTIPLY); - } - /* Multiplying takes energy */ return TRUE; } diff --git a/src/monster_race.hpp b/src/monster_race.hpp index f756d6ff..ad44aef0 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -79,35 +79,7 @@ struct monster_race byte cur_num; /* Monster population on current level */ - s16b r_sights; /* Count sightings of this monster */ - s16b r_deaths; /* Count deaths from this monster */ - s16b r_pkills; /* Count monsters killed in this life */ - s16b r_tkills; /* Count monsters killed in all lives */ - - byte r_wake; /* Number of times woken up (?) */ - byte r_ignore; /* Number of times ignored (?) */ - - byte r_xtra1; /* Something (unused) */ - byte r_xtra2; /* Something (unused) */ - - byte r_drop_gold; /* Max number of gold dropped at once */ - byte r_drop_item; /* Max number of item dropped at once */ - - byte r_cast_inate; /* Max number of inate spells seen */ - byte r_cast_spell; /* Max number of other spells seen */ - - byte r_blows[4]; /* Number of times each blow type was seen */ - - u32b r_flags1; /* Observed racial flags */ - u32b r_flags2; /* Observed racial flags */ - u32b r_flags3; /* Observed racial flags */ - u32b r_flags4; /* Observed racial flags */ - u32b r_flags5; /* Observed racial flags */ - u32b r_flags6; /* Observed racial flags */ - u32b r_flags7; /* Observed racial flags */ - u32b r_flags8; /* Observed racial flags */ - u32b r_flags9; /* Observed racial flags */ bool_ on_saved; /* Is the (unique) on a saved level ? */ diff --git a/src/object2.cc b/src/object2.cc index 18d0e980..54ed2636 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -4618,7 +4618,6 @@ static bool_ kind_is_good(int k_idx) /* Expensive rod tips are good */ case TV_ROD: { - /* Probing is not good, but Recall is*/ if (k_ptr->cost >= 4500) return TRUE; return FALSE; } diff --git a/src/spells1.cc b/src/spells1.cc index 7a203bb8..3859ed65 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -4491,23 +4491,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; } - case GF_IDENTIFY: - { - if (seen) obvious = TRUE; - - /* Probe */ - do_probe(c_ptr->m_idx); - - dam = 0; - break; - } - /* Death -- instant death */ case GF_DEATH: { if (seen) obvious = TRUE; - if (r_ptr->r_flags1 & RF1_UNIQUE) + if (r_ptr->flags1 & RF1_UNIQUE) { note = " resists."; dam = 0; @@ -4534,13 +4523,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is hit hard."; dam *= 3; - if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_ACID); } if (r_ptr->flags3 & (RF3_IM_ACID)) { note = " resists a lot."; dam /= 9; - if (seen) r_ptr->r_flags3 |= (RF3_IM_ACID); } break; } @@ -4553,13 +4540,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is hit hard."; dam *= 3; - if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_ELEC); } if (r_ptr->flags3 & (RF3_IM_ELEC)) { note = " resists a lot."; dam /= 9; - if (seen) r_ptr->r_flags3 |= (RF3_IM_ELEC); } break; } @@ -4572,13 +4557,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is hit hard."; dam *= 3; - if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_FIRE); } if (r_ptr->flags3 & (RF3_IM_FIRE)) { note = " resists a lot."; dam /= 9; - if (seen) r_ptr->r_flags3 |= (RF3_IM_FIRE); } break; } @@ -4591,13 +4574,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is hit hard."; dam *= 3; - if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_COLD); } if (r_ptr->flags3 & (RF3_IM_COLD)) { note = " resists a lot."; dam /= 9; - if (seen) r_ptr->r_flags3 |= (RF3_IM_COLD); } break; } @@ -4612,14 +4593,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is hit hard."; dam *= 3; do_pois *= 2; - if (seen) r_ptr->r_flags9 |= (RF9_SUSCEP_POIS); } if (r_ptr->flags3 & (RF3_IM_POIS)) { note = " resists a lot."; dam /= 9; do_pois = 0; - if (seen) r_ptr->r_flags3 |= (RF3_IM_POIS); } break; } @@ -4649,7 +4628,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) r_ptr->r_flags3 |= (RF3_IM_POIS); } else if (randint(3) == 1) do_poly = TRUE; break; @@ -4663,7 +4641,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { dam *= 2; note = " is hit hard."; - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); } break; } @@ -4676,13 +4653,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { dam = 0; note = " is immune."; - if (seen) r_ptr->r_flags3 |= (RF3_GOOD); } else if (r_ptr->flags3 & (RF3_EVIL)) { dam *= 2; note = " is hit hard."; - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); } else { @@ -4709,8 +4684,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) - r_ptr->r_flags3 |= (RF3_RES_PLAS); } break; } @@ -4723,21 +4696,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is immune."; dam = 0; - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); } else if (r_ptr->flags3 & (RF3_RES_NETH)) { note = " resists."; dam *= 3; dam /= (randint(6) + 6); - - if (seen) r_ptr->r_flags3 |= (RF3_RES_NETH); } else if (r_ptr->flags3 & (RF3_EVIL)) { dam /= 2; note = " resists somewhat."; - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); } break; } @@ -4758,7 +4727,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) r_ptr->r_flags3 |= (RF3_RES_WATE); } break; } @@ -4779,7 +4747,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) r_ptr->r_flags3 |= (RF3_RES_WATE); } if (who == 0) @@ -4953,7 +4920,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) r_ptr->r_flags3 |= (RF3_RES_DISE); } break; } @@ -4967,7 +4933,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " resists."; dam *= 3; dam /= (randint(6) + 6); - if (seen) r_ptr->r_flags3 |= (RF3_RES_NEXU); } break; } @@ -5120,13 +5085,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (r_ptr->flags1 & (RF1_UNIQUE)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " is unaffected!"; resist_tele = TRUE; } else if (m_ptr->level > randint(100)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " resists!"; resist_tele = TRUE; } @@ -5189,7 +5152,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; if (r_ptr->flags3 & (RF3_HURT_ROCK)) { - if (seen) r_ptr->r_flags3 |= (RF3_HURT_ROCK); note = " loses some skin!"; note_dies = " evaporates!"; dam *= 2; @@ -5401,12 +5363,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (r_ptr->flags3 & (RF3_NO_CONF)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ do_conf = 0; @@ -5498,14 +5454,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is hit hard."; dam *= 3; do_cut *= 2; - if (seen) r_ptr->r_flags3 |= (RF3_SUSCEP_COLD); } if (r_ptr->flags3 & (RF3_IM_COLD)) { note = " resists a lot."; dam /= 9; do_cut = 0; - if (seen) r_ptr->r_flags3 |= (RF3_IM_COLD); } break; } @@ -5521,15 +5475,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (r_ptr->flags3 & (RF3_NONLIVING)) || (strchr("Egv", r_ptr->d_char))) { - if (r_ptr->flags3 & (RF3_UNDEAD)) - { - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); - } - if (r_ptr->flags3 & (RF3_DEMON)) - { - if (seen) r_ptr->r_flags3 |= (RF3_DEMON); - } - note = " is unaffected!"; obvious = FALSE; dam = 0; @@ -5545,11 +5490,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((r_ptr->flags3 & (RF3_UNDEAD)) || (r_ptr->flags3 & (RF3_NONLIVING))) { - if (r_ptr->flags3 & (RF3_UNDEAD)) - { - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); - } - note = " is immune."; obvious = FALSE; dam = 0; @@ -5698,12 +5638,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((r_ptr->flags3 & (RF3_NO_SLEEP)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_SLEEP)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_SLEEP); - } - /* No obvious effect */ note = " is unaffected!"; obvious = FALSE; @@ -5757,12 +5691,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ /* No obvious effect */ note = " is unaffected!"; @@ -5800,12 +5728,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ /* No obvious effect */ note = " is unaffected!"; @@ -5907,12 +5829,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (r_ptr->flags3 & (RF3_NO_CONF)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ /* No obvious effect */ note = " is unaffected!"; @@ -5945,12 +5861,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) (!(r_ptr->flags3 & (RF3_DEMON))) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ /* No obvious effect */ note = " is unaffected!"; @@ -5983,12 +5893,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((r_ptr->flags3 & (RF3_NO_CONF)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ do_conf = 0; @@ -6036,12 +5940,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((r_ptr->flags3 & (RF3_NO_CONF)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ do_conf = 0; @@ -6116,12 +6014,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((r_ptr->flags3 & (RF3_NO_CONF)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { - /* Memorize a flag */ - if (r_ptr->flags3 & (RF3_NO_CONF)) - { - if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF); - } - /* Resist */ do_conf = 0; @@ -6155,9 +6047,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Obvious effect */ if (seen) obvious = TRUE; - /* Memorize the effects */ - if (seen) r_ptr->r_flags3 |= (RF3_HURT_LITE); - /* Special effect */ note = " cringes from the light!"; note_dies = " shrivels away in the light!"; @@ -6187,7 +6076,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } else if (r_ptr->flags3 & (RF3_HURT_LITE)) { - if (seen) r_ptr->r_flags3 |= (RF3_HURT_LITE); note = " cringes from the light!"; note_dies = " shrivels away in the light!"; dam *= 2; @@ -6223,9 +6111,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Notice effect */ if (seen) obvious = TRUE; - /* Memorize the effects */ - if (seen) r_ptr->r_flags3 |= (RF3_HURT_ROCK); - /* Cute little message */ note = " loses some skin!"; note_dies = " dissolves!"; @@ -6256,13 +6141,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (r_ptr->flags1 & (RF1_UNIQUE)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " is unaffected!"; resists_tele = TRUE; } else if (m_ptr->level > randint(100)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " resists!"; resists_tele = TRUE; } @@ -6271,7 +6154,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (!resists_tele) { if (seen) obvious = TRUE; - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); do_dist = dam; } } @@ -6302,13 +6184,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (r_ptr->flags1 & (RF1_UNIQUE)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " is unaffected!"; resists_tele = TRUE; } else if (m_ptr->level > randint(100)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " resists!"; resists_tele = TRUE; } @@ -6317,7 +6197,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (!resists_tele) { if (seen) obvious = TRUE; - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); do_dist = dam; } } @@ -6345,13 +6224,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (r_ptr->flags1 & (RF1_UNIQUE)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " is unaffected!"; resists_tele = TRUE; } else if (m_ptr->level > randint(100)) { - if (seen) r_ptr->r_flags3 |= RF3_RES_TELE; note = " resists!"; resists_tele = TRUE; } @@ -6378,9 +6255,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect undead */ if (r_ptr->flags3 & (RF3_UNDEAD)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); - /* Obvious */ if (seen) obvious = TRUE; @@ -6416,9 +6290,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect evil */ if (r_ptr->flags3 & (RF3_EVIL)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); - /* Obvious */ if (seen) obvious = TRUE; @@ -6480,9 +6351,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect undead */ if (r_ptr->flags3 & (RF3_UNDEAD)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_UNDEAD); - /* Obvious */ if (seen) obvious = TRUE; @@ -6511,9 +6379,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect evil */ if (r_ptr->flags3 & (RF3_EVIL)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_EVIL); - /* Obvious */ if (seen) obvious = TRUE; @@ -6541,9 +6406,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect good */ if (r_ptr->flags3 & (RF3_GOOD)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_GOOD); - /* Obvious */ if (seen) obvious = TRUE; @@ -6599,9 +6461,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Only affect demons */ if (r_ptr->flags3 & (RF3_DEMON)) { - /* Learn about type */ - if (seen) r_ptr->r_flags3 |= (RF3_DEMON); - /* Obvious */ if (seen) obvious = TRUE; @@ -8654,7 +8513,6 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) if (m_list[cave[y][x].m_idx].ml) { msg_print("The attack bounces!"); - ref_ptr->r_flags2 |= RF2_REFLECTING; } project(cave[y][x].m_idx, 0, t_y, t_x, dam, typ, flg); diff --git a/src/spells2.cc b/src/spells2.cc index 3882a914..5dfaa074 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -2294,7 +2294,7 @@ bool_ detect_treasure(int rad) * The "update function" is called exactly once if * the predicate succeeds. The */ -template static bool detect_monsters_fn(int radius, P p, U u) { +template static bool detect_monsters_fn(int radius, P p) { bool flag = false; /* Scan monsters */ for (int i = 1; i < m_max; i++) @@ -2320,19 +2320,6 @@ template static bool detect_monsters_fn(int radius, P p, auto r_ptr = m_ptr->race(); if (p(r_ptr.get())) { - /* Update */ - u(r_ptr.get()); - - /* We're assuming the update function does - * *something*, so we'll need to update - * the recall window if we're currently looking - * at it. - */ - if (monster_race_idx == m_ptr->r_idx) - { - p_ptr->window |= (PW_MONSTER); - } - /* Repair visibility later */ repair_monsters = TRUE; @@ -2361,11 +2348,9 @@ static bool_ detect_monsters_string(cptr chars, int rad) auto predicate = [chars](monster_race *r_ptr) -> bool { return strchr(chars, r_ptr->d_char); }; - auto update = [](monster_race *) -> void { - }; /* Describe */ - if (detect_monsters_fn(rad, predicate, update)) + if (detect_monsters_fn(rad, predicate)) { /* Describe result */ msg_print("You sense the presence of monsters!"); @@ -2502,10 +2487,8 @@ bool_ detect_monsters_normal(int rad) return (!(r_ptr->flags2 & (RF2_INVISIBLE))) || p_ptr->see_inv || p_ptr->tim_invis; }; - auto update = [](monster_race *) -> void { - }; - if (detect_monsters_fn(rad, predicate, update)) + if (detect_monsters_fn(rad, predicate)) { /* Describe result */ msg_print("You sense the presence of monsters!"); @@ -2526,11 +2509,8 @@ bool_ detect_monsters_invis(int rad) auto predicate = [](monster_race *r_ptr) -> bool { return (r_ptr->flags2 & (RF2_INVISIBLE)); }; - auto update = [](monster_race *r_ptr) -> void { - r_ptr->r_flags2 |= (RF2_INVISIBLE); - }; - if (detect_monsters_fn(rad, predicate, update)) + if (detect_monsters_fn(rad, predicate)) { /* Describe result */ msg_print("You sense the presence of invisible creatures!"); @@ -2552,11 +2532,8 @@ bool_ detect_monsters_xxx(u32b match_flag, int rad) auto predicate = [match_flag](monster_race *r_ptr) -> bool { return (r_ptr->flags3 & match_flag); }; - auto update = [match_flag](monster_race *r_ptr) -> void { - r_ptr->r_flags3 |= (match_flag); - }; - if (detect_monsters_fn(rad, predicate, update)) + if (detect_monsters_fn(rad, predicate)) { cptr desc_monsters = "weird monsters"; switch (match_flag) @@ -4219,94 +4196,6 @@ bool_ mass_genocide(bool_ player_cast) return (result); } -/* Probe a monster */ -void do_probe(int m_idx) -{ - char m_name[80]; - monster_type *m_ptr = &m_list[m_idx]; - - /* Get "the monster" or "something" */ - monster_desc(m_name, m_ptr, 0x04); - - /* Describe the monster */ - if (!wizard && (m_ptr->status != MSTATUS_COMPANION)) msg_format("%^s has %d hit points.", m_name, m_ptr->hp); - else - { - int i; - char t_name[80]; - msg_format("%^s has %d(%d) hit points, %d ac, %d speed.", m_name, m_ptr->hp, m_ptr->maxhp, m_ptr->ac, m_ptr->mspeed - 110); - msg_format("%^s attacks with:", m_name); - - for (i = 0; i < 4; i++) - { - msg_format(" Blow %d: %dd%d", i, m_ptr->blow[i].d_dice, m_ptr->blow[i].d_side); - } - - if (m_ptr->target > 0) - monster_desc(t_name, &m_list[m_ptr->target], 0x04); - else if (!m_ptr->target) - sprintf(t_name, "you"); - else - sprintf(t_name, "nothing"); - msg_format("%^s target is %s.", m_name, t_name); - - { - std::ostringstream buf; - buf << " has " << m_ptr->exp - << " exp and needs " << monster_exp(m_ptr->level + 1) << "."; - msg_format("%^s%s", m_name, buf.str().c_str()); - } - } - - /* Learn all of the non-spell, non-treasure flags */ - lore_do_probe(m_idx); -} - -/* - * Probe nearby monsters - */ -bool_ probing(void) -{ - int i; - - bool_ probe = FALSE; - - - /* Probe all (nearby) monsters */ - for (i = 1; i < m_max; i++) - { - monster_type *m_ptr = &m_list[i]; - - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; - - /* Require line of sight */ - if (!player_has_los_bold(m_ptr->fy, m_ptr->fx)) continue; - - /* Probe visible monsters */ - if (m_ptr->ml) - { - /* Start the message */ - if (!probe) msg_print("Probing..."); - - /* Actualy probe */ - do_probe(i); - - /* Probe worked */ - probe = TRUE; - } - } - - /* Done */ - if (probe) - { - msg_print("That's all."); - } - - /* Result */ - return (probe); -} - /* * The spell of destruction diff --git a/src/spells2.hpp b/src/spells2.hpp index bffc4a2c..ce72a883 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -46,8 +46,6 @@ extern void aggravate_monsters(int who); extern bool_ genocide_aux(bool_ player_cast, char typ); extern bool_ genocide(bool_ player_cast); extern bool_ mass_genocide(bool_ player_cast); -extern void do_probe(int m_idx); -extern bool_ probing(void); extern void change_wild_mode(void); extern bool_ banish_evil(int dist); extern bool_ dispel_evil(int dam); diff --git a/src/spells5.cc b/src/spells5.cc index f503c822..dc237382 100644 --- a/src/spells5.cc +++ b/src/spells5.cc @@ -1143,7 +1143,7 @@ void school_spells_init() spell_type_describe(spell, "Asks for an object and identifies it"); spell_type_describe(spell, "At level 17 it identifies all objects in the inventory"); spell_type_describe(spell, "At level 27 it identifies all objects in the inventory and in a"); - spell_type_describe(spell, "radius on the floor, as well as probing monsters in that radius"); + spell_type_describe(spell, "radius on the floor"); spell_type_set_mana(spell, 10, 50); spell_type_set_difficulty(spell, 8, 40); spell_type_init_mage(spell, @@ -2321,8 +2321,7 @@ void school_spells_init() { spell_type *spell = spell_new(&MUSIC_MIND, "Clairaudience(IV)"); spell_type_describe(spell, "Allows you to sense monster minds as long as you sing."); - spell_type_describe(spell, "At level 10 it identifies all objects in a radius on the floor,"); - spell_type_describe(spell, "as well as probing monsters in that radius."); + spell_type_describe(spell, "At level 10 it identifies all objects in a radius on the floor."); spell_type_describe(spell, "Consumes the amount of mana each turn."); spell_type_set_mana(spell, 15, 30); spell_type_set_difficulty(spell, 25, 75); diff --git a/src/variable.cc b/src/variable.cc index 6fa38470..524766ea 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -175,7 +175,6 @@ bool_ cheat_peek; /* Peek into object creation */ bool_ cheat_hear; /* Peek into monster creation */ bool_ cheat_room; /* Peek into dungeon creation */ bool_ cheat_xtra; /* Peek into something else */ -bool_ cheat_know; /* Know complete monster info */ bool_ cheat_live; /* Allow player to avoid death */ diff --git a/src/variable.hpp b/src/variable.hpp index 9c4340a0..543c1bd5 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -121,7 +121,6 @@ extern bool_ cheat_peek; extern bool_ cheat_hear; extern bool_ cheat_room; extern bool_ cheat_xtra; -extern bool_ cheat_know; extern bool_ cheat_live; extern byte hitpoint_warn; extern byte delay_factor; diff --git a/src/xtra1.cc b/src/xtra1.cc index 140d9edc..8815e756 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1446,8 +1446,8 @@ static void fix_m_list(void) attr = TERM_L_BLUE; } - /* Have we ever killed one? */ - if (r_ptr->r_tkills) + /* Have we killed one? */ + if (r_ptr->r_pkills) { if (r_ptr->level > dun_level) { diff --git a/src/xtra2.cc b/src/xtra2.cc index d3e01b71..52e0fc7b 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2470,15 +2470,10 @@ static void monster_death_gods(int m_idx, monster_type *m_ptr) */ void monster_death(int m_idx) { - int dump_item = 0; - int dump_gold = 0; - monster_type *m_ptr = &m_list[m_idx]; auto const r_ptr = m_ptr->race(); - bool_ visible = (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE))); - bool_ create_stairs = FALSE; int force_coin = get_coin_type(r_ptr); @@ -2548,9 +2543,6 @@ void monster_death(int m_idx) /* Delete the object */ delete_object_idx(this_o_idx); - if (q_ptr->tval == TV_GOLD) dump_gold++; - else dump_item++; - /* Drop it */ drop_near(q_ptr, -1, y, x); } @@ -2964,13 +2956,6 @@ void monster_death(int m_idx) if ((!force_coin) && (magik(10 + get_skill_scale(SKILL_PRESERVATION, 75))) && (!(m_ptr->mflag & MFLAG_NO_DROP))) place_corpse(m_ptr); - /* Take note of any dropped treasure */ - if (visible && (dump_item || dump_gold)) - { - /* Take notes on treasure */ - lore_treasure(m_idx, dump_item, dump_gold); - } - /* Create a magical staircase */ if (create_stairs && (dun_level < d_info[dungeon_type].maxdepth)) { @@ -3296,9 +3281,6 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) /* Count kills this life */ if (r_ptr->r_pkills < MAX_SHORT) r_ptr->r_pkills++; - /* Count kills in all lives */ - if (r_ptr->r_tkills < MAX_SHORT) r_ptr->r_tkills++; - /* Hack -- Auto-recall */ monster_race_track(m_ptr->r_idx, m_ptr->ego); } @@ -4080,7 +4062,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) Term_save(); /* Recall on screen */ - screen_roff(m_ptr->r_idx, m_ptr->ego, 0); + screen_roff(m_ptr->r_idx, m_ptr->ego); /* Hack -- Complete the prompt (again) */ Term_addstr( -1, TERM_WHITE, format(" [r,%s]", info)); @@ -4429,8 +4411,6 @@ bool_ target_set(int mode) char info[80]; - cave_type *c_ptr; - int screen_wid, screen_hgt; int panel_wid, panel_hgt; @@ -4465,7 +4445,7 @@ bool_ target_set(int mode) x = points[m].x(); /* Access */ - c_ptr = &cave[y][x]; + cave_type *c_ptr = &cave[y][x]; /* Allow target */ if (target_able(c_ptr->m_idx)) @@ -4631,9 +4611,6 @@ bool_ target_set(int mode) /* Arbitrary grids */ else { - /* Access */ - c_ptr = &cave[y][x]; - /* Default prompt */ strcpy(info, "q,t,p,m,+,-,'dir'"); -- cgit v1.2.3 From 0cb03efd7c438ee8fc5d9444e0c8e60a8eeb7f16 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove redundant parens from RFn_* in expressions --- src/cave.cc | 20 ++-- src/cmd1.cc | 66 ++++++------ src/cmd2.cc | 20 ++-- src/cmd3.cc | 6 +- src/cmd4.cc | 8 +- src/cmd7.cc | 2 +- src/dungeon.cc | 6 +- src/files.cc | 4 +- src/generate.cc | 28 ++--- src/melee1.cc | 20 ++-- src/melee2.cc | 286 +++++++++++++++++++++++++-------------------------- src/monster1.cc | 310 +++++++++++++++++++++++++++---------------------------- src/monster2.cc | 158 ++++++++++++++-------------- src/monster3.cc | 12 +-- src/spells1.cc | 218 +++++++++++++++++++-------------------- src/spells2.cc | 18 ++-- src/traps.cc | 6 +- src/wizard1.cc | 314 ++++++++++++++++++++++++++++---------------------------- src/xtra2.cc | 28 ++--- 19 files changed, 765 insertions(+), 765 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 4c5c4ae0..09f5d843 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -1142,10 +1142,10 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* Multi-hued monster */ - else if (r_ptr->flags1 & (RF1_ATTR_MULTI)) + else if (r_ptr->flags1 & RF1_ATTR_MULTI) { /* Is it a shapechanger? */ - if (r_ptr->flags2 & (RF2_SHAPECHANGER)) + if (r_ptr->flags2 & RF2_SHAPECHANGER) { image_random(ap, cp); } @@ -1153,7 +1153,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *cp = c; /* Multi-hued attr */ - if (r_ptr->flags2 & (RF2_ATTR_ANY)) + if (r_ptr->flags2 & RF2_ATTR_ANY) { *ap = randint(15); } @@ -1190,14 +1190,14 @@ static void map_info(int y, int x, byte *ap, char *cp) else { /* Normal (non-clear char) monster */ - if (!(r_ptr->flags1 & (RF1_CHAR_CLEAR))) + if (!(r_ptr->flags1 & RF1_CHAR_CLEAR)) { /* Normal char */ *cp = c; } /* Normal (non-clear attr) monster */ - else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR))) + else if (!(r_ptr->flags1 & RF1_ATTR_CLEAR)) { /* Normal attr */ *ap = a; @@ -1572,10 +1572,10 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Multi-hued monster */ - else if (r_ptr->flags1 & (RF1_ATTR_MULTI)) + else if (r_ptr->flags1 & RF1_ATTR_MULTI) { /* Is it a shapechanger? */ - if (r_ptr->flags2 & (RF2_SHAPECHANGER)) + if (r_ptr->flags2 & RF2_SHAPECHANGER) { image_random(ap, cp); } @@ -1583,7 +1583,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) *cp = c; /* Multi-hued attr */ - if (r_ptr->flags2 & (RF2_ATTR_ANY)) + if (r_ptr->flags2 & RF2_ATTR_ANY) { *ap = randint(15); } @@ -1617,14 +1617,14 @@ void map_info_default(int y, int x, byte *ap, char *cp) else { /* Normal (non-clear char) monster */ - if (!(r_ptr->flags1 & (RF1_CHAR_CLEAR))) + if (!(r_ptr->flags1 & RF1_CHAR_CLEAR)) { /* Normal char */ *cp = c; } /* Normal (non-clear attr) monster */ - else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR))) + else if (!(r_ptr->flags1 & RF1_ATTR_CLEAR)) { /* Normal attr */ *ap = a; diff --git a/src/cmd1.cc b/src/cmd1.cc index 112bd376..69592b71 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -259,68 +259,68 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, case TV_DIGGING: { /* Slay Animal */ - if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags3 & (RF3_ANIMAL))) + if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) { if (mult < 2) mult = 2; } /* Slay Evil */ - if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags3 & (RF3_EVIL))) + if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) { if (mult < 2) mult = 2; } /* Slay Undead */ - if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD))) + if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) { if (mult < 3) mult = 3; } /* Slay Demon */ - if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags3 & (RF3_DEMON))) + if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) { if (mult < 3) mult = 3; } /* Slay Orc */ - if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags3 & (RF3_ORC))) + if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags3 & RF3_ORC)) { if (mult < 3) mult = 3; } /* Slay Troll */ - if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags3 & (RF3_TROLL))) + if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) { if (mult < 3) mult = 3; } /* Slay Giant */ - if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags3 & (RF3_GIANT))) + if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) { if (mult < 3) mult = 3; } /* Slay Dragon */ - if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON))) + if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) { if (mult < 3) mult = 3; } /* Execute Dragon */ - if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags3 & (RF3_DRAGON))) + if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) { if (mult < 5) mult = 5; } /* Execute Undead */ - if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags3 & (RF3_UNDEAD))) + if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) { if (mult < 5) mult = 5; } /* Execute Demon */ - if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags3 & (RF3_DEMON))) + if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) { if (mult < 5) mult = 5; } @@ -329,11 +329,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Acid) */ if (f1 & (TR1_BRAND_ACID)) { - if (r_ptr->flags3 & (RF3_IM_ACID)) + if (r_ptr->flags3 & RF3_IM_ACID) { // No additional multiplier } - else if (r_ptr->flags9 & (RF9_SUSCEP_ACID)) + else if (r_ptr->flags9 & RF9_SUSCEP_ACID) { if (mult < 6) mult = 6; } @@ -346,11 +346,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Elec) */ if (f1 & (TR1_BRAND_ELEC)) { - if (r_ptr->flags3 & (RF3_IM_ELEC)) + if (r_ptr->flags3 & RF3_IM_ELEC) { // No additional multiplier } - else if (r_ptr->flags9 & (RF9_SUSCEP_ELEC)) + else if (r_ptr->flags9 & RF9_SUSCEP_ELEC) { if (mult < 6) mult = 6; } @@ -363,11 +363,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Fire) */ if (f1 & (TR1_BRAND_FIRE)) { - if (r_ptr->flags3 & (RF3_IM_FIRE)) + if (r_ptr->flags3 & RF3_IM_FIRE) { // No additional multiplier } - else if (r_ptr->flags3 & (RF3_SUSCEP_FIRE)) + else if (r_ptr->flags3 & RF3_SUSCEP_FIRE) { if (mult < 6) mult = 6; } @@ -380,11 +380,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Cold) */ if (f1 & (TR1_BRAND_COLD)) { - if (r_ptr->flags3 & (RF3_IM_COLD)) + if (r_ptr->flags3 & RF3_IM_COLD) { // No additional multiplier } - else if (r_ptr->flags3 & (RF3_SUSCEP_COLD)) + else if (r_ptr->flags3 & RF3_SUSCEP_COLD) { if (mult < 6) mult = 6; } @@ -397,11 +397,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Poison) */ if (f1 & (TR1_BRAND_POIS) || (p_ptr->tim_poison)) { - if (r_ptr->flags3 & (RF3_IM_POIS)) + if (r_ptr->flags3 & RF3_IM_POIS) { // No additional damage } - else if (r_ptr->flags9 & (RF9_SUSCEP_POIS)) + else if (r_ptr->flags9 & RF9_SUSCEP_POIS) { if (mult < 6) mult = 6; if (magik(95)) *special |= SPEC_POIS; @@ -416,7 +416,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Wounding */ if (f5 & (TR5_WOUNDING)) { - if (r_ptr->flags8 & (RF8_NO_CUT)) + if (r_ptr->flags8 & RF8_NO_CUT) { // No additional damage } @@ -564,7 +564,7 @@ void touch_zap_player(monster_type *m_ptr) { auto r_ptr = m_ptr->race(); - if (r_ptr->flags2 & (RF2_AURA_FIRE)) + if (r_ptr->flags2 & RF2_AURA_FIRE) { if (!(p_ptr->immune_fire)) { @@ -588,7 +588,7 @@ void touch_zap_player(monster_type *m_ptr) } - if (r_ptr->flags2 & (RF2_AURA_ELEC)) + if (r_ptr->flags2 & RF2_AURA_ELEC) { if (!(p_ptr->immune_elec)) { @@ -1050,8 +1050,8 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } /* Aura elec */ - if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) && - !(r_ptr->flags3 & (RF3_IM_ELEC))) + if ((tr_ptr->flags2 & RF2_AURA_ELEC) && + !(r_ptr->flags3 & RF3_IM_ELEC)) { if (t_ptr->ml) { @@ -1538,8 +1538,8 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } /* Aura elec */ - if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) && - !(r_ptr->flags3 & (RF3_IM_ELEC))) + if ((tr_ptr->flags2 & RF2_AURA_ELEC) && + !(r_ptr->flags3 & RF3_IM_ELEC)) { if (t_ptr->ml) { @@ -1660,7 +1660,7 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Cut monster */ if (special & SPEC_CUT) { - if (r_ptr->flags8 & (RF8_NO_CUT)) + if (r_ptr->flags8 & RF8_NO_CUT) { // No damage } @@ -1682,11 +1682,11 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Poison monster */ if (special & SPEC_POIS) { - if (r_ptr->flags3 & (RF3_IM_POIS)) + if (r_ptr->flags3 & RF3_IM_POIS) { // No damage } - else if (r_ptr->flags9 & (RF9_SUSCEP_POIS)) + else if (r_ptr->flags9 & RF9_SUSCEP_POIS) { if (m_ptr->poisoned) { @@ -2228,7 +2228,7 @@ void py_attack(int y, int x, int max_blow) /* Stunning blow */ if (magik(get_skill(SKILL_STUN)) && (o_ptr->tval == TV_HAFTED) && (o_ptr->weight > 50) && done_crit) { - if (!(r_ptr->flags4 & (RF4_BR_SOUN)) && !(r_ptr->flags4 & (RF4_BR_WALL)) && k) + if (!(r_ptr->flags4 & RF4_BR_SOUN) && !(r_ptr->flags4 & RF4_BR_WALL) && k) { int tmp; @@ -2449,7 +2449,7 @@ void py_attack(int y, int x, int max_blow) } /* Confuse the monster */ - if (r_ptr->flags3 & (RF3_NO_CONF)) + if (r_ptr->flags3 & RF3_NO_CONF) { msg_format("%^s is unaffected.", m_name); } diff --git a/src/cmd2.cc b/src/cmd2.cc index 023f49f7..d1f26cae 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -3355,9 +3355,9 @@ void do_cmd_fire(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || + if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -3769,9 +3769,9 @@ void do_cmd_throw(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || + if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4096,9 +4096,9 @@ void do_cmd_boomerang(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || + if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4781,7 +4781,7 @@ void do_cmd_steal() } /* The monster is immune */ - if (r_info[m_ptr->r_idx].flags7 & (RF7_NO_THEFT)) + if (r_info[m_ptr->r_idx].flags7 & RF7_NO_THEFT) { msg_print("The monster is guarding the treasures."); return; diff --git a/src/cmd3.cc b/src/cmd3.cc index ac27d926..51939fe6 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -1325,7 +1325,7 @@ static void roff_top(int r_idx) Term_gotoxy(0, 0); /* A title (use "The" for non-uniques) */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) + if (!(r_ptr->flags1 & RF1_UNIQUE)) { Term_addstr( -1, TERM_WHITE, "The "); } @@ -1435,10 +1435,10 @@ void do_cmd_query_symbol(void) monster_race *r_ptr = &r_info[i]; /* Require non-unique monsters if needed */ - if (norm && (r_ptr->flags1 & (RF1_UNIQUE))) continue; + if (norm && (r_ptr->flags1 & RF1_UNIQUE)) continue; /* Require unique monsters if needed */ - if (uniq && !(r_ptr->flags1 & (RF1_UNIQUE))) continue; + if (uniq && !(r_ptr->flags1 & RF1_UNIQUE)) continue; /* Require monsters with the name requested if needed */ if (name) diff --git a/src/cmd4.cc b/src/cmd4.cc index 27f2e46f..b63a2c2c 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3276,7 +3276,7 @@ static void do_cmd_knowledge_uniques(void) monster_race *r_ptr = &r_info[k]; /* Only print Uniques */ - if (r_ptr->flags1 & (RF1_UNIQUE) && + if ((r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_PET) && !(r_ptr->flags7 & RF7_NEUTRAL)) { @@ -3298,7 +3298,7 @@ static void do_cmd_knowledge_uniques(void) monster_race *r_ptr = &r_info[r_idx]; /* Only print Uniques */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); @@ -3492,7 +3492,7 @@ static void do_cmd_knowledge_kill_count(void) { monster_race *r_ptr = &r_info[kk]; - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { if (r_ptr->max_num == 0) { @@ -3526,7 +3526,7 @@ static void do_cmd_knowledge_kill_count(void) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); diff --git a/src/cmd7.cc b/src/cmd7.cc index 6e7aefc3..5b1eaf02 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -3702,7 +3702,7 @@ void summon_true(int r_idx, int item) /* Uniques are less likely to be nice */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { /* Because it's unique, it will always be destroyed */ used = TRUE; diff --git a/src/dungeon.cc b/src/dungeon.cc index b2592979..cd904f29 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -791,7 +791,7 @@ static void regen_monsters(void) if (!frac) frac = 1; /* Hack -- Some monsters regenerate quickly */ - if (r_ptr->flags2 & (RF2_REGENERATE)) frac *= 2; + if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2; /* Hack -- Regenerate */ @@ -828,7 +828,7 @@ static void regen_monsters(void) /* Hack -- Some monsters regenerate quickly */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags2 & (RF2_REGENERATE)) frac *= 2; + if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2; /* Hack -- Regenerate */ m_ptr->hp += frac; @@ -4512,7 +4512,7 @@ static void process_player(void) auto const r_ptr = m_ptr->race(); /* Skip non-multi-hued monsters */ - if (!(r_ptr->flags1 & (RF1_ATTR_MULTI))) continue; + if (!(r_ptr->flags1 & RF1_ATTR_MULTI)) continue; /* Reset the flag */ shimmer_monsters = TRUE; diff --git a/src/files.cc b/src/files.cc index 576b8143..96269259 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2701,7 +2701,7 @@ errr file_character(cptr name, bool_ full) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); if (dead) @@ -4052,7 +4052,7 @@ static long total_points(void) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); diff --git a/src/generate.cc b/src/generate.cc index ca0022e1..dc5005d0 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -2673,10 +2673,10 @@ static bool_ vault_aux_jelly(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Also decline evil jellies (like death molds and shoggoths) */ - if (r_ptr->flags3 & (RF3_EVIL)) return (FALSE); + if (r_ptr->flags3 & RF3_EVIL) return (FALSE); /* Require icky thing, jelly, mold, or mushroom */ if (!strchr("ijm,", r_ptr->d_char)) return (FALSE); @@ -2694,10 +2694,10 @@ static bool_ vault_aux_animal(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Require "animal" flag */ - if (!(r_ptr->flags3 & (RF3_ANIMAL))) return (FALSE); + if (!(r_ptr->flags3 & RF3_ANIMAL)) return (FALSE); /* Okay */ return (TRUE); @@ -2712,10 +2712,10 @@ static bool_ vault_aux_undead(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Require Undead */ - if (!(r_ptr->flags3 & (RF3_UNDEAD))) return (FALSE); + if (!(r_ptr->flags3 & RF3_UNDEAD)) return (FALSE); /* Okay */ return (TRUE); @@ -2730,7 +2730,7 @@ static bool_ vault_aux_chapel(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Require "priest" or Angel */ if (!((r_ptr->d_char == 'A') || strstr(r_ptr->name, "riest"))) @@ -2751,7 +2751,7 @@ static bool_ vault_aux_kennel(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Require a Zephyr Hound or a dog */ return ((r_ptr->d_char == 'Z') || (r_ptr->d_char == 'C')); @@ -2767,7 +2767,7 @@ static bool_ vault_aux_treasure(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Require "priest" or Angel */ if (!((r_ptr->d_char == '!') || (r_ptr->d_char == '|') || @@ -2809,7 +2809,7 @@ static bool_ vault_aux_orc(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Hack -- Require "o" monsters */ if (!strchr("o", r_ptr->d_char)) return (FALSE); @@ -2828,7 +2828,7 @@ static bool_ vault_aux_troll(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Hack -- Require "T" monsters */ if (!strchr("T", r_ptr->d_char)) return (FALSE); @@ -2846,7 +2846,7 @@ static bool_ vault_aux_giant(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Hack -- Require "P" monsters */ if (!strchr("P", r_ptr->d_char)) return (FALSE); @@ -2870,7 +2870,7 @@ static bool_ vault_aux_dragon(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Hack -- Require "d" or "D" monsters */ if (!strchr("Dd", r_ptr->d_char)) return (FALSE); @@ -2891,7 +2891,7 @@ static bool_ vault_aux_demon(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Hack -- Require "U" monsters */ if (!strchr("U", r_ptr->d_char)) return (FALSE); diff --git a/src/melee1.cc b/src/melee1.cc index 2753f78c..4dcf8fa0 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -235,7 +235,7 @@ bool_ carried_make_attack_normal(int r_idx) bool_ alive = TRUE; /* Not allowed to attack */ - if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE); + if (r_ptr->flags1 & RF1_NEVER_BLOW) return (FALSE); /* Total armor */ ac = p_ptr->ac + p_ptr->to_a; @@ -280,7 +280,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Hack -- Apply "protection from evil" */ if ((p_ptr->protevil > 0) && - (r_ptr->flags3 & (RF3_EVIL)) && + (r_ptr->flags3 & RF3_EVIL) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -293,7 +293,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Hack -- Apply "protection from good" */ if ((p_ptr->protgood > 0) && - (r_ptr->flags3 & (RF3_GOOD)) && + (r_ptr->flags3 & RF3_GOOD) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1249,7 +1249,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Not allowed to attack? */ auto r_ptr = m_ptr->race(); - if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE); + if (r_ptr->flags1 & RF1_NEVER_BLOW) return (FALSE); /* ...nor if friendly */ if (is_friend(m_ptr) >= 0) @@ -1435,7 +1435,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (chance > 50000) chance = 50000; chance -= rlev * 300; - if ((randint(100000) < chance) && (r_ptr->flags3 & (RF3_EVIL))) + if ((randint(100000) < chance) && (r_ptr->flags3 & RF3_EVIL)) { /* Message */ msg_format("The hand of Eru Iluvatar stops %s blow.", m_name); @@ -1447,7 +1447,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Hack -- Apply "protection from evil" */ if ((p_ptr->protevil > 0) && - (r_ptr->flags3 & (RF3_EVIL)) && + (r_ptr->flags3 & RF3_EVIL) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1460,7 +1460,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Hack -- Apply "protection from good" */ if ((p_ptr->protgood > 0) && - (r_ptr->flags3 & (RF3_GOOD)) && + (r_ptr->flags3 & RF3_GOOD) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1679,12 +1679,12 @@ bool_ make_attack_normal(int m_idx, byte divis) { black_breath_attack(4); } - else if ((m_ptr->level >= 35) && (r_ptr->flags3 & (RF3_UNDEAD)) && - (r_ptr->flags1 & (RF1_UNIQUE))) + else if ((m_ptr->level >= 35) && (r_ptr->flags3 & RF3_UNDEAD) && + (r_ptr->flags1 & RF1_UNIQUE)) { black_breath_attack(300 - m_ptr->level); } - else if ((m_ptr->level >= 40) && (r_ptr->flags3 & (RF3_UNDEAD))) + else if ((m_ptr->level >= 40) && (r_ptr->flags3 & RF3_UNDEAD)) { black_breath_attack(450 - m_ptr->level); } diff --git a/src/melee2.cc b/src/melee2.cc index 080208f1..522b2f47 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -118,10 +118,10 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) /* Do nothing */ } /* Death by Physical attack -- non-living monster */ - else if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || - (r_ptr->flags3 & (RF3_NONLIVING)) || + else if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || + (r_ptr->flags3 & RF3_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { cmonster_msg(TERM_L_RED, "%^s is destroyed.", m_name); @@ -172,7 +172,7 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) } /* When an Unique dies, it stays dead */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { r_ptr->max_num = 0; } @@ -229,7 +229,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear) /* Sometimes a monster gets scared by damage */ auto const r_ptr = m_ptr->race(); - if (!m_ptr->monfear && !(r_ptr->flags3 & (RF3_NO_FEAR))) + if (!m_ptr->monfear && !(r_ptr->flags3 & RF3_NO_FEAR)) { int percentage; @@ -290,7 +290,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear) static bool_ int_outof(std::shared_ptr r_ptr, int prob) { /* Non-Smart monsters are half as "smart" */ - if (!(r_ptr->flags2 & (RF2_SMART))) prob = prob / 2; + if (!(r_ptr->flags2 & RF2_SMART)) prob = prob / 2; /* Roll the dice */ return (rand_int(100) < prob); @@ -314,7 +314,7 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) /* Too stupid to know anything? */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags2 & (RF2_STUPID)) return; + if (r_ptr->flags2 & RF2_STUPID) return; /* Must be cheating or learning */ @@ -338,178 +338,178 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) if (smart & (SM_IMM_ACID)) { - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_ACID); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_ACID); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ACID); + if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_ACID; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_ACID; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ACID; } else if ((smart & (SM_OPP_ACID)) && (smart & (SM_RES_ACID))) { - if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_ACID); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_ACID); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ACID); + if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_ACID; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_ACID; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ACID; } else if ((smart & (SM_OPP_ACID)) || (smart & (SM_RES_ACID))) { - if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_ACID); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_ACID); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ACID); + if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_ACID; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_ACID; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ACID; } if (smart & (SM_IMM_ELEC)) { - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_ELEC); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_ELEC); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ELEC); + if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_ELEC; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_ELEC; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ELEC; } else if ((smart & (SM_OPP_ELEC)) && (smart & (SM_RES_ELEC))) { - if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_ELEC); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_ELEC); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ELEC); + if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_ELEC; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_ELEC; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ELEC; } else if ((smart & (SM_OPP_ELEC)) || (smart & (SM_RES_ELEC))) { - if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_ELEC); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_ELEC); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ELEC); + if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_ELEC; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_ELEC; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ELEC; } if (smart & (SM_IMM_FIRE)) { - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_FIRE); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_FIRE); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_FIRE); + if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_FIRE; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_FIRE; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_FIRE; } else if ((smart & (SM_OPP_FIRE)) && (smart & (SM_RES_FIRE))) { - if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_FIRE); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_FIRE); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_FIRE); + if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_FIRE; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_FIRE; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_FIRE; } else if ((smart & (SM_OPP_FIRE)) || (smart & (SM_RES_FIRE))) { - if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_FIRE); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_FIRE); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_FIRE); + if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_FIRE; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_FIRE; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_FIRE; } if (smart & (SM_IMM_COLD)) { - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_COLD); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BA_COLD); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_COLD); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ICEE); + if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_COLD; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_COLD; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_COLD; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ICEE; } else if ((smart & (SM_OPP_COLD)) && (smart & (SM_RES_COLD))) { - if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_COLD); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_COLD); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_COLD); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BO_ICEE); + if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_COLD; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_COLD; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_COLD; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ICEE; } else if ((smart & (SM_OPP_COLD)) || (smart & (SM_RES_COLD))) { - if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_COLD); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_COLD); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_COLD); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BO_ICEE); + if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_COLD; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_COLD; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_COLD; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ICEE; } if ((smart & (SM_OPP_POIS)) && (smart & (SM_RES_POIS))) { - if (int_outof(r_ptr, 80)) f4 &= ~(RF4_BR_POIS); - if (int_outof(r_ptr, 80)) f5 &= ~(RF5_BA_POIS); - if (int_outof(r_ptr, 40)) f4 &= ~(RF4_BA_NUKE); - if (int_outof(r_ptr, 40)) f4 &= ~(RF4_BR_NUKE); + if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_POIS; + if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_POIS; + if (int_outof(r_ptr, 40)) f4 &= ~RF4_BA_NUKE; + if (int_outof(r_ptr, 40)) f4 &= ~RF4_BR_NUKE; } else if ((smart & (SM_OPP_POIS)) || (smart & (SM_RES_POIS))) { - if (int_outof(r_ptr, 30)) f4 &= ~(RF4_BR_POIS); - if (int_outof(r_ptr, 30)) f5 &= ~(RF5_BA_POIS); + if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_POIS; + if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_POIS; } if (smart & (SM_RES_NETH)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_NETH); - if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BA_NETH); - if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BO_NETH); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_NETH; + if (int_outof(r_ptr, 50)) f5 &= ~RF5_BA_NETH; + if (int_outof(r_ptr, 50)) f5 &= ~RF5_BO_NETH; } if (smart & (SM_RES_LITE)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_LITE); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_LITE; } if (smart & (SM_RES_DARK)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_DARK); - if (int_outof(r_ptr, 50)) f5 &= ~(RF5_BA_DARK); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_DARK; + if (int_outof(r_ptr, 50)) f5 &= ~RF5_BA_DARK; } if (smart & (SM_RES_FEAR)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_SCARE); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_SCARE; } if (smart & (SM_RES_CONF)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_CONF); - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CONF); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_CONF; + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CONF; } if (smart & (SM_RES_CHAOS)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_CONF); - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CONF); - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_CHAO); - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BA_CHAO); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_CONF; + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CONF; + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CHAO; + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BA_CHAO; } if (smart & (SM_RES_DISEN)) { - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_BR_DISE); + if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_DISE; } if (smart & (SM_RES_BLIND)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BLIND); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BLIND; } if (smart & (SM_RES_NEXUS)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_NEXU); - if (int_outof(r_ptr, 50)) f6 &= ~(RF6_TELE_LEVEL); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_NEXU; + if (int_outof(r_ptr, 50)) f6 &= ~RF6_TELE_LEVEL; } if (smart & (SM_RES_SOUND)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_SOUN); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_SOUN; } if (smart & (SM_RES_SHARD)) { - if (int_outof(r_ptr, 50)) f4 &= ~(RF4_BR_SHAR); - if (int_outof(r_ptr, 20)) f4 &= ~(RF4_ROCKET); + if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_SHAR; + if (int_outof(r_ptr, 20)) f4 &= ~RF4_ROCKET; } if (smart & (SM_IMM_REFLECT)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_COLD); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_FIRE); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ACID); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ELEC); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_POIS); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_NETH); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_WATE); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_MANA); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_PLAS); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_BO_ICEE); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_MISSILE); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_COLD; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_FIRE; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ACID; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ELEC; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_POIS; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_NETH; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_WATE; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_MANA; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_PLAS; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ICEE; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_MISSILE; if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_1); if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_2); if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_3); @@ -518,13 +518,13 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) if (smart & (SM_IMM_FREE)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_HOLD); - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_SLOW); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_HOLD; + if (int_outof(r_ptr, 100)) f5 &= ~RF5_SLOW; } if (smart & (SM_IMM_MANA)) { - if (int_outof(r_ptr, 100)) f5 &= ~(RF5_DRAIN_MANA); + if (int_outof(r_ptr, 100)) f5 &= ~RF5_DRAIN_MANA; } /* XXX XXX XXX No spells left? */ @@ -770,7 +770,7 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) /* Stupid monsters choose randomly */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags2 & (RF2_STUPID)) + if (r_ptr->flags2 & RF2_STUPID) { /* Pick at random */ return (spells[rand_int(num)]); @@ -884,7 +884,7 @@ static void breath(int m_idx, int typ, int dam_hp, int rad) auto const r_ptr = m_ptr->race(); /* Determine the radius of the blast */ - if (rad < 1) rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2; + if (rad < 1) rad = (r_ptr->flags2 & RF2_POWERFUL) ? 3 : 2; /* Target the player with a ball attack */ (void)project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg); @@ -904,7 +904,7 @@ static void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int auto const r_ptr = m_ptr->race(); /* Determine the radius of the blast */ - if (rad < 1) rad = (r_ptr->flags2 & (RF2_POWERFUL)) ? 3 : 2; + if (rad < 1) rad = (r_ptr->flags2 & RF2_POWERFUL) ? 3 : 2; (void)project(m_idx, rad, y, x, dam_hp, typ, flg); } @@ -1065,14 +1065,14 @@ static bool_ monst_spell_monst(int m_idx) f6 = r_ptr->flags6; /* Hack -- allow "desperate" spells */ - if ((r_ptr->flags2 & (RF2_SMART)) && + if ((r_ptr->flags2 & RF2_SMART) && (m_ptr->hp < m_ptr->maxhp / 10) && (rand_int(100) < 50)) { /* Require intelligent spells */ - f4 &= (RF4_INT_MASK); - f5 &= (RF5_INT_MASK); - f6 &= (RF6_INT_MASK); + f4 &= RF4_INT_MASK; + f5 &= RF5_INT_MASK; + f6 &= RF6_INT_MASK; /* No spells left */ if ((!f4 && !f5 && !f6) && (monst_spell_monst_spell == -1)) return (FALSE); @@ -1708,8 +1708,8 @@ static bool_ monst_spell_monst(int m_idx) } /* Attempt a saving throw */ - if ((tr_ptr->flags1 & (RF1_UNIQUE)) || - (tr_ptr->flags3 & (RF3_NO_CONF)) || + if ((tr_ptr->flags1 & RF1_UNIQUE) || + (tr_ptr->flags3 & RF3_NO_CONF) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { /* No obvious effect */ @@ -1746,8 +1746,8 @@ static bool_ monst_spell_monst(int m_idx) } /* Attempt a saving throw */ - if ((tr_ptr->flags1 & (RF1_UNIQUE)) || - (tr_ptr->flags3 & (RF3_NO_CONF)) || + if ((tr_ptr->flags1 & RF1_UNIQUE) || + (tr_ptr->flags3 & RF3_NO_CONF) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { /* No obvious effect */ @@ -2279,9 +2279,9 @@ static bool_ monst_spell_monst(int m_idx) monster_msg("%^s teleports %s away.", m_name, t_name); - if (tr_ptr->flags3 & (RF3_RES_TELE)) + if (tr_ptr->flags3 & RF3_RES_TELE) { - if (tr_ptr->flags1 & (RF1_UNIQUE)) + if (tr_ptr->flags1 & RF1_UNIQUE) { if (see_t) { @@ -2948,14 +2948,14 @@ static bool_ make_attack_spell(int m_idx) if (no_inate) f4 = 0L; /* Hack -- allow "desperate" spells */ - if ((r_ptr->flags2 & (RF2_SMART)) && + if ((r_ptr->flags2 & RF2_SMART) && (m_ptr->hp < m_ptr->maxhp / 10) && (rand_int(100) < 50)) { /* Require intelligent spells */ - f4 &= (RF4_INT_MASK); - f5 &= (RF5_INT_MASK); - f6 &= (RF6_INT_MASK); + f4 &= RF4_INT_MASK; + f5 &= RF5_INT_MASK; + f6 &= RF6_INT_MASK; /* No spells left */ if (!f4 && !f5 && !f6) return (FALSE); @@ -2968,27 +2968,27 @@ static bool_ make_attack_spell(int m_idx) if (!f4 && !f5 && !f6) return (FALSE); /* Check for a clean bolt shot */ - if ((f4&(RF4_BOLT_MASK) || f5 & (RF5_BOLT_MASK) || - f6&(RF6_BOLT_MASK)) && - !(r_ptr->flags2 & (RF2_STUPID)) && + if ((f4&RF4_BOLT_MASK || f5 & RF5_BOLT_MASK || + f6&RF6_BOLT_MASK) && + !(r_ptr->flags2 & RF2_STUPID) && !clean_shot(m_ptr->fy, m_ptr->fx, y, x)) { /* Remove spells that will only hurt friends */ - f4 &= ~(RF4_BOLT_MASK); - f5 &= ~(RF5_BOLT_MASK); - f6 &= ~(RF6_BOLT_MASK); + f4 &= ~RF4_BOLT_MASK; + f5 &= ~RF5_BOLT_MASK; + f6 &= ~RF6_BOLT_MASK; } /* Check for a possible summon */ - if ((f4 & (RF4_SUMMON_MASK) || f5 & (RF5_SUMMON_MASK) || - f6 & (RF6_SUMMON_MASK)) && - !(r_ptr->flags2 & (RF2_STUPID)) && + if ((f4 & RF4_SUMMON_MASK || f5 & RF5_SUMMON_MASK || + f6 & RF6_SUMMON_MASK) && + !(r_ptr->flags2 & RF2_STUPID) && !(summon_possible(y, x))) { /* Remove summoning spells */ - f4 &= ~(RF4_SUMMON_MASK); - f5 &= ~(RF5_SUMMON_MASK); - f6 &= ~(RF6_SUMMON_MASK); + f4 &= ~RF4_SUMMON_MASK; + f5 &= ~RF5_SUMMON_MASK; + f6 &= ~RF6_SUMMON_MASK; } /* No spells left */ @@ -3034,7 +3034,7 @@ static bool_ make_attack_spell(int m_idx) failrate = 25 - (rlev + 3) / 4; /* Hack -- Stupid monsters will never fail (for jellies and such) */ - if (r_ptr->flags2 & (RF2_STUPID)) failrate = 0; + if (r_ptr->flags2 & RF2_STUPID) failrate = 0; /* Check for spell failure (inate attacks never fail) */ if ((thrown_spell >= 128) && (rand_int(100) < failrate)) @@ -5032,8 +5032,8 @@ static bool_ get_moves(int m_idx, int *mm) */ if ((r_ptr->flags1 & RF1_FRIENDS) && (r_ptr->flags3 & RF3_ANIMAL) && - !((r_ptr->flags2 & (RF2_PASS_WALL)) || - (r_ptr->flags2 & (RF2_KILL_WALL)))) + !((r_ptr->flags2 & RF2_PASS_WALL) || + (r_ptr->flags2 & RF2_KILL_WALL))) { int i, room = 0; @@ -5767,7 +5767,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) } /* Aura elec */ - if ((tr_ptr->flags2 & (RF2_AURA_ELEC)) && !(r_ptr->flags3 & (RF3_IM_ELEC))) + if ((tr_ptr->flags2 & RF2_AURA_ELEC) && !(r_ptr->flags3 & RF3_IM_ELEC)) { if (m_ptr->ml || t_ptr->ml) { @@ -6142,7 +6142,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Paranoia... no friendly uniques outside wizard mode -- TY */ if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && !(wizard) && - (r_ptr->flags1 & (RF1_UNIQUE)) && !(r_ptr->flags7 & RF7_PET)) + (r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_PET)) gets_angry = TRUE; if (gets_angry) @@ -6198,7 +6198,7 @@ static void process_monster(int m_idx, bool_ is_frien) ox = m_ptr->fx; /* Attempt to "multiply" if able and allowed */ - if ((r_ptr->flags4 & (RF4_MULTIPLY)) && (num_repro < MAX_REPRO)) + if ((r_ptr->flags4 & RF4_MULTIPLY) && (num_repro < MAX_REPRO)) { if (ai_multiply(m_idx)) return; } @@ -6409,28 +6409,28 @@ static void process_monster(int m_idx, bool_ is_frien) /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags7 & (RF7_CAN_FLY))) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags7 & RF7_CAN_FLY)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags7 & (RF7_CAN_FLY))) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags7 & RF7_CAN_FLY)) { /* Pass through trees/... */ do_move = TRUE; } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_PASS_WALL))) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Monster destroys walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_KILL_WALL))) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_KILL_WALL)) { /* Eat through walls/doors/rubble */ do_move = TRUE; @@ -6451,7 +6451,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & (RF2_PASS_WALL))) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; @@ -6475,7 +6475,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Take a turn */ do_turn = TRUE; - if ((r_ptr->flags2 & (RF2_OPEN_DOOR)) && + if ((r_ptr->flags2 & RF2_OPEN_DOOR) && ((is_friend(m_ptr) <= 0) || p_ptr->pet_open_doors)) { /* Closed doors and secret doors */ @@ -6745,7 +6745,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (do_move && (r_ptr->flags1 & RF1_NEVER_MOVE)) { /* Hack -- memorize lack of attacks */ - /* if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_NEVER_MOVE); */ + /* if (m_ptr->ml) r_ptr->r_flags1 |= RF1_NEVER_MOVE; */ /* Do not move */ do_move = FALSE; @@ -6846,9 +6846,9 @@ static void process_monster(int m_idx, bool_ is_frien) /* Take or Kill objects on the floor */ /* rr9: Pets will no longer pick up/destroy items */ - if ((((r_ptr->flags2 & (RF2_TAKE_ITEM)) && + if ((((r_ptr->flags2 & RF2_TAKE_ITEM) && ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) || - (r_ptr->flags2 & (RF2_KILL_ITEM))) && + (r_ptr->flags2 & RF2_KILL_ITEM)) && (is_friend(m_ptr) <= 0)) { u32b f1, f2, f3, f4, f5, esp; @@ -6868,23 +6868,23 @@ static void process_monster(int m_idx, bool_ is_frien) monster_desc(m_name, m_ptr, 0x04); /* React to objects that hurt the monster */ - if (f5 & (TR5_KILL_DEMON)) flg3 |= (RF3_DEMON); - if (f5 & (TR5_KILL_UNDEAD)) flg3 |= (RF3_UNDEAD); - if (f1 & (TR1_SLAY_DRAGON)) flg3 |= (RF3_DRAGON); - if (f1 & (TR1_SLAY_TROLL)) flg3 |= (RF3_TROLL); - if (f1 & (TR1_SLAY_GIANT)) flg3 |= (RF3_GIANT); - if (f1 & (TR1_SLAY_ORC)) flg3 |= (RF3_ORC); - if (f1 & (TR1_SLAY_DEMON)) flg3 |= (RF3_DEMON); - if (f1 & (TR1_SLAY_UNDEAD)) flg3 |= (RF3_UNDEAD); - if (f1 & (TR1_SLAY_ANIMAL)) flg3 |= (RF3_ANIMAL); - if (f1 & (TR1_SLAY_EVIL)) flg3 |= (RF3_EVIL); + if (f5 & (TR5_KILL_DEMON)) flg3 |= RF3_DEMON; + if (f5 & (TR5_KILL_UNDEAD)) flg3 |= RF3_UNDEAD; + if (f1 & (TR1_SLAY_DRAGON)) flg3 |= RF3_DRAGON; + if (f1 & (TR1_SLAY_TROLL)) flg3 |= RF3_TROLL; + if (f1 & (TR1_SLAY_GIANT)) flg3 |= RF3_GIANT; + if (f1 & (TR1_SLAY_ORC)) flg3 |= RF3_ORC; + if (f1 & (TR1_SLAY_DEMON)) flg3 |= RF3_DEMON; + if (f1 & (TR1_SLAY_UNDEAD)) flg3 |= RF3_UNDEAD; + if (f1 & (TR1_SLAY_ANIMAL)) flg3 |= RF3_ANIMAL; + if (f1 & (TR1_SLAY_EVIL)) flg3 |= RF3_EVIL; /* The object cannot be picked up by the monster */ if (artifact_p(o_ptr) || (r_ptr->flags3 & flg3) || (o_ptr->art_name)) { /* Only give a message for "take_item" */ - if (r_ptr->flags2 & (RF2_TAKE_ITEM)) + if (r_ptr->flags2 & RF2_TAKE_ITEM) { /* Describe observable situations */ if (m_ptr->ml && player_has_los_bold(ny, nx)) @@ -6897,7 +6897,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Pick up the item */ - else if (r_ptr->flags2 & (RF2_TAKE_ITEM)) + else if (r_ptr->flags2 & RF2_TAKE_ITEM) { /* Describe observable situations */ if (player_has_los_bold(ny, nx)) diff --git a/src/monster1.cc b/src/monster1.cc index b1570382..0c94fb5a 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -73,17 +73,17 @@ static void roff_aux(std::shared_ptr r_ptr) /* Extract a gender (if applicable) */ int msex = 0; - if (flags1 & (RF1_FEMALE)) + if (flags1 & RF1_FEMALE) { msex = 2; } - else if (flags1 & (RF1_MALE)) + else if (flags1 & RF1_MALE) { msex = 1; } /* Treat uniques differently */ - if (flags1 & (RF1_UNIQUE)) + if (flags1 & RF1_UNIQUE) { if (r_ptr->max_num == 0) { @@ -218,7 +218,7 @@ static void roff_aux(std::shared_ptr r_ptr) } /* The code above includes "attack speed" */ - if (flags1 & (RF1_NEVER_MOVE)) + if (flags1 & RF1_NEVER_MOVE) { /* Introduce */ if (old) @@ -246,7 +246,7 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe experience if known */ { /* Introduction */ - if (flags1 & (RF1_UNIQUE)) + if (flags1 & RF1_UNIQUE) { text_out("Killing this"); } @@ -256,21 +256,21 @@ static void roff_aux(std::shared_ptr r_ptr) } /* Describe the "quality" */ - if (flags2 & (RF2_ELDRITCH_HORROR)) text_out_c(TERM_VIOLET, " sanity-blasting"); - if (flags3 & (RF3_ANIMAL)) text_out_c(TERM_VIOLET, " natural"); - if (flags3 & (RF3_EVIL)) text_out_c(TERM_VIOLET, " evil"); - if (flags3 & (RF3_GOOD)) text_out_c(TERM_VIOLET, " good"); - if (flags3 & (RF3_UNDEAD)) text_out_c(TERM_VIOLET, " undead"); + if (flags2 & RF2_ELDRITCH_HORROR) text_out_c(TERM_VIOLET, " sanity-blasting"); + if (flags3 & RF3_ANIMAL) text_out_c(TERM_VIOLET, " natural"); + if (flags3 & RF3_EVIL) text_out_c(TERM_VIOLET, " evil"); + if (flags3 & RF3_GOOD) text_out_c(TERM_VIOLET, " good"); + if (flags3 & RF3_UNDEAD) text_out_c(TERM_VIOLET, " undead"); /* Describe the "race" */ - if (flags3 & (RF3_DRAGON)) text_out_c(TERM_VIOLET, " dragon"); - else if (flags3 & (RF3_DEMON)) text_out_c(TERM_VIOLET, " demon"); - else if (flags3 & (RF3_GIANT)) text_out_c(TERM_VIOLET, " giant"); - else if (flags3 & (RF3_TROLL)) text_out_c(TERM_VIOLET, " troll"); - else if (flags3 & (RF3_ORC)) text_out_c(TERM_VIOLET, " orc"); - else if (flags3 & (RF3_THUNDERLORD))text_out_c(TERM_VIOLET, " Thunderlord"); - else if (flags7 & (RF7_SPIDER)) text_out_c(TERM_VIOLET, " spider"); - else if (flags7 & (RF7_NAZGUL)) text_out_c(TERM_VIOLET, " Nazgul"); + if (flags3 & RF3_DRAGON) text_out_c(TERM_VIOLET, " dragon"); + else if (flags3 & RF3_DEMON) text_out_c(TERM_VIOLET, " demon"); + else if (flags3 & RF3_GIANT) text_out_c(TERM_VIOLET, " giant"); + else if (flags3 & RF3_TROLL) text_out_c(TERM_VIOLET, " troll"); + else if (flags3 & RF3_ORC) text_out_c(TERM_VIOLET, " orc"); + else if (flags3 & RF3_THUNDERLORD)text_out_c(TERM_VIOLET, " Thunderlord"); + else if (flags7 & RF7_SPIDER) text_out_c(TERM_VIOLET, " spider"); + else if (flags7 & RF7_NAZGUL) text_out_c(TERM_VIOLET, " Nazgul"); else text_out(" creature"); /* Group some variables */ @@ -311,26 +311,26 @@ static void roff_aux(std::shared_ptr r_ptr) } } - if ((flags2 & (RF2_AURA_FIRE)) && (flags2 & (RF2_AURA_ELEC))) + if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC)) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_VIOLET, "flames and electricity"); text_out(". "); } - else if (flags2 & (RF2_AURA_FIRE)) + else if (flags2 & RF2_AURA_FIRE) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_ORANGE, "flames"); text_out(". "); } - else if (flags2 & (RF2_AURA_ELEC)) + else if (flags2 & RF2_AURA_ELEC) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_L_BLUE, "electricity"); text_out(". "); } - if (flags2 & (RF2_REFLECTING)) + if (flags2 & RF2_REFLECTING) { text_out(format("%^s ", wd_he[msex])); text_out_c(TERM_L_UMBER, "reflects"); @@ -339,14 +339,14 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe escorts */ - if ((flags1 & (RF1_ESCORT)) || (flags1 & (RF1_ESCORTS))) + if ((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS)) { text_out(format("%^s usually appears with escorts. ", wd_he[msex])); } /* Describe friends */ - else if ((flags1 & (RF1_FRIEND)) || (flags1 & (RF1_FRIENDS))) + else if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS)) { text_out(format("%^s usually appears in groups. ", wd_he[msex])); @@ -355,8 +355,8 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect inate attacks */ vn = 0; - if (flags4 & (RF4_SHRIEK)) vp[vn++] = "shriek for help"; - if (flags4 & (RF4_ROCKET)) vp[vn++] = "shoot a rocket"; + if (flags4 & RF4_SHRIEK) vp[vn++] = "shriek for help"; + if (flags4 & RF4_ROCKET) vp[vn++] = "shoot a rocket"; if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire an arrow"; if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows"; if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire a missile"; @@ -387,28 +387,28 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect breaths */ vn = 0; - if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid"; - if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning"; - if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire"; - if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost"; - if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison"; - if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether"; - if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light"; - if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness"; - if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion"; - if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound"; - if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos"; - if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment"; - if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus"; - if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time"; - if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia"; - if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity"; - if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards"; - if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma"; - if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force"; - if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana"; - if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste"; - if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration"; + if (flags4 & RF4_BR_ACID) vp[vn++] = "acid"; + if (flags4 & RF4_BR_ELEC) vp[vn++] = "lightning"; + if (flags4 & RF4_BR_FIRE) vp[vn++] = "fire"; + if (flags4 & RF4_BR_COLD) vp[vn++] = "frost"; + if (flags4 & RF4_BR_POIS) vp[vn++] = "poison"; + if (flags4 & RF4_BR_NETH) vp[vn++] = "nether"; + if (flags4 & RF4_BR_LITE) vp[vn++] = "light"; + if (flags4 & RF4_BR_DARK) vp[vn++] = "darkness"; + if (flags4 & RF4_BR_CONF) vp[vn++] = "confusion"; + if (flags4 & RF4_BR_SOUN) vp[vn++] = "sound"; + if (flags4 & RF4_BR_CHAO) vp[vn++] = "chaos"; + if (flags4 & RF4_BR_DISE) vp[vn++] = "disenchantment"; + if (flags4 & RF4_BR_NEXU) vp[vn++] = "nexus"; + if (flags4 & RF4_BR_TIME) vp[vn++] = "time"; + if (flags4 & RF4_BR_INER) vp[vn++] = "inertia"; + if (flags4 & RF4_BR_GRAV) vp[vn++] = "gravity"; + if (flags4 & RF4_BR_SHAR) vp[vn++] = "shards"; + if (flags4 & RF4_BR_PLAS) vp[vn++] = "plasma"; + if (flags4 & RF4_BR_WALL) vp[vn++] = "force"; + if (flags4 & RF4_BR_MANA) vp[vn++] = "mana"; + if (flags4 & RF4_BR_NUKE) vp[vn++] = "toxic waste"; + if (flags4 & RF4_BR_DISI) vp[vn++] = "disintegration"; /* Describe breaths */ if (vn) @@ -435,73 +435,73 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect spells */ vn = 0; - if (flags5 & (RF5_BA_ACID)) vp[vn++] = "produce acid balls"; - if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "produce lightning balls"; - if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "produce fire balls"; - if (flags5 & (RF5_BA_COLD)) vp[vn++] = "produce frost balls"; - if (flags5 & (RF5_BA_POIS)) vp[vn++] = "produce poison balls"; - if (flags5 & (RF5_BA_NETH)) vp[vn++] = "produce nether balls"; - if (flags5 & (RF5_BA_WATE)) vp[vn++] = "produce water balls"; - if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "produce balls of radiation"; - if (flags5 & (RF5_BA_MANA)) vp[vn++] = "invoke mana storms"; - if (flags5 & (RF5_BA_DARK)) vp[vn++] = "invoke darkness storms"; - if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "invoke raw chaos"; - if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "invoke the Hand of Doom"; - if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "drain mana"; - if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "cause mind blasting"; - if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "cause brain smashing"; + if (flags5 & RF5_BA_ACID) vp[vn++] = "produce acid balls"; + if (flags5 & RF5_BA_ELEC) vp[vn++] = "produce lightning balls"; + if (flags5 & RF5_BA_FIRE) vp[vn++] = "produce fire balls"; + if (flags5 & RF5_BA_COLD) vp[vn++] = "produce frost balls"; + if (flags5 & RF5_BA_POIS) vp[vn++] = "produce poison balls"; + if (flags5 & RF5_BA_NETH) vp[vn++] = "produce nether balls"; + if (flags5 & RF5_BA_WATE) vp[vn++] = "produce water balls"; + if (flags4 & RF4_BA_NUKE) vp[vn++] = "produce balls of radiation"; + if (flags5 & RF5_BA_MANA) vp[vn++] = "invoke mana storms"; + if (flags5 & RF5_BA_DARK) vp[vn++] = "invoke darkness storms"; + if (flags4 & RF4_BA_CHAO) vp[vn++] = "invoke raw chaos"; + if (flags6 & RF6_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; + if (flags5 & RF5_DRAIN_MANA) vp[vn++] = "drain mana"; + if (flags5 & RF5_MIND_BLAST) vp[vn++] = "cause mind blasting"; + if (flags5 & RF5_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (flags5 & (RF5_BO_ACID)) vp[vn++] = "produce acid bolts"; - if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "produce lightning bolts"; - if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "produce fire bolts"; - if (flags5 & (RF5_BO_COLD)) vp[vn++] = "produce frost bolts"; - if (flags5 & (RF5_BO_POIS)) vp[vn++] = "produce poison bolts"; - if (flags5 & (RF5_BO_NETH)) vp[vn++] = "produce nether bolts"; - if (flags5 & (RF5_BO_WATE)) vp[vn++] = "produce water bolts"; - if (flags5 & (RF5_BO_MANA)) vp[vn++] = "produce mana bolts"; - if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "produce plasma bolts"; - if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "produce ice bolts"; - if (flags5 & (RF5_MISSILE)) vp[vn++] = "produce magic missiles"; - if (flags5 & (RF5_SCARE)) vp[vn++] = "terrify"; - if (flags5 & (RF5_BLIND)) vp[vn++] = "blind"; - if (flags5 & (RF5_CONF)) vp[vn++] = "confuse"; - if (flags5 & (RF5_SLOW)) vp[vn++] = "slow"; - if (flags5 & (RF5_HOLD)) vp[vn++] = "paralyze"; - if (flags6 & (RF6_HASTE)) vp[vn++] = "haste-self"; - if (flags6 & (RF6_HEAL)) vp[vn++] = "heal-self"; - if (flags6 & (RF6_BLINK)) vp[vn++] = "blink-self"; - if (flags6 & (RF6_TPORT)) vp[vn++] = "teleport-self"; - if (flags6 & (RF6_S_BUG)) vp[vn++] = "summon software bugs"; - if (flags6 & (RF6_S_RNG)) vp[vn++] = "summon RNG"; - if (flags6 & (RF6_TELE_TO)) vp[vn++] = "teleport to"; - if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "teleport away"; - if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "teleport level"; - if (flags6 & (RF6_S_THUNDERLORD)) vp[vn++] = "summon a Thunderlord"; - if (flags6 & (RF6_DARKNESS)) vp[vn++] = "create darkness"; - if (flags6 & (RF6_TRAPS)) vp[vn++] = "create traps"; - if (flags6 & (RF6_FORGET)) vp[vn++] = "cause amnesia"; - if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "raise dead"; - if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "summon a monster"; - if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "summon monsters"; - if (flags6 & (RF6_S_KIN)) vp[vn++] = "summon aid"; - if (flags6 & (RF6_S_ANT)) vp[vn++] = "summon ants"; - if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "summon spiders"; - if (flags6 & (RF6_S_HOUND)) vp[vn++] = "summon hounds"; - if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "summon hydras"; - if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "summon an angel"; - if (flags6 & (RF6_S_DEMON)) vp[vn++] = "summon a demon"; - if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "summon an undead"; - if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "summon a dragon"; - if (flags4 & (RF4_S_ANIMAL)) vp[vn++] = "summon animal"; - if (flags6 & (RF6_S_ANIMALS)) vp[vn++] = "summon animals"; - if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "summon Greater Undead"; - if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "summon Ancient Dragons"; - if (flags6 & (RF6_S_HI_DEMON)) vp[vn++] = "summon Greater Demons"; - if (flags6 & (RF6_S_WRAITH)) vp[vn++] = "summon Ringwraith"; - if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "summon Unique Monsters"; + if (flags5 & RF5_BO_ACID) vp[vn++] = "produce acid bolts"; + if (flags5 & RF5_BO_ELEC) vp[vn++] = "produce lightning bolts"; + if (flags5 & RF5_BO_FIRE) vp[vn++] = "produce fire bolts"; + if (flags5 & RF5_BO_COLD) vp[vn++] = "produce frost bolts"; + if (flags5 & RF5_BO_POIS) vp[vn++] = "produce poison bolts"; + if (flags5 & RF5_BO_NETH) vp[vn++] = "produce nether bolts"; + if (flags5 & RF5_BO_WATE) vp[vn++] = "produce water bolts"; + if (flags5 & RF5_BO_MANA) vp[vn++] = "produce mana bolts"; + if (flags5 & RF5_BO_PLAS) vp[vn++] = "produce plasma bolts"; + if (flags5 & RF5_BO_ICEE) vp[vn++] = "produce ice bolts"; + if (flags5 & RF5_MISSILE) vp[vn++] = "produce magic missiles"; + if (flags5 & RF5_SCARE) vp[vn++] = "terrify"; + if (flags5 & RF5_BLIND) vp[vn++] = "blind"; + if (flags5 & RF5_CONF) vp[vn++] = "confuse"; + if (flags5 & RF5_SLOW) vp[vn++] = "slow"; + if (flags5 & RF5_HOLD) vp[vn++] = "paralyze"; + if (flags6 & RF6_HASTE) vp[vn++] = "haste-self"; + if (flags6 & RF6_HEAL) vp[vn++] = "heal-self"; + if (flags6 & RF6_BLINK) vp[vn++] = "blink-self"; + if (flags6 & RF6_TPORT) vp[vn++] = "teleport-self"; + if (flags6 & RF6_S_BUG) vp[vn++] = "summon software bugs"; + if (flags6 & RF6_S_RNG) vp[vn++] = "summon RNG"; + if (flags6 & RF6_TELE_TO) vp[vn++] = "teleport to"; + if (flags6 & RF6_TELE_AWAY) vp[vn++] = "teleport away"; + if (flags6 & RF6_TELE_LEVEL) vp[vn++] = "teleport level"; + if (flags6 & RF6_S_THUNDERLORD) vp[vn++] = "summon a Thunderlord"; + if (flags6 & RF6_DARKNESS) vp[vn++] = "create darkness"; + if (flags6 & RF6_TRAPS) vp[vn++] = "create traps"; + if (flags6 & RF6_FORGET) vp[vn++] = "cause amnesia"; + if (flags6 & RF6_RAISE_DEAD) vp[vn++] = "raise dead"; + if (flags6 & RF6_S_MONSTER) vp[vn++] = "summon a monster"; + if (flags6 & RF6_S_MONSTERS) vp[vn++] = "summon monsters"; + if (flags6 & RF6_S_KIN) vp[vn++] = "summon aid"; + if (flags6 & RF6_S_ANT) vp[vn++] = "summon ants"; + if (flags6 & RF6_S_SPIDER) vp[vn++] = "summon spiders"; + if (flags6 & RF6_S_HOUND) vp[vn++] = "summon hounds"; + if (flags6 & RF6_S_HYDRA) vp[vn++] = "summon hydras"; + if (flags6 & RF6_S_ANGEL) vp[vn++] = "summon an angel"; + if (flags6 & RF6_S_DEMON) vp[vn++] = "summon a demon"; + if (flags6 & RF6_S_UNDEAD) vp[vn++] = "summon an undead"; + if (flags6 & RF6_S_DRAGON) vp[vn++] = "summon a dragon"; + if (flags4 & RF4_S_ANIMAL) vp[vn++] = "summon animal"; + if (flags6 & RF6_S_ANIMALS) vp[vn++] = "summon animals"; + if (flags6 & RF6_S_HI_UNDEAD) vp[vn++] = "summon Greater Undead"; + if (flags6 & RF6_S_HI_DRAGON) vp[vn++] = "summon Ancient Dragons"; + if (flags6 & RF6_S_HI_DEMON) vp[vn++] = "summon Greater Demons"; + if (flags6 & RF6_S_WRAITH) vp[vn++] = "summon Ringwraith"; + if (flags6 & RF6_S_UNIQUE) vp[vn++] = "summon Unique Monsters"; /* Describe spells */ if (vn) @@ -523,7 +523,7 @@ static void roff_aux(std::shared_ptr r_ptr) text_out(" magical, casting spells"); /* Adverb */ - if (flags2 & (RF2_SMART)) text_out_c(TERM_YELLOW, " intelligently"); + if (flags2 & RF2_SMART) text_out_c(TERM_YELLOW, " intelligently"); /* Scan */ for (n = 0; n < vn; n++) @@ -563,7 +563,7 @@ static void roff_aux(std::shared_ptr r_ptr) text_out_c(TERM_L_GREEN, format("%d", r_ptr->ac)); /* Maximized hitpoints */ - if (flags1 & (RF1_FORCE_MAXHP)) + if (flags1 & RF1_FORCE_MAXHP) { text_out(" and a life rating of "); text_out_c(TERM_L_GREEN, format("%d", r_ptr->hdice * r_ptr->hside)); @@ -583,15 +583,15 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect special abilities. */ vn = 0; - if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors"; - if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors"; - if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls"; - if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls"; - if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters"; - if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters"; - if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects"; - if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects"; - if (flags9 & (RF9_HAS_LITE)) vp[vn++] = "illuminate the dungeon"; + if (flags2 & RF2_OPEN_DOOR) vp[vn++] = "open doors"; + if (flags2 & RF2_BASH_DOOR) vp[vn++] = "bash down doors"; + if (flags2 & RF2_PASS_WALL) vp[vn++] = "pass through walls"; + if (flags2 & RF2_KILL_WALL) vp[vn++] = "bore through walls"; + if (flags2 & RF2_MOVE_BODY) vp[vn++] = "push past weaker monsters"; + if (flags2 & RF2_KILL_BODY) vp[vn++] = "destroy weaker monsters"; + if (flags2 & RF2_TAKE_ITEM) vp[vn++] = "pick up objects"; + if (flags2 & RF2_KILL_ITEM) vp[vn++] = "destroy objects"; + if (flags9 & RF9_HAS_LITE) vp[vn++] = "illuminate the dungeon"; /* Describe special abilities. */ if (vn) @@ -617,31 +617,31 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe special abilities. */ - if (flags2 & (RF2_INVISIBLE)) + if (flags2 & RF2_INVISIBLE) { text_out_c(TERM_GREEN, format("%^s is invisible. ", wd_he[msex])); } - if (flags2 & (RF2_COLD_BLOOD)) + if (flags2 & RF2_COLD_BLOOD) { text_out(format("%^s is cold blooded. ", wd_he[msex])); } - if (flags2 & (RF2_EMPTY_MIND)) + if (flags2 & RF2_EMPTY_MIND) { text_out(format("%^s is not detected by telepathy. ", wd_he[msex])); } - if (flags2 & (RF2_WEIRD_MIND)) + if (flags2 & RF2_WEIRD_MIND) { text_out(format("%^s is rarely detected by telepathy. ", wd_he[msex])); } - if (flags4 & (RF4_MULTIPLY)) + if (flags4 & RF4_MULTIPLY) { text_out_c(TERM_L_UMBER, format("%^s breeds explosively. ", wd_he[msex])); } - if (flags2 & (RF2_REGENERATE)) + if (flags2 & RF2_REGENERATE) { text_out_c(TERM_L_WHITE, format("%^s regenerates quickly. ", wd_he[msex])); } - if (r_ptr->flags7 & (RF7_MORTAL)) + if (r_ptr->flags7 & RF7_MORTAL) { text_out_c(TERM_RED, format("%^s is a mortal being. ", wd_he[msex])); } @@ -653,37 +653,37 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect susceptibilities */ vn = 0; - if (flags3 & (RF3_HURT_ROCK)) + if (flags3 & RF3_HURT_ROCK) { vp[vn++] = "rock remover"; color[vn - 1] = TERM_UMBER; } - if (flags3 & (RF3_HURT_LITE)) + if (flags3 & RF3_HURT_LITE) { vp[vn++] = "bright light"; color[vn - 1] = TERM_YELLOW; } - if (flags3 & (RF3_SUSCEP_FIRE)) + if (flags3 & RF3_SUSCEP_FIRE) { vp[vn++] = "fire"; color[vn - 1] = TERM_RED; } - if (flags3 & (RF3_SUSCEP_COLD)) + if (flags3 & RF3_SUSCEP_COLD) { vp[vn++] = "cold"; color[vn - 1] = TERM_L_WHITE; } - if (flags9 & (RF9_SUSCEP_ACID)) + if (flags9 & RF9_SUSCEP_ACID) { vp[vn++] = "acid"; color[vn - 1] = TERM_GREEN; } - if (flags9 & (RF9_SUSCEP_ELEC)) + if (flags9 & RF9_SUSCEP_ELEC) { vp[vn++] = "lightning"; color[vn - 1] = TERM_L_BLUE; } - if (flags9 & (RF9_SUSCEP_POIS)) + if (flags9 & RF9_SUSCEP_POIS) { vp[vn++] = "poison"; color[vn - 1] = TERM_L_GREEN; @@ -714,27 +714,27 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect immunities */ vn = 0; - if (flags3 & (RF3_IM_ACID)) + if (flags3 & RF3_IM_ACID) { vp[vn++] = "acid"; color[vn - 1] = TERM_L_GREEN; } - if (flags3 & (RF3_IM_ELEC)) + if (flags3 & RF3_IM_ELEC) { vp[vn++] = "lightning"; color[vn - 1] = TERM_L_BLUE; } - if (flags3 & (RF3_IM_FIRE)) + if (flags3 & RF3_IM_FIRE) { vp[vn++] = "fire"; color[vn - 1] = TERM_L_RED; } - if (flags3 & (RF3_IM_COLD)) + if (flags3 & RF3_IM_COLD) { vp[vn++] = "cold"; color[vn - 1] = TERM_L_BLUE; } - if (flags3 & (RF3_IM_POIS)) + if (flags3 & RF3_IM_POIS) { vp[vn++] = "poison"; color[vn - 1] = TERM_L_GREEN; @@ -765,12 +765,12 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect resistances */ vn = 0; - if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether"; - if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water"; - if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma"; - if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus"; - if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment"; - if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation"; + if (flags3 & RF3_RES_NETH) vp[vn++] = "nether"; + if (flags3 & RF3_RES_WATE) vp[vn++] = "water"; + if (flags3 & RF3_RES_PLAS) vp[vn++] = "plasma"; + if (flags3 & RF3_RES_NEXU) vp[vn++] = "nexus"; + if (flags3 & RF3_RES_DISE) vp[vn++] = "disenchantment"; + if (flags3 & RF3_RES_TELE) vp[vn++] = "teleportation"; /* Describe resistances */ if (vn) @@ -797,10 +797,10 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect non-effects */ vn = 0; - if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned"; - if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened"; - if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused"; - if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept"; + if (flags3 & RF3_NO_STUN) vp[vn++] = "stunned"; + if (flags3 & RF3_NO_FEAR) vp[vn++] = "frightened"; + if (flags3 & RF3_NO_CONF) vp[vn++] = "confused"; + if (flags3 & RF3_NO_SLEEP) vp[vn++] = "slept"; /* Describe non-effects */ if (vn) @@ -924,13 +924,13 @@ static void roff_aux(std::shared_ptr r_ptr) /* Great */ - if (flags1 & (RF1_DROP_GREAT)) + if (flags1 & RF1_DROP_GREAT) { p = " exceptional"; } /* Good (no "n" needed) */ - else if (flags1 & (RF1_DROP_GOOD)) + else if (flags1 & RF1_DROP_GOOD) { p = " good"; sin = FALSE; @@ -1240,7 +1240,7 @@ static void roff_aux(std::shared_ptr r_ptr) } /* Notice lack of attacks */ - else if (flags1 & (RF1_NEVER_BLOW)) + else if (flags1 & RF1_NEVER_BLOW) { text_out(format("%^s has no physical attacks. ", wd_he[msex])); } @@ -1272,7 +1272,7 @@ static void roff_name(int r_idx, int ego) const byte a2 = r_ptr->x_attr; /* A title (use "The" for non-uniques) */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) + if (!(r_ptr->flags1 & RF1_UNIQUE)) { Term_addstr( -1, TERM_WHITE, "The "); } diff --git a/src/monster2.cc b/src/monster2.cc index 2beb671f..1b942a04 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -452,11 +452,11 @@ void delete_monster_idx(int i) r_ptr->on_saved = FALSE; /* Hack -- count the number of "reproducers" */ - if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro--; + if (r_ptr->flags4 & RF4_MULTIPLY) num_repro--; /* XXX XXX XXX remove monster light source */ bool_ had_lite = FALSE; - if (r_ptr->flags9 & (RF9_HAS_LITE)) had_lite = TRUE; + if (r_ptr->flags9 & RF9_HAS_LITE) had_lite = TRUE; /* Hack -- remove target monster */ @@ -682,7 +682,7 @@ void compact_monsters(int size) if ((m_ptr->mflag & MFLAG_QUEST) && (cnt < 1000)) chance = 100; /* Try not to compact Unique Monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) chance = 99; + if (r_ptr->flags1 & RF1_UNIQUE) chance = 99; /* All monsters get a saving throw */ if (rand_int(100) < chance) continue; @@ -1054,20 +1054,20 @@ s16b get_mon_num(int level) r_ptr = &r_info[r_idx]; /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) && + if ((r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num)) { continue; } /* Depth Monsters never appear out of depth */ - if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) && (r_ptr->level > dun_level)) + if ((r_ptr->flags1 & RF1_FORCE_DEPTH) && (r_ptr->level > dun_level)) { continue; } /* Depth Monsters never appear out of their depth */ - if ((r_ptr->flags9 & (RF9_ONLY_DEPTH)) && (r_ptr->level != dun_level)) + if ((r_ptr->flags9 & RF9_ONLY_DEPTH) && (r_ptr->level != dun_level)) { continue; } @@ -1278,8 +1278,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) int kind = 0x00; /* Extract the gender (if applicable) */ - if (r_ptr->flags1 & (RF1_FEMALE)) kind = 0x20; - else if (r_ptr->flags1 & (RF1_MALE)) kind = 0x10; + if (r_ptr->flags1 & RF1_FEMALE) kind = 0x20; + else if (r_ptr->flags1 & RF1_MALE) kind = 0x10; /* Ignore the gender (if desired) */ if (!m_ptr || !pron) kind = 0x00; @@ -1379,8 +1379,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) else if ((mode & 0x02) && (mode & 0x01)) { /* The monster is visible, so use its gender */ - if (r_ptr->flags1 & (RF1_FEMALE)) strcpy(desc, "herself"); - else if (r_ptr->flags1 & (RF1_MALE)) strcpy(desc, "himself"); + if (r_ptr->flags1 & RF1_FEMALE) strcpy(desc, "herself"); + else if (r_ptr->flags1 & RF1_MALE) strcpy(desc, "himself"); else strcpy(desc, "itself"); } @@ -1389,7 +1389,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) else { /* It could be a Unique */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) && !(p_ptr->image)) + if ((r_ptr->flags1 & RF1_UNIQUE) && !(p_ptr->image)) { /* Start with the name (thus nominative and objective) */ (void)strcpy(desc, name); @@ -1761,13 +1761,13 @@ void update_mon(int m_idx, bool_ full) if (can_esp) { /* Empty mind, no telepathy */ - if (r_ptr->flags2 & (RF2_EMPTY_MIND)) + if (r_ptr->flags2 & RF2_EMPTY_MIND) { /* No telepathy */ } /* Weird mind, occasional telepathy */ - else if (r_ptr->flags2 & (RF2_WEIRD_MIND)) + else if (r_ptr->flags2 & RF2_WEIRD_MIND) { if (rand_int(100) < 10) { @@ -2146,7 +2146,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx])) + if ((r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx])) { /* Cannot create */ if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: unique not unique", r_idx); @@ -2161,7 +2161,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num)) + if ((r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num)) { /* Cannot create */ if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: cur_num >= max_num", r_idx); @@ -2169,7 +2169,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Depth monsters may NOT be created out of depth */ - if ((r_ptr->flags1 & (RF1_FORCE_DEPTH)) && (dun_level < r_ptr->level)) + if ((r_ptr->flags1 & RF1_FORCE_DEPTH) && (dun_level < r_ptr->level)) { /* Cannot create */ if (wizard) cmsg_print(TERM_L_RED, "WARNING: FORCE_DEPTH"); @@ -2180,7 +2180,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) if (r_ptr->level > dun_level) { /* Unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { /* Message for cheaters */ if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Unique (%s).", r_ptr->name); @@ -2201,7 +2201,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Note the monster */ - else if (r_ptr->flags1 & (RF1_UNIQUE)) + else if (r_ptr->flags1 & RF1_UNIQUE) { /* Unique monsters induce message */ if ((cheat_hear) || (p_ptr->precognition)) msg_format("Unique (%s).", r_ptr->name); @@ -2279,12 +2279,12 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Only if not fated to die */ if ((dungeon_type != DUNGEON_DEATH) && (!place_monster_one_no_drop)) { - const bool_ good = (r_ptr->flags1 & (RF1_DROP_GOOD)) ? TRUE : FALSE; - const bool_ great = (r_ptr->flags1 & (RF1_DROP_GREAT)) ? TRUE : FALSE; + const bool_ good = (r_ptr->flags1 & RF1_DROP_GOOD) ? TRUE : FALSE; + const bool_ great = (r_ptr->flags1 & RF1_DROP_GREAT) ? TRUE : FALSE; - const bool_ do_gold = (!(r_ptr->flags1 & (RF1_ONLY_ITEM))); - const bool_ do_item = (!(r_ptr->flags1 & (RF1_ONLY_GOLD))); - const bool_ do_mimic = (r_ptr->flags9 & (RF9_MIMIC)); + const bool_ do_gold = (!(r_ptr->flags1 & RF1_ONLY_ITEM)); + const bool_ do_item = (!(r_ptr->flags1 & RF1_ONLY_GOLD)); + const bool_ do_mimic = (r_ptr->flags9 & RF9_MIMIC); const int force_coin = get_coin_type(r_ptr); @@ -2305,7 +2305,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) if (r_ptr->flags1 & (RF1_DROP_2D2)) number += damroll(2, 2); if (r_ptr->flags1 & (RF1_DROP_3D2)) number += damroll(3, 2); if (r_ptr->flags1 & (RF1_DROP_4D2)) number += damroll(4, 2); - if (r_ptr->flags9 & (RF9_MIMIC)) number = 1; + if (r_ptr->flags9 & RF9_MIMIC) number = 1; /* Hack -- handle creeping coins */ coin_type = force_coin; @@ -2421,7 +2421,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Assign maximal hitpoints */ - if (r_ptr->flags1 & (RF1_FORCE_MAXHP)) + if (r_ptr->flags1 & RF1_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -2450,7 +2450,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) m_ptr->mspeed = m_ptr->speed; /* Hack -- small racial variety */ - if (!(r_ptr->flags1 & (RF1_UNIQUE))) + if (!(r_ptr->flags1 & RF1_UNIQUE)) { /* Allow some small variation per monster */ i = extract_energy[m_ptr->speed] / 10; @@ -2481,7 +2481,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) m_ptr->energy = (byte)rand_int(100); /* Force monster to wait for player */ - if (r_ptr->flags1 & (RF1_FORCE_SLEEP)) + if (r_ptr->flags1 & RF1_FORCE_SLEEP) { /* Monster is still being nice */ m_ptr->mflag |= (MFLAG_NICE); @@ -2503,11 +2503,11 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++; + if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE; + if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; /* Count monsters on the level */ { @@ -2655,7 +2655,7 @@ static bool_ place_monster_okay(int r_idx) if (z_ptr->level > r_ptr->level) return (FALSE); /* Skip unique monsters */ - if (z_ptr->flags1 & (RF1_UNIQUE)) return (FALSE); + if (z_ptr->flags1 & RF1_UNIQUE) return (FALSE); /* Paranoia -- Skip identical monsters */ if (place_monster_idx == r_idx) return (FALSE); @@ -2699,7 +2699,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu /* Friends for certain monsters */ - if (r_ptr->flags1 & (RF1_FRIENDS)) + if (r_ptr->flags1 & RF1_FRIENDS) { /* Attempt to place a group */ (void)place_monster_group(y, x, r_idx, slp, status); @@ -2707,7 +2707,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu /* Escorts for certain monsters */ - if (r_ptr->flags1 & (RF1_ESCORT)) + if (r_ptr->flags1 & RF1_ESCORT) { old_get_mon_num_hook = get_mon_num_hook; @@ -2752,8 +2752,8 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu place_monster_one(ny, nx, z, pick_ego_monster(&r_info[z]), slp, status); /* Place a "group" of escorts if needed */ - if ((r_info[z].flags1 & (RF1_FRIENDS)) || - (r_ptr->flags1 & (RF1_ESCORTS))) + if ((r_info[z].flags1 & RF1_FRIENDS) || + (r_ptr->flags1 & RF1_ESCORTS)) { /* Place a group of monsters */ (void)place_monster_group(ny, nx, z, slp, status); @@ -2829,8 +2829,8 @@ bool_ alloc_horde(int y, int x) r_ptr = &r_info[r_idx]; - if (!(r_ptr->flags1 & (RF1_UNIQUE)) - && !(r_ptr->flags1 & (RF1_ESCORTS))) + if (!(r_ptr->flags1 & RF1_UNIQUE) + && !(r_ptr->flags1 & RF1_ESCORTS)) break; } @@ -2953,56 +2953,56 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_ANT: { okay = ((r_ptr->d_char == 'a') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_SPIDER: { okay = ((r_ptr->d_char == 'S') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_HOUND: { okay = (((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z')) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_HYDRA: { okay = ((r_ptr->d_char == 'M') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_ANGEL: { okay = ((r_ptr->d_char == 'A') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_DEMON: { - okay = ((r_ptr->flags3 & (RF3_DEMON)) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + okay = ((r_ptr->flags3 & RF3_DEMON) && + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_UNDEAD: { - okay = ((r_ptr->flags3 & (RF3_UNDEAD)) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + okay = ((r_ptr->flags3 & RF3_UNDEAD) && + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_DRAGON: { - okay = ((r_ptr->flags3 & (RF3_DRAGON)) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + okay = ((r_ptr->flags3 & RF3_DRAGON) && + !(r_ptr->flags1 & RF1_UNIQUE)); break; } @@ -3034,40 +3034,40 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_UNIQUE: { - okay = (r_ptr->flags1 & (RF1_UNIQUE)) ? TRUE : FALSE; + okay = (r_ptr->flags1 & RF1_UNIQUE) ? TRUE : FALSE; break; } case SUMMON_BIZARRE1: { okay = ((r_ptr->d_char == 'm') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_BIZARRE2: { okay = ((r_ptr->d_char == 'b') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_BIZARRE3: { okay = ((r_ptr->d_char == 'Q') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_BIZARRE4: { okay = ((r_ptr->d_char == 'v') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_BIZARRE5: { okay = ((r_ptr->d_char == '$') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } @@ -3078,13 +3078,13 @@ static bool_ summon_specific_okay(int r_idx) (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|')) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_HI_DEMON: { - okay = ((r_ptr->flags3 & (RF3_DEMON)) && + okay = ((r_ptr->flags3 & RF3_DEMON) && (r_ptr->d_char == 'U') && !(r_ptr->flags1 & RF1_UNIQUE)); break; @@ -3094,34 +3094,34 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_KIN: { okay = ((r_ptr->d_char == summon_kin_type) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_DAWN: { okay = ((strstr(r_ptr->name, "the Dawn")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_ANIMAL: { - okay = ((r_ptr->flags3 & (RF3_ANIMAL)) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + okay = ((r_ptr->flags3 & RF3_ANIMAL) && + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_ANIMAL_RANGER: { - okay = ((r_ptr->flags3 & (RF3_ANIMAL)) && + okay = ((r_ptr->flags3 & RF3_ANIMAL) && (strchr("abcflqrwBCIJKMRS", r_ptr->d_char)) && - !(r_ptr->flags3 & (RF3_DRAGON)) && - !(r_ptr->flags3 & (RF3_EVIL)) && - !(r_ptr->flags3 & (RF3_UNDEAD)) && - !(r_ptr->flags3 & (RF3_DEMON)) && + !(r_ptr->flags3 & RF3_DRAGON) && + !(r_ptr->flags3 & RF3_EVIL) && + !(r_ptr->flags3 & RF3_UNDEAD) && + !(r_ptr->flags3 & RF3_DEMON) && !(r_ptr->flags4 || r_ptr->flags5 || r_ptr->flags6) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } @@ -3130,34 +3130,34 @@ static bool_ summon_specific_okay(int r_idx) okay = (((r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W')) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_HI_DRAGON_NO_UNIQUES: { okay = ((r_ptr->d_char == 'D') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_NO_UNIQUES: { - okay = (!(r_ptr->flags1 & (RF1_UNIQUE))); + okay = (!(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_PHANTOM: { okay = ((strstr(r_ptr->name, "Phantom")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_ELEMENTAL: { okay = ((strstr(r_ptr->name, "lemental")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } @@ -3170,21 +3170,21 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_BLUE_HORROR: { okay = ((strstr(r_ptr->name, "lue horror")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_BUG: { okay = ((strstr(r_ptr->name, "Software bug")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_RNG: { okay = ((strstr(r_ptr->name, "Random Number Generator")) && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_MINE: @@ -3196,21 +3196,21 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_HUMAN: { okay = ((r_ptr->d_char == 'p') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_SHADOWS: { okay = ((r_ptr->d_char == 'G') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } case SUMMON_QUYLTHULG: { okay = ((r_ptr->d_char == 'Q') && - !(r_ptr->flags1 & (RF1_UNIQUE))); + !(r_ptr->flags1 & RF1_UNIQUE)); break; } @@ -3519,7 +3519,7 @@ static bool_ mutate_monster_okay(int r_idx) /* Hack - Only summon dungeon monsters */ if (!monster_dungeon(r_idx)) return (FALSE); - okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags1 & (RF1_UNIQUE)) + okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->level >= dun_level)); return okay; @@ -3741,10 +3741,10 @@ void update_smart_learn(int m_idx, int what) auto const r_ptr = m_ptr->race(); /* Too stupid to learn anything */ - if (r_ptr->flags2 & (RF2_STUPID)) return; + if (r_ptr->flags2 & RF2_STUPID) return; /* Not intelligent, only learn sometimes */ - if (!(r_ptr->flags2 & (RF2_SMART)) && magik(50)) return; + if (!(r_ptr->flags2 & RF2_SMART) && magik(50)) return; /* XXX XXX XXX */ diff --git a/src/monster3.cc b/src/monster3.cc index d01545ec..c718c880 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -174,7 +174,7 @@ bool_ ai_possessor(int m_idx, int o_idx) m_ptr->csleep = 0; /* Assign maximal hitpoints */ - if (r_ptr->flags1 & (RF1_FORCE_MAXHP)) + if (r_ptr->flags1 & RF1_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -205,10 +205,10 @@ bool_ ai_possessor(int m_idx, int o_idx) m_ptr->energy = 0; /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++; + if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE; + if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; /* Hack -- Count the monsters on the level */ r_ptr->cur_num++; @@ -249,7 +249,7 @@ void ai_deincarnate(int m_idx) m_ptr->csleep = 0; /* Assign maximal hitpoints */ - if (r_ptr->flags1 & (RF1_FORCE_MAXHP)) + if (r_ptr->flags1 & RF1_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -280,10 +280,10 @@ void ai_deincarnate(int m_idx) m_ptr->energy = 0; /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & (RF4_MULTIPLY)) num_repro++; + if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & (RF1_ATTR_MULTI)) shimmer_monsters = TRUE; + if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; /* Hack -- Count the monsters on the level */ r_ptr->cur_num++; diff --git a/src/spells1.cc b/src/spells1.cc index 3859ed65..cad09a92 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -108,7 +108,7 @@ s16b poly_r_idx(int r_idx) r_ptr = &r_info[r]; /* Ignore unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) continue; + if (r_ptr->flags1 & RF1_UNIQUE) continue; /* Use that index */ r_idx = r; @@ -4362,10 +4362,10 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || - (r_ptr->flags3 & (RF3_NONLIVING)) || + if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || + (r_ptr->flags3 & RF3_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4400,11 +4400,11 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) get_angry = TRUE; break; case GF_KILL_WALL: - if (r_ptr->flags3 & (RF3_HURT_ROCK)) + if (r_ptr->flags3 & RF3_HURT_ROCK) get_angry = TRUE; break; case GF_HOLY_FIRE: - if (!(r_ptr->flags3 & (RF3_GOOD))) + if (!(r_ptr->flags3 & RF3_GOOD)) get_angry = TRUE; break; case GF_TURN_UNDEAD: @@ -4427,17 +4427,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; case GF_DISP_LIVING: case GF_UNBREATH: - if (!(r_ptr->flags3 & (RF3_UNDEAD)) && - !(r_ptr->flags3 & (RF3_NONLIVING))) + if (!(r_ptr->flags3 & RF3_UNDEAD) && + !(r_ptr->flags3 & RF3_NONLIVING)) get_angry = TRUE; break; case GF_PSI: case GF_PSI_DRAIN: - if (!(r_ptr->flags2 & (RF2_EMPTY_MIND))) + if (!(r_ptr->flags2 & RF2_EMPTY_MIND)) get_angry = TRUE; break; case GF_DOMINATION: - if (!(r_ptr->flags3 & (RF3_NO_CONF))) + if (!(r_ptr->flags3 & RF3_NO_CONF)) get_angry = TRUE; break; case GF_OLD_POLY: @@ -4519,12 +4519,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_ACID: { if (seen) obvious = TRUE; - if (r_ptr->flags9 & (RF9_SUSCEP_ACID)) + if (r_ptr->flags9 & RF9_SUSCEP_ACID) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & (RF3_IM_ACID)) + if (r_ptr->flags3 & RF3_IM_ACID) { note = " resists a lot."; dam /= 9; @@ -4536,12 +4536,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_ELEC: { if (seen) obvious = TRUE; - if (r_ptr->flags9 & (RF9_SUSCEP_ELEC)) + if (r_ptr->flags9 & RF9_SUSCEP_ELEC) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & (RF3_IM_ELEC)) + if (r_ptr->flags3 & RF3_IM_ELEC) { note = " resists a lot."; dam /= 9; @@ -4553,12 +4553,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_SUSCEP_FIRE)) + if (r_ptr->flags3 & RF3_SUSCEP_FIRE) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & (RF3_IM_FIRE)) + if (r_ptr->flags3 & RF3_IM_FIRE) { note = " resists a lot."; dam /= 9; @@ -4570,12 +4570,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_COLD: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_SUSCEP_COLD)) + if (r_ptr->flags3 & RF3_SUSCEP_COLD) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & (RF3_IM_COLD)) + if (r_ptr->flags3 & RF3_IM_COLD) { note = " resists a lot."; dam /= 9; @@ -4588,13 +4588,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(25)) do_pois = (10 + randint(11) + r) / (r + 1); - if (r_ptr->flags9 & (RF9_SUSCEP_POIS)) + if (r_ptr->flags9 & RF9_SUSCEP_POIS) { note = " is hit hard."; dam *= 3; do_pois *= 2; } - if (r_ptr->flags3 & (RF3_IM_POIS)) + if (r_ptr->flags3 & RF3_IM_POIS) { note = " resists a lot."; dam /= 9; @@ -4609,7 +4609,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(15)) do_pois = (10 + randint(11) + r) / (r + 1); - if ((r_ptr->flags3 & (RF3_NONLIVING)) || (r_ptr->flags3 & (RF3_UNDEAD))) + if ((r_ptr->flags3 & RF3_NONLIVING) || (r_ptr->flags3 & RF3_UNDEAD)) { note = " is immune."; dam = 0; @@ -4623,7 +4623,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_IM_POIS)) + if (r_ptr->flags3 & RF3_IM_POIS) { note = " resists."; dam *= 3; @@ -4637,7 +4637,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_HELL_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_EVIL)) + if (r_ptr->flags3 & RF3_EVIL) { dam *= 2; note = " is hit hard."; @@ -4649,12 +4649,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_HOLY_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_GOOD)) + if (r_ptr->flags3 & RF3_GOOD) { dam = 0; note = " is immune."; } - else if (r_ptr->flags3 & (RF3_EVIL)) + else if (r_ptr->flags3 & RF3_EVIL) { dam *= 2; note = " is hit hard."; @@ -4679,7 +4679,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_PLASMA: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_RES_PLAS)) + if (r_ptr->flags3 & RF3_RES_PLAS) { note = " resists."; dam *= 3; @@ -4692,18 +4692,18 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_NETHER: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_UNDEAD)) + if (r_ptr->flags3 & RF3_UNDEAD) { note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & (RF3_RES_NETH)) + else if (r_ptr->flags3 & RF3_RES_NETH) { note = " resists."; dam *= 3; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & (RF3_EVIL)) + else if (r_ptr->flags3 & RF3_EVIL) { dam /= 2; note = " resists somewhat."; @@ -4722,7 +4722,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & (RF3_RES_WATE)) + else if (r_ptr->flags3 & RF3_RES_WATE) { note = " resists."; dam *= 3; @@ -4742,7 +4742,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & (RF3_RES_WATE)) + else if (r_ptr->flags3 & RF3_RES_WATE) { note = " resists."; dam *= 3; @@ -4830,8 +4830,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; do_poly = TRUE; do_conf = (5 + randint(11) + r) / (r + 1); - if ((r_ptr->flags4 & (RF4_BR_CHAO)) || - ((r_ptr->flags3 & (RF3_DEMON)) && (randint(3) == 1))) + if ((r_ptr->flags4 & RF4_BR_CHAO) || + ((r_ptr->flags3 & RF3_DEMON) && (randint(3) == 1))) { note = " resists."; dam *= 3; @@ -4846,7 +4846,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & (RF4_BR_SHAR)) + if (r_ptr->flags4 & RF4_BR_SHAR) { note = " resists."; dam *= 3; @@ -4862,7 +4862,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; if (magik(12)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & (RF4_BR_SHAR)) + if (r_ptr->flags4 & RF4_BR_SHAR) { note = " resists somewhat."; dam /= 2; @@ -4883,7 +4883,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } else do_stun = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & (RF4_BR_SOUN)) + if (r_ptr->flags4 & RF4_BR_SOUN) { note = " resists."; dam *= 2; @@ -4897,13 +4897,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; do_conf = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & (RF4_BR_CONF)) + if (r_ptr->flags4 & RF4_BR_CONF) { note = " resists."; dam *= 2; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & (RF3_NO_CONF)) + else if (r_ptr->flags3 & RF3_NO_CONF) { note = " resists somewhat."; dam /= 2; @@ -4915,7 +4915,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISENCHANT: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_RES_DISE)) + if (r_ptr->flags3 & RF3_RES_DISE) { note = " resists."; dam *= 3; @@ -4928,7 +4928,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_NEXUS: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_RES_NEXU)) + if (r_ptr->flags3 & RF3_RES_NEXU) { note = " resists."; dam *= 3; @@ -5025,7 +5025,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* --hack-- Only stun if a monster fired it */ else do_stun = (randint(15) + r) / (r + 1); - if (r_ptr->flags4 & (RF4_BR_WALL)) + if (r_ptr->flags4 & RF4_BR_WALL) { note = " resists."; dam *= 3; @@ -5038,7 +5038,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_INERTIA: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & (RF4_BR_INER)) + if (r_ptr->flags4 & RF4_BR_INER) { note = " resists."; dam *= 3; @@ -5065,7 +5065,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TIME: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & (RF4_BR_TIME)) + if (r_ptr->flags4 & RF4_BR_TIME) { note = " resists."; dam *= 3; @@ -5081,9 +5081,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_RES_TELE)) + if (r_ptr->flags3 & RF3_RES_TELE) { - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { note = " is unaffected!"; resist_tele = TRUE; @@ -5098,7 +5098,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (!resist_tele) do_dist = 10; else do_dist = 0; - if (r_ptr->flags4 & (RF4_BR_GRAV)) + if (r_ptr->flags4 & RF4_BR_GRAV) { note = " resists."; dam *= 3; @@ -5109,7 +5109,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { /* 1. slowness */ /* Powerful monsters can resist */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { obvious = FALSE; @@ -5125,7 +5125,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5150,7 +5150,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISINTEGRATE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & (RF3_HURT_ROCK)) + if (r_ptr->flags3 & RF3_HURT_ROCK) { note = " loses some skin!"; note_dies = " evaporates!"; @@ -5170,7 +5170,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_FEAR: { - if (r_ptr->flags3 & (RF3_NO_FEAR)) + if (r_ptr->flags3 & RF3_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + (dam / 2) + randint(dam / 2)); @@ -5228,7 +5228,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; case 3: { - if (r_ptr->flags3 & (RF3_NO_FEAR)) + if (r_ptr->flags3 & RF3_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + 3 + randint(dam)); @@ -5335,7 +5335,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > 5 + randint(dam))) { /* Resist */ @@ -5359,8 +5359,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->flags3 & (RF3_NO_CONF)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5396,7 +5396,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; default: { - if (r_ptr->flags3 & (RF3_NO_FEAR)) + if (r_ptr->flags3 & RF3_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + dam); @@ -5449,13 +5449,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; do_stun = (randint(15) + 1) / (r + 1); if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags3 & (RF3_SUSCEP_COLD)) + if (r_ptr->flags3 & RF3_SUSCEP_COLD) { note = " is hit hard."; dam *= 3; do_cut *= 2; } - if (r_ptr->flags3 & (RF3_IM_COLD)) + if (r_ptr->flags3 & RF3_IM_COLD) { note = " resists a lot."; dam /= 9; @@ -5470,9 +5470,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; - if ((r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_NONLIVING)) || + if ((r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_NONLIVING) || (strchr("Egv", r_ptr->d_char))) { note = " is unaffected!"; @@ -5487,14 +5487,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DEATH_RAY: { if (seen) obvious = TRUE; - if ((r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags3 & (RF3_NONLIVING))) + if ((r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags3 & RF3_NONLIVING)) { note = " is immune."; obvious = FALSE; dam = 0; } - else if (((r_ptr->flags1 & (RF1_UNIQUE)) && + else if (((r_ptr->flags1 & RF1_UNIQUE) && (randint(888) != 666)) || (((m_ptr->level + randint(20)) > randint((dam) + randint(10))) && randint(100) != 66 )) @@ -5609,7 +5609,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Powerful monsters can resist */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { note = " is unaffected!"; @@ -5635,7 +5635,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags3 & (RF3_NO_SLEEP)) || + if ((r_ptr->flags3 & RF3_NO_SLEEP) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* No obvious effect */ @@ -5661,7 +5661,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { note = " is unaffected!"; @@ -5823,10 +5823,10 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & (RF3_ANIMAL))) || - (r_ptr->flags3 & (RF3_NO_CONF)) || + (!(r_ptr->flags3 & RF3_ANIMAL)) || + (r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5856,9 +5856,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & (RF3_DEMON))) || + (!(r_ptr->flags3 & RF3_DEMON)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5890,7 +5890,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & (RF3_NO_CONF)) || + if ((r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5937,7 +5937,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & (RF3_NO_CONF)) || + if ((r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5977,7 +5977,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5989,7 +5989,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } /* Non_living resists */ - if (r_ptr->flags3 & (RF3_NONLIVING)) + if (r_ptr->flags3 & RF3_NONLIVING) { /* Resist */ do_stun = 0; @@ -6011,7 +6011,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & (RF3_NO_CONF)) || + if ((r_ptr->flags3 & RF3_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -6042,7 +6042,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_LITE_WEAK: { /* Hurt by light */ - if (r_ptr->flags3 & (RF3_HURT_LITE)) + if (r_ptr->flags3 & RF3_HURT_LITE) { /* Obvious effect */ if (seen) obvious = TRUE; @@ -6068,13 +6068,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_LITE: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & (RF4_BR_LITE)) + if (r_ptr->flags4 & RF4_BR_LITE) { note = " resists."; dam *= 2; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & (RF3_HURT_LITE)) + else if (r_ptr->flags3 & RF3_HURT_LITE) { note = " cringes from the light!"; note_dies = " shrivels away in the light!"; @@ -6090,7 +6090,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Likes darkness... */ - if ((r_ptr->flags4 & (RF4_BR_DARK)) || + if ((r_ptr->flags4 & RF4_BR_DARK) || (r_ptr->flags3 & RF3_ORC) || (r_ptr->flags3 & RF3_HURT_LITE)) { @@ -6106,7 +6106,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_KILL_WALL: { /* Hurt by rock remover */ - if (r_ptr->flags3 & (RF3_HURT_ROCK)) + if (r_ptr->flags3 & RF3_HURT_ROCK) { /* Notice effect */ if (seen) obvious = TRUE; @@ -6133,13 +6133,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) + if (r_ptr->flags3 & RF3_UNDEAD) { bool_ resists_tele = FALSE; - if (r_ptr->flags3 & (RF3_RES_TELE)) + if (r_ptr->flags3 & RF3_RES_TELE) { - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6176,13 +6176,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) + if (r_ptr->flags3 & RF3_EVIL) { bool_ resists_tele = FALSE; - if (r_ptr->flags3 & (RF3_RES_TELE)) + if (r_ptr->flags3 & RF3_RES_TELE) { - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6220,9 +6220,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) bool_ resists_tele = FALSE; if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ - if (r_ptr->flags3 & (RF3_RES_TELE)) + if (r_ptr->flags3 & RF3_RES_TELE) { - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6253,7 +6253,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TURN_UNDEAD: { /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) + if (r_ptr->flags3 & RF3_UNDEAD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6288,7 +6288,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TURN_EVIL: { /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) + if (r_ptr->flags3 & RF3_EVIL) { /* Obvious */ if (seen) obvious = TRUE; @@ -6329,8 +6329,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_fear = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || - (r_ptr->flags3 & (RF3_NO_FEAR)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || + (r_ptr->flags3 & RF3_NO_FEAR) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* No obvious effect */ @@ -6349,7 +6349,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_UNDEAD: { /* Only affect undead */ - if (r_ptr->flags3 & (RF3_UNDEAD)) + if (r_ptr->flags3 & RF3_UNDEAD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6377,7 +6377,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_EVIL: { /* Only affect evil */ - if (r_ptr->flags3 & (RF3_EVIL)) + if (r_ptr->flags3 & RF3_EVIL) { /* Obvious */ if (seen) obvious = TRUE; @@ -6404,7 +6404,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_GOOD: { /* Only affect good */ - if (r_ptr->flags3 & (RF3_GOOD)) + if (r_ptr->flags3 & RF3_GOOD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6431,8 +6431,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_LIVING: { /* Only affect non-undead */ - if (!(r_ptr->flags3 & (RF3_UNDEAD)) && - !(r_ptr->flags3 & (RF3_NONLIVING))) + if (!(r_ptr->flags3 & RF3_UNDEAD) && + !(r_ptr->flags3 & RF3_NONLIVING)) { /* Obvious */ if (seen) obvious = TRUE; @@ -6459,7 +6459,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_DEMON: { /* Only affect demons */ - if (r_ptr->flags3 & (RF3_DEMON)) + if (r_ptr->flags3 & RF3_DEMON) { /* Obvious */ if (seen) obvious = TRUE; @@ -6526,9 +6526,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Check race */ - if ((r_ptr->flags1 & (RF1_UNIQUE)) || + if ((r_ptr->flags1 & RF1_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & (RF3_DEMON)))) + (!(r_ptr->flags3 & RF3_DEMON))) { /* No obvious effect */ note = " is unaffected!"; @@ -6597,7 +6597,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* "Unique" monsters cannot be polymorphed */ - if (r_ptr->flags1 & (RF1_UNIQUE)) do_poly = FALSE; + if (r_ptr->flags1 & RF1_UNIQUE) do_poly = FALSE; /* * "Quest" monsters cannot be polymorphed @@ -6760,8 +6760,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Sound and Impact breathers never stun */ else if (do_stun && - !(r_ptr->flags4 & (RF4_BR_SOUN)) && - !(r_ptr->flags4 & (RF4_BR_WALL)) && hurt_monster(m_ptr)) + !(r_ptr->flags4 & RF4_BR_SOUN) && + !(r_ptr->flags4 & RF4_BR_WALL) && hurt_monster(m_ptr)) { /* Obvious */ if (seen) obvious = TRUE; @@ -6784,9 +6784,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Confusion and Chaos breathers (and sleepers) never confuse */ else if (do_conf && - !(r_ptr->flags3 & (RF3_NO_CONF)) && - !(r_ptr->flags4 & (RF4_BR_CONF)) && - !(r_ptr->flags4 & (RF4_BR_CHAO)) && hurt_monster(m_ptr)) + !(r_ptr->flags3 & RF3_NO_CONF) && + !(r_ptr->flags4 & RF4_BR_CONF) && + !(r_ptr->flags4 & RF4_BR_CHAO) && hurt_monster(m_ptr)) { /* Obvious */ if (seen) obvious = TRUE; @@ -8487,7 +8487,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) { auto ref_ptr = m_list[cave[y][x].m_idx].race(); - if ((ref_ptr->flags2 & (RF2_REFLECTING)) && (randint(10) != 1) + if ((ref_ptr->flags2 & RF2_REFLECTING) && (randint(10) != 1) && (dist_hack > 1)) { int t_y, t_x; diff --git a/src/spells2.cc b/src/spells2.cc index 5dfaa074..09374ceb 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -2484,7 +2484,7 @@ bool detect_objects_normal(int rad) bool_ detect_monsters_normal(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (!(r_ptr->flags2 & (RF2_INVISIBLE))) || + return (!(r_ptr->flags2 & RF2_INVISIBLE)) || p_ptr->see_inv || p_ptr->tim_invis; }; @@ -2507,7 +2507,7 @@ bool_ detect_monsters_normal(int rad) bool_ detect_monsters_invis(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (r_ptr->flags2 & (RF2_INVISIBLE)); + return (r_ptr->flags2 & RF2_INVISIBLE); }; if (detect_monsters_fn(rad, predicate)) @@ -3993,7 +3993,7 @@ bool_ genocide_aux(bool_ player_cast, char typ) if (!m_ptr->r_idx) continue; /* Hack -- Skip Unique Monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) continue; + if (r_ptr->flags1 & RF1_UNIQUE) continue; /* Hack -- Skip Quest Monsters */ if (m_ptr->mflag & MFLAG_QUEST) continue; @@ -4119,7 +4119,7 @@ bool_ mass_genocide(bool_ player_cast) if (!m_ptr->r_idx) continue; /* Hack -- Skip unique monsters */ - if (r_ptr->flags1 & (RF1_UNIQUE)) continue; + if (r_ptr->flags1 & RF1_UNIQUE) continue; /* Hack -- Skip Quest Monsters */ if (m_ptr->mflag & MFLAG_QUEST) continue; @@ -4556,8 +4556,8 @@ void earthquake(int cy, int cx, int r) auto const r_ptr = m_ptr->race(); /* Most monsters cannot co-exist with rock */ - if (!(r_ptr->flags2 & (RF2_KILL_WALL)) && - !(r_ptr->flags2 & (RF2_PASS_WALL))) + if (!(r_ptr->flags2 & RF2_KILL_WALL) && + !(r_ptr->flags2 & RF2_PASS_WALL)) { char m_name[80]; @@ -4565,7 +4565,7 @@ void earthquake(int cy, int cx, int r) sn = 0; /* Monster can move to escape the wall */ - if (!(r_ptr->flags1 & (RF1_NEVER_MOVE))) + if (!(r_ptr->flags1 & RF1_NEVER_MOVE)) { /* Look for safety */ for (i = 0; i < 8; i++) @@ -4807,10 +4807,10 @@ static void cave_temp_room_lite(void) update_mon(c_ptr->m_idx, FALSE); /* Stupid monsters rarely wake up */ - if (r_ptr->flags2 & (RF2_STUPID)) chance = 10; + if (r_ptr->flags2 & RF2_STUPID) chance = 10; /* Smart monsters always wake up */ - if (r_ptr->flags2 & (RF2_SMART)) chance = 100; + if (r_ptr->flags2 & RF2_SMART) chance = 100; /* Sometimes monsters wake up */ if (m_ptr->csleep && (rand_int(100) < chance)) diff --git a/src/traps.cc b/src/traps.cc index 7b286434..7911ad2d 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -2823,9 +2823,9 @@ bool_ mon_hit_trap(int m_idx) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || + if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ diff --git a/src/wizard1.cc b/src/wizard1.cc index 616a46cd..9624bcc2 100644 --- a/src/wizard1.cc +++ b/src/wizard1.cc @@ -1370,7 +1370,7 @@ static void spoil_mon_desc(cptr fname) monster_race *r_ptr = &r_info[who_i]; /* Get the "name" */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { sprintf(nam, "[U] %s", r_ptr->name); } @@ -1400,7 +1400,7 @@ static void spoil_mon_desc(cptr fname) sprintf(ac, "%d", r_ptr->ac); /* Hitpoints */ - if ((r_ptr->flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1)) + if ((r_ptr->flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1)) { sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside); } @@ -1503,13 +1503,13 @@ static void spoil_mon_info(cptr fname) magic = FALSE; /* Extract a gender (if applicable) */ - if (flags1 & (RF1_FEMALE)) msex = 2; - else if (flags1 & (RF1_MALE)) msex = 1; + if (flags1 & RF1_FEMALE) msex = 2; + else if (flags1 & RF1_MALE) msex = 1; else msex = 0; /* Prefix */ - if (flags1 & (RF1_UNIQUE)) + if (flags1 & RF1_UNIQUE) { spoil_out("[U] "); } @@ -1558,7 +1558,7 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); /* Hitpoints */ - if ((flags1 & (RF1_FORCE_MAXHP)) || (r_ptr->hside == 1)) + if ((flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1)) { sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside); } @@ -1584,18 +1584,18 @@ static void spoil_mon_info(cptr fname) spoil_out("This"); - if (flags2 & (RF2_ELDRITCH_HORROR)) spoil_out (" sanity-blasting"); - if (flags3 & (RF3_ANIMAL)) spoil_out(" natural"); - if (flags3 & (RF3_EVIL)) spoil_out(" evil"); - if (flags3 & (RF3_GOOD)) spoil_out(" good"); - if (flags3 & (RF3_UNDEAD)) spoil_out(" undead"); - - if (flags3 & (RF3_DRAGON)) spoil_out(" dragon"); - else if (flags3 & (RF3_DEMON)) spoil_out(" demon"); - else if (flags3 & (RF3_GIANT)) spoil_out(" giant"); - else if (flags3 & (RF3_TROLL)) spoil_out(" troll"); - else if (flags3 & (RF3_ORC)) spoil_out(" orc"); - else if (flags3 & (RF3_THUNDERLORD)) spoil_out (" Thunderlord"); + if (flags2 & RF2_ELDRITCH_HORROR) spoil_out (" sanity-blasting"); + if (flags3 & RF3_ANIMAL) spoil_out(" natural"); + if (flags3 & RF3_EVIL) spoil_out(" evil"); + if (flags3 & RF3_GOOD) spoil_out(" good"); + if (flags3 & RF3_UNDEAD) spoil_out(" undead"); + + if (flags3 & RF3_DRAGON) spoil_out(" dragon"); + else if (flags3 & RF3_DEMON) spoil_out(" demon"); + else if (flags3 & RF3_GIANT) spoil_out(" giant"); + else if (flags3 & RF3_TROLL) spoil_out(" troll"); + else if (flags3 & RF3_ORC) spoil_out(" orc"); + else if (flags3 & RF3_THUNDERLORD) spoil_out (" Thunderlord"); else spoil_out(" creature"); spoil_out(" moves"); @@ -1617,52 +1617,52 @@ static void spoil_mon_info(cptr fname) spoil_out(" normally"); } - if (flags1 & (RF1_NEVER_MOVE)) + if (flags1 & RF1_NEVER_MOVE) { spoil_out(", but does not deign to chase intruders"); } spoil_out(". "); - if (!r_ptr->level || (flags1 & (RF1_FORCE_DEPTH))) + if (!r_ptr->level || (flags1 & RF1_FORCE_DEPTH)) { sprintf(buf, "%s is never found out of depth. ", wd_che[msex]); spoil_out(buf); } - if (flags1 & (RF1_FORCE_SLEEP)) + if (flags1 & RF1_FORCE_SLEEP) { sprintf(buf, "%s is always created sluggish. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & (RF2_AURA_FIRE)) + if (flags2 & RF2_AURA_FIRE) { sprintf(buf, "%s is surrounded by flames. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & (RF2_AURA_ELEC)) + if (flags2 & RF2_AURA_ELEC) { sprintf(buf, "%s is surrounded by electricity. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & (RF2_REFLECTING)) + if (flags2 & RF2_REFLECTING) { sprintf(buf, "%s reflects bolt spells. ", wd_che[msex]); spoil_out(buf); } - if (flags1 & (RF1_ESCORT)) + if (flags1 & RF1_ESCORT) { sprintf(buf, "%s usually appears with ", wd_che[msex]); spoil_out(buf); - if (flags1 & (RF1_ESCORTS)) spoil_out("escorts. "); + if (flags1 & RF1_ESCORTS) spoil_out("escorts. "); else spoil_out("an escort. "); } - if ((flags1 & (RF1_FRIEND)) || (flags1 & (RF1_FRIENDS))) + if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS)) { sprintf(buf, "%s usually appears in groups. ", wd_che[msex]); spoil_out(buf); @@ -1670,8 +1670,8 @@ static void spoil_mon_info(cptr fname) /* Collect innate attacks */ vn = 0; - if (flags4 & (RF4_SHRIEK)) vp[vn++] = "shriek for help"; - if (flags4 & (RF4_ROCKET)) vp[vn++] = "shoot a rocket"; + if (flags4 & RF4_SHRIEK) vp[vn++] = "shriek for help"; + if (flags4 & RF4_ROCKET) vp[vn++] = "shoot a rocket"; if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire arrows"; if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows"; if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire missiles"; @@ -1692,28 +1692,28 @@ static void spoil_mon_info(cptr fname) /* Collect breaths */ vn = 0; - if (flags4 & (RF4_BR_ACID)) vp[vn++] = "acid"; - if (flags4 & (RF4_BR_ELEC)) vp[vn++] = "lightning"; - if (flags4 & (RF4_BR_FIRE)) vp[vn++] = "fire"; - if (flags4 & (RF4_BR_COLD)) vp[vn++] = "frost"; - if (flags4 & (RF4_BR_POIS)) vp[vn++] = "poison"; - if (flags4 & (RF4_BR_NETH)) vp[vn++] = "nether"; - if (flags4 & (RF4_BR_LITE)) vp[vn++] = "light"; - if (flags4 & (RF4_BR_DARK)) vp[vn++] = "darkness"; - if (flags4 & (RF4_BR_CONF)) vp[vn++] = "confusion"; - if (flags4 & (RF4_BR_SOUN)) vp[vn++] = "sound"; - if (flags4 & (RF4_BR_CHAO)) vp[vn++] = "chaos"; - if (flags4 & (RF4_BR_DISE)) vp[vn++] = "disenchantment"; - if (flags4 & (RF4_BR_NEXU)) vp[vn++] = "nexus"; - if (flags4 & (RF4_BR_TIME)) vp[vn++] = "time"; - if (flags4 & (RF4_BR_INER)) vp[vn++] = "inertia"; - if (flags4 & (RF4_BR_GRAV)) vp[vn++] = "gravity"; - if (flags4 & (RF4_BR_SHAR)) vp[vn++] = "shards"; - if (flags4 & (RF4_BR_PLAS)) vp[vn++] = "plasma"; - if (flags4 & (RF4_BR_WALL)) vp[vn++] = "force"; - if (flags4 & (RF4_BR_MANA)) vp[vn++] = "mana"; - if (flags4 & (RF4_BR_NUKE)) vp[vn++] = "toxic waste"; - if (flags4 & (RF4_BR_DISI)) vp[vn++] = "disintegration"; + if (flags4 & RF4_BR_ACID) vp[vn++] = "acid"; + if (flags4 & RF4_BR_ELEC) vp[vn++] = "lightning"; + if (flags4 & RF4_BR_FIRE) vp[vn++] = "fire"; + if (flags4 & RF4_BR_COLD) vp[vn++] = "frost"; + if (flags4 & RF4_BR_POIS) vp[vn++] = "poison"; + if (flags4 & RF4_BR_NETH) vp[vn++] = "nether"; + if (flags4 & RF4_BR_LITE) vp[vn++] = "light"; + if (flags4 & RF4_BR_DARK) vp[vn++] = "darkness"; + if (flags4 & RF4_BR_CONF) vp[vn++] = "confusion"; + if (flags4 & RF4_BR_SOUN) vp[vn++] = "sound"; + if (flags4 & RF4_BR_CHAO) vp[vn++] = "chaos"; + if (flags4 & RF4_BR_DISE) vp[vn++] = "disenchantment"; + if (flags4 & RF4_BR_NEXU) vp[vn++] = "nexus"; + if (flags4 & RF4_BR_TIME) vp[vn++] = "time"; + if (flags4 & RF4_BR_INER) vp[vn++] = "inertia"; + if (flags4 & RF4_BR_GRAV) vp[vn++] = "gravity"; + if (flags4 & RF4_BR_SHAR) vp[vn++] = "shards"; + if (flags4 & RF4_BR_PLAS) vp[vn++] = "plasma"; + if (flags4 & RF4_BR_WALL) vp[vn++] = "force"; + if (flags4 & RF4_BR_MANA) vp[vn++] = "mana"; + if (flags4 & RF4_BR_NUKE) vp[vn++] = "toxic waste"; + if (flags4 & RF4_BR_DISI) vp[vn++] = "disintegration"; if (vn) { @@ -1726,78 +1726,78 @@ static void spoil_mon_info(cptr fname) else spoil_out(" or "); spoil_out(vp[i]); } - if (flags2 & (RF2_POWERFUL)) spoil_out(" powerfully"); + if (flags2 & RF2_POWERFUL) spoil_out(" powerfully"); } /* Collect spells */ vn = 0; - if (flags5 & (RF5_BA_ACID)) vp[vn++] = "produce acid balls"; - if (flags5 & (RF5_BA_ELEC)) vp[vn++] = "produce lightning balls"; - if (flags5 & (RF5_BA_FIRE)) vp[vn++] = "produce fire balls"; - if (flags5 & (RF5_BA_COLD)) vp[vn++] = "produce frost balls"; - if (flags5 & (RF5_BA_POIS)) vp[vn++] = "produce poison balls"; - if (flags5 & (RF5_BA_NETH)) vp[vn++] = "produce nether balls"; - if (flags5 & (RF5_BA_WATE)) vp[vn++] = "produce water balls"; - if (flags4 & (RF4_BA_NUKE)) vp[vn++] = "produce balls of radiation"; - if (flags5 & (RF5_BA_MANA)) vp[vn++] = "produce mana storms"; - if (flags5 & (RF5_BA_DARK)) vp[vn++] = "produce darkness storms"; - if (flags4 & (RF4_BA_CHAO)) vp[vn++] = "invoke raw Chaos"; - if (flags6 & (RF6_HAND_DOOM)) vp[vn++] = "invoke the Hand of Doom"; - if (flags5 & (RF5_DRAIN_MANA)) vp[vn++] = "drain mana"; - if (flags5 & (RF5_MIND_BLAST)) vp[vn++] = "cause mind blasting"; - if (flags5 & (RF5_BRAIN_SMASH)) vp[vn++] = "cause brain smashing"; + if (flags5 & RF5_BA_ACID) vp[vn++] = "produce acid balls"; + if (flags5 & RF5_BA_ELEC) vp[vn++] = "produce lightning balls"; + if (flags5 & RF5_BA_FIRE) vp[vn++] = "produce fire balls"; + if (flags5 & RF5_BA_COLD) vp[vn++] = "produce frost balls"; + if (flags5 & RF5_BA_POIS) vp[vn++] = "produce poison balls"; + if (flags5 & RF5_BA_NETH) vp[vn++] = "produce nether balls"; + if (flags5 & RF5_BA_WATE) vp[vn++] = "produce water balls"; + if (flags4 & RF4_BA_NUKE) vp[vn++] = "produce balls of radiation"; + if (flags5 & RF5_BA_MANA) vp[vn++] = "produce mana storms"; + if (flags5 & RF5_BA_DARK) vp[vn++] = "produce darkness storms"; + if (flags4 & RF4_BA_CHAO) vp[vn++] = "invoke raw Chaos"; + if (flags6 & RF6_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; + if (flags5 & RF5_DRAIN_MANA) vp[vn++] = "drain mana"; + if (flags5 & RF5_MIND_BLAST) vp[vn++] = "cause mind blasting"; + if (flags5 & RF5_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (flags5 & (RF5_BO_ACID)) vp[vn++] = "produce acid bolts"; - if (flags5 & (RF5_BO_ELEC)) vp[vn++] = "produce lightning bolts"; - if (flags5 & (RF5_BO_FIRE)) vp[vn++] = "produce fire bolts"; - if (flags5 & (RF5_BO_COLD)) vp[vn++] = "produce frost bolts"; - if (flags5 & (RF5_BO_POIS)) vp[vn++] = "produce poison bolts"; - if (flags5 & (RF5_BO_NETH)) vp[vn++] = "produce nether bolts"; - if (flags5 & (RF5_BO_WATE)) vp[vn++] = "produce water bolts"; - if (flags5 & (RF5_BO_MANA)) vp[vn++] = "produce mana bolts"; - if (flags5 & (RF5_BO_PLAS)) vp[vn++] = "produce plasma bolts"; - if (flags5 & (RF5_BO_ICEE)) vp[vn++] = "produce ice bolts"; - if (flags5 & (RF5_MISSILE)) vp[vn++] = "produce magic missiles"; - if (flags5 & (RF5_SCARE)) vp[vn++] = "terrify"; - if (flags5 & (RF5_BLIND)) vp[vn++] = "blind"; - if (flags5 & (RF5_CONF)) vp[vn++] = "confuse"; - if (flags5 & (RF5_SLOW)) vp[vn++] = "slow"; - if (flags5 & (RF5_HOLD)) vp[vn++] = "paralyse"; - if (flags6 & (RF6_HASTE)) vp[vn++] = "haste-self"; - if (flags6 & (RF6_HEAL)) vp[vn++] = "heal-self"; - if (flags6 & (RF6_BLINK)) vp[vn++] = "blink-self"; - if (flags6 & (RF6_TPORT)) vp[vn++] = "teleport-self"; - if (flags6 & (RF6_S_BUG)) vp[vn++] = "summon software bugs"; - if (flags6 & (RF6_S_RNG)) vp[vn++] = "summon RNGs"; - if (flags6 & (RF6_TELE_TO)) vp[vn++] = "teleport to"; - if (flags6 & (RF6_TELE_AWAY)) vp[vn++] = "teleport away"; - if (flags6 & (RF6_TELE_LEVEL)) vp[vn++] = "teleport level"; - if (flags6 & (RF6_DARKNESS)) vp[vn++] = "create darkness"; - if (flags6 & (RF6_TRAPS)) vp[vn++] = "create traps"; - if (flags6 & (RF6_FORGET)) vp[vn++] = "cause amnesia"; - if (flags6 & (RF6_RAISE_DEAD)) vp[vn++] = "raise dead"; - if (flags6 & (RF6_S_THUNDERLORD)) vp[vn++] = "summon a thunderlord"; - if (flags6 & (RF6_S_MONSTER)) vp[vn++] = "summon a monster"; - if (flags6 & (RF6_S_MONSTERS)) vp[vn++] = "summon monsters"; - if (flags6 & (RF6_S_KIN)) vp[vn++] = "summon aid"; - if (flags6 & (RF6_S_ANT)) vp[vn++] = "summon ants"; - if (flags6 & (RF6_S_SPIDER)) vp[vn++] = "summon spiders"; - if (flags6 & (RF6_S_HOUND)) vp[vn++] = "summon hounds"; - if (flags6 & (RF6_S_HYDRA)) vp[vn++] = "summon hydras"; - if (flags6 & (RF6_S_ANGEL)) vp[vn++] = "summon an angel"; - if (flags6 & (RF6_S_DEMON)) vp[vn++] = "summon a demon"; - if (flags6 & (RF6_S_UNDEAD)) vp[vn++] = "summon an undead"; - if (flags6 & (RF6_S_DRAGON)) vp[vn++] = "summon a dragon"; - if (flags4 & (RF4_S_ANIMAL)) vp[vn++] = "summon animal"; - if (flags6 & (RF6_S_ANIMALS)) vp[vn++] = "summon animals"; - if (flags6 & (RF6_S_HI_UNDEAD)) vp[vn++] = "summon greater undead"; - if (flags6 & (RF6_S_HI_DRAGON)) vp[vn++] = "summon ancient dragons"; - if (flags6 & (RF6_S_HI_DEMON)) vp[vn++] = "summon greater demons"; - if (flags6 & (RF6_S_WRAITH)) vp[vn++] = "summon Ringwraith"; - if (flags6 & (RF6_S_UNIQUE)) vp[vn++] = "summon unique monsters"; + if (flags5 & RF5_BO_ACID) vp[vn++] = "produce acid bolts"; + if (flags5 & RF5_BO_ELEC) vp[vn++] = "produce lightning bolts"; + if (flags5 & RF5_BO_FIRE) vp[vn++] = "produce fire bolts"; + if (flags5 & RF5_BO_COLD) vp[vn++] = "produce frost bolts"; + if (flags5 & RF5_BO_POIS) vp[vn++] = "produce poison bolts"; + if (flags5 & RF5_BO_NETH) vp[vn++] = "produce nether bolts"; + if (flags5 & RF5_BO_WATE) vp[vn++] = "produce water bolts"; + if (flags5 & RF5_BO_MANA) vp[vn++] = "produce mana bolts"; + if (flags5 & RF5_BO_PLAS) vp[vn++] = "produce plasma bolts"; + if (flags5 & RF5_BO_ICEE) vp[vn++] = "produce ice bolts"; + if (flags5 & RF5_MISSILE) vp[vn++] = "produce magic missiles"; + if (flags5 & RF5_SCARE) vp[vn++] = "terrify"; + if (flags5 & RF5_BLIND) vp[vn++] = "blind"; + if (flags5 & RF5_CONF) vp[vn++] = "confuse"; + if (flags5 & RF5_SLOW) vp[vn++] = "slow"; + if (flags5 & RF5_HOLD) vp[vn++] = "paralyse"; + if (flags6 & RF6_HASTE) vp[vn++] = "haste-self"; + if (flags6 & RF6_HEAL) vp[vn++] = "heal-self"; + if (flags6 & RF6_BLINK) vp[vn++] = "blink-self"; + if (flags6 & RF6_TPORT) vp[vn++] = "teleport-self"; + if (flags6 & RF6_S_BUG) vp[vn++] = "summon software bugs"; + if (flags6 & RF6_S_RNG) vp[vn++] = "summon RNGs"; + if (flags6 & RF6_TELE_TO) vp[vn++] = "teleport to"; + if (flags6 & RF6_TELE_AWAY) vp[vn++] = "teleport away"; + if (flags6 & RF6_TELE_LEVEL) vp[vn++] = "teleport level"; + if (flags6 & RF6_DARKNESS) vp[vn++] = "create darkness"; + if (flags6 & RF6_TRAPS) vp[vn++] = "create traps"; + if (flags6 & RF6_FORGET) vp[vn++] = "cause amnesia"; + if (flags6 & RF6_RAISE_DEAD) vp[vn++] = "raise dead"; + if (flags6 & RF6_S_THUNDERLORD) vp[vn++] = "summon a thunderlord"; + if (flags6 & RF6_S_MONSTER) vp[vn++] = "summon a monster"; + if (flags6 & RF6_S_MONSTERS) vp[vn++] = "summon monsters"; + if (flags6 & RF6_S_KIN) vp[vn++] = "summon aid"; + if (flags6 & RF6_S_ANT) vp[vn++] = "summon ants"; + if (flags6 & RF6_S_SPIDER) vp[vn++] = "summon spiders"; + if (flags6 & RF6_S_HOUND) vp[vn++] = "summon hounds"; + if (flags6 & RF6_S_HYDRA) vp[vn++] = "summon hydras"; + if (flags6 & RF6_S_ANGEL) vp[vn++] = "summon an angel"; + if (flags6 & RF6_S_DEMON) vp[vn++] = "summon a demon"; + if (flags6 & RF6_S_UNDEAD) vp[vn++] = "summon an undead"; + if (flags6 & RF6_S_DRAGON) vp[vn++] = "summon a dragon"; + if (flags4 & RF4_S_ANIMAL) vp[vn++] = "summon animal"; + if (flags6 & RF6_S_ANIMALS) vp[vn++] = "summon animals"; + if (flags6 & RF6_S_HI_UNDEAD) vp[vn++] = "summon greater undead"; + if (flags6 & RF6_S_HI_DRAGON) vp[vn++] = "summon ancient dragons"; + if (flags6 & RF6_S_HI_DEMON) vp[vn++] = "summon greater demons"; + if (flags6 & RF6_S_WRAITH) vp[vn++] = "summon Ringwraith"; + if (flags6 & RF6_S_UNIQUE) vp[vn++] = "summon unique monsters"; if (vn) { @@ -1813,7 +1813,7 @@ static void spoil_mon_info(cptr fname) } spoil_out(" magical, casting spells"); - if (flags2 & (RF2_SMART)) spoil_out(" intelligently"); + if (flags2 & RF2_SMART) spoil_out(" intelligently"); for (i = 0; i < vn; i++) { @@ -1834,15 +1834,15 @@ static void spoil_mon_info(cptr fname) /* Collect special abilities. */ vn = 0; - if (flags2 & (RF2_OPEN_DOOR)) vp[vn++] = "open doors"; - if (flags2 & (RF2_BASH_DOOR)) vp[vn++] = "bash down doors"; - if (flags2 & (RF2_PASS_WALL)) vp[vn++] = "pass through walls"; - if (flags2 & (RF2_KILL_WALL)) vp[vn++] = "bore through walls"; - if (flags2 & (RF2_MOVE_BODY)) vp[vn++] = "push past weaker monsters"; - if (flags2 & (RF2_KILL_BODY)) vp[vn++] = "destroy weaker monsters"; - if (flags2 & (RF2_TAKE_ITEM)) vp[vn++] = "pick up objects"; - if (flags2 & (RF2_KILL_ITEM)) vp[vn++] = "destroy objects"; - if (flags9 & (RF9_HAS_LITE)) vp[vn++] = "illuminate the dungeon"; + if (flags2 & RF2_OPEN_DOOR) vp[vn++] = "open doors"; + if (flags2 & RF2_BASH_DOOR) vp[vn++] = "bash down doors"; + if (flags2 & RF2_PASS_WALL) vp[vn++] = "pass through walls"; + if (flags2 & RF2_KILL_WALL) vp[vn++] = "bore through walls"; + if (flags2 & RF2_MOVE_BODY) vp[vn++] = "push past weaker monsters"; + if (flags2 & RF2_KILL_BODY) vp[vn++] = "destroy weaker monsters"; + if (flags2 & RF2_TAKE_ITEM) vp[vn++] = "pick up objects"; + if (flags2 & RF2_KILL_ITEM) vp[vn++] = "destroy objects"; + if (flags9 & RF9_HAS_LITE) vp[vn++] = "illuminate the dungeon"; if (vn) { @@ -1857,32 +1857,32 @@ static void spoil_mon_info(cptr fname) spoil_out(". "); } - if (flags2 & (RF2_INVISIBLE)) + if (flags2 & RF2_INVISIBLE) { spoil_out(wd_che[msex]); spoil_out(" is invisible. "); } - if (flags2 & (RF2_COLD_BLOOD)) + if (flags2 & RF2_COLD_BLOOD) { spoil_out(wd_che[msex]); spoil_out(" is cold blooded. "); } - if (flags2 & (RF2_EMPTY_MIND)) + if (flags2 & RF2_EMPTY_MIND) { spoil_out(wd_che[msex]); spoil_out(" is not detected by telepathy. "); } - if (flags2 & (RF2_WEIRD_MIND)) + if (flags2 & RF2_WEIRD_MIND) { spoil_out(wd_che[msex]); spoil_out(" is rarely detected by telepathy. "); } - if (flags4 & (RF4_MULTIPLY)) + if (flags4 & RF4_MULTIPLY) { spoil_out(wd_che[msex]); spoil_out(" breeds explosively. "); } - if (flags2 & (RF2_REGENERATE)) + if (flags2 & RF2_REGENERATE) { spoil_out(wd_che[msex]); spoil_out(" regenerates quickly. "); @@ -1890,10 +1890,10 @@ static void spoil_mon_info(cptr fname) /* Collect susceptibilities */ vn = 0; - if (flags3 & (RF3_HURT_ROCK)) vp[vn++] = "rock remover"; - if (flags3 & (RF3_HURT_LITE)) vp[vn++] = "bright light"; - if (flags3 & (RF3_SUSCEP_FIRE)) vp[vn++] = "fire"; - if (flags3 & (RF3_SUSCEP_COLD)) vp[vn++] = "cold"; + if (flags3 & RF3_HURT_ROCK) vp[vn++] = "rock remover"; + if (flags3 & RF3_HURT_LITE) vp[vn++] = "bright light"; + if (flags3 & RF3_SUSCEP_FIRE) vp[vn++] = "fire"; + if (flags3 & RF3_SUSCEP_COLD) vp[vn++] = "cold"; if (vn) { @@ -1910,11 +1910,11 @@ static void spoil_mon_info(cptr fname) /* Collect immunities */ vn = 0; - if (flags3 & (RF3_IM_ACID)) vp[vn++] = "acid"; - if (flags3 & (RF3_IM_ELEC)) vp[vn++] = "lightning"; - if (flags3 & (RF3_IM_FIRE)) vp[vn++] = "fire"; - if (flags3 & (RF3_IM_COLD)) vp[vn++] = "cold"; - if (flags3 & (RF3_IM_POIS)) vp[vn++] = "poison"; + if (flags3 & RF3_IM_ACID) vp[vn++] = "acid"; + if (flags3 & RF3_IM_ELEC) vp[vn++] = "lightning"; + if (flags3 & RF3_IM_FIRE) vp[vn++] = "fire"; + if (flags3 & RF3_IM_COLD) vp[vn++] = "cold"; + if (flags3 & RF3_IM_POIS) vp[vn++] = "poison"; if (vn) { @@ -1931,12 +1931,12 @@ static void spoil_mon_info(cptr fname) /* Collect resistances */ vn = 0; - if (flags3 & (RF3_RES_NETH)) vp[vn++] = "nether"; - if (flags3 & (RF3_RES_WATE)) vp[vn++] = "water"; - if (flags3 & (RF3_RES_PLAS)) vp[vn++] = "plasma"; - if (flags3 & (RF3_RES_NEXU)) vp[vn++] = "nexus"; - if (flags3 & (RF3_RES_DISE)) vp[vn++] = "disenchantment"; - if (flags3 & (RF3_RES_TELE)) vp[vn++] = "teleportation"; + if (flags3 & RF3_RES_NETH) vp[vn++] = "nether"; + if (flags3 & RF3_RES_WATE) vp[vn++] = "water"; + if (flags3 & RF3_RES_PLAS) vp[vn++] = "plasma"; + if (flags3 & RF3_RES_NEXU) vp[vn++] = "nexus"; + if (flags3 & RF3_RES_DISE) vp[vn++] = "disenchantment"; + if (flags3 & RF3_RES_TELE) vp[vn++] = "teleportation"; if (vn) { @@ -1953,10 +1953,10 @@ static void spoil_mon_info(cptr fname) /* Collect non-effects */ vn = 0; - if (flags3 & (RF3_NO_STUN)) vp[vn++] = "stunned"; - if (flags3 & (RF3_NO_FEAR)) vp[vn++] = "frightened"; - if (flags3 & (RF3_NO_CONF)) vp[vn++] = "confused"; - if (flags3 & (RF3_NO_SLEEP)) vp[vn++] = "slept"; + if (flags3 & RF3_NO_STUN) vp[vn++] = "stunned"; + if (flags3 & RF3_NO_FEAR) vp[vn++] = "frightened"; + if (flags3 & RF3_NO_CONF) vp[vn++] = "confused"; + if (flags3 & RF3_NO_SLEEP) vp[vn++] = "slept"; if (vn) { @@ -2018,24 +2018,24 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); } - if (flags1 & (RF1_DROP_GREAT)) + if (flags1 & RF1_DROP_GREAT) { if (sin) spoil_out("n"); spoil_out(" exceptional object"); } - else if (flags1 & (RF1_DROP_GOOD)) + else if (flags1 & RF1_DROP_GOOD) { spoil_out(" good object"); } - else if (flags1 & (RF1_DROP_USEFUL)) + else if (flags1 & RF1_DROP_USEFUL) { spoil_out(" useful object"); } - else if (flags1 & (RF1_ONLY_ITEM)) + else if (flags1 & RF1_ONLY_ITEM) { spoil_out(" object"); } - else if (flags1 & (RF1_ONLY_GOLD)) + else if (flags1 & RF1_ONLY_GOLD) { spoil_out(" treasure"); } @@ -2048,7 +2048,7 @@ static void spoil_mon_info(cptr fname) } if (i > 1) spoil_out("s"); - if (flags1 & (RF1_DROP_CHOSEN)) + if (flags1 & RF1_DROP_CHOSEN) { spoil_out(", in addition to chosen objects"); } @@ -2295,7 +2295,7 @@ static void spoil_mon_info(cptr fname) { spoil_out(". "); } - else if (flags1 & (RF1_NEVER_BLOW)) + else if (flags1 & RF1_NEVER_BLOW) { sprintf(buf, "%s has no physical attacks. ", wd_che[msex]); spoil_out(buf); diff --git a/src/xtra2.cc b/src/xtra2.cc index 52e0fc7b..4f853928 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2671,7 +2671,7 @@ void monster_death(int m_idx) } /* Mega-Hack -- drop "winner" treasures */ - else if (r_ptr->flags1 & (RF1_DROP_CHOSEN)) + else if (r_ptr->flags1 & RF1_DROP_CHOSEN) { if (strstr(r_ptr->name, "Morgoth, Lord of Darkness")) { @@ -3074,7 +3074,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) while (--curses); } - if (r_ptr->flags2 & (RF2_CAN_SPEAK)) + if (r_ptr->flags2 & RF2_CAN_SPEAK) { char line_got[80]; /* Dump a message */ @@ -3100,10 +3100,10 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Death by Physical attack -- non-living monster */ - else if ((r_ptr->flags3 & (RF3_DEMON)) || - (r_ptr->flags3 & (RF3_UNDEAD)) || - (r_ptr->flags2 & (RF2_STUPID)) || - (r_ptr->flags3 & (RF3_NONLIVING)) || + else if ((r_ptr->flags3 & RF3_DEMON) || + (r_ptr->flags3 & RF3_UNDEAD) || + (r_ptr->flags2 & RF2_STUPID) || + (r_ptr->flags3 & RF3_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { cmsg_format(TERM_L_RED, "You have destroyed %s.", m_name); @@ -3164,7 +3164,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* When the player kills a Unique, it stays dead */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { r_ptr->max_num = 0; } @@ -3237,7 +3237,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) * XXX XXX XXX Mega-Hack -- Remove random quest rendered * impossible */ - if (r_ptr->flags1 & (RF1_UNIQUE)) + if (r_ptr->flags1 & RF1_UNIQUE) { int i; @@ -3276,7 +3276,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Recall even invisible uniques or winners */ - if (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE))) + if (m_ptr->ml || (r_ptr->flags1 & RF1_UNIQUE)) { /* Count kills this life */ if (r_ptr->r_pkills < MAX_SHORT) r_ptr->r_pkills++; @@ -3620,9 +3620,9 @@ static cptr look_mon_desc(int m_idx) /* Determine if the monster is "living" (vs "undead") */ monster_type *m_ptr = &m_list[m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags3 & (RF3_UNDEAD)) living = FALSE; - if (r_ptr->flags3 & (RF3_DEMON)) living = FALSE; - if (r_ptr->flags3 & (RF3_NONLIVING)) living = FALSE; + if (r_ptr->flags3 & RF3_UNDEAD) living = FALSE; + if (r_ptr->flags3 & RF3_DEMON) living = FALSE; + if (r_ptr->flags3 & RF3_NONLIVING) living = FALSE; if (strchr("Egv", r_ptr->d_char)) living = FALSE; @@ -4137,8 +4137,8 @@ static int target_set_aux(int y, int x, int mode, cptr info) s1 = "It is "; /* Hack -- take account of gender */ - if (r_ptr->flags1 & (RF1_FEMALE)) s1 = "She is "; - else if (r_ptr->flags1 & (RF1_MALE)) s1 = "He is "; + if (r_ptr->flags1 & RF1_FEMALE) s1 = "She is "; + else if (r_ptr->flags1 & RF1_MALE) s1 = "He is "; /* Use a preposition */ s2 = "carrying "; -- cgit v1.2.3 From db149f696b2c063df0e5b5bdd66dc0931760b3ec Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Add negation operator to flag_set<> --- src/flag_set.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/flag_set.hpp b/src/flag_set.hpp index cbc4e7aa..2e5d46ea 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -119,6 +119,16 @@ public: return f; } + constexpr flag_set operator ~ () const + { + flag_set f; + for (std::size_t i = 0; i < tiers; i++) + { + f.m_data[i] = ~m_data[i]; + } + return f; + } + }; // Implementation details, because preprocessor. -- cgit v1.2.3 From ca8819a0307ab785766b3b4a5e2031b6db33ed1c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change monster_race to non-POD struct --- src/init2.cc | 2 +- src/monster_race.hpp | 82 +++++++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index b921ddc9..9c643257 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -404,7 +404,7 @@ namespace { static void allocate() { - r_info = make_array(max_r_idx); + r_info = new monster_race[max_r_idx]; } static errr parse(FILE *fp) diff --git a/src/monster_race.hpp b/src/monster_race.hpp index ad44aef0..1cb2742a 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -26,66 +26,70 @@ */ struct monster_race { - const char *name; /* Name */ - char *text; /* Text */ + const char *name = nullptr; /* Name */ + char *text = nullptr; /* Text */ - u16b hdice; /* Creatures hit dice count */ - u16b hside; /* Creatures hit dice sides */ + u16b hdice = 0; /* Creatures hit dice count */ + u16b hside = 0; /* Creatures hit dice sides */ - s16b ac; /* Armour Class */ + s16b ac = 0; /* Armour Class */ - s16b sleep; /* Inactive counter (base) */ - byte aaf; /* Area affect radius (1-100) */ - byte speed; /* Speed (normally 110) */ + s16b sleep = 0; /* Inactive counter (base) */ + byte aaf = 0; /* Area affect radius (1-100) */ + byte speed = 0; /* Speed (normally 110) */ - s32b mexp; /* Exp value for kill */ + s32b mexp = 0; /* Exp value for kill */ - s32b weight; /* Weight of the monster */ + s32b weight = 0; /* Weight of the monster */ - byte freq_inate; /* Inate spell frequency */ - byte freq_spell; /* Other spell frequency */ + byte freq_inate = 0; /* Inate spell frequency */ + byte freq_spell = 0; /* Other spell frequency */ - u32b flags1; /* Flags 1 (general) */ - u32b flags2; /* Flags 2 (abilities) */ - u32b flags3; /* Flags 3 (race/resist) */ - u32b flags4; /* Flags 4 (inate/breath) */ - u32b flags5; /* Flags 5 (normal spells) */ - u32b flags6; /* Flags 6 (special spells) */ - u32b flags7; /* Flags 7 (movement related abilities) */ - u32b flags8; /* Flags 8 (wilderness info) */ - u32b flags9; /* Flags 9 (drops info) */ + u32b flags1 = 0; /* Flags 1 (general) */ + u32b flags2 = 0; /* Flags 2 (abilities) */ + u32b flags3 = 0; /* Flags 3 (race/resist) */ + u32b flags4 = 0; /* Flags 4 (inate/breath) */ + u32b flags5 = 0; /* Flags 5 (normal spells) */ + u32b flags6 = 0; /* Flags 6 (special spells) */ + u32b flags7 = 0; /* Flags 7 (movement related abilities) */ + u32b flags8 = 0; /* Flags 8 (wilderness info) */ + u32b flags9 = 0; /* Flags 9 (drops info) */ - monster_blow blow[4]; /* Up to four blows per round */ - byte body_parts[BODY_MAX]; /* To help to decide what to use when body changing */ + monster_blow blow[4] = { /* Up to four blows per round */ + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + }; - byte artifact_idx; /* Artifact index of standard artifact dropped; 0 if none. */ - int artifact_chance; /* Percentage chance of dropping the artifact. */ + byte body_parts[BODY_MAX] = { 0 }; /* To help to decide what to use when body changing */ - byte level; /* Level of creature */ - byte rarity; /* Rarity of creature */ + byte artifact_idx = 0; /* Artifact index of standard artifact dropped; 0 if none. */ + int artifact_chance = 0; /* Percentage chance of dropping the artifact. */ + byte level = 0; /* Level of creature */ + byte rarity = 0; /* Rarity of creature */ - byte d_attr; /* Default monster attribute */ - char d_char; /* Default monster character */ + byte d_attr = 0; /* Default monster attribute */ + char d_char = 0; /* Default monster character */ - byte x_attr; /* Desired monster attribute */ - char x_char; /* Desired monster character */ + byte x_attr = 0; /* Desired monster attribute */ + char x_char = 0; /* Desired monster character */ + s16b max_num = 0; /* Maximum population allowed per level */ + byte cur_num = 0; /* Monster population on current level */ - s16b max_num; /* Maximum population allowed per level */ + s16b r_pkills = 0; /* Count monsters killed in this life */ - byte cur_num; /* Monster population on current level */ + bool_ on_saved = 0; /* Is the (unique) on a saved level ? */ + byte total_visible = 0; /* Amount of this race that are visible */ - s16b r_pkills; /* Count monsters killed in this life */ + obj_theme drops = obj_theme /* The drops type */ + { 0, 0, 0, 0 }; - bool_ on_saved; /* Is the (unique) on a saved level ? */ - - byte total_visible; /* Amount of this race that are visible */ - - obj_theme drops; /* The drops type */ }; -- cgit v1.2.3 From 4d68cfb67dbd5e3c343fe21f118d9dbb21a18c61 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change monster_ego to non-POD struct --- src/init2.cc | 2 +- src/monster_ego.hpp | 123 ++++++++++++++++++++++++++++------------------------ 2 files changed, 67 insertions(+), 58 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 9c643257..1f6a1907 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -420,7 +420,7 @@ namespace { static void allocate() { - re_info = make_array(max_re_idx); + re_info = new monster_ego[max_re_idx]; } static errr parse(FILE *fp) diff --git a/src/monster_ego.hpp b/src/monster_ego.hpp index 00464c2e..873c642f 100644 --- a/src/monster_ego.hpp +++ b/src/monster_ego.hpp @@ -8,74 +8,83 @@ */ struct monster_ego { - const char *name; /* Name */ - bool_ before; /* Display ego before or after */ + const char *name = nullptr; /* Name */ + bool_ before = false; /* Display ego before or after */ - monster_blow blow[4]; /* Up to four blows per round */ - byte blowm[4][2]; + monster_blow blow[4] = { /* Up to four blows per round */ + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0 }, + }; + byte blowm[4][2] = { + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 } + }; - s16b hdice; /* Creatures hit dice count */ - s16b hside; /* Creatures hit dice sides */ + s16b hdice = 0; /* Creatures hit dice count */ + s16b hside = 0; /* Creatures hit dice sides */ - s16b ac; /* Armour Class */ + s16b ac = 0; /* Armour Class */ - s16b sleep; /* Inactive counter (base) */ - s16b aaf; /* Area affect radius (1-100) */ - s16b speed; /* Speed (normally 110) */ + s16b sleep = 0; /* Inactive counter (base) */ + s16b aaf = 0; /* Area affect radius (1-100) */ + s16b speed = 0; /* Speed (normally 110) */ - s32b mexp; /* Exp value for kill */ + s32b mexp = 0; /* Exp value for kill */ - s32b weight; /* Weight of the monster */ + s32b weight = 0; /* Weight of the monster */ - byte freq_inate; /* Inate spell frequency */ - byte freq_spell; /* Other spell frequency */ + byte freq_inate = 0; /* Inate spell frequency */ + byte freq_spell = 0; /* Other spell frequency */ /* Ego flags */ - u32b flags1; /* Flags 1 */ - u32b flags2; /* Flags 1 */ - u32b flags3; /* Flags 1 */ - u32b flags7; /* Flags 1 */ - u32b flags8; /* Flags 1 */ - u32b flags9; /* Flags 1 */ - u32b hflags1; /* Flags 1 */ - u32b hflags2; /* Flags 1 */ - u32b hflags3; /* Flags 1 */ - u32b hflags7; /* Flags 1 */ - u32b hflags8; /* Flags 1 */ - u32b hflags9; /* Flags 1 */ + u32b flags1 = 0; + u32b flags2 = 0; + u32b flags3 = 0; + u32b flags7 = 0; + u32b flags8 = 0; + u32b flags9 = 0; + u32b hflags1 = 0; + u32b hflags2 = 0; + u32b hflags3 = 0; + u32b hflags7 = 0; + u32b hflags8 = 0; + u32b hflags9 = 0; /* Monster flags */ - u32b mflags1; /* Flags 1 (general) */ - u32b mflags2; /* Flags 2 (abilities) */ - u32b mflags3; /* Flags 3 (race/resist) */ - u32b mflags4; /* Flags 4 (inate/breath) */ - u32b mflags5; /* Flags 5 (normal spells) */ - u32b mflags6; /* Flags 6 (special spells) */ - u32b mflags7; /* Flags 7 (movement related abilities) */ - u32b mflags8; /* Flags 8 (wilderness info) */ - u32b mflags9; /* Flags 9 (drops info) */ + u32b mflags1 = 0; + u32b mflags2 = 0; + u32b mflags3 = 0; + u32b mflags4 = 0; + u32b mflags5 = 0; + u32b mflags6 = 0; + u32b mflags7 = 0; + u32b mflags8 = 0; + u32b mflags9 = 0; /* Negative Flags, to be removed from the monster flags */ - u32b nflags1; /* Flags 1 (general) */ - u32b nflags2; /* Flags 2 (abilities) */ - u32b nflags3; /* Flags 3 (race/resist) */ - u32b nflags4; /* Flags 4 (inate/breath) */ - u32b nflags5; /* Flags 5 (normal spells) */ - u32b nflags6; /* Flags 6 (special spells) */ - u32b nflags7; /* Flags 7 (movement related abilities) */ - u32b nflags8; /* Flags 8 (wilderness info) */ - u32b nflags9; /* Flags 9 (drops info) */ - - s16b level; /* Level of creature */ - s16b rarity; /* Rarity of creature */ - - - byte d_attr; /* Default monster attribute */ - char d_char; /* Default monster character */ - - byte g_attr; /* Overlay graphic attribute */ - char g_char; /* Overlay graphic character */ - - char r_char[5]; /* Monster race allowed */ - char nr_char[5]; /* Monster race not allowed */ + u32b nflags1 = 0; + u32b nflags2 = 0; + u32b nflags3 = 0; + u32b nflags4 = 0; + u32b nflags5 = 0; + u32b nflags6 = 0; + u32b nflags7 = 0; + u32b nflags8 = 0; + u32b nflags9 = 0; + + s16b level = 0; /* Level of creature */ + s16b rarity = 0; /* Rarity of creature */ + + byte d_attr = 0; /* Default monster attribute */ + char d_char = '\0'; /* Default monster character */ + + byte g_attr = 0; /* Overlay graphic attribute */ + char g_char = '\0'; /* Overlay graphic character */ + + char r_char[5] = { '\0' }; /* Monster race allowed */ + char nr_char[5] = { '\0' }; /* Monster race not allowed */ }; -- cgit v1.2.3 From f693888666c64c75a636be3504e6decb55f2865b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Give monster_blow default values --- src/monster_blow.hpp | 8 ++++---- src/monster_ego.hpp | 9 +++------ src/monster_race.hpp | 10 +++------- src/monster_type.hpp | 8 ++------ 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/monster_blow.hpp b/src/monster_blow.hpp index 0f19f64c..6e0ee6e5 100644 --- a/src/monster_blow.hpp +++ b/src/monster_blow.hpp @@ -12,8 +12,8 @@ */ struct monster_blow { - byte method; - byte effect; - byte d_dice; - byte d_side; + byte method = 0; + byte effect = 0; + byte d_dice = 0; + byte d_side = 0; }; diff --git a/src/monster_ego.hpp b/src/monster_ego.hpp index 873c642f..1154c537 100644 --- a/src/monster_ego.hpp +++ b/src/monster_ego.hpp @@ -3,6 +3,8 @@ #include "h-basic.h" #include "monster_blow.hpp" +#include + /** * Monster ego descriptors. */ @@ -11,12 +13,7 @@ struct monster_ego const char *name = nullptr; /* Name */ bool_ before = false; /* Display ego before or after */ - monster_blow blow[4] = { /* Up to four blows per round */ - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - }; + std::array blow { }; /* Up to four blows per round */ byte blowm[4][2] = { { 0, 0 }, { 0, 0 }, diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 1cb2742a..9fa9f590 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -5,6 +5,8 @@ #include "monster_blow.hpp" #include "obj_theme.hpp" +#include + /** * Monster race descriptors and runtime data, including racial memories. * @@ -55,13 +57,7 @@ struct monster_race u32b flags8 = 0; /* Flags 8 (wilderness info) */ u32b flags9 = 0; /* Flags 9 (drops info) */ - - monster_blow blow[4] = { /* Up to four blows per round */ - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - }; + std::array blow { }; /* Up to four blows per round */ byte body_parts[BODY_MAX] = { 0 }; /* To help to decide what to use when body changing */ diff --git a/src/monster_type.hpp b/src/monster_type.hpp index 8353f228..ed6d3d2a 100644 --- a/src/monster_type.hpp +++ b/src/monster_type.hpp @@ -4,6 +4,7 @@ #include "monster_blow.hpp" #include "monster_race_fwd.hpp" +#include #include #include #include @@ -28,12 +29,7 @@ struct monster_type s32b hp = 0; /* Current Hit points */ s32b maxhp = 0; /* Max Hit points */ - monster_blow blow[4] = { /* Up to four blows per round */ - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - { 0, 0, 0, 0 }, - }; + std::array blow {};/* Up to four blows per round */ byte speed = 0; /* Speed (normally 110) */ byte level = 0; /* Level of creature */ -- cgit v1.2.3 From e17e742edb3809d45ce1edc716d71b3bb93056d6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Make obj_theme a non-POD struct --- src/defines.h | 6 -- src/dungeon_info_type.hpp | 2 +- src/init1.cc | 18 +++--- src/monster2.cc | 10 +-- src/monster_race.hpp | 3 +- src/obj_theme.hpp | 45 +++++++++++-- src/object2.cc | 156 ++++++++++++++++++++++------------------------ src/object2.hpp | 2 +- src/q_rand.cc | 9 +-- src/store.cc | 16 +---- src/wizard2.cc | 10 +-- 11 files changed, 132 insertions(+), 145 deletions(-) diff --git a/src/defines.h b/src/defines.h index fcbb5342..a809f8d3 100644 --- a/src/defines.h +++ b/src/defines.h @@ -3265,12 +3265,6 @@ #define MEGO_CHANCE 18 /* % chances of getting ego monsters */ -/* Object generation */ -#define OBJ_GENE_TREASURE 20 -#define OBJ_GENE_COMBAT 20 -#define OBJ_GENE_MAGIC 20 -#define OBJ_GENE_TOOL 20 - /* * Used (or should be) by various functions and tables needing access to * single bits diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index c4edc770..b15cf9fe 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -63,7 +63,7 @@ struct dungeon_info_type int ox = 0; /* Wilderness coordinates of exit */ int oy = 0; /* Wilderness coordinates of exit */ - obj_theme objs = obj_theme { 0, 0, 0, 0 }; /* The drops type */ + obj_theme objs; /* The drops type */ int d_dice[4] = { 0 }; /* Number of dices */ int d_side[4] = { 0 }; /* Number of sides */ diff --git a/src/init1.cc b/src/init1.cc index 7ff179fb..cfd767f8 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5575,12 +5575,11 @@ errr init_r_info_txt(FILE *fp) /* Ensure empty description */ r_ptr->text = my_strdup(""); - /* HACK -- Those ones HAVE to have a set default value */ - r_ptr->drops.treasure = OBJ_GENE_TREASURE; - r_ptr->drops.combat = OBJ_GENE_COMBAT; - r_ptr->drops.magic = OBJ_GENE_MAGIC; - r_ptr->drops.tools = OBJ_GENE_TOOL; - r_ptr->freq_inate = r_ptr->freq_spell = 0; + /* Set default drop theme */ + r_ptr->drops = obj_theme::defaults(); + + r_ptr->freq_inate = 0; + r_ptr->freq_spell = 0; /* Next... */ continue; @@ -6662,11 +6661,8 @@ errr init_d_info_txt(FILE *fp) for (k = 0; k < 5; k++) d_ptr->rules[j].r_char[k] = 0; } - /* HACK -- Those ones HAVE to have a set default value */ - d_ptr->objs.treasure = OBJ_GENE_TREASURE; - d_ptr->objs.combat = OBJ_GENE_COMBAT; - d_ptr->objs.magic = OBJ_GENE_MAGIC; - d_ptr->objs.tools = OBJ_GENE_TOOL; + /* Set default drop theme */ + d_ptr->objs = obj_theme::defaults(); /* The default generator */ strcpy(d_ptr->generator, "dungeon"); diff --git a/src/monster2.cc b/src/monster2.cc index 1b942a04..1adc9e7b 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -2313,17 +2313,11 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) if (r_ptr->flags7 & RF7_DROP_RANDART) { int tries = 1000; - obj_theme theme; - /* Get local object */ q_ptr = &forge; - theme.treasure = 101; - theme.combat = 101; - theme.magic = 101; - theme.tools = 101; - - init_match_theme(theme); + /* No theme */ + init_match_theme(obj_theme::no_theme()); /* Apply restriction */ get_obj_num_hook = kind_is_legal; diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 9fa9f590..94896c64 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -83,8 +83,7 @@ struct monster_race byte total_visible = 0; /* Amount of this race that are visible */ - obj_theme drops = obj_theme /* The drops type */ - { 0, 0, 0, 0 }; + obj_theme drops; /* The drops type */ }; diff --git a/src/obj_theme.hpp b/src/obj_theme.hpp index 13f185e8..d10d17fa 100644 --- a/src/obj_theme.hpp +++ b/src/obj_theme.hpp @@ -8,8 +8,45 @@ */ struct obj_theme { - byte treasure; - byte combat; - byte magic; - byte tools; + byte treasure = 0; + byte combat = 0; + byte magic = 0; + byte tools = 0; + + bool operator == (obj_theme const &other) const + { + return + (treasure == other.treasure) && + (combat == other.combat) && + (magic == other.magic) && + (tools == other.tools); + } + + bool operator != (obj_theme const &other) const + { + return !(*this == other); + } + + static constexpr obj_theme no_theme() + { + return equal_spread(100); + } + + static constexpr obj_theme defaults() + { + return equal_spread(20); + } + +private: + + static constexpr obj_theme equal_spread(byte v) + { + obj_theme ot; + ot.treasure = v; + ot.combat = v; + ot.magic = v; + ot.tools = v; + return ot; + } + }; diff --git a/src/object2.cc b/src/object2.cc index 54ed2636..ebf185b2 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -4296,52 +4296,51 @@ try_an_other_ego: /* The themed objects to use */ -static obj_theme match_theme; +static obj_theme *match_theme = nullptr; /* * XXX XXX XXX It relies on the fact that obj_theme is a four byte structure * for its efficient operation. A horrendous hack, I'd say. */ -void init_match_theme(obj_theme const &theme) +bool init_match_theme(obj_theme const &theme) { - /* Save the theme */ - match_theme = theme; -} - -/* - * Ditto XXX XXX XXX - */ -static bool_ theme_changed(obj_theme theme) -{ - /* Any of the themes has been changed */ - if (theme.treasure != match_theme.treasure) return (TRUE); - if (theme.combat != match_theme.combat) return (TRUE); - if (theme.magic != match_theme.magic) return (TRUE); - if (theme.tools != match_theme.tools) return (TRUE); - - /* No changes */ - return (FALSE); + if (match_theme == nullptr) + { + match_theme = new obj_theme(theme); + return true; + } + else if (*match_theme != theme) + { + *match_theme = theme; + return true; + } + else + { + return false; + } } - /* * Maga-Hack -- match certain types of object only. */ -static bool kind_is_theme(int k_idx) +static bool kind_is_theme(obj_theme const *theme, int k_idx) { + assert(theme != nullptr); + object_kind *k_ptr = &k_info[k_idx]; s32b prob = 0; - /* * Paranoia -- Prevent accidental "(Nothing)" * that are results of uninitialised theme structs. * * Caution: Junks go into the allocation table. */ - if (match_theme.treasure + match_theme.combat + - match_theme.magic + match_theme.tools == 0) return (TRUE); + if (theme->treasure + theme->combat + theme->magic + theme->tools == 0) + { + return TRUE; + } /* Pick probability to use */ @@ -4360,150 +4359,150 @@ static bool kind_is_theme(int k_idx) * larger than theme components, or we would see * unexpected, well, junks. */ - prob = 100 - (match_theme.treasure + match_theme.combat + - match_theme.magic + match_theme.tools); + prob = 100 - (theme->treasure + theme->combat + + theme->magic + theme->tools); break; } case TV_CHEST: - prob = match_theme.treasure; + prob = theme->treasure; break; case TV_CROWN: - prob = match_theme.treasure; + prob = theme->treasure; break; case TV_DRAG_ARMOR: - prob = match_theme.treasure; + prob = theme->treasure; break; case TV_AMULET: - prob = match_theme.treasure; + prob = theme->treasure; break; case TV_RING: - prob = match_theme.treasure; + prob = theme->treasure; break; case TV_SHOT: - prob = match_theme.combat; + prob = theme->combat; break; case TV_ARROW: - prob = match_theme.combat; + prob = theme->combat; break; case TV_BOLT: - prob = match_theme.combat; + prob = theme->combat; break; case TV_BOOMERANG: - prob = match_theme.combat; + prob = theme->combat; break; case TV_BOW: - prob = match_theme.combat; + prob = theme->combat; break; case TV_HAFTED: - prob = match_theme.combat; + prob = theme->combat; break; case TV_POLEARM: - prob = match_theme.combat; + prob = theme->combat; break; case TV_SWORD: - prob = match_theme.combat; + prob = theme->combat; break; case TV_AXE: - prob = match_theme.combat; + prob = theme->combat; break; case TV_GLOVES: - prob = match_theme.combat; + prob = theme->combat; break; case TV_HELM: - prob = match_theme.combat; + prob = theme->combat; break; case TV_SHIELD: - prob = match_theme.combat; + prob = theme->combat; break; case TV_SOFT_ARMOR: - prob = match_theme.combat; + prob = theme->combat; break; case TV_HARD_ARMOR: - prob = match_theme.combat; + prob = theme->combat; break; case TV_MSTAFF: - prob = match_theme.magic; + prob = theme->magic; break; case TV_STAFF: - prob = match_theme.magic; + prob = theme->magic; break; case TV_WAND: - prob = match_theme.magic; + prob = theme->magic; break; case TV_ROD: - prob = match_theme.magic; + prob = theme->magic; break; case TV_ROD_MAIN: - prob = match_theme.magic; + prob = theme->magic; break; case TV_SCROLL: - prob = match_theme.magic; + prob = theme->magic; break; case TV_PARCHMENT: - prob = match_theme.magic; + prob = theme->magic; break; case TV_POTION: - prob = match_theme.magic; + prob = theme->magic; break; case TV_POTION2: - prob = match_theme.magic; + prob = theme->magic; break; case TV_RANDART: - prob = match_theme.magic; + prob = theme->magic; break; case TV_RUNE1: - prob = match_theme.magic; + prob = theme->magic; break; case TV_RUNE2: - prob = match_theme.magic; + prob = theme->magic; break; case TV_BOOK: - prob = match_theme.magic; + prob = theme->magic; break; case TV_SYMBIOTIC_BOOK: - prob = match_theme.magic; + prob = theme->magic; break; case TV_MUSIC_BOOK: - prob = match_theme.magic; + prob = theme->magic; break; case TV_DRUID_BOOK: - prob = match_theme.magic; + prob = theme->magic; break; case TV_DAEMON_BOOK: - prob = match_theme.magic; + prob = theme->magic; break; case TV_LITE: - prob = match_theme.tools; + prob = theme->tools; break; case TV_CLOAK: - prob = match_theme.tools; + prob = theme->tools; break; case TV_BOOTS: - prob = match_theme.tools; + prob = theme->tools; break; case TV_SPIKE: - prob = match_theme.tools; + prob = theme->tools; break; case TV_DIGGING: - prob = match_theme.tools; + prob = theme->tools; break; case TV_FLASK: - prob = match_theme.tools; + prob = theme->tools; break; case TV_FOOD: - prob = match_theme.tools; + prob = theme->tools; break; case TV_TOOL: - prob = match_theme.tools; + prob = theme->tools; break; case TV_INSTRUMENT: - prob = match_theme.tools; + prob = theme->tools; break; case TV_TRAPKIT: - prob = match_theme.tools; + prob = theme->tools; break; } @@ -4521,7 +4520,7 @@ bool_ kind_is_legal(int k_idx) { object_kind *k_ptr = &k_info[k_idx]; - if (!kind_is_theme(k_idx)) return FALSE; + if (!kind_is_theme(match_theme, k_idx)) return FALSE; if (k_ptr->flags4 & TR4_SPECIAL_GENE) { @@ -4715,14 +4714,9 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & /* Generate a special object, or a normal object */ if ((rand_int(invprob) != 0) || !make_artifact_special(j_ptr)) { - int k_idx; - - /* See if the theme has been changed XXX XXX XXX */ - if (theme_changed(theme)) + /* See if the theme has been changed */ + if (init_match_theme(theme)) { - /* Select items based on "theme" */ - init_match_theme(theme); - /* Invalidate the cached allocation table */ alloc_kind_table_valid = FALSE; } @@ -4751,7 +4745,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & } /* Pick a random object */ - k_idx = get_obj_num(base); + int k_idx = get_obj_num(base); /* Good objects */ if (good) diff --git a/src/object2.hpp b/src/object2.hpp index 26d07b25..a8d0fab9 100644 --- a/src/object2.hpp +++ b/src/object2.hpp @@ -14,7 +14,7 @@ extern void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_f extern object_type *get_object(int item); extern s32b calc_total_weight(void); extern void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows); -extern void init_match_theme(obj_theme const &theme); +extern bool init_match_theme(obj_theme const &theme); extern bool_ kind_is_artifactable(int k_idx); extern bool_ kind_is_legal(int k_idx); extern void inven_item_charges(int item); diff --git a/src/q_rand.cc b/src/q_rand.cc index c5d2adac..bc3f2609 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -213,7 +213,6 @@ bool_ is_randhero(int level) static void do_get_new_obj(int y, int x) { - obj_theme theme; object_type *q_ptr[3], forge[3]; int res, i; @@ -227,14 +226,8 @@ static void do_get_new_obj(int y, int x) /* Wipe the object */ object_wipe(q_ptr[i]); - /* No themes */ - theme.treasure = 100; - theme.combat = 100; - theme.magic = 100; - theme.tools = 100; - /* Make a great object */ - make_object(q_ptr[i], TRUE, TRUE, theme); + make_object(q_ptr[i], TRUE, TRUE, obj_theme::no_theme()); q_ptr[i]->found = OBJ_FOUND_REWARD; char buf[100]; diff --git a/src/store.cc b/src/store.cc index 0fbe2e9b..d2947a7f 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1286,14 +1286,8 @@ static void store_create(void) /* Black Market */ else if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) { - obj_theme theme; - /* No themes */ - theme.treasure = 100; - theme.combat = 100; - theme.magic = 100; - theme.tools = 100; - init_match_theme(theme); + init_match_theme(obj_theme::no_theme()); /* * Even in Black Markets, illegal objects can be @@ -1339,14 +1333,8 @@ static void store_create(void) /* Hack -- i > 10000 means it's a tval and all svals are allowed */ if (i > 10000) { - obj_theme theme; - /* No themes */ - theme.treasure = 100; - theme.combat = 100; - theme.magic = 100; - theme.tools = 100; - init_match_theme(theme); + init_match_theme(obj_theme::no_theme()); /* Activate restriction */ get_obj_num_hook = kind_is_storeok; diff --git a/src/wizard2.cc b/src/wizard2.cc index 837d778b..0614022c 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -866,16 +866,8 @@ static void wiz_statistics(object_type *o_ptr) object_type forge; object_type *q_ptr; - obj_theme theme; - cptr q = "Rolls: %ld, Matches: %ld, Better: %ld, Worse: %ld, Other: %ld"; - /* We can have everything */ - theme.treasure = OBJ_GENE_TREASURE; - theme.combat = OBJ_GENE_COMBAT; - theme.magic = OBJ_GENE_MAGIC; - theme.tools = OBJ_GENE_TOOL; - /* XXX XXX XXX Mega-Hack -- allow multiple artifacts */ if (artifact_p(o_ptr)) { @@ -963,7 +955,7 @@ static void wiz_statistics(object_type *o_ptr) object_wipe(q_ptr); /* Create an object */ - make_object(q_ptr, good, great, theme); + make_object(q_ptr, good, great, obj_theme::defaults()); /* XXX XXX XXX Mega-Hack -- allow multiple artifacts */ -- cgit v1.2.3 From fa5083020d4cc4d6d7471b461c430d40ed36c02e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove ANIM_DEAD monster spell It doesn't seem like it was ever implemented fully in the first place, i.e. it was only available to Possessors and Symbiants, not monsters. --- lib/edit/r_info.txt | 43 ------------------------------------------ lib/mods/theme/edit/r_info.txt | 29 ---------------------------- src/cmd5.cc | 17 ----------------- src/melee2.cc | 10 ---------- 4 files changed, 99 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 252c1f2d..8e0697b2 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -8453,7 +8453,6 @@ F:RAND_50 F:RES_NETH F:ZANGBAND S:1_IN_3 -S:ANIM_DEAD S:BA_FIRE D:A pale, corpse-like lesser demon, who moves very fast and spawns evil D:everywhere. @@ -9821,7 +9820,6 @@ F:RES_TELE F:UNDEAD F:UNIQUE S:1_IN_5 -S:ANIM_DEAD S:CAUSE_3 S:DARKNESS S:SCARE @@ -11917,7 +11915,6 @@ F:NO_SLEEP F:OPEN_DOOR F:UNDEAD S:1_IN_7 -S:ANIM_DEAD S:DARKNESS S:HOLD S:SCARE @@ -13186,7 +13183,6 @@ F:SMART F:TAKE_ITEM F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_COLD S:BA_NETH S:BA_POIS @@ -14608,7 +14604,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BO_NETH S:CAUSE_3 @@ -14666,7 +14661,6 @@ F:RES_WATE F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLINK S:DARKNESS S:DRAIN_MANA @@ -15972,7 +15966,6 @@ F:SMART F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BRAIN_SMASH @@ -17518,7 +17511,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BO_ACID @@ -17561,7 +17553,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_FIRE S:BLIND @@ -17860,7 +17851,6 @@ F:NO_SLEEP F:RES_TELE F:UNDEAD S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_FIRE S:BO_ACID @@ -18224,7 +18214,6 @@ F:OPEN_DOOR F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BRAIN_SMASH S:CAUSE_3 @@ -18461,7 +18450,6 @@ F:TAKE_ITEM F:UNDEAD F:ZANGBAND S:1_IN_6 -S:ANIM_DEAD S:BLINK S:CAUSE_3 S:MULTIPLY @@ -18717,7 +18705,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_FIRE S:BA_NETH S:BLIND @@ -18831,7 +18818,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_2 -S:ANIM_DEAD S:BLIND S:CAUSE_3 S:CAUSE_4 @@ -19022,7 +19008,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:CAUSE_3 @@ -19467,7 +19452,6 @@ F:REGENERATE F:SMART F:UNIQUE S:1_IN_4 -S:ANIM_DEAD S:BR_CHAO S:BR_NEXU S:BR_NUKE @@ -20021,7 +20005,6 @@ F:POWERFUL F:SMART F:ZANGBAND S:1_IN_4 -S:ANIM_DEAD S:BA_COLD S:BA_NETH S:BLIND @@ -20549,7 +20532,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BRAIN_SMASH S:CAUSE_3 S:CAUSE_4 @@ -20600,7 +20582,6 @@ F:POWERFUL F:SMART F:ZANGBAND S:1_IN_3 -S:ANIM_DEAD S:BR_ACID S:BR_NUKE S:BR_POIS @@ -20842,7 +20823,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BRAIN_SMASH @@ -22177,7 +22157,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_ACID S:BA_CHAO S:BA_COLD @@ -22309,7 +22288,6 @@ F:RES_TELE F:TAKE_ITEM F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BRAIN_SMASH @@ -22405,7 +22383,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BLINK @@ -23518,7 +23495,6 @@ F:SMART F:UNIQUE F:ZANGBAND S:1_IN_5 -S:ANIM_DEAD S:BRAIN_SMASH S:BR_NETH S:DRAIN_MANA @@ -23564,7 +23540,6 @@ F:SPECIAL_GENE F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_MANA S:BA_NETH S:BLINK @@ -24172,7 +24147,6 @@ F:SMART F:UNIQUE F:ZANGBAND S:1_IN_3 -S:ANIM_DEAD S:BA_DARK S:BA_NETH S:BLIND @@ -24221,7 +24195,6 @@ F:OPEN_DOOR F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_DARK S:BA_FIRE S:BA_MANA @@ -24273,7 +24246,6 @@ F:SMART F:SPECIAL_GENE F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_FIRE @@ -24763,7 +24735,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_NETH S:BA_WATE S:BO_ICEE @@ -24818,7 +24789,6 @@ F:RES_PLAS F:UNIQUE F:ZANGBAND S:1_IN_3 -S:ANIM_DEAD S:BRAIN_SMASH S:BR_FIRE S:BR_NETH @@ -24913,7 +24883,6 @@ F:RES_WATE F:SMART F:UNIQUE S:1_IN_6 -S:ANIM_DEAD S:BRAIN_SMASH S:BR_CHAO S:BR_NEXU @@ -25028,7 +24997,6 @@ F:TAKE_ITEM F:UNIQUE F:ZANGBAND S:1_IN_5 -S:ANIM_DEAD S:BA_DARK S:BA_MANA S:DRAIN_MANA @@ -25085,7 +25053,6 @@ F:RAND_25 F:RES_NETH F:RES_TELE S:1_IN_3 -S:ANIM_DEAD S:BA_NUKE S:BRAIN_SMASH S:BR_ACID @@ -25315,7 +25282,6 @@ F:RES_WATE F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_MANA S:BLIND S:BRAIN_SMASH @@ -25458,7 +25424,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_FIRE S:BA_MANA S:BA_NETH @@ -25689,7 +25654,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BO_MANA @@ -25843,7 +25807,6 @@ F:SHAPECHANGER F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_CHAO S:BA_FIRE S:BA_MANA @@ -26163,7 +26126,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BRAIN_SMASH S:BR_ACID @@ -26341,7 +26303,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_FIRE @@ -26500,7 +26461,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_MANA @@ -29017,7 +28977,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_FIRE S:BA_NETH @@ -29070,7 +29029,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BO_MANA @@ -32119,7 +32077,6 @@ F:SPECIAL_GENE F:SPIRIT F:UNIQUE S:1_IN_4 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_MANA diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index f238fec8..fe18f2fa 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -5677,7 +5677,6 @@ F:RES_WATE F:STUPID F:UNDEAD S:1_IN_5 -S:ANIM_DEAD D:An evil cannibal spirit from the marshlands. It has been given D:additional power by necromantic magic, making it nearly invulnerable. # Wow, a dangerous icky thing :P @@ -11833,7 +11832,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_5 -S:ANIM_DEAD S:S_KIN D:A ruler of mewlips. She might not be the most powerful of D:them all, but she is the smartest, and has her minions @@ -12779,7 +12777,6 @@ F:NO_SLEEP F:OPEN_DOOR F:UNDEAD S:1_IN_7 -S:ANIM_DEAD S:DARKNESS S:HOLD S:SCARE @@ -14202,7 +14199,6 @@ F:SMART F:TAKE_ITEM F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_COLD S:BA_NETH S:BA_POIS @@ -15912,7 +15908,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BO_NETH S:CAUSE_3 @@ -17171,7 +17166,6 @@ F:SMART F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BRAIN_SMASH @@ -18107,7 +18101,6 @@ F:RES_NETH F:RES_NEXU F:RES_PLAS S:1_IN_6 -S:ANIM_DEAD S:BA_DARK S:BO_MANA S:DARKNESS @@ -18598,7 +18591,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BO_ACID @@ -18641,7 +18633,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_FIRE S:BLIND @@ -18869,7 +18860,6 @@ F:NO_SLEEP F:RES_TELE F:UNDEAD S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_FIRE S:BO_ACID @@ -19169,7 +19159,6 @@ F:OPEN_DOOR F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BRAIN_SMASH S:CAUSE_3 @@ -19389,7 +19378,6 @@ F:SMART F:TAKE_ITEM F:UNDEAD S:1_IN_6 -S:ANIM_DEAD S:BLINK S:CAUSE_3 S:MULTIPLY @@ -19563,7 +19551,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_FIRE S:BA_NETH S:BLIND @@ -19677,7 +19664,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:SMART S:1_IN_2 -S:ANIM_DEAD S:BLIND S:CAUSE_3 S:CAUSE_4 @@ -19867,7 +19853,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:CAUSE_3 @@ -21504,7 +21489,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BLIND S:BLINK S:BRAIN_SMASH @@ -22530,7 +22514,6 @@ F:SMART F:SPECIAL_GENE F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_ACID S:BA_CHAO S:BA_COLD @@ -22661,7 +22644,6 @@ F:RES_TELE F:TAKE_ITEM F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BRAIN_SMASH @@ -22757,7 +22739,6 @@ F:RES_TELE F:SMART F:UNDEAD S:1_IN_3 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BLINK @@ -23835,7 +23816,6 @@ F:SPECIAL_GENE F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_MANA S:BA_NETH S:BLINK @@ -24438,7 +24418,6 @@ F:OPEN_DOOR F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_DARK S:BA_FIRE S:BA_MANA @@ -24492,7 +24471,6 @@ F:SMART F:SPECIAL_GENE F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_FIRE @@ -24901,7 +24879,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_NETH S:BA_WATE S:BO_ICEE @@ -25315,7 +25292,6 @@ F:SMART F:UNDEAD F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_FIRE S:BA_MANA S:BA_NETH @@ -25863,7 +25839,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_FIRE @@ -26022,7 +25997,6 @@ F:RES_TELE F:SMART F:UNIQUE S:1_IN_3 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_MANA @@ -28576,7 +28550,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_COLD S:BA_NETH S:BLIND @@ -28629,7 +28602,6 @@ F:SUSCEP_FIRE F:UNDEAD F:UNIQUE S:1_IN_2 -S:ANIM_DEAD S:BA_NETH S:BLIND S:BO_MANA @@ -31453,7 +31425,6 @@ F:SPECIAL_GENE F:SPIRIT F:UNIQUE S:1_IN_4 -S:ANIM_DEAD S:BA_CHAO S:BA_DARK S:BA_MANA diff --git a/src/cmd5.cc b/src/cmd5.cc index 6dccbc8c..a3a70b01 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -1693,23 +1693,6 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* 75 FORGET -- Not available */ - - /* ANIM_DEAD -- Use the same code as the nether spell */ - case 76: - { - int dir; - if (!get_aim_dir(&dir)) break; - - fire_ball(GF_RAISE, dir, 1, 0); - - break; - } - - /* 77 S_BUG -- Not available, well we do that anyway ;) */ - - /* 78 S_RNG -- Not available, who dares? */ - /* S_THUNDERLORD */ case 79: { diff --git a/src/melee2.cc b/src/melee2.cc index 522b2f47..83827dcf 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2344,12 +2344,6 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_ANIM_DEAD */ - case 160 + 12: - { - break; - } - /* RF6_S_BUG */ case 160 + 13: { @@ -4214,10 +4208,6 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_ANIM_DEAD */ - case 160 + 12: - break; - /* RF6_S_BUG */ case 160 + 13: { -- cgit v1.2.3 From 59b5314b6b7880cfda73f34aed03a700fd523017 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Rework RF{4,5,6}_* monster spell flags to flag_set<> --- src/CMakeLists.txt | 1 + src/cave.cc | 113 ++-- src/cmd1.cc | 5 +- src/cmd5.cc | 361 +++++-------- src/cmd5.hpp | 3 +- src/cmd6.cc | 63 +-- src/defines.h | 159 ------ src/flag_set.hpp | 9 + src/generate.cc | 98 +--- src/init1.cc | 188 +------ src/melee2.cc | 1135 +++++++++++++++------------------------ src/monster1.cc | 200 +++---- src/monster2.cc | 40 +- src/monster3.cc | 19 +- src/monster_ego.hpp | 13 +- src/monster_power.hpp | 4 +- src/monster_power_fwd.hpp | 3 + src/monster_race.hpp | 6 +- src/monster_spell.cc | 36 ++ src/monster_spell.hpp | 91 ++++ src/monster_spell_flag.hpp | 20 + src/monster_spell_flag_list.hpp | 102 ++++ src/monster_spell_flag_set.hpp | 7 + src/q_bounty.cc | 3 +- src/q_god.cc | 9 +- src/q_poison.cc | 3 +- src/q_rand.cc | 5 +- src/rule_type.hpp | 6 +- src/spells1.cc | 39 +- src/spells2.cc | 184 ++++--- src/tables.cc | 192 ++++--- src/wizard1.cc | 207 ++++--- 32 files changed, 1432 insertions(+), 1892 deletions(-) create mode 100644 src/monster_power_fwd.hpp create mode 100644 src/monster_spell.cc create mode 100644 src/monster_spell.hpp create mode 100644 src/monster_spell_flag.hpp create mode 100644 src/monster_spell_flag_list.hpp create mode 100644 src/monster_spell_flag_set.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a68e056b..5a4b326f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,6 +45,7 @@ SET(SRCS_COMMON messages.cc mimic.cc modules.cc + monster_spell.cc monster_type.cc monster1.cc monster2.cc diff --git a/src/cave.cc b/src/cave.cc index 09f5d843..9d5daede 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -6,6 +6,7 @@ #include "hook_enter_dungeon_in.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object_kind.hpp" @@ -500,49 +501,59 @@ static char get_shimmer_color() /* - * Table of breath colors. Must match listings in a single set of - * monster spell flags. - * - * The value "255" is special. Monsters with that kind of breath - * may be any color. + * Breath color */ -static byte breath_to_attr[32][2] = -{ - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { 0, 0 }, - { TERM_SLATE, TERM_L_DARK }, /* RF4_BRTH_ACID */ - { TERM_BLUE, TERM_L_BLUE }, /* RF4_BRTH_ELEC */ - { TERM_RED, TERM_L_RED }, /* RF4_BRTH_FIRE */ - { TERM_WHITE, TERM_L_WHITE }, /* RF4_BRTH_COLD */ - { TERM_GREEN, TERM_L_GREEN }, /* RF4_BRTH_POIS */ - { TERM_L_GREEN, TERM_GREEN }, /* RF4_BRTH_NETHR */ - { TERM_YELLOW, TERM_ORANGE }, /* RF4_BRTH_LITE */ - { TERM_L_DARK, TERM_SLATE }, /* RF4_BRTH_DARK */ - { TERM_L_UMBER, TERM_UMBER }, /* RF4_BRTH_CONFU */ - { TERM_YELLOW, TERM_L_UMBER }, /* RF4_BRTH_SOUND */ - { 255, 255 }, /* (any color) */ /* RF4_BRTH_CHAOS */ - { TERM_VIOLET, TERM_VIOLET }, /* RF4_BRTH_DISEN */ - { TERM_L_RED, TERM_VIOLET }, /* RF4_BRTH_NEXUS */ - { TERM_L_BLUE, TERM_L_BLUE }, /* RF4_BRTH_TIME */ - { TERM_L_WHITE, TERM_SLATE }, /* RF4_BRTH_INER */ - { TERM_L_WHITE, TERM_SLATE }, /* RF4_BRTH_GRAV */ - { TERM_UMBER, TERM_L_UMBER }, /* RF4_BRTH_SHARD */ - { TERM_ORANGE, TERM_RED }, /* RF4_BRTH_PLAS */ - { TERM_UMBER, TERM_L_UMBER }, /* RF4_BRTH_FORCE */ - { TERM_L_BLUE, TERM_WHITE }, /* RF4_BRTH_MANA */ - { 0, 0 }, /* */ - { TERM_GREEN, TERM_L_GREEN }, /* RF4_BRTH_NUKE */ - { 0, 0 }, /* */ - { TERM_WHITE, TERM_L_RED }, /* RF4_BRTH_DISINT */ +struct breath_color { + std::size_t breath_idx; + byte first_color; + byte second_color; }; +/* + * Breath colors. The value "255" is special. Monsters with + * that kind of breath may be any color. + */ +static breath_color const *lookup_breath_color(std::size_t i) +{ + static breath_color breath_to_attr[] = + { + { SF_BR_ACID_IDX, TERM_SLATE, TERM_L_DARK }, + { SF_BR_ELEC_IDX, TERM_BLUE, TERM_L_BLUE }, + { SF_BR_FIRE_IDX, TERM_RED, TERM_L_RED }, + { SF_BR_COLD_IDX, TERM_WHITE, TERM_L_WHITE }, + { SF_BR_POIS_IDX, TERM_GREEN, TERM_L_GREEN }, + { SF_BR_NETH_IDX, TERM_L_GREEN, TERM_GREEN }, + { SF_BR_LITE_IDX, TERM_YELLOW, TERM_ORANGE }, + { SF_BR_DARK_IDX, TERM_L_DARK, TERM_SLATE }, + { SF_BR_CONF_IDX, TERM_L_UMBER, TERM_UMBER }, + { SF_BR_SOUN_IDX, TERM_YELLOW, TERM_L_UMBER }, + { SF_BR_CHAO_IDX, 255, 255 }, + { SF_BR_DISE_IDX, TERM_VIOLET, TERM_VIOLET }, + { SF_BR_NEXU_IDX, TERM_L_RED, TERM_VIOLET }, + { SF_BR_TIME_IDX, TERM_L_BLUE, TERM_L_BLUE }, + { SF_BR_INER_IDX, TERM_L_WHITE, TERM_SLATE }, + { SF_BR_GRAV_IDX, TERM_L_WHITE, TERM_SLATE }, + { SF_BR_SHAR_IDX, TERM_UMBER, TERM_L_UMBER }, + { SF_BR_PLAS_IDX, TERM_ORANGE, TERM_RED }, + { SF_BR_WALL_IDX, TERM_UMBER, TERM_L_UMBER }, + { SF_BR_MANA_IDX, TERM_L_BLUE, TERM_WHITE }, + { SF_BR_NUKE_IDX, TERM_GREEN, TERM_L_GREEN }, + { SF_BR_DISI_IDX, TERM_WHITE, TERM_L_RED }, + }; + + for (auto const &breath_color: breath_to_attr) + { + if (breath_color.breath_idx == i) + { + return &breath_color; + } + } + + return nullptr; +} + + /* * Multi-hued monsters shimmer acording to their breaths. * @@ -556,9 +567,7 @@ static byte multi_hued_attr(std::shared_ptr r_ptr) { byte allowed_attrs[15]; - int i, j; - - int stored_colors = 0; + std::size_t stored_colors = 0; int breaths = 0; @@ -571,18 +580,22 @@ static byte multi_hued_attr(std::shared_ptr r_ptr) if (!r_ptr->freq_inate) return (get_shimmer_color()); /* Check breaths */ - for (i = 0; i < 32; i++) + for (std::size_t i = 0; i < monster_spell_flag_set::nbits; i++) { bool_ stored = FALSE; /* Don't have that breath */ - if (!(r_ptr->flags4 & (1L << i))) continue; + if (!(r_ptr->spells.bit(i))) continue; - /* Get the first color of this breath */ - first_color = breath_to_attr[i][0]; + /* Find the breath in our list */ + auto breath_color = lookup_breath_color(i); + if (!breath_color) + { + continue; + } - /* Breath has no color associated with it */ - if (first_color == 0) continue; + /* Get the first color of this breath */ + first_color = breath_color->first_color; /* Monster can be of any color */ if (first_color == 255) return (randint(15)); @@ -596,7 +609,7 @@ static byte multi_hued_attr(std::shared_ptr r_ptr) /* Always store the first color */ - for (j = 0; j < stored_colors; j++) + for (std::size_t j = 0; j < stored_colors; j++) { /* Already stored */ if (allowed_attrs[j] == first_color) stored = TRUE; @@ -613,7 +626,7 @@ static byte multi_hued_attr(std::shared_ptr r_ptr) */ if (breaths == 1) { - second_color = breath_to_attr[i][1]; + second_color = breath_color->second_color; } } diff --git a/src/cmd1.cc b/src/cmd1.cc index 69592b71..dddcbcef 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -25,6 +25,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -2228,7 +2229,7 @@ void py_attack(int y, int x, int max_blow) /* Stunning blow */ if (magik(get_skill(SKILL_STUN)) && (o_ptr->tval == TV_HAFTED) && (o_ptr->weight > 50) && done_crit) { - if (!(r_ptr->flags4 & RF4_BR_SOUN) && !(r_ptr->flags4 & RF4_BR_WALL) && k) + if (!(r_ptr->spells & SF_BR_SOUN) && !(r_ptr->spells & SF_BR_WALL) && k) { int tmp; @@ -2476,7 +2477,7 @@ void py_attack(int y, int x, int max_blow) (randint(90) > m_ptr->level)) { if (!((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags4 & RF4_BR_CHAO) || + (r_ptr->spells & SF_BR_CHAO) || (m_ptr->mflag & MFLAG_QUEST))) { /* Handle polymorph */ diff --git a/src/cmd5.cc b/src/cmd5.cc index a3a70b01..2c9798de 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -16,6 +16,7 @@ #include "lua_bind.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_type.hpp" @@ -616,44 +617,43 @@ cptr symbiote_name(bool_ capitalize) return buf; } + /* - * Extract powers + * Find monster power */ -std::vector extract_monster_powers(monster_race const *r_ptr, bool great) +monster_power const *lookup_monster_power(std::size_t idx) { - std::vector powers; - powers.reserve(MONSTER_POWERS_MAX); - - /* List the monster powers -- RF4_* */ - for (std::size_t i = 0; i < 32; i++) + for (auto const &p: monster_powers) { - if (r_ptr->flags4 & BIT(i)) + if (p.monster_spell_index == idx) { - if (monster_powers[i].great && (!great)) continue; - if (!monster_powers[i].power) continue; - powers.push_back(i); + return &p; } } + return nullptr; +} - /* List the monster powers -- RF5_* */ - for (std::size_t i = 0; i < 32; i++) - { - if (r_ptr->flags5 & BIT(i)) - { - if (monster_powers[i + 32].great && (!great)) continue; - if (!monster_powers[i + 32].power) continue; - powers.push_back(i + 32); - } - } - /* List the monster powers -- RF6_* */ - for (std::size_t i = 0; i < 32; i++) +/* + * Extract powers + */ +std::vector extract_monster_powers(monster_race const *r_ptr, bool great) +{ + std::vector powers; + powers.reserve(MONSTER_POWERS_MAX); + + for (std::size_t i = 0; i < monster_spell_flag_set::nbits; i++) { - if (r_ptr->flags6 & BIT(i)) + if (r_ptr->spells.bit(i)) { - if (monster_powers[i + 64].great && (!great)) continue; - if (!monster_powers[i + 64].power) continue; - powers.push_back(i + 64); + if (auto power = lookup_monster_power(i)) + { + if (power->great && (!great)) + { + continue; + } + powers.push_back(power); + } } } @@ -677,7 +677,7 @@ static int calc_monster_spell_mana(monster_power const *mp_ptr) static std::tuple choose_monster_power(monster_race const *r_ptr, bool great, bool symbiosis) { /* Extract available monster powers */ - std::vector powers = extract_monster_powers(r_ptr, great); + auto powers = extract_monster_powers(r_ptr, great); int const num = powers.size(); // Avoid signed/unsigned warnings if (!num) @@ -701,7 +701,7 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool Term_save(); /* Get a spell from the user */ - int power = -1; // Selected power + monster_power const *power = nullptr; bool_ flag = FALSE; // Nothing chosen yet while (!flag) { @@ -716,7 +716,7 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool while (ctr < num) { - monster_power *mp_ptr = &monster_powers[powers[ctr]]; + monster_power const *mp_ptr = powers[ctr]; label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26); @@ -799,12 +799,13 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool continue; } - /* Save the spell index */ + /* Save the spell */ power = powers[i]; /* Make sure it's actually possible for the player to cast */ - if (!symbiosis) { - if (p_ptr->csp < calc_monster_spell_mana(&monster_powers[power])) + if (!symbiosis) + { + if (p_ptr->csp < calc_monster_spell_mana(power)) { bell(); continue; @@ -817,7 +818,7 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool char tmp_val[160]; /* Prompt */ - strnfmt(tmp_val, 78, "Use %s? ", monster_powers[power].name); + strnfmt(tmp_val, 78, "Use %s? ", power->name); /* Belay that order */ if (!get_check(tmp_val)) continue; @@ -832,22 +833,22 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool character_icky = FALSE; /* Abort if needed */ - if (!flag) + if (!flag || (power == nullptr)) { return std::make_tuple(-1, num); } - return std::make_tuple(power, num); + return std::make_tuple(power->monster_spell_index, num); } /* * Apply the effect of a monster power */ -static void apply_monster_power(monster_race const *r_ptr, int power) +static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_spell_idx) { - assert(power >= 0); - assert(power < MONSTER_POWERS_MAX); + assert(monster_spell_idx >= 0); + assert(monster_spell_idx < monster_spell_flag_set::nbits); /* Shorthand */ int const x = p_ptr->px; @@ -861,36 +862,30 @@ static void apply_monster_power(monster_race const *r_ptr, int power) : 1 + (p_ptr->lev / 20); /* Analyse power */ - switch (power) + switch (monster_spell_idx) { - /**** RF4 (bit position) ****/ - - /* SHRIEK */ - case 0: + case SF_SHRIEK_IDX: { aggravate_monsters( -1); break; } - /* MULTIPLY */ - case 1: + case SF_MULTIPLY_IDX: { do_cmd_wiz_named_friendly(p_ptr->body_monster, FALSE); break; } - /* S_ANIMAL */ - case 2: + case SF_S_ANIMAL_IDX: { summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE); break; } - /* ROCKET */ - case 3: + case SF_ROCKET_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -900,8 +895,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* ARROW_1 */ - case 4: + case SF_ARROW_1_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -911,8 +905,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* ARROW_2 */ - case 5: + case SF_ARROW_2_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -922,8 +915,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* ARROW_3 */ - case 6: + case SF_ARROW_3_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -933,8 +925,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* ARROW_4 */ - case 7: + case SF_ARROW_4_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -944,8 +935,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_ACID */ - case 8: + case SF_BR_ACID_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -955,8 +945,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_ELEC */ - case 9: + case SF_BR_ELEC_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -966,8 +955,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_FIRE */ - case 10: + case SF_BR_FIRE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -977,8 +965,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_COLD */ - case 11: + case SF_BR_COLD_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -988,8 +975,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_POIS */ - case 12: + case SF_BR_POIS_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -999,8 +985,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_NETH */ - case 13: + case SF_BR_NETH_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1010,8 +995,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_LITE */ - case 14: + case SF_BR_LITE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1021,8 +1005,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_DARK */ - case 15: + case SF_BR_DARK_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1032,8 +1015,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_CONF */ - case 16: + case SF_BR_CONF_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1043,8 +1025,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_SOUN */ - case 17: + case SF_BR_SOUN_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1054,8 +1035,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_CHAO */ - case 18: + case SF_BR_CHAO_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1065,8 +1045,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_DISE */ - case 19: + case SF_BR_DISE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1076,8 +1055,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_NEXU */ - case 20: + case SF_BR_NEXU_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1087,8 +1065,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_TIME */ - case 21: + case SF_BR_TIME_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1098,8 +1075,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_INER */ - case 22: + case SF_BR_INER_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1109,8 +1085,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_GRAV */ - case 23: + case SF_BR_GRAV_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1120,8 +1095,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_SHAR */ - case 24: + case SF_BR_SHAR_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1131,8 +1105,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_PLAS */ - case 25: + case SF_BR_PLAS_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1142,8 +1115,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_WALL */ - case 26: + case SF_BR_WALL_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1153,8 +1125,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_MANA */ - case 27: + case SF_BR_MANA_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1164,8 +1135,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_NUKE */ - case 28: + case SF_BA_NUKE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1175,8 +1145,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_NUKE */ - case 29: + case SF_BR_NUKE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1186,8 +1155,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_CHAO */ - case 30: + case SF_BA_CHAO_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1197,8 +1165,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BR_DISI */ - case 31: + case SF_BR_DISI_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1208,11 +1175,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - - /**** RF5 (bit position + 32) ****/ - - /* BA_ACID */ - case 32: + case SF_BA_ACID_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1222,8 +1185,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_ELEC */ - case 33: + case SF_BA_ELEC_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1233,8 +1195,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_FIRE */ - case 34: + case SF_BA_FIRE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1244,8 +1205,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_COLD */ - case 35: + case SF_BA_COLD_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1255,8 +1215,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_POIS */ - case 36: + case SF_BA_POIS_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1266,8 +1225,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_NETH */ - case 37: + case SF_BA_NETH_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1277,8 +1235,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_WATE */ - case 38: + case SF_BA_WATE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1288,8 +1245,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_MANA */ - case 39: + case SF_BA_MANA_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1299,8 +1255,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BA_DARK */ - case 40: + case SF_BA_DARK_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1310,14 +1265,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* 41 DRAIN_MANA -- Not available */ - - /* 42 MIND_BLAST -- Not available */ - - /* 43 BRAIN_SMASH -- Not available */ - - /* CAUSE_1 */ - case 44: + case SF_CAUSE_1_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1327,8 +1275,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* CAUSE_2 */ - case 45: + case SF_CAUSE_2_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1338,8 +1285,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* CAUSE_3 */ - case 46: + case SF_CAUSE_3_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1349,8 +1295,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* CAUSE_4 */ - case 47: + case SF_CAUSE_4_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1360,8 +1305,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_ACID */ - case 48: + case SF_BO_ACID_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1371,8 +1315,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_ELEC */ - case 49: + case SF_BO_ELEC_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1382,8 +1325,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_FIRE */ - case 50: + case SF_BO_FIRE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1393,8 +1335,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_COLD */ - case 51: + case SF_BO_COLD_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1404,8 +1345,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_POIS */ - case 52: + case SF_BO_POIS_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1415,8 +1355,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_NETH */ - case 53: + case SF_BO_NETH_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1426,8 +1365,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_WATE */ - case 54: + case SF_BO_WATE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1437,8 +1375,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_MANA */ - case 55: + case SF_BO_MANA_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1448,8 +1385,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_PLAS */ - case 56: + case SF_BO_PLAS_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1459,8 +1395,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BO_ICEE */ - case 57: + case SF_BO_ICEE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1470,8 +1405,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* MISSILE */ - case 58: + case SF_MISSILE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1481,8 +1415,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* SCARE */ - case 59: + case SF_SCARE_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1492,8 +1425,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BLIND */ - case 60: + case SF_BLIND_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1503,8 +1435,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* CONF */ - case 61: + case SF_CONF_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1514,8 +1445,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* SLOW */ - case 62: + case SF_SLOW_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1525,8 +1455,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* HOLD */ - case 63: + case SF_HOLD_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1536,11 +1465,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - - /**** RF6 (bit position + 64) ****/ - - /* HASTE */ - case 64: + case SF_HASTE_IDX: { if (!p_ptr->fast) { @@ -1554,8 +1479,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* HAND_DOOM */ - case 65: + case SF_HAND_DOOM_IDX: { int dir; if (!get_aim_dir(&dir)) break; @@ -1565,16 +1489,14 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* HEAL */ - case 66: + case SF_HEAL_IDX: { hp_player(damroll(8, 5)); break; } - /* S_ANIMALS */ - case 67: + case SF_S_ANIMALS_IDX: { for (int k = 0; k < 4; k++) { @@ -1584,8 +1506,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* BLINK */ - case 68: + case SF_BLINK_IDX: { if (dungeon_flags & DF_NO_TELEPORT) { @@ -1598,8 +1519,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* TPORT */ - case 69: + case SF_TPORT_IDX: { if (dungeon_flags & DF_NO_TELEPORT) { @@ -1612,8 +1532,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* TELE_TO */ - case 70: + case SF_TELE_TO_IDX: { int ii, ij; @@ -1642,8 +1561,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* TELE_AWAY */ - case 71: + case SF_TELE_AWAY_IDX: { if (dungeon_flags & DF_NO_TELEPORT) { @@ -1659,8 +1577,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* TELE_LEVEL */ - case 72: + case SF_TELE_LEVEL_IDX: { if (dungeon_flags & DF_NO_TELEPORT) { @@ -1673,8 +1590,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* DARKNESS */ - case 73: + case SF_DARKNESS_IDX: { (void)project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL); @@ -1685,16 +1601,14 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* TRAPS */ - case 74: + case SF_TRAPS_IDX: { trap_creation(); break; } - /* S_THUNDERLORD */ - case 79: + case SF_S_THUNDERLORD_IDX: { for (int k = 0; k < 1; k++) { @@ -1704,8 +1618,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_KIN -- Summon Kin, because we code bugs :) */ - case 80: + case SF_S_KIN_IDX: { /* Big hack */ summon_kin_type = r_ptr->d_char; @@ -1718,8 +1631,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_HI_DEMON */ - case 81: + case SF_S_HI_DEMON_IDX: { for (int k = 0; k < 1; k++) { @@ -1729,8 +1641,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_MONSTER */ - case 82: + case SF_S_MONSTER_IDX: { for (int k = 0; k < 1; k++) { @@ -1740,8 +1651,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_MONSTERS */ - case 83: + case SF_S_MONSTERS_IDX: { for (int k = 0; k < 6; k++) { @@ -1751,8 +1661,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_ANT */ - case 84: + case SF_S_ANT_IDX: { for (int k = 0; k < 6; k++) { @@ -1762,8 +1671,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_SPIDER */ - case 85: + case SF_S_SPIDER_IDX: { for (int k = 0; k < 6; k++) { @@ -1773,8 +1681,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_HOUND */ - case 86: + case SF_S_HOUND_IDX: { for (int k = 0; k < 6; k++) { @@ -1784,8 +1691,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_HYDRA */ - case 87: + case SF_S_HYDRA_IDX: { for (int k = 0; k < 6; k++) { @@ -1795,8 +1701,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_ANGEL */ - case 88: + case SF_S_ANGEL_IDX: { for (int k = 0; k < 1; k++) { @@ -1806,8 +1711,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_DEMON */ - case 89: + case SF_S_DEMON_IDX: { for (int k = 0; k < 1; k++) { @@ -1817,8 +1721,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_UNDEAD */ - case 90: + case SF_S_UNDEAD_IDX: { for (int k = 0; k < 1; k++) { @@ -1828,8 +1731,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_DRAGON */ - case 91: + case SF_S_DRAGON_IDX: { for (int k = 0; k < 1; k++) { @@ -1839,8 +1741,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_HI_UNDEAD */ - case 92: + case SF_S_HI_UNDEAD_IDX: { for (int k = 0; k < 8; k++) { @@ -1850,8 +1751,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_HI_DRAGON */ - case 93: + case SF_S_HI_DRAGON_IDX: { for (int k = 0; k < 8; k++) { @@ -1861,8 +1761,7 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - /* S_WRAITH */ - case 94: + case SF_S_WRAITH_IDX: { for (int k = 0; k < 8; k++) { @@ -1871,8 +1770,6 @@ static void apply_monster_power(monster_race const *r_ptr, int power) break; } - - /* 95 S_UNIQUE -- Not available */ } } diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 4b116596..7a0cd27a 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -3,6 +3,7 @@ #include "h-basic.h" #include "object_type_fwd.hpp" #include "monster_race_fwd.hpp" +#include "monster_power_fwd.hpp" #include extern bool_ is_magestaff(void); @@ -17,4 +18,4 @@ extern bool_ is_ok_spell(s32b spell_idx, s32b pval); extern s32b get_school_spell(cptr do_what, s16b force_book); extern void do_cmd_copy_spell(void); extern void cast_school_spell(void); -extern std::vector extract_monster_powers(monster_race const *r_ptr, bool great); +extern std::vector extract_monster_powers(monster_race const *r_ptr, bool great); diff --git a/src/cmd6.cc b/src/cmd6.cc index 387a236e..b1022bd1 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -25,6 +25,7 @@ #include "mimic.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -539,7 +540,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) */ /* Acid */ - if (r_ptr->flags4 & RF4_BR_ACID && brpow > 0) + if ((r_ptr->spells & SF_BR_ACID) && brpow > 0) { brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3)); @@ -554,13 +555,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } o_ptr->pval = 1; } - else if (r_ptr->flags4 & RF4_BR_ACID) + else if (r_ptr->spells & SF_BR_ACID) { set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10); } /* Electricity */ - if (r_ptr->flags4 & RF4_BR_ELEC && brpow > 0) + if ((r_ptr->spells & SF_BR_ELEC) && brpow > 0) { brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3)); @@ -576,13 +577,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) o_ptr->weight = o_ptr->weight - brpow; o_ptr->pval = o_ptr->weight; } - else if (r_ptr->flags4 & RF4_BR_ELEC) + else if (r_ptr->spells & SF_BR_ELEC) { set_oppose_elec(p_ptr->oppose_elec + rand_int(10) + 10); } /* Fire */ - if (r_ptr->flags4 & RF4_BR_FIRE && brpow > 0) + if ((r_ptr->spells & SF_BR_FIRE) && brpow > 0) { brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3)); @@ -597,13 +598,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } o_ptr->pval = 1; } - else if (r_ptr->flags4 & RF4_BR_FIRE) + else if (r_ptr->spells & SF_BR_FIRE) { set_oppose_fire(p_ptr->oppose_fire + rand_int(10) + 10); } /* Cold */ - if (r_ptr->flags4 & RF4_BR_COLD && brpow > 0) + if ((r_ptr->spells & SF_BR_COLD) && brpow > 0) { brdam = ((brpow / 3) > 1600 ? 1600 : (brpow / 3)); @@ -619,13 +620,13 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) o_ptr->weight = o_ptr->weight - brpow; o_ptr->pval = o_ptr->weight; } - else if (r_ptr->flags4 & RF4_BR_COLD) + else if (r_ptr->spells & SF_BR_COLD) { set_oppose_cold(p_ptr->oppose_cold + rand_int(10) + 10); } /* Poison */ - if (r_ptr->flags4 & RF4_BR_POIS && brpow > 0) + if ((r_ptr->spells & SF_BR_POIS) && brpow > 0) { brdam = ((brpow / 3) > 800 ? 800 : (brpow / 3)); @@ -648,7 +649,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Nether */ - if (r_ptr->flags4 & RF4_BR_NETH && brpow > 0) + if ((r_ptr->spells & SF_BR_NETH) && brpow > 0) { brdam = ((brpow / 6) > 550 ? 550 : (brpow / 6)); @@ -685,7 +686,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Confusion */ - if (r_ptr->flags4 & RF4_BR_CONF && brpow > 0) + if ((r_ptr->spells & SF_BR_CONF) && brpow > 0) { msg_print("A strange liquid splashes on you!"); @@ -698,7 +699,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Chaos */ - if (r_ptr->flags4 & RF4_BR_CHAO && brpow > 0) + if ((r_ptr->spells & SF_BR_CHAO) && brpow > 0) { brdam = ((brpow / 6) > 600 ? 600 : (brpow / 6)); @@ -744,7 +745,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Disenchantment */ - if (r_ptr->flags4 & RF4_BR_DISE && brpow > 0) + if ((r_ptr->spells & SF_BR_DISE) && brpow > 0) { brdam = ((brpow / 6) > 500 ? 500 : (brpow / 6)); @@ -766,7 +767,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Plasma */ - if (r_ptr->flags4 & RF4_BR_PLAS && brpow > 0) + if ((r_ptr->spells & SF_BR_PLAS) && brpow > 0) { brdam = ((brpow / 6) > 150 ? 150 : (brpow / 6)); @@ -880,27 +881,27 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) { (void)set_confused(0); } - if (r_ptr->flags6 & RF6_S_THUNDERLORD) + if (r_ptr->spells & SF_S_THUNDERLORD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_THUNDERLORD, FALSE); } - if (r_ptr->flags6 & RF6_S_DEMON) + if (r_ptr->spells & SF_S_DEMON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON, FALSE); } - if (r_ptr->flags6 & RF6_S_KIN) + if (r_ptr->spells & SF_S_KIN) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_KIN, FALSE); } - if (r_ptr->flags6 & RF6_S_HI_DEMON) + if (r_ptr->spells & SF_S_HI_DEMON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DEMON, FALSE); } - if (r_ptr->flags6 & RF6_S_MONSTER) + if (r_ptr->spells & SF_S_MONSTER) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, FALSE); } - if (r_ptr->flags6 & RF6_S_MONSTERS) + if (r_ptr->spells & SF_S_MONSTERS) { int k; for (k = 0; k < 8; k++) @@ -908,47 +909,47 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, 0, FALSE); } } - if (r_ptr->flags6 & RF6_S_UNDEAD) + if (r_ptr->spells & SF_S_UNDEAD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD, FALSE); } - if (r_ptr->flags6 & RF6_S_DRAGON) + if (r_ptr->spells & SF_S_DRAGON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON, FALSE); } - if (r_ptr->flags6 & RF6_S_ANT) + if (r_ptr->spells & SF_S_ANT) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT, FALSE); } - if (r_ptr->flags6 & RF6_S_SPIDER) + if (r_ptr->spells & SF_S_SPIDER) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER, FALSE); } - if (r_ptr->flags6 & RF6_S_HOUND) + if (r_ptr->spells & SF_S_HOUND) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND, FALSE); } - if (r_ptr->flags6 & RF6_S_HYDRA) + if (r_ptr->spells & SF_S_HYDRA) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA, FALSE); } - if (r_ptr->flags6 & RF6_S_ANGEL) + if (r_ptr->spells & SF_S_ANGEL) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL, FALSE); } - if (r_ptr->flags6 & RF6_S_HI_DRAGON) + if (r_ptr->spells & SF_S_HI_DRAGON) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON, FALSE); } - if (r_ptr->flags6 & RF6_S_HI_UNDEAD) + if (r_ptr->spells & SF_S_HI_UNDEAD) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD, FALSE); } - if (r_ptr->flags6 & RF6_S_WRAITH) + if (r_ptr->spells & SF_S_WRAITH) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH, FALSE); } - if (r_ptr->flags6 & RF6_S_UNIQUE) + if (r_ptr->spells & SF_S_UNIQUE) { summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE, FALSE); } diff --git a/src/defines.h b/src/defines.h index a809f8d3..942675b5 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2736,114 +2736,6 @@ #define RF3_NO_CONF 0x40000000 /* Cannot be confused */ #define RF3_NO_SLEEP 0x80000000 /* Cannot be slept */ -/* - * New monster race bit flags - */ -#define RF4_SHRIEK 0x00000001 /* Shriek for help */ -#define RF4_MULTIPLY 0x00000002 /* Monster reproduces */ -#define RF4_S_ANIMAL 0x00000004 /* Summon animals */ -#define RF4_ROCKET 0x00000008 /* TY: Rocket */ -#define RF4_ARROW_1 0x00000010 /* Fire an arrow (light) */ -#define RF4_ARROW_2 0x00000020 /* Fire an arrow (heavy) */ -#define RF4_ARROW_3 0x00000040 /* Fire missiles (light) */ -#define RF4_ARROW_4 0x00000080 /* Fire missiles (heavy) */ -#define RF4_BR_ACID 0x00000100 /* Breathe Acid */ -#define RF4_BR_ELEC 0x00000200 /* Breathe Elec */ -#define RF4_BR_FIRE 0x00000400 /* Breathe Fire */ -#define RF4_BR_COLD 0x00000800 /* Breathe Cold */ -#define RF4_BR_POIS 0x00001000 /* Breathe Poison */ -#define RF4_BR_NETH 0x00002000 /* Breathe Nether */ -#define RF4_BR_LITE 0x00004000 /* Breathe Lite */ -#define RF4_BR_DARK 0x00008000 /* Breathe Dark */ -#define RF4_BR_CONF 0x00010000 /* Breathe Confusion */ -#define RF4_BR_SOUN 0x00020000 /* Breathe Sound */ -#define RF4_BR_CHAO 0x00040000 /* Breathe Chaos */ -#define RF4_BR_DISE 0x00080000 /* Breathe Disenchant */ -#define RF4_BR_NEXU 0x00100000 /* Breathe Nexus */ -#define RF4_BR_TIME 0x00200000 /* Breathe Time */ -#define RF4_BR_INER 0x00400000 /* Breathe Inertia */ -#define RF4_BR_GRAV 0x00800000 /* Breathe Gravity */ -#define RF4_BR_SHAR 0x01000000 /* Breathe Shards */ -#define RF4_BR_PLAS 0x02000000 /* Breathe Plasma */ -#define RF4_BR_WALL 0x04000000 /* Breathe Force */ -#define RF4_BR_MANA 0x08000000 /* Breathe Mana */ -#define RF4_BA_NUKE 0x10000000 /* TY: Nuke Ball */ -#define RF4_BR_NUKE 0x20000000 /* TY: Toxic Breath */ -#define RF4_BA_CHAO 0x40000000 /* Chaos Ball */ -#define RF4_BR_DISI 0x80000000 /* Breathe Disintegration */ - -/* - * New monster race bit flags - */ -#define RF5_BA_ACID 0x00000001 /* Acid Ball */ -#define RF5_BA_ELEC 0x00000002 /* Elec Ball */ -#define RF5_BA_FIRE 0x00000004 /* Fire Ball */ -#define RF5_BA_COLD 0x00000008 /* Cold Ball */ -#define RF5_BA_POIS 0x00000010 /* Poison Ball */ -#define RF5_BA_NETH 0x00000020 /* Nether Ball */ -#define RF5_BA_WATE 0x00000040 /* Water Ball */ -#define RF5_BA_MANA 0x00000080 /* Mana Storm */ -#define RF5_BA_DARK 0x00000100 /* Darkness Storm */ -#define RF5_DRAIN_MANA 0x00000200 /* Drain Mana */ -#define RF5_MIND_BLAST 0x00000400 /* Blast Mind */ -#define RF5_BRAIN_SMASH 0x00000800 /* Smash Brain */ -#define RF5_CAUSE_1 0x00001000 /* Cause Light Wound */ -#define RF5_CAUSE_2 0x00002000 /* Cause Serious Wound */ -#define RF5_CAUSE_3 0x00004000 /* Cause Critical Wound */ -#define RF5_CAUSE_4 0x00008000 /* Cause Mortal Wound */ -#define RF5_BO_ACID 0x00010000 /* Acid Bolt */ -#define RF5_BO_ELEC 0x00020000 /* Elec Bolt (unused) */ -#define RF5_BO_FIRE 0x00040000 /* Fire Bolt */ -#define RF5_BO_COLD 0x00080000 /* Cold Bolt */ -#define RF5_BO_POIS 0x00100000 /* Poison Bolt (unused) */ -#define RF5_BO_NETH 0x00200000 /* Nether Bolt */ -#define RF5_BO_WATE 0x00400000 /* Water Bolt */ -#define RF5_BO_MANA 0x00800000 /* Mana Bolt */ -#define RF5_BO_PLAS 0x01000000 /* Plasma Bolt */ -#define RF5_BO_ICEE 0x02000000 /* Ice Bolt */ -#define RF5_MISSILE 0x04000000 /* Magic Missile */ -#define RF5_SCARE 0x08000000 /* Frighten Player */ -#define RF5_BLIND 0x10000000 /* Blind Player */ -#define RF5_CONF 0x20000000 /* Confuse Player */ -#define RF5_SLOW 0x40000000 /* Slow Player */ -#define RF5_HOLD 0x80000000 /* Paralyze Player */ - -/* - * New monster race bit flags - */ -#define RF6_HASTE 0x00000001 /* Speed self */ -#define RF6_HAND_DOOM 0x00000002 /* Hand of Doom */ -#define RF6_HEAL 0x00000004 /* Heal self */ -#define RF6_S_ANIMALS 0x00000008 /* Summon animals */ -#define RF6_BLINK 0x00000010 /* Teleport Short */ -#define RF6_TPORT 0x00000020 /* Teleport Long */ -#define RF6_TELE_TO 0x00000040 /* Move player to monster */ -#define RF6_TELE_AWAY 0x00000080 /* Move player far away */ -#define RF6_TELE_LEVEL 0x00000100 /* Move player vertically */ -#define RF6_DARKNESS 0x00000200 /* Create Darkness */ -#define RF6_TRAPS 0x00000400 /* Create Traps */ -#define RF6_FORGET 0x00000800 /* Cause amnesia */ -#define RF6_RAISE_DEAD 0x00001000 /* Raise Dead */ -#define RF6_S_BUG 0x00002000 /* Summon Software bug */ -#define RF6_S_RNG 0x00004000 /* Summon RNG */ -#define RF6_S_THUNDERLORD 0x00008000 /* Summon Thunderlords */ -#define RF6_S_KIN 0x00010000 /* Summon "kin" */ -#define RF6_S_HI_DEMON 0x00020000 /* Summon greater demons! */ -#define RF6_S_MONSTER 0x00040000 /* Summon Monster */ -#define RF6_S_MONSTERS 0x00080000 /* Summon Monsters */ -#define RF6_S_ANT 0x00100000 /* Summon Ants */ -#define RF6_S_SPIDER 0x00200000 /* Summon Spiders */ -#define RF6_S_HOUND 0x00400000 /* Summon Hounds */ -#define RF6_S_HYDRA 0x00800000 /* Summon Hydras */ -#define RF6_S_ANGEL 0x01000000 /* Summon Angel */ -#define RF6_S_DEMON 0x02000000 /* Summon Demon */ -#define RF6_S_UNDEAD 0x04000000 /* Summon Undead */ -#define RF6_S_DRAGON 0x08000000 /* Summon Dragon */ -#define RF6_S_HI_UNDEAD 0x10000000 /* Summon Greater Undead */ -#define RF6_S_HI_DRAGON 0x20000000 /* Summon Ancient Dragon */ -#define RF6_S_WRAITH 0x40000000 /* Summon Unique Wraith */ -#define RF6_S_UNIQUE 0x80000000 /* Summon Unique Monster */ - /* * New monster race bit flags */ @@ -2913,57 +2805,6 @@ #define RF9_NEVER_GENE 0x00004000 /* The monster cannot be normaly generated */ -/* - * Hack -- choose "intelligent" spells when desperate - */ - -#define RF4_INT_MASK \ - (RF4_S_ANIMAL) - -#define RF5_INT_MASK \ - (RF5_HOLD | RF5_SLOW | RF5_CONF | RF5_BLIND | RF5_SCARE) - -#define RF6_INT_MASK \ - (RF6_BLINK | RF6_TPORT | RF6_TELE_LEVEL | RF6_TELE_AWAY | \ - RF6_HEAL | RF6_HASTE | RF6_TRAPS | \ - RF6_S_KIN | RF6_S_HI_DEMON | RF6_S_MONSTER | RF6_S_MONSTERS | \ - RF6_S_ANT | RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | \ - RF6_S_ANGEL | RF6_S_DRAGON | RF6_S_UNDEAD | RF6_S_DEMON | \ - RF6_S_HI_DRAGON | RF6_S_HI_UNDEAD | RF6_S_WRAITH | RF6_S_UNIQUE | \ - RF6_S_THUNDERLORD | RF6_S_BUG | RF6_S_RNG | RF6_S_ANIMALS) - - -/* - * Hack -- "bolt" spells that may hurt fellow monsters - */ -#define RF4_BOLT_MASK \ - (RF4_ARROW_1 | RF4_ARROW_2 | RF4_ARROW_3 | RF4_ARROW_4) - -#define RF5_BOLT_MASK \ - (RF5_BO_ACID | RF5_BO_ELEC | RF5_BO_FIRE | RF5_BO_COLD | \ - RF5_BO_POIS | RF5_BO_NETH | RF5_BO_WATE | RF5_BO_MANA | \ - RF5_BO_PLAS | RF5_BO_ICEE | RF5_MISSILE) - -#define RF6_BOLT_MASK \ - 0L - - -/* Hack -- summon spells */ - -#define RF4_SUMMON_MASK \ - (RF4_S_ANIMAL) - -#define RF5_SUMMON_MASK \ - 0L - -#define RF6_SUMMON_MASK \ - (RF6_S_KIN | RF6_S_HI_DEMON | RF6_S_MONSTER | RF6_S_MONSTERS | RF6_S_ANT | \ - RF6_S_SPIDER | RF6_S_HOUND | RF6_S_HYDRA | RF6_S_ANGEL | RF6_S_DEMON | \ - RF6_S_UNDEAD | RF6_S_DRAGON | RF6_S_HI_UNDEAD | RF6_S_HI_DRAGON | \ - RF6_S_WRAITH | RF6_S_UNIQUE | RF6_S_THUNDERLORD | RF6_S_BUG | RF6_S_RNG | \ - RF6_S_ANIMALS) - - /*** Macro Definitions ***/ diff --git a/src/flag_set.hpp b/src/flag_set.hpp index 2e5d46ea..b4bdc92f 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -15,6 +15,9 @@ private: static constexpr std::size_t tiers = Tiers; std::uint32_t m_data[tiers]; +public: + static constexpr const std::size_t nbits = tiers * 32; + public: constexpr flag_set() @@ -81,6 +84,12 @@ public: return !empty(); } + constexpr bool bit(std::size_t i) const + { + assert(i < nbits); + return (m_data[i / 32] & (1UL << (i % 32))); + } + flag_set &operator |= (flag_set const &other) { for (std::size_t i = 0; i < tiers; i++) diff --git a/src/generate.cc b/src/generate.cc index dc5005d0..ed35035c 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -21,6 +21,7 @@ #include "loadsave.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -2856,33 +2857,6 @@ static bool_ vault_aux_giant(int r_idx) } -/* - * Hack -- breath type for "vault_aux_dragon()" - */ -static u32b vault_aux_dragon_mask4; - - -/* - * Helper function for "monster pit (dragon)" - */ -static bool_ vault_aux_dragon(int r_idx) -{ - monster_race *r_ptr = &r_info[r_idx]; - - /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); - - /* Hack -- Require "d" or "D" monsters */ - if (!strchr("Dd", r_ptr->d_char)) return (FALSE); - - /* Hack -- Require correct "breath attack" */ - if (r_ptr->flags4 != vault_aux_dragon_mask4) return (FALSE); - - /* Okay */ - return (TRUE); -} - - /* * Helper function for "monster pit (demon)" */ @@ -3283,93 +3257,71 @@ static void build_type6(int by0, int bx0) /* Dragon pit */ else if (tmp < 80) { + /* Hack - get_mon_num_hook needs a plain function */ + static monster_spell_flag_set mask; + /* Pick dragon type */ switch (rand_int(6)) { - /* Black */ case 0: { - /* Message */ name = "acid dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = RF4_BR_ACID; - - /* Done */ + mask = SF_BR_ACID; break; } - - /* Blue */ case 1: { - /* Message */ name = "electric dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = RF4_BR_ELEC; - - /* Done */ + mask = SF_BR_ELEC; break; } - /* Red */ case 2: { - /* Message */ name = "fire dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = RF4_BR_FIRE; - - /* Done */ + mask = SF_BR_FIRE; break; } - /* White */ case 3: { - /* Message */ name = "cold dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = RF4_BR_COLD; - - /* Done */ + mask = SF_BR_COLD; break; } - /* Green */ case 4: { - /* Message */ name = "poison dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = RF4_BR_POIS; - - /* Done */ + mask = SF_BR_POIS; break; } - /* Multi-hued */ default: { - /* Message */ name = "multi-hued dragon"; - - /* Restrict dragon breath type */ - vault_aux_dragon_mask4 = (RF4_BR_ACID | RF4_BR_ELEC | - RF4_BR_FIRE | RF4_BR_COLD | - RF4_BR_POIS); - - /* Done */ + mask = SF_BR_ACID | SF_BR_ELEC | SF_BR_FIRE | SF_BR_COLD | SF_BR_POIS; break; } } /* Restrict monster selection */ - get_mon_num_hook = vault_aux_dragon; + get_mon_num_hook = [](int r_idx) -> bool_ { + monster_race *r_ptr = &r_info[r_idx]; + + /* Decline unique monsters */ + if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + + /* Hack -- Require "d" or "D" monsters */ + if (!strchr("Dd", r_ptr->d_char)) return (FALSE); + + /* Hack -- Require correct "breath attack" */ + if ((r_ptr->spells & mask) != mask) return (FALSE); + + /* Okay */ + return (TRUE); + }; } /* Demon pit */ diff --git a/src/init1.cc b/src/init1.cc index cfd767f8..3b94adb5 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -16,6 +16,7 @@ #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_spell.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -268,124 +269,6 @@ static cptr r_info_flags3[] = "NO_SLEEP" }; -/* - * Monster race flags - */ -static cptr r_info_flags4[] = -{ - "SHRIEK", - "MULTIPLY", - "S_ANIMAL", - "ROCKET", - "ARROW_1", - "ARROW_2", - "ARROW_3", - "ARROW_4", - "BR_ACID", - "BR_ELEC", - "BR_FIRE", - "BR_COLD", - "BR_POIS", - "BR_NETH", - "BR_LITE", - "BR_DARK", - "BR_CONF", - "BR_SOUN", - "BR_CHAO", - "BR_DISE", - "BR_NEXU", - "BR_TIME", - "BR_INER", - "BR_GRAV", - "BR_SHAR", - "BR_PLAS", - "BR_WALL", - "BR_MANA", - "BA_NUKE", - "BR_NUKE", - "BA_CHAO", - "BR_DISI", -}; - -/* - * Monster race flags - */ -static cptr r_info_flags5[] = -{ - "BA_ACID", - "BA_ELEC", - "BA_FIRE", - "BA_COLD", - "BA_POIS", - "BA_NETH", - "BA_WATE", - "BA_MANA", - "BA_DARK", - "DRAIN_MANA", - "MIND_BLAST", - "BRAIN_SMASH", - "CAUSE_1", - "CAUSE_2", - "CAUSE_3", - "CAUSE_4", - "BO_ACID", - "BO_ELEC", - "BO_FIRE", - "BO_COLD", - "BO_POIS", - "BO_NETH", - "BO_WATE", - "BO_MANA", - "BO_PLAS", - "BO_ICEE", - "MISSILE", - "SCARE", - "BLIND", - "CONF", - "SLOW", - "HOLD" -}; - -/* - * Monster race flags - */ -static cptr r_info_flags6[] = -{ - "HASTE", - "HAND_DOOM", - "HEAL", - "S_ANIMALS", - "BLINK", - "TPORT", - "TELE_TO", - "TELE_AWAY", - "TELE_LEVEL", - "DARKNESS", - "TRAPS", - "FORGET", - "ANIM_DEAD", /* ToDo: Implement ANIM_DEAD */ - "S_BUG", - "S_RNG", - "S_THUNDERLORD", /* DG : Summon Thunderlord */ - "S_KIN", - "S_HI_DEMON", - "S_MONSTER", - "S_MONSTERS", - "S_ANT", - "S_SPIDER", - "S_HOUND", - "S_HYDRA", - "S_ANGEL", - "S_DEMON", - "S_UNDEAD", - "S_DRAGON", - "S_HI_UNDEAD", - "S_HI_DRAGON", - "S_WRAITH", - "S_UNIQUE" -}; - - /* * Monster race flags */ @@ -5488,14 +5371,15 @@ static errr grab_one_basic_flag(monster_race *r_ptr, cptr what) /* * Grab one (spell) flag in a monster_race from a textual string */ -static errr grab_one_spell_flag(monster_race *r_ptr, cptr what) +static errr grab_one_monster_spell_flag(monster_spell_flag_set *flags, cptr what) { - if (lookup_flags(what, - flag_tie(&r_ptr->flags4, r_info_flags4), - flag_tie(&r_ptr->flags5, r_info_flags5), - flag_tie(&r_ptr->flags6, r_info_flags6))) + for (auto const &monster_spell: monster_spells()) { - return (0); + if (streq(what, monster_spell->name)) + { + *flags |= monster_spell->flag_set; + return 0; + } } /* Oops */ @@ -5823,7 +5707,7 @@ errr init_r_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_spell_flag(r_ptr, s)) + if (0 != grab_one_monster_spell_flag(&r_ptr->spells, s)) { return (5); } @@ -5886,32 +5770,6 @@ static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) } -/* - * Grab one (spell) flag in a monster_race from a textual string - */ -static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) -{ - /* Dispatch to correct set of flags */ - u32b *f4 = add ? &re_ptr->mflags4 : &re_ptr->nflags4; - u32b *f5 = add ? &re_ptr->mflags5 : &re_ptr->nflags5; - u32b *f6 = add ? &re_ptr->mflags6 : &re_ptr->nflags6; - - /* Lookup */ - if (lookup_flags(what, - flag_tie(f4, r_info_flags4), - flag_tie(f5, r_info_flags5), - flag_tie(f6, r_info_flags6))) - { - return (0); - } - - /* Oops */ - msg_format("Unknown monster flag '%s'.", what); - - /* Failure */ - return (1); -} - /* * Grab one (basic) flag in a monster_race from a textual string */ @@ -6278,7 +6136,7 @@ errr init_re_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_spell_ego_flag(re_ptr, s, TRUE)) + if (0 != grab_one_monster_spell_flag(&re_ptr->mspells, s)) { return (5); } @@ -6308,7 +6166,7 @@ errr init_re_info_txt(FILE *fp) if (!strcmp(s, "MF_ALL")) { /* No flags */ - re_ptr->nflags4 = re_ptr->nflags5 = re_ptr->nflags6 = 0xFFFFFFFF; + re_ptr->nspells = ~monster_spell_flag_set(); /* Start at next entry */ s = t; @@ -6318,7 +6176,7 @@ errr init_re_info_txt(FILE *fp) } /* Parse this entry */ - if (0 != grab_one_spell_ego_flag(re_ptr, s, FALSE)) return (5); + if (0 != grab_one_monster_spell_flag(&re_ptr->nspells, s)) return (5); /* Start the next entry */ s = t; @@ -6548,26 +6406,6 @@ static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byt } -/* - * Grab one (spell) flag in a monster_race from a textual string - */ -static errr grab_one_spell_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule) -{ - if (lookup_flags(what, - flag_tie(&d_ptr->rules[rule].mflags4, r_info_flags4), - flag_tie(&d_ptr->rules[rule].mflags5, r_info_flags5), - flag_tie(&d_ptr->rules[rule].mflags6, r_info_flags6))) - { - return 0; - } - - /* Oops */ - msg_format("Unknown monster flag '%s'.", what); - - /* Failure */ - return (1); -} - /* * Initialize the "d_info" array, by parsing an ascii "template" file */ @@ -7009,7 +6847,7 @@ errr init_d_info_txt(FILE *fp) s = buf + 2; /* Parse this entry */ - if (0 != grab_one_spell_monster_flag(d_ptr, s, rule_num)) + if (0 != grab_one_monster_spell_flag(&d_ptr->rules[rule_num].mspells, s)) { return (5); } diff --git a/src/melee2.cc b/src/melee2.cc index 83827dcf..3e03c8f6 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -28,6 +28,8 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_spell.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -301,16 +303,13 @@ static bool_ int_outof(std::shared_ptr r_ptr, int prob) /* * Remove the "bad" spells from a spell list */ -static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) +static void remove_bad_spells(int m_idx, monster_spell_flag_set *spells_p) { monster_type *m_ptr = &m_list[m_idx]; - - u32b f4 = (*f4p); - u32b f5 = (*f5p); - u32b f6 = (*f6p); - u32b smart = 0L; + // Shorthand + auto spells(*spells_p); /* Too stupid to know anything? */ auto const r_ptr = m_ptr->race(); @@ -338,201 +337,199 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p) if (smart & (SM_IMM_ACID)) { - if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_ACID; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_ACID; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ACID; + if (int_outof(r_ptr, 100)) spells &= ~SF_BR_ACID; + if (int_outof(r_ptr, 100)) spells &= ~SF_BA_ACID; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ACID; } else if ((smart & (SM_OPP_ACID)) && (smart & (SM_RES_ACID))) { - if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_ACID; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_ACID; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ACID; + if (int_outof(r_ptr, 80)) spells &= ~SF_BR_ACID; + if (int_outof(r_ptr, 80)) spells &= ~SF_BA_ACID; + if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ACID; } else if ((smart & (SM_OPP_ACID)) || (smart & (SM_RES_ACID))) { - if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_ACID; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_ACID; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ACID; + if (int_outof(r_ptr, 30)) spells &= ~SF_BR_ACID; + if (int_outof(r_ptr, 30)) spells &= ~SF_BA_ACID; + if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ACID; } if (smart & (SM_IMM_ELEC)) { - if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_ELEC; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_ELEC; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ELEC; + if (int_outof(r_ptr, 100)) spells &= ~SF_BR_ELEC; + if (int_outof(r_ptr, 100)) spells &= ~SF_BA_ELEC; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ELEC; } else if ((smart & (SM_OPP_ELEC)) && (smart & (SM_RES_ELEC))) { - if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_ELEC; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_ELEC; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ELEC; + if (int_outof(r_ptr, 80)) spells &= ~SF_BR_ELEC; + if (int_outof(r_ptr, 80)) spells &= ~SF_BA_ELEC; + if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ELEC; } else if ((smart & (SM_OPP_ELEC)) || (smart & (SM_RES_ELEC))) { - if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_ELEC; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_ELEC; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ELEC; + if (int_outof(r_ptr, 30)) spells &= ~SF_BR_ELEC; + if (int_outof(r_ptr, 30)) spells &= ~SF_BA_ELEC; + if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ELEC; } if (smart & (SM_IMM_FIRE)) { - if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_FIRE; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_FIRE; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_FIRE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BR_FIRE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BA_FIRE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_FIRE; } else if ((smart & (SM_OPP_FIRE)) && (smart & (SM_RES_FIRE))) { - if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_FIRE; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_FIRE; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_FIRE; + if (int_outof(r_ptr, 80)) spells &= ~SF_BR_FIRE; + if (int_outof(r_ptr, 80)) spells &= ~SF_BA_FIRE; + if (int_outof(r_ptr, 80)) spells &= ~SF_BO_FIRE; } else if ((smart & (SM_OPP_FIRE)) || (smart & (SM_RES_FIRE))) { - if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_FIRE; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_FIRE; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_FIRE; + if (int_outof(r_ptr, 30)) spells &= ~SF_BR_FIRE; + if (int_outof(r_ptr, 30)) spells &= ~SF_BA_FIRE; + if (int_outof(r_ptr, 30)) spells &= ~SF_BO_FIRE; } if (smart & (SM_IMM_COLD)) { - if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_COLD; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BA_COLD; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_COLD; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ICEE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BR_COLD; + if (int_outof(r_ptr, 100)) spells &= ~SF_BA_COLD; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_COLD; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ICEE; } else if ((smart & (SM_OPP_COLD)) && (smart & (SM_RES_COLD))) { - if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_COLD; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_COLD; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_COLD; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BO_ICEE; + if (int_outof(r_ptr, 80)) spells &= ~SF_BR_COLD; + if (int_outof(r_ptr, 80)) spells &= ~SF_BA_COLD; + if (int_outof(r_ptr, 80)) spells &= ~SF_BO_COLD; + if (int_outof(r_ptr, 80)) spells &= ~SF_BO_ICEE; } else if ((smart & (SM_OPP_COLD)) || (smart & (SM_RES_COLD))) { - if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_COLD; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_COLD; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_COLD; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BO_ICEE; + if (int_outof(r_ptr, 30)) spells &= ~SF_BR_COLD; + if (int_outof(r_ptr, 30)) spells &= ~SF_BA_COLD; + if (int_outof(r_ptr, 30)) spells &= ~SF_BO_COLD; + if (int_outof(r_ptr, 30)) spells &= ~SF_BO_ICEE; } if ((smart & (SM_OPP_POIS)) && (smart & (SM_RES_POIS))) { - if (int_outof(r_ptr, 80)) f4 &= ~RF4_BR_POIS; - if (int_outof(r_ptr, 80)) f5 &= ~RF5_BA_POIS; - if (int_outof(r_ptr, 40)) f4 &= ~RF4_BA_NUKE; - if (int_outof(r_ptr, 40)) f4 &= ~RF4_BR_NUKE; + if (int_outof(r_ptr, 80)) spells &= ~SF_BR_POIS; + if (int_outof(r_ptr, 80)) spells &= ~SF_BA_POIS; + if (int_outof(r_ptr, 40)) spells &= ~SF_BA_NUKE; + if (int_outof(r_ptr, 40)) spells &= ~SF_BR_NUKE; } else if ((smart & (SM_OPP_POIS)) || (smart & (SM_RES_POIS))) { - if (int_outof(r_ptr, 30)) f4 &= ~RF4_BR_POIS; - if (int_outof(r_ptr, 30)) f5 &= ~RF5_BA_POIS; + if (int_outof(r_ptr, 30)) spells &= ~SF_BR_POIS; + if (int_outof(r_ptr, 30)) spells &= ~SF_BA_POIS; } if (smart & (SM_RES_NETH)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_NETH; - if (int_outof(r_ptr, 50)) f5 &= ~RF5_BA_NETH; - if (int_outof(r_ptr, 50)) f5 &= ~RF5_BO_NETH; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_NETH; + if (int_outof(r_ptr, 50)) spells &= ~SF_BA_NETH; + if (int_outof(r_ptr, 50)) spells &= ~SF_BO_NETH; } if (smart & (SM_RES_LITE)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_LITE; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_LITE; } if (smart & (SM_RES_DARK)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_DARK; - if (int_outof(r_ptr, 50)) f5 &= ~RF5_BA_DARK; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_DARK; + if (int_outof(r_ptr, 50)) spells &= ~SF_BA_DARK; } if (smart & (SM_RES_FEAR)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_SCARE; + if (int_outof(r_ptr, 100)) spells &= ~SF_SCARE; } if (smart & (SM_RES_CONF)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_CONF; - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CONF; + if (int_outof(r_ptr, 100)) spells &= ~SF_CONF; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CONF; } if (smart & (SM_RES_CHAOS)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_CONF; - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CONF; - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_CHAO; - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BA_CHAO; + if (int_outof(r_ptr, 100)) spells &= ~SF_CONF; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CONF; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_CHAO; + if (int_outof(r_ptr, 50)) spells &= ~SF_BA_CHAO; } if (smart & (SM_RES_DISEN)) { - if (int_outof(r_ptr, 100)) f4 &= ~RF4_BR_DISE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BR_DISE; } if (smart & (SM_RES_BLIND)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BLIND; + if (int_outof(r_ptr, 100)) spells &= ~SF_BLIND; } if (smart & (SM_RES_NEXUS)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_NEXU; - if (int_outof(r_ptr, 50)) f6 &= ~RF6_TELE_LEVEL; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_NEXU; + if (int_outof(r_ptr, 50)) spells &= ~SF_TELE_LEVEL; } if (smart & (SM_RES_SOUND)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_SOUN; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_SOUN; } if (smart & (SM_RES_SHARD)) { - if (int_outof(r_ptr, 50)) f4 &= ~RF4_BR_SHAR; - if (int_outof(r_ptr, 20)) f4 &= ~RF4_ROCKET; + if (int_outof(r_ptr, 50)) spells &= ~SF_BR_SHAR; + if (int_outof(r_ptr, 20)) spells &= ~SF_ROCKET; } if (smart & (SM_IMM_REFLECT)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_COLD; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_FIRE; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ACID; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ELEC; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_POIS; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_NETH; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_WATE; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_MANA; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_PLAS; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_BO_ICEE; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_MISSILE; - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_1); - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_2); - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_3); - if (int_outof(r_ptr, 100)) f4 &= ~(RF4_ARROW_4); + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_COLD; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_FIRE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ACID; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ELEC; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_POIS; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_NETH; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_WATE; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_MANA; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_PLAS; + if (int_outof(r_ptr, 100)) spells &= ~SF_BO_ICEE; + if (int_outof(r_ptr, 100)) spells &= ~SF_MISSILE; + if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_1); + if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_2); + if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_3); + if (int_outof(r_ptr, 100)) spells &= ~(SF_ARROW_4); } if (smart & (SM_IMM_FREE)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_HOLD; - if (int_outof(r_ptr, 100)) f5 &= ~RF5_SLOW; + if (int_outof(r_ptr, 100)) spells &= ~SF_HOLD; + if (int_outof(r_ptr, 100)) spells &= ~SF_SLOW; } if (smart & (SM_IMM_MANA)) { - if (int_outof(r_ptr, 100)) f5 &= ~RF5_DRAIN_MANA; + if (int_outof(r_ptr, 100)) spells &= ~SF_DRAIN_MANA; } /* XXX XXX XXX No spells left? */ /* if (!f4 && !f5 && !f6) ... */ - (*f4p) = f4; - (*f5p) = f5; - (*f6p) = f6; + *spells_p = spells; } @@ -628,117 +625,70 @@ static void bolt(int m_idx, int typ, int dam_hp) /* - * Return TRUE if a spell is good for hurting the player (directly). - */ -static bool_ spell_attack(byte spell) -{ - /* All RF4 spells hurt (except for shriek, multiply, summon animal) */ - if (spell >= 96 + 3 && spell <= 96 + 31) return (TRUE); - - /* Various "ball" spells */ - if (spell >= 128 && spell <= 128 + 8) return (TRUE); - - /* "Cause wounds" and "bolt" spells */ - if (spell >= 128 + 12 && spell <= 128 + 26) return (TRUE); - - /* Hand of Doom */ - if (spell == 160 + 1) return (TRUE); - - /* Doesn't hurt */ - return (FALSE); -} - - -/* - * Return TRUE if a spell is good for escaping. - */ -static bool_ spell_escape(byte spell) -{ - /* Blink or Teleport */ - if (spell == 160 + 4 || spell == 160 + 5) return (TRUE); - - /* Teleport the player away */ - if (spell == 160 + 7 || spell == 160 + 8) return (TRUE); - - /* Isn't good for escaping */ - return (FALSE); -} - -/* - * Return TRUE if a spell is good for annoying the player. - */ -static bool_ spell_annoy(byte spell) -{ - /* Shriek */ - if (spell == 96 + 0) return (TRUE); - - /* Brain smash, et al (added curses) */ - if (spell >= 128 + 9 && spell <= 128 + 14) return (TRUE); - - /* Scare, confuse, blind, slow, paralyze */ - if (spell >= 128 + 27 && spell <= 128 + 31) return (TRUE); - - /* Teleport to */ - if (spell == 160 + 6) return (TRUE); - - /* Darkness, make traps, cause amnesia */ - if (spell >= 160 + 9 && spell <= 160 + 11) return (TRUE); - - /* Doesn't annoy */ - return (FALSE); -} - -/* - * Return TRUE if a spell summons help. + * Calculate the mask for "bolt" spells */ -static bool_ spell_summon(byte spell) +static monster_spell_flag_set compute_bolt_mask() { - /* RF4_S_ANIMAL, RF6_S_ANIMALS */ - if (spell == 96 + 2 || spell == 160 + 3) return (TRUE); - /* All other summon spells */ - if (spell >= 160 + 13 && spell <= 160 + 31) return (TRUE); - - /* Doesn't summon */ - return (FALSE); + monster_spell_flag_set flags; + for (auto const &monster_spell: monster_spells()) + { + if (monster_spell->is_bolt) + { + flags |= monster_spell->flag_set; + } + } + return flags; } /* - * Return TRUE if a spell is good in a tactical situation. + * Calculate mask for summoning spells */ -static bool_ spell_tactic(byte spell) +static monster_spell_flag_set compute_summoning_mask() { - /* Blink */ - if (spell == 160 + 4) return (TRUE); - - /* Not good */ - return (FALSE); + monster_spell_flag_set flags; + for (auto const &monster_spell: monster_spells()) + { + if (monster_spell->is_summon) + { + flags |= monster_spell->flag_set; + } + } + return flags; } /* - * Return TRUE if a spell hastes. + * Calculate mask for spells requiring SMART flag */ -static bool_ spell_haste(byte spell) +static monster_spell_flag_set compute_smart_mask() { - /* Haste self */ - if (spell == 160 + 0) return (TRUE); - - /* Not a haste spell */ - return (FALSE); + monster_spell_flag_set flags; + for (auto const &monster_spell: monster_spells()) + { + if (monster_spell->is_smart) + { + flags |= monster_spell->flag_set; + } + } + return flags; } /* - * Return TRUE if a spell is good for healing. + * Calculate mask for spells requiring SMART flag */ -static bool_ spell_heal(byte spell) +static monster_spell_flag_set compute_innate_mask() { - /* Heal */ - if (spell == 160 + 2) return (TRUE); - - /* No healing */ - return (FALSE); + monster_spell_flag_set flags; + for (auto const &monster_spell: monster_spells()) + { + if (monster_spell->is_innate) + { + flags |= monster_spell->flag_set; + } + } + return flags; } @@ -756,49 +706,71 @@ static bool_ spell_heal(byte spell) * * This function may well be an efficiency bottleneck. */ -static int choose_attack_spell(int m_idx, byte spells[], byte num) +static monster_spell const *choose_attack_spell(int m_idx, std::vector const &spells) { monster_type *m_ptr = &m_list[m_idx]; - byte escape[96], escape_num = 0; - byte attack[96], attack_num = 0; - byte summon[96], summon_num = 0; - byte tactic[96], tactic_num = 0; - byte annoy[96], annoy_num = 0; - byte haste[96], haste_num = 0; - byte heal[96], heal_num = 0; - /* Stupid monsters choose randomly */ auto const r_ptr = m_ptr->race(); if (r_ptr->flags2 & RF2_STUPID) { /* Pick at random */ - return (spells[rand_int(num)]); + return spells[rand_int(spells.size())]; } + /* Spells by category */ + std::vector escape; escape.reserve(spells.size()); + std::vector attack; attack.reserve(spells.size()); + std::vector summon; summon.reserve(spells.size()); + std::vector tactic; tactic.reserve(spells.size()); + std::vector annoy ; annoy.reserve(spells.size()); + std::vector haste ; haste.reserve(spells.size()); + std::vector heal ; heal.reserve(spells.size()); + /* Categorize spells */ - for (int i = 0; i < num; i++) + for (std::size_t i = 0; i < spells.size(); i++) { /* Escape spell? */ - if (spell_escape(spells[i])) escape[escape_num++] = spells[i]; + if (spells[i]->is_escape) + { + escape.push_back(spells[i]); + } /* Attack spell? */ - if (spell_attack(spells[i])) attack[attack_num++] = spells[i]; + if (spells[i]->is_damage) + { + attack.push_back(spells[i]); + } /* Summon spell? */ - if (spell_summon(spells[i])) summon[summon_num++] = spells[i]; + if (spells[i]->is_summon) + { + summon.push_back(spells[i]); + } /* Tactical spell? */ - if (spell_tactic(spells[i])) tactic[tactic_num++] = spells[i]; + if (spells[i]->is_tactic) + { + tactic.push_back(spells[i]); + } /* Annoyance spell? */ - if (spell_annoy(spells[i])) annoy[annoy_num++] = spells[i]; + if (spells[i]->is_annoy) + { + annoy.push_back(spells[i]); + } /* Haste spell? */ - if (spell_haste(spells[i])) haste[haste_num++] = spells[i]; + if (spells[i]->is_haste) + { + haste.push_back(spells[i]); + } /* Heal spell? */ - if (spell_heal(spells[i])) heal[heal_num++] = spells[i]; + if (spells[i]->is_heal) + { + heal.push_back(spells[i]); + } } /*** Try to pick an appropriate spell type ***/ @@ -806,68 +778,59 @@ static int choose_attack_spell(int m_idx, byte spells[], byte num) /* Hurt badly or afraid, attempt to flee */ if ((m_ptr->hp < m_ptr->maxhp / 3) || m_ptr->monfear) { - /* Choose escape spell if possible */ - if (escape_num) return (escape[rand_int(escape_num)]); + if (!escape.empty()) return escape[rand_int(escape.size())]; } /* Still hurt badly, couldn't flee, attempt to heal */ if (m_ptr->hp < m_ptr->maxhp / 3) { - /* Choose heal spell if possible */ - if (heal_num) return (heal[rand_int(heal_num)]); + if (!heal.empty()) return heal[rand_int(heal.size())]; } /* Player is close and we have attack spells, blink away */ - if ((distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 4) && attack_num && (rand_int(100) < 75)) + if ((distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 4) && !attack.empty() && (rand_int(100) < 75)) { - /* Choose tactical spell */ - if (tactic_num) return (tactic[rand_int(tactic_num)]); + if (!tactic.empty()) return tactic[rand_int(tactic.size())]; } /* We're hurt (not badly), try to heal */ if ((m_ptr->hp < m_ptr->maxhp * 3 / 4) && (rand_int(100) < 75)) { - /* Choose heal spell if possible */ - if (heal_num) return (heal[rand_int(heal_num)]); + if (!heal.empty()) return heal[rand_int(heal.size())]; } /* Summon if possible (sometimes) */ - if (summon_num && (rand_int(100) < 50)) + if (!summon.empty() && (rand_int(100) < 50)) { - /* Choose summon spell */ - return (summon[rand_int(summon_num)]); + return summon[rand_int(summon.size())]; } /* Attack spell (most of the time) */ - if (attack_num && (rand_int(100) < 85)) + if (!attack.empty() && (rand_int(100) < 85)) { - /* Choose attack spell */ - return (attack[rand_int(attack_num)]); + return attack[rand_int(attack.size())]; } /* Try another tactical spell (sometimes) */ - if (tactic_num && (rand_int(100) < 50)) + if (!tactic.empty() && (rand_int(100) < 50)) { - /* Choose tactic spell */ - return (tactic[rand_int(tactic_num)]); + return tactic[rand_int(tactic.size())]; } /* Haste self if we aren't already somewhat hasted (rarely) */ - if (haste_num && (rand_int(100) < (20 + m_ptr->speed - m_ptr->mspeed))) + if (!haste.empty() && (rand_int(100) < (20 + m_ptr->speed - m_ptr->mspeed))) { - /* Choose haste spell */ - return (haste[rand_int(haste_num)]); + return haste[rand_int(haste.size())]; } /* Annoy player (most of the time) */ - if (annoy_num && (rand_int(100) < 85)) + if (!annoy.empty() && (rand_int(100) < 85)) { - /* Choose annoyance spell */ - return (annoy[rand_int(annoy_num)]); + return annoy[rand_int(annoy.size())]; } /* Choose no spell */ - return (0); + return nullptr; } @@ -981,6 +944,24 @@ void cmonster_msg(char a, cptr fmt, ...) } } +/** + * Extract list of spell indexes from a flag set. + */ +static std::vector extract_spells(monster_spell_flag_set const &spell_flag_set) +{ + auto result = std::vector(); + result.reserve(spell_flag_set.nbits); + + for (std::size_t k = 0; k < monster_spell_flag_set::nbits; k++) + { + if (spell_flag_set.bit(k)) + { + result.push_back(monster_spells()[k]); + } + } + + return result; +} /* * Monster tries to 'cast a spell' (or breath, etc) @@ -989,15 +970,14 @@ void cmonster_msg(char a, cptr fmt, ...) int monst_spell_monst_spell = -1; static bool_ monst_spell_monst(int m_idx) { + static const monster_spell_flag_set SF_INT_MASK = compute_smart_mask(); + int y = 0, x = 0; int i = 1; - int thrown_spell; - byte spell[96], num = 0; char m_name[80], t_name[80]; char m_poss[80]; char ddesc[80]; monster_type *m_ptr = &m_list[m_idx]; /* Attacker */ - u32b f4, f5, f6; /* racial spell flags */ bool_ direct = TRUE; bool_ wake_up = FALSE; @@ -1059,10 +1039,8 @@ static bool_ monst_spell_monst(int m_idx) /* Extract the monster level */ const int rlev = ((m_ptr->level >= 1) ? m_ptr->level : 1); - /* Extract the racial spell flags */ - f4 = r_ptr->flags4; - f5 = r_ptr->flags5; - f6 = r_ptr->flags6; + /* Which spells are allowed? */ + monster_spell_flag_set allowed_spells = r_ptr->spells; /* Hack -- allow "desperate" spells */ if ((r_ptr->flags2 & RF2_SMART) && @@ -1070,34 +1048,17 @@ static bool_ monst_spell_monst(int m_idx) (rand_int(100) < 50)) { /* Require intelligent spells */ - f4 &= RF4_INT_MASK; - f5 &= RF5_INT_MASK; - f6 &= RF6_INT_MASK; - - /* No spells left */ - if ((!f4 && !f5 && !f6) && (monst_spell_monst_spell == -1)) return (FALSE); - } + allowed_spells &= SF_INT_MASK; - /* Extract the "inate" spells */ - for (int k = 0; k < 32; k++) - { - if (f4 & (1L << k)) spell[num++] = k + 32 * 3; - } - - /* Extract the "normal" spells */ - for (int k = 0; k < 32; k++) - { - if (f5 & (1L << k)) spell[num++] = k + 32 * 4; + /* No spells left? */ + if ((!allowed_spells) && (monst_spell_monst_spell == -1)) return (FALSE); } - /* Extract the "bizarre" spells */ - for (int k = 0; k < 32; k++) - { - if (f6 & (1L << k)) spell[num++] = k + 32 * 5; - } + /* Extract spells */ + auto spell = extract_spells(allowed_spells); - /* No spells left */ - if (!num) return (FALSE); + /* No spells left? */ + if (spell.empty()) return (FALSE); /* Stop if player is dead or gone */ if (!alive || death) return (FALSE); @@ -1118,12 +1079,12 @@ static bool_ monst_spell_monst(int m_idx) monster_desc(ddesc, m_ptr, 0x88); /* Choose a spell to cast */ - thrown_spell = spell[rand_int(num)]; + auto thrown_spell = spell[rand_int(spell.size())]; /* Force a spell ? */ if (monst_spell_monst_spell > -1) { - thrown_spell = monst_spell_monst_spell; + thrown_spell = spell[monst_spell_monst_spell]; monst_spell_monst_spell = -1; } @@ -1133,10 +1094,9 @@ static bool_ monst_spell_monst(int m_idx) see_both = (see_m && see_t); int count = 0; - switch (thrown_spell) + switch (thrown_spell->spell_idx) { - /* RF4_SHRIEK */ - case 96 + 0: + case SF_SHRIEK_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1146,14 +1106,12 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_MULTIPLY */ - case 96 + 1: + case SF_MULTIPLY_IDX: { break; } - /* RF4_S_ANIMAL */ - case 96 + 2: + case SF_S_ANIMAL_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1169,8 +1127,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_ROCKET */ - case 96 + 3: + case SF_ROCKET_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear an explosion!"); @@ -1181,8 +1138,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_ARROW_1 */ - case 96 + 4: + case SF_ARROW_1_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear a strange noise."); @@ -1193,8 +1149,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_ARROW_2 */ - case 96 + 5: + case SF_ARROW_2_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear a strange noise."); @@ -1205,8 +1160,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_ARROW_3 */ - case 96 + 6: + case SF_ARROW_3_IDX: { if (disturb_other) disturb(1); @@ -1218,8 +1172,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_ARROW_4 */ - case 96 + 7: + case SF_ARROW_4_IDX: { if (!see_either) monster_msg("You hear a strange noise."); else if (disturb_other) disturb(1); @@ -1230,8 +1183,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_ACID */ - case 96 + 8: + case SF_BR_ACID_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1243,8 +1195,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_ELEC */ - case 96 + 9: + case SF_BR_ELEC_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1256,8 +1207,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_FIRE */ - case 96 + 10: + case SF_BR_FIRE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1269,8 +1219,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_COLD */ - case 96 + 11: + case SF_BR_COLD_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1282,8 +1231,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_POIS */ - case 96 + 12: + case SF_BR_POIS_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1295,8 +1243,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_NETH */ - case 96 + 13: + case SF_BR_NETH_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1308,8 +1255,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_LITE */ - case 96 + 14: + case SF_BR_LITE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1321,8 +1267,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_DARK */ - case 96 + 15: + case SF_BR_DARK_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1334,8 +1279,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_CONF */ - case 96 + 16: + case SF_BR_CONF_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1347,8 +1291,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_SOUN */ - case 96 + 17: + case SF_BR_SOUN_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1360,8 +1303,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_CHAO */ - case 96 + 18: + case SF_BR_CHAO_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1373,8 +1315,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_DISE */ - case 96 + 19: + case SF_BR_DISE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1386,8 +1327,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_NEXU */ - case 96 + 20: + case SF_BR_NEXU_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1399,8 +1339,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_TIME */ - case 96 + 21: + case SF_BR_TIME_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1412,8 +1351,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_INER */ - case 96 + 22: + case SF_BR_INER_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1425,8 +1363,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_GRAV */ - case 96 + 23: + case SF_BR_GRAV_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1438,8 +1375,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_SHAR */ - case 96 + 24: + case SF_BR_SHAR_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1451,8 +1387,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_PLAS */ - case 96 + 25: + case SF_BR_PLAS_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1464,8 +1399,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_WALL */ - case 96 + 26: + case SF_BR_WALL_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1477,8 +1411,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_MANA */ - case 96 + 27: + case SF_BR_MANA_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1490,8 +1423,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BA_NUKE */ - case 96 + 28: + case SF_BA_NUKE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear someone mumble."); @@ -1503,8 +1435,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_NUKE */ - case 96 + 29: + case SF_BR_NUKE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1516,8 +1447,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BA_CHAO */ - case 96 + 30: + case SF_BA_CHAO_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear someone mumble frighteningly."); @@ -1529,8 +1459,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF4_BR_DISI -> Breathe Disintegration */ - case 96 + 31: + case SF_BR_DISI_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear breathing noise."); @@ -1542,8 +1471,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_ACID */ - case 128 + 0: + case SF_BA_ACID_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1553,8 +1481,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_ELEC */ - case 128 + 1: + case SF_BA_ELEC_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1565,8 +1492,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_FIRE */ - case 128 + 2: + case SF_BA_FIRE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1577,8 +1503,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_COLD */ - case 128 + 3: + case SF_BA_COLD_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1589,8 +1514,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_POIS */ - case 128 + 4: + case SF_BA_POIS_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1601,8 +1525,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_NETH */ - case 128 + 5: + case SF_BA_NETH_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1613,8 +1536,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_WATE */ - case 128 + 6: + case SF_BA_WATE_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble."); @@ -1626,8 +1548,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_MANA */ - case 128 + 7: + case SF_BA_MANA_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble powerfully."); @@ -1638,8 +1559,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BA_DARK */ - case 128 + 8: + case SF_BA_DARK_IDX: { if (disturb_other) disturb(1); if (!see_either) monster_msg ("You hear someone mumble powerfully."); @@ -1650,8 +1570,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_DRAIN_MANA */ - case 128 + 9: + case SF_DRAIN_MANA_IDX: { /* Attack power */ int r1 = (randint(rlev) / 2) + 1; @@ -1665,7 +1584,7 @@ static bool_ monst_spell_monst(int m_idx) /* Heal the monster */ if (m_ptr->hp < m_ptr->maxhp) { - if (!(tr_ptr->flags4 || tr_ptr->flags5 || tr_ptr->flags6)) + if (!tr_ptr->spells) { if (see_both) monster_msg("%^s is unaffected!", t_name); @@ -1691,8 +1610,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_MIND_BLAST */ - case 128 + 10: + case SF_MIND_BLAST_IDX: { if (!direct) break; @@ -1731,8 +1649,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BRAIN_SMASH */ - case 128 + 11: + case SF_BRAIN_SMASH_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1772,8 +1689,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_CAUSE_1 */ - case 128 + 12: + case SF_CAUSE_1_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1793,8 +1709,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_CAUSE_2 */ - case 128 + 13: + case SF_CAUSE_2_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1813,8 +1728,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_CAUSE_3 */ - case 128 + 14: + case SF_CAUSE_3_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1833,8 +1747,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_CAUSE_4 */ - case 128 + 15: + case SF_CAUSE_4_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1853,8 +1766,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_ACID */ - case 128 + 16: + case SF_BO_ACID_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1864,8 +1776,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_ELEC */ - case 128 + 17: + case SF_BO_ELEC_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1875,8 +1786,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_FIRE */ - case 128 + 18: + case SF_BO_FIRE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1886,8 +1796,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_COLD */ - case 128 + 19: + case SF_BO_COLD_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1897,15 +1806,13 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_POIS */ - case 128 + 20: + case SF_BO_POIS_IDX: { /* XXX XXX XXX */ break; } - /* RF5_BO_NETH */ - case 128 + 21: + case SF_BO_NETH_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1915,8 +1822,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_WATE */ - case 128 + 22: + case SF_BO_WATE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1926,8 +1832,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_MANA */ - case 128 + 23: + case SF_BO_MANA_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1937,8 +1842,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_PLAS */ - case 128 + 24: + case SF_BO_PLAS_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1948,8 +1852,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BO_ICEE */ - case 128 + 25: + case SF_BO_ICEE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1959,8 +1862,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_MISSILE */ - case 128 + 26: + case SF_MISSILE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -1970,8 +1872,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_SCARE */ - case 128 + 27: + case SF_SCARE_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -1994,8 +1895,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_BLIND */ - case 128 + 28: + case SF_BLIND_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2020,8 +1920,7 @@ static bool_ monst_spell_monst(int m_idx) } - /* RF5_CONF */ - case 128 + 29: + case SF_CONF_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2044,8 +1943,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_SLOW */ - case 128 + 30: + case SF_SLOW_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2068,8 +1966,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF5_HOLD */ - case 128 + 31: + case SF_HOLD_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2092,9 +1989,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - - /* RF6_HASTE */ - case 160 + 0: + case SF_HASTE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) @@ -2123,8 +2018,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_HAND_DOOM */ - case 160 + 1: + case SF_HAND_DOOM_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2155,8 +2049,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_HEAL */ - case 160 + 2: + case SF_HEAL_IDX: { if (disturb_other) disturb(1); @@ -2220,8 +2113,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_ANIMALS */ - case 160 + 3: + case SF_S_ANIMALS_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2237,8 +2129,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_BLINK */ - case 160 + 4: + case SF_BLINK_IDX: { if (disturb_other) disturb(1); if (see_m) monster_msg("%^s blinks away.", m_name); @@ -2246,8 +2137,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_TPORT */ - case 160 + 5: + case SF_TPORT_IDX: { if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ else @@ -2259,15 +2149,13 @@ static bool_ monst_spell_monst(int m_idx) } } - /* RF6_TELE_TO */ - case 160 + 6: + case SF_TELE_TO_IDX: { /* Not implemented */ break; } - /* RF6_TELE_AWAY */ - case 160 + 7: + case SF_TELE_AWAY_IDX: { if (dungeon_flags & DF_NO_TELEPORT) break; @@ -2308,15 +2196,13 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_TELE_LEVEL */ - case 160 + 8: + case SF_TELE_LEVEL_IDX: { /* Not implemented */ break; } - /* RF6_DARKNESS */ - case 160 + 9: + case SF_DARKNESS_IDX: { if (!direct) break; if (disturb_other) disturb(1); @@ -2330,22 +2216,19 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_TRAPS */ - case 160 + 10: + case SF_TRAPS_IDX: { /* Not implemented */ break; } - /* RF6_FORGET */ - case 160 + 11: + case SF_FORGET_IDX: { /* Not implemented */ break; } - /* RF6_S_BUG */ - case 160 + 13: + case SF_S_BUG_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2361,8 +2244,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_RNG */ - case 160 + 14: + case SF_S_RNG_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2378,9 +2260,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - - /* RF6_S_THUNDERLORD */ - case 160 + 15: + case SF_S_THUNDERLORD_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2396,8 +2276,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_SUMMON_KIN */ - case 160 + 16: + case SF_S_KIN_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2419,8 +2298,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_HI_DEMON */ - case 160 + 17: + case SF_S_HI_DEMON_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2433,8 +2311,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_MONSTER */ - case 160 + 18: + case SF_S_MONSTER_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2450,8 +2327,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_MONSTERS */ - case 160 + 19: + case SF_S_MONSTERS_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2467,8 +2343,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_ANT */ - case 160 + 20: + case SF_S_ANT_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2484,8 +2359,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_SPIDER */ - case 160 + 21: + case SF_S_SPIDER_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2501,8 +2375,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_HOUND */ - case 160 + 22: + case SF_S_HOUND_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2518,8 +2391,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_HYDRA */ - case 160 + 23: + case SF_S_HYDRA_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2535,8 +2407,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_ANGEL */ - case 160 + 24: + case SF_S_ANGEL_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2552,8 +2423,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_DEMON */ - case 160 + 25: + case SF_S_DEMON_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2569,8 +2439,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_UNDEAD */ - case 160 + 26: + case SF_S_UNDEAD_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2586,8 +2455,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_DRAGON */ - case 160 + 27: + case SF_S_DRAGON_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2603,8 +2471,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_HI_UNDEAD */ - case 160 + 28: + case SF_S_HI_UNDEAD_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2623,8 +2490,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_HI_DRAGON */ - case 160 + 29: + case SF_S_HI_DRAGON_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2643,8 +2509,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_WRAITH */ - case 160 + 30: + case SF_S_WRAITH_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2663,8 +2528,7 @@ static bool_ monst_spell_monst(int m_idx) break; } - /* RF6_S_UNIQUE */ - case 160 + 31: + case SF_S_UNIQUE_IDX: { if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); @@ -2860,9 +2724,12 @@ void curse_equipment_dg(int chance, int heavy_chance) */ static bool_ make_attack_spell(int m_idx) { - int k, chance, thrown_spell, rlev, failrate; - byte spell[96], num = 0; - u32b f4, f5, f6; + static const auto SF_BOLT_MASK = compute_bolt_mask(); + static const auto SF_SUMMON_MASK = compute_summoning_mask(); + static const auto SF_INT_MASK = compute_smart_mask(); + static const auto SF_INNATE_MASK = compute_innate_mask(); + + int k, chance, rlev, failrate; char m_name[80]; bool_ no_inate = FALSE; int x, y; @@ -2934,12 +2801,13 @@ static bool_ make_attack_spell(int m_idx) rlev = ((m_ptr->level >= 1) ? m_ptr->level : 1); /* Extract the racial spell flags */ - f4 = r_ptr->flags4; - f5 = r_ptr->flags5; - f6 = r_ptr->flags6; + monster_spell_flag_set allowed_spells = r_ptr->spells; /* Forbid inate attacks sometimes */ - if (no_inate) f4 = 0L; + if (no_inate) + { + allowed_spells &= ~SF_INNATE_MASK; + } /* Hack -- allow "desperate" spells */ if ((r_ptr->flags2 & RF2_SMART) && @@ -2947,67 +2815,44 @@ static bool_ make_attack_spell(int m_idx) (rand_int(100) < 50)) { /* Require intelligent spells */ - f4 &= RF4_INT_MASK; - f5 &= RF5_INT_MASK; - f6 &= RF6_INT_MASK; + allowed_spells &= SF_INT_MASK; - /* No spells left */ - if (!f4 && !f5 && !f6) return (FALSE); + /* No spells left? */ + if (!allowed_spells) return (FALSE); } /* Remove the "ineffective" spells */ - remove_bad_spells(m_idx, &f4, &f5, &f6); + remove_bad_spells(m_idx, &allowed_spells); /* No spells left */ - if (!f4 && !f5 && !f6) return (FALSE); + if (!allowed_spells) return (FALSE); /* Check for a clean bolt shot */ - if ((f4&RF4_BOLT_MASK || f5 & RF5_BOLT_MASK || - f6&RF6_BOLT_MASK) && + if ((allowed_spells & SF_BOLT_MASK) && !(r_ptr->flags2 & RF2_STUPID) && !clean_shot(m_ptr->fy, m_ptr->fx, y, x)) { /* Remove spells that will only hurt friends */ - f4 &= ~RF4_BOLT_MASK; - f5 &= ~RF5_BOLT_MASK; - f6 &= ~RF6_BOLT_MASK; + allowed_spells &= ~SF_BOLT_MASK; } /* Check for a possible summon */ - if ((f4 & RF4_SUMMON_MASK || f5 & RF5_SUMMON_MASK || - f6 & RF6_SUMMON_MASK) && + if ((allowed_spells & SF_SUMMON_MASK) && !(r_ptr->flags2 & RF2_STUPID) && !(summon_possible(y, x))) { /* Remove summoning spells */ - f4 &= ~RF4_SUMMON_MASK; - f5 &= ~RF5_SUMMON_MASK; - f6 &= ~RF6_SUMMON_MASK; + allowed_spells &= ~SF_SUMMON_MASK; } /* No spells left */ - if (!f4 && !f5 && !f6) return (FALSE); + if (!allowed_spells) return (FALSE); /* Extract the "inate" spells */ - for (k = 0; k < 32; k++) - { - if (f4 & (1L << k)) spell[num++] = k + 32 * 3; - } - - /* Extract the "normal" spells */ - for (k = 0; k < 32; k++) - { - if (f5 & (1L << k)) spell[num++] = k + 32 * 4; - } - - /* Extract the "bizarre" spells */ - for (k = 0; k < 32; k++) - { - if (f6 & (1L << k)) spell[num++] = k + 32 * 5; - } + auto spell = extract_spells(allowed_spells); /* No spells left */ - if (!num) return (FALSE); + if (spell.empty()) return (FALSE); /* Stop if player is dead or gone */ if (!alive || death) return (FALSE); @@ -3019,7 +2864,7 @@ static bool_ make_attack_spell(int m_idx) monster_desc(m_name, m_ptr, 0x00); /* Choose a spell to cast */ - thrown_spell = choose_attack_spell(m_idx, spell, num); + auto thrown_spell = choose_attack_spell(m_idx, spell); /* Abort if no spell was chosen */ if (!thrown_spell) return (FALSE); @@ -3031,7 +2876,7 @@ static bool_ make_attack_spell(int m_idx) if (r_ptr->flags2 & RF2_STUPID) failrate = 0; /* Check for spell failure (inate attacks never fail) */ - if ((thrown_spell >= 128) && (rand_int(100) < failrate)) + if ((!thrown_spell->is_innate) && (rand_int(100) < failrate)) { /* Message */ msg_format("%^s tries to cast a spell, but fails.", m_name); @@ -3040,7 +2885,7 @@ static bool_ make_attack_spell(int m_idx) } /* Can the player disrupt its puny attempts? */ - if ((p_ptr->antimagic_dis >= m_ptr->cdis) && (magik(p_ptr->antimagic)) && (thrown_spell >= 128)) + if ((p_ptr->antimagic_dis >= m_ptr->cdis) && magik(p_ptr->antimagic) && thrown_spell->is_magic) { char m_poss[80]; @@ -3061,10 +2906,9 @@ static bool_ make_attack_spell(int m_idx) monster_desc(ddesc, m_ptr, 0x88); /* Cast the spell. */ - switch (thrown_spell) + switch (thrown_spell->spell_idx) { - /* RF4_SHRIEK */ - case 96 + 0: + case SF_SHRIEK_IDX: { disturb(1); msg_format("%^s makes a high pitched shriek.", m_name); @@ -3072,14 +2916,12 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_MULTIPLY */ - case 96 + 1: + case SF_MULTIPLY_IDX: { break; } - /* RF4_S_ANIMAL */ - case 96 + 2: + case SF_S_ANIMAL_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3092,8 +2934,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_ROCKET */ - case 96 + 3: + case SF_ROCKET_IDX: { disturb(1); if (blind) msg_format("%^s shoots something.", m_name); @@ -3104,8 +2945,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_ARROW_1 */ - case 96 + 4: + case SF_ARROW_1_IDX: { disturb(1); if (blind) msg_format("%^s makes a strange noise.", m_name); @@ -3115,8 +2955,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_ARROW_2 */ - case 96 + 5: + case SF_ARROW_2_IDX: { disturb(1); if (blind) msg_format("%^s makes a strange noise.", m_name); @@ -3126,8 +2965,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_ARROW_3 */ - case 96 + 6: + case SF_ARROW_3_IDX: { disturb(1); if (blind) msg_format("%^s makes a strange noise.", m_name); @@ -3137,8 +2975,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_ARROW_4 */ - case 96 + 7: + case SF_ARROW_4_IDX: { disturb(1); if (blind) msg_format("%^s makes a strange noise.", m_name); @@ -3148,8 +2985,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_ACID */ - case 96 + 8: + case SF_BR_ACID_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3160,8 +2996,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_ELEC */ - case 96 + 9: + case SF_BR_ELEC_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3172,8 +3007,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_FIRE */ - case 96 + 10: + case SF_BR_FIRE_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3184,8 +3018,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_COLD */ - case 96 + 11: + case SF_BR_COLD_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3196,8 +3029,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_POIS */ - case 96 + 12: + case SF_BR_POIS_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3208,9 +3040,7 @@ static bool_ make_attack_spell(int m_idx) break; } - - /* RF4_BR_NETH */ - case 96 + 13: + case SF_BR_NETH_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3221,8 +3051,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_LITE */ - case 96 + 14: + case SF_BR_LITE_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3233,8 +3062,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_DARK */ - case 96 + 15: + case SF_BR_DARK_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3245,8 +3073,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_CONF */ - case 96 + 16: + case SF_BR_CONF_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3257,8 +3084,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_SOUN */ - case 96 + 17: + case SF_BR_SOUN_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3269,8 +3095,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_CHAO */ - case 96 + 18: + case SF_BR_CHAO_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3281,8 +3106,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_DISE */ - case 96 + 19: + case SF_BR_DISE_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3293,8 +3117,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_NEXU */ - case 96 + 20: + case SF_BR_NEXU_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3305,8 +3128,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_TIME */ - case 96 + 21: + case SF_BR_TIME_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3316,8 +3138,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_INER */ - case 96 + 22: + case SF_BR_INER_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3327,8 +3148,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_GRAV */ - case 96 + 23: + case SF_BR_GRAV_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3338,8 +3158,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_SHAR */ - case 96 + 24: + case SF_BR_SHAR_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3350,8 +3169,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_PLAS */ - case 96 + 25: + case SF_BR_PLAS_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3361,8 +3179,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_WALL */ - case 96 + 26: + case SF_BR_WALL_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3372,8 +3189,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_MANA */ - case 96 + 27: + case SF_BR_MANA_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3383,8 +3199,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BA_NUKE */ - case 96 + 28: + case SF_BA_NUKE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3394,8 +3209,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_NUKE */ - case 96 + 29: + case SF_BR_NUKE_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3406,8 +3220,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BA_CHAO */ - case 96 + 30: + case SF_BA_CHAO_IDX: { disturb(1); if (blind) msg_format("%^s mumbles frighteningly.", m_name); @@ -3417,8 +3230,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF4_BR_DISI -> Disintegration breath! */ - case 96 + 31: + case SF_BR_DISI_IDX: { disturb(1); if (blind) msg_format("%^s breathes.", m_name); @@ -3428,10 +3240,7 @@ static bool_ make_attack_spell(int m_idx) break; } - - - /* RF5_BA_ACID */ - case 128 + 0: + case SF_BA_ACID_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3442,8 +3251,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_ELEC */ - case 128 + 1: + case SF_BA_ELEC_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3454,8 +3262,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_FIRE */ - case 128 + 2: + case SF_BA_FIRE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3466,8 +3273,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_COLD */ - case 128 + 3: + case SF_BA_COLD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3478,8 +3284,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_POIS */ - case 128 + 4: + case SF_BA_POIS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3490,8 +3295,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_NETH */ - case 128 + 5: + case SF_BA_NETH_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3502,8 +3306,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_WATE */ - case 128 + 6: + case SF_BA_WATE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3514,8 +3317,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_MANA */ - case 128 + 7: + case SF_BA_MANA_IDX: { disturb(1); if (blind) msg_format("%^s mumbles powerfully.", m_name); @@ -3525,8 +3327,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BA_DARK */ - case 128 + 8: + case SF_BA_DARK_IDX: { disturb(1); if (blind) msg_format("%^s mumbles powerfully.", m_name); @@ -3537,8 +3338,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_DRAIN_MANA */ - case 128 + 9: + case SF_DRAIN_MANA_IDX: { if (p_ptr->csp) { @@ -3594,8 +3394,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_MIND_BLAST */ - case 128 + 10: + case SF_MIND_BLAST_IDX: { disturb(1); if (!seen) @@ -3630,8 +3429,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BRAIN_SMASH */ - case 128 + 11: + case SF_BRAIN_SMASH_IDX: { disturb(1); if (!seen) @@ -3678,8 +3476,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_CAUSE_1 */ - case 128 + 12: + case SF_CAUSE_1_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3696,8 +3493,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_CAUSE_2 */ - case 128 + 13: + case SF_CAUSE_2_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3714,8 +3510,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_CAUSE_3 */ - case 128 + 14: + case SF_CAUSE_3_IDX: { disturb(1); if (blind) msg_format("%^s mumbles loudly.", m_name); @@ -3732,8 +3527,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_CAUSE_4 */ - case 128 + 15: + case SF_CAUSE_4_IDX: { disturb(1); if (blind) msg_format("%^s screams the word 'DIE!'", m_name); @@ -3750,8 +3544,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_ACID */ - case 128 + 16: + case SF_BO_ACID_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3762,8 +3555,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_ELEC */ - case 128 + 17: + case SF_BO_ELEC_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3774,8 +3566,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_FIRE */ - case 128 + 18: + case SF_BO_FIRE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3786,8 +3577,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_COLD */ - case 128 + 19: + case SF_BO_COLD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3798,15 +3588,13 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_POIS */ - case 128 + 20: + case SF_BO_POIS_IDX: { /* XXX XXX XXX */ break; } - /* RF5_BO_NETH */ - case 128 + 21: + case SF_BO_NETH_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3817,8 +3605,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_WATE */ - case 128 + 22: + case SF_BO_WATE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3828,8 +3615,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_MANA */ - case 128 + 23: + case SF_BO_MANA_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3839,8 +3625,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_PLAS */ - case 128 + 24: + case SF_BO_PLAS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3850,8 +3635,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BO_ICEE */ - case 128 + 25: + case SF_BO_ICEE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3862,8 +3646,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_MISSILE */ - case 128 + 26: + case SF_MISSILE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3873,8 +3656,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_SCARE */ - case 128 + 27: + case SF_SCARE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles, and you hear scary noises.", m_name); @@ -3895,8 +3677,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_BLIND */ - case 128 + 28: + case SF_BLIND_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3917,8 +3698,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_CONF */ - case 128 + 29: + case SF_CONF_IDX: { disturb(1); if (blind) msg_format("%^s mumbles, and you hear puzzling noises.", m_name); @@ -3939,8 +3719,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_SLOW */ - case 128 + 30: + case SF_SLOW_IDX: { disturb(1); msg_format("%^s drains power from your muscles!", m_name); @@ -3960,8 +3739,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF5_HOLD */ - case 128 + 31: + case SF_HOLD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -3982,10 +3760,7 @@ static bool_ make_attack_spell(int m_idx) break; } - - - /* RF6_HASTE */ - case 160 + 0: + case SF_HASTE_IDX: { disturb(1); if (blind) @@ -4014,8 +3789,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_HAND_DOOM */ - case 160 + 1: + case SF_HAND_DOOM_IDX: { disturb(1); msg_format("%^s invokes the Hand of Doom!", m_name); @@ -4035,8 +3809,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_HEAL */ - case 160 + 2: + case SF_HEAL_IDX: { disturb(1); @@ -4099,8 +3872,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_ANIMALS */ - case 160 + 3: + case SF_S_ANIMALS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4113,8 +3885,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_BLINK */ - case 160 + 4: + case SF_BLINK_IDX: { disturb(1); msg_format("%^s blinks away.", m_name); @@ -4122,8 +3893,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_TPORT */ - case 160 + 5: + case SF_TPORT_IDX: { disturb(1); msg_format("%^s teleports away.", m_name); @@ -4131,8 +3901,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_TELE_TO */ - case 160 + 6: + case SF_TELE_TO_IDX: { disturb(1); msg_format("%^s commands you to return.", m_name); @@ -4140,8 +3909,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_TELE_AWAY */ - case 160 + 7: + case SF_TELE_AWAY_IDX: { disturb(1); msg_format("%^s teleports you away.", m_name); @@ -4149,8 +3917,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_TELE_LEVEL */ - case 160 + 8: + case SF_TELE_LEVEL_IDX: { disturb(1); if (blind) msg_format("%^s mumbles strangely.", m_name); @@ -4171,8 +3938,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_DARKNESS */ - case 160 + 9: + case SF_DARKNESS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4181,8 +3947,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_TRAPS */ - case 160 + 10: + case SF_TRAPS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles, and then cackles evilly.", m_name); @@ -4191,8 +3956,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_FORGET */ - case 160 + 11: + case SF_FORGET_IDX: { disturb(1); msg_format("%^s tries to blank your mind.", m_name); @@ -4208,8 +3972,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_BUG */ - case 160 + 13: + case SF_S_BUG_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4222,8 +3985,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_RNG */ - case 160 + 14: + case SF_S_RNG_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4236,8 +3998,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_THUNDERLORD */ - case 160 + 15: + case SF_S_THUNDERLORD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4250,8 +4011,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_SUMMON_KIN */ - case 160 + 16: + case SF_S_KIN_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4270,8 +4030,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_HI_DEMON */ - case 160 + 17: + case SF_S_HI_DEMON_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4281,8 +4040,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_MONSTER */ - case 160 + 18: + case SF_S_MONSTER_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4295,8 +4053,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_MONSTERS */ - case 160 + 19: + case SF_S_MONSTERS_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4309,8 +4066,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_ANT */ - case 160 + 20: + case SF_S_ANT_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4323,8 +4079,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_SPIDER */ - case 160 + 21: + case SF_S_SPIDER_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4337,8 +4092,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_HOUND */ - case 160 + 22: + case SF_S_HOUND_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4351,8 +4105,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_HYDRA */ - case 160 + 23: + case SF_S_HYDRA_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4365,8 +4118,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_ANGEL */ - case 160 + 24: + case SF_S_ANGEL_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4379,8 +4131,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_DEMON */ - case 160 + 25: + case SF_S_DEMON_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4393,8 +4144,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_UNDEAD */ - case 160 + 26: + case SF_S_UNDEAD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4407,8 +4157,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_DRAGON */ - case 160 + 27: + case SF_S_DRAGON_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4421,8 +4170,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_HI_UNDEAD */ - case 160 + 28: + case SF_S_HI_UNDEAD_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4438,8 +4186,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_HI_DRAGON */ - case 160 + 29: + case SF_S_HI_DRAGON_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4455,8 +4202,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_WRAITH */ - case 160 + 30: + case SF_S_WRAITH_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -4475,8 +4221,7 @@ static bool_ make_attack_spell(int m_idx) break; } - /* RF6_S_UNIQUE */ - case 160 + 31: + case SF_S_UNIQUE_IDX: { disturb(1); if (blind) msg_format("%^s mumbles.", m_name); @@ -6188,7 +5933,7 @@ static void process_monster(int m_idx, bool_ is_frien) ox = m_ptr->fx; /* Attempt to "multiply" if able and allowed */ - if ((r_ptr->flags4 & RF4_MULTIPLY) && (num_repro < MAX_REPRO)) + if ((r_ptr->spells & SF_MULTIPLY) && (num_repro < MAX_REPRO)) { if (ai_multiply(m_idx)) return; } diff --git a/src/monster1.cc b/src/monster1.cc index 0c94fb5a..e7c1a35f 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -12,6 +12,7 @@ #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "player_type.hpp" #include "util.hpp" #include "variable.hpp" @@ -65,11 +66,9 @@ static void roff_aux(std::shared_ptr r_ptr) u32b const flags1 = r_ptr->flags1; u32b const flags2 = r_ptr->flags2; u32b const flags3 = r_ptr->flags3; - u32b const flags4 = r_ptr->flags4; - u32b const flags5 = r_ptr->flags5; - u32b const flags6 = r_ptr->flags6; u32b const flags7 = r_ptr->flags7; u32b const flags9 = r_ptr->flags9; + monster_spell_flag_set spells = r_ptr->spells; /* Extract a gender (if applicable) */ int msex = 0; @@ -355,12 +354,12 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect inate attacks */ vn = 0; - if (flags4 & RF4_SHRIEK) vp[vn++] = "shriek for help"; - if (flags4 & RF4_ROCKET) vp[vn++] = "shoot a rocket"; - if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire an arrow"; - if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows"; - if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire a missile"; - if (flags4 & (RF4_ARROW_4)) vp[vn++] = "fire missiles"; + if (spells & SF_SHRIEK) vp[vn++] = "shriek for help"; + if (spells & SF_ROCKET) vp[vn++] = "shoot a rocket"; + if (spells & SF_ARROW_1) vp[vn++] = "fire an arrow"; + if (spells & SF_ARROW_2) vp[vn++] = "fire arrows"; + if (spells & SF_ARROW_3) vp[vn++] = "fire a missile"; + if (spells & SF_ARROW_4) vp[vn++] = "fire missiles"; /* Describe inate attacks */ if (vn) @@ -387,28 +386,28 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect breaths */ vn = 0; - if (flags4 & RF4_BR_ACID) vp[vn++] = "acid"; - if (flags4 & RF4_BR_ELEC) vp[vn++] = "lightning"; - if (flags4 & RF4_BR_FIRE) vp[vn++] = "fire"; - if (flags4 & RF4_BR_COLD) vp[vn++] = "frost"; - if (flags4 & RF4_BR_POIS) vp[vn++] = "poison"; - if (flags4 & RF4_BR_NETH) vp[vn++] = "nether"; - if (flags4 & RF4_BR_LITE) vp[vn++] = "light"; - if (flags4 & RF4_BR_DARK) vp[vn++] = "darkness"; - if (flags4 & RF4_BR_CONF) vp[vn++] = "confusion"; - if (flags4 & RF4_BR_SOUN) vp[vn++] = "sound"; - if (flags4 & RF4_BR_CHAO) vp[vn++] = "chaos"; - if (flags4 & RF4_BR_DISE) vp[vn++] = "disenchantment"; - if (flags4 & RF4_BR_NEXU) vp[vn++] = "nexus"; - if (flags4 & RF4_BR_TIME) vp[vn++] = "time"; - if (flags4 & RF4_BR_INER) vp[vn++] = "inertia"; - if (flags4 & RF4_BR_GRAV) vp[vn++] = "gravity"; - if (flags4 & RF4_BR_SHAR) vp[vn++] = "shards"; - if (flags4 & RF4_BR_PLAS) vp[vn++] = "plasma"; - if (flags4 & RF4_BR_WALL) vp[vn++] = "force"; - if (flags4 & RF4_BR_MANA) vp[vn++] = "mana"; - if (flags4 & RF4_BR_NUKE) vp[vn++] = "toxic waste"; - if (flags4 & RF4_BR_DISI) vp[vn++] = "disintegration"; + if (spells & SF_BR_ACID) vp[vn++] = "acid"; + if (spells & SF_BR_ELEC) vp[vn++] = "lightning"; + if (spells & SF_BR_FIRE) vp[vn++] = "fire"; + if (spells & SF_BR_COLD) vp[vn++] = "frost"; + if (spells & SF_BR_POIS) vp[vn++] = "poison"; + if (spells & SF_BR_NETH) vp[vn++] = "nether"; + if (spells & SF_BR_LITE) vp[vn++] = "light"; + if (spells & SF_BR_DARK) vp[vn++] = "darkness"; + if (spells & SF_BR_CONF) vp[vn++] = "confusion"; + if (spells & SF_BR_SOUN) vp[vn++] = "sound"; + if (spells & SF_BR_CHAO) vp[vn++] = "chaos"; + if (spells & SF_BR_DISE) vp[vn++] = "disenchantment"; + if (spells & SF_BR_NEXU) vp[vn++] = "nexus"; + if (spells & SF_BR_TIME) vp[vn++] = "time"; + if (spells & SF_BR_INER) vp[vn++] = "inertia"; + if (spells & SF_BR_GRAV) vp[vn++] = "gravity"; + if (spells & SF_BR_SHAR) vp[vn++] = "shards"; + if (spells & SF_BR_PLAS) vp[vn++] = "plasma"; + if (spells & SF_BR_WALL) vp[vn++] = "force"; + if (spells & SF_BR_MANA) vp[vn++] = "mana"; + if (spells & SF_BR_NUKE) vp[vn++] = "toxic waste"; + if (spells & SF_BR_DISI) vp[vn++] = "disintegration"; /* Describe breaths */ if (vn) @@ -435,73 +434,73 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect spells */ vn = 0; - if (flags5 & RF5_BA_ACID) vp[vn++] = "produce acid balls"; - if (flags5 & RF5_BA_ELEC) vp[vn++] = "produce lightning balls"; - if (flags5 & RF5_BA_FIRE) vp[vn++] = "produce fire balls"; - if (flags5 & RF5_BA_COLD) vp[vn++] = "produce frost balls"; - if (flags5 & RF5_BA_POIS) vp[vn++] = "produce poison balls"; - if (flags5 & RF5_BA_NETH) vp[vn++] = "produce nether balls"; - if (flags5 & RF5_BA_WATE) vp[vn++] = "produce water balls"; - if (flags4 & RF4_BA_NUKE) vp[vn++] = "produce balls of radiation"; - if (flags5 & RF5_BA_MANA) vp[vn++] = "invoke mana storms"; - if (flags5 & RF5_BA_DARK) vp[vn++] = "invoke darkness storms"; - if (flags4 & RF4_BA_CHAO) vp[vn++] = "invoke raw chaos"; - if (flags6 & RF6_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; - if (flags5 & RF5_DRAIN_MANA) vp[vn++] = "drain mana"; - if (flags5 & RF5_MIND_BLAST) vp[vn++] = "cause mind blasting"; - if (flags5 & RF5_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; - if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; - if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; - if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; - if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (flags5 & RF5_BO_ACID) vp[vn++] = "produce acid bolts"; - if (flags5 & RF5_BO_ELEC) vp[vn++] = "produce lightning bolts"; - if (flags5 & RF5_BO_FIRE) vp[vn++] = "produce fire bolts"; - if (flags5 & RF5_BO_COLD) vp[vn++] = "produce frost bolts"; - if (flags5 & RF5_BO_POIS) vp[vn++] = "produce poison bolts"; - if (flags5 & RF5_BO_NETH) vp[vn++] = "produce nether bolts"; - if (flags5 & RF5_BO_WATE) vp[vn++] = "produce water bolts"; - if (flags5 & RF5_BO_MANA) vp[vn++] = "produce mana bolts"; - if (flags5 & RF5_BO_PLAS) vp[vn++] = "produce plasma bolts"; - if (flags5 & RF5_BO_ICEE) vp[vn++] = "produce ice bolts"; - if (flags5 & RF5_MISSILE) vp[vn++] = "produce magic missiles"; - if (flags5 & RF5_SCARE) vp[vn++] = "terrify"; - if (flags5 & RF5_BLIND) vp[vn++] = "blind"; - if (flags5 & RF5_CONF) vp[vn++] = "confuse"; - if (flags5 & RF5_SLOW) vp[vn++] = "slow"; - if (flags5 & RF5_HOLD) vp[vn++] = "paralyze"; - if (flags6 & RF6_HASTE) vp[vn++] = "haste-self"; - if (flags6 & RF6_HEAL) vp[vn++] = "heal-self"; - if (flags6 & RF6_BLINK) vp[vn++] = "blink-self"; - if (flags6 & RF6_TPORT) vp[vn++] = "teleport-self"; - if (flags6 & RF6_S_BUG) vp[vn++] = "summon software bugs"; - if (flags6 & RF6_S_RNG) vp[vn++] = "summon RNG"; - if (flags6 & RF6_TELE_TO) vp[vn++] = "teleport to"; - if (flags6 & RF6_TELE_AWAY) vp[vn++] = "teleport away"; - if (flags6 & RF6_TELE_LEVEL) vp[vn++] = "teleport level"; - if (flags6 & RF6_S_THUNDERLORD) vp[vn++] = "summon a Thunderlord"; - if (flags6 & RF6_DARKNESS) vp[vn++] = "create darkness"; - if (flags6 & RF6_TRAPS) vp[vn++] = "create traps"; - if (flags6 & RF6_FORGET) vp[vn++] = "cause amnesia"; - if (flags6 & RF6_RAISE_DEAD) vp[vn++] = "raise dead"; - if (flags6 & RF6_S_MONSTER) vp[vn++] = "summon a monster"; - if (flags6 & RF6_S_MONSTERS) vp[vn++] = "summon monsters"; - if (flags6 & RF6_S_KIN) vp[vn++] = "summon aid"; - if (flags6 & RF6_S_ANT) vp[vn++] = "summon ants"; - if (flags6 & RF6_S_SPIDER) vp[vn++] = "summon spiders"; - if (flags6 & RF6_S_HOUND) vp[vn++] = "summon hounds"; - if (flags6 & RF6_S_HYDRA) vp[vn++] = "summon hydras"; - if (flags6 & RF6_S_ANGEL) vp[vn++] = "summon an angel"; - if (flags6 & RF6_S_DEMON) vp[vn++] = "summon a demon"; - if (flags6 & RF6_S_UNDEAD) vp[vn++] = "summon an undead"; - if (flags6 & RF6_S_DRAGON) vp[vn++] = "summon a dragon"; - if (flags4 & RF4_S_ANIMAL) vp[vn++] = "summon animal"; - if (flags6 & RF6_S_ANIMALS) vp[vn++] = "summon animals"; - if (flags6 & RF6_S_HI_UNDEAD) vp[vn++] = "summon Greater Undead"; - if (flags6 & RF6_S_HI_DRAGON) vp[vn++] = "summon Ancient Dragons"; - if (flags6 & RF6_S_HI_DEMON) vp[vn++] = "summon Greater Demons"; - if (flags6 & RF6_S_WRAITH) vp[vn++] = "summon Ringwraith"; - if (flags6 & RF6_S_UNIQUE) vp[vn++] = "summon Unique Monsters"; + if (spells & SF_BA_ACID) vp[vn++] = "produce acid balls"; + if (spells & SF_BA_ELEC) vp[vn++] = "produce lightning balls"; + if (spells & SF_BA_FIRE) vp[vn++] = "produce fire balls"; + if (spells & SF_BA_COLD) vp[vn++] = "produce frost balls"; + if (spells & SF_BA_POIS) vp[vn++] = "produce poison balls"; + if (spells & SF_BA_NETH) vp[vn++] = "produce nether balls"; + if (spells & SF_BA_WATE) vp[vn++] = "produce water balls"; + if (spells & SF_BA_NUKE) vp[vn++] = "produce balls of radiation"; + if (spells & SF_BA_MANA) vp[vn++] = "invoke mana storms"; + if (spells & SF_BA_DARK) vp[vn++] = "invoke darkness storms"; + if (spells & SF_BA_CHAO) vp[vn++] = "invoke raw chaos"; + if (spells & SF_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; + if (spells & SF_DRAIN_MANA) vp[vn++] = "drain mana"; + if (spells & SF_MIND_BLAST) vp[vn++] = "cause mind blasting"; + if (spells & SF_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; + if (spells & (SF_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; + if (spells & (SF_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; + if (spells & (SF_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; + if (spells & (SF_CAUSE_4)) vp[vn++] = "cause mortal wounds"; + if (spells & SF_BO_ACID) vp[vn++] = "produce acid bolts"; + if (spells & SF_BO_ELEC) vp[vn++] = "produce lightning bolts"; + if (spells & SF_BO_FIRE) vp[vn++] = "produce fire bolts"; + if (spells & SF_BO_COLD) vp[vn++] = "produce frost bolts"; + if (spells & SF_BO_POIS) vp[vn++] = "produce poison bolts"; + if (spells & SF_BO_NETH) vp[vn++] = "produce nether bolts"; + if (spells & SF_BO_WATE) vp[vn++] = "produce water bolts"; + if (spells & SF_BO_MANA) vp[vn++] = "produce mana bolts"; + if (spells & SF_BO_PLAS) vp[vn++] = "produce plasma bolts"; + if (spells & SF_BO_ICEE) vp[vn++] = "produce ice bolts"; + if (spells & SF_MISSILE) vp[vn++] = "produce magic missiles"; + if (spells & SF_SCARE) vp[vn++] = "terrify"; + if (spells & SF_BLIND) vp[vn++] = "blind"; + if (spells & SF_CONF) vp[vn++] = "confuse"; + if (spells & SF_SLOW) vp[vn++] = "slow"; + if (spells & SF_HOLD) vp[vn++] = "paralyze"; + if (spells & SF_HASTE) vp[vn++] = "haste-self"; + if (spells & SF_HEAL) vp[vn++] = "heal-self"; + if (spells & SF_BLINK) vp[vn++] = "blink-self"; + if (spells & SF_TPORT) vp[vn++] = "teleport-self"; + if (spells & SF_S_BUG) vp[vn++] = "summon software bugs"; + if (spells & SF_S_RNG) vp[vn++] = "summon RNG"; + if (spells & SF_TELE_TO) vp[vn++] = "teleport to"; + if (spells & SF_TELE_AWAY) vp[vn++] = "teleport away"; + if (spells & SF_TELE_LEVEL) vp[vn++] = "teleport level"; + if (spells & SF_S_THUNDERLORD) vp[vn++] = "summon a Thunderlord"; + if (spells & SF_DARKNESS) vp[vn++] = "create darkness"; + if (spells & SF_TRAPS) vp[vn++] = "create traps"; + if (spells & SF_FORGET) vp[vn++] = "cause amnesia"; + if (spells & SF_RAISE_DEAD) vp[vn++] = "raise dead"; + if (spells & SF_S_MONSTER) vp[vn++] = "summon a monster"; + if (spells & SF_S_MONSTERS) vp[vn++] = "summon monsters"; + if (spells & SF_S_KIN) vp[vn++] = "summon aid"; + if (spells & SF_S_ANT) vp[vn++] = "summon ants"; + if (spells & SF_S_SPIDER) vp[vn++] = "summon spiders"; + if (spells & SF_S_HOUND) vp[vn++] = "summon hounds"; + if (spells & SF_S_HYDRA) vp[vn++] = "summon hydras"; + if (spells & SF_S_ANGEL) vp[vn++] = "summon an angel"; + if (spells & SF_S_DEMON) vp[vn++] = "summon a demon"; + if (spells & SF_S_UNDEAD) vp[vn++] = "summon an undead"; + if (spells & SF_S_DRAGON) vp[vn++] = "summon a dragon"; + if (spells & SF_S_ANIMAL) vp[vn++] = "summon animal"; + if (spells & SF_S_ANIMALS) vp[vn++] = "summon animals"; + if (spells & SF_S_HI_UNDEAD) vp[vn++] = "summon Greater Undead"; + if (spells & SF_S_HI_DRAGON) vp[vn++] = "summon Ancient Dragons"; + if (spells & SF_S_HI_DEMON) vp[vn++] = "summon Greater Demons"; + if (spells & SF_S_WRAITH) vp[vn++] = "summon Ringwraith"; + if (spells & SF_S_UNIQUE) vp[vn++] = "summon Unique Monsters"; /* Describe spells */ if (vn) @@ -633,7 +632,7 @@ static void roff_aux(std::shared_ptr r_ptr) { text_out(format("%^s is rarely detected by telepathy. ", wd_he[msex])); } - if (flags4 & RF4_MULTIPLY) + if (spells & SF_MULTIPLY) { text_out_c(TERM_L_UMBER, format("%^s breeds explosively. ", wd_he[msex])); } @@ -641,6 +640,7 @@ static void roff_aux(std::shared_ptr r_ptr) { text_out_c(TERM_L_WHITE, format("%^s regenerates quickly. ", wd_he[msex])); } + if (r_ptr->flags7 & RF7_MORTAL) { text_out_c(TERM_RED, format("%^s is a mortal being. ", wd_he[msex])); @@ -1388,7 +1388,7 @@ bool_ monster_quest(int r_idx) if (r_ptr->flags7 & RF7_AQUATIC) return FALSE; /* No random quests for multiplying monsters */ - if (r_ptr->flags4 & RF4_MULTIPLY) return FALSE; + if (r_ptr->spells & SF_MULTIPLY) return FALSE; return TRUE; } diff --git a/src/monster2.cc b/src/monster2.cc index 1adc9e7b..b387b495 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -22,6 +22,7 @@ #include "monster3.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -333,23 +334,19 @@ std::shared_ptr race_info_idx(int r_idx, int ego) nr_ptr->flags1 &= ~(re_ptr->nflags1); nr_ptr->flags2 &= ~(re_ptr->nflags2); nr_ptr->flags3 &= ~(re_ptr->nflags3); - nr_ptr->flags4 &= ~(re_ptr->nflags4); - nr_ptr->flags5 &= ~(re_ptr->nflags5); - nr_ptr->flags6 &= ~(re_ptr->nflags6); nr_ptr->flags7 &= ~(re_ptr->nflags7); nr_ptr->flags8 &= ~(re_ptr->nflags8); nr_ptr->flags9 &= ~(re_ptr->nflags9); + nr_ptr->spells &= ~(re_ptr->nspells); /* Add some flags */ nr_ptr->flags1 |= re_ptr->mflags1; nr_ptr->flags2 |= re_ptr->mflags2; nr_ptr->flags3 |= re_ptr->mflags3; - nr_ptr->flags4 |= re_ptr->mflags4; - nr_ptr->flags5 |= re_ptr->mflags5; - nr_ptr->flags6 |= re_ptr->mflags6; nr_ptr->flags7 |= re_ptr->mflags7; nr_ptr->flags8 |= re_ptr->mflags8; nr_ptr->flags9 |= re_ptr->mflags9; + nr_ptr->spells |= re_ptr->mspells; /* Change the char/attr is needed */ if (re_ptr->d_char != MEGO_CHAR_ANY) @@ -452,7 +449,7 @@ void delete_monster_idx(int i) r_ptr->on_saved = FALSE; /* Hack -- count the number of "reproducers" */ - if (r_ptr->flags4 & RF4_MULTIPLY) num_repro--; + if (r_ptr->spells & SF_MULTIPLY) num_repro--; /* XXX XXX XXX remove monster light source */ bool_ had_lite = FALSE; @@ -884,21 +881,6 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) if ((d_ptr->rules[rule].mflags3 & r_ptr->flags3) != d_ptr->rules[rule].mflags3) return FALSE; } - if (d_ptr->rules[rule].mflags4) - { - if ((d_ptr->rules[rule].mflags4 & r_ptr->flags4) != d_ptr->rules[rule].mflags4) - return FALSE; - } - if (d_ptr->rules[rule].mflags5) - { - if ((d_ptr->rules[rule].mflags5 & r_ptr->flags5) != d_ptr->rules[rule].mflags5) - return FALSE; - } - if (d_ptr->rules[rule].mflags6) - { - if ((d_ptr->rules[rule].mflags6 & r_ptr->flags6) != d_ptr->rules[rule].mflags6) - return FALSE; - } if (d_ptr->rules[rule].mflags7) { if ((d_ptr->rules[rule].mflags7 & r_ptr->flags7) != d_ptr->rules[rule].mflags7) @@ -914,6 +896,11 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) if ((d_ptr->rules[rule].mflags9 & r_ptr->flags9) != d_ptr->rules[rule].mflags9) return FALSE; } + if (d_ptr->rules[rule].mspells) + { + if ((d_ptr->rules[rule].mspells & r_ptr->spells) != d_ptr->rules[rule].mspells) + return FALSE; + } for (a = 0; a < 5; a++) { if (d_ptr->rules[rule].r_char[a] && (d_ptr->rules[rule].r_char[a] != r_ptr->d_char)) return FALSE; @@ -929,13 +916,12 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) if (d_ptr->rules[rule].mflags1 && (r_ptr->flags1 & d_ptr->rules[rule].mflags1)) return TRUE; if (d_ptr->rules[rule].mflags2 && (r_ptr->flags2 & d_ptr->rules[rule].mflags2)) return TRUE; if (d_ptr->rules[rule].mflags3 && (r_ptr->flags3 & d_ptr->rules[rule].mflags3)) return TRUE; - if (d_ptr->rules[rule].mflags4 && (r_ptr->flags4 & d_ptr->rules[rule].mflags4)) return TRUE; - if (d_ptr->rules[rule].mflags5 && (r_ptr->flags5 & d_ptr->rules[rule].mflags5)) return TRUE; - if (d_ptr->rules[rule].mflags6 && (r_ptr->flags6 & d_ptr->rules[rule].mflags6)) return TRUE; if (d_ptr->rules[rule].mflags7 && (r_ptr->flags7 & d_ptr->rules[rule].mflags7)) return TRUE; if (d_ptr->rules[rule].mflags8 && (r_ptr->flags8 & d_ptr->rules[rule].mflags8)) return TRUE; if (d_ptr->rules[rule].mflags9 && (r_ptr->flags9 & d_ptr->rules[rule].mflags9)) return TRUE; + if (d_ptr->rules[rule].mspells && (r_ptr->spells & d_ptr->rules[rule].mspells)) return TRUE; + for (a = 0; a < 5; a++) if (d_ptr->rules[rule].r_char[a] == r_ptr->d_char) return TRUE; @@ -2497,7 +2483,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; + if (r_ptr->spells & SF_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ @@ -3114,7 +3100,7 @@ static bool_ summon_specific_okay(int r_idx) !(r_ptr->flags3 & RF3_EVIL) && !(r_ptr->flags3 & RF3_UNDEAD) && !(r_ptr->flags3 & RF3_DEMON) && - !(r_ptr->flags4 || r_ptr->flags5 || r_ptr->flags6) && + !r_ptr->spells && !(r_ptr->flags1 & RF1_UNIQUE)); break; } diff --git a/src/monster3.cc b/src/monster3.cc index c718c880..ab002899 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -15,6 +15,7 @@ #include "melee2.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" #include "player_type.hpp" @@ -62,8 +63,8 @@ bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr) int s1 = is_friend(m_ptr), s2 = is_friend(t_ptr); /* Monsters hates breeders */ - if ((m_ptr->status != MSTATUS_NEUTRAL) && (rt_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE; - if ((t_ptr->status != MSTATUS_NEUTRAL) && (r_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE; + if ((m_ptr->status != MSTATUS_NEUTRAL) && (rt_ptr->spells & SF_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE; + if ((t_ptr->status != MSTATUS_NEUTRAL) && (r_ptr->spells & SF_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE; /* No special conditions, lets test normal flags */ if (s1 && s2 && (s1 == -s2)) return TRUE; @@ -205,7 +206,7 @@ bool_ ai_possessor(int m_idx, int o_idx) m_ptr->energy = 0; /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; + if (r_ptr->spells & SF_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; @@ -280,7 +281,7 @@ void ai_deincarnate(int m_idx) m_ptr->energy = 0; /* Hack -- Count the number of "reproducers" */ - if (r_ptr->flags4 & RF4_MULTIPLY) num_repro++; + if (r_ptr->spells & SF_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; @@ -411,7 +412,6 @@ bool_ do_control_drop(void) bool_ do_control_magic(void) { - int power = -1; int i; bool_ flag, redraw; int ask; @@ -431,7 +431,7 @@ bool_ do_control_magic(void) } /* Extract available monster powers */ - std::vector powers = extract_monster_powers(r_ptr, true); + auto powers = extract_monster_powers(r_ptr, true); int const num = powers.size(); // Avoid signed/unsigned warnings /* Are any powers available? */ @@ -443,6 +443,7 @@ bool_ do_control_magic(void) /* Nothing chosen yet */ flag = FALSE; + monster_power const *power = nullptr; /* No redraw yet */ redraw = FALSE; @@ -481,7 +482,7 @@ bool_ do_control_magic(void) while (ctr < num) { - monster_power *mp_ptr = &monster_powers[powers[ctr]]; + monster_power const *mp_ptr = powers[ctr]; label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26); @@ -565,7 +566,7 @@ bool_ do_control_magic(void) char tmp_val[160]; /* Prompt */ - strnfmt(tmp_val, 78, "Use %s? ", monster_powers[power].name); + strnfmt(tmp_val, 78, "Use %s? ", power->name); /* Belay that order */ if (!get_check(tmp_val)) continue; @@ -586,7 +587,7 @@ bool_ do_control_magic(void) if (flag) { energy_use = 100; - monst_spell_monst_spell = power + 96; + monst_spell_monst_spell = power->monster_spell_index; } return TRUE; } diff --git a/src/monster_ego.hpp b/src/monster_ego.hpp index 1154c537..010ff98f 100644 --- a/src/monster_ego.hpp +++ b/src/monster_ego.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "monster_blow.hpp" +#include "monster_spell_flag_set.hpp" #include @@ -55,24 +56,24 @@ struct monster_ego u32b mflags1 = 0; u32b mflags2 = 0; u32b mflags3 = 0; - u32b mflags4 = 0; - u32b mflags5 = 0; - u32b mflags6 = 0; u32b mflags7 = 0; u32b mflags8 = 0; u32b mflags9 = 0; + /* Monster spells */ + monster_spell_flag_set mspells; + /* Negative Flags, to be removed from the monster flags */ u32b nflags1 = 0; u32b nflags2 = 0; u32b nflags3 = 0; - u32b nflags4 = 0; - u32b nflags5 = 0; - u32b nflags6 = 0; u32b nflags7 = 0; u32b nflags8 = 0; u32b nflags9 = 0; + /* Negative spells; to be removed from the monster spells */ + monster_spell_flag_set nspells; + s16b level = 0; /* Level of creature */ s16b rarity = 0; /* Rarity of creature */ diff --git a/src/monster_power.hpp b/src/monster_power.hpp index 03d0f8a9..440d5ba1 100644 --- a/src/monster_power.hpp +++ b/src/monster_power.hpp @@ -1,5 +1,7 @@ #pragma once +#include "monster_power_fwd.hpp" + #include "h-basic.h" /** @@ -7,7 +9,7 @@ */ struct monster_power { - u32b power; /* Power RF?_xxx */ + u32b monster_spell_index; cptr name; /* Name of it */ int mana; /* Mana needed */ bool_ great; /* Need the use of great spells */ diff --git a/src/monster_power_fwd.hpp b/src/monster_power_fwd.hpp new file mode 100644 index 00000000..975d2d2f --- /dev/null +++ b/src/monster_power_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct monster_power; diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 94896c64..3a13e4b4 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -3,6 +3,7 @@ #include "body.hpp" #include "h-basic.h" #include "monster_blow.hpp" +#include "monster_spell_flag_set.hpp" #include "obj_theme.hpp" #include @@ -50,13 +51,12 @@ struct monster_race u32b flags1 = 0; /* Flags 1 (general) */ u32b flags2 = 0; /* Flags 2 (abilities) */ u32b flags3 = 0; /* Flags 3 (race/resist) */ - u32b flags4 = 0; /* Flags 4 (inate/breath) */ - u32b flags5 = 0; /* Flags 5 (normal spells) */ - u32b flags6 = 0; /* Flags 6 (special spells) */ u32b flags7 = 0; /* Flags 7 (movement related abilities) */ u32b flags8 = 0; /* Flags 8 (wilderness info) */ u32b flags9 = 0; /* Flags 9 (drops info) */ + monster_spell_flag_set spells; /* Spells */ + std::array blow { }; /* Up to four blows per round */ byte body_parts[BODY_MAX] = { 0 }; /* To help to decide what to use when body changing */ diff --git a/src/monster_spell.cc b/src/monster_spell.cc new file mode 100644 index 00000000..08627916 --- /dev/null +++ b/src/monster_spell.cc @@ -0,0 +1,36 @@ +#include "monster_spell.hpp" + +#include "monster_spell_flag.hpp" + +#include + +std::vector const &monster_spells() +{ + // Static instance for one-time initialization. + static std::vector instance; + + if (instance.empty()) + { +#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \ + instance.emplace_back(new monster_spell { \ + BOOST_PP_CAT(SF_, BOOST_PP_CAT(name, _IDX)), \ + BOOST_PP_CAT(SF_, name), \ + #name, \ + is_summon, \ + is_annoy, \ + is_damage, \ + is_bolt, \ + is_smart, \ + is_innate, \ + is_escape, \ + is_tactic, \ + is_haste, \ + is_heal, \ + !is_innate, \ + }); +#include "monster_spell_flag_list.hpp" +#undef SF + }; + + return instance; +} diff --git a/src/monster_spell.hpp b/src/monster_spell.hpp new file mode 100644 index 00000000..4dfaf974 --- /dev/null +++ b/src/monster_spell.hpp @@ -0,0 +1,91 @@ +#pragma once + +#include "monster_spell_flag_set.hpp" + +#include + +struct monster_spell { + + /** + * The global index of the spell. + */ + const std::size_t spell_idx; + + /** + * Flag set representation of the spell. + */ + const monster_spell_flag_set flag_set; + + /** + * System name of the spell as a string. + */ + const char *name; + + /** + * Is the spell a summoning spell? + */ + const bool is_summon; + + /** + * Is the spell an "annoyance" spell? + */ + const bool is_annoy; + + /** + * Is the spell a direct damage spell? + */ + const bool is_damage; + + /** + * Is the spell a bolt spell, i.e. would it + * affect any creature along the trajectory from + * the source to its target? + */ + const bool is_bolt; + + /** + * Does the spell require an intelligent caster? + */ + const bool is_smart; + + /** + * Is the spell an innate attack? For example, breaths + * are innate attacks. + */ + const bool is_innate; + + /** + * Is the spell an escape spell? + */ + const bool is_escape; + + /** + * Is the spell a "tactical" spell? + */ + const bool is_tactic; + + /** + * Does the spell apply haste? + */ + const bool is_haste; + + /** + * Does the spell apply any healing? + */ + const bool is_heal; + + /** + * Is the spell "magical" in nature? Magical spells + * can be stopped by the anti-magic field, and non-magical + * ones cannot. + * + * This is the inverse of the "innate" flag. + */ + const bool is_magic; + +}; + +/** + * Get a vector of all the spells. + */ +std::vector const &monster_spells(); diff --git a/src/monster_spell_flag.hpp b/src/monster_spell_flag.hpp new file mode 100644 index 00000000..3de649ec --- /dev/null +++ b/src/monster_spell_flag.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "monster_spell_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \ + DECLARE_FLAG(monster_spell_flag_set, BOOST_PP_CAT(SF_,name), tier, index) +#include "monster_spell_flag_list.hpp" +#undef SF + +// +// Define index for each flag. +// +#define SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) \ + constexpr std::size_t BOOST_PP_CAT(BOOST_PP_CAT(SF_,name), _IDX) = (tier - 1) * 32 + index; +#include "monster_spell_flag_list.hpp" +#undef SF diff --git a/src/monster_spell_flag_list.hpp b/src/monster_spell_flag_list.hpp new file mode 100644 index 00000000..4a201db5 --- /dev/null +++ b/src/monster_spell_flag_list.hpp @@ -0,0 +1,102 @@ +/** + * X-macro list of all the monster race flags + */ + +/* SF(tier, index, name, is_summon, is_annoy, is_damage, is_bolt, is_smart, is_innate, is_escape, is_tactic, is_haste, is_heal) */ + +SF(1, 0, SHRIEK , false, true , false, false, false, true , false, false, false, false) +SF(1, 1, MULTIPLY , false, false, false, false, false, true , false, false, false, false) +SF(1, 2, S_ANIMAL , true , false, false, false, true , false, false, false, false, false) +SF(1, 3, ROCKET , false, false, true , false, false, true , false, false, false, false) +SF(1, 4, ARROW_1 , false, false, true , true , false, true , false, false, false, false) +SF(1, 5, ARROW_2 , false, false, true , true , false, true , false, false, false, false) +SF(1, 6, ARROW_3 , false, false, true , true , false, true , false, false, false, false) +SF(1, 7, ARROW_4 , false, false, true , true , false, true , false, false, false, false) +SF(1, 8, BR_ACID , false, false, true , false, false, true , false, false, false, false) +SF(1, 9, BR_ELEC , false, false, true , false, false, true , false, false, false, false) +SF(1, 10, BR_FIRE , false, false, true , false, false, true , false, false, false, false) +SF(1, 11, BR_COLD , false, false, true , false, false, true , false, false, false, false) +SF(1, 12, BR_POIS , false, false, true , false, false, true , false, false, false, false) +SF(1, 13, BR_NETH , false, false, true , false, false, true , false, false, false, false) +SF(1, 14, BR_LITE , false, false, true , false, false, true , false, false, false, false) +SF(1, 15, BR_DARK , false, false, true , false, false, true , false, false, false, false) +SF(1, 16, BR_CONF , false, false, true , false, false, true , false, false, false, false) +SF(1, 17, BR_SOUN , false, false, true , false, false, true , false, false, false, false) +SF(1, 18, BR_CHAO , false, false, true , false, false, true , false, false, false, false) +SF(1, 19, BR_DISE , false, false, true , false, false, true , false, false, false, false) +SF(1, 20, BR_NEXU , false, false, true , false, false, true , false, false, false, false) +SF(1, 21, BR_TIME , false, false, true , false, false, true , false, false, false, false) +SF(1, 22, BR_INER , false, false, true , false, false, true , false, false, false, false) +SF(1, 23, BR_GRAV , false, false, true , false, false, true , false, false, false, false) +SF(1, 24, BR_SHAR , false, false, true , false, false, true , false, false, false, false) +SF(1, 25, BR_PLAS , false, false, true , false, false, true , false, false, false, false) +SF(1, 26, BR_WALL , false, false, true , false, false, true , false, false, false, false) +SF(1, 27, BR_MANA , false, false, true , false, false, true , false, false, false, false) +SF(1, 28, BA_NUKE , false, false, true , false, false, false, false, false, false, false) +SF(1, 29, BR_NUKE , false, false, true , false, false, true , false, false, false, false) +SF(1, 30, BA_CHAO , false, false, true , false, false, false, false, false, false, false) +SF(1, 31, BR_DISI , false, false, true , false, false, true , false, false, false, false) +SF(2, 0, BA_ACID , false, false, true , false, false, false, false, false, false, false) +SF(2, 1, BA_ELEC , false, false, true , false, false, false, false, false, false, false) +SF(2, 2, BA_FIRE , false, false, true , false, false, false, false, false, false, false) +SF(2, 3, BA_COLD , false, false, true , false, false, false, false, false, false, false) +SF(2, 4, BA_POIS , false, false, true , false, false, false, false, false, false, false) +SF(2, 5, BA_NETH , false, false, true , false, false, false, false, false, false, false) +SF(2, 6, BA_WATE , false, false, true , false, false, false, false, false, false, false) +SF(2, 7, BA_MANA , false, false, true , false, false, false, false, false, false, false) +SF(2, 8, BA_DARK , false, false, true , false, false, false, false, false, false, false) +SF(2, 9, DRAIN_MANA , false, true , false, false, false, false, false, false, false, false) +SF(2, 10, MIND_BLAST , false, true , false, false, false, false, false, false, false, false) +SF(2, 11, BRAIN_SMASH , false, true , false, false, false, false, false, false, false, false) +SF(2, 12, CAUSE_1 , false, true , true , false, false, false, false, false, false, false) +SF(2, 13, CAUSE_2 , false, true , true , false, false, false, false, false, false, false) +SF(2, 14, CAUSE_3 , false, true , true , false, false, false, false, false, false, false) +SF(2, 15, CAUSE_4 , false, true , true , false, false, false, false, false, false, false) +SF(2, 16, BO_ACID , false, false, true , true , false, false, false, false, false, false) +SF(2, 17, BO_ELEC , false, false, true , true , false, false, false, false, false, false) +SF(2, 18, BO_FIRE , false, false, true , true , false, false, false, false, false, false) +SF(2, 19, BO_COLD , false, false, true , true , false, false, false, false, false, false) +SF(2, 20, BO_POIS , false, false, true , true , false, false, false, false, false, false) +SF(2, 21, BO_NETH , false, false, true , true , false, false, false, false, false, false) +SF(2, 22, BO_WATE , false, false, true , true , false, false, false, false, false, false) +SF(2, 23, BO_MANA , false, false, true , true , false, false, false, false, false, false) +SF(2, 24, BO_PLAS , false, false, true , true , false, false, false, false, false, false) +SF(2, 25, BO_ICEE , false, false, true , true , false, false, false, false, false, false) +SF(2, 26, MISSILE , false, false, true , true , false, false, false, false, false, false) +SF(2, 27, SCARE , false, true , false, false, true , false, false, false, false, false) +SF(2, 28, BLIND , false, true , false, false, true , false, false, false, false, false) +SF(2, 29, CONF , false, true , false, false, true , false, false, false, false, false) +SF(2, 30, SLOW , false, true , false, false, true , false, false, false, false, false) +SF(2, 31, HOLD , false, true , false, false, true , false, false, false, false, false) +SF(3, 0, HASTE , false, false, false, false, true , false, false, false, true , false) +SF(3, 1, HAND_DOOM , false, false, true , false, false, false, false, false, false, false) +SF(3, 2, HEAL , false, false, false, false, true , false, false, false, false, true ) +SF(3, 3, S_ANIMALS , true , false, false, false, true , false, false, false, false, false) +SF(3, 4, BLINK , false, false, false, false, true , false, true , true , false, false) +SF(3, 5, TPORT , false, false, false, false, true , false, true , false, false, false) +SF(3, 6, TELE_TO , false, true , false, false, false, false, false, false, false, false) +SF(3, 7, TELE_AWAY , false, false, false, false, true , false, true , false, false, false) +SF(3, 8, TELE_LEVEL , false, false, false, false, true , false, true , false, false, false) +SF(3, 9, DARKNESS , false, true , false, false, false, false, false, false, false, false) +SF(3, 10, TRAPS , false, true , false, false, true , false, false, false, false, false) +SF(3, 11, FORGET , false, true , false, false, false, false, false, false, false, false) +SF(3, 12, RAISE_DEAD , false, false, false, false, false, false, false, false, false, false) +SF(3, 13, S_BUG , true , false, false, false, true , false, false, false, false, false) +SF(3, 14, S_RNG , true , false, false, false, true , false, false, false, false, false) +SF(3, 15, S_THUNDERLORD, true , false, false, false, true , false, false, false, false, false) +SF(3, 16, S_KIN , true , false, false, false, true , false, false, false, false, false) +SF(3, 17, S_HI_DEMON , true , false, false, false, true , false, false, false, false, false) +SF(3, 18, S_MONSTER , true , false, false, false, true , false, false, false, false, false) +SF(3, 19, S_MONSTERS , true , false, false, false, true , false, false, false, false, false) +SF(3, 20, S_ANT , true , false, false, false, true , false, false, false, false, false) +SF(3, 21, S_SPIDER , true , false, false, false, true , false, false, false, false, false) +SF(3, 22, S_HOUND , true , false, false, false, true , false, false, false, false, false) +SF(3, 23, S_HYDRA , true , false, false, false, true , false, false, false, false, false) +SF(3, 24, S_ANGEL , true , false, false, false, true , false, false, false, false, false) +SF(3, 25, S_DEMON , true , false, false, false, true , false, false, false, false, false) +SF(3, 26, S_UNDEAD , true , false, false, false, true , false, false, false, false, false) +SF(3, 27, S_DRAGON , true , false, false, false, true , false, false, false, false, false) +SF(3, 28, S_HI_UNDEAD , true , false, false, false, true , false, false, false, false, false) +SF(3, 29, S_HI_DRAGON , true , false, false, false, true , false, false, false, false, false) +SF(3, 30, S_WRAITH , true , false, false, false, true , false, false, false, false, false) +SF(3, 31, S_UNIQUE , true , false, false, false, true , false, false, false, false, false) diff --git a/src/monster_spell_flag_set.hpp b/src/monster_spell_flag_set.hpp new file mode 100644 index 00000000..37d31665 --- /dev/null +++ b/src/monster_spell_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t SF_MAX_TIERS = 3; + +typedef flag_set monster_spell_flag_set; diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 7af282bf..dac4fef7 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -2,6 +2,7 @@ #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_type.hpp" @@ -38,7 +39,7 @@ static bool_ lua_mon_hook_bounty(int r_idx) if (r_ptr->flags7 & RF7_FRIENDLY) return (FALSE); /* Accept only monsters that are not breeders */ - if (r_ptr->flags4 & RF4_MULTIPLY) return (FALSE); + if (r_ptr->spells & SF_MULTIPLY) return (FALSE); /* Forbid joke monsters */ if (r_ptr->flags8 & RF8_JOKEANGBAND) return (FALSE); diff --git a/src/q_god.cc b/src/q_god.cc index 3714e457..d9bf955c 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -9,6 +9,7 @@ #include "hook_enter_dungeon_in.hpp" #include "hook_player_level_in.hpp" #include "hooks.hpp" +#include "monster_spell_flag.hpp" #include "object2.hpp" #include "player_type.hpp" #include "quark.hpp" @@ -534,8 +535,8 @@ static void quest_god_set_god_dungeon_attributes_manwe() * too. They would have ransacked his elf-loving temple :) */ d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE; d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS; - d_info[DUNGEON_GOD].rules[2].mflags4 = RF4_BR_POIS | RF4_BR_GRAV; - d_info[DUNGEON_GOD].rules[3].mflags5 = RF5_BA_POIS; + d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV; + d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS; d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY; } @@ -784,8 +785,8 @@ static void quest_god_set_god_dungeon_attributes_varda() /* M: We want air(poison-type) or flying characters. Orcs too. */ d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE; d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS; - d_info[DUNGEON_GOD].rules[2].mflags4 = RF4_BR_POIS | RF4_BR_GRAV; - d_info[DUNGEON_GOD].rules[3].mflags5 = RF5_BA_POIS; + d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV; + d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS; d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY; } diff --git a/src/q_poison.cc b/src/q_poison.cc index a5b274b0..464c93ef 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -10,6 +10,7 @@ #include "messages.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" #include "player_type.hpp" @@ -33,7 +34,7 @@ static bool_ create_molds_hook(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags4 & RF4_MULTIPLY) return FALSE; + if (r_ptr->spells & SF_MULTIPLY) return FALSE; if (r_ptr->d_char == 'm') return TRUE; else if (r_ptr->d_char == ',') return TRUE; diff --git a/src/q_rand.cc b/src/q_rand.cc index bc3f2609..26903848 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -15,8 +15,9 @@ #include "messages.hpp" #include "monster2.hpp" #include "monster3.hpp" -#include "monster_type.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" +#include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -115,7 +116,7 @@ void initialize_random_quests(int n) if (r_ptr->flags9 & RF9_NEVER_GENE) continue; /* Accept only monsters that are not breeders */ - if (r_ptr->flags4 & RF4_MULTIPLY) continue; + if (r_ptr->spells & SF_MULTIPLY) continue; /* Forbid joke monsters */ if (r_ptr->flags8 & RF8_JOKEANGBAND) continue; diff --git a/src/rule_type.hpp b/src/rule_type.hpp index d2e510a7..d6424641 100644 --- a/src/rule_type.hpp +++ b/src/rule_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "monster_spell_flag_set.hpp" /* Define monster generation rules */ struct rule_type @@ -11,12 +12,11 @@ struct rule_type u32b mflags1 = 0; /* The monster flags that are allowed */ u32b mflags2 = 0; u32b mflags3 = 0; - u32b mflags4 = 0; - u32b mflags5 = 0; - u32b mflags6 = 0; u32b mflags7 = 0; u32b mflags8 = 0; u32b mflags9 = 0; + monster_spell_flag_set mspells; /* Monster spells the are allowed */ + char r_char[5] = { 0 }; /* Monster race allowed */ }; diff --git a/src/spells1.cc b/src/spells1.cc index cad09a92..98520b04 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -21,8 +21,9 @@ #include "melee2.hpp" #include "monster2.hpp" #include "monster3.hpp" -#include "monster_type.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" +#include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -599,7 +600,7 @@ void teleport_player(int dis) { auto const r_ptr = m_list[cave[oy + yy][ox + xx].m_idx].race(); - if ((r_ptr->flags6 & RF6_TPORT) && !(r_ptr->flags3 & RF3_RES_TELE)) + if ((r_ptr->spells & SF_TPORT) && !(r_ptr->flags3 & RF3_RES_TELE)) /* * The latter limitation is to avoid * totally unkillable suckers... @@ -4830,7 +4831,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; do_poly = TRUE; do_conf = (5 + randint(11) + r) / (r + 1); - if ((r_ptr->flags4 & RF4_BR_CHAO) || + if ((r_ptr->spells & SF_BR_CHAO) || ((r_ptr->flags3 & RF3_DEMON) && (randint(3) == 1))) { note = " resists."; @@ -4846,7 +4847,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & RF4_BR_SHAR) + if (r_ptr->spells & SF_BR_SHAR) { note = " resists."; dam *= 3; @@ -4862,7 +4863,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; if (magik(12)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & RF4_BR_SHAR) + if (r_ptr->spells & SF_BR_SHAR) { note = " resists somewhat."; dam /= 2; @@ -4883,7 +4884,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } else do_stun = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & RF4_BR_SOUN) + if (r_ptr->spells & SF_BR_SOUN) { note = " resists."; dam *= 2; @@ -4897,7 +4898,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; do_conf = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags4 & RF4_BR_CONF) + if (r_ptr->spells & SF_BR_CONF) { note = " resists."; dam *= 2; @@ -5025,7 +5026,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* --hack-- Only stun if a monster fired it */ else do_stun = (randint(15) + r) / (r + 1); - if (r_ptr->flags4 & RF4_BR_WALL) + if (r_ptr->spells & SF_BR_WALL) { note = " resists."; dam *= 3; @@ -5038,7 +5039,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_INERTIA: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & RF4_BR_INER) + if (r_ptr->spells & SF_BR_INER) { note = " resists."; dam *= 3; @@ -5065,7 +5066,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TIME: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & RF4_BR_TIME) + if (r_ptr->spells & SF_BR_TIME) { note = " resists."; dam *= 3; @@ -5098,7 +5099,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (!resist_tele) do_dist = 10; else do_dist = 0; - if (r_ptr->flags4 & RF4_BR_GRAV) + if (r_ptr->spells & SF_BR_GRAV) { note = " resists."; dam *= 3; @@ -6068,7 +6069,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_LITE: { if (seen) obvious = TRUE; - if (r_ptr->flags4 & RF4_BR_LITE) + if (r_ptr->spells & SF_BR_LITE) { note = " resists."; dam *= 2; @@ -6090,7 +6091,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Likes darkness... */ - if ((r_ptr->flags4 & RF4_BR_DARK) || + if ((r_ptr->spells & SF_BR_DARK) || (r_ptr->flags3 & RF3_ORC) || (r_ptr->flags3 & RF3_HURT_LITE)) { @@ -6620,14 +6621,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((who > 0) && (dam > m_ptr->hp)) dam = m_ptr->hp; } - if (do_pois && (!(r_ptr->flags3 & RF3_IM_POIS)) && (!(r_ptr->flags3 & RF4_BR_POIS)) && hurt_monster(m_ptr)) + if (do_pois && (!(r_ptr->flags3 & RF3_IM_POIS)) && (!(r_ptr->flags3 & SF_BR_POIS)) && hurt_monster(m_ptr)) { if (m_ptr->poisoned) note = " is more poisoned."; else note = " is poisoned."; m_ptr->poisoned += do_pois; } - if (do_cut && (!(r_ptr->flags4 & RF4_BR_WALL)) && hurt_monster(m_ptr)) + if (do_cut && (!(r_ptr->spells & SF_BR_WALL)) && hurt_monster(m_ptr)) { if (m_ptr->bleeding) note = " bleeds more strongly."; else note = " starts bleeding."; @@ -6760,8 +6761,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Sound and Impact breathers never stun */ else if (do_stun && - !(r_ptr->flags4 & RF4_BR_SOUN) && - !(r_ptr->flags4 & RF4_BR_WALL) && hurt_monster(m_ptr)) + !(r_ptr->spells & SF_BR_SOUN) && + !(r_ptr->spells & SF_BR_WALL) && hurt_monster(m_ptr)) { /* Obvious */ if (seen) obvious = TRUE; @@ -6785,8 +6786,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Confusion and Chaos breathers (and sleepers) never confuse */ else if (do_conf && !(r_ptr->flags3 & RF3_NO_CONF) && - !(r_ptr->flags4 & RF4_BR_CONF) && - !(r_ptr->flags4 & RF4_BR_CHAO) && hurt_monster(m_ptr)) + !(r_ptr->spells & SF_BR_CONF) && + !(r_ptr->spells & SF_BR_CHAO) && hurt_monster(m_ptr)) { /* Obvious */ if (seen) obvious = TRUE; diff --git a/src/spells2.cc b/src/spells2.cc index 09374ceb..08d65a4b 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -22,6 +22,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "notes.hpp" #include "object1.hpp" @@ -882,7 +883,7 @@ void self_knowledge(FILE *fff) info[i++] = "You have an empty mind."; if (r_ptr->flags2 & RF2_WEIRD_MIND) info[i++] = "You have a weird mind."; - if (r_ptr->flags4 & RF4_MULTIPLY) + if (r_ptr->spells & SF_MULTIPLY) info[i++] = "You can multiply."; if (r_ptr->flags2 & RF2_POWERFUL) info[i++] = "You have strong breath."; @@ -974,186 +975,183 @@ void self_knowledge(FILE *fff) if (r_ptr->flags3 & RF3_NO_SLEEP) info[i++] = "You are immune to sleep."; - if (r_ptr->flags4 & RF4_SHRIEK) + if (r_ptr->spells & SF_SHRIEK) info[i++] = "You can aggravate monsters."; - if (r_ptr->flags4 & RF4_ROCKET) + if (r_ptr->spells & SF_ROCKET) info[i++] = "You can fire a rocket."; - if (r_ptr->flags4 & RF4_ARROW_1) + if (r_ptr->spells & SF_ARROW_1) info[i++] = "You can fire a light arrow."; - if (r_ptr->flags4 & RF4_ARROW_2) + if (r_ptr->spells & SF_ARROW_2) info[i++] = "You can fire a heavy arrow."; - if (r_ptr->flags4 & RF4_ARROW_3) + if (r_ptr->spells & SF_ARROW_3) info[i++] = "You can fire a light missile."; - if (r_ptr->flags4 & RF4_ARROW_4) + if (r_ptr->spells & SF_ARROW_4) info[i++] = "You can fire a heavy missile."; - if (r_ptr->flags4 & RF4_BR_ACID) + if (r_ptr->spells & SF_BR_ACID) info[i++] = "You can breathe acid."; - if (r_ptr->flags4 & RF4_BR_ELEC) + if (r_ptr->spells & SF_BR_ELEC) info[i++] = "You can breathe electricity."; - if (r_ptr->flags4 & RF4_BR_FIRE) + if (r_ptr->spells & SF_BR_FIRE) info[i++] = "You can breathe fire."; - if (r_ptr->flags4 & RF4_BR_COLD) + if (r_ptr->spells & SF_BR_COLD) info[i++] = "You can breathe cold."; - if (r_ptr->flags4 & RF4_BR_POIS) + if (r_ptr->spells & SF_BR_POIS) info[i++] = "You can breathe poison."; - if (r_ptr->flags4 & RF4_BR_NETH) + if (r_ptr->spells & SF_BR_NETH) info[i++] = "You can breathe nether."; - if (r_ptr->flags4 & RF4_BR_LITE) + if (r_ptr->spells & SF_BR_LITE) info[i++] = "You can breathe light."; - if (r_ptr->flags4 & RF4_BR_DARK) + if (r_ptr->spells & SF_BR_DARK) info[i++] = "You can breathe darkness."; - if (r_ptr->flags4 & RF4_BR_CONF) + if (r_ptr->spells & SF_BR_CONF) info[i++] = "You can breathe confusion."; - if (r_ptr->flags4 & RF4_BR_SOUN) + if (r_ptr->spells & SF_BR_SOUN) info[i++] = "You can breathe sound."; - if (r_ptr->flags4 & RF4_BR_CHAO) + if (r_ptr->spells & SF_BR_CHAO) info[i++] = "You can breathe chaos."; - if (r_ptr->flags4 & RF4_BR_DISE) + if (r_ptr->spells & SF_BR_DISE) info[i++] = "You can breathe disenchantment."; - if (r_ptr->flags4 & RF4_BR_NEXU) + if (r_ptr->spells & SF_BR_NEXU) info[i++] = "You can breathe nexus."; - if (r_ptr->flags4 & RF4_BR_TIME) + if (r_ptr->spells & SF_BR_TIME) info[i++] = "You can breathe time."; - if (r_ptr->flags4 & RF4_BR_INER) + if (r_ptr->spells & SF_BR_INER) info[i++] = "You can breathe inertia."; - if (r_ptr->flags4 & RF4_BR_GRAV) + if (r_ptr->spells & SF_BR_GRAV) info[i++] = "You can breathe gravity."; - if (r_ptr->flags4 & RF4_BR_SHAR) + if (r_ptr->spells & SF_BR_SHAR) info[i++] = "You can breathe shards."; - if (r_ptr->flags4 & RF4_BR_PLAS) + if (r_ptr->spells & SF_BR_PLAS) info[i++] = "You can breathe plasma."; - if (r_ptr->flags4 & RF4_BR_WALL) + if (r_ptr->spells & SF_BR_WALL) info[i++] = "You can breathe force."; - if (r_ptr->flags4 & RF4_BR_MANA) + if (r_ptr->spells & SF_BR_MANA) info[i++] = "You can breathe mana."; - if (r_ptr->flags4 & RF4_BR_NUKE) + if (r_ptr->spells & SF_BR_NUKE) info[i++] = "You can breathe nuke."; - if (r_ptr->flags4 & RF4_BR_DISI) + if (r_ptr->spells & SF_BR_DISI) info[i++] = "You can breathe disintegration."; - if (r_ptr->flags5 & RF5_BA_ACID) + if (r_ptr->spells & SF_BA_ACID) info[i++] = "You can cast a ball of acid."; - if (r_ptr->flags5 & RF5_BA_ELEC) + if (r_ptr->spells & SF_BA_ELEC) info[i++] = "You can cast a ball of electricity."; - if (r_ptr->flags5 & RF5_BA_FIRE) + if (r_ptr->spells & SF_BA_FIRE) info[i++] = "You can cast a ball of fire."; - if (r_ptr->flags5 & RF5_BA_COLD) + if (r_ptr->spells & SF_BA_COLD) info[i++] = "You can cast a ball of cold."; - if (r_ptr->flags5 & RF5_BA_POIS) + if (r_ptr->spells & SF_BA_POIS) info[i++] = "You can cast a ball of poison."; - if (r_ptr->flags5 & RF5_BA_NETH) + if (r_ptr->spells & SF_BA_NETH) info[i++] = "You can cast a ball of nether."; - if (r_ptr->flags5 & RF5_BA_WATE) + if (r_ptr->spells & SF_BA_WATE) info[i++] = "You can cast a ball of water."; - /* Not implemented */ - if (r_ptr->flags5 & RF5_DRAIN_MANA) + if (r_ptr->spells & SF_DRAIN_MANA) info[i++] = "You can drain mana."; - if (r_ptr->flags5 & RF5_MIND_BLAST) + if (r_ptr->spells & SF_MIND_BLAST) info[i++] = "You can cause mind blasting."; - if (r_ptr->flags5 & RF5_BRAIN_SMASH) + if (r_ptr->spells & SF_BRAIN_SMASH) info[i++] = "You can cause brain smashing."; - if (r_ptr->flags5 & RF5_CAUSE_1) + if (r_ptr->spells & SF_CAUSE_1) info[i++] = "You can cause light wounds."; - if (r_ptr->flags5 & RF5_CAUSE_2) + if (r_ptr->spells & SF_CAUSE_2) info[i++] = "You can cause serious wounds."; - if (r_ptr->flags5 & RF5_CAUSE_3) + if (r_ptr->spells & SF_CAUSE_3) info[i++] = "You can cause critical wounds."; - if (r_ptr->flags5 & RF5_CAUSE_4) + if (r_ptr->spells & SF_CAUSE_4) info[i++] = "You can cause mortal wounds."; - if (r_ptr->flags5 & RF5_BO_ACID) + if (r_ptr->spells & SF_BO_ACID) info[i++] = "You can cast a bolt of acid."; - if (r_ptr->flags5 & RF5_BO_ELEC) + if (r_ptr->spells & SF_BO_ELEC) info[i++] = "You can cast a bolt of electricity."; - if (r_ptr->flags5 & RF5_BO_FIRE) + if (r_ptr->spells & SF_BO_FIRE) info[i++] = "You can cast a bolt of fire."; - if (r_ptr->flags5 & RF5_BO_COLD) + if (r_ptr->spells & SF_BO_COLD) info[i++] = "You can cast a bolt of cold."; - if (r_ptr->flags5 & RF5_BO_POIS) + if (r_ptr->spells & SF_BO_POIS) info[i++] = "You can cast a bolt of poison."; - if (r_ptr->flags5 & RF5_BO_NETH) + if (r_ptr->spells & SF_BO_NETH) info[i++] = "You can cast a bolt of nether."; - if (r_ptr->flags5 & RF5_BO_WATE) + if (r_ptr->spells & SF_BO_WATE) info[i++] = "You can cast a bolt of water."; - if (r_ptr->flags5 & RF5_BO_MANA) + if (r_ptr->spells & SF_BO_MANA) info[i++] = "You can cast a bolt of mana."; - if (r_ptr->flags5 & RF5_BO_PLAS) + if (r_ptr->spells & SF_BO_PLAS) info[i++] = "You can cast a bolt of plasma."; - if (r_ptr->flags5 & RF5_BO_ICEE) + if (r_ptr->spells & SF_BO_ICEE) info[i++] = "You can cast a bolt of ice."; - if (r_ptr->flags5 & RF5_MISSILE) + if (r_ptr->spells & SF_MISSILE) info[i++] = "You can cast magic missile."; - if (r_ptr->flags5 & RF5_SCARE) + if (r_ptr->spells & SF_SCARE) info[i++] = "You can terrify."; - if (r_ptr->flags5 & RF5_BLIND) + if (r_ptr->spells & SF_BLIND) info[i++] = "You can blind."; - if (r_ptr->flags5 & RF5_CONF) + if (r_ptr->spells & SF_CONF) info[i++] = "You can use confusion."; - if (r_ptr->flags5 & RF5_SLOW) + if (r_ptr->spells & SF_SLOW) info[i++] = "You can cast slow."; - if (r_ptr->flags5 & RF5_HOLD) + if (r_ptr->spells & SF_HOLD) info[i++] = "You can touch to paralyze."; - if (r_ptr->flags6 & RF6_HASTE) + if (r_ptr->spells & SF_HASTE) info[i++] = "You can haste yourself."; - if (r_ptr->flags6 & RF6_HAND_DOOM) + if (r_ptr->spells & SF_HAND_DOOM) info[i++] = "You can invoke Hand of Doom."; - if (r_ptr->flags6 & RF6_HEAL) + if (r_ptr->spells & SF_HEAL) info[i++] = "You can heal yourself."; - if (r_ptr->flags6 & RF6_BLINK) + if (r_ptr->spells & SF_BLINK) info[i++] = "You can blink."; - if (r_ptr->flags6 & RF6_TPORT) + if (r_ptr->spells & SF_TPORT) info[i++] = "You can teleport."; - if (r_ptr->flags6 & RF6_TELE_TO) + if (r_ptr->spells & SF_TELE_TO) info[i++] = "You can go between places."; - if (r_ptr->flags6 & RF6_TELE_AWAY) + if (r_ptr->spells & SF_TELE_AWAY) info[i++] = "You can teleport away."; - if (r_ptr->flags6 & RF6_TELE_LEVEL) + if (r_ptr->spells & SF_TELE_LEVEL) info[i++] = "You can teleport level."; - if (r_ptr->flags6 & RF6_DARKNESS) + if (r_ptr->spells & SF_DARKNESS) info[i++] = "You can create darkness."; - if (r_ptr->flags6 & RF6_TRAPS) + if (r_ptr->spells & SF_TRAPS) info[i++] = "You can create traps."; - /* Not implemented */ - if (r_ptr->flags6 & RF6_FORGET) + if (r_ptr->spells & SF_FORGET) info[i++] = "You can fade memories."; - if (r_ptr->flags6 & RF6_RAISE_DEAD) + if (r_ptr->spells & SF_RAISE_DEAD) info[i++] = "You can Raise the Dead."; - if (r_ptr->flags6 & RF6_S_BUG) + if (r_ptr->spells & SF_S_BUG) info[i++] = "You can magically summon a Software Bugs."; - if (r_ptr->flags6 & RF6_S_RNG) + if (r_ptr->spells & SF_S_RNG) info[i++] = "You can magically summon the RNG."; - if (r_ptr->flags6 & RF6_S_THUNDERLORD) + if (r_ptr->spells & SF_S_THUNDERLORD) info[i++] = "You can magically summon some Thunderlords."; - if (r_ptr->flags6 & RF6_S_KIN) + if (r_ptr->spells & SF_S_KIN) info[i++] = "You can magically summon some Kins."; - if (r_ptr->flags6 & RF6_S_HI_DEMON) + if (r_ptr->spells & SF_S_HI_DEMON) info[i++] = "You can magically summon greater demons."; - if (r_ptr->flags6 & RF6_S_MONSTER) + if (r_ptr->spells & SF_S_MONSTER) info[i++] = "You can magically summon a monster."; - if (r_ptr->flags6 & RF6_S_MONSTERS) + if (r_ptr->spells & SF_S_MONSTERS) info[i++] = "You can magically summon monsters."; - if (r_ptr->flags6 & RF6_S_ANT) + if (r_ptr->spells & SF_S_ANT) info[i++] = "You can magically summon ants."; - if (r_ptr->flags6 & RF6_S_SPIDER) + if (r_ptr->spells & SF_S_SPIDER) info[i++] = "You can magically summon spiders."; - if (r_ptr->flags6 & RF6_S_HOUND) + if (r_ptr->spells & SF_S_HOUND) info[i++] = "You can magically summon hounds."; - if (r_ptr->flags6 & RF6_S_HYDRA) + if (r_ptr->spells & SF_S_HYDRA) info[i++] = "You can magically summon hydras."; - if (r_ptr->flags6 & RF6_S_ANGEL) + if (r_ptr->spells & SF_S_ANGEL) info[i++] = "You can magically summon an angel."; - if (r_ptr->flags6 & RF6_S_DEMON) + if (r_ptr->spells & SF_S_DEMON) info[i++] = "You can magically summon a demon."; - if (r_ptr->flags6 & RF6_S_UNDEAD) + if (r_ptr->spells & SF_S_UNDEAD) info[i++] = "You can magically summon an undead."; - if (r_ptr->flags6 & RF6_S_DRAGON) + if (r_ptr->spells & SF_S_DRAGON) info[i++] = "You can magically summon a dragon."; - if (r_ptr->flags6 & RF6_S_HI_UNDEAD) + if (r_ptr->spells & SF_S_HI_UNDEAD) info[i++] = "You can magically summon greater undead."; - if (r_ptr->flags6 & RF6_S_HI_DRAGON) + if (r_ptr->spells & SF_S_HI_DRAGON) info[i++] = "You can magically summon greater dragons."; - if (r_ptr->flags6 & RF6_S_WRAITH) + if (r_ptr->spells & SF_S_WRAITH) info[i++] = "You can magically summon a wraith."; - /* Not implemented */ - if (r_ptr->flags6 & RF6_S_UNIQUE) + if (r_ptr->spells & SF_S_UNIQUE) info[i++] = "You can magically summon an unique monster."; /* Not implemented */ if (r_ptr->flags7 & RF7_AQUATIC) diff --git a/src/tables.cc b/src/tables.cc index 24328ac9..02bdfedf 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -10,6 +10,7 @@ #include "tables.h" #include "modules.hpp" +#include "monster_spell_flag.hpp" #include "options.hpp" #include "q_library.hpp" #include "q_fireprof.hpp" @@ -3931,106 +3932,97 @@ quest_type quest[MAX_Q_IDX] = /* List of powers for Symbiants/Powers */ -monster_power monster_powers[96] = - { - { RF4_SHRIEK, "Aggravate Monster", 1, FALSE }, - { RF4_MULTIPLY, "Multiply", 10, FALSE }, - { RF4_S_ANIMAL, "Summon Animal", 30, FALSE }, - { RF4_ROCKET, "Fire a Rocket", 40, TRUE }, - { RF4_ARROW_1, "Light Arrow", 1, FALSE }, - { RF4_ARROW_2, "Minor Arrow", 3, FALSE }, - { RF4_ARROW_3, "Major Arrow", 7, TRUE }, - { RF4_ARROW_4, "Great Arrow", 9, TRUE }, - { RF4_BR_ACID, "Breathe Acid", 10, FALSE }, - { RF4_BR_ELEC, "Breathe Lightning", 10, FALSE }, - { RF4_BR_FIRE, "Breathe Fire", 10, FALSE }, - { RF4_BR_COLD, "Breathe Cold", 10, FALSE }, - { RF4_BR_POIS, "Breathe Poison", 15, TRUE }, - { RF4_BR_NETH, "Breathe Nether", 30, TRUE }, - { RF4_BR_LITE, "Breathe Light", 20, TRUE }, - { RF4_BR_DARK, "Breathe Dark", 20, TRUE }, - { RF4_BR_CONF, "Breathe Confusion", 15, TRUE }, - { RF4_BR_SOUN, "Breathe Sound", 30, TRUE }, - { RF4_BR_CHAO, "Breathe Chaos", 30, TRUE }, - { RF4_BR_DISE, "Breathe Disenchantment", 30, TRUE }, - { RF4_BR_NEXU, "Breathe Nexus", 30, TRUE }, - { RF4_BR_TIME, "Breathe Time", 30, TRUE }, - { RF4_BR_INER, "Breathe Inertia", 30, TRUE }, - { RF4_BR_GRAV, "Breathe Gravity", 30, TRUE }, - { RF4_BR_SHAR, "Breathe Shards", 30, TRUE }, - { RF4_BR_PLAS, "Breathe Plasma", 30, TRUE }, - { RF4_BR_WALL, "Breathe Force", 30, TRUE }, - { RF4_BR_MANA, "Breathe Mana", 40, TRUE }, - { RF4_BA_NUKE, "Nuke Ball", 30, TRUE }, - { RF4_BR_NUKE, "Breathe Nuke", 40, TRUE }, - { RF4_BA_CHAO, "Chaos Ball", 30, TRUE }, - { RF4_BR_DISI, "Breathe Disintegration", 40, TRUE }, - - { RF5_BA_ACID, "Acid Ball", 8, FALSE }, - { RF5_BA_ELEC, "Lightning Ball", 8, FALSE }, - { RF5_BA_FIRE, "Fire Ball", 8, FALSE }, - { RF5_BA_COLD, "Cold Ball", 8, FALSE }, - { RF5_BA_POIS, "Poison Ball", 20, TRUE }, - { RF5_BA_NETH, "Nether Ball", 20, TRUE }, - { RF5_BA_WATE, "Water Ball", 20, TRUE }, - { RF5_BA_MANA, "Mana Ball", 50, TRUE }, - { RF5_BA_DARK, "Darkness Ball", 20, TRUE }, - { 0, "(none)", 0, FALSE }, - { 0, "(none)", 0, FALSE }, - { 0, "(none)", 0, FALSE }, - { RF5_CAUSE_1, "Cause Light Wounds", 20, FALSE }, - { RF5_CAUSE_2, "Cause Medium Wounds", 30, FALSE }, - { RF5_CAUSE_3, "Cause Critical Wounds", 35, TRUE }, - { RF5_CAUSE_4, "Cause Mortal Wounds", 45, TRUE }, - { RF5_BO_ACID, "Acid Bolt", 5, FALSE }, - { RF5_BO_ELEC, "Lightning Bolt", 5, FALSE }, - { RF5_BO_FIRE, "Fire Bolt", 5, FALSE }, - { RF5_BO_COLD, "Cold Bolt", 5, FALSE }, - { RF5_BO_POIS, "Poison Bolt", 10, TRUE }, - { RF5_BO_NETH, "Nether Bolt", 15, TRUE }, - { RF5_BO_WATE, "Water Bolt", 20, TRUE }, - { RF5_BO_MANA, "Mana Bolt", 25, TRUE }, - { RF5_BO_PLAS, "Plasma Bolt", 20, TRUE }, - { RF5_BO_ICEE, "Ice Bolt", 20, TRUE }, - { RF5_MISSILE, "Magic Missile", 1, FALSE }, - { RF5_SCARE, "Scare", 4, FALSE }, - { RF5_BLIND, "Blindness", 6, FALSE }, - { RF5_CONF, "Confusion", 7, FALSE }, - { RF5_SLOW, "Slowness", 10, FALSE }, - { RF5_HOLD, "Paralyse", 10, FALSE }, - - { RF6_HASTE, "Haste Self", 50, FALSE }, - { RF6_HAND_DOOM, "Hand of Doom", 30, TRUE }, - { RF6_HEAL, "Healing", 60, FALSE }, - { RF6_S_ANIMALS, "Summon Animals", 60, TRUE }, - { RF6_BLINK, "Phase Door", 2, FALSE }, - { RF6_TPORT, "Teleport", 10, FALSE }, - { RF6_TELE_TO, "Teleport To", 20, TRUE }, - { RF6_TELE_AWAY, "Teleport Away", 20, FALSE }, - { RF6_TELE_LEVEL, "Teleport Level", 20, TRUE }, - { RF6_DARKNESS, "Darkness", 3, FALSE }, - { RF6_TRAPS, "Create Traps", 10, TRUE }, - { 0, "(none)", 0, FALSE }, - { RF6_RAISE_DEAD, "Raise the Dead", 400, TRUE }, - { 0, "(none)", 0, FALSE }, - { 0, "(none)", 0, FALSE }, - { RF6_S_THUNDERLORD, "Summon Thunderlords", 90, TRUE }, - { RF6_S_KIN, "Summon Kin", 80, FALSE }, - { RF6_S_HI_DEMON, "Summon Greater Demons", 90, TRUE }, - { RF6_S_MONSTER, "Summon Monster", 50, FALSE }, - { RF6_S_MONSTERS, "Summon Monsters", 60, TRUE }, - { RF6_S_ANT, "Summon Ants", 30, FALSE }, - { RF6_S_SPIDER, "Summon Spider", 30, FALSE }, - { RF6_S_HOUND, "Summon Hound", 50, TRUE }, - { RF6_S_HYDRA, "Summon Hydra", 40, TRUE }, - { RF6_S_ANGEL, "Summon Angel", 60, TRUE }, - { RF6_S_DEMON, "Summon Demon", 60, TRUE }, - { RF6_S_UNDEAD, "Summon Undead", 70, TRUE }, - { RF6_S_DRAGON, "Summon Dragon", 70, TRUE }, - { RF6_S_HI_UNDEAD, "Summon High Undead", 90, TRUE }, - { RF6_S_HI_DRAGON, "Summon High Dragon", 90, TRUE }, - { RF6_S_WRAITH, "Summon Wraith", 90, TRUE }, - { 0, "(none)", 0, FALSE }, +monster_power monster_powers[] = + { + { SF_SHRIEK_IDX, "Aggravate Monster", 1, FALSE }, + { SF_MULTIPLY_IDX, "Multiply", 10, FALSE }, + { SF_S_ANIMAL_IDX, "Summon Animal", 30, FALSE }, + { SF_ROCKET_IDX, "Fire a Rocket", 40, TRUE }, + { SF_ARROW_1_IDX, "Light Arrow", 1, FALSE }, + { SF_ARROW_2_IDX, "Minor Arrow", 3, FALSE }, + { SF_ARROW_3_IDX, "Major Arrow", 7, TRUE }, + { SF_ARROW_4_IDX, "Great Arrow", 9, TRUE }, + { SF_BR_ACID_IDX, "Breathe Acid", 10, FALSE }, + { SF_BR_ELEC_IDX, "Breathe Lightning", 10, FALSE }, + { SF_BR_FIRE_IDX, "Breathe Fire", 10, FALSE }, + { SF_BR_COLD_IDX, "Breathe Cold", 10, FALSE }, + { SF_BR_POIS_IDX, "Breathe Poison", 15, TRUE }, + { SF_BR_NETH_IDX, "Breathe Nether", 30, TRUE }, + { SF_BR_LITE_IDX, "Breathe Light", 20, TRUE }, + { SF_BR_DARK_IDX, "Breathe Dark", 20, TRUE }, + { SF_BR_CONF_IDX, "Breathe Confusion", 15, TRUE }, + { SF_BR_SOUN_IDX, "Breathe Sound", 30, TRUE }, + { SF_BR_CHAO_IDX, "Breathe Chaos", 30, TRUE }, + { SF_BR_DISE_IDX, "Breathe Disenchantment", 30, TRUE }, + { SF_BR_NEXU_IDX, "Breathe Nexus", 30, TRUE }, + { SF_BR_TIME_IDX, "Breathe Time", 30, TRUE }, + { SF_BR_INER_IDX, "Breathe Inertia", 30, TRUE }, + { SF_BR_GRAV_IDX, "Breathe Gravity", 30, TRUE }, + { SF_BR_SHAR_IDX, "Breathe Shards", 30, TRUE }, + { SF_BR_PLAS_IDX, "Breathe Plasma", 30, TRUE }, + { SF_BR_WALL_IDX, "Breathe Force", 30, TRUE }, + { SF_BR_MANA_IDX, "Breathe Mana", 40, TRUE }, + { SF_BA_NUKE_IDX, "Nuke Ball", 30, TRUE }, + { SF_BR_NUKE_IDX, "Breathe Nuke", 40, TRUE }, + { SF_BA_CHAO_IDX, "Chaos Ball", 30, TRUE }, + { SF_BR_DISI_IDX, "Breathe Disintegration", 40, TRUE }, + { SF_BA_ACID_IDX, "Acid Ball", 8, FALSE }, + { SF_BA_ELEC_IDX, "Lightning Ball", 8, FALSE }, + { SF_BA_FIRE_IDX, "Fire Ball", 8, FALSE }, + { SF_BA_COLD_IDX, "Cold Ball", 8, FALSE }, + { SF_BA_POIS_IDX, "Poison Ball", 20, TRUE }, + { SF_BA_NETH_IDX, "Nether Ball", 20, TRUE }, + { SF_BA_WATE_IDX, "Water Ball", 20, TRUE }, + { SF_BA_MANA_IDX, "Mana Ball", 50, TRUE }, + { SF_BA_DARK_IDX, "Darkness Ball", 20, TRUE }, + { SF_CAUSE_1_IDX, "Cause Light Wounds", 20, FALSE }, + { SF_CAUSE_2_IDX, "Cause Medium Wounds", 30, FALSE }, + { SF_CAUSE_3_IDX, "Cause Critical Wounds", 35, TRUE }, + { SF_CAUSE_4_IDX, "Cause Mortal Wounds", 45, TRUE }, + { SF_BO_ACID_IDX, "Acid Bolt", 5, FALSE }, + { SF_BO_ELEC_IDX, "Lightning Bolt", 5, FALSE }, + { SF_BO_FIRE_IDX, "Fire Bolt", 5, FALSE }, + { SF_BO_COLD_IDX, "Cold Bolt", 5, FALSE }, + { SF_BO_POIS_IDX, "Poison Bolt", 10, TRUE }, + { SF_BO_NETH_IDX, "Nether Bolt", 15, TRUE }, + { SF_BO_WATE_IDX, "Water Bolt", 20, TRUE }, + { SF_BO_MANA_IDX, "Mana Bolt", 25, TRUE }, + { SF_BO_PLAS_IDX, "Plasma Bolt", 20, TRUE }, + { SF_BO_ICEE_IDX, "Ice Bolt", 20, TRUE }, + { SF_MISSILE_IDX, "Magic Missile", 1, FALSE }, + { SF_SCARE_IDX, "Scare", 4, FALSE }, + { SF_BLIND_IDX, "Blindness", 6, FALSE }, + { SF_CONF_IDX, "Confusion", 7, FALSE }, + { SF_SLOW_IDX, "Slowness", 10, FALSE }, + { SF_HOLD_IDX, "Paralyse", 10, FALSE }, + { SF_HASTE_IDX, "Haste Self", 50, FALSE }, + { SF_HAND_DOOM_IDX, "Hand of Doom", 30, TRUE }, + { SF_HEAL_IDX, "Healing", 60, FALSE }, + { SF_S_ANIMALS_IDX, "Summon Animals", 60, TRUE }, + { SF_BLINK_IDX, "Phase Door", 2, FALSE }, + { SF_TPORT_IDX, "Teleport", 10, FALSE }, + { SF_TELE_TO_IDX, "Teleport To", 20, TRUE }, + { SF_TELE_AWAY_IDX, "Teleport Away", 20, FALSE }, + { SF_TELE_LEVEL_IDX, "Teleport Level", 20, TRUE }, + { SF_DARKNESS_IDX, "Darkness", 3, FALSE }, + { SF_TRAPS_IDX, "Create Traps", 10, TRUE }, + { SF_RAISE_DEAD_IDX, "Raise the Dead", 400, TRUE }, + { SF_S_THUNDERLORD_IDX, "Summon Thunderlords", 90, TRUE }, + { SF_S_KIN_IDX, "Summon Kin", 80, FALSE }, + { SF_S_HI_DEMON_IDX, "Summon Greater Demons", 90, TRUE }, + { SF_S_MONSTER_IDX, "Summon Monster", 50, FALSE }, + { SF_S_MONSTERS_IDX, "Summon Monsters", 60, TRUE }, + { SF_S_ANT_IDX, "Summon Ants", 30, FALSE }, + { SF_S_SPIDER_IDX, "Summon Spider", 30, FALSE }, + { SF_S_HOUND_IDX, "Summon Hound", 50, TRUE }, + { SF_S_HYDRA_IDX, "Summon Hydra", 40, TRUE }, + { SF_S_ANGEL_IDX, "Summon Angel", 60, TRUE }, + { SF_S_DEMON_IDX, "Summon Demon", 60, TRUE }, + { SF_S_UNDEAD_IDX, "Summon Undead", 70, TRUE }, + { SF_S_DRAGON_IDX, "Summon Dragon", 70, TRUE }, + { SF_S_HI_UNDEAD_IDX, "Summon High Undead", 90, TRUE }, + { SF_S_HI_DRAGON_IDX, "Summon High Dragon", 90, TRUE }, + { SF_S_WRAITH_IDX, "Summon Wraith", 90, TRUE }, }; /* Tval descriptions */ diff --git a/src/wizard1.cc b/src/wizard1.cc index 9624bcc2..a6072dad 100644 --- a/src/wizard1.cc +++ b/src/wizard1.cc @@ -4,6 +4,7 @@ #include "cmd7.hpp" #include "ego_item_type.hpp" #include "monster_race.hpp" +#include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -1462,8 +1463,6 @@ static void spoil_mon_info(cptr fname) bool_ breath, magic, sin; cptr p, q; cptr vp[64]; - u32b flags1, flags2, flags3, flags4, flags5, flags6, flags9; - /* Build the filename */ path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); @@ -1492,13 +1491,11 @@ static void spoil_mon_info(cptr fname) monster_race *r_ptr = &r_info[n]; /* Extract the flags */ - flags1 = r_ptr->flags1; - flags2 = r_ptr->flags2; - flags3 = r_ptr->flags3; - flags4 = r_ptr->flags4; - flags5 = r_ptr->flags5; - flags6 = r_ptr->flags6; - flags9 = r_ptr->flags9; + auto const flags1 = r_ptr->flags1; + auto const flags2 = r_ptr->flags2; + auto const flags3 = r_ptr->flags3; + auto const flags9 = r_ptr->flags9; + auto const spells = r_ptr->spells; breath = FALSE; magic = FALSE; @@ -1670,12 +1667,12 @@ static void spoil_mon_info(cptr fname) /* Collect innate attacks */ vn = 0; - if (flags4 & RF4_SHRIEK) vp[vn++] = "shriek for help"; - if (flags4 & RF4_ROCKET) vp[vn++] = "shoot a rocket"; - if (flags4 & (RF4_ARROW_1)) vp[vn++] = "fire arrows"; - if (flags4 & (RF4_ARROW_2)) vp[vn++] = "fire arrows"; - if (flags4 & (RF4_ARROW_3)) vp[vn++] = "fire missiles"; - if (flags4 & (RF4_ARROW_4)) vp[vn++] = "fire missiles"; + if (spells & SF_SHRIEK) vp[vn++] = "shriek for help"; + if (spells & SF_ROCKET) vp[vn++] = "shoot a rocket"; + if (spells & SF_ARROW_1) vp[vn++] = "fire arrows"; + if (spells & SF_ARROW_2) vp[vn++] = "fire arrows"; + if (spells & SF_ARROW_3) vp[vn++] = "fire missiles"; + if (spells & SF_ARROW_4) vp[vn++] = "fire missiles"; if (vn) { @@ -1692,28 +1689,28 @@ static void spoil_mon_info(cptr fname) /* Collect breaths */ vn = 0; - if (flags4 & RF4_BR_ACID) vp[vn++] = "acid"; - if (flags4 & RF4_BR_ELEC) vp[vn++] = "lightning"; - if (flags4 & RF4_BR_FIRE) vp[vn++] = "fire"; - if (flags4 & RF4_BR_COLD) vp[vn++] = "frost"; - if (flags4 & RF4_BR_POIS) vp[vn++] = "poison"; - if (flags4 & RF4_BR_NETH) vp[vn++] = "nether"; - if (flags4 & RF4_BR_LITE) vp[vn++] = "light"; - if (flags4 & RF4_BR_DARK) vp[vn++] = "darkness"; - if (flags4 & RF4_BR_CONF) vp[vn++] = "confusion"; - if (flags4 & RF4_BR_SOUN) vp[vn++] = "sound"; - if (flags4 & RF4_BR_CHAO) vp[vn++] = "chaos"; - if (flags4 & RF4_BR_DISE) vp[vn++] = "disenchantment"; - if (flags4 & RF4_BR_NEXU) vp[vn++] = "nexus"; - if (flags4 & RF4_BR_TIME) vp[vn++] = "time"; - if (flags4 & RF4_BR_INER) vp[vn++] = "inertia"; - if (flags4 & RF4_BR_GRAV) vp[vn++] = "gravity"; - if (flags4 & RF4_BR_SHAR) vp[vn++] = "shards"; - if (flags4 & RF4_BR_PLAS) vp[vn++] = "plasma"; - if (flags4 & RF4_BR_WALL) vp[vn++] = "force"; - if (flags4 & RF4_BR_MANA) vp[vn++] = "mana"; - if (flags4 & RF4_BR_NUKE) vp[vn++] = "toxic waste"; - if (flags4 & RF4_BR_DISI) vp[vn++] = "disintegration"; + if (spells & SF_BR_ACID) vp[vn++] = "acid"; + if (spells & SF_BR_ELEC) vp[vn++] = "lightning"; + if (spells & SF_BR_FIRE) vp[vn++] = "fire"; + if (spells & SF_BR_COLD) vp[vn++] = "frost"; + if (spells & SF_BR_POIS) vp[vn++] = "poison"; + if (spells & SF_BR_NETH) vp[vn++] = "nether"; + if (spells & SF_BR_LITE) vp[vn++] = "light"; + if (spells & SF_BR_DARK) vp[vn++] = "darkness"; + if (spells & SF_BR_CONF) vp[vn++] = "confusion"; + if (spells & SF_BR_SOUN) vp[vn++] = "sound"; + if (spells & SF_BR_CHAO) vp[vn++] = "chaos"; + if (spells & SF_BR_DISE) vp[vn++] = "disenchantment"; + if (spells & SF_BR_NEXU) vp[vn++] = "nexus"; + if (spells & SF_BR_TIME) vp[vn++] = "time"; + if (spells & SF_BR_INER) vp[vn++] = "inertia"; + if (spells & SF_BR_GRAV) vp[vn++] = "gravity"; + if (spells & SF_BR_SHAR) vp[vn++] = "shards"; + if (spells & SF_BR_PLAS) vp[vn++] = "plasma"; + if (spells & SF_BR_WALL) vp[vn++] = "force"; + if (spells & SF_BR_MANA) vp[vn++] = "mana"; + if (spells & SF_BR_NUKE) vp[vn++] = "toxic waste"; + if (spells & SF_BR_DISI) vp[vn++] = "disintegration"; if (vn) { @@ -1731,73 +1728,73 @@ static void spoil_mon_info(cptr fname) /* Collect spells */ vn = 0; - if (flags5 & RF5_BA_ACID) vp[vn++] = "produce acid balls"; - if (flags5 & RF5_BA_ELEC) vp[vn++] = "produce lightning balls"; - if (flags5 & RF5_BA_FIRE) vp[vn++] = "produce fire balls"; - if (flags5 & RF5_BA_COLD) vp[vn++] = "produce frost balls"; - if (flags5 & RF5_BA_POIS) vp[vn++] = "produce poison balls"; - if (flags5 & RF5_BA_NETH) vp[vn++] = "produce nether balls"; - if (flags5 & RF5_BA_WATE) vp[vn++] = "produce water balls"; - if (flags4 & RF4_BA_NUKE) vp[vn++] = "produce balls of radiation"; - if (flags5 & RF5_BA_MANA) vp[vn++] = "produce mana storms"; - if (flags5 & RF5_BA_DARK) vp[vn++] = "produce darkness storms"; - if (flags4 & RF4_BA_CHAO) vp[vn++] = "invoke raw Chaos"; - if (flags6 & RF6_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; - if (flags5 & RF5_DRAIN_MANA) vp[vn++] = "drain mana"; - if (flags5 & RF5_MIND_BLAST) vp[vn++] = "cause mind blasting"; - if (flags5 & RF5_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; - if (flags5 & (RF5_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; - if (flags5 & (RF5_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; - if (flags5 & (RF5_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; - if (flags5 & (RF5_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (flags5 & RF5_BO_ACID) vp[vn++] = "produce acid bolts"; - if (flags5 & RF5_BO_ELEC) vp[vn++] = "produce lightning bolts"; - if (flags5 & RF5_BO_FIRE) vp[vn++] = "produce fire bolts"; - if (flags5 & RF5_BO_COLD) vp[vn++] = "produce frost bolts"; - if (flags5 & RF5_BO_POIS) vp[vn++] = "produce poison bolts"; - if (flags5 & RF5_BO_NETH) vp[vn++] = "produce nether bolts"; - if (flags5 & RF5_BO_WATE) vp[vn++] = "produce water bolts"; - if (flags5 & RF5_BO_MANA) vp[vn++] = "produce mana bolts"; - if (flags5 & RF5_BO_PLAS) vp[vn++] = "produce plasma bolts"; - if (flags5 & RF5_BO_ICEE) vp[vn++] = "produce ice bolts"; - if (flags5 & RF5_MISSILE) vp[vn++] = "produce magic missiles"; - if (flags5 & RF5_SCARE) vp[vn++] = "terrify"; - if (flags5 & RF5_BLIND) vp[vn++] = "blind"; - if (flags5 & RF5_CONF) vp[vn++] = "confuse"; - if (flags5 & RF5_SLOW) vp[vn++] = "slow"; - if (flags5 & RF5_HOLD) vp[vn++] = "paralyse"; - if (flags6 & RF6_HASTE) vp[vn++] = "haste-self"; - if (flags6 & RF6_HEAL) vp[vn++] = "heal-self"; - if (flags6 & RF6_BLINK) vp[vn++] = "blink-self"; - if (flags6 & RF6_TPORT) vp[vn++] = "teleport-self"; - if (flags6 & RF6_S_BUG) vp[vn++] = "summon software bugs"; - if (flags6 & RF6_S_RNG) vp[vn++] = "summon RNGs"; - if (flags6 & RF6_TELE_TO) vp[vn++] = "teleport to"; - if (flags6 & RF6_TELE_AWAY) vp[vn++] = "teleport away"; - if (flags6 & RF6_TELE_LEVEL) vp[vn++] = "teleport level"; - if (flags6 & RF6_DARKNESS) vp[vn++] = "create darkness"; - if (flags6 & RF6_TRAPS) vp[vn++] = "create traps"; - if (flags6 & RF6_FORGET) vp[vn++] = "cause amnesia"; - if (flags6 & RF6_RAISE_DEAD) vp[vn++] = "raise dead"; - if (flags6 & RF6_S_THUNDERLORD) vp[vn++] = "summon a thunderlord"; - if (flags6 & RF6_S_MONSTER) vp[vn++] = "summon a monster"; - if (flags6 & RF6_S_MONSTERS) vp[vn++] = "summon monsters"; - if (flags6 & RF6_S_KIN) vp[vn++] = "summon aid"; - if (flags6 & RF6_S_ANT) vp[vn++] = "summon ants"; - if (flags6 & RF6_S_SPIDER) vp[vn++] = "summon spiders"; - if (flags6 & RF6_S_HOUND) vp[vn++] = "summon hounds"; - if (flags6 & RF6_S_HYDRA) vp[vn++] = "summon hydras"; - if (flags6 & RF6_S_ANGEL) vp[vn++] = "summon an angel"; - if (flags6 & RF6_S_DEMON) vp[vn++] = "summon a demon"; - if (flags6 & RF6_S_UNDEAD) vp[vn++] = "summon an undead"; - if (flags6 & RF6_S_DRAGON) vp[vn++] = "summon a dragon"; - if (flags4 & RF4_S_ANIMAL) vp[vn++] = "summon animal"; - if (flags6 & RF6_S_ANIMALS) vp[vn++] = "summon animals"; - if (flags6 & RF6_S_HI_UNDEAD) vp[vn++] = "summon greater undead"; - if (flags6 & RF6_S_HI_DRAGON) vp[vn++] = "summon ancient dragons"; - if (flags6 & RF6_S_HI_DEMON) vp[vn++] = "summon greater demons"; - if (flags6 & RF6_S_WRAITH) vp[vn++] = "summon Ringwraith"; - if (flags6 & RF6_S_UNIQUE) vp[vn++] = "summon unique monsters"; + if (spells & SF_BA_ACID) vp[vn++] = "produce acid balls"; + if (spells & SF_BA_ELEC) vp[vn++] = "produce lightning balls"; + if (spells & SF_BA_FIRE) vp[vn++] = "produce fire balls"; + if (spells & SF_BA_COLD) vp[vn++] = "produce frost balls"; + if (spells & SF_BA_POIS) vp[vn++] = "produce poison balls"; + if (spells & SF_BA_NETH) vp[vn++] = "produce nether balls"; + if (spells & SF_BA_WATE) vp[vn++] = "produce water balls"; + if (spells & SF_BA_NUKE) vp[vn++] = "produce balls of radiation"; + if (spells & SF_BA_MANA) vp[vn++] = "produce mana storms"; + if (spells & SF_BA_DARK) vp[vn++] = "produce darkness storms"; + if (spells & SF_BA_CHAO) vp[vn++] = "invoke raw Chaos"; + if (spells & SF_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; + if (spells & SF_DRAIN_MANA) vp[vn++] = "drain mana"; + if (spells & SF_MIND_BLAST) vp[vn++] = "cause mind blasting"; + if (spells & SF_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; + if (spells & (SF_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; + if (spells & (SF_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; + if (spells & (SF_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; + if (spells & (SF_CAUSE_4)) vp[vn++] = "cause mortal wounds"; + if (spells & SF_BO_ACID) vp[vn++] = "produce acid bolts"; + if (spells & SF_BO_ELEC) vp[vn++] = "produce lightning bolts"; + if (spells & SF_BO_FIRE) vp[vn++] = "produce fire bolts"; + if (spells & SF_BO_COLD) vp[vn++] = "produce frost bolts"; + if (spells & SF_BO_POIS) vp[vn++] = "produce poison bolts"; + if (spells & SF_BO_NETH) vp[vn++] = "produce nether bolts"; + if (spells & SF_BO_WATE) vp[vn++] = "produce water bolts"; + if (spells & SF_BO_MANA) vp[vn++] = "produce mana bolts"; + if (spells & SF_BO_PLAS) vp[vn++] = "produce plasma bolts"; + if (spells & SF_BO_ICEE) vp[vn++] = "produce ice bolts"; + if (spells & SF_MISSILE) vp[vn++] = "produce magic missiles"; + if (spells & SF_SCARE) vp[vn++] = "terrify"; + if (spells & SF_BLIND) vp[vn++] = "blind"; + if (spells & SF_CONF) vp[vn++] = "confuse"; + if (spells & SF_SLOW) vp[vn++] = "slow"; + if (spells & SF_HOLD) vp[vn++] = "paralyse"; + if (spells & SF_HASTE) vp[vn++] = "haste-self"; + if (spells & SF_HEAL) vp[vn++] = "heal-self"; + if (spells & SF_BLINK) vp[vn++] = "blink-self"; + if (spells & SF_TPORT) vp[vn++] = "teleport-self"; + if (spells & SF_S_BUG) vp[vn++] = "summon software bugs"; + if (spells & SF_S_RNG) vp[vn++] = "summon RNGs"; + if (spells & SF_TELE_TO) vp[vn++] = "teleport to"; + if (spells & SF_TELE_AWAY) vp[vn++] = "teleport away"; + if (spells & SF_TELE_LEVEL) vp[vn++] = "teleport level"; + if (spells & SF_DARKNESS) vp[vn++] = "create darkness"; + if (spells & SF_TRAPS) vp[vn++] = "create traps"; + if (spells & SF_FORGET) vp[vn++] = "cause amnesia"; + if (spells & SF_RAISE_DEAD) vp[vn++] = "raise dead"; + if (spells & SF_S_THUNDERLORD) vp[vn++] = "summon a thunderlord"; + if (spells & SF_S_MONSTER) vp[vn++] = "summon a monster"; + if (spells & SF_S_MONSTERS) vp[vn++] = "summon monsters"; + if (spells & SF_S_KIN) vp[vn++] = "summon aid"; + if (spells & SF_S_ANT) vp[vn++] = "summon ants"; + if (spells & SF_S_SPIDER) vp[vn++] = "summon spiders"; + if (spells & SF_S_HOUND) vp[vn++] = "summon hounds"; + if (spells & SF_S_HYDRA) vp[vn++] = "summon hydras"; + if (spells & SF_S_ANGEL) vp[vn++] = "summon an angel"; + if (spells & SF_S_DEMON) vp[vn++] = "summon a demon"; + if (spells & SF_S_UNDEAD) vp[vn++] = "summon an undead"; + if (spells & SF_S_DRAGON) vp[vn++] = "summon a dragon"; + if (spells & SF_S_ANIMAL) vp[vn++] = "summon animal"; + if (spells & SF_S_ANIMALS) vp[vn++] = "summon animals"; + if (spells & SF_S_HI_UNDEAD) vp[vn++] = "summon greater undead"; + if (spells & SF_S_HI_DRAGON) vp[vn++] = "summon ancient dragons"; + if (spells & SF_S_HI_DEMON) vp[vn++] = "summon greater demons"; + if (spells & SF_S_WRAITH) vp[vn++] = "summon Ringwraith"; + if (spells & SF_S_UNIQUE) vp[vn++] = "summon unique monsters"; if (vn) { @@ -1877,7 +1874,7 @@ static void spoil_mon_info(cptr fname) spoil_out(wd_che[msex]); spoil_out(" is rarely detected by telepathy. "); } - if (flags4 & RF4_MULTIPLY) + if (spells & SF_MULTIPLY) { spoil_out(wd_che[msex]); spoil_out(" breeds explosively. "); -- cgit v1.2.3 From bc5fd67c4fa703d06c5c08435e65d439d513465d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove WILD_SWAMP which was never implemented --- lib/edit/r_info.txt | 43 ------------------------------------ lib/mods/theme/edit/r_info.txt | 50 ------------------------------------------ src/init1.cc | 2 +- 3 files changed, 1 insertion(+), 94 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 8e0697b2..9c9c852e 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -488,7 +488,6 @@ F:TAKE_ITEM F:WILD_GRASS F:WILD_MOUNTAIN F:WILD_ONLY -F:WILD_SWAMP F:WILD_TOWN F:WILD_WOOD D:He 'finds' new wares for the Black Market. From unwary adventurers... @@ -690,7 +689,6 @@ F:WEIRD_MIND F:WILD_GRASS F:WILD_MOUNTAIN F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE D:A small, harmless lizard. @@ -942,7 +940,6 @@ F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:A fast-moving pest. @@ -964,7 +961,6 @@ F:RAND_25 F:SUSCEP_FIRE F:WEIRD_MIND F:WILD_GRASS -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:A lone insect may be harmless, but there's a whole swarm of @@ -1023,7 +1019,6 @@ F:NO_CUT F:NO_FEAR F:NO_SLEEP F:STUPID -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:SHRIEK @@ -1175,7 +1170,6 @@ F:NO_CUT F:NO_FEAR F:NO_SLEEP F:STUPID -F:WILD_SWAMP F:WILD_TOO D:Yum! It looks quite tasty. @@ -1347,7 +1341,6 @@ F:MORTAL F:RAND_25 F:WILD_ONLY F:WILD_SHORE -F:WILD_SWAMP D:It is as big as a wolf. N:57:Freesia @@ -1672,7 +1665,6 @@ F:NO_CUT F:NO_FEAR F:NO_SLEEP F:STUPID -F:WILD_SWAMP F:WILD_TOO D:Yum! It looks quite tasty. @@ -2699,7 +2691,6 @@ F:MORTAL F:RAND_50 F:WILD_ONLY F:WILD_SHORE -F:WILD_SWAMP D:It looks poisonous. N:122:Dark elf @@ -3517,7 +3508,6 @@ F:FRIENDS F:MALE F:MORTAL F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE F:ZANGBAND @@ -3859,7 +3849,6 @@ F:HAS_EGG F:IM_POIS F:MORTAL F:RAND_50 -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:It is a large snake with a hooded face. @@ -4762,7 +4751,6 @@ F:IM_POIS F:MORTAL F:RAND_50 F:WILD_GRASS -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:It has glistening black skin, a sleek body, and highly venomous fangs. @@ -4932,7 +4920,6 @@ F:FORCE_SLEEP F:MALE F:MORTAL F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE F:ZANGBAND @@ -6650,7 +6637,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_POIS @@ -6770,7 +6756,6 @@ F:WILD_GRASS F:WILD_MOUNTAIN F:WILD_OCEAN F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO F:WILD_VOLCANO F:WILD_WASTE @@ -7023,7 +7008,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_11 S:SCARE @@ -7042,7 +7026,6 @@ F:BASH_DOOR F:CAN_SWIM F:MORTAL F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO D:A creature that was once human, but is now as green as moss. @@ -7396,7 +7379,6 @@ F:NO_SLEEP F:ONLY_GOLD F:OPEN_DOOR F:STUPID -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:SHRIEK @@ -7421,7 +7403,6 @@ F:NO_CUT F:STUPID F:SUSCEP_FIRE F:WILD_ONLY -F:WILD_SWAMP F:WILD_WOOD D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut D:around its prey and releases paralysing enzymes to stop its struggles. @@ -7551,7 +7532,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_ACID @@ -7692,7 +7672,6 @@ F:EVIL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_12 S:MULTIPLY @@ -8652,7 +8631,6 @@ F:RAND_25 F:RES_NETH F:SUSCEP_ELEC F:UNDEAD -F:WILD_SWAMP F:WILD_TOO D:A cloud of evil, sentient mist. @@ -9216,7 +9194,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_7 S:SCARE @@ -9699,7 +9676,6 @@ F:DROP_CORPSE F:EVIL F:IM_ACID F:MORTAL -F:WILD_SWAMP F:WILD_TOO D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul D:monster that breeds on death. @@ -10221,7 +10197,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:A powerful troll form. Venom drips from its needlelike claws. @@ -10419,7 +10394,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:UNIQUE F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO D:An ogre renowned for acts of surprising cruelty, Lokkak is the leader of a large D:band of violent ogres. @@ -10666,7 +10640,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_POIS @@ -10873,7 +10846,6 @@ F:DROP_CORPSE F:IM_POIS F:MORTAL F:ONLY_GOLD -F:WILD_SWAMP F:WILD_TOO D:A strange ox-like form with a huge head but a thin, weak neck, it looks D:like the creation of some deranged alchemist. @@ -11313,7 +11285,6 @@ F:FORCE_SLEEP F:IM_POIS F:OPEN_DOOR F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_POIS @@ -12740,7 +12711,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO D:He is a troll that reeks of brackish water and mud. @@ -13820,7 +13790,6 @@ F:NO_FEAR F:NO_SLEEP F:POWERFUL F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_ACID @@ -13848,7 +13817,6 @@ F:FORCE_MAXHP F:FORCE_SLEEP F:IM_ACID F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_ACID @@ -14005,7 +13973,6 @@ F:IM_POIS F:NO_CUT F:OPEN_DOOR F:SMART -F:WILD_SWAMP F:WILD_TOO D:"Two eyes, the colour of a thin, yellow wine, were set high in the D:thing's body; though it had no separate head. A mouthing, obscene slit, @@ -14966,7 +14933,6 @@ F:PASS_WALL F:POWERFUL F:RAND_50 F:SMART -F:WILD_SWAMP F:WILD_TOO S:1_IN_2 S:BLINK @@ -15280,7 +15246,6 @@ F:IM_ACID F:NO_CONF F:NO_SLEEP F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO S:1_IN_9 S:BR_ACID @@ -16067,7 +16032,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_POIS @@ -16323,7 +16287,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:A massive two-headed troll, larger and stronger than many men together. @@ -16755,7 +16718,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:BO_FIRE @@ -18781,7 +18743,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:BA_FIRE @@ -19372,7 +19333,6 @@ F:EVIL F:IM_COLD F:IM_POIS F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE F:WILD_WOOD @@ -21347,7 +21307,6 @@ F:SMART F:SUSCEP_COLD F:UNIQUE F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_3 S:BA_FIRE @@ -25968,7 +25927,6 @@ F:RES_PLAS F:RES_WATE F:UNIQUE F:WILD_OCEAN -F:WILD_SWAMP F:WILD_TOO F:ZANGBAND S:1_IN_3 @@ -30053,7 +30011,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_9 S:SCARE diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index fe18f2fa..4d53dd1d 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -3227,7 +3227,6 @@ F:HAS_EGG F:IMPRESED F:MORTAL F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:It is a hooded crow, camouflaged well for a swampland or forest. @@ -7021,7 +7020,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_POIS @@ -7145,7 +7143,6 @@ F:WILD_GRASS F:WILD_MOUNTAIN F:WILD_OCEAN F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO F:WILD_VOLCANO F:WILD_WASTE @@ -7400,7 +7397,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_11 S:SCARE @@ -7419,7 +7415,6 @@ F:BASH_DOOR F:CAN_SWIM F:MORTAL F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO D:A creature that was once human, but is now as green as moss. @@ -7774,7 +7769,6 @@ F:NO_SLEEP F:ONLY_GOLD F:OPEN_DOOR F:STUPID -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:SHRIEK @@ -7800,7 +7794,6 @@ F:NO_CUT F:STUPID F:SUSCEP_FIRE F:WILD_ONLY -F:WILD_SWAMP F:WILD_WOOD D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut D:around its prey and releases paralysing enzymes to stop its struggles. @@ -7950,7 +7943,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_ACID @@ -8099,7 +8091,6 @@ F:EVIL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_12 S:MULTIPLY @@ -9160,7 +9151,6 @@ F:RAND_25 F:RES_NETH F:SUSCEP_ELEC F:UNDEAD -F:WILD_SWAMP F:WILD_TOO D:A cloud of evil, sentient mist. @@ -9731,7 +9721,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_7 S:SCARE @@ -10338,7 +10327,6 @@ F:DROP_CORPSE F:EVIL F:IM_ACID F:MORTAL -F:WILD_SWAMP F:WILD_TOO D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul D:monster that breeds on death. @@ -10930,7 +10918,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:Trolls were created by Melkor in mockery of the Ents. This one is @@ -11135,7 +11122,6 @@ F:ONLY_ITEM F:OPEN_DOOR F:UNIQUE F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO D:An ogre renowned for acts of surprising cruelty, Lokkak is the leader of a large D:band of violent ogres. @@ -11432,7 +11418,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_POIS @@ -11671,7 +11656,6 @@ F:DROP_CORPSE F:IM_POIS F:MORTAL F:ONLY_GOLD -F:WILD_SWAMP F:WILD_TOO D:A strange ox-like form with a huge head but a thin, weak neck. @@ -12118,7 +12102,6 @@ F:FORCE_SLEEP F:IM_POIS F:OPEN_DOOR F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_POIS @@ -13736,7 +13719,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO D:Trolls are said to have been created by Melkor in mockery of D:the Ents. He reeks of brackish water and mud. @@ -14987,7 +14969,6 @@ F:NO_FEAR F:NO_SLEEP F:POWERFUL F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_ACID @@ -15015,7 +14996,6 @@ F:FORCE_MAXHP F:FORCE_SLEEP F:IM_ACID F:OPEN_DOOR -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_ACID @@ -16258,7 +16238,6 @@ F:PASS_WALL F:POWERFUL F:RAND_50 F:SMART -F:WILD_SWAMP F:WILD_TOO S:1_IN_2 S:BLINK @@ -16558,7 +16537,6 @@ F:IM_ACID F:NO_CONF F:NO_SLEEP F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO S:1_IN_9 S:BR_ACID @@ -17267,7 +17245,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_POIS @@ -17484,7 +17461,6 @@ F:OPEN_DOOR F:REGENERATE F:TROLL F:WILD_MOUNTAIN -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:Melkor created trolls in mockery of the Ents. A massive two-headed troll, @@ -17887,7 +17863,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:BO_FIRE @@ -19627,7 +19602,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:BA_FIRE @@ -20192,7 +20166,6 @@ F:EVIL F:IM_COLD F:IM_POIS F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE F:WILD_WOOD @@ -20763,7 +20736,6 @@ F:MOVE_BODY F:ONLY_GOLD F:SUSCEP_FIRE F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_POIS @@ -20987,7 +20959,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_5 S:BA_ACID @@ -21066,7 +21037,6 @@ F:MORTAL F:MOVE_BODY F:ONLY_GOLD F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:SCARE @@ -21100,7 +21070,6 @@ F:MOVE_BODY F:ONLY_GOLD F:RES_PLAS F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_4 S:BA_FIRE @@ -21141,7 +21110,6 @@ F:ONLY_GOLD F:RES_PLAS F:SMART F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_3 S:BA_FIRE @@ -21184,7 +21152,6 @@ F:ONLY_GOLD F:RES_PLAS F:SMART F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_3 S:BA_ACID @@ -21229,7 +21196,6 @@ F:RES_PLAS F:SMART F:WILD_OCEAN F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_3 S:BA_ACID @@ -21285,7 +21251,6 @@ F:RES_WATE F:SMART F:WILD_OCEAN F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_3 S:BA_ACID @@ -24766,7 +24731,6 @@ F:IM_COLD F:MORTAL F:RAND_50 F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO F:WILD_WASTE D:It is a strange frog adapted to cold environments. @@ -24788,7 +24752,6 @@ F:HAS_EGG F:IMPRESED F:IM_POIS F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:It is a small lizard that usually lives in the @@ -24810,7 +24773,6 @@ F:DROP_CORPSE F:HURT_LITE F:IM_POIS F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:A frog that seems to emit a strange dark light. @@ -24910,7 +24872,6 @@ F:HAS_EGG F:IMPRESED F:IM_ELEC F:MORTAL -F:WILD_SWAMP F:WILD_TOO F:WILD_WOOD D:It is a small lizard with powerful jaws which cause @@ -24934,7 +24895,6 @@ F:RAND_25 F:RAND_50 F:RES_NETH F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_NETH @@ -24958,7 +24918,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_NUKE @@ -24983,7 +24942,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_FIRE @@ -25008,7 +24966,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_DARK @@ -25033,7 +24990,6 @@ F:MORTAL F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_ELEC @@ -25057,7 +25013,6 @@ F:NO_CUT F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_SHAR @@ -25199,7 +25154,6 @@ F:NO_CUT F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_INER @@ -25223,7 +25177,6 @@ F:NO_CUT F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_CHAO @@ -25248,7 +25201,6 @@ F:NO_CUT F:RAND_25 F:RAND_50 F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BR_PLAS @@ -25329,7 +25281,6 @@ F:RAND_25 F:RAND_50 F:RES_WATE F:WEIRD_MIND -F:WILD_SWAMP F:WILD_TOO S:1_IN_10 S:BA_WATE @@ -29527,7 +29478,6 @@ F:MOVE_BODY F:ONLY_GOLD F:OPEN_DOOR F:WILD_SHORE -F:WILD_SWAMP F:WILD_TOO S:1_IN_9 S:SCARE diff --git a/src/init1.cc b/src/init1.cc index 3b94adb5..290091dc 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -343,7 +343,7 @@ static cptr r_info_flags8[] = "XXX8X27", "XXX8X28", "XXX8X29", - "WILD_SWAMP", /* ToDo: Implement Swamp */ + "XXX8X30", "WILD_TOO", }; -- cgit v1.2.3 From 7918dec88392846dcb7a82ab0d9fca912fb77305 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Let Magic Mapping map the whole level It was always pretty weird to have the mapping depend on the size of the active "viewport". --- src/cave.cc | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 9d5daede..b9ef80db 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -3934,29 +3934,12 @@ void update_flow(void) */ void map_area(void) { - int i, x, y, y1, y2, x1, x2; - - cave_type *c_ptr; - - - /* Pick an area to map */ - y1 = panel_row_min - randint(10); - y2 = panel_row_max + randint(10); - x1 = panel_col_min - randint(20); - x2 = panel_col_max + randint(20); - - /* Speed -- shrink to fit legal bounds */ - if (y1 < 1) y1 = 1; - if (y2 > cur_hgt - 2) y2 = cur_hgt - 2; - if (x1 < 1) x1 = 1; - if (x2 > cur_wid - 2) x2 = cur_wid - 2; - - /* Scan that area */ - for (y = y1; y <= y2; y++) + /* Scan the whole map */ + for (int y = 1; y < cur_hgt - 1; y++) { - for (x = x1; x <= x2; x++) + for (int x = 1; x < cur_wid - 1; x++) { - c_ptr = &cave[y][x]; + auto c_ptr = &cave[y][x]; /* All non-walls are "checked" */ if (!is_wall(c_ptr)) @@ -3969,7 +3952,7 @@ void map_area(void) } /* Memorize known walls */ - for (i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { c_ptr = &cave[y + ddy_ddd[i]][x + ddx_ddd[i]]; -- cgit v1.2.3 From fc2af69bd5c33cde0f340cfb9f2707765ce68029 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Fix issue with leading space for scroll flavors --- src/object1.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/object1.cc b/src/object1.cc index ae0317c7..7a462b41 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -618,7 +618,10 @@ void flavor_init(void) } /* Add the word with separator */ - buf += " "; + if (buf.size() > 0) + { + buf += " "; + } buf += tmp; } -- cgit v1.2.3 From fc41a7d28d8896da79963d23ed1afba408e27470 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove unused special-casing of RF8_WILD_TOO in init1.cc --- src/init1.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 290091dc..9b76b8f8 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5726,10 +5726,6 @@ errr init_r_info_txt(FILE *fp) { /* Invert flag WILD_ONLY <-> RF8_DUNGEON */ r_info[i].flags8 ^= 1L; - - /* WILD_TOO without any other wilderness flags enables all flags */ - if ((r_info[i].flags8 & RF8_WILD_TOO) && !(r_info[i].flags8 & 0x7FFFFFFE)) - r_info[i].flags8 = 0x0463; } /* Success */ -- cgit v1.2.3 From 68e2a10b2d76cb3a2f5aa6818b4b184b6a02ef14 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Rework RF{1,2,3,7,8,9}_* monster flags to use flag_set<> --- src/birth.cc | 5 +- src/cave.cc | 41 ++--- src/cmd1.cc | 125 +++++++------- src/cmd2.cc | 35 ++-- src/cmd3.cc | 7 +- src/cmd4.cc | 15 +- src/cmd5.cc | 5 +- src/cmd6.cc | 41 ++--- src/cmd7.cc | 9 +- src/defines.h | 176 ------------------- src/dungeon.cc | 9 +- src/files.cc | 51 +++--- src/generate.cc | 37 ++-- src/init1.cc | 371 ++--------------------------------------- src/init2.cc | 5 +- src/melee1.cc | 33 ++-- src/melee2.cc | 219 ++++++++++++------------ src/modules.cc | 3 +- src/monster1.cc | 215 ++++++++++++------------ src/monster2.cc | 302 ++++++++++++++------------------- src/monster3.cc | 13 +- src/monster_ego.hpp | 31 +--- src/monster_race.hpp | 8 +- src/monster_race_flag.hpp | 12 ++ src/monster_race_flag_list.hpp | 159 ++++++++++++++++++ src/monster_race_flag_set.hpp | 7 + src/object1.cc | 7 +- src/object2.cc | 11 +- src/powers.cc | 5 +- src/q_bounty.cc | 17 +- src/q_god.cc | 33 ++-- src/q_main.cc | 5 +- src/q_poison.cc | 1 + src/q_rand.cc | 19 ++- src/rule_type.hpp | 9 +- src/spells1.cc | 277 +++++++++++++++--------------- src/spells2.cc | 203 ++++++++++------------ src/spells2.hpp | 3 +- src/spells3.cc | 3 +- src/tables.cc | 1 + src/traps.cc | 39 ++--- src/wizard1.cc | 162 +++++++++--------- src/xtra1.cc | 63 +++---- src/xtra2.cc | 71 ++++---- 44 files changed, 1226 insertions(+), 1637 deletions(-) create mode 100644 src/monster_race_flag.hpp create mode 100644 src/monster_race_flag_list.hpp create mode 100644 src/monster_race_flag_set.hpp diff --git a/src/birth.cc b/src/birth.cc index fb0c2a0d..188d9892 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -27,6 +27,7 @@ #include "modules.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" @@ -804,8 +805,8 @@ static void player_wipe(void) r_ptr->max_num = 100; /* Hack -- Reset the max counter */ - if (r_ptr->flags1 & RF1_UNIQUE) r_ptr->max_num = 1; - if (r_ptr->flags3 & RF3_UNIQUE_4) r_ptr->max_num = 4; + if (r_ptr->flags & RF_UNIQUE) r_ptr->max_num = 1; + if (r_ptr->flags & RF_UNIQUE_4) r_ptr->max_num = 4; /* Clear player kills */ r_ptr->r_pkills = 0; diff --git a/src/cave.cc b/src/cave.cc index b9ef80db..48aa7740 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -6,6 +6,7 @@ #include "hook_enter_dungeon_in.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -1111,7 +1112,7 @@ static void map_info(int y, int x, byte *ap, char *cp) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_MIMIC) + if (r_ptr->flags & RF_MIMIC) { /* Acquire object being mimicked */ object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; @@ -1155,10 +1156,10 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* Multi-hued monster */ - else if (r_ptr->flags1 & RF1_ATTR_MULTI) + else if (r_ptr->flags & RF_ATTR_MULTI) { /* Is it a shapechanger? */ - if (r_ptr->flags2 & RF2_SHAPECHANGER) + if (r_ptr->flags & RF_SHAPECHANGER) { image_random(ap, cp); } @@ -1166,7 +1167,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *cp = c; /* Multi-hued attr */ - if (r_ptr->flags2 & RF2_ATTR_ANY) + if (r_ptr->flags & RF_ATTR_ANY) { *ap = randint(15); } @@ -1177,7 +1178,7 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* Normal monster (not "clear" in any way) */ - else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR | RF1_CHAR_CLEAR))) + else if (!(r_ptr->flags & (RF_ATTR_CLEAR | RF_CHAR_CLEAR))) { /* Use char */ *cp = c; @@ -1203,14 +1204,14 @@ static void map_info(int y, int x, byte *ap, char *cp) else { /* Normal (non-clear char) monster */ - if (!(r_ptr->flags1 & RF1_CHAR_CLEAR)) + if (!(r_ptr->flags & RF_CHAR_CLEAR)) { /* Normal char */ *cp = c; } /* Normal (non-clear attr) monster */ - else if (!(r_ptr->flags1 & RF1_ATTR_CLEAR)) + else if (!(r_ptr->flags & RF_ATTR_CLEAR)) { /* Normal attr */ *ap = a; @@ -1234,7 +1235,7 @@ static void map_info(int y, int x, byte *ap, char *cp) monster_race *r_ptr = &r_info[p_ptr->body_monster]; /* Get the "player" attr */ - if (!avoid_other && (r_ptr->flags1 & RF1_ATTR_MULTI)) + if (!avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) { a = get_shimmer_color(); } @@ -1541,7 +1542,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_MIMIC) + if (r_ptr->flags & RF_MIMIC) { /* Acquire object being mimicked */ object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; @@ -1585,10 +1586,10 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Multi-hued monster */ - else if (r_ptr->flags1 & RF1_ATTR_MULTI) + else if (r_ptr->flags & RF_ATTR_MULTI) { /* Is it a shapechanger? */ - if (r_ptr->flags2 & RF2_SHAPECHANGER) + if (r_ptr->flags & RF_SHAPECHANGER) { image_random(ap, cp); } @@ -1596,7 +1597,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) *cp = c; /* Multi-hued attr */ - if (r_ptr->flags2 & RF2_ATTR_ANY) + if (r_ptr->flags & RF_ATTR_ANY) { *ap = randint(15); } @@ -1607,7 +1608,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Normal monster (not "clear" in any way) */ - else if (!(r_ptr->flags1 & (RF1_ATTR_CLEAR | RF1_CHAR_CLEAR))) + else if (!(r_ptr->flags & (RF_ATTR_CLEAR | RF_CHAR_CLEAR))) { /* Use char */ *cp = c; @@ -1630,14 +1631,14 @@ void map_info_default(int y, int x, byte *ap, char *cp) else { /* Normal (non-clear char) monster */ - if (!(r_ptr->flags1 & RF1_CHAR_CLEAR)) + if (!(r_ptr->flags & RF_CHAR_CLEAR)) { /* Normal char */ *cp = c; } /* Normal (non-clear attr) monster */ - else if (!(r_ptr->flags1 & RF1_ATTR_CLEAR)) + else if (!(r_ptr->flags & RF_ATTR_CLEAR)) { /* Normal attr */ *ap = a; @@ -1663,7 +1664,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) monster_race *r_ptr = &r_info[p_ptr->body_monster]; /* Get the "player" attr */ - if (!avoid_other && (r_ptr->flags1 & RF1_ATTR_MULTI)) + if (!avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) { a = get_shimmer_color(); } @@ -1788,7 +1789,7 @@ void note_spot(int y, int x) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_MIMIC) + if (r_ptr->flags & RF_MIMIC) { object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; o_ptr->marked = TRUE; @@ -3533,7 +3534,7 @@ void forget_mon_lite(void) * This function works within the current player's field of view * calculated by update_view(), so it should normally be called * whenever FoV is updated (== PU_VIEW | PU_MON_LITE). The other - * case is when RF9_HAS_LITE monsters have moved or dead. Monster + * case is when RF_HAS_LITE monsters have moved or dead. Monster * creation occurs out of LoS, so I chose not to take this into * consideration. * @@ -3639,7 +3640,7 @@ void update_mon_lite(void) auto r_ptr = m_ptr->race(); /* Skip monsters not carrying light source */ - if (!(r_ptr->flags9 & RF9_HAS_LITE)) continue; + if (!(r_ptr->flags & RF_HAS_LITE)) continue; /* Access the location */ fy = m_ptr->fy; @@ -4025,7 +4026,7 @@ void wiz_lite(void) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_MIMIC) + if (r_ptr->flags & RF_MIMIC) { object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; o_ptr->marked = TRUE; diff --git a/src/cmd1.cc b/src/cmd1.cc index dddcbcef..cff05246 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -25,6 +25,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -260,68 +261,68 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, case TV_DIGGING: { /* Slay Animal */ - if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags3 & RF3_ANIMAL)) + if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags & RF_ANIMAL)) { if (mult < 2) mult = 2; } /* Slay Evil */ - if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags3 & RF3_EVIL)) + if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags & RF_EVIL)) { if (mult < 2) mult = 2; } /* Slay Undead */ - if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) + if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags & RF_UNDEAD)) { if (mult < 3) mult = 3; } /* Slay Demon */ - if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) + if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags & RF_DEMON)) { if (mult < 3) mult = 3; } /* Slay Orc */ - if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags3 & RF3_ORC)) + if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags & RF_ORC)) { if (mult < 3) mult = 3; } /* Slay Troll */ - if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags3 & RF3_TROLL)) + if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags & RF_TROLL)) { if (mult < 3) mult = 3; } /* Slay Giant */ - if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags3 & RF3_GIANT)) + if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags & RF_GIANT)) { if (mult < 3) mult = 3; } /* Slay Dragon */ - if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) + if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags & RF_DRAGON)) { if (mult < 3) mult = 3; } /* Execute Dragon */ - if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags3 & RF3_DRAGON)) + if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags & RF_DRAGON)) { if (mult < 5) mult = 5; } /* Execute Undead */ - if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags3 & RF3_UNDEAD)) + if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags & RF_UNDEAD)) { if (mult < 5) mult = 5; } /* Execute Demon */ - if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags3 & RF3_DEMON)) + if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags & RF_DEMON)) { if (mult < 5) mult = 5; } @@ -330,11 +331,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Acid) */ if (f1 & (TR1_BRAND_ACID)) { - if (r_ptr->flags3 & RF3_IM_ACID) + if (r_ptr->flags & RF_IM_ACID) { // No additional multiplier } - else if (r_ptr->flags9 & RF9_SUSCEP_ACID) + else if (r_ptr->flags & RF_SUSCEP_ACID) { if (mult < 6) mult = 6; } @@ -347,11 +348,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Elec) */ if (f1 & (TR1_BRAND_ELEC)) { - if (r_ptr->flags3 & RF3_IM_ELEC) + if (r_ptr->flags & RF_IM_ELEC) { // No additional multiplier } - else if (r_ptr->flags9 & RF9_SUSCEP_ELEC) + else if (r_ptr->flags & RF_SUSCEP_ELEC) { if (mult < 6) mult = 6; } @@ -364,11 +365,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Fire) */ if (f1 & (TR1_BRAND_FIRE)) { - if (r_ptr->flags3 & RF3_IM_FIRE) + if (r_ptr->flags & RF_IM_FIRE) { // No additional multiplier } - else if (r_ptr->flags3 & RF3_SUSCEP_FIRE) + else if (r_ptr->flags & RF_SUSCEP_FIRE) { if (mult < 6) mult = 6; } @@ -381,11 +382,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Cold) */ if (f1 & (TR1_BRAND_COLD)) { - if (r_ptr->flags3 & RF3_IM_COLD) + if (r_ptr->flags & RF_IM_COLD) { // No additional multiplier } - else if (r_ptr->flags3 & RF3_SUSCEP_COLD) + else if (r_ptr->flags & RF_SUSCEP_COLD) { if (mult < 6) mult = 6; } @@ -398,11 +399,11 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Brand (Poison) */ if (f1 & (TR1_BRAND_POIS) || (p_ptr->tim_poison)) { - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flags & RF_IM_POIS) { // No additional damage } - else if (r_ptr->flags9 & RF9_SUSCEP_POIS) + else if (r_ptr->flags & RF_SUSCEP_POIS) { if (mult < 6) mult = 6; if (magik(95)) *special |= SPEC_POIS; @@ -417,7 +418,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, /* Wounding */ if (f5 & (TR5_WOUNDING)) { - if (r_ptr->flags8 & RF8_NO_CUT) + if (r_ptr->flags & RF_NO_CUT) { // No additional damage } @@ -565,7 +566,7 @@ void touch_zap_player(monster_type *m_ptr) { auto r_ptr = m_ptr->race(); - if (r_ptr->flags2 & RF2_AURA_FIRE) + if (r_ptr->flags & RF_AURA_FIRE) { if (!(p_ptr->immune_fire)) { @@ -589,7 +590,7 @@ void touch_zap_player(monster_type *m_ptr) } - if (r_ptr->flags2 & RF2_AURA_ELEC) + if (r_ptr->flags & RF_AURA_ELEC) { if (!(p_ptr->immune_elec)) { @@ -649,7 +650,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, r_ptr = &r_info[o_ptr->pval]; /* Not allowed to attack */ - if (r_ptr->flags1 & RF1_NEVER_BLOW) return; + if (r_ptr->flags & RF_NEVER_BLOW) return; /* Total armor */ ac = t_ptr->ac; @@ -1036,8 +1037,8 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { auto tr_ptr = t_ptr->race(); /* Aura fire */ - if ((tr_ptr->flags2 & RF2_AURA_FIRE) && - !(r_ptr->flags3 & RF3_IM_FIRE)) + if ((tr_ptr->flags & RF_AURA_FIRE) && + !(r_ptr->flags & RF_IM_FIRE)) { if (t_ptr->ml) { @@ -1051,8 +1052,8 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } /* Aura elec */ - if ((tr_ptr->flags2 & RF2_AURA_ELEC) && - !(r_ptr->flags3 & RF3_IM_ELEC)) + if ((tr_ptr->flags & RF_AURA_ELEC) && + !(r_ptr->flags & RF_IM_ELEC)) { if (t_ptr->ml) { @@ -1138,7 +1139,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, auto r_ptr = &r_info[p_ptr->body_monster]; /* Not allowed to attack */ - if (r_ptr->flags1 & RF1_NEVER_BLOW) return; + if (r_ptr->flags & RF_NEVER_BLOW) return; /* Total armor */ ac = t_ptr->ac; @@ -1524,8 +1525,8 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, if (touched) { /* Aura fire */ - if ((tr_ptr->flags2 & RF2_AURA_FIRE) && - !(r_ptr->flags3 & RF3_IM_FIRE)) + if ((tr_ptr->flags & RF_AURA_FIRE) && + !(r_ptr->flags & RF_IM_FIRE)) { if (t_ptr->ml) { @@ -1539,8 +1540,8 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, } /* Aura elec */ - if ((tr_ptr->flags2 & RF2_AURA_ELEC) && - !(r_ptr->flags3 & RF3_IM_ELEC)) + if ((tr_ptr->flags & RF_AURA_ELEC) && + !(r_ptr->flags & RF_IM_ELEC)) { if (t_ptr->ml) { @@ -1661,7 +1662,7 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Cut monster */ if (special & SPEC_CUT) { - if (r_ptr->flags8 & RF8_NO_CUT) + if (r_ptr->flags & RF_NO_CUT) { // No damage } @@ -1683,11 +1684,11 @@ void attack_special(monster_type *m_ptr, s32b special, int dam) /* Special - Poison monster */ if (special & SPEC_POIS) { - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flags & RF_IM_POIS) { // No damage } - else if (r_ptr->flags9 & RF9_SUSCEP_POIS) + else if (r_ptr->flags & RF_SUSCEP_POIS) { if (m_ptr->poisoned) { @@ -1747,11 +1748,11 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) /* Extract monster name (or "it") */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags1 & RF1_UNIQUE) resist_stun += 88; - if (r_ptr->flags3 & RF3_NO_CONF) resist_stun += 44; - if (r_ptr->flags3 & RF3_NO_SLEEP) resist_stun += 44; - if ((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_NONLIVING)) resist_stun += 88; + if (r_ptr->flags & RF_UNIQUE) resist_stun += 88; + if (r_ptr->flags & RF_NO_CONF) resist_stun += 44; + if (r_ptr->flags & RF_NO_SLEEP) resist_stun += 44; + if ((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_NONLIVING)) resist_stun += 88; if (plev) { @@ -1790,7 +1791,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) /* Describe attack */ if (ma_ptr->effect & MA_KNEE) { - if (r_ptr->flags1 & RF1_MALE) + if (r_ptr->flags & RF_MALE) { if (!desc) msg_format("You hit %s in the groin with your knee!", m_name); @@ -1811,7 +1812,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) if (ma_ptr->effect & MA_SLOW) { if (! - ((r_ptr->flags1 & RF1_NEVER_MOVE) || + ((r_ptr->flags & RF_NEVER_MOVE) || strchr("UjmeEv$,DdsbBFIJQSXclnw!=?", r_ptr->d_char))) { if (!desc) msg_format("You kick %s in the ankle.", m_name); @@ -1853,7 +1854,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) if (((special_effect & MA_FULL_SLOW) || (special_effect & MA_SLOW)) && ((*k + p_ptr->to_d) < m_ptr->hp)) { - if (!(r_ptr->flags1 & RF1_UNIQUE) && + if (!(r_ptr->flags & RF_UNIQUE) && (randint(plev) > m_ptr->level) && m_ptr->mspeed > 60) { msg_format("%^s starts limping slower.", m_name); @@ -1899,7 +1900,7 @@ static void do_nazgul(int *k, int *num, int num_blow, int weap, std::shared_ptr< allow_shatter = FALSE; /* Mega Hack -- Hitting Nazgul is REALY dangerous (ideas from Akhronath) */ - if (r_ptr->flags7 & RF7_NAZGUL) + if (r_ptr->flags & RF_NAZGUL) { if ((!o_ptr->name2) && (!artifact_p(o_ptr)) && allow_shatter) { @@ -2014,7 +2015,7 @@ void py_attack(int y, int x, int max_blow) /* Disturb the player */ disturb(0); - if (r_info[p_ptr->body_monster].flags1 & RF1_NEVER_BLOW) + if (r_info[p_ptr->body_monster].flags & RF_NEVER_BLOW) { msg_print("You cannot attack in this form!"); return; @@ -2183,8 +2184,8 @@ void py_attack(int y, int x, int max_blow) if ((f1 & TR1_VAMPIRIC) || (chaos_effect == 1)) { if (! - ((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_NONLIVING))) + ((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_NONLIVING))) drain_result = m_ptr->hp; else drain_result = 0; @@ -2450,7 +2451,7 @@ void py_attack(int y, int x, int max_blow) } /* Confuse the monster */ - if (r_ptr->flags3 & RF3_NO_CONF) + if (r_ptr->flags & RF_NO_CONF) { msg_format("%^s is unaffected.", m_name); } @@ -2476,7 +2477,7 @@ void py_attack(int y, int x, int max_blow) else if ((chaos_effect == 5) && cave_floor_bold(y, x) && (randint(90) > m_ptr->level)) { - if (!((r_ptr->flags1 & RF1_UNIQUE) || + if (!((r_ptr->flags & RF_UNIQUE) || (r_ptr->spells & SF_BR_CHAO) || (m_ptr->mflag & MFLAG_QUEST))) { @@ -2621,7 +2622,7 @@ bool_ player_can_enter(byte feature) else if (f_info[feature].flags1 & FF1_NO_WALK) return (FALSE); else if ((f_info[feature].flags1 & FF1_WEB) && - ((!(r_info[p_ptr->body_monster].flags7 & RF7_SPIDER)) && (p_ptr->mimic_form != resolve_mimic_name("Spider")))) + ((!(r_info[p_ptr->body_monster].flags & RF_SPIDER)) && (p_ptr->mimic_form != resolve_mimic_name("Spider")))) return (FALSE); return (TRUE); @@ -2647,7 +2648,7 @@ static bool_ easy_open_door(int y, int x) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) { msg_print("You cannot open doors."); @@ -2771,21 +2772,21 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Hack - random movement */ if (p_ptr->disembodied) tmp = dir; - else if ((r_ptr->flags1 & RF1_RAND_25) && (r_ptr->flags1 & RF1_RAND_50)) + else if ((r_ptr->flags & RF_RAND_25) && (r_ptr->flags & RF_RAND_50)) { if (randint(100) < 75) tmp = randint(9); else tmp = dir; } - else if (r_ptr->flags1 & RF1_RAND_50) + else if (r_ptr->flags & RF_RAND_50) { if (randint(100) < 50) tmp = randint(9); else tmp = dir; } - else if (r_ptr->flags1 & RF1_RAND_25) + else if (r_ptr->flags & RF_RAND_25) { if (randint(100) < 25) tmp = randint(9); @@ -2963,7 +2964,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) py_attack(y, x, -1); } else if (cave_floor_bold(p_ptr->py, p_ptr->px) || - (mr_ptr->flags2 & RF2_PASS_WALL)) + (mr_ptr->flags & RF_PASS_WALL)) { msg_format("You push past %s.", m_name); m_ptr->fy = p_ptr->py; @@ -4339,7 +4340,7 @@ void do_cmd_pet(void) m_ptr = &m_list[pet_ctr]; r_ptr = &r_info[m_ptr->r_idx]; - if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */ + if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */ { bool_ checked = FALSE; char command; @@ -4408,7 +4409,7 @@ void do_cmd_pet(void) m_ptr = &m_list[pet_ctr]; r_ptr = &r_info[m_ptr->r_idx]; - if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */ + if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */ { bool_ delete_this = FALSE; @@ -4572,7 +4573,7 @@ bool_ do_cmd_leave_body(bool_ drop_body) o_ptr->ident |= IDENT_STOREB; /* Unique corpses are unique */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { o_ptr->name1 = 201; } @@ -4668,13 +4669,13 @@ bool_ execute_inscription(byte i, byte y, byte x) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags7 & RF7_CAN_FLY) + if (r_ptr->flags & RF_CAN_FLY) { msg_print("The monster simply flies over the chasm."); } else { - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) { msg_print("The monster falls in the chasm!"); delete_monster_idx(c_ptr->m_idx); diff --git a/src/cmd2.cc b/src/cmd2.cc index d1f26cae..5bd508b2 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -27,6 +27,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -81,7 +82,7 @@ static bool_ do_cmd_bash_fountain(int y, int x) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) { msg_print("You cannot do that."); @@ -772,7 +773,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) { msg_print("You cannot open chests."); @@ -1014,7 +1015,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) { msg_print("You cannot open doors."); @@ -1129,7 +1130,7 @@ void do_cmd_open(void) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) { msg_print("You cannot open doors."); @@ -1249,7 +1250,7 @@ static bool_ do_cmd_close_aux(int y, int x, int dir) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_OPEN_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) { msg_print("You cannot close doors."); @@ -2145,7 +2146,7 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) { msg_print("You cannot do that."); @@ -2259,7 +2260,7 @@ void do_cmd_bash(void) monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if ((p_ptr->body_monster != 0) && !(r_ptr->flags2 & RF2_BASH_DOOR)) + if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) { msg_print("You cannot do that."); @@ -3355,9 +3356,9 @@ void do_cmd_fire(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -3769,9 +3770,9 @@ void do_cmd_throw(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4096,9 +4097,9 @@ void do_cmd_boomerang(void) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4781,7 +4782,7 @@ void do_cmd_steal() } /* The monster is immune */ - if (r_info[m_ptr->r_idx].flags7 & RF7_NO_THEFT) + if (r_info[m_ptr->r_idx].flags & RF_NO_THEFT) { msg_print("The monster is guarding the treasures."); return; diff --git a/src/cmd3.cc b/src/cmd3.cc index 51939fe6..473f5c0d 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -18,6 +18,7 @@ #include "hooks.hpp" #include "monster1.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -1325,7 +1326,7 @@ static void roff_top(int r_idx) Term_gotoxy(0, 0); /* A title (use "The" for non-uniques) */ - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) { Term_addstr( -1, TERM_WHITE, "The "); } @@ -1435,10 +1436,10 @@ void do_cmd_query_symbol(void) monster_race *r_ptr = &r_info[i]; /* Require non-unique monsters if needed */ - if (norm && (r_ptr->flags1 & RF1_UNIQUE)) continue; + if (norm && (r_ptr->flags & RF_UNIQUE)) continue; /* Require unique monsters if needed */ - if (uniq && !(r_ptr->flags1 & RF1_UNIQUE)) continue; + if (uniq && !(r_ptr->flags & RF_UNIQUE)) continue; /* Require monsters with the name requested if needed */ if (name) diff --git a/src/cmd4.cc b/src/cmd4.cc index b63a2c2c..45ee0363 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -20,6 +20,7 @@ #include "messages.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "notes.hpp" #include "object1.hpp" @@ -3276,9 +3277,9 @@ static void do_cmd_knowledge_uniques(void) monster_race *r_ptr = &r_info[k]; /* Only print Uniques */ - if ((r_ptr->flags1 & RF1_UNIQUE) && - !(r_ptr->flags7 & RF7_PET) && - !(r_ptr->flags7 & RF7_NEUTRAL)) + if ((r_ptr->flags & RF_UNIQUE) && + !(r_ptr->flags & RF_PET) && + !(r_ptr->flags & RF_NEUTRAL)) { unique_r_idxs.push_back(k); } @@ -3298,7 +3299,7 @@ static void do_cmd_knowledge_uniques(void) monster_race *r_ptr = &r_info[r_idx]; /* Only print Uniques */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); @@ -3446,7 +3447,7 @@ static void do_cmd_knowledge_pets(void) monster_desc(pet_name, m_ptr, 0x88); w.write("{}{} ({})\n", - (r_ptr->flags1 & RF1_UNIQUE) ? "#####G" : "", + (r_ptr->flags & RF_UNIQUE) ? "#####G" : "", pet_name, (m_ptr->status < MSTATUS_COMPANION) ? "pet" : "companion"); } @@ -3492,7 +3493,7 @@ static void do_cmd_knowledge_kill_count(void) { monster_race *r_ptr = &r_info[kk]; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { if (r_ptr->max_num == 0) { @@ -3526,7 +3527,7 @@ static void do_cmd_knowledge_kill_count(void) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); diff --git a/src/cmd5.cc b/src/cmd5.cc index 2c9798de..29651cf2 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -16,6 +16,7 @@ #include "lua_bind.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" @@ -592,7 +593,7 @@ cptr symbiote_name(bool_ capitalize) monster_race *r_ptr = &r_info[o_ptr->pval]; cptr s = NULL; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { /* Unique monster; no preceding "your", and ignore our name. */ strncpy(buf, r_ptr->name, sizeof(buf)); @@ -857,7 +858,7 @@ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_s int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1); /* 'Powerful' monsters have wider radii */ - int rad = (r_ptr->flags2 & RF2_POWERFUL) + int rad = (r_ptr->flags & RF_POWERFUL) ? 1 + (p_ptr->lev / 15) : 1 + (p_ptr->lev / 20); diff --git a/src/cmd6.cc b/src/cmd6.cc index b1022bd1..b34efeb3 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -25,6 +25,7 @@ #include "mimic.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -789,7 +790,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } /* Hack -- Jellies are immune to acid only if they are already acidic */ - if (strchr("j", r_ptr->d_char) && (r_ptr->flags3 & RF3_IM_ACID)) + if (strchr("j", r_ptr->d_char) && (r_ptr->flags & RF_IM_ACID)) { dam = damroll(8, 8); @@ -811,7 +812,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) * are immune to poison because their body already contains * poisonous chemicals. */ - if (strchr("ijkmS,", r_ptr->d_char) && (r_ptr->flags3 & RF3_IM_POIS)) + if (strchr("ijkmS,", r_ptr->d_char) && (r_ptr->flags & RF_IM_POIS)) { if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { @@ -826,58 +827,58 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) */ if (!harmful && !cutting && (o_ptr->sval != SV_CORPSE_MEAT)) { - if (r_ptr->flags3 & RF3_IM_ACID) + if (r_ptr->flags & RF_IM_ACID) { set_oppose_acid(p_ptr->oppose_acid + rand_int(10) + 10); } - if (r_ptr->flags3 & RF3_IM_ELEC) + if (r_ptr->flags & RF_IM_ELEC) { set_oppose_elec(p_ptr->oppose_elec + rand_int(10) + 10); } - if (r_ptr->flags3 & RF3_IM_FIRE) + if (r_ptr->flags & RF_IM_FIRE) { set_oppose_fire(p_ptr->oppose_fire + rand_int(10) + 10); } - if (r_ptr->flags3 & RF3_IM_COLD) + if (r_ptr->flags & RF_IM_COLD) { set_oppose_cold(p_ptr->oppose_cold + rand_int(10) + 10); } - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flags & RF_IM_POIS) { set_oppose_pois(p_ptr->oppose_pois + rand_int(10) + 10); } - if (r_ptr->flags3 & RF3_RES_NETH) + if (r_ptr->flags & RF_RES_NETH) { set_protevil(p_ptr->protevil + rand_int(25) + 3 * r_ptr->level); } - if (r_ptr->flags3 & RF3_RES_PLAS) + if (r_ptr->flags & RF_RES_PLAS) { set_oppose_fire(p_ptr->oppose_fire + rand_int(20) + 20); } - if (r_ptr->flags2 & RF2_SHAPECHANGER) + if (r_ptr->flags & RF_SHAPECHANGER) { /* DGDGDG (void)set_mimic(20 , rand_int(MIMIC_VALAR)); */ } - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) { /* DGDGDG (void)set_mimic(30 , MIMIC_DEMON); */ } - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { /* DGDGDG (void)set_mimic(30 , MIMIC_VAMPIRE); */ } - if (r_ptr->flags3 & RF3_NO_FEAR) + if (r_ptr->flags & RF_NO_FEAR) { (void)set_afraid(0); } - if (r_ptr->flags3 & RF3_NO_STUN) + if (r_ptr->flags & RF_NO_STUN) { (void)set_stun(0); } - if (r_ptr->flags3 & RF3_NO_CONF) + if (r_ptr->flags & RF_NO_CONF) { (void)set_confused(0); } @@ -1372,7 +1373,7 @@ void do_cmd_eat_food(void) /* Not all is edible. Apologies if messy. */ /* Check weight -- they have to have some meat left */ - if (r_ptr->flags9 & RF9_DROP_SKELETON) + if (r_ptr->flags & RF_DROP_SKELETON) { if (o_ptr->weight <= (r_ptr->weight * 3) / 5) { @@ -1566,7 +1567,7 @@ void do_cmd_cut_corpse(void) { case SV_CORPSE_CORPSE: { - if (r_ptr->flags9 & RF9_DROP_SKELETON) + if (r_ptr->flags & RF_DROP_SKELETON) { not_meat = (r_ptr->weight * 3) / 5; } @@ -2948,8 +2949,8 @@ void do_cmd_read_scroll(void) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & RF1_UNIQUE && - !(r_ptr->flags9 & RF9_SPECIAL_GENE)) + if (r_ptr->flags & RF_UNIQUE && + !(r_ptr->flags & RF_SPECIAL_GENE)) { r_ptr->max_num = 1; } @@ -5859,7 +5860,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "detect orcs every 10 turns"; msg_print("Your weapon glows brightly..."); - (void)detect_monsters_xxx(RF3_ORC, DEFAULT_RADIUS); + detect_monsters_orcs(DEFAULT_RADIUS); o_ptr->timeout = 10; diff --git a/src/cmd7.cc b/src/cmd7.cc index 5b1eaf02..1d6718a9 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -20,6 +20,7 @@ #include "mimic.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -3653,7 +3654,7 @@ void do_cmd_summoner_extract() object_type *o_ptr = get_object(item); bool_ partial; - if (r_info[o_ptr->pval2].flags1 & RF1_UNIQUE) + if (r_info[o_ptr->pval2].flags & RF_UNIQUE) { partial = FALSE; } @@ -3702,7 +3703,7 @@ void summon_true(int r_idx, int item) /* Uniques are less likely to be nice */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { /* Because it's unique, it will always be destroyed */ used = TRUE; @@ -4102,7 +4103,7 @@ void do_cmd_symbiotic(void) m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (!(r_ptr->flags1 & RF1_NEVER_MOVE)) + if (!(r_ptr->flags & RF_NEVER_MOVE)) { msg_print("You can only hypnotise monsters that cannot move."); } @@ -4110,7 +4111,7 @@ void do_cmd_symbiotic(void) { msg_print("You can only hypnotise pets and companions."); } - else if (r_ptr->flags9 & RF9_SPECIAL_GENE) + else if (r_ptr->flags & RF_SPECIAL_GENE) { msg_print("You cannot hypnotise this monster."); } diff --git a/src/defines.h b/src/defines.h index 942675b5..7c33e15a 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2628,182 +2628,6 @@ #define MONSTER_LEVEL_MAX 150 -/* - * New monster race bit flags - */ -#define RF1_UNIQUE 0x00000001 /* Unique Monster */ -#define RF1_QUESTOR 0x00000002 /* Quest Monster */ -#define RF1_MALE 0x00000004 /* Male gender */ -#define RF1_FEMALE 0x00000008 /* Female gender */ -#define RF1_CHAR_CLEAR 0x00000010 /* Absorbs symbol */ -#define RF1_CHAR_MULTI 0x00000020 /* Changes symbol */ -#define RF1_ATTR_CLEAR 0x00000040 /* Absorbs color */ -#define RF1_ATTR_MULTI 0x00000080 /* Changes color */ -#define RF1_FORCE_DEPTH 0x00000100 /* Start at "correct" depth */ -#define RF1_FORCE_MAXHP 0x00000200 /* Start with max hitpoints */ -#define RF1_FORCE_SLEEP 0x00000400 /* Start out sleeping */ -#define RF1_FORCE_EXTRA 0x00000800 /* Start out something */ -#define RF1_FRIEND 0x00001000 /* Arrive with a friend */ -#define RF1_FRIENDS 0x00002000 /* Arrive with some friends */ -#define RF1_ESCORT 0x00004000 /* Arrive with an escort */ -#define RF1_ESCORTS 0x00008000 /* Arrive with some escorts */ -#define RF1_NEVER_BLOW 0x00010000 /* Never make physical blow */ -#define RF1_NEVER_MOVE 0x00020000 /* Never make physical move */ -#define RF1_RAND_25 0x00040000 /* Moves randomly (25%) */ -#define RF1_RAND_50 0x00080000 /* Moves randomly (50%) */ -#define RF1_ONLY_GOLD 0x00100000 /* Drop only gold */ -#define RF1_ONLY_ITEM 0x00200000 /* Drop only items */ -#define RF1_DROP_60 0x00400000 /* Drop an item/gold (60%) */ -#define RF1_DROP_90 0x00800000 /* Drop an item/gold (90%) */ -#define RF1_DROP_1D2 0x01000000 /* Drop 1d2 items/gold */ -#define RF1_DROP_2D2 0x02000000 /* Drop 2d2 items/gold */ -#define RF1_DROP_3D2 0x04000000 /* Drop 3d2 items/gold */ -#define RF1_DROP_4D2 0x08000000 /* Drop 4d2 items/gold */ -#define RF1_DROP_GOOD 0x10000000 /* Drop good items */ -#define RF1_DROP_GREAT 0x20000000 /* Drop great items */ -#define RF1_DROP_USEFUL 0x40000000 /* Drop "useful" items */ -#define RF1_DROP_CHOSEN 0x80000000 /* Drop "chosen" items */ - -/* - * New monster race bit flags - */ -#define RF2_STUPID 0x00000001 /* Monster is stupid */ -#define RF2_SMART 0x00000002 /* Monster is smart */ -#define RF2_CAN_SPEAK 0x00000004 /* TY: can speak */ -#define RF2_REFLECTING 0x00000008 /* Reflects bolts */ -#define RF2_INVISIBLE 0x00000010 /* Monster avoids vision */ -#define RF2_COLD_BLOOD 0x00000020 /* Monster avoids infra */ -#define RF2_EMPTY_MIND 0x00000040 /* Monster avoids telepathy */ -#define RF2_WEIRD_MIND 0x00000080 /* Monster avoids telepathy? */ -#define RF2_DEATH_ORB 0x00000100 /* Death Orb */ -#define RF2_REGENERATE 0x00000200 /* Monster regenerates */ -#define RF2_SHAPECHANGER 0x00000400 /* TY: shapechanger */ -#define RF2_ATTR_ANY 0x00000800 /* TY: Attr_any */ -#define RF2_POWERFUL 0x00001000 /* Monster has strong breath */ -#define RF2_ELDRITCH_HORROR 0x00002000 /* Sanity-blasting horror */ -#define RF2_AURA_FIRE 0x00004000 /* Burns in melee */ -#define RF2_AURA_ELEC 0x00008000 /* Shocks in melee */ -#define RF2_OPEN_DOOR 0x00010000 /* Monster can open doors */ -#define RF2_BASH_DOOR 0x00020000 /* Monster can bash doors */ -#define RF2_PASS_WALL 0x00040000 /* Monster can pass walls */ -#define RF2_KILL_WALL 0x00080000 /* Monster can destroy walls */ -#define RF2_MOVE_BODY 0x00100000 /* Monster can move monsters */ -#define RF2_KILL_BODY 0x00200000 /* Monster can kill monsters */ -#define RF2_TAKE_ITEM 0x00400000 /* Monster can pick up items */ -#define RF2_KILL_ITEM 0x00800000 /* Monster can crush items */ -#define RF2_BRAIN_1 0x01000000 -#define RF2_BRAIN_2 0x02000000 -#define RF2_BRAIN_3 0x04000000 -#define RF2_BRAIN_4 0x08000000 -#define RF2_BRAIN_5 0x10000000 -#define RF2_BRAIN_6 0x20000000 -#define RF2_BRAIN_7 0x40000000 -#define RF2_BRAIN_8 0x80000000 - -/* - * New monster race bit flags - */ -#define RF3_ORC 0x00000001 /* Orc */ -#define RF3_TROLL 0x00000002 /* Troll */ -#define RF3_GIANT 0x00000004 /* Giant */ -#define RF3_DRAGON 0x00000008 /* Dragon */ -#define RF3_DEMON 0x00000010 /* Demon */ -#define RF3_UNDEAD 0x00000020 /* Undead */ -#define RF3_EVIL 0x00000040 /* Evil */ -#define RF3_ANIMAL 0x00000080 /* Animal */ -#define RF3_THUNDERLORD 0x00000100 /* DG: Thunderlord */ -#define RF3_GOOD 0x00000200 /* Good */ -#define RF3_AURA_COLD 0x00000400 /* Freezes in melee */ -#define RF3_NONLIVING 0x00000800 /* TY: Non-Living (?) */ -#define RF3_HURT_LITE 0x00001000 /* Hurt by lite */ -#define RF3_HURT_ROCK 0x00002000 /* Hurt by rock remover */ -#define RF3_SUSCEP_FIRE 0x00004000 /* Hurt badly by fire */ -#define RF3_SUSCEP_COLD 0x00008000 /* Hurt badly by cold */ -#define RF3_IM_ACID 0x00010000 /* Resist acid a lot */ -#define RF3_IM_ELEC 0x00020000 /* Resist elec a lot */ -#define RF3_IM_FIRE 0x00040000 /* Resist fire a lot */ -#define RF3_IM_COLD 0x00080000 /* Resist cold a lot */ -#define RF3_IM_POIS 0x00100000 /* Resist poison a lot */ -#define RF3_RES_TELE 0x00200000 /* Resist teleportation */ -#define RF3_RES_NETH 0x00400000 /* Resist nether a lot */ -#define RF3_RES_WATE 0x00800000 /* Resist water */ -#define RF3_RES_PLAS 0x01000000 /* Resist plasma */ -#define RF3_RES_NEXU 0x02000000 /* Resist nexus */ -#define RF3_RES_DISE 0x04000000 /* Resist disenchantment */ -#define RF3_UNIQUE_4 0x08000000 /* Is a "Nazgul" unique */ -#define RF3_NO_FEAR 0x10000000 /* Cannot be scared */ -#define RF3_NO_STUN 0x20000000 /* Cannot be stunned */ -#define RF3_NO_CONF 0x40000000 /* Cannot be confused */ -#define RF3_NO_SLEEP 0x80000000 /* Cannot be slept */ - -/* - * New monster race bit flags - */ -#define RF7_AQUATIC 0x00000001 /* Aquatic monster */ -#define RF7_CAN_SWIM 0x00000002 /* Monster can swim */ -#define RF7_CAN_FLY 0x00000004 /* Monster can fly */ -#define RF7_FRIENDLY 0x00000008 /* Monster is friendly */ -#define RF7_PET 0x00000010 /* Monster is a pet */ -#define RF7_MORTAL 0x00000020 /* Monster is a mortal being */ -#define RF7_SPIDER 0x00000040 /* Monster is a spider (can pass webs) */ -#define RF7_NAZGUL 0x00000080 /* Monster is a Nazgul */ -#define RF7_DG_CURSE 0x00000100 /* If killed the monster grant a DG Curse to the player */ -#define RF7_POSSESSOR 0x00000200 /* Is it a dreaded possessor monster ? */ -#define RF7_NO_DEATH 0x00000400 /* Cannot be killed */ -#define RF7_NO_TARGET 0x00000800 /* Cannot be targeted */ -#define RF7_AI_ANNOY 0x00001000 /* Try to tease the player */ -#define RF7_AI_SPECIAL 0x00002000 /* For quests */ -#define RF7_NEUTRAL 0x00004000 /* Monster is neutral */ -#define RF7_DROP_ART 0x00008000 /* Monster drop one art */ -#define RF7_DROP_RANDART 0x00010000 /* Monster drop one randart */ -#define RF7_AI_PLAYER 0x00020000 /* Controlled by the player */ -#define RF7_NO_THEFT 0x00040000 /* Monster is immune to theft */ -#define RF7_SPIRIT 0x00080000 /* This is a Spirit, coming from the Void */ - - -/* - * Monster race flags - */ -#define RF8_DUNGEON 0x00000001 -#define RF8_WILD_TOWN 0x00000002 -#define RF8_XXX8X02 0x00000004 -#define RF8_WILD_SHORE 0x00000008 -#define RF8_WILD_OCEAN 0x00000010 -#define RF8_WILD_WASTE 0x00000020 -#define RF8_WILD_WOOD 0x00000040 -#define RF8_WILD_VOLCANO 0x00000080 -#define RF8_XXX8X08 0x00000100 -#define RF8_WILD_MOUNTAIN 0x00000200 -#define RF8_WILD_GRASS 0x00000400 -#define RF8_NO_CUT 0x00000800 -#define RF8_CTHANGBAND 0x00001000 /* Not used in ToME */ -/* XXX */ -#define RF8_ZANGBAND 0x00004000 /* Not used in ToME */ -#define RF8_JOKEANGBAND 0x00008000 -#define RF8_ANGBAND 0x00010000 - -#define RF8_WILD_TOO 0x80000000 - - -/* - * Monster race flags - */ -#define RF9_DROP_CORPSE 0x00000001 -#define RF9_DROP_SKELETON 0x00000002 -#define RF9_HAS_LITE 0x00000004 /* Carries a lite */ -#define RF9_MIMIC 0x00000008 /* *REALLY* looks like an object ... only nastier */ -#define RF9_HAS_EGG 0x00000010 /* Can be monster's eggs */ -#define RF9_IMPRESED 0x00000020 /* The monster can follow you on each level until he dies */ -#define RF9_SUSCEP_ACID 0x00000040 /* Susceptible to acid */ -#define RF9_SUSCEP_ELEC 0x00000080 /* Susceptible to lightning */ -#define RF9_SUSCEP_POIS 0x00000100 /* Susceptible to poison */ -#define RF9_KILL_TREES 0x00000200 /* Monster can eat trees */ -#define RF9_WYRM_PROTECT 0x00000400 /* The monster is protected by great wyrms of power: They'll be summoned if it's killed */ -#define RF9_DOPPLEGANGER 0x00000800 /* The monster looks like you */ -#define RF9_ONLY_DEPTH 0x00001000 /* The monster can only be generated at the GIVEN depth */ -#define RF9_SPECIAL_GENE 0x00002000 /* The monster can only be generated in special conditions like quests, special dungeons, ... */ -#define RF9_NEVER_GENE 0x00004000 /* The monster cannot be normaly generated */ - /*** Macro Definitions ***/ diff --git a/src/dungeon.cc b/src/dungeon.cc index cd904f29..c05c6ed3 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -40,6 +40,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "modules.hpp" #include "notes.hpp" @@ -791,7 +792,7 @@ static void regen_monsters(void) if (!frac) frac = 1; /* Hack -- Some monsters regenerate quickly */ - if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2; + if (r_ptr->flags & RF_REGENERATE) frac *= 2; /* Hack -- Regenerate */ @@ -828,7 +829,7 @@ static void regen_monsters(void) /* Hack -- Some monsters regenerate quickly */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2; + if (r_ptr->flags & RF_REGENERATE) frac *= 2; /* Hack -- Regenerate */ m_ptr->hp += frac; @@ -2967,7 +2968,7 @@ static void process_world(void) monster_type *m_ptr = &m_list[cave[my][mx].m_idx]; auto const r_ptr = m_ptr->race(); - if ((r_ptr->flags9 & RF9_IMPRESED) && can_create_companion()) + if ((r_ptr->flags & RF_IMPRESED) && can_create_companion()) { msg_format("And you have given the imprint to your %s!", r_ptr->name); m_ptr->status = MSTATUS_COMPANION; @@ -4512,7 +4513,7 @@ static void process_player(void) auto const r_ptr = m_ptr->race(); /* Skip non-multi-hued monsters */ - if (!(r_ptr->flags1 & RF1_ATTR_MULTI)) continue; + if (!(r_ptr->flags & RF_ATTR_MULTI)) continue; /* Reset the flag */ shimmer_monsters = TRUE; diff --git a/src/files.cc b/src/files.cc index 96269259..8758e692 100644 --- a/src/files.cc +++ b/src/files.cc @@ -27,6 +27,7 @@ #include "monster3.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "notes.hpp" #include "object1.hpp" @@ -1476,7 +1477,7 @@ static void display_player_various(void) } else if (!r_info[p_ptr->body_monster].body_parts[BODY_WEAPON]) { - if (r_info[p_ptr->body_monster].flags1 & RF1_NEVER_BLOW) + if (r_info[p_ptr->body_monster].flags & RF_NEVER_BLOW) desc = "nil!"; else { @@ -1560,13 +1561,13 @@ void wield_monster_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b { r_ptr = &r_info[o_ptr->pval]; - if (r_ptr->flags2 & RF2_INVISIBLE) + if (r_ptr->flags & RF_INVISIBLE) (*f2) |= TR2_INVIS; - if (r_ptr->flags2 & RF2_REFLECTING) + if (r_ptr->flags & RF_REFLECTING) (*f2) |= TR2_REFLECT; - if (r_ptr->flags7 & RF7_CAN_FLY) + if (r_ptr->flags & RF_CAN_FLY) (*f3) |= TR3_FEATHER; - if (r_ptr->flags7 & RF7_AQUATIC) + if (r_ptr->flags & RF_AQUATIC) (*f5) |= TR5_WATER_BREATH; } } @@ -1712,24 +1713,24 @@ void player_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) { monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if (r_ptr->flags2 & RF2_REFLECTING) (*f2) |= TR2_REFLECT; - if (r_ptr->flags2 & RF2_REGENERATE) (*f3) |= TR3_REGEN; - if (r_ptr->flags2 & RF2_AURA_FIRE) (*f3) |= TR3_SH_FIRE; - if (r_ptr->flags2 & RF2_AURA_ELEC) (*f3) |= TR3_SH_ELEC; - if (r_ptr->flags2 & RF2_PASS_WALL) (*f3) |= TR3_WRAITH; - if (r_ptr->flags3 & RF3_SUSCEP_FIRE) (*f2) |= TR2_SENS_FIRE; - if (r_ptr->flags3 & RF3_IM_ACID) (*f2) |= TR2_RES_ACID; - if (r_ptr->flags3 & RF3_IM_ELEC) (*f2) |= TR2_RES_ELEC; - if (r_ptr->flags3 & RF3_IM_FIRE) (*f2) |= TR2_RES_FIRE; - if (r_ptr->flags3 & RF3_IM_POIS) (*f2) |= TR2_RES_POIS; - if (r_ptr->flags3 & RF3_IM_COLD) (*f2) |= TR2_RES_COLD; - if (r_ptr->flags3 & RF3_RES_NETH) (*f2) |= TR2_RES_NETHER; - if (r_ptr->flags3 & RF3_RES_NEXU) (*f2) |= TR2_RES_NEXUS; - if (r_ptr->flags3 & RF3_RES_DISE) (*f2) |= TR2_RES_DISEN; - if (r_ptr->flags3 & RF3_NO_FEAR) (*f2) |= TR2_RES_FEAR; - if (r_ptr->flags3 & RF3_NO_SLEEP) (*f2) |= TR2_FREE_ACT; - if (r_ptr->flags3 & RF3_NO_CONF) (*f2) |= TR2_RES_CONF; - if (r_ptr->flags7 & RF7_CAN_FLY) (*f3) |= TR3_FEATHER; + if (r_ptr->flags & RF_REFLECTING) (*f2) |= TR2_REFLECT; + if (r_ptr->flags & RF_REGENERATE) (*f3) |= TR3_REGEN; + if (r_ptr->flags & RF_AURA_FIRE) (*f3) |= TR3_SH_FIRE; + if (r_ptr->flags & RF_AURA_ELEC) (*f3) |= TR3_SH_ELEC; + if (r_ptr->flags & RF_PASS_WALL) (*f3) |= TR3_WRAITH; + if (r_ptr->flags & RF_SUSCEP_FIRE) (*f2) |= TR2_SENS_FIRE; + if (r_ptr->flags & RF_IM_ACID) (*f2) |= TR2_RES_ACID; + if (r_ptr->flags & RF_IM_ELEC) (*f2) |= TR2_RES_ELEC; + if (r_ptr->flags & RF_IM_FIRE) (*f2) |= TR2_RES_FIRE; + if (r_ptr->flags & RF_IM_POIS) (*f2) |= TR2_RES_POIS; + if (r_ptr->flags & RF_IM_COLD) (*f2) |= TR2_RES_COLD; + if (r_ptr->flags & RF_RES_NETH) (*f2) |= TR2_RES_NETHER; + if (r_ptr->flags & RF_RES_NEXU) (*f2) |= TR2_RES_NEXUS; + if (r_ptr->flags & RF_RES_DISE) (*f2) |= TR2_RES_DISEN; + if (r_ptr->flags & RF_NO_FEAR) (*f2) |= TR2_RES_FEAR; + if (r_ptr->flags & RF_NO_SLEEP) (*f2) |= TR2_FREE_ACT; + if (r_ptr->flags & RF_NO_CONF) (*f2) |= TR2_RES_CONF; + if (r_ptr->flags & RF_CAN_FLY) (*f3) |= TR3_FEATHER; } (*f1) |= p_ptr->xtra_f1; @@ -2701,7 +2702,7 @@ errr file_character(cptr name, bool_ full) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); if (dead) @@ -4052,7 +4053,7 @@ static long total_points(void) { monster_race *r_ptr = &r_info[k]; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { bool_ dead = (r_ptr->max_num == 0); diff --git a/src/generate.cc b/src/generate.cc index ed35035c..6474f6de 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -21,6 +21,7 @@ #include "loadsave.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" @@ -2674,10 +2675,10 @@ static bool_ vault_aux_jelly(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Also decline evil jellies (like death molds and shoggoths) */ - if (r_ptr->flags3 & RF3_EVIL) return (FALSE); + if (r_ptr->flags & RF_EVIL) return (FALSE); /* Require icky thing, jelly, mold, or mushroom */ if (!strchr("ijm,", r_ptr->d_char)) return (FALSE); @@ -2695,10 +2696,10 @@ static bool_ vault_aux_animal(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Require "animal" flag */ - if (!(r_ptr->flags3 & RF3_ANIMAL)) return (FALSE); + if (!(r_ptr->flags & RF_ANIMAL)) return (FALSE); /* Okay */ return (TRUE); @@ -2713,10 +2714,10 @@ static bool_ vault_aux_undead(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Require Undead */ - if (!(r_ptr->flags3 & RF3_UNDEAD)) return (FALSE); + if (!(r_ptr->flags & RF_UNDEAD)) return (FALSE); /* Okay */ return (TRUE); @@ -2731,7 +2732,7 @@ static bool_ vault_aux_chapel(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Require "priest" or Angel */ if (!((r_ptr->d_char == 'A') || strstr(r_ptr->name, "riest"))) @@ -2752,7 +2753,7 @@ static bool_ vault_aux_kennel(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Require a Zephyr Hound or a dog */ return ((r_ptr->d_char == 'Z') || (r_ptr->d_char == 'C')); @@ -2768,7 +2769,7 @@ static bool_ vault_aux_treasure(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Require "priest" or Angel */ if (!((r_ptr->d_char == '!') || (r_ptr->d_char == '|') || @@ -2798,7 +2799,7 @@ static bool_ vault_aux_clone(int r_idx) static bool_ vault_aux_symbol(int r_idx) { return ((r_info[r_idx].d_char == (r_info[template_race].d_char)) - && !(r_info[r_idx].flags1 & RF1_UNIQUE)); + && !(r_info[r_idx].flags & RF_UNIQUE)); } @@ -2810,7 +2811,7 @@ static bool_ vault_aux_orc(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Hack -- Require "o" monsters */ if (!strchr("o", r_ptr->d_char)) return (FALSE); @@ -2829,7 +2830,7 @@ static bool_ vault_aux_troll(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Hack -- Require "T" monsters */ if (!strchr("T", r_ptr->d_char)) return (FALSE); @@ -2847,7 +2848,7 @@ static bool_ vault_aux_giant(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Hack -- Require "P" monsters */ if (!strchr("P", r_ptr->d_char)) return (FALSE); @@ -2865,7 +2866,7 @@ static bool_ vault_aux_demon(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Hack -- Require "U" monsters */ if (!strchr("U", r_ptr->d_char)) return (FALSE); @@ -2968,7 +2969,7 @@ static void build_type5(int by0, int bx0) template_race = randint(max_r_idx - 2); /* Reject uniques */ - if (r_info[template_race].flags1 & RF1_UNIQUE) continue; + if (r_info[template_race].flags & RF_UNIQUE) continue; /* Reject OoD monsters in a loose fashion */ if (((r_info[template_race].level) + randint(5)) > @@ -3239,7 +3240,7 @@ static void build_type6(int by0, int bx0) { template_race = randint(max_r_idx - 2); } - while ((r_info[template_race].flags1 & RF1_UNIQUE) + while ((r_info[template_race].flags & RF_UNIQUE) || (((r_info[template_race].level) + randint(5)) > (dun_level + randint(5)))); @@ -3311,7 +3312,7 @@ static void build_type6(int by0, int bx0) monster_race *r_ptr = &r_info[r_idx]; /* Decline unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Hack -- Require "d" or "D" monsters */ if (!strchr("Dd", r_ptr->d_char)) return (FALSE); @@ -7820,7 +7821,7 @@ static bool_ cave_gen(void) } case FATE_FIND_R: { - if ((r_info[fates[i].r_idx].cur_num == 1) && (r_info[fates[i].r_idx].flags1 & RF1_UNIQUE)) fates[i].icky = TRUE; + if ((r_info[fates[i].r_idx].cur_num == 1) && (r_info[fates[i].r_idx].flags & RF_UNIQUE)) fates[i].icky = TRUE; break; } } diff --git a/src/init1.cc b/src/init1.cc index 9b76b8f8..327faca6 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -16,6 +16,7 @@ #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -152,242 +153,6 @@ static cptr r_info_blow_effect[] = }; -/* - * Monster race flags - */ -static cptr r_info_flags1[] = -{ - "UNIQUE", - "QUESTOR", - "MALE", - "FEMALE", - "CHAR_CLEAR", - "CHAR_MULTI", - "ATTR_CLEAR", - "ATTR_MULTI", - "FORCE_DEPTH", - "FORCE_MAXHP", - "FORCE_SLEEP", - "FORCE_EXTRA", - "FRIEND", - "FRIENDS", - "ESCORT", - "ESCORTS", - "NEVER_BLOW", - "NEVER_MOVE", - "RAND_25", - "RAND_50", - "ONLY_GOLD", - "ONLY_ITEM", - "DROP_60", - "DROP_90", - "DROP_1D2", - "DROP_2D2", - "DROP_3D2", - "DROP_4D2", - "DROP_GOOD", - "DROP_GREAT", - "DROP_USEFUL", - "DROP_CHOSEN" -}; - -/* - * Monster race flags - */ -static cptr r_info_flags2[] = -{ - "STUPID", - "SMART", - "CAN_SPEAK", - "REFLECTING", - "INVISIBLE", - "COLD_BLOOD", - "EMPTY_MIND", - "WEIRD_MIND", - "DEATH_ORB", - "REGENERATE", - "SHAPECHANGER", - "ATTR_ANY", - "POWERFUL", - "ELDRITCH_HORROR", - "AURA_FIRE", - "AURA_ELEC", - "OPEN_DOOR", - "BASH_DOOR", - "PASS_WALL", - "KILL_WALL", - "MOVE_BODY", - "KILL_BODY", - "TAKE_ITEM", - "KILL_ITEM", - "BRAIN_1", - "BRAIN_2", - "BRAIN_3", - "BRAIN_4", - "BRAIN_5", - "BRAIN_6", - "BRAIN_7", - "BRAIN_8" -}; - -/* - * Monster race flags - */ -static cptr r_info_flags3[] = -{ - "ORC", - "TROLL", - "GIANT", - "DRAGON", - "DEMON", - "UNDEAD", - "EVIL", - "ANIMAL", - "THUNDERLORD", - "GOOD", - "AURA_COLD", /* TODO: Implement aura_cold */ - "NONLIVING", - "HURT_LITE", - "HURT_ROCK", - "SUSCEP_FIRE", - "SUSCEP_COLD", - "IM_ACID", - "IM_ELEC", - "IM_FIRE", - "IM_COLD", - "IM_POIS", - "RES_TELE", - "RES_NETH", - "RES_WATE", - "RES_PLAS", - "RES_NEXU", - "RES_DISE", - "UNIQUE_4", - "NO_FEAR", - "NO_STUN", - "NO_CONF", - "NO_SLEEP" -}; - -/* - * Monster race flags - */ -static cptr r_info_flags7[] = -{ - "AQUATIC", - "CAN_SWIM", - "CAN_FLY", - "FRIENDLY", - "PET", - "MORTAL", - "SPIDER", - "NAZGUL", - "DG_CURSE", - "POSSESSOR", - "NO_DEATH", - "NO_TARGET", - "AI_ANNOY", - "AI_SPECIAL", - "NEUTRAL", - "DROP_ART", - "DROP_RANDART", - "AI_PLAYER", - "NO_THEFT", - "SPIRIT", - "XXX7X20", - "XXX7X21", - "XXX7X22", - "XXX7X23", - "XXX7X24", - "XXX7X25", - "XXX7X26", - "XXX7X27", - "XXX7X28", - "XXX7X29", - "XXX7X30", - "XXX7X31", -}; - -/* - * Monster race flags - */ -static cptr r_info_flags8[] = -{ - "WILD_ONLY", - "WILD_TOWN", - "XXX8X02", - "WILD_SHORE", - "WILD_OCEAN", - "WILD_WASTE", - "WILD_WOOD", - "WILD_VOLCANO", - "XXX8X08", - "WILD_MOUNTAIN", - "WILD_GRASS", - "NO_CUT", - "CTHANGBAND", - "XXX8X13", - "ZANGBAND", - "JOKEANGBAND", - "BASEANGBAND", - "XXX8X17", - "XXX8X18", - "XXX8X19", - "XXX8X20", - "XXX8X21", - "XXX8X22", - "XXX8X23", - "XXX8X24", - "XXX8X25", - "XXX8X26", - "XXX8X27", - "XXX8X28", - "XXX8X29", - "XXX8X30", - "WILD_TOO", -}; - - -/* - * Monster race flags - Drops - */ -static cptr r_info_flags9[] = -{ - "DROP_CORPSE", - "DROP_SKELETON", - "HAS_LITE", - "MIMIC", - "HAS_EGG", - "IMPRESED", - "SUSCEP_ACID", - "SUSCEP_ELEC", - "SUSCEP_POIS", - "KILL_TREES", - "WYRM_PROTECT", - "DOPPLEGANGER", - "ONLY_DEPTH", - "SPECIAL_GENE", - "NEVER_GENE", - "XXX9X15", - "XXX9X16", - "XXX9X17", - "XXX9X18", - "XXX9X19", - "XXX9X20", - "XXX9X21", - "XXX9X22", - "XXX9X23", - "XXX9X24", - "XXX9X25", - "XXX9X26", - "XXX9X27", - "XXX9X28", - "XXX9X29", - "XXX9X30", - "XXX9X31", -}; - - /* * Object flags */ @@ -5344,21 +5109,17 @@ errr init_ra_info_txt(FILE *fp) return (0); } -/* - * Grab one (basic) flag in a monster_race from a textual string - */ -static errr grab_one_basic_flag(monster_race *r_ptr, cptr what) + +static errr grab_monster_race_flag(monster_race_flag_set *flags, cptr what) { - if (lookup_flags(what, - flag_tie(&r_ptr->flags1, r_info_flags1), - flag_tie(&r_ptr->flags2, r_info_flags2), - flag_tie(&r_ptr->flags3, r_info_flags3), - flag_tie(&r_ptr->flags7, r_info_flags7), - flag_tie(&r_ptr->flags8, r_info_flags8), - flag_tie(&r_ptr->flags9, r_info_flags9))) - { - return 0; - } +#define RF(tier, index, name) \ + if (streq(what, #name)) \ + { \ + *flags |= BOOST_PP_CAT(RF_,name); \ + return 0; \ + }; +#include "monster_race_flag_list.hpp" +#undef RF /* Oops */ msg_format("Unknown monster flag '%s'.", what); @@ -5683,7 +5444,7 @@ errr init_r_info_txt(FILE *fp) /* Process 'F' for "Basic Flags" (multiple lines) */ if (buf[0] == 'F') { - if (0 != grab_one_basic_flag(r_ptr, buf + 2)) + if (0 != grab_monster_race_flag(&r_ptr->flags, buf + 2)) { return (5); } @@ -5721,83 +5482,11 @@ errr init_r_info_txt(FILE *fp) return (6); } - /* Postprocessing */ - for (i = 1; i < max_r_idx; i++) - { - /* Invert flag WILD_ONLY <-> RF8_DUNGEON */ - r_info[i].flags8 ^= 1L; - } - /* Success */ return (0); } -/* - * Grab one (basic) flag in a monster_race from a textual string - */ -static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add) -{ - /* Dispatch to correct set of flags */ - u32b *f1 = add ? &re_ptr->mflags1 : &re_ptr->nflags1; - u32b *f2 = add ? &re_ptr->mflags2 : &re_ptr->nflags2; - u32b *f3 = add ? &re_ptr->mflags3 : &re_ptr->nflags3; - u32b *f7 = add ? &re_ptr->mflags7 : &re_ptr->nflags7; - u32b *f8 = add ? &re_ptr->mflags8 : &re_ptr->nflags8; - u32b *f9 = add ? &re_ptr->mflags9 : &re_ptr->nflags9; - - /* Lookup */ - if (lookup_flags(what, - flag_tie(f1, r_info_flags1), - flag_tie(f2, r_info_flags2), - flag_tie(f3, r_info_flags3), - flag_tie(f7, r_info_flags7), - flag_tie(f8, r_info_flags8), - flag_tie(f9, r_info_flags9))) - { - return 0; - } - - /* Oops */ - msg_format("Unknown monster flag '%s'.", what); - - /* Failure */ - return (1); -} - - -/* - * Grab one (basic) flag in a monster_race from a textual string - */ -static errr grab_one_ego_flag(monster_ego *re_ptr, cptr what, bool_ must) -{ - /* Dispatch to correct set of flags */ - u32b *f1 = must ? &re_ptr->flags1 : &re_ptr->hflags1; - u32b *f2 = must ? &re_ptr->flags2 : &re_ptr->hflags2; - u32b *f3 = must ? &re_ptr->flags3 : &re_ptr->hflags3; - u32b *f7 = must ? &re_ptr->flags7 : &re_ptr->hflags7; - u32b *f8 = must ? &re_ptr->flags8 : &re_ptr->hflags8; - u32b *f9 = must ? &re_ptr->flags9 : &re_ptr->hflags9; - - /* Lookup */ - if (lookup_flags(what, - flag_tie(f1, r_info_flags1), - flag_tie(f2, r_info_flags2), - flag_tie(f3, r_info_flags3), - flag_tie(f7, r_info_flags7), - flag_tie(f8, r_info_flags8), - flag_tie(f9, r_info_flags9))) - { - return (0); - } - - /* Oops */ - msg_format("Unknown monster flag '%s'.", what); - - /* Failure */ - return (1); -} - /* * Initialize the "re_info" array, by parsing an ascii "template" file */ @@ -6042,7 +5731,7 @@ errr init_re_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_ego_flag(re_ptr, s, TRUE)) + if (0 != grab_monster_race_flag(&re_ptr->flags, s)) { return (5); } @@ -6072,7 +5761,7 @@ errr init_re_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_ego_flag(re_ptr, s, FALSE)) + if (0 != grab_monster_race_flag(&re_ptr->hflags, s)) { return (5); } @@ -6085,7 +5774,7 @@ errr init_re_info_txt(FILE *fp) /* Process 'M' for "Basic Monster Flags" (multiple lines) */ if (buf[0] == 'M') { - if (0 != grab_one_basic_ego_flag(re_ptr, buf + 2, TRUE)) + if (0 != grab_monster_race_flag(&re_ptr->mflags, buf + 2)) { return (5); } @@ -6102,13 +5791,12 @@ errr init_re_info_txt(FILE *fp) /* XXX XXX XXX Hack -- Read no flags */ if (!strcmp(s, "MF_ALL")) { - /* No flags */ - re_ptr->nflags1 = re_ptr->nflags2 = re_ptr->nflags3 = re_ptr->nflags7 = re_ptr->nflags8 = re_ptr->nflags9 = 0xFFFFFFFF; + re_ptr->nflags = ~monster_race_flag_set(); } /* Parse this entry */ else { - if (0 != grab_one_basic_ego_flag(re_ptr, s, FALSE)) + if (0 != grab_monster_race_flag(&re_ptr->nflags, s)) { return (5); } @@ -6378,29 +6066,6 @@ errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str) return (1); } -/* - * Grab one (basic) flag in a monster_race from a textual string - */ -static errr grab_one_basic_monster_flag(dungeon_info_type *d_ptr, cptr what, byte rule) -{ - if (lookup_flags(what, - flag_tie(&d_ptr->rules[rule].mflags1, r_info_flags1), - flag_tie(&d_ptr->rules[rule].mflags2, r_info_flags2), - flag_tie(&d_ptr->rules[rule].mflags3, r_info_flags3), - flag_tie(&d_ptr->rules[rule].mflags7, r_info_flags7), - flag_tie(&d_ptr->rules[rule].mflags8, r_info_flags8), - flag_tie(&d_ptr->rules[rule].mflags9, r_info_flags9))) - { - return 0; - } - - /* Oops */ - msg_format("Unknown monster flag '%s'.", what); - - /* Failure */ - return (1); -} - /* * Initialize the "d_info" array, by parsing an ascii "template" file @@ -6827,7 +6492,7 @@ errr init_d_info_txt(FILE *fp) /* Parse this entry */ else { - if (0 != grab_one_basic_monster_flag(d_ptr, s, rule_num)) + if (0 != grab_monster_race_flag(&d_ptr->rules[rule_num].mflags, s)) { return (5); } diff --git a/src/init2.cc b/src/init2.cc index 1f6a1907..d0bf5697 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -23,6 +23,7 @@ #include "modules.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object_kind.hpp" #include "owner_type.hpp" @@ -1103,7 +1104,7 @@ static void init_guardians(void) { monster_race *r_ptr = &r_info[d_ptr->final_guardian]; - r_ptr->flags9 |= RF9_SPECIAL_GENE; + r_ptr->flags |= RF_SPECIAL_GENE; /* Mark the final artifact */ if (d_ptr->final_artifact) @@ -1124,7 +1125,7 @@ static void init_guardians(void) /* Give randart if there are no final artifacts */ if (!(d_ptr->final_artifact) && !(d_ptr->final_object)) { - r_ptr->flags7 |= RF7_DROP_RANDART; + r_ptr->flags |= RF_DROP_RANDART; } } } diff --git a/src/melee1.cc b/src/melee1.cc index 4dcf8fa0..89e0660a 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -15,6 +15,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -235,7 +236,7 @@ bool_ carried_make_attack_normal(int r_idx) bool_ alive = TRUE; /* Not allowed to attack */ - if (r_ptr->flags1 & RF1_NEVER_BLOW) return (FALSE); + if (r_ptr->flags & RF_NEVER_BLOW) return (FALSE); /* Total armor */ ac = p_ptr->ac + p_ptr->to_a; @@ -280,7 +281,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Hack -- Apply "protection from evil" */ if ((p_ptr->protevil > 0) && - (r_ptr->flags3 & RF3_EVIL) && + (r_ptr->flags & RF_EVIL) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -293,7 +294,7 @@ bool_ carried_make_attack_normal(int r_idx) /* Hack -- Apply "protection from good" */ if ((p_ptr->protgood > 0) && - (r_ptr->flags3 & RF3_GOOD) && + (r_ptr->flags & RF_GOOD) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1249,7 +1250,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Not allowed to attack? */ auto r_ptr = m_ptr->race(); - if (r_ptr->flags1 & RF1_NEVER_BLOW) return (FALSE); + if (r_ptr->flags & RF_NEVER_BLOW) return (FALSE); /* ...nor if friendly */ if (is_friend(m_ptr) >= 0) @@ -1259,7 +1260,7 @@ bool_ make_attack_normal(int m_idx, byte divis) } /* Cannot attack the player if mortal and player fated to never die by the ... */ - if ((r_ptr->flags7 & RF7_MORTAL) && (p_ptr->no_mortal)) return (FALSE); + if ((r_ptr->flags & RF_MORTAL) && (p_ptr->no_mortal)) return (FALSE); /* Total armor */ ac = p_ptr->ac + p_ptr->to_a; @@ -1435,7 +1436,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (chance > 50000) chance = 50000; chance -= rlev * 300; - if ((randint(100000) < chance) && (r_ptr->flags3 & RF3_EVIL)) + if ((randint(100000) < chance) && (r_ptr->flags & RF_EVIL)) { /* Message */ msg_format("The hand of Eru Iluvatar stops %s blow.", m_name); @@ -1447,7 +1448,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Hack -- Apply "protection from evil" */ if ((p_ptr->protevil > 0) && - (r_ptr->flags3 & RF3_EVIL) && + (r_ptr->flags & RF_EVIL) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1460,7 +1461,7 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Hack -- Apply "protection from good" */ if ((p_ptr->protgood > 0) && - (r_ptr->flags3 & RF3_GOOD) && + (r_ptr->flags & RF_GOOD) && (p_ptr->lev >= rlev) && ((rand_int(100) + p_ptr->lev) > 50)) { @@ -1675,16 +1676,16 @@ bool_ make_attack_normal(int m_idx, byte divis) * a successful blow. Uniques have a better chance. -LM- * Nazgul have a 25% chance */ - if (r_ptr->flags7 & RF7_NAZGUL) + if (r_ptr->flags & RF_NAZGUL) { black_breath_attack(4); } - else if ((m_ptr->level >= 35) && (r_ptr->flags3 & RF3_UNDEAD) && - (r_ptr->flags1 & RF1_UNIQUE)) + else if ((m_ptr->level >= 35) && (r_ptr->flags & RF_UNDEAD) && + (r_ptr->flags & RF_UNIQUE)) { black_breath_attack(300 - m_ptr->level); } - else if ((m_ptr->level >= 40) && (r_ptr->flags3 & RF3_UNDEAD)) + else if ((m_ptr->level >= 40) && (r_ptr->flags & RF_UNDEAD)) { black_breath_attack(450 - m_ptr->level); } @@ -2638,7 +2639,7 @@ bool_ make_attack_normal(int m_idx, byte divis) { if (p_ptr->sh_fire && alive) { - if (!(r_ptr->flags3 & RF3_IM_FIRE)) + if (!(r_ptr->flags & RF_IM_FIRE)) { msg_format("%^s is suddenly very hot!", m_name); if (mon_take_hit(m_idx, damroll(2, 6), &fear, @@ -2652,7 +2653,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (p_ptr->sh_elec && alive) { - if (!(r_ptr->flags3 & RF3_IM_ELEC)) + if (!(r_ptr->flags & RF_IM_ELEC)) { msg_format("%^s gets zapped!", m_name); if (mon_take_hit(m_idx, damroll(2, 6), &fear, @@ -2677,7 +2678,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (p_ptr->shield && (p_ptr->shield_opt & SHIELD_FIRE) && alive) { - if (!(r_ptr->flags3 & RF3_IM_FIRE)) + if (!(r_ptr->flags & RF_IM_FIRE)) { msg_format("%^s gets burned by your fiery shield!", m_name); if (mon_take_hit(m_idx, damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2), &fear, @@ -2704,7 +2705,7 @@ bool_ make_attack_normal(int m_idx, byte divis) { int tmp; - if ((!(r_ptr->flags1 & RF1_UNIQUE)) && (damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2) - m_ptr->level > 0)) + if ((!(r_ptr->flags & RF_UNIQUE)) && (damroll(p_ptr->shield_power_opt, p_ptr->shield_power_opt2) - m_ptr->level > 0)) { msg_format("%^s gets scared away!", m_name); diff --git a/src/melee2.cc b/src/melee2.cc index 3e03c8f6..9d09fb67 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -28,6 +28,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" @@ -69,7 +70,7 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) /* Some monsters are immune to death */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags7 & RF7_NO_DEATH) return FALSE; + if (r_ptr->flags & RF_NO_DEATH) return FALSE; /* Wake it up */ m_ptr->csleep = 0; @@ -80,7 +81,7 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) /* It is dead now... or is it? */ if (m_ptr->hp < 0) { - if (((r_ptr->flags1 & RF1_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) || + if (((r_ptr->flags & RF_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) || (m_ptr->mflag & MFLAG_QUEST)) { m_ptr->hp = 1; @@ -96,10 +97,10 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) monster_desc(m_name, m_ptr, 0); /* Make a sound */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags3 & RF3_NONLIVING) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { sound(SOUND_N_KILL); @@ -120,10 +121,10 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) /* Do nothing */ } /* Death by Physical attack -- non-living monster */ - else if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags3 & RF3_NONLIVING) || + else if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { cmonster_msg(TERM_L_RED, "%^s is destroyed.", m_name); @@ -174,7 +175,7 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) } /* When an Unique dies, it stays dead */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { r_ptr->max_num = 0; } @@ -231,7 +232,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear) /* Sometimes a monster gets scared by damage */ auto const r_ptr = m_ptr->race(); - if (!m_ptr->monfear && !(r_ptr->flags3 & RF3_NO_FEAR)) + if (!m_ptr->monfear && !(r_ptr->flags & RF_NO_FEAR)) { int percentage; @@ -292,7 +293,7 @@ void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear) static bool_ int_outof(std::shared_ptr r_ptr, int prob) { /* Non-Smart monsters are half as "smart" */ - if (!(r_ptr->flags2 & RF2_SMART)) prob = prob / 2; + if (!(r_ptr->flags & RF_SMART)) prob = prob / 2; /* Roll the dice */ return (rand_int(100) < prob); @@ -313,7 +314,7 @@ static void remove_bad_spells(int m_idx, monster_spell_flag_set *spells_p) /* Too stupid to know anything? */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags2 & RF2_STUPID) return; + if (r_ptr->flags & RF_STUPID) return; /* Must be cheating or learning */ @@ -712,7 +713,7 @@ static monster_spell const *choose_attack_spell(int m_idx, std::vectorrace(); - if (r_ptr->flags2 & RF2_STUPID) + if (r_ptr->flags & RF_STUPID) { /* Pick at random */ return spells[rand_int(spells.size())]; @@ -847,7 +848,7 @@ static void breath(int m_idx, int typ, int dam_hp, int rad) auto const r_ptr = m_ptr->race(); /* Determine the radius of the blast */ - if (rad < 1) rad = (r_ptr->flags2 & RF2_POWERFUL) ? 3 : 2; + if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2; /* Target the player with a ball attack */ (void)project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg); @@ -867,7 +868,7 @@ static void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int auto const r_ptr = m_ptr->race(); /* Determine the radius of the blast */ - if (rad < 1) rad = (r_ptr->flags2 & RF2_POWERFUL) ? 3 : 2; + if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2; (void)project(m_idx, rad, y, x, dam_hp, typ, flg); } @@ -1043,7 +1044,7 @@ static bool_ monst_spell_monst(int m_idx) monster_spell_flag_set allowed_spells = r_ptr->spells; /* Hack -- allow "desperate" spells */ - if ((r_ptr->flags2 & RF2_SMART) && + if ((r_ptr->flags & RF_SMART) && (m_ptr->hp < m_ptr->maxhp / 10) && (rand_int(100) < 50)) { @@ -1626,8 +1627,8 @@ static bool_ monst_spell_monst(int m_idx) } /* Attempt a saving throw */ - if ((tr_ptr->flags1 & RF1_UNIQUE) || - (tr_ptr->flags3 & RF3_NO_CONF) || + if ((tr_ptr->flags & RF_UNIQUE) || + (tr_ptr->flags & RF_NO_CONF) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { /* No obvious effect */ @@ -1663,8 +1664,8 @@ static bool_ monst_spell_monst(int m_idx) } /* Attempt a saving throw */ - if ((tr_ptr->flags1 & RF1_UNIQUE) || - (tr_ptr->flags3 & RF3_NO_CONF) || + if ((tr_ptr->flags & RF_UNIQUE) || + (tr_ptr->flags & RF_NO_CONF) || (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10)) { /* No obvious effect */ @@ -1878,7 +1879,7 @@ static bool_ monst_spell_monst(int m_idx) if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles, and you hear scary noises.", m_name); else monster_msg("%^s casts a fearful illusion at %s.", m_name, t_name); - if (tr_ptr->flags3 & RF3_NO_FEAR) + if (tr_ptr->flags & RF_NO_FEAR) { if (see_t) monster_msg("%^s refuses to be frightened.", t_name); } @@ -1902,7 +1903,7 @@ static bool_ monst_spell_monst(int m_idx) if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a spell, burning %s%s eyes.", m_name, t_name, (!strcmp(t_name, "it") ? "s" : "'s")); - if (tr_ptr->flags3 & RF3_NO_CONF) /* Simulate blindness with confusion */ + if (tr_ptr->flags & RF_NO_CONF) /* Simulate blindness with confusion */ { if (see_t) monster_msg("%^s is unaffected.", t_name); } @@ -1926,7 +1927,7 @@ static bool_ monst_spell_monst(int m_idx) if (disturb_other) disturb(1); if (blind || !see_m) monster_msg("%^s mumbles, and you hear puzzling noises.", m_name); else monster_msg("%^s creates a mesmerising illusion in front of %s.", m_name, t_name); - if (tr_ptr->flags3 & RF3_NO_CONF) + if (tr_ptr->flags & RF_NO_CONF) { if (see_t) monster_msg("%^s disbelieves the feeble spell.", t_name); } @@ -1949,7 +1950,7 @@ static bool_ monst_spell_monst(int m_idx) if (disturb_other) disturb(1); if (!blind && see_either) monster_msg("%^s drains power from %s%s muscles.", m_name, t_name, (!strcmp(t_name, "it") ? "s" : "'s")); - if (tr_ptr->flags1 & RF1_UNIQUE) + if (tr_ptr->flags & RF_UNIQUE) { if (see_t) monster_msg("%^s is unaffected.", t_name); } @@ -1971,8 +1972,8 @@ static bool_ monst_spell_monst(int m_idx) if (!direct) break; if (disturb_other) disturb(1); if (!blind && see_m) monster_msg("%^s stares intently at %s.", m_name, t_name); - if ((tr_ptr->flags1 & RF1_UNIQUE) || - (tr_ptr->flags3 & RF3_NO_STUN)) + if ((tr_ptr->flags & RF_UNIQUE) || + (tr_ptr->flags & RF_NO_STUN)) { if (see_t) monster_msg("%^s is unaffected.", t_name); } @@ -2026,7 +2027,7 @@ static bool_ monst_spell_monst(int m_idx) else if (!blind) monster_msg("%^s invokes the Hand of Doom on %s.", m_name, t_name); else monster_msg ("You hear someone invoke the Hand of Doom!"); - if (tr_ptr->flags1 & RF1_UNIQUE) + if (tr_ptr->flags & RF_UNIQUE) { if (!blind && see_t) monster_msg("^%s is unaffected!", t_name); } @@ -2167,9 +2168,9 @@ static bool_ monst_spell_monst(int m_idx) monster_msg("%^s teleports %s away.", m_name, t_name); - if (tr_ptr->flags3 & RF3_RES_TELE) + if (tr_ptr->flags & RF_RES_TELE) { - if (tr_ptr->flags1 & RF1_UNIQUE) + if (tr_ptr->flags & RF_UNIQUE) { if (see_t) { @@ -2282,7 +2283,7 @@ static bool_ monst_spell_monst(int m_idx) if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s magically summons %s %s.", m_name, m_poss, - ((r_ptr->flags1) & RF1_UNIQUE ? + ((r_ptr->flags) & RF_UNIQUE ? "minions" : "kin")); summon_kin_type = r_ptr->d_char; /* Big hack */ for (int k = 0; k < 6; k++) @@ -2773,7 +2774,7 @@ static bool_ make_attack_spell(int m_idx) /* Cannot attack the player if mortal and player fated to never die by the ... */ auto const r_ptr = m_ptr->race(); - if ((r_ptr->flags7 & RF7_MORTAL) && (p_ptr->no_mortal)) return (FALSE); + if ((r_ptr->flags & RF_MORTAL) && (p_ptr->no_mortal)) return (FALSE); /* Hack -- Extract the spell probability */ chance = (r_ptr->freq_inate + r_ptr->freq_spell) / 2; @@ -2810,7 +2811,7 @@ static bool_ make_attack_spell(int m_idx) } /* Hack -- allow "desperate" spells */ - if ((r_ptr->flags2 & RF2_SMART) && + if ((r_ptr->flags & RF_SMART) && (m_ptr->hp < m_ptr->maxhp / 10) && (rand_int(100) < 50)) { @@ -2829,7 +2830,7 @@ static bool_ make_attack_spell(int m_idx) /* Check for a clean bolt shot */ if ((allowed_spells & SF_BOLT_MASK) && - !(r_ptr->flags2 & RF2_STUPID) && + !(r_ptr->flags & RF_STUPID) && !clean_shot(m_ptr->fy, m_ptr->fx, y, x)) { /* Remove spells that will only hurt friends */ @@ -2838,7 +2839,7 @@ static bool_ make_attack_spell(int m_idx) /* Check for a possible summon */ if ((allowed_spells & SF_SUMMON_MASK) && - !(r_ptr->flags2 & RF2_STUPID) && + !(r_ptr->flags & RF_STUPID) && !(summon_possible(y, x))) { /* Remove summoning spells */ @@ -2873,7 +2874,7 @@ static bool_ make_attack_spell(int m_idx) failrate = 25 - (rlev + 3) / 4; /* Hack -- Stupid monsters will never fail (for jellies and such) */ - if (r_ptr->flags2 & RF2_STUPID) failrate = 0; + if (r_ptr->flags & RF_STUPID) failrate = 0; /* Check for spell failure (inate attacks never fail) */ if ((!thrown_spell->is_innate) && (rand_int(100) < failrate)) @@ -4017,7 +4018,7 @@ static bool_ make_attack_spell(int m_idx) if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s magically summons %s %s.", m_name, m_poss, - ((r_ptr->flags1) & RF1_UNIQUE ? + ((r_ptr->flags) & RF_UNIQUE ? "minions" : "kin")); summon_kin_type = r_ptr->d_char; /* Big hack */ @@ -4645,7 +4646,7 @@ static void get_target_monster(int m_idx) if (m_idx == i) continue; /* Cannot be targeted */ - if (rt_ptr->flags7 & RF7_NO_TARGET) continue; + if (rt_ptr->flags & RF_NO_TARGET) continue; if (is_enemy(m_ptr, t_ptr) && (los(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx) && ((dd = distance(m_ptr->fy, m_ptr->fx, t_ptr->fy, t_ptr->fx)) < d))) @@ -4705,13 +4706,13 @@ static bool_ get_moves(int m_idx, int *mm) const auto r_ptr = m_ptr->race(); /* A possessor is not interrested in the player, it only wants a corpse */ - if (r_ptr->flags7 & RF7_POSSESSOR) + if (r_ptr->flags & RF_POSSESSOR) { find_corpse(m_ptr, &y2, &x2); } /* Let quests redefine AI */ - if (r_ptr->flags7 & RF7_AI_SPECIAL) + if (r_ptr->flags & RF_AI_SPECIAL) { struct hook_monster_ai_in in = { m_idx, &m_list[m_idx] }; struct hook_monster_ai_out out = { 0, 0 }; @@ -4724,7 +4725,7 @@ static bool_ get_moves(int m_idx, int *mm) if (m_idx == p_ptr->control) { - if ((r_ptr->flags7 & RF7_AI_PLAYER) || magik(85)) + if ((r_ptr->flags & RF_AI_PLAYER) || magik(85)) { if (distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx) < 50) { @@ -4739,7 +4740,7 @@ static bool_ get_moves(int m_idx, int *mm) int x = m_ptr->fx - x2; /* Tease the player */ - if (r_ptr->flags7 & RF7_AI_ANNOY) + if (r_ptr->flags & RF_AI_ANNOY) { if (distance(m_ptr->fy, m_ptr->fx, y2, x2) < 4) { @@ -4749,7 +4750,7 @@ static bool_ get_moves(int m_idx, int *mm) } /* Death orbs .. */ - if (r_ptr->flags2 & RF2_DEATH_ORB) + if (r_ptr->flags & RF_DEATH_ORB) { if (!los(m_ptr->fy, m_ptr->fx, y2, x2)) { @@ -4765,10 +4766,10 @@ static bool_ get_moves(int m_idx, int *mm) * Animal packs try to get the player out of corridors * (...unless they can move through walls -- TY) */ - if ((r_ptr->flags1 & RF1_FRIENDS) && - (r_ptr->flags3 & RF3_ANIMAL) && - !((r_ptr->flags2 & RF2_PASS_WALL) || - (r_ptr->flags2 & RF2_KILL_WALL))) + if ((r_ptr->flags & RF_FRIENDS) && + (r_ptr->flags & RF_ANIMAL) && + !((r_ptr->flags & RF_PASS_WALL) || + (r_ptr->flags & RF_KILL_WALL))) { int i, room = 0; @@ -4792,7 +4793,7 @@ static bool_ get_moves(int m_idx, int *mm) } /* Monster groups try to surround the player */ - if (!done && (r_ptr->flags1 & RF1_FRIENDS)) + if (!done && (r_ptr->flags & RF_FRIENDS)) { int i; @@ -5075,7 +5076,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) const auto tr_ptr = t_ptr->race(); /* Not allowed to attack */ - if (r_ptr->flags1 & RF1_NEVER_BLOW) return FALSE; + if (r_ptr->flags & RF_NEVER_BLOW) return FALSE; /* Total armor */ const int ac = t_ptr->ac; @@ -5487,8 +5488,8 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) if (touched) { /* Aura fire */ - if ((tr_ptr->flags2 & RF2_AURA_FIRE) && - !(r_ptr->flags3 & RF3_IM_FIRE)) + if ((tr_ptr->flags & RF_AURA_FIRE) && + !(r_ptr->flags & RF_IM_FIRE)) { if (m_ptr->ml || t_ptr->ml) { @@ -5502,7 +5503,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) } /* Aura elec */ - if ((tr_ptr->flags2 & RF2_AURA_ELEC) && !(r_ptr->flags3 & RF3_IM_ELEC)) + if ((tr_ptr->flags & RF_AURA_ELEC) && !(r_ptr->flags & RF_IM_ELEC)) { if (m_ptr->ml || t_ptr->ml) { @@ -5594,27 +5595,27 @@ static bool_ player_invis(monster_type * m_ptr) s16b inv = p_ptr->invis; s16b mlv = m_ptr->level; - if (r_ptr->flags3 & RF3_NO_SLEEP) + if (r_ptr->flags & RF_NO_SLEEP) mlv += 10; - if (r_ptr->flags3 & RF3_DRAGON) + if (r_ptr->flags & RF_DRAGON) mlv += 20; - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) mlv += 15; - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) mlv += 15; - if (r_ptr->flags3 & RF3_ANIMAL) + if (r_ptr->flags & RF_ANIMAL) mlv += 15; - if (r_ptr->flags3 & RF3_ORC) + if (r_ptr->flags & RF_ORC) mlv -= 15; - if (r_ptr->flags3 & RF3_TROLL) + if (r_ptr->flags & RF_TROLL) mlv -= 10; - if (r_ptr->flags2 & RF2_STUPID) + if (r_ptr->flags & RF_STUPID) mlv /= 2; - if (r_ptr->flags2 & RF2_SMART) + if (r_ptr->flags & RF_SMART) mlv = (mlv * 5) / 4; if (m_ptr->mflag & MFLAG_QUEST) inv = 0; - if (r_ptr->flags2 & RF2_INVISIBLE) + if (r_ptr->flags & RF_INVISIBLE) inv = 0; if (m_ptr->mflag & MFLAG_CONTROL) inv = 0; @@ -5659,7 +5660,7 @@ static void process_monster(int m_idx, bool_ is_frien) const bool_ inv = player_invis(m_ptr); auto const r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_DOPPLEGANGER) doppleganger = m_idx; + if (r_ptr->flags & RF_DOPPLEGANGER) doppleganger = m_idx; /* Handle "bleeding" */ if (m_ptr->bleeding) @@ -5872,12 +5873,12 @@ static void process_monster(int m_idx, bool_ is_frien) bool_ gets_angry = FALSE; /* No one wants to be your friend if you're aggravating */ - if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && (p_ptr->aggravate) && !(r_ptr->flags7 & RF7_PET)) + if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && (p_ptr->aggravate) && !(r_ptr->flags & RF_PET)) gets_angry = TRUE; /* Paranoia... no friendly uniques outside wizard mode -- TY */ if ((m_ptr->status > MSTATUS_NEUTRAL) && (m_ptr->status < MSTATUS_COMPANION) && !(wizard) && - (r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags7 & RF7_PET)) + (r_ptr->flags & RF_UNIQUE) && !(r_ptr->flags & RF_PET)) gets_angry = TRUE; if (gets_angry) @@ -5940,7 +5941,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (randint(SPEAK_CHANCE) == 1) { - if (player_has_los_bold(oy, ox) && (r_ptr->flags2 & RF2_CAN_SPEAK)) + if (player_has_los_bold(oy, ox) && (r_ptr->flags & RF_CAN_SPEAK)) { char m_name[80]; char monmessage[1024]; @@ -6007,8 +6008,8 @@ static void process_monster(int m_idx, bool_ is_frien) } /* 75% random movement */ - else if ((r_ptr->flags1 & (RF1_RAND_50)) && - (r_ptr->flags1 & (RF1_RAND_25)) && + else if ((r_ptr->flags & RF_RAND_50) && + (r_ptr->flags & RF_RAND_25) && (rand_int(100) < 75)) { /* Try four "random" directions */ @@ -6016,7 +6017,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* 50% random movement */ - else if ((r_ptr->flags1 & (RF1_RAND_50)) && + else if ((r_ptr->flags & RF_RAND_50) && (rand_int(100) < 50)) { /* Try four "random" directions */ @@ -6024,7 +6025,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* 25% random movement */ - else if ((r_ptr->flags1 & (RF1_RAND_25)) && + else if ((r_ptr->flags & RF_RAND_25) && (rand_int(100) < 25)) { /* Try four "random" directions */ @@ -6087,7 +6088,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Hack -- check for Glyph of Warding */ if ((c_ptr->feat == FEAT_GLYPH) && - !(r_ptr->flags1 & RF1_NEVER_BLOW)) + !(r_ptr->flags & RF_NEVER_BLOW)) { /* Assume no move allowed */ do_move = FALSE; @@ -6113,7 +6114,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Hack -- trees are obstacle */ - else if ((cave[ny][nx].feat == FEAT_TREES) && (r_ptr->flags9 & RF9_KILL_TREES)) + else if ((cave[ny][nx].feat == FEAT_TREES) && (r_ptr->flags & RF_KILL_TREES)) { do_move = TRUE; @@ -6144,28 +6145,28 @@ static void process_monster(int m_idx, bool_ is_frien) /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags7 & RF7_CAN_FLY)) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags & RF_CAN_FLY)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags7 & RF7_CAN_FLY)) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags & RF_CAN_FLY)) { /* Pass through trees/... */ do_move = TRUE; } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_PASS_WALL)) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Monster destroys walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_KILL_WALL)) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_KILL_WALL)) { /* Eat through walls/doors/rubble */ do_move = TRUE; @@ -6186,7 +6187,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags2 & RF2_PASS_WALL)) + else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; @@ -6194,7 +6195,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Monster moves through webs */ else if ((f_info[c_ptr->feat].flags1 & FF1_WEB) && - (r_ptr->flags7 & RF7_SPIDER)) + (r_ptr->flags & RF_SPIDER)) { /* Pass through webs */ do_move = TRUE; @@ -6210,7 +6211,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Take a turn */ do_turn = TRUE; - if ((r_ptr->flags2 & RF2_OPEN_DOOR) && + if ((r_ptr->flags & RF_OPEN_DOOR) && ((is_friend(m_ptr) <= 0) || p_ptr->pet_open_doors)) { /* Closed doors and secret doors */ @@ -6245,7 +6246,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Stuck doors -- attempt to bash them down if allowed */ - if (may_bash && (r_ptr->flags2 & RF2_BASH_DOOR) && + if (may_bash && (r_ptr->flags & RF_BASH_DOOR) && ((is_friend(m_ptr) <= 0) || p_ptr->pet_open_doors)) { int k; @@ -6294,7 +6295,7 @@ static void process_monster(int m_idx, bool_ is_frien) } } else if (do_move && (c_ptr->feat == FEAT_MINOR_GLYPH) - && !(r_ptr->flags1 & RF1_NEVER_BLOW)) + && !(r_ptr->flags & RF_NEVER_BLOW)) { /* Assume no move allowed */ do_move = FALSE; @@ -6339,7 +6340,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Access that cave grid's contents */ y_ptr = &m_list[c_ptr->m_idx]; - if (!(r_ptr->flags3 & RF3_IM_COLD)) + if (!(r_ptr->flags & RF_IM_COLD)) { if ((m_ptr->hp - distance(ny, nx, oy, ox)*2) <= 0) { @@ -6379,7 +6380,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Some monsters never attack */ if (do_move && (ny == p_ptr->py) && (nx == p_ptr->px) && - (r_ptr->flags1 & RF1_NEVER_BLOW)) + (r_ptr->flags & RF_NEVER_BLOW)) { /* Do not move */ do_move = FALSE; @@ -6416,12 +6417,12 @@ static void process_monster(int m_idx, bool_ is_frien) do_move = FALSE; /* Kill weaker monsters */ - if ((r_ptr->flags2 & RF2_KILL_BODY) && + if ((r_ptr->flags & RF_KILL_BODY) && (r_ptr->mexp > z_ptr->mexp) && (cave_floor_bold(ny, nx)) && /* Friends don't kill friends... */ !((is_friend(m_ptr) > 0) && (is_friend(m2_ptr) > 0)) && /* Uniques aren't faceless monsters in a crowd */ - !(z_ptr->flags1 & RF1_UNIQUE) && + !(z_ptr->flags & RF_UNIQUE) && /* Don't wreck quests */ !(m2_ptr->mflag & (MFLAG_QUEST | MFLAG_QUEST2)) && /* Don't punish summoners for relying on their friends */ @@ -6455,7 +6456,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Push past weaker monsters (unless leaving a wall) */ - else if ((r_ptr->flags2 & RF2_MOVE_BODY) && + else if ((r_ptr->flags & RF_MOVE_BODY) && (r_ptr->mexp > z_ptr->mexp) && cave_floor_bold(ny, nx) && (cave_floor_bold(m_ptr->fy, m_ptr->fx))) { @@ -6477,11 +6478,8 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Some monsters never move */ - if (do_move && (r_ptr->flags1 & RF1_NEVER_MOVE)) + if (do_move && (r_ptr->flags & RF_NEVER_MOVE)) { - /* Hack -- memorize lack of attacks */ - /* if (m_ptr->ml) r_ptr->r_flags1 |= RF1_NEVER_MOVE; */ - /* Do not move */ do_move = FALSE; } @@ -6573,7 +6571,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (o_ptr->tval == TV_GOLD) continue; /* Incarnate ? */ - if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags7 & RF7_POSSESSOR) && + if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_POSSESSOR) && ((o_ptr->sval == SV_CORPSE_CORPSE) || (o_ptr->sval == SV_CORPSE_SKELETON))) { if (ai_possessor(m_idx, this_o_idx)) return; @@ -6581,15 +6579,13 @@ static void process_monster(int m_idx, bool_ is_frien) /* Take or Kill objects on the floor */ /* rr9: Pets will no longer pick up/destroy items */ - if ((((r_ptr->flags2 & RF2_TAKE_ITEM) && + if ((((r_ptr->flags & RF_TAKE_ITEM) && ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) || - (r_ptr->flags2 & RF2_KILL_ITEM)) && + (r_ptr->flags & RF_KILL_ITEM)) && (is_friend(m_ptr) <= 0)) { u32b f1, f2, f3, f4, f5, esp; - u32b flg3 = 0L; - char m_name[80]; char o_name[80]; @@ -6603,23 +6599,24 @@ static void process_monster(int m_idx, bool_ is_frien) monster_desc(m_name, m_ptr, 0x04); /* React to objects that hurt the monster */ - if (f5 & (TR5_KILL_DEMON)) flg3 |= RF3_DEMON; - if (f5 & (TR5_KILL_UNDEAD)) flg3 |= RF3_UNDEAD; - if (f1 & (TR1_SLAY_DRAGON)) flg3 |= RF3_DRAGON; - if (f1 & (TR1_SLAY_TROLL)) flg3 |= RF3_TROLL; - if (f1 & (TR1_SLAY_GIANT)) flg3 |= RF3_GIANT; - if (f1 & (TR1_SLAY_ORC)) flg3 |= RF3_ORC; - if (f1 & (TR1_SLAY_DEMON)) flg3 |= RF3_DEMON; - if (f1 & (TR1_SLAY_UNDEAD)) flg3 |= RF3_UNDEAD; - if (f1 & (TR1_SLAY_ANIMAL)) flg3 |= RF3_ANIMAL; - if (f1 & (TR1_SLAY_EVIL)) flg3 |= RF3_EVIL; + monster_race_flag_set flg; + if (f5 & (TR5_KILL_DEMON)) flg |= RF_DEMON; + if (f5 & (TR5_KILL_UNDEAD)) flg |= RF_UNDEAD; + if (f1 & (TR1_SLAY_DRAGON)) flg |= RF_DRAGON; + if (f1 & (TR1_SLAY_TROLL)) flg |= RF_TROLL; + if (f1 & (TR1_SLAY_GIANT)) flg |= RF_GIANT; + if (f1 & (TR1_SLAY_ORC)) flg |= RF_ORC; + if (f1 & (TR1_SLAY_DEMON)) flg |= RF_DEMON; + if (f1 & (TR1_SLAY_UNDEAD)) flg |= RF_UNDEAD; + if (f1 & (TR1_SLAY_ANIMAL)) flg |= RF_ANIMAL; + if (f1 & (TR1_SLAY_EVIL)) flg |= RF_EVIL; /* The object cannot be picked up by the monster */ - if (artifact_p(o_ptr) || (r_ptr->flags3 & flg3) || + if (artifact_p(o_ptr) || (r_ptr->flags & flg) || (o_ptr->art_name)) { /* Only give a message for "take_item" */ - if (r_ptr->flags2 & RF2_TAKE_ITEM) + if (r_ptr->flags & RF_TAKE_ITEM) { /* Describe observable situations */ if (m_ptr->ml && player_has_los_bold(ny, nx)) @@ -6632,7 +6629,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Pick up the item */ - else if (r_ptr->flags2 & RF2_TAKE_ITEM) + else if (r_ptr->flags & RF_TAKE_ITEM) { /* Describe observable situations */ if (player_has_los_bold(ny, nx)) @@ -6678,7 +6675,7 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Update monster light */ - if (r_ptr->flags9 & RF9_HAS_LITE) p_ptr->update |= (PU_MON_LITE); + if (r_ptr->flags & RF_HAS_LITE) p_ptr->update |= (PU_MON_LITE); } /* Stop when done */ @@ -6810,7 +6807,7 @@ void process_monsters(void) monster_type *m_ptr; /* Check the doppleganger */ - if (doppleganger && !(r_info[m_list[doppleganger].r_idx].flags9 & RF9_DOPPLEGANGER)) + if (doppleganger && !(r_info[m_list[doppleganger].r_idx].flags & RF_DOPPLEGANGER)) doppleganger = 0; /* Hack -- calculate the "player noise" */ diff --git a/src/modules.cc b/src/modules.cc index a0014502..888de4aa 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -24,6 +24,7 @@ #include "lua_bind.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" #include "object_type.hpp" @@ -780,7 +781,7 @@ static bool_ theme_push_past(void *data, void *in_, void *out_) if (m_ptr->status >= MSTATUS_NEUTRAL) { if (cave_floor_bold(p->y, p->x) || - (mr_ptr->flags2 == RF2_PASS_WALL)) + (mr_ptr->flags == RF_PASS_WALL)) { char buf[128]; diff --git a/src/monster1.cc b/src/monster1.cc index e7c1a35f..9c838af9 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -12,6 +12,7 @@ #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "player_type.hpp" #include "util.hpp" @@ -63,26 +64,22 @@ static void roff_aux(std::shared_ptr r_ptr) cptr vp[64]; /* Shorthand */ - u32b const flags1 = r_ptr->flags1; - u32b const flags2 = r_ptr->flags2; - u32b const flags3 = r_ptr->flags3; - u32b const flags7 = r_ptr->flags7; - u32b const flags9 = r_ptr->flags9; + auto const flags = r_ptr->flags; monster_spell_flag_set spells = r_ptr->spells; /* Extract a gender (if applicable) */ int msex = 0; - if (flags1 & RF1_FEMALE) + if (flags & RF_FEMALE) { msex = 2; } - else if (flags1 & RF1_MALE) + else if (flags & RF_MALE) { msex = 1; } /* Treat uniques differently */ - if (flags1 & RF1_UNIQUE) + if (flags & RF_UNIQUE) { if (r_ptr->max_num == 0) { @@ -120,7 +117,7 @@ static void roff_aux(std::shared_ptr r_ptr) old = FALSE; /* Describe location */ - if (r_ptr->flags7 & RF7_PET) + if (r_ptr->flags & RF_PET) { text_out(format("%^s is ", wd_he[msex])); text_out_c(TERM_L_BLUE, "friendly"); @@ -174,18 +171,18 @@ static void roff_aux(std::shared_ptr r_ptr) text_out("moves"); /* Random-ness */ - if ((flags1 & (RF1_RAND_50)) || (flags1 & (RF1_RAND_25))) + if ((flags & RF_RAND_50) || (flags & RF_RAND_25)) { /* Adverb */ - if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25))) + if ((flags & RF_RAND_50) && (flags & RF_RAND_25)) { text_out(" extremely"); } - else if (flags1 & (RF1_RAND_50)) + else if (flags & RF_RAND_50) { text_out(" somewhat"); } - else if (flags1 & (RF1_RAND_25)) + else if (flags & RF_RAND_25) { text_out(" a bit"); } @@ -217,7 +214,7 @@ static void roff_aux(std::shared_ptr r_ptr) } /* The code above includes "attack speed" */ - if (flags1 & RF1_NEVER_MOVE) + if (flags & RF_NEVER_MOVE) { /* Introduce */ if (old) @@ -245,7 +242,7 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe experience if known */ { /* Introduction */ - if (flags1 & RF1_UNIQUE) + if (flags & RF_UNIQUE) { text_out("Killing this"); } @@ -255,21 +252,21 @@ static void roff_aux(std::shared_ptr r_ptr) } /* Describe the "quality" */ - if (flags2 & RF2_ELDRITCH_HORROR) text_out_c(TERM_VIOLET, " sanity-blasting"); - if (flags3 & RF3_ANIMAL) text_out_c(TERM_VIOLET, " natural"); - if (flags3 & RF3_EVIL) text_out_c(TERM_VIOLET, " evil"); - if (flags3 & RF3_GOOD) text_out_c(TERM_VIOLET, " good"); - if (flags3 & RF3_UNDEAD) text_out_c(TERM_VIOLET, " undead"); + if (flags & RF_ELDRITCH_HORROR) text_out_c(TERM_VIOLET, " sanity-blasting"); + if (flags & RF_ANIMAL) text_out_c(TERM_VIOLET, " natural"); + if (flags & RF_EVIL) text_out_c(TERM_VIOLET, " evil"); + if (flags & RF_GOOD) text_out_c(TERM_VIOLET, " good"); + if (flags & RF_UNDEAD) text_out_c(TERM_VIOLET, " undead"); /* Describe the "race" */ - if (flags3 & RF3_DRAGON) text_out_c(TERM_VIOLET, " dragon"); - else if (flags3 & RF3_DEMON) text_out_c(TERM_VIOLET, " demon"); - else if (flags3 & RF3_GIANT) text_out_c(TERM_VIOLET, " giant"); - else if (flags3 & RF3_TROLL) text_out_c(TERM_VIOLET, " troll"); - else if (flags3 & RF3_ORC) text_out_c(TERM_VIOLET, " orc"); - else if (flags3 & RF3_THUNDERLORD)text_out_c(TERM_VIOLET, " Thunderlord"); - else if (flags7 & RF7_SPIDER) text_out_c(TERM_VIOLET, " spider"); - else if (flags7 & RF7_NAZGUL) text_out_c(TERM_VIOLET, " Nazgul"); + if (flags & RF_DRAGON) text_out_c(TERM_VIOLET, " dragon"); + else if (flags & RF_DEMON) text_out_c(TERM_VIOLET, " demon"); + else if (flags & RF_GIANT) text_out_c(TERM_VIOLET, " giant"); + else if (flags & RF_TROLL) text_out_c(TERM_VIOLET, " troll"); + else if (flags & RF_ORC) text_out_c(TERM_VIOLET, " orc"); + else if (flags & RF_THUNDERLORD)text_out_c(TERM_VIOLET, " Thunderlord"); + else if (flags & RF_SPIDER) text_out_c(TERM_VIOLET, " spider"); + else if (flags & RF_NAZGUL) text_out_c(TERM_VIOLET, " Nazgul"); else text_out(" creature"); /* Group some variables */ @@ -310,26 +307,26 @@ static void roff_aux(std::shared_ptr r_ptr) } } - if ((flags2 & RF2_AURA_FIRE) && (flags2 & RF2_AURA_ELEC)) + if ((flags & RF_AURA_FIRE) && (flags & RF_AURA_ELEC)) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_VIOLET, "flames and electricity"); text_out(". "); } - else if (flags2 & RF2_AURA_FIRE) + else if (flags & RF_AURA_FIRE) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_ORANGE, "flames"); text_out(". "); } - else if (flags2 & RF2_AURA_ELEC) + else if (flags & RF_AURA_ELEC) { text_out(format("%^s is surrounded by ", wd_he[msex])); text_out_c(TERM_L_BLUE, "electricity"); text_out(". "); } - if (flags2 & RF2_REFLECTING) + if (flags & RF_REFLECTING) { text_out(format("%^s ", wd_he[msex])); text_out_c(TERM_L_UMBER, "reflects"); @@ -338,14 +335,14 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe escorts */ - if ((flags1 & RF1_ESCORT) || (flags1 & RF1_ESCORTS)) + if ((flags & RF_ESCORT) || (flags & RF_ESCORTS)) { text_out(format("%^s usually appears with escorts. ", wd_he[msex])); } /* Describe friends */ - else if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS)) + else if ((flags & RF_FRIEND) || (flags & RF_FRIENDS)) { text_out(format("%^s usually appears in groups. ", wd_he[msex])); @@ -522,7 +519,7 @@ static void roff_aux(std::shared_ptr r_ptr) text_out(" magical, casting spells"); /* Adverb */ - if (flags2 & RF2_SMART) text_out_c(TERM_YELLOW, " intelligently"); + if (flags & RF_SMART) text_out_c(TERM_YELLOW, " intelligently"); /* Scan */ for (n = 0; n < vn; n++) @@ -562,7 +559,7 @@ static void roff_aux(std::shared_ptr r_ptr) text_out_c(TERM_L_GREEN, format("%d", r_ptr->ac)); /* Maximized hitpoints */ - if (flags1 & RF1_FORCE_MAXHP) + if (flags & RF_FORCE_MAXHP) { text_out(" and a life rating of "); text_out_c(TERM_L_GREEN, format("%d", r_ptr->hdice * r_ptr->hside)); @@ -582,15 +579,15 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect special abilities. */ vn = 0; - if (flags2 & RF2_OPEN_DOOR) vp[vn++] = "open doors"; - if (flags2 & RF2_BASH_DOOR) vp[vn++] = "bash down doors"; - if (flags2 & RF2_PASS_WALL) vp[vn++] = "pass through walls"; - if (flags2 & RF2_KILL_WALL) vp[vn++] = "bore through walls"; - if (flags2 & RF2_MOVE_BODY) vp[vn++] = "push past weaker monsters"; - if (flags2 & RF2_KILL_BODY) vp[vn++] = "destroy weaker monsters"; - if (flags2 & RF2_TAKE_ITEM) vp[vn++] = "pick up objects"; - if (flags2 & RF2_KILL_ITEM) vp[vn++] = "destroy objects"; - if (flags9 & RF9_HAS_LITE) vp[vn++] = "illuminate the dungeon"; + if (flags & RF_OPEN_DOOR) vp[vn++] = "open doors"; + if (flags & RF_BASH_DOOR) vp[vn++] = "bash down doors"; + if (flags & RF_PASS_WALL) vp[vn++] = "pass through walls"; + if (flags & RF_KILL_WALL) vp[vn++] = "bore through walls"; + if (flags & RF_MOVE_BODY) vp[vn++] = "push past weaker monsters"; + if (flags & RF_KILL_BODY) vp[vn++] = "destroy weaker monsters"; + if (flags & RF_TAKE_ITEM) vp[vn++] = "pick up objects"; + if (flags & RF_KILL_ITEM) vp[vn++] = "destroy objects"; + if (flags & RF_HAS_LITE) vp[vn++] = "illuminate the dungeon"; /* Describe special abilities. */ if (vn) @@ -616,19 +613,19 @@ static void roff_aux(std::shared_ptr r_ptr) /* Describe special abilities. */ - if (flags2 & RF2_INVISIBLE) + if (flags & RF_INVISIBLE) { text_out_c(TERM_GREEN, format("%^s is invisible. ", wd_he[msex])); } - if (flags2 & RF2_COLD_BLOOD) + if (flags & RF_COLD_BLOOD) { text_out(format("%^s is cold blooded. ", wd_he[msex])); } - if (flags2 & RF2_EMPTY_MIND) + if (flags & RF_EMPTY_MIND) { text_out(format("%^s is not detected by telepathy. ", wd_he[msex])); } - if (flags2 & RF2_WEIRD_MIND) + if (flags & RF_WEIRD_MIND) { text_out(format("%^s is rarely detected by telepathy. ", wd_he[msex])); } @@ -636,12 +633,12 @@ static void roff_aux(std::shared_ptr r_ptr) { text_out_c(TERM_L_UMBER, format("%^s breeds explosively. ", wd_he[msex])); } - if (flags2 & RF2_REGENERATE) + if (flags & RF_REGENERATE) { text_out_c(TERM_L_WHITE, format("%^s regenerates quickly. ", wd_he[msex])); } - if (r_ptr->flags7 & RF7_MORTAL) + if (r_ptr->flags & RF_MORTAL) { text_out_c(TERM_RED, format("%^s is a mortal being. ", wd_he[msex])); } @@ -653,37 +650,37 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect susceptibilities */ vn = 0; - if (flags3 & RF3_HURT_ROCK) + if (flags & RF_HURT_ROCK) { vp[vn++] = "rock remover"; color[vn - 1] = TERM_UMBER; } - if (flags3 & RF3_HURT_LITE) + if (flags & RF_HURT_LITE) { vp[vn++] = "bright light"; color[vn - 1] = TERM_YELLOW; } - if (flags3 & RF3_SUSCEP_FIRE) + if (flags & RF_SUSCEP_FIRE) { vp[vn++] = "fire"; color[vn - 1] = TERM_RED; } - if (flags3 & RF3_SUSCEP_COLD) + if (flags & RF_SUSCEP_COLD) { vp[vn++] = "cold"; color[vn - 1] = TERM_L_WHITE; } - if (flags9 & RF9_SUSCEP_ACID) + if (flags & RF_SUSCEP_ACID) { vp[vn++] = "acid"; color[vn - 1] = TERM_GREEN; } - if (flags9 & RF9_SUSCEP_ELEC) + if (flags & RF_SUSCEP_ELEC) { vp[vn++] = "lightning"; color[vn - 1] = TERM_L_BLUE; } - if (flags9 & RF9_SUSCEP_POIS) + if (flags & RF_SUSCEP_POIS) { vp[vn++] = "poison"; color[vn - 1] = TERM_L_GREEN; @@ -714,27 +711,27 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect immunities */ vn = 0; - if (flags3 & RF3_IM_ACID) + if (flags & RF_IM_ACID) { vp[vn++] = "acid"; color[vn - 1] = TERM_L_GREEN; } - if (flags3 & RF3_IM_ELEC) + if (flags & RF_IM_ELEC) { vp[vn++] = "lightning"; color[vn - 1] = TERM_L_BLUE; } - if (flags3 & RF3_IM_FIRE) + if (flags & RF_IM_FIRE) { vp[vn++] = "fire"; color[vn - 1] = TERM_L_RED; } - if (flags3 & RF3_IM_COLD) + if (flags & RF_IM_COLD) { vp[vn++] = "cold"; color[vn - 1] = TERM_L_BLUE; } - if (flags3 & RF3_IM_POIS) + if (flags & RF_IM_POIS) { vp[vn++] = "poison"; color[vn - 1] = TERM_L_GREEN; @@ -765,12 +762,12 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect resistances */ vn = 0; - if (flags3 & RF3_RES_NETH) vp[vn++] = "nether"; - if (flags3 & RF3_RES_WATE) vp[vn++] = "water"; - if (flags3 & RF3_RES_PLAS) vp[vn++] = "plasma"; - if (flags3 & RF3_RES_NEXU) vp[vn++] = "nexus"; - if (flags3 & RF3_RES_DISE) vp[vn++] = "disenchantment"; - if (flags3 & RF3_RES_TELE) vp[vn++] = "teleportation"; + if (flags & RF_RES_NETH) vp[vn++] = "nether"; + if (flags & RF_RES_WATE) vp[vn++] = "water"; + if (flags & RF_RES_PLAS) vp[vn++] = "plasma"; + if (flags & RF_RES_NEXU) vp[vn++] = "nexus"; + if (flags & RF_RES_DISE) vp[vn++] = "disenchantment"; + if (flags & RF_RES_TELE) vp[vn++] = "teleportation"; /* Describe resistances */ if (vn) @@ -797,10 +794,10 @@ static void roff_aux(std::shared_ptr r_ptr) /* Collect non-effects */ vn = 0; - if (flags3 & RF3_NO_STUN) vp[vn++] = "stunned"; - if (flags3 & RF3_NO_FEAR) vp[vn++] = "frightened"; - if (flags3 & RF3_NO_CONF) vp[vn++] = "confused"; - if (flags3 & RF3_NO_SLEEP) vp[vn++] = "slept"; + if (flags & RF_NO_STUN) vp[vn++] = "stunned"; + if (flags & RF_NO_FEAR) vp[vn++] = "frightened"; + if (flags & RF_NO_CONF) vp[vn++] = "confused"; + if (flags & RF_NO_SLEEP) vp[vn++] = "slept"; /* Describe non-effects */ if (vn) @@ -886,15 +883,15 @@ static void roff_aux(std::shared_ptr r_ptr) byte drop_item; drop_gold = drop_item = - (((r_ptr->flags1 & (RF1_DROP_4D2)) ? 8 : 0) + - ((r_ptr->flags1 & (RF1_DROP_3D2)) ? 6 : 0) + - ((r_ptr->flags1 & (RF1_DROP_2D2)) ? 4 : 0) + - ((r_ptr->flags1 & (RF1_DROP_1D2)) ? 2 : 0) + - ((r_ptr->flags1 & (RF1_DROP_90)) ? 1 : 0) + - ((r_ptr->flags1 & (RF1_DROP_60)) ? 1 : 0)); + (((r_ptr->flags & RF_DROP_4D2) ? 8 : 0) + + ((r_ptr->flags & RF_DROP_3D2) ? 6 : 0) + + ((r_ptr->flags & RF_DROP_2D2) ? 4 : 0) + + ((r_ptr->flags & RF_DROP_1D2) ? 2 : 0) + + ((r_ptr->flags & RF_DROP_90) ? 1 : 0) + + ((r_ptr->flags & RF_DROP_60) ? 1 : 0)); - if (r_ptr->flags1 & RF1_ONLY_GOLD) drop_item = 0; - if (r_ptr->flags1 & RF1_ONLY_ITEM) drop_gold = 0; + if (r_ptr->flags & RF_ONLY_GOLD) drop_item = 0; + if (r_ptr->flags & RF_ONLY_ITEM) drop_gold = 0; /* No "n" needed */ sin = FALSE; @@ -924,13 +921,13 @@ static void roff_aux(std::shared_ptr r_ptr) /* Great */ - if (flags1 & RF1_DROP_GREAT) + if (flags & RF_DROP_GREAT) { p = " exceptional"; } /* Good (no "n" needed) */ - else if (flags1 & RF1_DROP_GOOD) + else if (flags & RF_DROP_GOOD) { p = " good"; sin = FALSE; @@ -1240,7 +1237,7 @@ static void roff_aux(std::shared_ptr r_ptr) } /* Notice lack of attacks */ - else if (flags1 & RF1_NEVER_BLOW) + else if (flags & RF_NEVER_BLOW) { text_out(format("%^s has no physical attacks. ", wd_he[msex])); } @@ -1272,7 +1269,7 @@ static void roff_name(int r_idx, int ego) const byte a2 = r_ptr->x_attr; /* A title (use "The" for non-uniques) */ - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) { Term_addstr( -1, TERM_WHITE, "The "); } @@ -1382,10 +1379,10 @@ bool_ monster_quest(int r_idx) monster_race *r_ptr = &r_info[r_idx]; /* Random quests are in the dungeon */ - if (!(r_ptr->flags8 & RF8_DUNGEON)) return FALSE; + if (r_ptr->flags & RF_WILD_ONLY) return FALSE; /* No random quests for aquatic monsters */ - if (r_ptr->flags7 & RF7_AQUATIC) return FALSE; + if (r_ptr->flags & RF_AQUATIC) return FALSE; /* No random quests for multiplying monsters */ if (r_ptr->spells & SF_MULTIPLY) return FALSE; @@ -1398,7 +1395,7 @@ bool_ monster_dungeon(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_DUNGEON) + if (!(r_ptr->flags & RF_WILD_ONLY)) return TRUE; else return FALSE; @@ -1409,7 +1406,7 @@ static bool_ monster_ocean(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_OCEAN) + if (r_ptr->flags & RF_WILD_OCEAN) return TRUE; else return FALSE; @@ -1420,7 +1417,7 @@ static bool_ monster_shore(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_SHORE) + if (r_ptr->flags & RF_WILD_SHORE) return TRUE; else return FALSE; @@ -1431,7 +1428,7 @@ static bool_ monster_waste(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_WASTE) + if (r_ptr->flags & RF_WILD_WASTE) return TRUE; else return FALSE; @@ -1442,7 +1439,7 @@ static bool_ monster_town(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_TOWN) + if (r_ptr->flags & RF_WILD_TOWN) return TRUE; else return FALSE; @@ -1453,7 +1450,7 @@ static bool_ monster_wood(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_WOOD) + if (r_ptr->flags & RF_WILD_WOOD) return TRUE; else return FALSE; @@ -1464,7 +1461,7 @@ static bool_ monster_volcano(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_VOLCANO) + if (r_ptr->flags & RF_WILD_VOLCANO) return TRUE; else return FALSE; @@ -1475,7 +1472,7 @@ static bool_ monster_mountain(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_MOUNTAIN) + if (r_ptr->flags & RF_WILD_MOUNTAIN) return TRUE; else return FALSE; @@ -1486,7 +1483,7 @@ static bool_ monster_grass(int r_idx) { monster_race *r_ptr = &r_info[r_idx]; - if (r_ptr->flags8 & RF8_WILD_GRASS) + if (r_ptr->flags & RF_WILD_GRASS) return TRUE; else return FALSE; @@ -1499,7 +1496,7 @@ static bool_ monster_deep_water(int r_idx) if (!monster_dungeon(r_idx)) return FALSE; - if (r_ptr->flags7 & RF7_AQUATIC) + if (r_ptr->flags & RF_AQUATIC) return TRUE; else return FALSE; @@ -1512,7 +1509,7 @@ static bool_ monster_shallow_water(int r_idx) if (!monster_dungeon(r_idx)) return FALSE; - if (r_ptr->flags2 & RF2_AURA_FIRE) + if (r_ptr->flags & RF_AURA_FIRE) return FALSE; else return TRUE; @@ -1525,9 +1522,9 @@ static bool_ monster_lava(int r_idx) if (!monster_dungeon(r_idx)) return FALSE; - if (((r_ptr->flags3 & RF3_IM_FIRE) || - (r_ptr->flags7 & RF7_CAN_FLY)) && - !(r_ptr->flags3 & RF3_AURA_COLD)) + if (((r_ptr->flags & RF_IM_FIRE) || + (r_ptr->flags & RF_CAN_FLY)) && + !(r_ptr->flags & RF_AURA_COLD)) return TRUE; else return FALSE; @@ -1585,9 +1582,9 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr) /* Deep water */ if (feat == FEAT_DEEP_WATER) { - if ((r_ptr->flags7 & RF7_AQUATIC) || - (r_ptr->flags7 & RF7_CAN_FLY) || - (r_ptr->flags7 & RF7_CAN_SWIM)) + if ((r_ptr->flags & RF_AQUATIC) || + (r_ptr->flags & RF_CAN_FLY) || + (r_ptr->flags & RF_CAN_SWIM)) return TRUE; else return FALSE; @@ -1595,14 +1592,14 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr) /* Shallow water */ else if (feat == FEAT_SHAL_WATER) { - if (r_ptr->flags2 & RF2_AURA_FIRE) + if (r_ptr->flags & RF_AURA_FIRE) return FALSE; else return TRUE; } /* Aquatic monster */ - else if ((r_ptr->flags7 & RF7_AQUATIC) && - !(r_ptr->flags7 & RF7_CAN_FLY)) + else if ((r_ptr->flags & RF_AQUATIC) && + !(r_ptr->flags & RF_CAN_FLY)) { return FALSE; } @@ -1610,8 +1607,8 @@ bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr) else if ((feat == FEAT_SHAL_LAVA) || (feat == FEAT_DEEP_LAVA)) { - if ((r_ptr->flags3 & RF3_IM_FIRE) || - (r_ptr->flags7 & RF7_CAN_FLY)) + if ((r_ptr->flags & RF_IM_FIRE) || + (r_ptr->flags & RF_CAN_FLY)) return TRUE; else return FALSE; diff --git a/src/monster2.cc b/src/monster2.cc index b387b495..52b342d4 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -22,6 +22,7 @@ #include "monster3.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -173,20 +174,10 @@ bool_ mego_ok(monster_race const *r_ptr, int ego) int i; /* needed flags */ - if (re_ptr->flags1 && ((re_ptr->flags1 & r_ptr->flags1) != re_ptr->flags1)) return FALSE; - if (re_ptr->flags2 && ((re_ptr->flags2 & r_ptr->flags2) != re_ptr->flags2)) return FALSE; - if (re_ptr->flags3 && ((re_ptr->flags3 & r_ptr->flags3) != re_ptr->flags3)) return FALSE; - if (re_ptr->flags7 && ((re_ptr->flags7 & r_ptr->flags7) != re_ptr->flags7)) return FALSE; - if (re_ptr->flags8 && ((re_ptr->flags8 & r_ptr->flags8) != re_ptr->flags8)) return FALSE; - if (re_ptr->flags9 && ((re_ptr->flags9 & r_ptr->flags9) != re_ptr->flags9)) return FALSE; + if (re_ptr->flags && ((re_ptr->flags & r_ptr->flags) != re_ptr->flags)) return FALSE; /* unwanted flags */ - if (re_ptr->hflags1 && (re_ptr->hflags1 & r_ptr->flags1)) return FALSE; - if (re_ptr->hflags2 && (re_ptr->hflags2 & r_ptr->flags2)) return FALSE; - if (re_ptr->hflags3 && (re_ptr->hflags3 & r_ptr->flags3)) return FALSE; - if (re_ptr->hflags7 && (re_ptr->hflags7 & r_ptr->flags7)) return FALSE; - if (re_ptr->hflags8 && (re_ptr->hflags8 & r_ptr->flags8)) return FALSE; - if (re_ptr->hflags9 && (re_ptr->hflags9 & r_ptr->flags9)) return FALSE; + if (re_ptr->hflags && (re_ptr->hflags & r_ptr->flags)) return FALSE; /* Need good race -- IF races are specified */ if (re_ptr->r_char[0]) @@ -331,21 +322,11 @@ std::shared_ptr race_info_idx(int r_idx, int ego) MODIFY(nr_ptr->level, re_ptr->level, 1); /* Take off some flags */ - nr_ptr->flags1 &= ~(re_ptr->nflags1); - nr_ptr->flags2 &= ~(re_ptr->nflags2); - nr_ptr->flags3 &= ~(re_ptr->nflags3); - nr_ptr->flags7 &= ~(re_ptr->nflags7); - nr_ptr->flags8 &= ~(re_ptr->nflags8); - nr_ptr->flags9 &= ~(re_ptr->nflags9); + nr_ptr->flags &= ~re_ptr->nflags; nr_ptr->spells &= ~(re_ptr->nspells); /* Add some flags */ - nr_ptr->flags1 |= re_ptr->mflags1; - nr_ptr->flags2 |= re_ptr->mflags2; - nr_ptr->flags3 |= re_ptr->mflags3; - nr_ptr->flags7 |= re_ptr->mflags7; - nr_ptr->flags8 |= re_ptr->mflags8; - nr_ptr->flags9 |= re_ptr->mflags9; + nr_ptr->flags |= re_ptr->mflags; nr_ptr->spells |= re_ptr->mspells; /* Change the char/attr is needed */ @@ -453,7 +434,7 @@ void delete_monster_idx(int i) /* XXX XXX XXX remove monster light source */ bool_ had_lite = FALSE; - if (r_ptr->flags9 & RF9_HAS_LITE) had_lite = TRUE; + if (r_ptr->flags & RF_HAS_LITE) had_lite = TRUE; /* Hack -- remove target monster */ @@ -679,7 +660,7 @@ void compact_monsters(int size) if ((m_ptr->mflag & MFLAG_QUEST) && (cnt < 1000)) chance = 100; /* Try not to compact Unique Monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) chance = 99; + if (r_ptr->flags & RF_UNIQUE) chance = 99; /* All monsters get a saving throw */ if (rand_int(100) < chance) continue; @@ -866,34 +847,9 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) { int a; - if (d_ptr->rules[rule].mflags1) + if (d_ptr->rules[rule].mflags) { - if ((d_ptr->rules[rule].mflags1 & r_ptr->flags1) != d_ptr->rules[rule].mflags1) - return FALSE; - } - if (d_ptr->rules[rule].mflags2) - { - if ((d_ptr->rules[rule].mflags2 & r_ptr->flags2) != d_ptr->rules[rule].mflags2) - return FALSE; - } - if (d_ptr->rules[rule].mflags3) - { - if ((d_ptr->rules[rule].mflags3 & r_ptr->flags3) != d_ptr->rules[rule].mflags3) - return FALSE; - } - if (d_ptr->rules[rule].mflags7) - { - if ((d_ptr->rules[rule].mflags7 & r_ptr->flags7) != d_ptr->rules[rule].mflags7) - return FALSE; - } - if (d_ptr->rules[rule].mflags8) - { - if ((d_ptr->rules[rule].mflags8 & r_ptr->flags8) != d_ptr->rules[rule].mflags8) - return FALSE; - } - if (d_ptr->rules[rule].mflags9) - { - if ((d_ptr->rules[rule].mflags9 & r_ptr->flags9) != d_ptr->rules[rule].mflags9) + if ((d_ptr->rules[rule].mflags & r_ptr->flags) != d_ptr->rules[rule].mflags) return FALSE; } if (d_ptr->rules[rule].mspells) @@ -913,13 +869,7 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) { int a; - if (d_ptr->rules[rule].mflags1 && (r_ptr->flags1 & d_ptr->rules[rule].mflags1)) return TRUE; - if (d_ptr->rules[rule].mflags2 && (r_ptr->flags2 & d_ptr->rules[rule].mflags2)) return TRUE; - if (d_ptr->rules[rule].mflags3 && (r_ptr->flags3 & d_ptr->rules[rule].mflags3)) return TRUE; - if (d_ptr->rules[rule].mflags7 && (r_ptr->flags7 & d_ptr->rules[rule].mflags7)) return TRUE; - if (d_ptr->rules[rule].mflags8 && (r_ptr->flags8 & d_ptr->rules[rule].mflags8)) return TRUE; - if (d_ptr->rules[rule].mflags9 && (r_ptr->flags9 & d_ptr->rules[rule].mflags9)) return TRUE; - + if (d_ptr->rules[rule].mflags && (r_ptr->flags & d_ptr->rules[rule].mflags)) return TRUE; if (d_ptr->rules[rule].mspells && (r_ptr->spells & d_ptr->rules[rule].mspells)) return TRUE; for (a = 0; a < 5; a++) @@ -1040,20 +990,20 @@ s16b get_mon_num(int level) r_ptr = &r_info[r_idx]; /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & RF1_UNIQUE) && + if ((r_ptr->flags & RF_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num)) { continue; } /* Depth Monsters never appear out of depth */ - if ((r_ptr->flags1 & RF1_FORCE_DEPTH) && (r_ptr->level > dun_level)) + if ((r_ptr->flags & RF_FORCE_DEPTH) && (r_ptr->level > dun_level)) { continue; } /* Depth Monsters never appear out of their depth */ - if ((r_ptr->flags9 & RF9_ONLY_DEPTH) && (r_ptr->level != dun_level)) + if ((r_ptr->flags & RF_ONLY_DEPTH) && (r_ptr->level != dun_level)) { continue; } @@ -1061,14 +1011,14 @@ s16b get_mon_num(int level) if(in_tome) { /* Zangbandish monsters not allowed */ - if (r_ptr->flags8 & RF8_ZANGBAND) continue; + if (r_ptr->flags & RF_ZANGBAND) continue; /* Lovecraftian monsters not allowed */ - if (r_ptr->flags8 & RF8_CTHANGBAND) continue; + if (r_ptr->flags & RF_CTHANGBAND) continue; } /* Joke monsters allowed ? or not ? */ - if (!joke_monsters && (r_ptr->flags8 & RF8_JOKEANGBAND)) continue; + if (!joke_monsters && (r_ptr->flags & RF_JOKEANGBAND)) continue; /* Some dungeon types restrict the possible monsters */ if (!summon_hack && !restrict_monster_to_dungeon(r_idx) && dun_level) continue; @@ -1239,7 +1189,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { hallu_race = &r_info[randint(max_r_idx - 2)]; } - while ((hallu_race->flags1 & RF1_UNIQUE) && (hallu_race->name != nullptr)); + while ((hallu_race->flags & RF_UNIQUE) && (hallu_race->name != nullptr)); strcpy(silly_name, hallu_race->name); } @@ -1264,8 +1214,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) int kind = 0x00; /* Extract the gender (if applicable) */ - if (r_ptr->flags1 & RF1_FEMALE) kind = 0x20; - else if (r_ptr->flags1 & RF1_MALE) kind = 0x10; + if (r_ptr->flags & RF_FEMALE) kind = 0x20; + else if (r_ptr->flags & RF_MALE) kind = 0x10; /* Ignore the gender (if desired) */ if (!m_ptr || !pron) kind = 0x00; @@ -1365,8 +1315,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) else if ((mode & 0x02) && (mode & 0x01)) { /* The monster is visible, so use its gender */ - if (r_ptr->flags1 & RF1_FEMALE) strcpy(desc, "herself"); - else if (r_ptr->flags1 & RF1_MALE) strcpy(desc, "himself"); + if (r_ptr->flags & RF_FEMALE) strcpy(desc, "herself"); + else if (r_ptr->flags & RF_MALE) strcpy(desc, "himself"); else strcpy(desc, "itself"); } @@ -1375,7 +1325,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) else { /* It could be a Unique */ - if ((r_ptr->flags1 & RF1_UNIQUE) && !(p_ptr->image)) + if ((r_ptr->flags & RF_UNIQUE) && !(p_ptr->image)) { /* Start with the name (thus nominative and objective) */ (void)strcpy(desc, name); @@ -1436,7 +1386,7 @@ void monster_race_desc(char *desc, int r_idx, int ego) } /* It could be a Unique */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { /* Start with the name (thus nominative and objective) */ (void)strcpy(desc, name); @@ -1474,9 +1424,9 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) char m_name[80]; monster_desc(m_name, m_ptr, 0); - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) { - if (r_ptr->flags1 & RF1_FRIENDS) + if (r_ptr->flags & RF_FRIENDS) power /= 2; } else power *= 2; @@ -1487,7 +1437,7 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) if (!(m_ptr->ml)) return ; /* Cannot see it for some reason */ - if (!(r_ptr->flags2 & RF2_ELDRITCH_HORROR)) + if (!(r_ptr->flags & RF_ELDRITCH_HORROR)) return ; /* oops */ @@ -1703,7 +1653,7 @@ void update_mon(int m_idx, bool_ full) { /* Infravision only works on "warm" creatures */ /* Below, we will need to know that infravision failed */ - if (!(r_ptr->flags2 & RF2_COLD_BLOOD)) + if (!(r_ptr->flags & RF_COLD_BLOOD)) { /* Infravision works */ easy = flag = TRUE; @@ -1714,7 +1664,7 @@ void update_mon(int m_idx, bool_ full) if (player_can_see_bold(fy, fx)) { /* Visible, or detectable, monsters get seen */ - if (p_ptr->see_inv || !(r_ptr->flags2 & RF2_INVISIBLE)) + if (p_ptr->see_inv || !(r_ptr->flags & RF_INVISIBLE)) { easy = flag = TRUE; } @@ -1728,32 +1678,32 @@ void update_mon(int m_idx, bool_ full) bool_ can_esp = FALSE; /* Different ESP */ - if ((p_ptr->telepathy & ESP_ORC) && (r_ptr->flags3 & RF3_ORC)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_SPIDER) && (r_ptr->flags7 & RF7_SPIDER)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_TROLL) && (r_ptr->flags3 & RF3_TROLL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_DRAGON) && (r_ptr->flags3 & RF3_DRAGON)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_GIANT) && (r_ptr->flags3 & RF3_GIANT)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_DEMON) && (r_ptr->flags3 & RF3_DEMON)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_UNDEAD) && (r_ptr->flags3 & RF3_UNDEAD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_EVIL) && (r_ptr->flags3 & RF3_EVIL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_ANIMAL) && (r_ptr->flags3 & RF3_ANIMAL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_THUNDERLORD) && (r_ptr->flags3 & RF3_THUNDERLORD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_GOOD) && (r_ptr->flags3 & RF3_GOOD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_NONLIVING) && (r_ptr->flags3 & RF3_NONLIVING)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_UNIQUE) && ((r_ptr->flags1 & RF1_UNIQUE) || (r_ptr->flags3 & RF3_UNIQUE_4))) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_ORC) && (r_ptr->flags & RF_ORC)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_SPIDER) && (r_ptr->flags & RF_SPIDER)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_TROLL) && (r_ptr->flags & RF_TROLL)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_DRAGON) && (r_ptr->flags & RF_DRAGON)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_GIANT) && (r_ptr->flags & RF_GIANT)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_DEMON) && (r_ptr->flags & RF_DEMON)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_EVIL) && (r_ptr->flags & RF_EVIL)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_THUNDERLORD) && (r_ptr->flags & RF_THUNDERLORD)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_GOOD) && (r_ptr->flags & RF_GOOD)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_NONLIVING) && (r_ptr->flags & RF_NONLIVING)) can_esp = TRUE; + if ((p_ptr->telepathy & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE) || (r_ptr->flags & RF_UNIQUE_4))) can_esp = TRUE; if (p_ptr->telepathy & ESP_ALL) can_esp = TRUE; /* Only do this when we can really detect monster */ if (can_esp) { /* Empty mind, no telepathy */ - if (r_ptr->flags2 & RF2_EMPTY_MIND) + if (r_ptr->flags & RF_EMPTY_MIND) { /* No telepathy */ } /* Weird mind, occasional telepathy */ - else if (r_ptr->flags2 & RF2_WEIRD_MIND) + else if (r_ptr->flags & RF_WEIRD_MIND) { if (rand_int(100) < 10) { @@ -1836,7 +1786,7 @@ void update_mon(int m_idx, bool_ full) if (m_ptr->ml != old_ml) { - if (r_ptr->flags2 & RF2_ELDRITCH_HORROR) + if (r_ptr->flags & RF_ELDRITCH_HORROR) { sanity_blast(m_ptr, FALSE); } @@ -2094,7 +2044,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Ego Uniques are NOT to be created */ - if ((r_ptr->flags1 & RF1_UNIQUE) && ego) + if ((r_ptr->flags & RF_UNIQUE) && ego) { return 0; } @@ -2111,28 +2061,28 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Unallow some uniques to be generated outside of their quests/special levels/dungeons */ - if ((r_ptr->flags9 & RF9_SPECIAL_GENE) && (!m_allow_special[r_idx])) + if ((r_ptr->flags & RF_SPECIAL_GENE) && (!m_allow_special[r_idx])) { if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster(%d): SPECIAL_GENE", r_idx); return 0; } /* Disallow Spirits in The Void, now this *IS* an ugly hack, I hate to do it ... */ - if ((r_ptr->flags7 & RF7_SPIRIT) && (dungeon_type != DUNGEON_VOID)) + if ((r_ptr->flags & RF_SPIRIT) && (dungeon_type != DUNGEON_VOID)) { if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster(%d): SPIRIT in non VOID", r_idx); return 0; } /* Fully forbid it */ - if (r_ptr->flags9 & RF9_NEVER_GENE) + if (r_ptr->flags & RF_NEVER_GENE) { if (wizard) cmsg_print(TERM_L_RED, "WARNING: Refused monster: NEVER_GENE"); return 0; } /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx])) + if ((r_ptr->flags & RF_UNIQUE) && (r_ptr->max_num == -1) && (!m_allow_special[r_idx])) { /* Cannot create */ if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: unique not unique", r_idx); @@ -2147,7 +2097,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Hack -- "unique" monsters must be "unique" */ - if ((r_ptr->flags1 & RF1_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num)) + if ((r_ptr->flags & RF_UNIQUE) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num)) { /* Cannot create */ if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: cur_num >= max_num", r_idx); @@ -2155,7 +2105,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Depth monsters may NOT be created out of depth */ - if ((r_ptr->flags1 & RF1_FORCE_DEPTH) && (dun_level < r_ptr->level)) + if ((r_ptr->flags & RF_FORCE_DEPTH) && (dun_level < r_ptr->level)) { /* Cannot create */ if (wizard) cmsg_print(TERM_L_RED, "WARNING: FORCE_DEPTH"); @@ -2166,7 +2116,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) if (r_ptr->level > dun_level) { /* Unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { /* Message for cheaters */ if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Unique (%s).", r_ptr->name); @@ -2187,7 +2137,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Note the monster */ - else if (r_ptr->flags1 & RF1_UNIQUE) + else if (r_ptr->flags & RF_UNIQUE) { /* Unique monsters induce message */ if ((cheat_hear) || (p_ptr->precognition)) msg_format("Unique (%s).", r_ptr->name); @@ -2242,11 +2192,11 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) m_ptr->status = status; /* Friendly? */ - if (m_ptr->status < MSTATUS_FRIEND && r_ptr->flags7 & RF7_PET) + if (m_ptr->status < MSTATUS_FRIEND && r_ptr->flags & RF_PET) { m_ptr->status = MSTATUS_FRIEND; } - if (m_ptr->status < MSTATUS_NEUTRAL && r_ptr->flags7 & RF7_NEUTRAL) + if (m_ptr->status < MSTATUS_NEUTRAL && r_ptr->flags & RF_NEUTRAL) { m_ptr->status = MSTATUS_NEUTRAL; } @@ -2265,12 +2215,12 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Only if not fated to die */ if ((dungeon_type != DUNGEON_DEATH) && (!place_monster_one_no_drop)) { - const bool_ good = (r_ptr->flags1 & RF1_DROP_GOOD) ? TRUE : FALSE; - const bool_ great = (r_ptr->flags1 & RF1_DROP_GREAT) ? TRUE : FALSE; + const bool_ good = (r_ptr->flags & RF_DROP_GOOD) ? TRUE : FALSE; + const bool_ great = (r_ptr->flags & RF_DROP_GREAT) ? TRUE : FALSE; - const bool_ do_gold = (!(r_ptr->flags1 & RF1_ONLY_ITEM)); - const bool_ do_item = (!(r_ptr->flags1 & RF1_ONLY_GOLD)); - const bool_ do_mimic = (r_ptr->flags9 & RF9_MIMIC); + const bool_ do_gold = (!(r_ptr->flags & RF_ONLY_ITEM)); + const bool_ do_item = (!(r_ptr->flags & RF_ONLY_GOLD)); + const bool_ do_mimic = (r_ptr->flags & RF_MIMIC); const int force_coin = get_coin_type(r_ptr); @@ -2285,18 +2235,18 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) object_level = (dun_level + r_ptr->level) / 2; /* Determine how much we can drop */ - if ((r_ptr->flags1 & (RF1_DROP_60)) && (rand_int(100) < 60)) number++; - if ((r_ptr->flags1 & (RF1_DROP_90)) && (rand_int(100) < 90)) number++; - if (r_ptr->flags1 & (RF1_DROP_1D2)) number += damroll(1, 2); - if (r_ptr->flags1 & (RF1_DROP_2D2)) number += damroll(2, 2); - if (r_ptr->flags1 & (RF1_DROP_3D2)) number += damroll(3, 2); - if (r_ptr->flags1 & (RF1_DROP_4D2)) number += damroll(4, 2); - if (r_ptr->flags9 & RF9_MIMIC) number = 1; + if ((r_ptr->flags & RF_DROP_60) && (rand_int(100) < 60)) number++; + if ((r_ptr->flags & RF_DROP_90) && (rand_int(100) < 90)) number++; + if (r_ptr->flags & RF_DROP_1D2) number += damroll(1, 2); + if (r_ptr->flags & RF_DROP_2D2) number += damroll(2, 2); + if (r_ptr->flags & RF_DROP_3D2) number += damroll(3, 2); + if (r_ptr->flags & RF_DROP_4D2) number += damroll(4, 2); + if (r_ptr->flags & RF_MIMIC) number = 1; /* Hack -- handle creeping coins */ coin_type = force_coin; - if (r_ptr->flags7 & RF7_DROP_RANDART) + if (r_ptr->flags & RF_DROP_RANDART) { int tries = 1000; /* Get local object */ @@ -2401,7 +2351,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Assign maximal hitpoints */ - if (r_ptr->flags1 & RF1_FORCE_MAXHP) + if (r_ptr->flags & RF_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -2430,7 +2380,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) m_ptr->mspeed = m_ptr->speed; /* Hack -- small racial variety */ - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) { /* Allow some small variation per monster */ i = extract_energy[m_ptr->speed] / 10; @@ -2461,7 +2411,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) m_ptr->energy = (byte)rand_int(100); /* Force monster to wait for player */ - if (r_ptr->flags1 & RF1_FORCE_SLEEP) + if (r_ptr->flags & RF_FORCE_SLEEP) { /* Monster is still being nice */ m_ptr->mflag |= (MFLAG_NICE); @@ -2487,7 +2437,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; + if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE; /* Count monsters on the level */ { @@ -2499,7 +2449,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Unique monsters on saved levels should be "marked" */ - if ((r_ptr->flags1 & RF1_UNIQUE) && get_dungeon_save(dummy)) + if ((r_ptr->flags & RF_UNIQUE) && get_dungeon_save(dummy)) { r_ptr->on_saved = TRUE; } @@ -2635,7 +2585,7 @@ static bool_ place_monster_okay(int r_idx) if (z_ptr->level > r_ptr->level) return (FALSE); /* Skip unique monsters */ - if (z_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (z_ptr->flags & RF_UNIQUE) return (FALSE); /* Paranoia -- Skip identical monsters */ if (place_monster_idx == r_idx) return (FALSE); @@ -2679,7 +2629,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu /* Friends for certain monsters */ - if (r_ptr->flags1 & RF1_FRIENDS) + if (r_ptr->flags & RF_FRIENDS) { /* Attempt to place a group */ (void)place_monster_group(y, x, r_idx, slp, status); @@ -2687,7 +2637,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu /* Escorts for certain monsters */ - if (r_ptr->flags1 & RF1_ESCORT) + if (r_ptr->flags & RF_ESCORT) { old_get_mon_num_hook = get_mon_num_hook; @@ -2732,8 +2682,8 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu place_monster_one(ny, nx, z, pick_ego_monster(&r_info[z]), slp, status); /* Place a "group" of escorts if needed */ - if ((r_info[z].flags1 & RF1_FRIENDS) || - (r_ptr->flags1 & RF1_ESCORTS)) + if ((r_info[z].flags & RF_FRIENDS) || + (r_ptr->flags & RF_ESCORTS)) { /* Place a group of monsters */ (void)place_monster_group(ny, nx, z, slp, status); @@ -2809,8 +2759,8 @@ bool_ alloc_horde(int y, int x) r_ptr = &r_info[r_idx]; - if (!(r_ptr->flags1 & RF1_UNIQUE) - && !(r_ptr->flags1 & RF1_ESCORTS)) + if (!(r_ptr->flags & RF_UNIQUE) + && !(r_ptr->flags & RF_ESCORTS)) break; } @@ -2933,56 +2883,56 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_ANT: { okay = ((r_ptr->d_char == 'a') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_SPIDER: { okay = ((r_ptr->d_char == 'S') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_HOUND: { okay = (((r_ptr->d_char == 'C') || (r_ptr->d_char == 'Z')) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_HYDRA: { okay = ((r_ptr->d_char == 'M') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_ANGEL: { okay = ((r_ptr->d_char == 'A') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_DEMON: { - okay = ((r_ptr->flags3 & RF3_DEMON) && - !(r_ptr->flags1 & RF1_UNIQUE)); + okay = ((r_ptr->flags & RF_DEMON) && + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_UNDEAD: { - okay = ((r_ptr->flags3 & RF3_UNDEAD) && - !(r_ptr->flags1 & RF1_UNIQUE)); + okay = ((r_ptr->flags & RF_UNDEAD) && + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_DRAGON: { - okay = ((r_ptr->flags3 & RF3_DRAGON) && - !(r_ptr->flags1 & RF1_UNIQUE)); + okay = ((r_ptr->flags & RF_DRAGON) && + !(r_ptr->flags & RF_UNIQUE)); break; } @@ -3014,40 +2964,40 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_UNIQUE: { - okay = (r_ptr->flags1 & RF1_UNIQUE) ? TRUE : FALSE; + okay = (r_ptr->flags & RF_UNIQUE) ? TRUE : FALSE; break; } case SUMMON_BIZARRE1: { okay = ((r_ptr->d_char == 'm') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_BIZARRE2: { okay = ((r_ptr->d_char == 'b') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_BIZARRE3: { okay = ((r_ptr->d_char == 'Q') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_BIZARRE4: { okay = ((r_ptr->d_char == 'v') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_BIZARRE5: { okay = ((r_ptr->d_char == '$') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } @@ -3058,15 +3008,15 @@ static bool_ summon_specific_okay(int r_idx) (r_ptr->d_char == '=') || (r_ptr->d_char == '$') || (r_ptr->d_char == '|')) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_HI_DEMON: { - okay = ((r_ptr->flags3 & RF3_DEMON) && + okay = ((r_ptr->flags & RF_DEMON) && (r_ptr->d_char == 'U') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } @@ -3074,34 +3024,34 @@ static bool_ summon_specific_okay(int r_idx) case SUMMON_KIN: { okay = ((r_ptr->d_char == summon_kin_type) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_DAWN: { okay = ((strstr(r_ptr->name, "the Dawn")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_ANIMAL: { - okay = ((r_ptr->flags3 & RF3_ANIMAL) && - !(r_ptr->flags1 & RF1_UNIQUE)); + okay = ((r_ptr->flags & RF_ANIMAL) && + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_ANIMAL_RANGER: { - okay = ((r_ptr->flags3 & RF3_ANIMAL) && + okay = ((r_ptr->flags & RF_ANIMAL) && (strchr("abcflqrwBCIJKMRS", r_ptr->d_char)) && - !(r_ptr->flags3 & RF3_DRAGON) && - !(r_ptr->flags3 & RF3_EVIL) && - !(r_ptr->flags3 & RF3_UNDEAD) && - !(r_ptr->flags3 & RF3_DEMON) && + !(r_ptr->flags & RF_DRAGON) && + !(r_ptr->flags & RF_EVIL) && + !(r_ptr->flags & RF_UNDEAD) && + !(r_ptr->flags & RF_DEMON) && !r_ptr->spells && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } @@ -3110,87 +3060,87 @@ static bool_ summon_specific_okay(int r_idx) okay = (((r_ptr->d_char == 'L') || (r_ptr->d_char == 'V') || (r_ptr->d_char == 'W')) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_HI_DRAGON_NO_UNIQUES: { okay = ((r_ptr->d_char == 'D') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_NO_UNIQUES: { - okay = (!(r_ptr->flags1 & RF1_UNIQUE)); + okay = (!(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_PHANTOM: { okay = ((strstr(r_ptr->name, "Phantom")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_ELEMENTAL: { okay = ((strstr(r_ptr->name, "lemental")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_THUNDERLORD: { - okay = (r_ptr->flags3 & RF3_THUNDERLORD) ? TRUE : FALSE; + okay = (r_ptr->flags & RF_THUNDERLORD) ? TRUE : FALSE; break; } case SUMMON_BLUE_HORROR: { okay = ((strstr(r_ptr->name, "lue horror")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_BUG: { okay = ((strstr(r_ptr->name, "Software bug")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_RNG: { okay = ((strstr(r_ptr->name, "Random Number Generator")) && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_MINE: { - okay = (r_ptr->flags1 & RF1_NEVER_MOVE) ? TRUE : FALSE; + okay = (r_ptr->flags & RF_NEVER_MOVE) ? TRUE : FALSE; break; } case SUMMON_HUMAN: { okay = ((r_ptr->d_char == 'p') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_SHADOWS: { okay = ((r_ptr->d_char == 'G') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } case SUMMON_QUYLTHULG: { okay = ((r_ptr->d_char == 'Q') && - !(r_ptr->flags1 & RF1_UNIQUE)); + !(r_ptr->flags & RF_UNIQUE)); break; } @@ -3499,7 +3449,7 @@ static bool_ mutate_monster_okay(int r_idx) /* Hack - Only summon dungeon monsters */ if (!monster_dungeon(r_idx)) return (FALSE); - okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags1 & RF1_UNIQUE) + okay = ((r_ptr->d_char == summon_kin_type) && !(r_ptr->flags & RF_UNIQUE) && (r_ptr->level >= dun_level)); return okay; @@ -3721,10 +3671,10 @@ void update_smart_learn(int m_idx, int what) auto const r_ptr = m_ptr->race(); /* Too stupid to learn anything */ - if (r_ptr->flags2 & RF2_STUPID) return; + if (r_ptr->flags & RF_STUPID) return; /* Not intelligent, only learn sometimes */ - if (!(r_ptr->flags2 & RF2_SMART) && magik(50)) return; + if (!(r_ptr->flags & RF_SMART) && magik(50)) return; /* XXX XXX XXX */ diff --git a/src/monster3.cc b/src/monster3.cc index ab002899..f8bb0837 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -15,6 +15,7 @@ #include "melee2.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" @@ -82,7 +83,7 @@ bool_ change_side(monster_type *m_ptr) { case MSTATUS_FRIEND: m_ptr->status = MSTATUS_ENEMY; - if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL))) + if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL))) inc_piety(GOD_YAVANNA, -m_ptr->level * 4); break; case MSTATUS_NEUTRAL_P: @@ -93,7 +94,7 @@ bool_ change_side(monster_type *m_ptr) break; case MSTATUS_PET: m_ptr->status = MSTATUS_ENEMY; - if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL))) + if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL))) inc_piety(GOD_YAVANNA, -m_ptr->level * 4); break; case MSTATUS_COMPANION: @@ -175,7 +176,7 @@ bool_ ai_possessor(int m_idx, int o_idx) m_ptr->csleep = 0; /* Assign maximal hitpoints */ - if (r_ptr->flags1 & RF1_FORCE_MAXHP) + if (r_ptr->flags & RF_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -209,7 +210,7 @@ bool_ ai_possessor(int m_idx, int o_idx) if (r_ptr->spells & SF_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; + if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE; /* Hack -- Count the monsters on the level */ r_ptr->cur_num++; @@ -250,7 +251,7 @@ void ai_deincarnate(int m_idx) m_ptr->csleep = 0; /* Assign maximal hitpoints */ - if (r_ptr->flags1 & RF1_FORCE_MAXHP) + if (r_ptr->flags & RF_FORCE_MAXHP) { m_ptr->maxhp = maxroll(r_ptr->hdice, r_ptr->hside); } @@ -284,7 +285,7 @@ void ai_deincarnate(int m_idx) if (r_ptr->spells & SF_MULTIPLY) num_repro++; /* Hack -- Notice new multi-hued monsters */ - if (r_ptr->flags1 & RF1_ATTR_MULTI) shimmer_monsters = TRUE; + if (r_ptr->flags & RF_ATTR_MULTI) shimmer_monsters = TRUE; /* Hack -- Count the monsters on the level */ r_ptr->cur_num++; diff --git a/src/monster_ego.hpp b/src/monster_ego.hpp index 010ff98f..b578d03e 100644 --- a/src/monster_ego.hpp +++ b/src/monster_ego.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "monster_blow.hpp" +#include "monster_race_flag_set.hpp" #include "monster_spell_flag_set.hpp" #include @@ -39,37 +40,17 @@ struct monster_ego byte freq_spell = 0; /* Other spell frequency */ /* Ego flags */ - u32b flags1 = 0; - u32b flags2 = 0; - u32b flags3 = 0; - u32b flags7 = 0; - u32b flags8 = 0; - u32b flags9 = 0; - u32b hflags1 = 0; - u32b hflags2 = 0; - u32b hflags3 = 0; - u32b hflags7 = 0; - u32b hflags8 = 0; - u32b hflags9 = 0; + monster_race_flag_set flags; + monster_race_flag_set hflags; /* Monster flags */ - u32b mflags1 = 0; - u32b mflags2 = 0; - u32b mflags3 = 0; - u32b mflags7 = 0; - u32b mflags8 = 0; - u32b mflags9 = 0; + monster_race_flag_set mflags; /* Monster spells */ monster_spell_flag_set mspells; - /* Negative Flags, to be removed from the monster flags */ - u32b nflags1 = 0; - u32b nflags2 = 0; - u32b nflags3 = 0; - u32b nflags7 = 0; - u32b nflags8 = 0; - u32b nflags9 = 0; + /* Negative flags, to be removed from the monster flags */ + monster_race_flag_set nflags; /* Negative spells; to be removed from the monster spells */ monster_spell_flag_set nspells; diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 3a13e4b4..58c49e1f 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -3,6 +3,7 @@ #include "body.hpp" #include "h-basic.h" #include "monster_blow.hpp" +#include "monster_race_flag_set.hpp" #include "monster_spell_flag_set.hpp" #include "obj_theme.hpp" @@ -48,12 +49,7 @@ struct monster_race byte freq_inate = 0; /* Inate spell frequency */ byte freq_spell = 0; /* Other spell frequency */ - u32b flags1 = 0; /* Flags 1 (general) */ - u32b flags2 = 0; /* Flags 2 (abilities) */ - u32b flags3 = 0; /* Flags 3 (race/resist) */ - u32b flags7 = 0; /* Flags 7 (movement related abilities) */ - u32b flags8 = 0; /* Flags 8 (wilderness info) */ - u32b flags9 = 0; /* Flags 9 (drops info) */ + monster_race_flag_set flags; /* Flags */ monster_spell_flag_set spells; /* Spells */ diff --git a/src/monster_race_flag.hpp b/src/monster_race_flag.hpp new file mode 100644 index 00000000..098e8176 --- /dev/null +++ b/src/monster_race_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "monster_race_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define RF(tier, index, name) \ + DECLARE_FLAG(monster_race_flag_set, BOOST_PP_CAT(RF_,name), tier, index) +#include "monster_race_flag_list.hpp" +#undef RF diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp new file mode 100644 index 00000000..10a36a3f --- /dev/null +++ b/src/monster_race_flag_list.hpp @@ -0,0 +1,159 @@ +/** + * X-macro list of all the monster race flags + */ + +/* RF(, , ) */ + +RF(1, 0, UNIQUE) +RF(1, 1, QUESTOR) +RF(1, 2, MALE) +RF(1, 3, FEMALE) +RF(1, 4, CHAR_CLEAR) +RF(1, 5, CHAR_MULTI) +RF(1, 6, ATTR_CLEAR) +RF(1, 7, ATTR_MULTI) +RF(1, 8, FORCE_DEPTH) +RF(1, 9, FORCE_MAXHP) +RF(1, 10, FORCE_SLEEP) +RF(1, 11, FORCE_EXTRA) +RF(1, 12, FRIEND) +RF(1, 13, FRIENDS) +RF(1, 14, ESCORT) +RF(1, 15, ESCORTS) +RF(1, 16, NEVER_BLOW) +RF(1, 17, NEVER_MOVE) +RF(1, 18, RAND_25) +RF(1, 19, RAND_50) +RF(1, 20, ONLY_GOLD) +RF(1, 21, ONLY_ITEM) +RF(1, 22, DROP_60) +RF(1, 23, DROP_90) +RF(1, 24, DROP_1D2) +RF(1, 25, DROP_2D2) +RF(1, 26, DROP_3D2) +RF(1, 27, DROP_4D2) +RF(1, 28, DROP_GOOD) +RF(1, 29, DROP_GREAT) +RF(1, 30, DROP_USEFUL) +RF(1, 31, DROP_CHOSEN) + +RF(2, 0, STUPID) +RF(2, 1, SMART) +RF(2, 2, CAN_SPEAK) +RF(2, 3, REFLECTING) +RF(2, 4, INVISIBLE) +RF(2, 5, COLD_BLOOD) +RF(2, 6, EMPTY_MIND) +RF(2, 7, WEIRD_MIND) +RF(2, 8, DEATH_ORB) +RF(2, 9, REGENERATE) +RF(2, 10, SHAPECHANGER) +RF(2, 11, ATTR_ANY) +RF(2, 12, POWERFUL) +RF(2, 13, ELDRITCH_HORROR) +RF(2, 14, AURA_FIRE) +RF(2, 15, AURA_ELEC) +RF(2, 16, OPEN_DOOR) +RF(2, 17, BASH_DOOR) +RF(2, 18, PASS_WALL) +RF(2, 19, KILL_WALL) +RF(2, 20, MOVE_BODY) +RF(2, 21, KILL_BODY) +RF(2, 22, TAKE_ITEM) +RF(2, 23, KILL_ITEM) +RF(2, 24, BRAIN_1) +RF(2, 25, BRAIN_2) +RF(2, 26, BRAIN_3) +RF(2, 27, BRAIN_4) +RF(2, 28, BRAIN_5) +RF(2, 29, BRAIN_6) +RF(2, 30, BRAIN_7) +RF(2, 31, BRAIN_8) + +RF(3, 0, ORC) +RF(3, 1, TROLL) +RF(3, 2, GIANT) +RF(3, 3, DRAGON) +RF(3, 4, DEMON) +RF(3, 5, UNDEAD) +RF(3, 6, EVIL) +RF(3, 7, ANIMAL) +RF(3, 8, THUNDERLORD) +RF(3, 9, GOOD) +RF(3, 10, AURA_COLD) +RF(3, 11, NONLIVING) +RF(3, 12, HURT_LITE) +RF(3, 13, HURT_ROCK) +RF(3, 14, SUSCEP_FIRE) +RF(3, 15, SUSCEP_COLD) +RF(3, 16, IM_ACID) +RF(3, 17, IM_ELEC) +RF(3, 18, IM_FIRE) +RF(3, 19, IM_COLD) +RF(3, 20, IM_POIS) +RF(3, 21, RES_TELE) +RF(3, 22, RES_NETH) +RF(3, 23, RES_WATE) +RF(3, 24, RES_PLAS) +RF(3, 25, RES_NEXU) +RF(3, 26, RES_DISE) +RF(3, 27, UNIQUE_4) +RF(3, 28, NO_FEAR) +RF(3, 29, NO_STUN) +RF(3, 30, NO_CONF) +RF(3, 31, NO_SLEEP) + +RF(4, 0, AQUATIC) +RF(4, 1, CAN_SWIM) +RF(4, 2, CAN_FLY) +RF(4, 3, FRIENDLY) +RF(4, 4, PET) +RF(4, 5, MORTAL) +RF(4, 6, SPIDER) +RF(4, 7, NAZGUL) +RF(4, 8, DG_CURSE) +RF(4, 9, POSSESSOR) +RF(4, 10, NO_DEATH) +RF(4, 11, NO_TARGET) +RF(4, 12, AI_ANNOY) +RF(4, 13, AI_SPECIAL) +RF(4, 14, NEUTRAL) +RF(4, 15, DROP_ART) +RF(4, 16, DROP_RANDART) +RF(4, 17, AI_PLAYER) +RF(4, 18, NO_THEFT) +RF(4, 19, SPIRIT) + +RF(5, 0, WILD_ONLY) +RF(5, 1, WILD_TOWN) +RF(5, 2, XXX8X02) +RF(5, 3, WILD_SHORE) +RF(5, 4, WILD_OCEAN) +RF(5, 5, WILD_WASTE) +RF(5, 6, WILD_WOOD) +RF(5, 7, WILD_VOLCANO) +RF(5, 8, XXX8X08) +RF(5, 9, WILD_MOUNTAIN) +RF(5, 10, WILD_GRASS) +RF(5, 11, NO_CUT) +RF(5, 12, CTHANGBAND) +RF(5, 14, ZANGBAND) +RF(5, 15, JOKEANGBAND) +RF(5, 16, BASEANGBAND) +RF(5, 31, WILD_TOO) + +RF(6, 0, DROP_CORPSE) +RF(6, 1, DROP_SKELETON) +RF(6, 2, HAS_LITE) +RF(6, 3, MIMIC) +RF(6, 4, HAS_EGG) +RF(6, 5, IMPRESED) +RF(6, 6, SUSCEP_ACID) +RF(6, 7, SUSCEP_ELEC) +RF(6, 8, SUSCEP_POIS) +RF(6, 9, KILL_TREES) +RF(6, 10, WYRM_PROTECT) +RF(6, 11, DOPPLEGANGER) +RF(6, 12, ONLY_DEPTH) +RF(6, 13, SPECIAL_GENE) +RF(6, 14, NEVER_GENE) diff --git a/src/monster_race_flag_set.hpp b/src/monster_race_flag_set.hpp new file mode 100644 index 00000000..958201b1 --- /dev/null +++ b/src/monster_race_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t RF_MAX_TIERS = 6; + +typedef flag_set monster_race_flag_set; diff --git a/src/object1.cc b/src/object1.cc index 7a462b41..1aaf2a6c 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -26,6 +26,7 @@ #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" #include "object_kind.hpp" @@ -1374,7 +1375,7 @@ std::string object_desc_aux(object_type *o_ptr, int pref, int mode) { monster_race* r_ptr = &r_info[o_ptr->pval2]; modstr = basenm; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { basenm = fmt::format("& {}'s #~", r_ptr->name); } @@ -1531,11 +1532,11 @@ std::string object_desc_aux(object_type *o_ptr, int pref, int mode) t += ' '; } - else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags1 & RF1_UNIQUE)) + else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_UNIQUE)) {} - else if ((o_ptr->tval == TV_HYPNOS) && (r_ptr->flags1 & RF1_UNIQUE)) + else if ((o_ptr->tval == TV_HYPNOS) && (r_ptr->flags & RF_UNIQUE)) {} /* Hack -- The only one of its kind */ diff --git a/src/object2.cc b/src/object2.cc index ebf185b2..7a4b6211 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -21,6 +21,7 @@ #include "mimic.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object_kind.hpp" @@ -3261,7 +3262,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) int r_idx = get_mon_num(dun_level); r_ptr = &r_info[r_idx]; - if (!(r_ptr->flags1 & RF1_UNIQUE)) + if (!(r_ptr->flags & RF_UNIQUE)) o_ptr->pval2 = r_idx; else o_ptr->pval2 = 2; @@ -3281,7 +3282,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) r_idx = get_mon_num(dun_level); r_ptr = &r_info[r_idx]; - if (r_ptr->flags9 & RF9_HAS_EGG) + if (r_ptr->flags & RF_HAS_EGG) { o_ptr->pval2 = r_idx; OK = TRUE; @@ -3303,7 +3304,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) int r_idx = get_mon_num(dun_level); r_ptr = &r_info[r_idx]; - if (!(r_ptr->flags1 & RF1_NEVER_MOVE)) + if (!(r_ptr->flags & RF_NEVER_MOVE)) o_ptr->pval = r_idx; else o_ptr->pval = 20; @@ -6337,7 +6338,7 @@ void pack_decay(int item) } /* Monster must have a skeleton for its corpse to become one */ - if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags3 & RF9_DROP_SKELETON)) + if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON)) { /* Replace the corpse with a skeleton */ object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON)); @@ -6432,7 +6433,7 @@ void floor_decay(int item) } /* Monster must have a skeleton for its corpse to become one */ - if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags3 & RF9_DROP_SKELETON)) + if ((i_ptr->sval == SV_CORPSE_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON)) { /* Replace the corpse with a skeleton */ object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON)); diff --git a/src/powers.cc b/src/powers.cc index 632fb338..45ca3e0c 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -21,6 +21,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -561,7 +562,7 @@ static void power_activate(int power) m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if ((r_ptr->flags1 & RF1_NEVER_MOVE) && (m_ptr->status == MSTATUS_PET) && (!(r_ptr->flags9 & RF9_SPECIAL_GENE))) + if ((r_ptr->flags & RF_NEVER_MOVE) && (m_ptr->status == MSTATUS_PET) && (!(r_ptr->flags & RF_SPECIAL_GENE))) { q_ptr = &forge; object_prep(q_ptr, lookup_kind(TV_HYPNOS, 1)); @@ -1001,7 +1002,7 @@ static void power_activate(int power) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { /* Delete the monster, rather than killing it. */ delete_monster_idx(c_ptr->m_idx); diff --git a/src/q_bounty.cc b/src/q_bounty.cc index dac4fef7..26d3f6cd 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -2,6 +2,7 @@ #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" @@ -23,29 +24,29 @@ static bool_ lua_mon_hook_bounty(int r_idx) monster_race* r_ptr = &r_info[r_idx]; /* Reject uniques */ - if (r_ptr->flags1 & RF1_UNIQUE) return (FALSE); + if (r_ptr->flags & RF_UNIQUE) return (FALSE); /* Reject those who cannot leave anything */ - if (!(r_ptr->flags9 & RF9_DROP_CORPSE)) return (FALSE); + if (!(r_ptr->flags & RF_DROP_CORPSE)) return (FALSE); /* Accept only monsters that can be generated */ - if (r_ptr->flags9 & RF9_SPECIAL_GENE) return (FALSE); - if (r_ptr->flags9 & RF9_NEVER_GENE) return (FALSE); + if (r_ptr->flags & RF_SPECIAL_GENE) return (FALSE); + if (r_ptr->flags & RF_NEVER_GENE) return (FALSE); /* Reject pets */ - if (r_ptr->flags7 & RF7_PET) return (FALSE); + if (r_ptr->flags & RF_PET) return (FALSE); /* Reject friendly creatures */ - if (r_ptr->flags7 & RF7_FRIENDLY) return (FALSE); + if (r_ptr->flags & RF_FRIENDLY) return (FALSE); /* Accept only monsters that are not breeders */ if (r_ptr->spells & SF_MULTIPLY) return (FALSE); /* Forbid joke monsters */ - if (r_ptr->flags8 & RF8_JOKEANGBAND) return (FALSE); + if (r_ptr->flags & RF_JOKEANGBAND) return (FALSE); /* Accept only monsters that are not good */ - if (r_ptr->flags3 & RF3_GOOD) return (FALSE); + if (r_ptr->flags & RF_GOOD) return (FALSE); /* The rest are acceptable */ return (TRUE); diff --git a/src/q_god.cc b/src/q_god.cc index d9bf955c..4634b46b 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -9,6 +9,7 @@ #include "hook_enter_dungeon_in.hpp" #include "hook_player_level_in.hpp" #include "hooks.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "object2.hpp" #include "player_type.hpp" @@ -469,13 +470,13 @@ static void quest_god_set_god_dungeon_attributes_eru() d_info[DUNGEON_GOD].rules[0].percent = 50; /* M: We want evil or flying characters */ - d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_EVIL; + d_info[DUNGEON_GOD].rules[0].mflags = RF_EVIL; d_info[DUNGEON_GOD].rules[1].mode = 3; d_info[DUNGEON_GOD].rules[1].percent = 50; /* M: We want evil or flying characters */ - d_info[DUNGEON_GOD].rules[1].mflags7 = RF7_CAN_FLY; + d_info[DUNGEON_GOD].rules[1].mflags = RF_CAN_FLY; } static void quest_god_set_god_dungeon_attributes_manwe() @@ -533,11 +534,11 @@ static void quest_god_set_god_dungeon_attributes_manwe() /* M: We want air(poison-type) or flying characters. Orcs * too. They would have ransacked his elf-loving temple :) */ - d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE; - d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS; + d_info[DUNGEON_GOD].rules[0].mflags = RF_INVISIBLE; + d_info[DUNGEON_GOD].rules[1].mflags = RF_ORC | RF_IM_POIS; d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV; d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS; - d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY; + d_info[DUNGEON_GOD].rules[4].mflags = RF_CAN_FLY; } static void quest_god_set_god_dungeon_attributes_tulkas() @@ -582,7 +583,7 @@ static void quest_god_set_god_dungeon_attributes_tulkas() d_info[DUNGEON_GOD].rules[0].percent = 100; /* M: plenty demons please */ - d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_DEMON | RF3_EVIL; + d_info[DUNGEON_GOD].rules[0].mflags = RF_DEMON | RF_EVIL; } static void quest_god_set_god_dungeon_attributes_melkor() @@ -635,7 +636,7 @@ static void quest_god_set_god_dungeon_attributes_melkor() d_info[DUNGEON_GOD].rules[1].percent = 20; /* M: */ - d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_GOOD; + d_info[DUNGEON_GOD].rules[1].mflags = RF_GOOD; } static void quest_god_set_god_dungeon_attributes_yavanna() @@ -685,8 +686,8 @@ static void quest_god_set_god_dungeon_attributes_yavanna() d_info[DUNGEON_GOD].rules[0].percent = 100; /* M: */ - d_info[DUNGEON_GOD].rules[0].mflags3 = - RF3_DEMON | RF3_UNDEAD | RF3_NONLIVING; + d_info[DUNGEON_GOD].rules[0].mflags = + RF_DEMON | RF_UNDEAD | RF_NONLIVING; } static void quest_god_set_god_dungeon_attributes_aule() @@ -783,11 +784,11 @@ static void quest_god_set_god_dungeon_attributes_varda() d_info[DUNGEON_GOD].rules[4].percent = 20; /* M: We want air(poison-type) or flying characters. Orcs too. */ - d_info[DUNGEON_GOD].rules[0].mflags2 = RF2_INVISIBLE; - d_info[DUNGEON_GOD].rules[1].mflags3 = RF3_ORC | RF3_IM_POIS; + d_info[DUNGEON_GOD].rules[0].mflags = RF_INVISIBLE; + d_info[DUNGEON_GOD].rules[1].mflags = RF_ORC | RF_IM_POIS; d_info[DUNGEON_GOD].rules[2].mspells = SF_BR_POIS | SF_BR_GRAV; d_info[DUNGEON_GOD].rules[3].mspells = SF_BA_POIS; - d_info[DUNGEON_GOD].rules[4].mflags7 = RF7_CAN_FLY; + d_info[DUNGEON_GOD].rules[4].mflags = RF_CAN_FLY; } static void quest_god_set_god_dungeon_attributes_ulmo() @@ -830,9 +831,9 @@ static void quest_god_set_god_dungeon_attributes_ulmo() d_info[DUNGEON_GOD].rules[2].percent = 30; /* M: Aquatic creatures only. */ - d_info[DUNGEON_GOD].rules[0].mflags3 = RF7_CAN_FLY; - d_info[DUNGEON_GOD].rules[1].mflags3 = RF7_AQUATIC; - d_info[DUNGEON_GOD].rules[2].mflags3 = RF3_RES_WATE; + d_info[DUNGEON_GOD].rules[0].mflags = RF_CAN_FLY; + d_info[DUNGEON_GOD].rules[1].mflags = RF_AQUATIC; + d_info[DUNGEON_GOD].rules[2].mflags = RF_RES_WATE; } static void quest_god_set_god_dungeon_attributes_mandos() @@ -876,7 +877,7 @@ static void quest_god_set_god_dungeon_attributes_mandos() d_info[DUNGEON_GOD].rules[0].r_char[2] = '\0'; d_info[DUNGEON_GOD].rules[0].r_char[3] = '\0'; d_info[DUNGEON_GOD].rules[0].r_char[4] = '\0'; - d_info[DUNGEON_GOD].rules[0].mflags3 = RF3_UNDEAD | RF3_EVIL; + d_info[DUNGEON_GOD].rules[0].mflags = RF_UNDEAD | RF_EVIL; } static bool_ quest_god_level_end_gen_hook(void *, void *, void *) diff --git a/src/q_main.cc b/src/q_main.cc index b81ba9b3..4cbf63ef 100644 --- a/src/q_main.cc +++ b/src/q_main.cc @@ -5,6 +5,7 @@ #include "hook_new_monster_in.hpp" #include "hooks.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "player_type.hpp" #include "tables.hpp" @@ -153,9 +154,9 @@ static bool_ quest_sauron_resurect_hook(void *, void *in_, void *) monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - if ((r_ptr->flags7 & RF7_NAZGUL) && r_info[get_sauron()].max_num) + if ((r_ptr->flags & RF_NAZGUL) && r_info[get_sauron()].max_num) { - msg_format("Somehow you feel %s is not totally destroyed...", (r_ptr->flags1 & RF1_FEMALE ? "she" : "he")); + msg_format("Somehow you feel %s is not totally destroyed...", (r_ptr->flags & RF_FEMALE ? "she" : "he")); r_ptr->max_num = 1; } else if ((m_ptr->r_idx == get_sauron()) && (quest[QUEST_ONE].status < QUEST_STATUS_FINISHED)) diff --git a/src/q_poison.cc b/src/q_poison.cc index 464c93ef..b1205dca 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -10,6 +10,7 @@ #include "messages.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" diff --git a/src/q_rand.cc b/src/q_rand.cc index 26903848..f22675b7 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -16,6 +16,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -112,23 +113,23 @@ void initialize_random_quests(int n) r_ptr = &r_info[q_ptr->r_idx]; /* Accept only monsters that can be generated */ - if (r_ptr->flags9 & RF9_SPECIAL_GENE) continue; - if (r_ptr->flags9 & RF9_NEVER_GENE) continue; + if (r_ptr->flags & RF_SPECIAL_GENE) continue; + if (r_ptr->flags & RF_NEVER_GENE) continue; /* Accept only monsters that are not breeders */ if (r_ptr->spells & SF_MULTIPLY) continue; /* Forbid joke monsters */ - if (r_ptr->flags8 & RF8_JOKEANGBAND) continue; + if (r_ptr->flags & RF_JOKEANGBAND) continue; /* Accept only monsters that are not friends */ - if (r_ptr->flags7 & RF7_PET) continue; + if (r_ptr->flags & RF_PET) continue; /* Refuse nazguls */ - if (r_ptr->flags7 & RF7_NAZGUL) continue; + if (r_ptr->flags & RF_NAZGUL) continue; /* Accept only monsters that are not good */ - if (r_ptr->flags3 & RF3_GOOD) continue; + if (r_ptr->flags & RF_GOOD) continue; /* If module says a monster race is friendly, then skip */ if (modules[game_module_idx].race_status != NULL) @@ -151,11 +152,11 @@ void initialize_random_quests(int n) if (!ok) continue; /* No mutliple uniques */ - if ((r_ptr->flags1 & RF1_UNIQUE) && + if ((r_ptr->flags & RF_UNIQUE) && ((q_ptr->type != 1) || (r_ptr->max_num == -1))) continue; /* No single non uniques */ - if ((!(r_ptr->flags1 & RF1_UNIQUE)) && (q_ptr->type == 1)) continue; + if ((!(r_ptr->flags & RF_UNIQUE)) && (q_ptr->type == 1)) continue; /* Level restriction */ min_level = (rl > RQ_LEVEL_CAP) ? RQ_LEVEL_CAP : rl; @@ -175,7 +176,7 @@ void initialize_random_quests(int n) } else { - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { r_ptr->max_num = -1; } diff --git a/src/rule_type.hpp b/src/rule_type.hpp index d6424641..b88ce7bf 100644 --- a/src/rule_type.hpp +++ b/src/rule_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "monster_race_flag_set.hpp" #include "monster_spell_flag_set.hpp" /* Define monster generation rules */ @@ -9,13 +10,7 @@ struct rule_type byte mode = 0; /* Mode of combination of the monster flags */ byte percent = 0; /* Percent of monsters affected by the rule */ - u32b mflags1 = 0; /* The monster flags that are allowed */ - u32b mflags2 = 0; - u32b mflags3 = 0; - u32b mflags7 = 0; - u32b mflags8 = 0; - u32b mflags9 = 0; - + monster_race_flag_set mflags; /* The monster flags that are allowed */ monster_spell_flag_set mspells; /* Monster spells the are allowed */ char r_char[5] = { 0 }; /* Monster race allowed */ diff --git a/src/spells1.cc b/src/spells1.cc index 98520b04..8e109a77 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -22,6 +22,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" @@ -93,7 +94,7 @@ s16b poly_r_idx(int r_idx) int i, r; /* Hack -- Uniques never polymorph */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) return (r_idx); /* Pick a (possibly new) non-unique race */ @@ -109,7 +110,7 @@ s16b poly_r_idx(int r_idx) r_ptr = &r_info[r]; /* Ignore unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) continue; + if (r_ptr->flags & RF_UNIQUE) continue; /* Use that index */ r_idx = r; @@ -353,7 +354,7 @@ void teleport_away(int m_idx, int dis) /* Update monster light */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags9 & RF9_HAS_LITE) + if (r_ptr->flags & RF_HAS_LITE) { p_ptr->update |= (PU_MON_LITE); } @@ -471,7 +472,7 @@ static void teleport_to_player(int m_idx) lite_spot(ny, nx); /* Update monster light */ - if (r_ptr->flags9 & RF9_HAS_LITE) p_ptr->update |= (PU_MON_LITE); + if (r_ptr->flags & RF_HAS_LITE) p_ptr->update |= (PU_MON_LITE); } @@ -600,7 +601,7 @@ void teleport_player(int dis) { auto const r_ptr = m_list[cave[oy + yy][ox + xx].m_idx].race(); - if ((r_ptr->spells & SF_TPORT) && !(r_ptr->flags3 & RF3_RES_TELE)) + if ((r_ptr->spells & SF_TPORT) && !(r_ptr->flags & RF_RES_TELE)) /* * The latter limitation is to avoid * totally unkillable suckers... @@ -3891,7 +3892,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) monster_race *r_ptr = &r_info[o_ptr->pval2]; s32b dama, radius = 7; - if (r_ptr->flags1 & RF1_FORCE_MAXHP) + if (r_ptr->flags & RF_FORCE_MAXHP) dama = maxroll(r_ptr->hdice, r_ptr->hside); else dama = damroll(r_ptr->hdice, r_ptr->hside); @@ -4356,17 +4357,17 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) auto r_ptr = m_ptr->race(); /* Mega Gachk */ - if (r_ptr->flags2 & RF2_DEATH_ORB) + if (r_ptr->flags & RF_DEATH_ORB) { msg_format("%^s is immune to magic.", m_name); return seen; } /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags3 & RF3_NONLIVING) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ @@ -4397,48 +4398,48 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_IDENTIFY: break; /* none of the above anger */ case GF_TRAP_DEMONSOUL: - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) get_angry = TRUE; break; case GF_KILL_WALL: - if (r_ptr->flags3 & RF3_HURT_ROCK) + if (r_ptr->flags & RF_HURT_ROCK) get_angry = TRUE; break; case GF_HOLY_FIRE: - if (!(r_ptr->flags3 & RF3_GOOD)) + if (!(r_ptr->flags & RF_GOOD)) get_angry = TRUE; break; case GF_TURN_UNDEAD: case GF_DISP_UNDEAD: - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) get_angry = TRUE; break; case GF_TURN_EVIL: case GF_DISP_EVIL: - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) get_angry = TRUE; break; case GF_DISP_GOOD: - if (r_ptr->flags3 & RF3_GOOD) + if (r_ptr->flags & RF_GOOD) get_angry = TRUE; break; case GF_DISP_DEMON: - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) get_angry = TRUE; break; case GF_DISP_LIVING: case GF_UNBREATH: - if (!(r_ptr->flags3 & RF3_UNDEAD) && - !(r_ptr->flags3 & RF3_NONLIVING)) + if (!(r_ptr->flags & RF_UNDEAD) && + !(r_ptr->flags & RF_NONLIVING)) get_angry = TRUE; break; case GF_PSI: case GF_PSI_DRAIN: - if (!(r_ptr->flags2 & RF2_EMPTY_MIND)) + if (!(r_ptr->flags & RF_EMPTY_MIND)) get_angry = TRUE; break; case GF_DOMINATION: - if (!(r_ptr->flags3 & RF3_NO_CONF)) + if (!(r_ptr->flags & RF_NO_CONF)) get_angry = TRUE; break; case GF_OLD_POLY: @@ -4448,7 +4449,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; case GF_LITE: case GF_LITE_WEAK: - if (r_ptr->flags3 & RF3_HURT_LITE) + if (r_ptr->flags & RF_HURT_LITE) get_angry = TRUE; break; case GF_INSTA_DEATH: @@ -4497,7 +4498,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { note = " resists."; dam = 0; @@ -4520,12 +4521,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_ACID: { if (seen) obvious = TRUE; - if (r_ptr->flags9 & RF9_SUSCEP_ACID) + if (r_ptr->flags & RF_SUSCEP_ACID) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & RF3_IM_ACID) + if (r_ptr->flags & RF_IM_ACID) { note = " resists a lot."; dam /= 9; @@ -4537,12 +4538,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_ELEC: { if (seen) obvious = TRUE; - if (r_ptr->flags9 & RF9_SUSCEP_ELEC) + if (r_ptr->flags & RF_SUSCEP_ELEC) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & RF3_IM_ELEC) + if (r_ptr->flags & RF_IM_ELEC) { note = " resists a lot."; dam /= 9; @@ -4554,12 +4555,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_SUSCEP_FIRE) + if (r_ptr->flags & RF_SUSCEP_FIRE) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & RF3_IM_FIRE) + if (r_ptr->flags & RF_IM_FIRE) { note = " resists a lot."; dam /= 9; @@ -4571,12 +4572,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_COLD: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_SUSCEP_COLD) + if (r_ptr->flags & RF_SUSCEP_COLD) { note = " is hit hard."; dam *= 3; } - if (r_ptr->flags3 & RF3_IM_COLD) + if (r_ptr->flags & RF_IM_COLD) { note = " resists a lot."; dam /= 9; @@ -4589,13 +4590,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(25)) do_pois = (10 + randint(11) + r) / (r + 1); - if (r_ptr->flags9 & RF9_SUSCEP_POIS) + if (r_ptr->flags & RF_SUSCEP_POIS) { note = " is hit hard."; dam *= 3; do_pois *= 2; } - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flags & RF_IM_POIS) { note = " resists a lot."; dam /= 9; @@ -4610,7 +4611,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; if (magik(15)) do_pois = (10 + randint(11) + r) / (r + 1); - if ((r_ptr->flags3 & RF3_NONLIVING) || (r_ptr->flags3 & RF3_UNDEAD)) + if ((r_ptr->flags & RF_NONLIVING) || (r_ptr->flags & RF_UNDEAD)) { note = " is immune."; dam = 0; @@ -4624,7 +4625,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_IM_POIS) + if (r_ptr->flags & RF_IM_POIS) { note = " resists."; dam *= 3; @@ -4638,7 +4639,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_HELL_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { dam *= 2; note = " is hit hard."; @@ -4650,12 +4651,12 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_HOLY_FIRE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_GOOD) + if (r_ptr->flags & RF_GOOD) { dam = 0; note = " is immune."; } - else if (r_ptr->flags3 & RF3_EVIL) + else if (r_ptr->flags & RF_EVIL) { dam *= 2; note = " is hit hard."; @@ -4680,7 +4681,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_PLASMA: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_RES_PLAS) + if (r_ptr->flags & RF_RES_PLAS) { note = " resists."; dam *= 3; @@ -4693,18 +4694,18 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_NETHER: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & RF3_RES_NETH) + else if (r_ptr->flags & RF_RES_NETH) { note = " resists."; dam *= 3; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & RF3_EVIL) + else if (r_ptr->flags & RF_EVIL) { dam /= 2; note = " resists somewhat."; @@ -4723,7 +4724,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & RF3_RES_WATE) + else if (r_ptr->flags & RF_RES_WATE) { note = " resists."; dam *= 3; @@ -4743,7 +4744,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) note = " is immune."; dam = 0; } - else if (r_ptr->flags3 & RF3_RES_WATE) + else if (r_ptr->flags & RF_RES_WATE) { note = " resists."; dam *= 3; @@ -4832,7 +4833,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_poly = TRUE; do_conf = (5 + randint(11) + r) / (r + 1); if ((r_ptr->spells & SF_BR_CHAO) || - ((r_ptr->flags3 & RF3_DEMON) && (randint(3) == 1))) + ((r_ptr->flags & RF_DEMON) && (randint(3) == 1))) { note = " resists."; dam *= 3; @@ -4904,7 +4905,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) dam *= 2; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & RF3_NO_CONF) + else if (r_ptr->flags & RF_NO_CONF) { note = " resists somewhat."; dam /= 2; @@ -4916,7 +4917,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISENCHANT: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_RES_DISE) + if (r_ptr->flags & RF_RES_DISE) { note = " resists."; dam *= 3; @@ -4929,7 +4930,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_NEXUS: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_RES_NEXU) + if (r_ptr->flags & RF_RES_NEXU) { note = " resists."; dam *= 3; @@ -5082,9 +5083,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) { - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { note = " is unaffected!"; resist_tele = TRUE; @@ -5110,7 +5111,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { /* 1. slowness */ /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { obvious = FALSE; @@ -5126,7 +5127,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5151,14 +5152,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISINTEGRATE: { if (seen) obvious = TRUE; - if (r_ptr->flags3 & RF3_HURT_ROCK) + if (r_ptr->flags & RF_HURT_ROCK) { note = " loses some skin!"; note_dies = " evaporates!"; dam *= 2; } - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { if (rand_int(m_ptr->level + 10) > rand_int(p_ptr->lev)) { @@ -5171,7 +5172,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_FEAR: { - if (r_ptr->flags3 & RF3_NO_FEAR) + if (r_ptr->flags & RF_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + (dam / 2) + randint(dam / 2)); @@ -5184,14 +5185,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_PSI: { if (seen) obvious = TRUE; - if (r_ptr->flags2 & RF2_EMPTY_MIND) + if (r_ptr->flags & RF_EMPTY_MIND) { dam = 0; note = " is immune!"; } - else if ((r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags2 & RF2_WEIRD_MIND) || - (r_ptr->flags3 & RF3_ANIMAL) || + else if ((r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_WEIRD_MIND) || + (r_ptr->flags & RF_ANIMAL) || (m_ptr->level > randint(3 * dam))) { dam /= 3; @@ -5199,8 +5200,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Powerful demons & undead can turn a mindcrafter's * attacks back on them */ - if (((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_DEMON)) && + if (((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_DEMON)) && (m_ptr->level > p_ptr->lev / 2) && (randint(2) == 1)) { @@ -5229,7 +5230,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; case 3: { - if (r_ptr->flags3 & RF3_NO_FEAR) + if (r_ptr->flags & RF_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + 3 + randint(dam)); @@ -5272,14 +5273,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_PSI_DRAIN: { if (seen) obvious = TRUE; - if (r_ptr->flags2 & RF2_EMPTY_MIND) + if (r_ptr->flags & RF_EMPTY_MIND) { dam = 0; note = " is immune!"; } - else if ((r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags2 & RF2_WEIRD_MIND) || - (r_ptr->flags3 & RF3_ANIMAL) || + else if ((r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_WEIRD_MIND) || + (r_ptr->flags & RF_ANIMAL) || (m_ptr->level > randint(3 * dam))) { dam /= 3; @@ -5289,8 +5290,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) * Powerful demons & undead can turn a mindcrafter's * attacks back on them */ - if (((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_DEMON)) && + if (((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_DEMON)) && (m_ptr->level > p_ptr->lev / 2) && (randint(2) == 1)) { @@ -5336,7 +5337,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > 5 + randint(dam))) { /* Resist */ @@ -5360,8 +5361,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_CONF) || + if ((r_ptr->flags & RF_UNIQUE) || + (r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5371,8 +5372,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) * Powerful demons & undead can turn a mindcrafter's * attacks back on them */ - if (((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_DEMON)) && + if (((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_DEMON)) && (m_ptr->level > p_ptr->lev / 2) && (randint(2) == 1)) { @@ -5397,7 +5398,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) break; default: { - if (r_ptr->flags3 & RF3_NO_FEAR) + if (r_ptr->flags & RF_NO_FEAR) note = " is unaffected."; else set_afraid(p_ptr->afraid + dam); @@ -5418,7 +5419,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " is in your thrall!"; m_ptr->status = MSTATUS_PET; - if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL))) + if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL))) inc_piety(GOD_YAVANNA, m_ptr->level * 2); } else @@ -5450,13 +5451,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; do_stun = (randint(15) + 1) / (r + 1); if (magik(33)) do_cut = (10 + randint(15) + r) / (r + 1); - if (r_ptr->flags3 & RF3_SUSCEP_COLD) + if (r_ptr->flags & RF_SUSCEP_COLD) { note = " is hit hard."; dam *= 3; do_cut *= 2; } - if (r_ptr->flags3 & RF3_IM_COLD) + if (r_ptr->flags & RF_IM_COLD) { note = " resists a lot."; dam /= 9; @@ -5471,9 +5472,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (seen) obvious = TRUE; - if ((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_NONLIVING) || + if ((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_NONLIVING) || (strchr("Egv", r_ptr->d_char))) { note = " is unaffected!"; @@ -5488,14 +5489,14 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DEATH_RAY: { if (seen) obvious = TRUE; - if ((r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags3 & RF3_NONLIVING)) + if ((r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_NONLIVING)) { note = " is immune."; obvious = FALSE; dam = 0; } - else if (((r_ptr->flags1 & RF1_UNIQUE) && + else if (((r_ptr->flags & RF_UNIQUE) && (randint(888) != 666)) || (((m_ptr->level + randint(20)) > randint((dam) + randint(10))) && randint(100) != 66 )) @@ -5519,7 +5520,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_poly = TRUE; /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { @@ -5610,7 +5611,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Powerful monsters can resist */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { note = " is unaffected!"; @@ -5636,7 +5637,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags3 & RF3_NO_SLEEP) || + if ((r_ptr->flags & RF_NO_SLEEP) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* No obvious effect */ @@ -5662,7 +5663,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { note = " is unaffected!"; @@ -5689,7 +5690,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Attempt a saving throw */ if ((m_ptr->mflag & MFLAG_QUEST) || - (r_ptr->flags3 & RF3_NO_CONF) || + (r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5)) { /* Resist */ @@ -5707,7 +5708,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { note = " suddenly seems friendly!"; m_ptr->status = MSTATUS_FRIEND; - if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL))) + if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL))) inc_piety(GOD_YAVANNA, m_ptr->level * 2); } } @@ -5726,7 +5727,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Attempt a saving throw */ if ((m_ptr->mflag & MFLAG_QUEST) || - (r_ptr->flags3 & RF3_NO_CONF) || + (r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 5)) { /* Resist */ @@ -5746,7 +5747,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (can_create_companion()) m_ptr->status = MSTATUS_COMPANION; else m_ptr->status = MSTATUS_PET; - if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL))) + if ((r_ptr->flags & RF_ANIMAL) && (!(r_ptr->flags & RF_EVIL))) inc_piety(GOD_YAVANNA, m_ptr->level * 2); } } @@ -5762,9 +5763,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & RF3_UNDEAD)) || + (!(r_ptr->flags & RF_UNDEAD)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5793,9 +5794,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags1 & RF1_NEVER_MOVE)) || + (!(r_ptr->flags & RF_NEVER_MOVE)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5824,10 +5825,10 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & RF3_ANIMAL)) || - (r_ptr->flags3 & RF3_NO_CONF) || + (!(r_ptr->flags & RF_ANIMAL)) || + (r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5857,9 +5858,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & RF3_DEMON)) || + (!(r_ptr->flags & RF_DEMON)) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5891,7 +5892,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & RF3_NO_CONF) || + if ((r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5938,7 +5939,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & RF3_NO_CONF) || + if ((r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5978,7 +5979,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_stun = damroll((p_ptr->lev / 10) + 3 , (dam)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -5990,7 +5991,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } /* Non_living resists */ - if (r_ptr->flags3 & RF3_NONLIVING) + if (r_ptr->flags & RF_NONLIVING) { /* Resist */ do_stun = 0; @@ -6012,7 +6013,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_conf = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags3 & RF3_NO_CONF) || + if ((r_ptr->flags & RF_NO_CONF) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* Resist */ @@ -6043,7 +6044,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_LITE_WEAK: { /* Hurt by light */ - if (r_ptr->flags3 & RF3_HURT_LITE) + if (r_ptr->flags & RF_HURT_LITE) { /* Obvious effect */ if (seen) obvious = TRUE; @@ -6075,7 +6076,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) dam *= 2; dam /= (randint(6) + 6); } - else if (r_ptr->flags3 & RF3_HURT_LITE) + else if (r_ptr->flags & RF_HURT_LITE) { note = " cringes from the light!"; note_dies = " shrivels away in the light!"; @@ -6092,8 +6093,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Likes darkness... */ if ((r_ptr->spells & SF_BR_DARK) || - (r_ptr->flags3 & RF3_ORC) || - (r_ptr->flags3 & RF3_HURT_LITE)) + (r_ptr->flags & RF_ORC) || + (r_ptr->flags & RF_HURT_LITE)) { note = " resists."; dam *= 2; @@ -6107,7 +6108,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_KILL_WALL: { /* Hurt by rock remover */ - if (r_ptr->flags3 & RF3_HURT_ROCK) + if (r_ptr->flags & RF_HURT_ROCK) { /* Notice effect */ if (seen) obvious = TRUE; @@ -6134,13 +6135,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect undead */ - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { bool_ resists_tele = FALSE; - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) { - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6177,13 +6178,13 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) { if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ /* Only affect evil */ - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { bool_ resists_tele = FALSE; - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) { - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6221,9 +6222,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) bool_ resists_tele = FALSE; if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) { - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { note = " is unaffected!"; resists_tele = TRUE; @@ -6254,7 +6255,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TURN_UNDEAD: { /* Only affect undead */ - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6289,7 +6290,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_TURN_EVIL: { /* Only affect evil */ - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { /* Obvious */ if (seen) obvious = TRUE; @@ -6330,8 +6331,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_fear = damroll(3, (dam / 2)) + 1; /* Attempt a saving throw */ - if ((r_ptr->flags1 & RF1_UNIQUE) || - (r_ptr->flags3 & RF3_NO_FEAR) || + if ((r_ptr->flags & RF_UNIQUE) || + (r_ptr->flags & RF_NO_FEAR) || (m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10)) { /* No obvious effect */ @@ -6350,7 +6351,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_UNDEAD: { /* Only affect undead */ - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6378,7 +6379,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_EVIL: { /* Only affect evil */ - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { /* Obvious */ if (seen) obvious = TRUE; @@ -6405,7 +6406,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_GOOD: { /* Only affect good */ - if (r_ptr->flags3 & RF3_GOOD) + if (r_ptr->flags & RF_GOOD) { /* Obvious */ if (seen) obvious = TRUE; @@ -6432,8 +6433,8 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_LIVING: { /* Only affect non-undead */ - if (!(r_ptr->flags3 & RF3_UNDEAD) && - !(r_ptr->flags3 & RF3_NONLIVING)) + if (!(r_ptr->flags & RF_UNDEAD) && + !(r_ptr->flags & RF_NONLIVING)) { /* Obvious */ if (seen) obvious = TRUE; @@ -6460,7 +6461,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_DISP_DEMON: { /* Only affect demons */ - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) { /* Obvious */ if (seen) obvious = TRUE; @@ -6527,9 +6528,9 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if (seen) obvious = TRUE; /* Check race */ - if ((r_ptr->flags1 & RF1_UNIQUE) || + if ((r_ptr->flags & RF_UNIQUE) || (m_ptr->mflag & MFLAG_QUEST) || - (!(r_ptr->flags3 & RF3_DEMON))) + (!(r_ptr->flags & RF_DEMON))) { /* No obvious effect */ note = " is unaffected!"; @@ -6546,7 +6547,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_CORPSE)); /* Unique corpses are unique */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { object_aware(i_ptr); i_ptr->name1 = 201; @@ -6573,7 +6574,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_INSTA_DEATH: { - if (magik(95) && !(r_ptr->flags1 & RF1_UNIQUE) && !(r_ptr->flags3 & RF3_UNDEAD) && !(r_ptr->flags3 & RF3_NONLIVING)) { + if (magik(95) && !(r_ptr->flags & RF_UNIQUE) && !(r_ptr->flags & RF_UNDEAD) && !(r_ptr->flags & RF_NONLIVING)) { /* Kill outright, but reduce exp. */ m_ptr->level = m_ptr->level / 3; dam = 32535; /* Should be enough */ @@ -6598,7 +6599,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* "Unique" monsters cannot be polymorphed */ - if (r_ptr->flags1 & RF1_UNIQUE) do_poly = FALSE; + if (r_ptr->flags & RF_UNIQUE) do_poly = FALSE; /* * "Quest" monsters cannot be polymorphed @@ -6607,7 +6608,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) do_poly = FALSE; /* "Unique" monsters can only be "killed" by the player unless they are player's friends */ - if ((r_ptr->flags1 & RF1_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) + if ((r_ptr->flags & RF_UNIQUE) && (m_ptr->status <= MSTATUS_NEUTRAL_P)) { /* Uniques may only be killed by the player */ if (who && (who != -2) && (dam > m_ptr->hp)) dam = m_ptr->hp; @@ -6621,7 +6622,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((who > 0) && (dam > m_ptr->hp)) dam = m_ptr->hp; } - if (do_pois && (!(r_ptr->flags3 & RF3_IM_POIS)) && (!(r_ptr->flags3 & SF_BR_POIS)) && hurt_monster(m_ptr)) + if (do_pois && (!(r_ptr->flags & RF_IM_POIS)) && (!(r_ptr->flags & SF_BR_POIS)) && hurt_monster(m_ptr)) { if (m_ptr->poisoned) note = " is more poisoned."; else note = " is poisoned."; @@ -6785,7 +6786,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Confusion and Chaos breathers (and sleepers) never confuse */ else if (do_conf && - !(r_ptr->flags3 & RF3_NO_CONF) && + !(r_ptr->flags & RF_NO_CONF) && !(r_ptr->spells & SF_BR_CONF) && !(r_ptr->spells & SF_BR_CHAO) && hurt_monster(m_ptr)) { @@ -8488,7 +8489,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) { auto ref_ptr = m_list[cave[y][x].m_idx].race(); - if ((ref_ptr->flags2 & RF2_REFLECTING) && (randint(10) != 1) + if ((ref_ptr->flags & RF_REFLECTING) && (randint(10) != 1) && (dist_hack > 1)) { int t_y, t_x; diff --git a/src/spells2.cc b/src/spells2.cc index 08d65a4b..535b03f2 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -22,6 +22,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "notes.hpp" @@ -847,132 +848,132 @@ void self_knowledge(FILE *fff) { monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if (r_ptr->flags1 & RF1_CHAR_CLEAR || - r_ptr->flags1 & RF1_ATTR_CLEAR) + if (r_ptr->flags & RF_CHAR_CLEAR || + r_ptr->flags & RF_ATTR_CLEAR) info[i++] = "You are transparent."; - if ((r_ptr->flags1 & RF1_CHAR_MULTI) || - (r_ptr->flags2 & RF2_SHAPECHANGER)) + if ((r_ptr->flags & RF_CHAR_MULTI) || + (r_ptr->flags & RF_SHAPECHANGER)) info[i++] = "Your form constantly changes."; - if (r_ptr->flags1 & RF1_ATTR_MULTI) + if (r_ptr->flags & RF_ATTR_MULTI) info[i++] = "Your color constantly changes."; - if (r_ptr->flags1 & RF1_NEVER_BLOW) + if (r_ptr->flags & RF_NEVER_BLOW) info[i++] = "You do not have a physical weapon."; - if (r_ptr->flags1 & RF1_NEVER_MOVE) + if (r_ptr->flags & RF_NEVER_MOVE) info[i++] = "You cannot move."; - if ((r_ptr->flags1 & RF1_RAND_25) && - (r_ptr->flags1 & RF1_RAND_50)) + if ((r_ptr->flags & RF_RAND_25) && + (r_ptr->flags & RF_RAND_50)) info[i++] = "You move extremely erratically."; - else if (r_ptr->flags1 & RF1_RAND_50) + else if (r_ptr->flags & RF_RAND_50) info[i++] = "You move somewhat erratically."; - else if (r_ptr->flags1 & RF1_RAND_25) + else if (r_ptr->flags & RF_RAND_25) info[i++] = "You move a bit erratically."; - if (r_ptr->flags2 & RF2_STUPID) + if (r_ptr->flags & RF_STUPID) info[i++] = "You are very stupid (INT -4)."; - if (r_ptr->flags2 & RF2_SMART) + if (r_ptr->flags & RF_SMART) info[i++] = "You are very smart (INT +4)."; /* Not implemented */ - if (r_ptr->flags2 & RF2_CAN_SPEAK) + if (r_ptr->flags & RF_CAN_SPEAK) info[i++] = "You can speak."; else info[i++] = "You cannot speak."; /* Not implemented */ - if (r_ptr->flags2 & RF2_COLD_BLOOD) + if (r_ptr->flags & RF_COLD_BLOOD) info[i++] = "You are cold blooded."; /* Not implemented */ - if (r_ptr->flags2 & RF2_EMPTY_MIND) + if (r_ptr->flags & RF_EMPTY_MIND) info[i++] = "You have an empty mind."; - if (r_ptr->flags2 & RF2_WEIRD_MIND) + if (r_ptr->flags & RF_WEIRD_MIND) info[i++] = "You have a weird mind."; if (r_ptr->spells & SF_MULTIPLY) info[i++] = "You can multiply."; - if (r_ptr->flags2 & RF2_POWERFUL) + if (r_ptr->flags & RF_POWERFUL) info[i++] = "You have strong breath."; /* Not implemented */ - if (r_ptr->flags2 & RF2_ELDRITCH_HORROR) + if (r_ptr->flags & RF_ELDRITCH_HORROR) info[i++] = "You are an eldritch horror."; - if (r_ptr->flags2 & RF2_OPEN_DOOR) + if (r_ptr->flags & RF_OPEN_DOOR) info[i++] = "You can open doors."; else info[i++] = "You cannot open doors."; - if (r_ptr->flags2 & RF2_BASH_DOOR) + if (r_ptr->flags & RF_BASH_DOOR) info[i++] = "You can bash doors."; else info[i++] = "You cannot bash doors."; - if (r_ptr->flags2 & RF2_PASS_WALL) + if (r_ptr->flags & RF_PASS_WALL) info[i++] = "You can pass walls."; - if (r_ptr->flags2 & RF2_KILL_WALL) + if (r_ptr->flags & RF_KILL_WALL) info[i++] = "You destroy walls."; /* Not implemented */ - if (r_ptr->flags2 & RF2_MOVE_BODY) + if (r_ptr->flags & RF_MOVE_BODY) info[i++] = "You can move monsters."; /* Not implemented */ - if (r_ptr->flags3 & RF3_ORC) + if (r_ptr->flags & RF_ORC) info[i++] = "You have orc blood in your veins."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_TROLL) + else if (r_ptr->flags & RF_TROLL) info[i++] = "You have troll blood in your veins."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_GIANT) + else if (r_ptr->flags & RF_GIANT) info[i++] = "You have giant blood in your veins."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_DRAGON) + else if (r_ptr->flags & RF_DRAGON) info[i++] = "You have dragon blood in your veins."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_DEMON) + else if (r_ptr->flags & RF_DEMON) info[i++] = "You have demon blood in your veins."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_UNDEAD) + else if (r_ptr->flags & RF_UNDEAD) info[i++] = "You are an undead."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_ANIMAL) + else if (r_ptr->flags & RF_ANIMAL) info[i++] = "You are an animal."; /* Not implemented */ - else if (r_ptr->flags3 & RF3_THUNDERLORD) + else if (r_ptr->flags & RF_THUNDERLORD) info[i++] = "You have thunderlord blood in your veins."; - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) info[i++] = "You are inherently evil."; - else if (r_ptr->flags3 & RF3_GOOD) + else if (r_ptr->flags & RF_GOOD) info[i++] = "You are inherently good."; - if (r_ptr->flags3 & RF3_AURA_COLD) + if (r_ptr->flags & RF_AURA_COLD) info[i++] = "You are surrounded by a chilly aura."; /* Not implemented */ - if (r_ptr->flags3 & RF3_NONLIVING) + if (r_ptr->flags & RF_NONLIVING) info[i++] = "You are not living."; /* Not implemented */ - if (r_ptr->flags3 & RF3_HURT_LITE) + if (r_ptr->flags & RF_HURT_LITE) info[i++] = "Your eyes are vulnerable to bright light."; /* Not implemented */ - if (r_ptr->flags3 & RF3_HURT_ROCK) + if (r_ptr->flags & RF_HURT_ROCK) info[i++] = "You can be hurt by rock remover."; - if (r_ptr->flags3 & RF3_SUSCEP_FIRE) + if (r_ptr->flags & RF_SUSCEP_FIRE) info[i++] = "You are vulnerable to fire."; - if (r_ptr->flags3 & RF3_SUSCEP_COLD) + if (r_ptr->flags & RF_SUSCEP_COLD) info[i++] = "You are vulnerable to cold."; - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) info[i++] = "You are resistant to teleportation."; - if (r_ptr->flags3 & RF3_RES_NETH) + if (r_ptr->flags & RF_RES_NETH) info[i++] = "You are resistant to nether."; - if (r_ptr->flags3 & RF3_RES_WATE) + if (r_ptr->flags & RF_RES_WATE) info[i++] = "You are resistant to water."; - if (r_ptr->flags3 & RF3_RES_PLAS) + if (r_ptr->flags & RF_RES_PLAS) info[i++] = "You are resistant to plasma."; - if (r_ptr->flags3 & RF3_RES_WATE) + if (r_ptr->flags & RF_RES_WATE) info[i++] = "You are resistant to nexus."; - if (r_ptr->flags3 & RF3_RES_DISE) + if (r_ptr->flags & RF_RES_DISE) info[i++] = "You are resistant to disease."; /* Not implemented */ - if (r_ptr->flags3 & RF3_NO_SLEEP) + if (r_ptr->flags & RF_NO_SLEEP) info[i++] = "You cannot be slept."; /* Not implemented */ - if (r_ptr->flags3 & RF3_UNIQUE_4) + if (r_ptr->flags & RF_UNIQUE_4) info[i++] = "You are a Nazgul."; - if (r_ptr->flags3 & RF3_NO_FEAR) + if (r_ptr->flags & RF_NO_FEAR) info[i++] = "You are immune to fear."; - if (r_ptr->flags3 & RF3_NO_STUN) + if (r_ptr->flags & RF_NO_STUN) info[i++] = "You are immune to stun."; - if (r_ptr->flags3 & RF3_NO_CONF) + if (r_ptr->flags & RF_NO_CONF) info[i++] = "You are immune to confusion."; - if (r_ptr->flags3 & RF3_NO_SLEEP) + if (r_ptr->flags & RF_NO_SLEEP) info[i++] = "You are immune to sleep."; if (r_ptr->spells & SF_SHRIEK) @@ -1154,49 +1155,49 @@ void self_knowledge(FILE *fff) if (r_ptr->spells & SF_S_UNIQUE) info[i++] = "You can magically summon an unique monster."; /* Not implemented */ - if (r_ptr->flags7 & RF7_AQUATIC) + if (r_ptr->flags & RF_AQUATIC) info[i++] = "You are aquatic."; /* Not implemented */ - if (r_ptr->flags7 & RF7_CAN_SWIM) + if (r_ptr->flags & RF_CAN_SWIM) info[i++] = "You can swim."; /* Not implemented */ - if (r_ptr->flags7 & RF7_CAN_FLY) + if (r_ptr->flags & RF_CAN_FLY) info[i++] = "You can fly."; - if ((r_ptr->flags7 & RF7_MORTAL) == 0) + if ((r_ptr->flags & RF_MORTAL) == 0) info[i++] = "You are immortal."; /* Not implemented */ - if (r_ptr->flags7 & RF7_NAZGUL) + if (r_ptr->flags & RF_NAZGUL) info[i++] = "You are a Nazgul."; - if (r_ptr->flags7 & RF7_SPIDER) + if (r_ptr->flags & RF_SPIDER) info[i++] = "You are a spider."; - if (r_ptr->flags8 & RF8_WILD_TOWN) + if (r_ptr->flags & RF_WILD_TOWN) info[i++] = "You appear in towns."; - if (r_ptr->flags8 & RF8_WILD_SHORE) + if (r_ptr->flags & RF_WILD_SHORE) info[i++] = "You appear on the shore."; - if (r_ptr->flags8 & RF8_WILD_OCEAN) + if (r_ptr->flags & RF_WILD_OCEAN) info[i++] = "You appear in the ocean."; - if (r_ptr->flags8 & RF8_WILD_WASTE) + if (r_ptr->flags & RF_WILD_WASTE) info[i++] = "You appear in the waste."; - if (r_ptr->flags8 & RF8_WILD_WOOD) + if (r_ptr->flags & RF_WILD_WOOD) info[i++] = "You appear in woods."; - if (r_ptr->flags8 & RF8_WILD_VOLCANO) + if (r_ptr->flags & RF_WILD_VOLCANO) info[i++] = "You appear in volcanos."; - if (r_ptr->flags8 & RF8_WILD_MOUNTAIN) + if (r_ptr->flags & RF_WILD_MOUNTAIN) info[i++] = "You appear in the mountains."; - if (r_ptr->flags8 & RF8_WILD_GRASS) + if (r_ptr->flags & RF_WILD_GRASS) info[i++] = "You appear in grassy areas."; - if (r_ptr->flags9 & RF9_SUSCEP_ACID) + if (r_ptr->flags & RF_SUSCEP_ACID) info[i++] = "You are vulnerable to acid."; - if (r_ptr->flags9 & RF9_SUSCEP_ELEC) + if (r_ptr->flags & RF_SUSCEP_ELEC) info[i++] = "You are vulnerable to electricity."; - if (r_ptr->flags9 & RF9_SUSCEP_POIS) + if (r_ptr->flags & RF_SUSCEP_POIS) info[i++] = "You are vulnerable to poison."; - if (r_ptr->flags9 & RF9_KILL_TREES) + if (r_ptr->flags & RF_KILL_TREES) info[i++] = "You can eat trees."; - if (r_ptr->flags9 & RF9_WYRM_PROTECT) + if (r_ptr->flags & RF_WYRM_PROTECT) info[i++] = "You are protected by great wyrms of power."; } @@ -2386,7 +2387,7 @@ template bool detect_objects_fn(int radius, const char *object_mess monster_type *m_ptr = &m_list[o_ptr->held_m_idx]; auto const r_ptr = m_ptr->race(); - if (!(r_ptr->flags9 & RF9_MIMIC)) + if (!(r_ptr->flags & RF_MIMIC)) { continue; /* Skip mimics completely */ } @@ -2482,7 +2483,7 @@ bool detect_objects_normal(int rad) bool_ detect_monsters_normal(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (!(r_ptr->flags2 & RF2_INVISIBLE)) || + return (!(r_ptr->flags & RF_INVISIBLE)) || p_ptr->see_inv || p_ptr->tim_invis; }; @@ -2505,7 +2506,7 @@ bool_ detect_monsters_normal(int rad) bool_ detect_monsters_invis(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (r_ptr->flags2 & RF2_INVISIBLE); + return (r_ptr->flags & RF_INVISIBLE); }; if (detect_monsters_fn(rad, predicate)) @@ -2523,41 +2524,17 @@ bool_ detect_monsters_invis(int rad) /* - * A "generic" detect monsters routine, tagged to flags3 + * Detect orcs */ -bool_ detect_monsters_xxx(u32b match_flag, int rad) +void detect_monsters_orcs(int rad) { - auto predicate = [match_flag](monster_race *r_ptr) -> bool { - return (r_ptr->flags3 & match_flag); + auto predicate = [](monster_race *r_ptr) -> bool { + return (r_ptr->flags & RF_ORC); }; if (detect_monsters_fn(rad, predicate)) { - cptr desc_monsters = "weird monsters"; - switch (match_flag) - { - case RF3_DEMON: - desc_monsters = "demons"; - break; - case RF3_UNDEAD: - desc_monsters = "the undead"; - break; - case RF3_GOOD: - desc_monsters = "good"; - break; - case RF3_ORC: - desc_monsters = "orcs"; - break; - } - - /* Describe result */ - msg_format("You sense the presence of %s!", desc_monsters); - msg_print(NULL); - return TRUE; - } - else - { - return FALSE; + msg_print("You sense the presence of orcs!"); } } @@ -3991,7 +3968,7 @@ bool_ genocide_aux(bool_ player_cast, char typ) if (!m_ptr->r_idx) continue; /* Hack -- Skip Unique Monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) continue; + if (r_ptr->flags & RF_UNIQUE) continue; /* Hack -- Skip Quest Monsters */ if (m_ptr->mflag & MFLAG_QUEST) continue; @@ -4000,7 +3977,7 @@ bool_ genocide_aux(bool_ player_cast, char typ) if (r_ptr->d_char != typ) continue; /* Oups */ - if (r_ptr->flags2 & RF2_DEATH_ORB) + if (r_ptr->flags & RF_DEATH_ORB) { int wx, wy; int attempts = 500; @@ -4117,7 +4094,7 @@ bool_ mass_genocide(bool_ player_cast) if (!m_ptr->r_idx) continue; /* Hack -- Skip unique monsters */ - if (r_ptr->flags1 & RF1_UNIQUE) continue; + if (r_ptr->flags & RF_UNIQUE) continue; /* Hack -- Skip Quest Monsters */ if (m_ptr->mflag & MFLAG_QUEST) continue; @@ -4126,7 +4103,7 @@ bool_ mass_genocide(bool_ player_cast) if (m_ptr->cdis > MAX_SIGHT) continue; /* Oups */ - if (r_ptr->flags2 & RF2_DEATH_ORB) + if (r_ptr->flags & RF_DEATH_ORB) { int wx, wy; int attempts = 500; @@ -4554,8 +4531,8 @@ void earthquake(int cy, int cx, int r) auto const r_ptr = m_ptr->race(); /* Most monsters cannot co-exist with rock */ - if (!(r_ptr->flags2 & RF2_KILL_WALL) && - !(r_ptr->flags2 & RF2_PASS_WALL)) + if (!(r_ptr->flags & RF_KILL_WALL) && + !(r_ptr->flags & RF_PASS_WALL)) { char m_name[80]; @@ -4563,7 +4540,7 @@ void earthquake(int cy, int cx, int r) sn = 0; /* Monster can move to escape the wall */ - if (!(r_ptr->flags1 & RF1_NEVER_MOVE)) + if (!(r_ptr->flags & RF_NEVER_MOVE)) { /* Look for safety */ for (i = 0; i < 8; i++) @@ -4805,10 +4782,10 @@ static void cave_temp_room_lite(void) update_mon(c_ptr->m_idx, FALSE); /* Stupid monsters rarely wake up */ - if (r_ptr->flags2 & RF2_STUPID) chance = 10; + if (r_ptr->flags & RF_STUPID) chance = 10; /* Smart monsters always wake up */ - if (r_ptr->flags2 & RF2_SMART) chance = 100; + if (r_ptr->flags & RF_SMART) chance = 100; /* Sometimes monsters wake up */ if (m_ptr->csleep && (rand_int(100) < chance)) @@ -5165,7 +5142,7 @@ void teleport_swap(int dir) monster_type *m_ptr = &m_list[c_ptr->m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags3 & RF3_RES_TELE) + if (r_ptr->flags & RF_RES_TELE) { msg_print("Your teleportation is blocked!"); } diff --git a/src/spells2.hpp b/src/spells2.hpp index ce72a883..ae3099da 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "identify_mode.hpp" +#include "monster_race_flag_set.hpp" #include "object_filter.hpp" #include "object_type_fwd.hpp" @@ -32,7 +33,7 @@ extern bool detect_objects_gold(int rad); extern bool detect_objects_normal(int rad); extern bool_ detect_monsters_normal(int rad); extern bool_ detect_monsters_invis(int rad); -extern bool_ detect_monsters_xxx(u32b match_flag, int rad); +extern void detect_monsters_orcs(int rad); extern bool_ detect_all(int rad); extern void stair_creation(void); extern bool_ wall_stone(int y, int x); diff --git a/src/spells3.cc b/src/spells3.cc index b5b69598..26a15541 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -9,6 +9,7 @@ #include "monster2.hpp" #include "monster3.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -2271,7 +2272,7 @@ casting_result melkor_mind_steal() auto const r_ptr = m_ptr->race(); if ((randint(m_ptr->level) < chance) && - ((r_ptr->flags1 & RF1_UNIQUE) == 0)) + ((r_ptr->flags & RF_UNIQUE) == 0)) { p_ptr->control = target_who; m_ptr->mflag |= MFLAG_CONTROL; diff --git a/src/tables.cc b/src/tables.cc index 02bdfedf..5f873630 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -10,6 +10,7 @@ #include "tables.h" #include "modules.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "options.hpp" #include "q_library.hpp" diff --git a/src/traps.cc b/src/traps.cc index 7911ad2d..8786e858 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -21,6 +21,7 @@ #include "gods.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -222,8 +223,8 @@ static bool_ player_handle_trap_of_walls(void) auto const r_ptr = m_ptr->race(); /* Most monsters cannot co-exist with rock */ - if ((!(r_ptr->flags2 & RF2_KILL_WALL)) && - (!(r_ptr->flags2 & RF2_PASS_WALL))) + if ((!(r_ptr->flags & RF_KILL_WALL)) && + (!(r_ptr->flags & RF_PASS_WALL))) { char m_name[80]; @@ -231,7 +232,7 @@ static bool_ player_handle_trap_of_walls(void) sn = 0; /* Monster can move to escape the wall */ - if (!(r_ptr->flags1 & RF1_NEVER_MOVE)) + if (!(r_ptr->flags & RF_NEVER_MOVE)) { /* Look for safety */ for (i = 0; i < 8; i++) @@ -2450,7 +2451,7 @@ bool_ mon_hit_trap_aux_scroll(int m_idx, int sval) monster_race *r_ptr = &r_info[m_ptr->r_idx]; genocide_aux(FALSE, r_ptr->d_char); /* although there's no point in a multiple genocide trap... */ - return (!(r_ptr->flags1 & RF1_UNIQUE)); + return (!(r_ptr->flags & RF_UNIQUE)); } case SV_SCROLL_MASS_GENOCIDE: for (k = 0; k < 8; k++) @@ -2613,7 +2614,7 @@ bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) case SV_POTION_LIFE: { monster_race *r_ptr = &r_info[m_ptr->r_idx]; - if (r_ptr->flags3 & RF3_UNDEAD) + if (r_ptr->flags & RF_UNDEAD) { typ = GF_HOLY_FIRE; dam = damroll(20, 20); @@ -2683,17 +2684,17 @@ bool_ mon_hit_trap(int m_idx) /* Can set off check */ /* Ghosts only set off Ghost traps */ - if ((r_ptr->flags2 & RF2_PASS_WALL) && !(f2 & TRAP2_KILL_GHOST)) return (FALSE); + if ((r_ptr->flags & RF_PASS_WALL) && !(f2 & TRAP2_KILL_GHOST)) return (FALSE); /* Some traps are specialized to some creatures */ if (f2 & TRAP2_ONLY_MASK) { bool_ affect = FALSE; - if ((f2 & TRAP2_ONLY_DRAGON) && (r_ptr->flags3 & RF3_DRAGON)) affect = TRUE; - if ((f2 & TRAP2_ONLY_DEMON) && (r_ptr->flags3 & RF3_DEMON)) affect = TRUE; - if ((f2 & TRAP2_ONLY_UNDEAD) && (r_ptr->flags3 & RF3_UNDEAD)) affect = TRUE; - if ((f2 & TRAP2_ONLY_EVIL) && (r_ptr->flags3 & RF3_EVIL)) affect = TRUE; - if ((f2 & TRAP2_ONLY_ANIMAL) && (r_ptr->flags3 & RF3_ANIMAL)) affect = TRUE; + if ((f2 & TRAP2_ONLY_DRAGON) && (r_ptr->flags & RF_DRAGON)) affect = TRUE; + if ((f2 & TRAP2_ONLY_DEMON) && (r_ptr->flags & RF_DEMON)) affect = TRUE; + if ((f2 & TRAP2_ONLY_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) affect = TRUE; + if ((f2 & TRAP2_ONLY_EVIL) && (r_ptr->flags & RF_EVIL)) affect = TRUE; + if ((f2 & TRAP2_ONLY_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) affect = TRUE; /* Don't set it off if forbidden */ if (!affect) return (FALSE); @@ -2713,13 +2714,13 @@ bool_ mon_hit_trap(int m_idx) smartness = r_ptr->level; /* Smart monsters are better at detecting traps */ - if (r_ptr->flags2 & RF2_SMART) smartness += 10; + if (r_ptr->flags & RF_SMART) smartness += 10; /* Some monsters have already noticed one of out traps */ if (m_ptr->smart & SM_NOTE_TRAP) smartness += 20; /* Stupid monsters are no good at detecting traps */ - if (r_ptr->flags2 & (RF2_STUPID | RF2_EMPTY_MIND)) smartness = -150; + if (r_ptr->flags & (RF_STUPID | RF_EMPTY_MIND)) smartness = -150; /* Check if the monster notices the trap */ if (randint(300) > (difficulty - smartness + 150)) notice = TRUE; @@ -2738,13 +2739,13 @@ bool_ mon_hit_trap(int m_idx) smartness = r_ptr->level / 5; /* Smart monsters are better at disarming */ - if (r_ptr->flags2 & RF2_SMART) smartness *= 2; + if (r_ptr->flags & RF_SMART) smartness *= 2; /* Stupid monsters never disarm traps */ - if (r_ptr->flags2 & RF2_STUPID) smartness = -150; + if (r_ptr->flags & RF_STUPID) smartness = -150; /* Nonsmart animals never disarm traps */ - if ((r_ptr->flags3 & RF3_ANIMAL) && !(r_ptr->flags2 & RF2_SMART)) smartness = -150; + if ((r_ptr->flags & RF_ANIMAL) && !(r_ptr->flags & RF_SMART)) smartness = -150; /* Check if the monster disarms the trap */ if (randint(120) > (difficulty - smartness + 80)) disarm = TRUE; @@ -2823,9 +2824,9 @@ bool_ mon_hit_trap(int m_idx) cptr note_dies = " dies."; /* Some monsters get "destroyed" */ - if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || + if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || (strchr("Evg", r_ptr->d_char))) { /* Special note at death */ diff --git a/src/wizard1.cc b/src/wizard1.cc index a6072dad..d1631ccf 100644 --- a/src/wizard1.cc +++ b/src/wizard1.cc @@ -4,6 +4,7 @@ #include "cmd7.hpp" #include "ego_item_type.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" @@ -1371,7 +1372,7 @@ static void spoil_mon_desc(cptr fname) monster_race *r_ptr = &r_info[who_i]; /* Get the "name" */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { sprintf(nam, "[U] %s", r_ptr->name); } @@ -1401,7 +1402,7 @@ static void spoil_mon_desc(cptr fname) sprintf(ac, "%d", r_ptr->ac); /* Hitpoints */ - if ((r_ptr->flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1)) + if ((r_ptr->flags & RF_FORCE_MAXHP) || (r_ptr->hside == 1)) { sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside); } @@ -1491,22 +1492,19 @@ static void spoil_mon_info(cptr fname) monster_race *r_ptr = &r_info[n]; /* Extract the flags */ - auto const flags1 = r_ptr->flags1; - auto const flags2 = r_ptr->flags2; - auto const flags3 = r_ptr->flags3; - auto const flags9 = r_ptr->flags9; + auto const flags = r_ptr->flags; auto const spells = r_ptr->spells; breath = FALSE; magic = FALSE; /* Extract a gender (if applicable) */ - if (flags1 & RF1_FEMALE) msex = 2; - else if (flags1 & RF1_MALE) msex = 1; + if (flags & RF_FEMALE) msex = 2; + else if (flags & RF_MALE) msex = 1; else msex = 0; /* Prefix */ - if (flags1 & RF1_UNIQUE) + if (flags & RF_UNIQUE) { spoil_out("[U] "); } @@ -1555,7 +1553,7 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); /* Hitpoints */ - if ((flags1 & RF1_FORCE_MAXHP) || (r_ptr->hside == 1)) + if ((flags & RF_FORCE_MAXHP) || (r_ptr->hside == 1)) { sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside); } @@ -1581,31 +1579,31 @@ static void spoil_mon_info(cptr fname) spoil_out("This"); - if (flags2 & RF2_ELDRITCH_HORROR) spoil_out (" sanity-blasting"); - if (flags3 & RF3_ANIMAL) spoil_out(" natural"); - if (flags3 & RF3_EVIL) spoil_out(" evil"); - if (flags3 & RF3_GOOD) spoil_out(" good"); - if (flags3 & RF3_UNDEAD) spoil_out(" undead"); - - if (flags3 & RF3_DRAGON) spoil_out(" dragon"); - else if (flags3 & RF3_DEMON) spoil_out(" demon"); - else if (flags3 & RF3_GIANT) spoil_out(" giant"); - else if (flags3 & RF3_TROLL) spoil_out(" troll"); - else if (flags3 & RF3_ORC) spoil_out(" orc"); - else if (flags3 & RF3_THUNDERLORD) spoil_out (" Thunderlord"); + if (flags & RF_ELDRITCH_HORROR) spoil_out (" sanity-blasting"); + if (flags & RF_ANIMAL) spoil_out(" natural"); + if (flags & RF_EVIL) spoil_out(" evil"); + if (flags & RF_GOOD) spoil_out(" good"); + if (flags & RF_UNDEAD) spoil_out(" undead"); + + if (flags & RF_DRAGON) spoil_out(" dragon"); + else if (flags & RF_DEMON) spoil_out(" demon"); + else if (flags & RF_GIANT) spoil_out(" giant"); + else if (flags & RF_TROLL) spoil_out(" troll"); + else if (flags & RF_ORC) spoil_out(" orc"); + else if (flags & RF_THUNDERLORD) spoil_out (" Thunderlord"); else spoil_out(" creature"); spoil_out(" moves"); - if ((flags1 & (RF1_RAND_50)) && (flags1 & (RF1_RAND_25))) + if ((flags & RF_RAND_50) && (flags & RF_RAND_25)) { spoil_out(" extremely erratically"); } - else if (flags1 & (RF1_RAND_50)) + else if (flags & RF_RAND_50) { spoil_out(" somewhat erratically"); } - else if (flags1 & (RF1_RAND_25)) + else if (flags & RF_RAND_25) { spoil_out(" a bit erratically"); } @@ -1614,52 +1612,52 @@ static void spoil_mon_info(cptr fname) spoil_out(" normally"); } - if (flags1 & RF1_NEVER_MOVE) + if (flags & RF_NEVER_MOVE) { spoil_out(", but does not deign to chase intruders"); } spoil_out(". "); - if (!r_ptr->level || (flags1 & RF1_FORCE_DEPTH)) + if (!r_ptr->level || (flags & RF_FORCE_DEPTH)) { sprintf(buf, "%s is never found out of depth. ", wd_che[msex]); spoil_out(buf); } - if (flags1 & RF1_FORCE_SLEEP) + if (flags & RF_FORCE_SLEEP) { sprintf(buf, "%s is always created sluggish. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & RF2_AURA_FIRE) + if (flags & RF_AURA_FIRE) { sprintf(buf, "%s is surrounded by flames. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & RF2_AURA_ELEC) + if (flags & RF_AURA_ELEC) { sprintf(buf, "%s is surrounded by electricity. ", wd_che[msex]); spoil_out(buf); } - if (flags2 & RF2_REFLECTING) + if (flags & RF_REFLECTING) { sprintf(buf, "%s reflects bolt spells. ", wd_che[msex]); spoil_out(buf); } - if (flags1 & RF1_ESCORT) + if (flags & RF_ESCORT) { sprintf(buf, "%s usually appears with ", wd_che[msex]); spoil_out(buf); - if (flags1 & RF1_ESCORTS) spoil_out("escorts. "); + if (flags & RF_ESCORTS) spoil_out("escorts. "); else spoil_out("an escort. "); } - if ((flags1 & RF1_FRIEND) || (flags1 & RF1_FRIENDS)) + if ((flags & RF_FRIEND) || (flags & RF_FRIENDS)) { sprintf(buf, "%s usually appears in groups. ", wd_che[msex]); spoil_out(buf); @@ -1723,7 +1721,7 @@ static void spoil_mon_info(cptr fname) else spoil_out(" or "); spoil_out(vp[i]); } - if (flags2 & RF2_POWERFUL) spoil_out(" powerfully"); + if (flags & RF_POWERFUL) spoil_out(" powerfully"); } /* Collect spells */ @@ -1810,7 +1808,7 @@ static void spoil_mon_info(cptr fname) } spoil_out(" magical, casting spells"); - if (flags2 & RF2_SMART) spoil_out(" intelligently"); + if (flags & RF_SMART) spoil_out(" intelligently"); for (i = 0; i < vn; i++) { @@ -1831,15 +1829,15 @@ static void spoil_mon_info(cptr fname) /* Collect special abilities. */ vn = 0; - if (flags2 & RF2_OPEN_DOOR) vp[vn++] = "open doors"; - if (flags2 & RF2_BASH_DOOR) vp[vn++] = "bash down doors"; - if (flags2 & RF2_PASS_WALL) vp[vn++] = "pass through walls"; - if (flags2 & RF2_KILL_WALL) vp[vn++] = "bore through walls"; - if (flags2 & RF2_MOVE_BODY) vp[vn++] = "push past weaker monsters"; - if (flags2 & RF2_KILL_BODY) vp[vn++] = "destroy weaker monsters"; - if (flags2 & RF2_TAKE_ITEM) vp[vn++] = "pick up objects"; - if (flags2 & RF2_KILL_ITEM) vp[vn++] = "destroy objects"; - if (flags9 & RF9_HAS_LITE) vp[vn++] = "illuminate the dungeon"; + if (flags & RF_OPEN_DOOR) vp[vn++] = "open doors"; + if (flags & RF_BASH_DOOR) vp[vn++] = "bash down doors"; + if (flags & RF_PASS_WALL) vp[vn++] = "pass through walls"; + if (flags & RF_KILL_WALL) vp[vn++] = "bore through walls"; + if (flags & RF_MOVE_BODY) vp[vn++] = "push past weaker monsters"; + if (flags & RF_KILL_BODY) vp[vn++] = "destroy weaker monsters"; + if (flags & RF_TAKE_ITEM) vp[vn++] = "pick up objects"; + if (flags & RF_KILL_ITEM) vp[vn++] = "destroy objects"; + if (flags & RF_HAS_LITE) vp[vn++] = "illuminate the dungeon"; if (vn) { @@ -1854,22 +1852,22 @@ static void spoil_mon_info(cptr fname) spoil_out(". "); } - if (flags2 & RF2_INVISIBLE) + if (flags & RF_INVISIBLE) { spoil_out(wd_che[msex]); spoil_out(" is invisible. "); } - if (flags2 & RF2_COLD_BLOOD) + if (flags & RF_COLD_BLOOD) { spoil_out(wd_che[msex]); spoil_out(" is cold blooded. "); } - if (flags2 & RF2_EMPTY_MIND) + if (flags & RF_EMPTY_MIND) { spoil_out(wd_che[msex]); spoil_out(" is not detected by telepathy. "); } - if (flags2 & RF2_WEIRD_MIND) + if (flags & RF_WEIRD_MIND) { spoil_out(wd_che[msex]); spoil_out(" is rarely detected by telepathy. "); @@ -1879,7 +1877,7 @@ static void spoil_mon_info(cptr fname) spoil_out(wd_che[msex]); spoil_out(" breeds explosively. "); } - if (flags2 & RF2_REGENERATE) + if (flags & RF_REGENERATE) { spoil_out(wd_che[msex]); spoil_out(" regenerates quickly. "); @@ -1887,10 +1885,10 @@ static void spoil_mon_info(cptr fname) /* Collect susceptibilities */ vn = 0; - if (flags3 & RF3_HURT_ROCK) vp[vn++] = "rock remover"; - if (flags3 & RF3_HURT_LITE) vp[vn++] = "bright light"; - if (flags3 & RF3_SUSCEP_FIRE) vp[vn++] = "fire"; - if (flags3 & RF3_SUSCEP_COLD) vp[vn++] = "cold"; + if (flags & RF_HURT_ROCK) vp[vn++] = "rock remover"; + if (flags & RF_HURT_LITE) vp[vn++] = "bright light"; + if (flags & RF_SUSCEP_FIRE) vp[vn++] = "fire"; + if (flags & RF_SUSCEP_COLD) vp[vn++] = "cold"; if (vn) { @@ -1907,11 +1905,11 @@ static void spoil_mon_info(cptr fname) /* Collect immunities */ vn = 0; - if (flags3 & RF3_IM_ACID) vp[vn++] = "acid"; - if (flags3 & RF3_IM_ELEC) vp[vn++] = "lightning"; - if (flags3 & RF3_IM_FIRE) vp[vn++] = "fire"; - if (flags3 & RF3_IM_COLD) vp[vn++] = "cold"; - if (flags3 & RF3_IM_POIS) vp[vn++] = "poison"; + if (flags & RF_IM_ACID) vp[vn++] = "acid"; + if (flags & RF_IM_ELEC) vp[vn++] = "lightning"; + if (flags & RF_IM_FIRE) vp[vn++] = "fire"; + if (flags & RF_IM_COLD) vp[vn++] = "cold"; + if (flags & RF_IM_POIS) vp[vn++] = "poison"; if (vn) { @@ -1928,12 +1926,12 @@ static void spoil_mon_info(cptr fname) /* Collect resistances */ vn = 0; - if (flags3 & RF3_RES_NETH) vp[vn++] = "nether"; - if (flags3 & RF3_RES_WATE) vp[vn++] = "water"; - if (flags3 & RF3_RES_PLAS) vp[vn++] = "plasma"; - if (flags3 & RF3_RES_NEXU) vp[vn++] = "nexus"; - if (flags3 & RF3_RES_DISE) vp[vn++] = "disenchantment"; - if (flags3 & RF3_RES_TELE) vp[vn++] = "teleportation"; + if (flags & RF_RES_NETH) vp[vn++] = "nether"; + if (flags & RF_RES_WATE) vp[vn++] = "water"; + if (flags & RF_RES_PLAS) vp[vn++] = "plasma"; + if (flags & RF_RES_NEXU) vp[vn++] = "nexus"; + if (flags & RF_RES_DISE) vp[vn++] = "disenchantment"; + if (flags & RF_RES_TELE) vp[vn++] = "teleportation"; if (vn) { @@ -1950,10 +1948,10 @@ static void spoil_mon_info(cptr fname) /* Collect non-effects */ vn = 0; - if (flags3 & RF3_NO_STUN) vp[vn++] = "stunned"; - if (flags3 & RF3_NO_FEAR) vp[vn++] = "frightened"; - if (flags3 & RF3_NO_CONF) vp[vn++] = "confused"; - if (flags3 & RF3_NO_SLEEP) vp[vn++] = "slept"; + if (flags & RF_NO_STUN) vp[vn++] = "stunned"; + if (flags & RF_NO_FEAR) vp[vn++] = "frightened"; + if (flags & RF_NO_CONF) vp[vn++] = "confused"; + if (flags & RF_NO_SLEEP) vp[vn++] = "slept"; if (vn) { @@ -1986,12 +1984,12 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); i = 0; - if (flags1 & (RF1_DROP_60)) i += 1; - if (flags1 & (RF1_DROP_90)) i += 2; - if (flags1 & (RF1_DROP_1D2)) i += 2; - if (flags1 & (RF1_DROP_2D2)) i += 4; - if (flags1 & (RF1_DROP_3D2)) i += 6; - if (flags1 & (RF1_DROP_4D2)) i += 8; + if (flags & RF_DROP_60) i += 1; + if (flags & RF_DROP_90) i += 2; + if (flags & RF_DROP_1D2) i += 2; + if (flags & RF_DROP_2D2) i += 4; + if (flags & RF_DROP_3D2) i += 6; + if (flags & RF_DROP_4D2) i += 8; /* Drops gold and/or items */ if (i) @@ -2015,24 +2013,24 @@ static void spoil_mon_info(cptr fname) spoil_out(buf); } - if (flags1 & RF1_DROP_GREAT) + if (flags & RF_DROP_GREAT) { if (sin) spoil_out("n"); spoil_out(" exceptional object"); } - else if (flags1 & RF1_DROP_GOOD) + else if (flags & RF_DROP_GOOD) { spoil_out(" good object"); } - else if (flags1 & RF1_DROP_USEFUL) + else if (flags & RF_DROP_USEFUL) { spoil_out(" useful object"); } - else if (flags1 & RF1_ONLY_ITEM) + else if (flags & RF_ONLY_ITEM) { spoil_out(" object"); } - else if (flags1 & RF1_ONLY_GOLD) + else if (flags & RF_ONLY_GOLD) { spoil_out(" treasure"); } @@ -2045,7 +2043,7 @@ static void spoil_mon_info(cptr fname) } if (i > 1) spoil_out("s"); - if (flags1 & RF1_DROP_CHOSEN) + if (flags & RF_DROP_CHOSEN) { spoil_out(", in addition to chosen objects"); } @@ -2292,7 +2290,7 @@ static void spoil_mon_info(cptr fname) { spoil_out(". "); } - else if (flags1 & RF1_NEVER_BLOW) + else if (flags & RF_NEVER_BLOW) { sprintf(buf, "%s has no physical attacks. ", wd_che[msex]); spoil_out(buf); diff --git a/src/xtra1.cc b/src/xtra1.cc index 8815e756..db057278 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -26,6 +26,7 @@ #include "monster1.hpp" #include "monster2.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" @@ -1401,7 +1402,7 @@ static void fix_m_list(void) if (m_ptr->hp < 0) continue; /* Skip unseen monsters */ - if (r_ptr->flags9 & RF9_MIMIC) + if (r_ptr->flags & RF_MIMIC) { /* Acquire object */ object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; @@ -1441,7 +1442,7 @@ static void fix_m_list(void) if (!r_ptr->total_visible) continue; /* Uniques */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { attr = TERM_L_BLUE; } @@ -1453,7 +1454,7 @@ static void fix_m_list(void) { attr = TERM_VIOLET; - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { attr = TERM_RED; } @@ -1461,7 +1462,7 @@ static void fix_m_list(void) } else { - if (!(r_ptr->flags1 & RF1_UNIQUE)) attr = TERM_GREEN; + if (!(r_ptr->flags & RF_UNIQUE)) attr = TERM_GREEN; } @@ -2055,13 +2056,13 @@ void calc_wield_monster() { r_ptr = &r_info[o_ptr->pval]; - if (r_ptr->flags2 & RF2_INVISIBLE) + if (r_ptr->flags & RF_INVISIBLE) p_ptr->invis += 20; - if (r_ptr->flags2 & RF2_REFLECTING) + if (r_ptr->flags & RF_REFLECTING) p_ptr->reflect = TRUE; - if (r_ptr->flags7 & RF7_CAN_FLY) + if (r_ptr->flags & RF_CAN_FLY) p_ptr->ffall = TRUE; - if (r_ptr->flags7 & RF7_AQUATIC) + if (r_ptr->flags & RF_AQUATIC) p_ptr->water_breath = TRUE; } } @@ -2207,29 +2208,29 @@ void calc_body_bonus() p_ptr->ac += r_ptr->ac; p_ptr->pspeed = r_ptr->speed; - if (r_ptr->flags1 & RF1_NEVER_MOVE) p_ptr->immovable = TRUE; - if (r_ptr->flags2 & RF2_STUPID) p_ptr->stat_add[A_INT] -= 1; - if (r_ptr->flags2 & RF2_SMART) p_ptr->stat_add[A_INT] += 1; - if (r_ptr->flags2 & RF2_REFLECTING) p_ptr->reflect = TRUE; - if (r_ptr->flags2 & RF2_INVISIBLE) p_ptr->invis += 20; - if (r_ptr->flags2 & RF2_REGENERATE) p_ptr->regenerate = TRUE; - if (r_ptr->flags2 & RF2_AURA_FIRE) p_ptr->sh_fire = TRUE; - if (r_ptr->flags2 & RF2_AURA_ELEC) p_ptr->sh_elec = TRUE; - if (r_ptr->flags2 & RF2_PASS_WALL) p_ptr->wraith_form = TRUE; - if (r_ptr->flags3 & RF3_SUSCEP_FIRE) p_ptr->sensible_fire = TRUE; - if (r_ptr->flags3 & RF3_IM_ACID) p_ptr->resist_acid = TRUE; - if (r_ptr->flags3 & RF3_IM_ELEC) p_ptr->resist_elec = TRUE; - if (r_ptr->flags3 & RF3_IM_FIRE) p_ptr->resist_fire = TRUE; - if (r_ptr->flags3 & RF3_IM_POIS) p_ptr->resist_pois = TRUE; - if (r_ptr->flags3 & RF3_IM_COLD) p_ptr->resist_cold = TRUE; - if (r_ptr->flags3 & RF3_RES_NETH) p_ptr->resist_neth = TRUE; - if (r_ptr->flags3 & RF3_RES_NEXU) p_ptr->resist_nexus = TRUE; - if (r_ptr->flags3 & RF3_RES_DISE) p_ptr->resist_disen = TRUE; - if (r_ptr->flags3 & RF3_NO_FEAR) p_ptr->resist_fear = TRUE; - if (r_ptr->flags3 & RF3_NO_SLEEP) p_ptr->free_act = TRUE; - if (r_ptr->flags3 & RF3_NO_CONF) p_ptr->resist_conf = TRUE; - if (r_ptr->flags7 & RF7_CAN_FLY) p_ptr->ffall = TRUE; - if (r_ptr->flags7 & RF7_AQUATIC) p_ptr->water_breath = TRUE; + if (r_ptr->flags & RF_NEVER_MOVE) p_ptr->immovable = TRUE; + if (r_ptr->flags & RF_STUPID) p_ptr->stat_add[A_INT] -= 1; + if (r_ptr->flags & RF_SMART) p_ptr->stat_add[A_INT] += 1; + if (r_ptr->flags & RF_REFLECTING) p_ptr->reflect = TRUE; + if (r_ptr->flags & RF_INVISIBLE) p_ptr->invis += 20; + if (r_ptr->flags & RF_REGENERATE) p_ptr->regenerate = TRUE; + if (r_ptr->flags & RF_AURA_FIRE) p_ptr->sh_fire = TRUE; + if (r_ptr->flags & RF_AURA_ELEC) p_ptr->sh_elec = TRUE; + if (r_ptr->flags & RF_PASS_WALL) p_ptr->wraith_form = TRUE; + if (r_ptr->flags & RF_SUSCEP_FIRE) p_ptr->sensible_fire = TRUE; + if (r_ptr->flags & RF_IM_ACID) p_ptr->resist_acid = TRUE; + if (r_ptr->flags & RF_IM_ELEC) p_ptr->resist_elec = TRUE; + if (r_ptr->flags & RF_IM_FIRE) p_ptr->resist_fire = TRUE; + if (r_ptr->flags & RF_IM_POIS) p_ptr->resist_pois = TRUE; + if (r_ptr->flags & RF_IM_COLD) p_ptr->resist_cold = TRUE; + if (r_ptr->flags & RF_RES_NETH) p_ptr->resist_neth = TRUE; + if (r_ptr->flags & RF_RES_NEXU) p_ptr->resist_nexus = TRUE; + if (r_ptr->flags & RF_RES_DISE) p_ptr->resist_disen = TRUE; + if (r_ptr->flags & RF_NO_FEAR) p_ptr->resist_fear = TRUE; + if (r_ptr->flags & RF_NO_SLEEP) p_ptr->free_act = TRUE; + if (r_ptr->flags & RF_NO_CONF) p_ptr->resist_conf = TRUE; + if (r_ptr->flags & RF_CAN_FLY) p_ptr->ffall = TRUE; + if (r_ptr->flags & RF_AQUATIC) p_ptr->water_breath = TRUE; } diff --git a/src/xtra2.cc b/src/xtra2.cc index 4f853928..222d12cd 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -27,6 +27,7 @@ #include "monster3.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "monster_race_flag.hpp" #include "monster_type.hpp" #include "notes.hpp" #include "object1.hpp" @@ -2182,13 +2183,13 @@ void place_corpse(monster_type *m_ptr) auto const r_ptr = m_ptr->race(); /* It has a physical form */ - if (r_ptr->flags9 & RF9_DROP_CORPSE) + if (r_ptr->flags & RF_DROP_CORPSE) { /* Wipe the object */ object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_CORPSE)); /* Unique corpses are unique */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { object_aware(i_ptr); i_ptr->name1 = 201; @@ -2218,13 +2219,13 @@ void place_corpse(monster_type *m_ptr) } /* The creature is an animated skeleton. */ - if (!(r_ptr->flags9 & RF9_DROP_CORPSE) && (r_ptr->flags9 & RF9_DROP_SKELETON)) + if (!(r_ptr->flags & RF_DROP_CORPSE) && (r_ptr->flags & RF_DROP_SKELETON)) { /* Wipe the object */ object_prep(i_ptr, lookup_kind(TV_CORPSE, SV_CORPSE_SKELETON)); /* Unique corpses are unique */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { object_aware(i_ptr); i_ptr->name1 = 201; @@ -2520,7 +2521,7 @@ void monster_death(int m_idx) } /* If the doppleganger die, the variable must be set accordingly */ - if (r_ptr->flags9 & RF9_DOPPLEGANGER) doppleganger = 0; + if (r_ptr->flags & RF_DOPPLEGANGER) doppleganger = 0; /* Need copy of object list since we're going to mutate it */ auto const object_idxs(m_ptr->hold_o_idxs); @@ -2671,7 +2672,7 @@ void monster_death(int m_idx) } /* Mega-Hack -- drop "winner" treasures */ - else if (r_ptr->flags1 & RF1_DROP_CHOSEN) + else if (r_ptr->flags & RF_DROP_CHOSEN) { if (strstr(r_ptr->name, "Morgoth, Lord of Darkness")) { @@ -2733,7 +2734,7 @@ void monster_death(int m_idx) /* Drop it in the dungeon */ drop_near(q_ptr, -1, y, x); } - else if (r_ptr->flags7 & RF7_NAZGUL) + else if (r_ptr->flags & RF_NAZGUL) { /* Get local object */ q_ptr = &forge; @@ -2818,7 +2819,7 @@ void monster_death(int m_idx) } /* Hack - the protected monsters must be advanged */ - else if (r_ptr->flags9 & RF9_WYRM_PROTECT) + else if (r_ptr->flags & RF_WYRM_PROTECT) { int xx = x, yy = y; int attempts = 100; @@ -3036,7 +3037,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) if (health_who == m_idx) p_ptr->redraw |= (PR_FRAME); /* Some mosnters are immune to death */ - if (r_ptr->flags7 & RF7_NO_DEATH) return FALSE; + if (r_ptr->flags & RF_NO_DEATH) return FALSE; /* Wake it up */ m_ptr->csleep = 0; @@ -3060,7 +3061,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) /* Extract monster name */ monster_desc(m_name, m_ptr, 0); - if ((r_ptr->flags7 & RF7_DG_CURSE) && (randint(2) == 1)) + if ((r_ptr->flags & RF_DG_CURSE) && (randint(2) == 1)) { int curses = 2 + randint(5); @@ -3074,7 +3075,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) while (--curses); } - if (r_ptr->flags2 & RF2_CAN_SPEAK) + if (r_ptr->flags & RF_CAN_SPEAK) { char line_got[80]; /* Dump a message */ @@ -3100,10 +3101,10 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Death by Physical attack -- non-living monster */ - else if ((r_ptr->flags3 & RF3_DEMON) || - (r_ptr->flags3 & RF3_UNDEAD) || - (r_ptr->flags2 & RF2_STUPID) || - (r_ptr->flags3 & RF3_NONLIVING) || + else if ((r_ptr->flags & RF_DEMON) || + (r_ptr->flags & RF_UNDEAD) || + (r_ptr->flags & RF_STUPID) || + (r_ptr->flags & RF_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { cmsg_format(TERM_L_RED, "You have destroyed %s.", m_name); @@ -3164,7 +3165,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* When the player kills a Unique, it stays dead */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { r_ptr->max_num = 0; } @@ -3173,7 +3174,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) monster_death(m_idx); /* Eru doesn't appreciate good monster death */ - if (r_ptr->flags3 & RF3_GOOD) + if (r_ptr->flags & RF_GOOD) { inc_piety(GOD_ERU, -7 * m_ptr->level); inc_piety(GOD_MANWE, -10 * m_ptr->level); @@ -3185,7 +3186,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Manwe appreciate evil monster death */ - if (r_ptr->flags3 & RF3_EVIL) + if (r_ptr->flags & RF_EVIL) { int inc = std::max(1, m_ptr->level / 2); @@ -3201,7 +3202,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) if (praying_to(GOD_TULKAS)) { inc_piety(GOD_TULKAS, inc / 2); - if (r_ptr->flags3 & RF3_DEMON) + if (r_ptr->flags & RF_DEMON) { inc_piety(GOD_TULKAS, inc); } @@ -3209,7 +3210,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Yavanna likes when corruption is destroyed */ - if ((r_ptr->flags3 & RF3_NONLIVING) || (r_ptr->flags3 & RF3_DEMON) || (r_ptr->flags3 & RF3_UNDEAD)) + if ((r_ptr->flags & RF_NONLIVING) || (r_ptr->flags & RF_DEMON) || (r_ptr->flags & RF_UNDEAD)) { int inc = std::max(1, m_ptr->level / 2); inc_piety(GOD_YAVANNA, inc); @@ -3222,12 +3223,12 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) inc_piety(GOD_YAVANNA, -inc); /* Killing animals in her name is a VERY bad idea */ - if (r_ptr->flags3 & RF3_ANIMAL) + if (r_ptr->flags & RF_ANIMAL) inc_piety(GOD_YAVANNA, -(inc * 3)); } /* SHould we absorb its soul? */ - if (p_ptr->absorb_soul && (!(r_ptr->flags3 & RF3_UNDEAD)) && (!(r_ptr->flags3 & RF3_NONLIVING))) + if (p_ptr->absorb_soul && (!(r_ptr->flags & RF_UNDEAD)) && (!(r_ptr->flags & RF_NONLIVING))) { msg_print("You absorb the life of the dying soul."); hp_player(1 + (m_ptr->level / 2) + get_skill_scale(SKILL_NECROMANCY, 40)); @@ -3237,7 +3238,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) * XXX XXX XXX Mega-Hack -- Remove random quest rendered * impossible */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { int i; @@ -3265,7 +3266,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Make note of unique kills */ - if (r_ptr->flags1 & RF1_UNIQUE) + if (r_ptr->flags & RF_UNIQUE) { char note[80]; @@ -3276,7 +3277,7 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) } /* Recall even invisible uniques or winners */ - if (m_ptr->ml || (r_ptr->flags1 & RF1_UNIQUE)) + if (m_ptr->ml || (r_ptr->flags & RF_UNIQUE)) { /* Count kills this life */ if (r_ptr->r_pkills < MAX_SHORT) r_ptr->r_pkills++; @@ -3620,9 +3621,9 @@ static cptr look_mon_desc(int m_idx) /* Determine if the monster is "living" (vs "undead") */ monster_type *m_ptr = &m_list[m_idx]; auto const r_ptr = m_ptr->race(); - if (r_ptr->flags3 & RF3_UNDEAD) living = FALSE; - if (r_ptr->flags3 & RF3_DEMON) living = FALSE; - if (r_ptr->flags3 & RF3_NONLIVING) living = FALSE; + if (r_ptr->flags & RF_UNDEAD) living = FALSE; + if (r_ptr->flags & RF_DEMON) living = FALSE; + if (r_ptr->flags & RF_NONLIVING) living = FALSE; if (strchr("Egv", r_ptr->d_char)) living = FALSE; @@ -3696,7 +3697,7 @@ static bool target_able(int m_idx) if (is_friend(m_ptr) > 0) return (FALSE); /* Honor flag */ - if (r_info[m_ptr->r_idx].flags7 & RF7_NO_TARGET) return (FALSE); + if (r_info[m_ptr->r_idx].flags & RF_NO_TARGET) return (FALSE); /* XXX XXX XXX Hack -- Never target trappers */ /* if (CLEAR_ATTR && (CLEAR_CHAR)) return (FALSE); */ @@ -4014,7 +4015,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const r_ptr = m_ptr->race(); /* Mimics special treatment -- looks like an object */ - if ((r_ptr->flags9 & RF9_MIMIC) && (m_ptr->csleep)) + if ((r_ptr->flags & RF_MIMIC) && (m_ptr->csleep)) { /* Acquire object */ object_type *o_ptr = &o_list[m_ptr->mimic_o_idx()]; @@ -4137,8 +4138,8 @@ static int target_set_aux(int y, int x, int mode, cptr info) s1 = "It is "; /* Hack -- take account of gender */ - if (r_ptr->flags1 & RF1_FEMALE) s1 = "She is "; - else if (r_ptr->flags1 & RF1_MALE) s1 = "He is "; + if (r_ptr->flags & RF_FEMALE) s1 = "She is "; + else if (r_ptr->flags & RF_MALE) s1 = "He is "; /* Use a preposition */ s2 = "carrying "; @@ -5267,9 +5268,9 @@ void make_wish(void) if (!r_ptr->name) continue; - if (r_ptr->flags9 & RF9_SPECIAL_GENE) continue; - if (r_ptr->flags9 & RF9_NEVER_GENE) continue; - if (r_ptr->flags1 & RF1_UNIQUE) continue; + if (r_ptr->flags & RF_SPECIAL_GENE) continue; + if (r_ptr->flags & RF_NEVER_GENE) continue; + if (r_ptr->flags & RF_UNIQUE) continue; sprintf(buf, "%s", r_ptr->name); strlower(buf); -- cgit v1.2.3 From c4a8fd220d2742e521f0d96ea3d8cb7e9375bcb4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change object_kind to non-POD type --- src/init2.cc | 2 +- src/object_kind.hpp | 84 ++++++++++++++++++++++++++--------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index d0bf5697..86a0ab1e 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -293,7 +293,7 @@ namespace { static void allocate() { - k_info = make_array(max_k_idx); + k_info = new object_kind[max_k_idx]; } static errr parse(FILE *fp) diff --git a/src/object_kind.hpp b/src/object_kind.hpp index 505f54d9..767c7e05 100644 --- a/src/object_kind.hpp +++ b/src/object_kind.hpp @@ -14,70 +14,70 @@ constexpr int ALLOCATION_MAX = 8; */ struct object_kind { - const char *name; /* Name */ - char *text; /* Text */ + const char *name = nullptr; /* Name */ + char *text = nullptr; /* Text */ - byte tval; /* Object type */ - byte sval; /* Object sub type */ + byte tval = 0; /* Object type */ + byte sval = 0; /* Object sub type */ - s32b pval; /* Object extra info */ - s32b pval2; /* Object extra info */ + s32b pval = 0; /* Object extra info */ + s32b pval2 = 0; /* Object extra info */ - s16b to_h; /* Bonus to hit */ - s16b to_d; /* Bonus to damage */ - s16b to_a; /* Bonus to armor */ + s16b to_h = 0; /* Bonus to hit */ + s16b to_d = 0; /* Bonus to damage */ + s16b to_a = 0; /* Bonus to armor */ - s16b activate; /* Activation number */ + s16b activate = 0; /* Activation number */ - s16b ac; /* Base armor */ + s16b ac = 0; /* Base armor */ - byte dd, ds; /* Damage dice/sides */ + byte dd = 0; /* Damage dice */ + byte ds = 0; /* Damage sides */ - s32b weight; /* Weight */ + s32b weight = 0; /* Weight */ - s32b cost; /* Object "base cost" */ + s32b cost = 0; /* Object "base cost" */ - u32b flags1; /* Flags, set 1 */ - u32b flags2; /* Flags, set 2 */ - u32b flags3; /* Flags, set 3 */ - u32b flags4; /* Flags, set 4 */ - u32b flags5; /* Flags, set 5 */ + u32b flags1 = 0; /* Flags, set 1 */ + u32b flags2 = 0; /* Flags, set 2 */ + u32b flags3 = 0; /* Flags, set 3 */ + u32b flags4 = 0; /* Flags, set 4 */ + u32b flags5 = 0; /* Flags, set 5 */ - u32b oflags1; /* Obvious Flags, set 1 */ - u32b oflags2; /* Obvious Flags, set 2 */ - u32b oflags3; /* Obvious Flags, set 3 */ - u32b oflags4; /* Obvious Flags, set 4 */ - u32b oflags5; /* Obvious Flags, set 5 */ + u32b oflags1 = 0; /* Obvious Flags, set 1 */ + u32b oflags2 = 0; /* Obvious Flags, set 2 */ + u32b oflags3 = 0; /* Obvious Flags, set 3 */ + u32b oflags4 = 0; /* Obvious Flags, set 4 */ + u32b oflags5 = 0; /* Obvious Flags, set 5 */ - byte locale[ALLOCATION_MAX]; /* Allocation level(s) */ - byte chance[ALLOCATION_MAX]; /* Allocation chance(s) */ + byte locale[ALLOCATION_MAX] = { 0 }; /* Allocation level(s) */ + byte chance[ALLOCATION_MAX] = { 0 }; /* Allocation chance(s) */ - byte level; /* Level */ + byte level = 0; /* Level */ - byte d_attr; /* Default object attribute */ - char d_char; /* Default object character */ + byte d_attr = 0; /* Default object attribute */ + char d_char = 0; /* Default object character */ - byte x_attr; /* Desired object attribute */ - char x_char; /* Desired object character */ + byte x_attr = 0; /* Desired object attribute */ + char x_char = 0; /* Desired object character */ - byte flavor; /* Special object flavor (or zero) */ + byte flavor = 0; /* Special object flavor (or zero) */ - bool_ easy_know; /* This object is always known (if aware) */ + bool_ easy_know = 0; /* This object is always known (if aware) */ + bool_ aware = 0; /* The player is "aware" of the item's effects */ - bool_ aware; /* The player is "aware" of the item's effects */ + bool_ tried = 0; /* The player has "tried" one of the items */ - bool_ tried; /* The player has "tried" one of the items */ + u32b esp = 0; /* ESP flags */ + u32b oesp = 0; /* Obvious ESP flags */ - u32b esp; /* ESP flags */ - u32b oesp; /* Obvious ESP flags */ + byte btval = 0; /* Become Object type */ + byte bsval = 0; /* Become Object sub type */ + bool_ artifact = 0; /* Is it a normal artifact(already generated) */ - byte btval; /* Become Object type */ - byte bsval; /* Become Object sub type */ - bool_ artifact; /* Is it a normal artifact(already generated) */ - - s16b power; /* Power granted(if any) */ + s16b power = 0; /* Power granted(if any) */ }; -- cgit v1.2.3 From c263b67fbcd7ffdae13bbed8191106b6c1c80609 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change ego_item_type to non-POD type --- src/ego_item_type.hpp | 108 +++++++++++++++++++++++++------------------------- src/init2.cc | 2 +- 2 files changed, 56 insertions(+), 54 deletions(-) diff --git a/src/ego_item_type.hpp b/src/ego_item_type.hpp index f9b6970a..b5cf2781 100644 --- a/src/ego_item_type.hpp +++ b/src/ego_item_type.hpp @@ -12,57 +12,59 @@ constexpr int FLAG_RARITY_MAX = 6; */ struct ego_item_type { - const char *name; /* Name (offset) */ - - bool_ before; /* Before or after the object name ? */ - - byte tval[10]; - byte min_sval[10]; - byte max_sval[10]; - - byte rating; /* Rating boost */ - - byte level; /* Minimum level */ - byte rarity; /* Object rarity */ - byte mrarity; /* Object rarity */ - - s16b max_to_h; /* Maximum to-hit bonus */ - s16b max_to_d; /* Maximum to-dam bonus */ - s16b max_to_a; /* Maximum to-ac bonus */ - - s16b activate; /* Activation Number */ - - s32b max_pval; /* Maximum pval */ - - s32b cost; /* Ego-item "cost" */ - - byte rar[FLAG_RARITY_MAX]; - u32b flags1[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 1 */ - u32b flags2[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 2 */ - u32b flags3[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 3 */ - u32b flags4[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 4 */ - u32b flags5[FLAG_RARITY_MAX]; /* Ego-Item Flags, set 5 */ - u32b esp[FLAG_RARITY_MAX]; /* ESP flags */ - u32b oflags1[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 1 */ - u32b oflags2[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 2 */ - u32b oflags3[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 3 */ - u32b oflags4[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 4 */ - u32b oflags5[FLAG_RARITY_MAX]; /* Ego-Item Obvious Flags, set 5 */ - u32b oesp[FLAG_RARITY_MAX]; /* Obvious ESP flags */ - u32b fego[FLAG_RARITY_MAX]; /* ego flags */ - - u32b need_flags1; /* Ego-Item Flags, set 1 */ - u32b need_flags2; /* Ego-Item Flags, set 2 */ - u32b need_flags3; /* Ego-Item Flags, set 3 */ - u32b need_flags4; /* Ego-Item Flags, set 4 */ - u32b need_flags5; /* Ego-Item Flags, set 5 */ - u32b need_esp; /* ESP flags */ - u32b forbid_flags1; /* Ego-Item Flags, set 1 */ - u32b forbid_flags2; /* Ego-Item Flags, set 2 */ - u32b forbid_flags3; /* Ego-Item Flags, set 3 */ - u32b forbid_flags4; /* Ego-Item Flags, set 4 */ - u32b forbid_flags5; /* Ego-Item Flags, set 5 */ - u32b forbid_esp; /* ESP flags */ - - s16b power; /* Power granted(if any) */ + const char *name = nullptr; /* Name */ + + bool_ before = FALSE; /* Before or after the object name ? */ + + byte tval[10] = { 0 }; + byte min_sval[10] = { 0 }; + byte max_sval[10] = { 0 }; + + byte rating = 0; /* Rating boost */ + + byte level = 0; /* Minimum level */ + byte rarity = 0; /* Object rarity */ + byte mrarity = 0; /* Object rarity */ + + s16b max_to_h = 0; /* Maximum to-hit bonus */ + s16b max_to_d = 0; /* Maximum to-dam bonus */ + s16b max_to_a = 0; /* Maximum to-ac bonus */ + + s16b activate = 0; /* Activation Number */ + + s32b max_pval = 0; /* Maximum pval */ + + s32b cost = 0; /* Ego-item "cost" */ + + byte rar[FLAG_RARITY_MAX] = { 0 }; + + u32b flags1[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 1 */ + u32b flags2[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 2 */ + u32b flags3[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 3 */ + u32b flags4[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 4 */ + u32b flags5[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 5 */ + u32b esp[FLAG_RARITY_MAX] = { 0 }; /* ESP flags */ + u32b oflags1[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 1 */ + u32b oflags2[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 2 */ + u32b oflags3[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 3 */ + u32b oflags4[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 4 */ + u32b oflags5[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 5 */ + u32b oesp[FLAG_RARITY_MAX] = { 0 }; /* Obvious ESP flags */ + + u32b fego[FLAG_RARITY_MAX] = { 0 }; /* ego flags */ + + u32b need_flags1 = 0; /* Ego-Item Flags, set 1 */ + u32b need_flags2 = 0; /* Ego-Item Flags, set 2 */ + u32b need_flags3 = 0; /* Ego-Item Flags, set 3 */ + u32b need_flags4 = 0; /* Ego-Item Flags, set 4 */ + u32b need_flags5 = 0; /* Ego-Item Flags, set 5 */ + u32b need_esp = 0; /* ESP flags */ + u32b forbid_flags1 = 0; /* Ego-Item Flags, set 1 */ + u32b forbid_flags2 = 0; /* Ego-Item Flags, set 2 */ + u32b forbid_flags3 = 0; /* Ego-Item Flags, set 3 */ + u32b forbid_flags4 = 0; /* Ego-Item Flags, set 4 */ + u32b forbid_flags5 = 0; /* Ego-Item Flags, set 5 */ + u32b forbid_esp = 0; /* ESP flags */ + + s16b power = 0; /* Power granted, if any */ }; diff --git a/src/init2.cc b/src/init2.cc index 86a0ab1e..ec6cf9d7 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -373,7 +373,7 @@ namespace { static void allocate() { - e_info = make_array(max_e_idx); + e_info = new ego_item_type[max_e_idx]; } static errr parse(FILE *fp) -- cgit v1.2.3 From 8bc99186e42dbb1b1c0b840f982fe3af913c3e14 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change artifact_type to non-POD type --- src/artifact_type.hpp | 64 ++++++++++++++++++++++++++------------------------- src/init2.cc | 2 +- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/artifact_type.hpp b/src/artifact_type.hpp index 7a4340aa..ea962bc2 100644 --- a/src/artifact_type.hpp +++ b/src/artifact_type.hpp @@ -11,50 +11,52 @@ */ struct artifact_type { - char const *name; /* Artifact name */ - char *text; /* Artifact description */ + char const *name = nullptr; /* Artifact name */ + char *text = nullptr; /* Artifact description */ - byte tval; /* Artifact type */ - byte sval; /* Artifact sub type */ + byte tval = 0; /* Artifact type */ + byte sval = 0; /* Artifact sub type */ - s16b pval; /* Artifact extra info */ + s16b pval = 0; /* Artifact extra info */ - s16b to_h; /* Bonus to hit */ - s16b to_d; /* Bonus to damage */ - s16b to_a; /* Bonus to armor */ + s16b to_h = 0; /* Bonus to hit */ + s16b to_d = 0; /* Bonus to damage */ + s16b to_a = 0; /* Bonus to armor */ - s16b activate; /* Activation Number */ + s16b activate = 0; /* Activation Number */ - s16b ac; /* Base armor */ + s16b ac = 0; /* Base armor */ - byte dd, ds; /* Damage when hits */ + byte dd = 0; /* Damage dice */ + byte ds = 0; /* Damage sides */ - s16b weight; /* Weight */ + s16b weight = 0; /* Weight */ - s32b cost; /* Artifact "cost" */ + s32b cost = 0; /* Artifact "cost" */ - u32b flags1; /* Artifact Flags, set 1 */ - u32b flags2; /* Artifact Flags, set 2 */ - u32b flags3; /* Artifact Flags, set 3 */ - u32b flags4; /* Artifact Flags, set 4 */ - u32b flags5; /* Artifact Flags, set 5 */ + u32b flags1 = 0; /* Artifact Flags, set 1 */ + u32b flags2 = 0; /* Artifact Flags, set 2 */ + u32b flags3 = 0; /* Artifact Flags, set 3 */ + u32b flags4 = 0; /* Artifact Flags, set 4 */ + u32b flags5 = 0; /* Artifact Flags, set 5 */ - u32b oflags1; /* Obvious Flags, set 1 */ - u32b oflags2; /* Obvious Flags, set 2 */ - u32b oflags3; /* Obvious Flags, set 3 */ - u32b oflags4; /* Obvious Flags, set 4 */ - u32b oflags5; /* Obvious Flags, set 5 */ + u32b oflags1 = 0; /* Obvious Flags, set 1 */ + u32b oflags2 = 0; /* Obvious Flags, set 2 */ + u32b oflags3 = 0; /* Obvious Flags, set 3 */ + u32b oflags4 = 0; /* Obvious Flags, set 4 */ + u32b oflags5 = 0; /* Obvious Flags, set 5 */ - byte level; /* Artifact level */ - byte rarity; /* Artifact rarity */ + byte level = 0; /* Artifact level */ + byte rarity = 0; /* Artifact rarity */ - byte cur_num; /* Number created (0 or 1) */ - byte max_num; /* Unused (should be "1") */ + byte cur_num = 0; /* Number created (0 or 1) */ + byte max_num = 0; /* Unused (should be "1") */ - u32b esp; /* ESP flags */ - u32b oesp; /* ESP flags */ + u32b esp = 0; /* ESP flags */ + u32b oesp = 0; /* ESP flags */ - s16b power; /* Power granted(if any) */ + s16b power = 0; /* Power granted, if any */ + + s16b set = 0; /* Which set does it belong it, if any? */ - s16b set; /* Does it belongs to a set ?*/ }; diff --git a/src/init2.cc b/src/init2.cc index ec6cf9d7..54f455e3 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -325,7 +325,7 @@ namespace { static void allocate() { - a_info = make_array(max_a_idx); + a_info = new artifact_type[max_a_idx]; } static errr parse(FILE *fp) -- cgit v1.2.3 From fc06bedef3f5521a97989ebb6c7160744c640a19 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change set_type to non-POD type --- src/init1.cc | 7 +++---- src/init2.cc | 2 +- src/set_component.hpp | 20 ++++++++++++++++++++ src/set_type.hpp | 24 +++++++----------------- 4 files changed, 31 insertions(+), 22 deletions(-) create mode 100644 src/set_component.hpp diff --git a/src/init1.cc b/src/init1.cc index 327faca6..38736f0e 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3728,8 +3728,6 @@ errr init_set_info_txt(FILE *fp) /* Process 'N' for "New/Number/Name" */ if (buf[0] == 'N') { - int z, y; - /* Find the colon before the name */ s = strchr(buf + 2, ':'); @@ -3764,11 +3762,12 @@ errr init_set_info_txt(FILE *fp) /* Initialize */ set_ptr->num = 0; set_ptr->num_use = 0; - for (z = 0; z < 6; z++) + + 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 (y = 0; y < 6; y++) + 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; diff --git a/src/init2.cc b/src/init2.cc index 54f455e3..8bb9a25e 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -309,7 +309,7 @@ namespace { static void allocate() { - set_info = make_array(max_set_idx); + set_info = new set_type[max_set_idx]; } static errr parse(FILE *fp) diff --git a/src/set_component.hpp b/src/set_component.hpp new file mode 100644 index 00000000..ceb82cbd --- /dev/null +++ b/src/set_component.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "h-basic.h" + +#include +#include + +constexpr std::size_t SET_MAX_SIZE = 6; + +struct set_component { + bool_ present = FALSE; /* Is it actually wore ? */ + s16b a_idx = 0; /* What artifact? */ + std::array pval; /* Pval for each combination */ + std::array flags1; /* Flags */ + std::array flags2; /* Flags */ + std::array flags3; /* Flags */ + std::array flags4; /* Flags */ + std::array flags5; /* Flags */ + std::array esp; /* Flags */ +}; diff --git a/src/set_type.hpp b/src/set_type.hpp index 827c23ac..0a04b384 100644 --- a/src/set_type.hpp +++ b/src/set_type.hpp @@ -1,28 +1,18 @@ #pragma once -#include "h-basic.h" +#include +#include "set_component.hpp" /** * Item set descriptor and runtime information. */ struct set_type { - const char *name; /* Name */ - char *desc; /* Desc */ + const char *name = nullptr; /* Name */ + char *desc = nullptr; /* Desc */ - byte num; /* Number of artifacts used */ - byte num_use; /* Number actually wore */ + byte num = 0; /* Number of artifacts used */ + byte num_use = 0; /* Number actually worn */ - struct /* the various items */ - { - bool_ present; /* Is it actually wore ? */ - s16b a_idx; /* What artifact ? */ - s16b pval[6]; /* Pval for each combination */ - u32b flags1[6]; /* Flags */ - u32b flags2[6]; /* Flags */ - u32b flags3[6]; /* Flags */ - u32b flags4[6]; /* Flags */ - u32b flags5[6]; /* Flags */ - u32b esp[6]; /* Flags */ - } arts[6]; + std::array arts; }; -- cgit v1.2.3 From 61a9e3c08009d143def75765169ed844944c370e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Add "const" qualifiers --- src/object1.cc | 6 +++--- src/object1.hpp | 4 ++-- src/store.cc | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 1aaf2a6c..fd3ab769 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1092,7 +1092,7 @@ s32b calc_object_need_exp(object_type const *o_ptr) * 2 -- The Cloak of Death [1,+3] (+2 to Stealth) * 3 -- The Cloak of Death [1,+3] (+2 to Stealth) {nifty} */ -std::string object_desc_aux(object_type *o_ptr, int pref, int mode) +static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { bool_ hack_name = FALSE; @@ -2179,7 +2179,7 @@ std::string object_desc_aux(object_type *o_ptr, int pref, int mode) return t; } -void object_desc(char *buf, object_type *o_ptr, int pref, int mode) +void object_desc(char *buf, object_type const *o_ptr, int pref, int mode) { auto s = object_desc_aux(o_ptr, pref, mode); auto n = std::min(s.size(), 79); @@ -4154,7 +4154,7 @@ void display_equip(void) /* Get the color of the letter idx */ -byte get_item_letter_color(object_type *o_ptr) +byte get_item_letter_color(object_type const *o_ptr) { byte color = TERM_WHITE; diff --git a/src/object1.hpp b/src/object1.hpp index e5a17813..da4a6ead 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -8,7 +8,7 @@ typedef std::function(object_filter_t const &filter)> select_by_name_t; -extern byte get_item_letter_color(object_type *o_ptr); +extern byte get_item_letter_color(object_type const *o_ptr); extern void object_pickup(int this_o_idx); extern bool_ apply_set(s16b a_idx, s16b set_idx); extern bool_ takeoff_set(s16b a_idx, s16b set_idx); @@ -21,7 +21,7 @@ extern bool_ object_flags_no_set; extern void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); extern void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); extern s32b calc_object_need_exp(object_type const *o_ptr); -extern void object_desc(char *buf, object_type *o_ptr, int pref, int mode); +extern void object_desc(char *buf, object_type const *o_ptr, int pref, int mode); extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode); extern bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it); extern char index_to_label(int i); diff --git a/src/store.cc b/src/store.cc index d2947a7f..f2f92cd0 100644 --- a/src/store.cc +++ b/src/store.cc @@ -490,7 +490,7 @@ static void mass_produce(object_type *o_ptr) * * See "object_similar()" for the same function for the "player" */ -static bool_ store_object_similar(object_type *o_ptr, object_type *j_ptr) +static bool_ store_object_similar(object_type const *o_ptr, object_type *j_ptr) { /* Hack -- Identical items cannot be stacked */ if (o_ptr == j_ptr) return (0); -- cgit v1.2.3 From a6c2ddeb9253fdcf5c0ac6153f77fa65f4a72e2b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change store_type to non-POD type --- src/files.cc | 37 +++-- src/init2.cc | 10 +- src/loadsave.cc | 20 +-- src/store.cc | 400 ++++++++++++++++++++++------------------------------- src/store_type.hpp | 21 ++- 5 files changed, 211 insertions(+), 277 deletions(-) diff --git a/src/files.cc b/src/files.cc index 8758e692..a3dfe12a 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2482,17 +2482,16 @@ void file_character_print_item(FILE *fff, char label, object_type *obj, bool_ fu */ void file_character_print_store(FILE *fff, wilderness_type_info *place, int store, bool_ full) { - int i; town_type *town = &town_info[place->entrance]; store_type *st_ptr = &town->store[store]; - if (st_ptr->stock_num) + if (st_ptr->stock.size()) { /* Header with name of the town */ fprintf(fff, " [%s Inventory - %s]\n\n", st_info[store].name, place->name); /* Dump all available items */ - for (i = 0; i < st_ptr->stock_num; i++) + for (std::size_t i = 0; i < st_ptr->stock.size(); i++) { file_character_print_item(fff, I2A(i%24), &st_ptr->stock[i], full); } @@ -4211,14 +4210,10 @@ static void print_tomb(void) */ static void show_info(void) { - int i, j, k; - object_type *o_ptr; - store_type *st_ptr; - /* Hack -- Know everything in the inven/equip */ - for (i = 0; i < INVEN_TOTAL; i++) + for (int i = 0; i < INVEN_TOTAL; i++) { - o_ptr = &p_ptr->inventory[i]; + auto o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; @@ -4228,14 +4223,13 @@ static void show_info(void) object_known(o_ptr); } - for (i = 1; i < max_towns; i++) + /* Hack -- Know everything in the home */ + for (int i = 1; i < max_towns; i++) { - st_ptr = &town_info[i].store[7]; - - /* Hack -- Know everything in the home */ - for (j = 0; j < st_ptr->stock_num; j++) + auto st_ptr = &town_info[i].store[7]; + for (auto &o_ref: st_ptr->stock) { - o_ptr = &st_ptr->stock[j]; + auto o_ptr = &o_ref; /* Skip non-objects */ if (!o_ptr->k_idx) continue; @@ -4324,27 +4318,28 @@ static void show_info(void) } /* Homes in the different towns */ - for (k = 1; k < max_towns; k++) + for (int k = 1; k < max_towns; k++) { - st_ptr = &town_info[k].store[7]; + store_type *st_ptr = &town_info[k].store[7]; /* Home -- if anything there */ - if (st_ptr->stock_num) + if (!st_ptr->stock.empty()) { + std::size_t i; /* Display contents of the home */ - for (k = 0, i = 0; i < st_ptr->stock_num; k++) + for (k = 0, i = 0; i < st_ptr->stock.size(); k++) { /* Clear screen */ Term_clear(); /* Show 12 items */ - for (j = 0; (j < 12) && (i < st_ptr->stock_num); j++, i++) + for (int j = 0; (j < 12) && (i < st_ptr->stock.size()); j++, i++) { char o_name[80]; char tmp_val[80]; /* Acquire item */ - o_ptr = &st_ptr->stock[i]; + auto o_ptr = &st_ptr->stock[i]; /* Print header, clear line */ sprintf(tmp_val, "%c) ", I2A(j)); diff --git a/src/init2.cc b/src/init2.cc index 8bb9a25e..4201d214 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -26,6 +26,7 @@ #include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object_kind.hpp" +#include "object_type.hpp" #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -688,7 +689,7 @@ static errr init_towns(void) if (i <= max_real_towns) town_info[i].flags |= (TOWN_REAL); /* Allocate the stores */ - town_info[i].store = make_array(max_st_idx); + town_info[i].store = new store_type[max_st_idx]; /* Fill in each store */ for (j = 0; j < max_st_idx; j++) @@ -708,20 +709,19 @@ static errr init_towns(void) void create_stores_stock(int t) { - int j; town_type *t_ptr = &town_info[t]; if (t_ptr->stocked) return; - for (j = 0; j < max_st_idx; j++) + for (int j = 0; j < max_st_idx; j++) { store_type *st_ptr = &t_ptr->store[j]; /* Assume full stock */ st_ptr->stock_size = st_info[j].max_obj; - /* Allocate the stock */ - st_ptr->stock = make_array(st_ptr->stock_size); + /* Reserve space for stock */ + st_ptr->stock.reserve(st_ptr->stock_size); } t_ptr->stocked = TRUE; } diff --git a/src/loadsave.cc b/src/loadsave.cc index 32d401af..c42dd4b9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1688,7 +1688,10 @@ static void do_store(store_type *str, ls_flag_t flag) /* Could be cleaner, done this way for benefit of the for loop later on */ byte num; - if (flag == ls_flag_t::SAVE) num = str->stock_num; + if (flag == ls_flag_t::SAVE) + { + num = str->stock.size(); + } do_byte(&num, flag); /* Last visit */ @@ -1698,7 +1701,6 @@ static void do_store(store_type *str, ls_flag_t flag) for (int j = 0; j < num; j++) { if (flag == ls_flag_t::LOAD) - /* Can't this be cleaner? */ { object_type forge; /* Wipe the object */ @@ -1706,15 +1708,17 @@ static void do_store(store_type *str, ls_flag_t flag) /* Read the item */ do_item(&forge, ls_flag_t::LOAD); /* Acquire valid items */ - if ((str->stock_num < store_inven_max) && (str->stock_num < str->stock_size)) + if ((str->stock.size() < store_inven_max) && (str->stock.size() < str->stock_size)) { - int k = str->stock_num++; - - /* Acquire the item */ - object_copy(&str->stock[k], &forge); + object_type stock_obj; + object_copy(&stock_obj, &forge); + str->stock.push_back(stock_obj); } } - if (flag == ls_flag_t::SAVE) do_item(&str->stock[j], flag); + if (flag == ls_flag_t::SAVE) + { + do_item(&str->stock[j], flag); + } } } diff --git a/src/store.cc b/src/store.cc index f2f92cd0..041cf74c 100644 --- a/src/store.cc +++ b/src/store.cc @@ -583,24 +583,23 @@ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr) */ static bool_ store_check_num(object_type *o_ptr) { - int i; - object_type *j_ptr; - /* Free space is always usable */ - if (st_ptr->stock_num < st_ptr->stock_size) return TRUE; + if (st_ptr->stock.size() < st_ptr->stock_size) + { + return TRUE; + } /* The "home" acts like the player */ - if ((cur_store_num == 7) || - (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)) + if ((cur_store_num == 7) || (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)) { /* Check all the items */ - for (i = 0; i < st_ptr->stock_num; i++) + for (auto const &o_ref: st_ptr->stock) { - /* Get the existing item */ - j_ptr = &st_ptr->stock[i]; - /* Can the new object be combined with the old one? */ - if (object_similar(j_ptr, o_ptr)) return (TRUE); + if (object_similar(&o_ref, o_ptr)) + { + return TRUE; + } } } @@ -608,18 +607,18 @@ static bool_ store_check_num(object_type *o_ptr) else { /* Check all the items */ - for (i = 0; i < st_ptr->stock_num; i++) + for (auto const &o_ref: st_ptr->stock) { - /* Get the existing item */ - j_ptr = &st_ptr->stock[i]; - /* Can the new object be combined with the old one? */ - if (store_object_similar(j_ptr, o_ptr)) return (TRUE); + if (store_object_similar(&o_ref, o_ptr)) + { + return TRUE; + } } } /* But there was no room at the inn... */ - return (FALSE); + return FALSE; } @@ -868,17 +867,13 @@ static bool store_will_buy(object_type const *o_ptr) */ static int home_carry(object_type *o_ptr) { - int slot; - s32b value, j_value; - int i; - object_type *j_ptr; - + std::size_t slot; /* Check each existing item (try to combine) */ - for (slot = 0; slot < st_ptr->stock_num; slot++) + for (slot = 0; slot < st_ptr->stock.size(); slot++) { /* Get the existing item */ - j_ptr = &st_ptr->stock[slot]; + auto j_ptr = &st_ptr->stock[slot]; /* The home acts just like the player */ if (object_similar(j_ptr, o_ptr)) @@ -887,22 +882,24 @@ static int home_carry(object_type *o_ptr) object_absorb(j_ptr, o_ptr); /* All done */ - return (slot); + return slot; } } /* No space? */ - if (st_ptr->stock_num >= st_ptr->stock_size) return ( -1); - + if (st_ptr->stock.size() >= st_ptr->stock_size) + { + return -1; + } /* Determine the "value" of the item */ - value = object_value(o_ptr); + auto const value = object_value(o_ptr); /* Check existing slots to see if we must "slide" */ - for (slot = 0; slot < st_ptr->stock_num; slot++) + for (slot = 0; slot < st_ptr->stock.size(); slot++) { /* Get that item */ - j_ptr = &st_ptr->stock[slot]; + auto j_ptr = &st_ptr->stock[slot]; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; @@ -932,25 +929,16 @@ static int home_carry(object_type *o_ptr) } /* Objects sort by decreasing value */ - j_value = object_value(j_ptr); + auto const j_value = object_value(j_ptr); if (value > j_value) break; if (value < j_value) continue; } - /* Slide the others up */ - for (i = st_ptr->stock_num; i > slot; i--) - { - st_ptr->stock[i] = st_ptr->stock[i - 1]; - } - - /* More stuff now */ - st_ptr->stock_num++; - - /* Insert the new item */ - st_ptr->stock[slot] = *o_ptr; + /* Insert */ + st_ptr->stock.insert(st_ptr->stock.begin() + slot, *o_ptr); /* Return the location */ - return (slot); + return slot; } @@ -968,16 +956,16 @@ static int home_carry(object_type *o_ptr) */ static int store_carry(object_type *o_ptr) { - int i, slot; - s32b value, j_value; - object_type *j_ptr; - + std::size_t slot; /* Evaluate the object */ - value = object_value(o_ptr); + auto const value = object_value(o_ptr); /* Cursed/Worthless items "disappear" when sold */ - if (value <= 0) return ( -1); + if (value <= 0) + { + return -1; + } /* All store items are fully *identified* */ o_ptr->ident |= IDENT_MENTAL; @@ -986,10 +974,10 @@ static int store_carry(object_type *o_ptr) o_ptr->note = 0; /* Check each existing item (try to combine) */ - for (slot = 0; slot < st_ptr->stock_num; slot++) + for (slot = 0; slot < st_ptr->stock.size(); slot++) { /* Get the existing item */ - j_ptr = &st_ptr->stock[slot]; + auto j_ptr = &st_ptr->stock[slot]; /* Can the existing items be incremented? */ if (store_object_similar(j_ptr, o_ptr)) @@ -998,19 +986,22 @@ static int store_carry(object_type *o_ptr) store_object_absorb(j_ptr, o_ptr); /* All done */ - return (slot); + return slot; } } /* No space? */ - if (st_ptr->stock_num >= st_ptr->stock_size) return ( -1); + if (st_ptr->stock.size() >= st_ptr->stock_size) + { + return -1; + } /* Check existing slots to see if we must "slide" */ - for (slot = 0; slot < st_ptr->stock_num; slot++) + for (slot = 0; slot < st_ptr->stock.size(); slot++) { /* Get that item */ - j_ptr = &st_ptr->stock[slot]; + auto j_ptr = &st_ptr->stock[slot]; /* Objects sort by decreasing type */ if (o_ptr->tval > j_ptr->tval) break; @@ -1032,27 +1023,18 @@ static int store_carry(object_type *o_ptr) } /* Evaluate that slot */ - j_value = object_value(j_ptr); + auto const j_value = object_value(j_ptr); /* Objects sort by decreasing value */ if (value > j_value) break; if (value < j_value) continue; } - /* Slide the others up */ - for (i = st_ptr->stock_num; i > slot; i--) - { - st_ptr->stock[i] = st_ptr->stock[i - 1]; - } - - /* More stuff now */ - st_ptr->stock_num++; - /* Insert the new item */ - st_ptr->stock[slot] = *o_ptr; + st_ptr->stock.insert(st_ptr->stock.begin() + slot, *o_ptr); /* Return the location */ - return (slot); + return slot; } @@ -1062,14 +1044,11 @@ static int store_carry(object_type *o_ptr) */ static void store_item_increase(int item, int num) { - int cnt; - object_type *o_ptr; - /* Get the item */ - o_ptr = &st_ptr->stock[item]; + auto o_ptr = &st_ptr->stock[item]; /* Verify the number */ - cnt = o_ptr->number + num; + int cnt = o_ptr->number + num; if (cnt > 255) cnt = 255; else if (cnt < 0) cnt = 0; num = cnt - o_ptr->number; @@ -1084,11 +1063,8 @@ static void store_item_increase(int item, int num) */ static void store_item_optimize(int item) { - int j; - object_type *o_ptr; - /* Get the item */ - o_ptr = &st_ptr->stock[item]; + auto const o_ptr = &st_ptr->stock[item]; /* Must exist */ if (!o_ptr->k_idx) return; @@ -1096,17 +1072,11 @@ static void store_item_optimize(int item) /* Must have no items */ if (o_ptr->number) return; - /* One less item */ - st_ptr->stock_num--; - - /* Slide everyone */ - for (j = item; j < st_ptr->stock_num; j++) - { - st_ptr->stock[j] = st_ptr->stock[j + 1]; - } + /* Wipe the item */ + object_wipe(&st_ptr->stock[item]); - /* Nuke the final slot */ - object_wipe(&st_ptr->stock[j]); + /* Erase the item */ + st_ptr->stock.erase(st_ptr->stock.begin() + item); } @@ -1117,8 +1087,6 @@ static void store_item_optimize(int item) */ static bool_ black_market_crap(object_type *o_ptr) { - int i, j; - /* Ego items are never crap */ if (o_ptr->name2) return (FALSE); @@ -1128,18 +1096,16 @@ static bool_ black_market_crap(object_type *o_ptr) if (o_ptr->to_d > 0) return (FALSE); /* Check all stores */ - for (i = 0; i < max_st_idx; i++) + for (std::size_t i = 0; i < max_st_idx; i++) { if (i == STORE_HOME) continue; if (st_info[i].flags1 & SF1_MUSEUM) continue; /* Check every item in the store */ - for (j = 0; j < town_info[p_ptr->town_num].store[i].stock_num; j++) + for (auto const &stock_obj: town_info[p_ptr->town_num].store[i].stock) { - object_type *j_ptr = &town_info[p_ptr->town_num].store[i].stock[j]; - /* Duplicate item "type", assume crappy */ - if (o_ptr->k_idx == j_ptr->k_idx) return (TRUE); + if (o_ptr->k_idx == stock_obj.k_idx) return (TRUE); } } @@ -1154,13 +1120,11 @@ static bool_ black_market_crap(object_type *o_ptr) */ static void store_delete(void) { - int what, num; - /* Pick a random slot */ - what = rand_int(st_ptr->stock_num); + int const what = rand_int(st_ptr->stock.size()); /* Determine how many items are here */ - num = st_ptr->stock[what].number; + int num = st_ptr->stock[what].number; /* Hack -- sometimes, only destroy half the items */ if (rand_int(100) < 50) num = (num + 1) / 2; @@ -1243,7 +1207,10 @@ static void store_create(void) /* Paranoia -- no room left */ - if (st_ptr->stock_num >= st_ptr->stock_size) return; + if (st_ptr->stock.size() >= st_ptr->stock_size) + { + return; + } /* Hack -- consider up to four items */ @@ -1440,28 +1407,19 @@ static void store_create(void) */ static void display_entry(int pos) { - int i, cur_col; - object_type *o_ptr; - s32b x; - - char o_name[80]; - char out_val[160]; - - - int maxwid = 75; - /* Get the item */ - o_ptr = &st_ptr->stock[pos]; + auto o_ptr = &st_ptr->stock[pos]; /* Get the "offset" */ - i = (pos % 12); + auto const i = (pos % 12); /* Label it, clear the line --(-- */ + char out_val[160]; strnfmt(out_val, 160, "%c) ", I2A(i)); c_prt(get_item_letter_color(o_ptr), out_val, i + 6, 0); - cur_col = 3; + int cur_col = 3; { byte a = object_attr(o_ptr); char c = object_char(o_ptr); @@ -1476,12 +1434,13 @@ static void display_entry(int pos) if ((cur_store_num == 7) || (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)) { - maxwid = 75; + int maxwid = 75; /* Leave room for weights */ maxwid -= 10; /* Describe the object */ + char o_name[80]; object_desc(o_name, o_ptr, TRUE, 3); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col); @@ -1501,12 +1460,13 @@ static void display_entry(int pos) byte color = TERM_WHITE; /* Must leave room for the "price" */ - maxwid = 65; + int maxwid = 65; /* Leave room for weights */ maxwid -= 7; /* Describe the object (fully) */ + char o_name[80]; object_desc_store(o_name, o_ptr, TRUE, 3); o_name[maxwid] = '\0'; c_put_str(tval_to_attr[o_ptr->tval], o_name, i + 6, cur_col); @@ -1520,7 +1480,7 @@ static void display_entry(int pos) } /* Extract the "minimum" price */ - x = price_item(o_ptr, ot_ptr->inflation, FALSE); + auto const x = price_item(o_ptr, ot_ptr->inflation, FALSE); /* Can we buy one ? */ if (x > p_ptr->au) color = TERM_L_DARK; @@ -1544,7 +1504,10 @@ static void display_inventory(void) for (k = 0; k < 12; k++) { /* Do not display "dead" items */ - if (store_top + k >= st_ptr->stock_num) break; + if (store_top + k >= static_cast(st_ptr->stock.size())) + { + break; + } /* Display that line */ display_entry(store_top + k); @@ -1557,7 +1520,7 @@ static void display_inventory(void) put_str(" ", 5, 20); /* Visual reminder of "more items" */ - if (st_ptr->stock_num > 12) + if (st_ptr->stock.size() > 12) { /* Show "more" reminder (after the last item) */ prt("-more-", k + 6, 3); @@ -1892,18 +1855,6 @@ static bool_ retire_owner_p(void) */ void store_stole(void) { - int i, amt; - int item, item_new; - - object_type forge; - object_type *j_ptr; - - object_type *o_ptr; - - char o_name[80]; - - char out_val[160]; - if (cur_store_num == 7) { msg_print("You can't steal from your home!"); @@ -1911,7 +1862,7 @@ void store_stole(void) } /* Empty? */ - if (st_ptr->stock_num <= 0) + if (st_ptr->stock.empty()) { msg_print("There is no item to steal."); return; @@ -1919,30 +1870,31 @@ void store_stole(void) /* Find the number of objects on this and following pages */ - i = (st_ptr->stock_num - store_top); + int i = (st_ptr->stock.size() - store_top); /* And then restrict it to the current page */ if (i > 12) i = 12; /* Prompt */ + char out_val[160]; strnfmt(out_val, 160, "Which item do you want to steal? "); /* Get the item number to be bought */ + int item; if (!get_stock(&item, out_val, 0, i - 1)) return; /* Get the actual index */ item = item + store_top; /* Get the actual item */ - o_ptr = &st_ptr->stock[item]; + object_type *o_ptr = &st_ptr->stock[item]; /* Assume the player wants just one of them */ - amt = 1; - - /* Get local object */ - j_ptr = &forge; + int amt = 1; /* Get a copy of the object */ + object_type forge; + object_type *j_ptr = &forge; object_copy(j_ptr, o_ptr); /* Modify quantity */ @@ -2006,6 +1958,7 @@ void store_stole(void) } /* Describe the transaction */ + char o_name[80]; object_desc(o_name, j_ptr, TRUE, 3); /* Message */ @@ -2015,7 +1968,7 @@ void store_stole(void) j_ptr->note = 0; /* Give it to the player */ - item_new = inven_carry(j_ptr, FALSE); + int const item_new = inven_carry(j_ptr, FALSE); /* Describe the final result */ object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3); @@ -2028,14 +1981,14 @@ void store_stole(void) handle_stuff(); /* Note how many slots the store used to have */ - i = st_ptr->stock_num; + auto prev_stock_size = st_ptr->stock.size(); /* Remove the bought items from the store */ store_item_increase(item, -amt); store_item_optimize(item); /* Store is empty */ - if (st_ptr->stock_num == 0) + if (st_ptr->stock.empty()) { /* Shuffle */ if (retire_owner_p()) @@ -2055,7 +2008,7 @@ void store_stole(void) } /* New inventory */ - for (i = 0; i < 10; i++) + for (int k = 0; k < 10; k++) { /* Maintain the store */ store_maint(p_ptr->town_num, cur_store_num); @@ -2069,10 +2022,13 @@ void store_stole(void) } /* The item is gone */ - else if (st_ptr->stock_num != i) + else if (st_ptr->stock.size() != prev_stock_size) { /* Pick the correct screen */ - if (store_top >= st_ptr->stock_num) store_top -= 12; + if (store_top >= static_cast(st_ptr->stock.size())) + { + store_top -= 12; + } /* Redraw everything */ display_inventory(); @@ -2103,20 +2059,6 @@ void store_stole(void) */ void store_purchase(void) { - int i, amt = 1, choice; - int item, item_new; - - s32b price, best; - - object_type forge; - object_type *j_ptr; - - object_type *o_ptr; - - char o_name[80]; - - char out_val[160]; - /* Museum? */ if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) { @@ -2125,7 +2067,7 @@ void store_purchase(void) } /* Empty? */ - if (st_ptr->stock_num <= 0) + if (st_ptr->stock.empty()) { if (cur_store_num == 7) msg_print("Your home is empty."); else msg_print("I am currently out of stock."); @@ -2134,12 +2076,13 @@ void store_purchase(void) /* Find the number of objects on this and following pages */ - i = (st_ptr->stock_num - store_top); + int i = (st_ptr->stock.size() - store_top); /* And then restrict it to the current page */ if (i > 12) i = 12; /* Prompt */ + char out_val[160]; if (cur_store_num == 7) { strnfmt(out_val, 160, "Which item do you want to take? "); @@ -2150,18 +2093,18 @@ void store_purchase(void) } /* Get the item number to be bought */ + int item; if (!get_stock(&item, out_val, 0, i - 1)) return; /* Get the actual index */ item = item + store_top; /* Get the actual item */ - o_ptr = &st_ptr->stock[item]; - - /* Get local object */ - j_ptr = &forge; + auto o_ptr = &st_ptr->stock[item]; /* Get a copy of one object to determine the price */ + object_type forge; + auto j_ptr = &forge; object_copy(j_ptr, o_ptr); /* Modify quantity */ @@ -2181,9 +2124,10 @@ void store_purchase(void) } /* Determine the "best" price (per item) */ - best = price_item(j_ptr, ot_ptr->inflation, FALSE); + auto const best = price_item(j_ptr, ot_ptr->inflation, FALSE); /* Find out how many the player wants */ + int amt = 1; if (o_ptr->number > 1) { s32b q; @@ -2219,10 +2163,8 @@ void store_purchase(void) if (amt <= 0) return; } - /* Get local object */ - j_ptr = &forge; - /* Get desired object */ + j_ptr = &forge; object_copy(j_ptr, o_ptr); /* Modify quantity */ @@ -2247,14 +2189,15 @@ void store_purchase(void) if (cur_store_num != 7) { /* Haggle for a final price */ - choice = purchase_haggle(j_ptr, &price); + s32b price; + auto const choice = purchase_haggle(j_ptr, &price); /* Hack -- Got kicked out */ if (st_ptr->store_open >= turn) return; /* Player wants it */ - if (choice == 0) + if (!choice) { /* Player can afford it */ if (p_ptr->au >= price) @@ -2279,6 +2222,7 @@ void store_purchase(void) j_ptr->found_aux1 = st_ptr->st_idx; /* Describe the transaction */ + char o_name[80]; object_desc(o_name, j_ptr, TRUE, 3); /* Message */ @@ -2298,7 +2242,7 @@ void store_purchase(void) } /* Give it to the player */ - item_new = inven_carry(j_ptr, FALSE); + int const item_new = inven_carry(j_ptr, FALSE); /* Describe the final result */ object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3); @@ -2311,14 +2255,14 @@ void store_purchase(void) handle_stuff(); /* Note how many slots the store used to have */ - i = st_ptr->stock_num; + auto prev_stock_size = st_ptr->stock.size(); /* Remove the bought items from the store */ store_item_increase(item, -amt); store_item_optimize(item); /* Store is empty */ - if (st_ptr->stock_num == 0) + if (st_ptr->stock.empty()) { /* Shuffle */ if (retire_owner_p()) @@ -2338,7 +2282,7 @@ void store_purchase(void) } /* New inventory */ - for (i = 0; i < 10; i++) + for (int k = 0; k < 10; k++) { /* Maintain the store */ store_maint(p_ptr->town_num, cur_store_num); @@ -2349,10 +2293,13 @@ void store_purchase(void) } /* The item is gone */ - else if (st_ptr->stock_num != i) + else if (st_ptr->stock.size() != prev_stock_size) { /* Pick the correct screen */ - if (store_top >= st_ptr->stock_num) store_top -= 12; + if (store_top >= static_cast(st_ptr->stock.size())) + { + store_top -= 12; + } } /* Redraw everything */ @@ -2382,9 +2329,10 @@ void store_purchase(void) } /* Give it to the player */ - item_new = inven_carry(j_ptr, FALSE); + int const item_new = inven_carry(j_ptr, FALSE); /* Describe just the result */ + char o_name[80]; object_desc(o_name, &p_ptr->inventory[item_new], TRUE, 3); /* Message */ @@ -2394,14 +2342,14 @@ void store_purchase(void) handle_stuff(); /* Take note if we take the last one */ - i = st_ptr->stock_num; + std::size_t prev_stock_size = st_ptr->stock.size(); /* Remove the items from the home */ store_item_increase(item, -amt); store_item_optimize(item); /* Hack -- Item is still here */ - if (i == st_ptr->stock_num) + if (prev_stock_size == st_ptr->stock.size()) { /* Redraw the item */ display_entry(item); @@ -2411,10 +2359,16 @@ void store_purchase(void) else { /* Nothing left */ - if (st_ptr->stock_num == 0) store_top = 0; + if (st_ptr->stock.empty() == 0) + { + store_top = 0; + } /* Nothing left on that screen */ - else if (store_top >= st_ptr->stock_num) store_top -= 12; + else if (store_top >= static_cast(st_ptr->stock.size())) + { + store_top -= 12; + } /* Redraw everything */ display_inventory(); @@ -2737,18 +2691,8 @@ void store_sell(void) */ void store_examine(void) { - int i; - int item; - - object_type *o_ptr; - - char o_name[80]; - - char out_val[160]; - - /* Empty? */ - if (st_ptr->stock_num <= 0) + if (st_ptr->stock.empty()) { if (cur_store_num == 7) msg_print("Your home is empty."); else if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) msg_print("The museum is empty."); @@ -2758,22 +2702,23 @@ void store_examine(void) /* Find the number of objects on this and following pages */ - i = (st_ptr->stock_num - store_top); + int i = (st_ptr->stock.size() - store_top); /* And then restrict it to the current page */ - if (i > 12) i = 12; - - /* Prompt */ - strnfmt(out_val, 160, "Which item do you want to examine? "); + if (i > 12) + { + i = 12; + } /* Get the item number to be examined */ - if (!get_stock(&item, out_val, 0, i - 1)) return; + int item; + if (!get_stock(&item, "Which item do you want to examine? ", 0, i - 1)) return; /* Get the actual index */ item = item + store_top; /* Get the actual item */ - o_ptr = &st_ptr->stock[item]; + auto o_ptr = &st_ptr->stock[item]; /* Debug hack */ if (wizard) @@ -2790,6 +2735,7 @@ void store_examine(void) } /* Description */ + char o_name[80]; object_desc(o_name, o_ptr, TRUE, 3); /* Describe */ @@ -2880,14 +2826,17 @@ static bool_ store_process_command(void) /* Browse */ case ' ': { - if (st_ptr->stock_num <= 12) + if (st_ptr->stock.size() <= 12) { msg_print("Entire inventory is shown."); } else { store_top += 12; - if (store_top >= st_ptr->stock_num) store_top = 0; + if (store_top >= static_cast(st_ptr->stock.size())) + { + store_top = 0; + } display_inventory(); } break; @@ -2896,7 +2845,7 @@ static bool_ store_process_command(void) /* Browse backwards */ case '-': { - if (st_ptr->stock_num <= 12) + if (st_ptr->stock.size() <= 12) { msg_print("Entire inventory is shown."); } @@ -2905,7 +2854,7 @@ static bool_ store_process_command(void) store_top -= 12; if (store_top < 0) { - store_top = ((st_ptr->stock_num - 1) / 12) * 12; + store_top = ((st_ptr->stock.size() - 1) / 12) * 12; } display_inventory(); } @@ -3270,7 +3219,7 @@ void do_cmd_store(void) prt(") Exit.", 22, 4); /* Browse if necessary */ - if (st_ptr->stock_num > 12) + if (st_ptr->stock.size() > 12) { c_prt(TERM_YELLOW, " SPACE", 23, 0); prt(") Next page", 23, 6); @@ -3427,9 +3376,6 @@ void do_cmd_store(void) */ void store_shuffle(int which) { - int i, j; - - /* Ignore home */ if (which == STORE_HOME) return; @@ -3444,7 +3390,7 @@ void store_shuffle(int which) st_ptr = &town_info[p_ptr->town_num].store[cur_store_num]; /* Pick a new owner */ - for (j = st_ptr->owner; j == st_ptr->owner; ) + for (auto j = st_ptr->owner; j == st_ptr->owner; ) { st_ptr->owner = st_info[st_ptr->st_idx].owners[rand_int(4)]; } @@ -3458,12 +3404,9 @@ void store_shuffle(int which) /* Hack -- discount all the items */ - for (i = 0; i < st_ptr->stock_num; i++) + for (auto &o_ref: st_ptr->stock) { - object_type *o_ptr; - - /* Get the item */ - o_ptr = &st_ptr->stock[i]; + auto o_ptr = &o_ref; /* Hack -- Sell all old items for "half price" */ if (!(o_ptr->art_name)) @@ -3480,9 +3423,7 @@ void store_shuffle(int which) */ void store_maint(int town_num, int store_num) { - int j, tries = 100; - - int old_rating = rating; + int const old_rating = rating; cur_store_num = store_num; @@ -3502,7 +3443,7 @@ void store_maint(int town_num, int store_num) if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) { /* Destroy crappy black market items */ - for (j = st_ptr->stock_num - 1; j >= 0; j--) + for (int j = st_ptr->stock.size() - 1; j >= 0; j--) { object_type *o_ptr = &st_ptr->stock[j]; @@ -3518,7 +3459,7 @@ void store_maint(int town_num, int store_num) /* Choose the number of slots to keep */ - j = st_ptr->stock_num; + int j = st_ptr->stock.size(); /* Sell a few items */ j = j - randint(STORE_TURNOVER); @@ -3533,11 +3474,13 @@ void store_maint(int town_num, int store_num) if (j < 0) j = 0; /* Destroy objects until only "j" slots are left */ - while (st_ptr->stock_num > j) store_delete(); - + while (j < static_cast(st_ptr->stock.size())) + { + store_delete(); + } /* Choose the number of slots to fill */ - j = st_ptr->stock_num; + j = st_ptr->stock.size(); /* Buy some more items */ j = j + randint(STORE_TURNOVER); @@ -3549,13 +3492,15 @@ void store_maint(int town_num, int store_num) if (j < STORE_MIN_KEEP) j = STORE_MIN_KEEP; /* Hack -- prevent "overflow" */ - if (j >= st_ptr->stock_size) j = st_ptr->stock_size - 1; + if (j >= st_ptr->stock_size) + { + j = st_ptr->stock_size - 1; + } /* Acquire some new items */ - while ((st_ptr->stock_num < j) && tries) + for (int tries = 0; (tries < 100) && (static_cast(st_ptr->stock.size()) < j); tries++) { store_create(); - tries--; } /* Hack -- Restore the rating */ @@ -3568,8 +3513,6 @@ void store_maint(int town_num, int store_num) */ void store_init(int town_num, int store_num) { - int k; - cur_store_num = store_num; /* Activate that store */ @@ -3587,19 +3530,14 @@ void store_init(int town_num, int store_num) st_ptr->store_open = 0; /* Nothing in stock */ - st_ptr->stock_num = 0; + st_ptr->stock.reserve(st_ptr->stock_size); + st_ptr->stock.clear(); /* * MEGA-HACK - Last visit to store is * BEFORE player birth to enable store restocking */ st_ptr->last_visit = -100L * STORE_TURNS; - - /* Clear any old items */ - for (k = 0; k < st_ptr->stock_size; k++) - { - object_wipe(&st_ptr->stock[k]); - } } @@ -3714,7 +3652,7 @@ void do_cmd_home_trump(void) prt(" ESC) Exit from Building.", 22, 0); /* Browse if necessary */ - if (st_ptr->stock_num > 12) + if (st_ptr->stock.size() > 12) { prt(" SPACE) Next page of stock", 23, 0); } diff --git a/src/store_type.hpp b/src/store_type.hpp index e3f917ac..5fb4ac7f 100644 --- a/src/store_type.hpp +++ b/src/store_type.hpp @@ -1,7 +1,9 @@ #pragma once #include "h-basic.h" -#include "object_type.hpp" +#include "object_type_fwd.hpp" + +#include /** * A store, with an owner, various state flags, a current stock @@ -9,35 +11,30 @@ */ struct store_type { - u16b st_idx; + u16b st_idx = 0; /** * Owner index */ - u16b owner; + u16b owner = 0; /** * Closed until this turn. */ - s32b store_open; + s32b store_open = 0; /** * Last visited on this turn. */ - s32b last_visit; - - /** - * Stock: Number of entries. - */ - byte stock_num; + s32b last_visit = 0; /** * Stock: Total size of array */ - s16b stock_size; + u16b stock_size = 0; /** * Stock: Actual stock items */ - object_type *stock; + std::vector stock; }; -- cgit v1.2.3 From c1f61900360d9dcd17382f37f16a75184c99844a Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Fix store_top underflow when removing last item --- src/store.cc | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/store.cc b/src/store.cc index 041cf74c..088de82a 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1498,7 +1498,7 @@ static void display_entry(int pos) */ static void display_inventory(void) { - int i, k; + int k; /* Display the next 12 items */ for (k = 0; k < 12; k++) @@ -1514,7 +1514,7 @@ static void display_inventory(void) } /* Erase the extra lines and the "more" prompt */ - for (i = k; i < 13; i++) prt("", i + 6, 0); + for (int i = k; i < 13; i++) prt("", i + 6, 0); /* Assume "no current page" */ put_str(" ", 5, 20); @@ -1850,6 +1850,31 @@ static bool_ retire_owner_p(void) return TRUE; } +/* + * Adjust store_top to account for a removed item + */ +static void adjust_store_top_item_removed() +{ + /* Nothing left? */ + if (st_ptr->stock.empty() == 0) + { + store_top = 0; + } + + /* Already at the top beginning? */ + else if (store_top == 0) + { + /* Nothing to do */ + } + + /* Nothing left on current screen? */ + else if (store_top >= static_cast(st_ptr->stock.size())) + { + store_top -= 12; + } +} + + /* * Stole an item from a store -DG- */ @@ -2024,11 +2049,7 @@ void store_stole(void) /* The item is gone */ else if (st_ptr->stock.size() != prev_stock_size) { - /* Pick the correct screen */ - if (store_top >= static_cast(st_ptr->stock.size())) - { - store_top -= 12; - } + adjust_store_top_item_removed(); /* Redraw everything */ display_inventory(); @@ -2295,11 +2316,7 @@ void store_purchase(void) /* The item is gone */ else if (st_ptr->stock.size() != prev_stock_size) { - /* Pick the correct screen */ - if (store_top >= static_cast(st_ptr->stock.size())) - { - store_top -= 12; - } + adjust_store_top_item_removed(); } /* Redraw everything */ @@ -2358,17 +2375,7 @@ void store_purchase(void) /* The item is gone */ else { - /* Nothing left */ - if (st_ptr->stock.empty() == 0) - { - store_top = 0; - } - - /* Nothing left on that screen */ - else if (store_top >= static_cast(st_ptr->stock.size())) - { - store_top -= 12; - } + adjust_store_top_item_removed(); /* Redraw everything */ display_inventory(); -- cgit v1.2.3 From f1af5f03ccd79006fa1536e00ac699272aebc5a0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change player_type to non-POD type --- src/birth.cc | 3 +- src/files.cc | 4 +- src/help_info.hpp | 4 +- src/player_type.hpp | 703 ++++++++++++++++++++++++++-------------------------- 4 files changed, 356 insertions(+), 358 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 188d9892..76d032f9 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -703,8 +703,7 @@ static void player_wipe(void) wipe_saved(); /* Hack -- zero the struct */ - static_assert(std::is_pod::value, "Cannot memset non-POD type"); - memset(p_ptr, 0, sizeof(player_type)); + *p_ptr = player_type(); /* Level 1 is the first level */ p_ptr->lev = 1; diff --git a/src/files.cc b/src/files.cc index a3dfe12a..e375e7b0 100644 --- a/src/files.cc +++ b/src/files.cc @@ -4211,9 +4211,9 @@ static void print_tomb(void) static void show_info(void) { /* Hack -- Know everything in the inven/equip */ - for (int i = 0; i < INVEN_TOTAL; i++) + for (auto &o_ref: p_ptr->inventory) { - auto o_ptr = &p_ptr->inventory[i]; + auto o_ptr = &o_ref; /* Skip non-objects */ if (!o_ptr->k_idx) continue; diff --git a/src/help_info.hpp b/src/help_info.hpp index ea440bb9..0960af77 100644 --- a/src/help_info.hpp +++ b/src/help_info.hpp @@ -12,6 +12,6 @@ constexpr int HELP_MAX = 64; */ struct help_info { - bool_ enabled; /* ingame help enabled */ - bool_ activated[HELP_MAX]; /* help item #i activated? */ + bool_ enabled = FALSE; /* ingame help enabled */ + bool_ activated[HELP_MAX] = { FALSE }; /* help item #i activated? */ }; diff --git a/src/player_type.hpp b/src/player_type.hpp index 4caa1e7b..7e615715 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -7,6 +7,8 @@ #include "object_type.hpp" #include "powers.hpp" +#include + /* * Most of the "player" information goes here. * @@ -24,393 +26,390 @@ struct player_type { - s32b lives; /* How many times we resurected */ - - s16b oldpy; /* Previous player location -KMW- */ - s16b oldpx; /* Previous player location -KMW- */ - - s16b py; /* Player location */ - s16b px; /* Player location */ - - byte prace; /* Race index */ - byte pracem; /* Race Mod index */ - byte pclass; /* Class index */ - byte pspec; /* Class spec index */ - byte mimic_form; /* Actualy transformation */ - s16b mimic_level; /* Level of the mimic effect */ - byte oops; /* Unused */ - - object_type inventory[INVEN_TOTAL]; /* Player inventory */ - - byte hitdie; /* Hit dice (sides) */ - u16b expfact; /* Experience factor */ - - byte preserve; /* Preserve artifacts */ - byte special; /* Special levels */ - byte allow_one_death; /* Blood of life */ - - s32b au; /* Current Gold */ - - s32b max_exp; /* Max experience */ - s32b exp; /* Cur experience */ - u16b exp_frac; /* Cur exp frac (times 2^16) */ - - s16b lev; /* Level */ - - s16b town_num; /* Current town number */ - s16b inside_quest; /* Inside quest level */ - - s32b wilderness_x; /* Coordinates in the wilderness */ - s32b wilderness_y; - bool_ wild_mode; /* TRUE = Small map, FLASE = Big map */ - bool_ old_wild_mode; /* TRUE = Small map, FLASE = Big map */ - - s16b mhp; /* Max hit pts */ - s16b chp; /* Cur hit pts */ - u16b chp_frac; /* Cur hit frac (times 2^16) */ - s16b hp_mod; /* A modificator(permanent) */ - - s16b msp; /* Max mana pts */ - s16b csp; /* Cur mana pts */ - u16b csp_frac; /* Cur mana frac (times 2^16) */ - - s16b msane; /* Max sanity */ - s16b csane; /* Cur sanity */ - u16b csane_frac; /* Cur sanity frac */ - - s32b grace; /* Your God's appreciation factor. */ - s32b grace_delay; /* Delay factor for granting piety. */ - byte pgod; /* Your God. */ - bool_ praying; /* Praying to your god. */ - s16b melkor_sacrifice; /* How much hp has been sacrified for damage */ - - s16b max_plv; /* Max Player Level */ - - s16b stat_max[6]; /* Current "maximal" stat values */ - s16b stat_cur[6]; /* Current "natural" stat values */ - - s16b luck_cur; /* Current "natural" luck value (range -30 <> 30) */ - s16b luck_max; /* Current "maximal base" luck value (range -30 <> 30) */ - s16b luck_base; /* Current "base" luck value (range -30 <> 30) */ - - s16b speed_factor; /* Timed -- Fast */ - s16b fast; /* Timed -- Fast */ - s16b lightspeed; /* Timed -- Light Speed */ - s16b slow; /* Timed -- Slow */ - s16b blind; /* Timed -- Blindness */ - s16b paralyzed; /* Timed -- Paralysis */ - s16b confused; /* Timed -- Confusion */ - s16b afraid; /* Timed -- Fear */ - s16b image; /* Timed -- Hallucination */ - s16b poisoned; /* Timed -- Poisoned */ - s16b cut; /* Timed -- Cut */ - s16b stun; /* Timed -- Stun */ - - s16b protevil; /* Timed -- Protection from Evil*/ - s16b protgood; /* Timed -- Protection from Good*/ - s16b protundead; /* Timed -- Protection from Undead*/ - s16b invuln; /* Timed -- Invulnerable */ - s16b hero; /* Timed -- Heroism */ - s16b shero; /* Timed -- Super Heroism */ - s16b shield; /* Timed -- Shield Spell */ - s16b shield_power; /* Timed -- Shield Spell Power */ - s16b shield_opt; /* Timed -- Shield Spell options */ - s16b shield_power_opt; /* Timed -- Shield Spell Power */ - s16b shield_power_opt2; /* Timed -- Shield Spell Power */ - s16b blessed; /* Timed -- Blessed */ - s16b tim_invis; /* Timed -- See Invisible */ - s16b tim_infra; /* Timed -- Infra Vision */ - - s16b oppose_acid; /* Timed -- oppose acid */ - s16b oppose_elec; /* Timed -- oppose lightning */ - s16b oppose_fire; /* Timed -- oppose heat */ - s16b oppose_cold; /* Timed -- oppose cold */ - s16b oppose_pois; /* Timed -- oppose poison */ - s16b oppose_ld; /* Timed -- oppose light & dark */ - s16b oppose_cc; /* Timed -- oppose chaos & confusion */ - s16b oppose_ss; /* Timed -- oppose sound & shards */ - s16b oppose_nex; /* Timed -- oppose nexus */ - - s16b tim_esp; /* Timed ESP */ - s16b tim_wraith; /* Timed wraithform */ - s16b tim_ffall; /* Timed Levitation */ - s16b tim_fly; /* Timed Levitation */ - s16b tim_poison; /* Timed poison hands */ - s16b tim_thunder; /* Timed thunderstorm */ - s16b tim_thunder_p1; /* Timed thunderstorm */ - s16b tim_thunder_p2; /* Timed thunderstorm */ - - s16b tim_project; /* Timed project upon melee blow */ - s16b tim_project_dam; - s16b tim_project_gf; - s16b tim_project_rad; - s16b tim_project_flag; - - s16b tim_roots; /* Timed roots */ - s16b tim_roots_ac; - s16b tim_roots_dam; - - s16b tim_invisible; /* Timed Invisibility */ - s16b tim_inv_pow; /* Power of timed invisibility */ - s16b tim_mimic; /* Timed Mimic */ - s16b tim_lite; /* Timed Lite */ - s16b tim_regen; /* Timed extra regen */ - s16b tim_regen_pow; /* Timed extra regen power */ - s16b holy; /* Holy Aura */ - s16b strike; /* True Strike(+25 hit) */ - s16b tim_reflect; /* Timed Reflection */ - s16b tim_deadly; /* Timed deadly blow */ - s16b prob_travel; /* Timed probability travel */ - s16b disrupt_shield;/* Timed disruption shield */ - s16b parasite; /* Timed parasite */ - s16b parasite_r_idx;/* Timed parasite monster */ - s16b absorb_soul; /* Timed soul absordtion */ - s16b tim_magic_breath; /* Magical breathing -- can breath anywhere */ - s16b tim_water_breath; /* Water breathing -- can breath underwater */ - s16b tim_precognition; /* Timed precognition */ - - s16b immov_cntr; /* Timed -- Last ``immovable'' command. */ - - s16b recall_dungeon; /* Recall in which dungeon */ - s16b word_recall; /* Word of recall counter */ - - s32b energy; /* Current energy */ - - s16b food; /* Current nutrition */ - - byte confusing; /* Glowing hands */ - byte searching; /* Currently searching */ - - bool_ old_cumber_armor; - bool_ old_cumber_glove; - bool_ old_heavy_wield; - bool_ old_heavy_shoot; - bool_ old_icky_wield; - - s16b old_lite; /* Old radius of lite (if any) */ - s16b old_view; /* Old radius of view (if any) */ - - s16b old_food_aux; /* Old value of food */ - - - bool_ cumber_armor; /* Mana draining armor */ - bool_ cumber_glove; /* Mana draining gloves */ - bool_ heavy_wield; /* Heavy weapon */ - bool_ heavy_shoot; /* Heavy shooter */ - bool_ icky_wield; /* Icky weapon */ - bool_ immovable; /* Immovable character */ - - s16b cur_lite; /* Radius of lite (if any) */ - - - u32b notice; /* Special Updates (bit flags) */ - u32b update; /* Pending Updates (bit flags) */ - u32b redraw; /* Normal Redraws (bit flags) */ - u32b window; /* Window Redraws (bit flags) */ - - s16b stat_use[6]; /* Current modified stats */ - s16b stat_top[6]; /* Maximal modified stats */ - - s16b stat_add[6]; /* Modifiers to stat values */ - s16b stat_ind[6]; /* Indexes into stat tables */ - s16b stat_cnt[6]; /* Counter for temporary drains */ - s16b stat_los[6]; /* Amount of temporary drains */ - - bool_ immune_acid; /* Immunity to acid */ - bool_ immune_elec; /* Immunity to lightning */ - bool_ immune_fire; /* Immunity to fire */ - bool_ immune_cold; /* Immunity to cold */ - bool_ immune_neth; /* Immunity to nether */ - - bool_ resist_acid; /* Resist acid */ - bool_ resist_elec; /* Resist lightning */ - bool_ resist_fire; /* Resist fire */ - bool_ resist_cold; /* Resist cold */ - bool_ resist_pois; /* Resist poison */ - - bool_ resist_conf; /* Resist confusion */ - bool_ resist_sound; /* Resist sound */ - bool_ resist_lite; /* Resist light */ - bool_ resist_dark; /* Resist darkness */ - bool_ resist_chaos; /* Resist chaos */ - bool_ resist_disen; /* Resist disenchant */ - bool_ resist_shard; /* Resist shards */ - bool_ resist_nexus; /* Resist nexus */ - bool_ resist_blind; /* Resist blindness */ - bool_ resist_neth; /* Resist nether */ - bool_ resist_fear; /* Resist fear */ - bool_ resist_continuum; /* Resist space-time continuum disruption */ - - bool_ sensible_fire; /* Fire does more damage on the player */ - bool_ sensible_lite; /* Lite does more damage on the player and blinds her/him */ - - bool_ reflect; /* Reflect 'bolt' attacks */ - bool_ sh_fire; /* Fiery 'immolation' effect */ - bool_ sh_elec; /* Electric 'immolation' effect */ - bool_ wraith_form; /* wraithform */ - - bool_ anti_magic; /* Anti-magic */ - bool_ anti_tele; /* Prevent teleportation */ - - bool_ sustain_str; /* Keep strength */ - bool_ sustain_int; /* Keep intelligence */ - bool_ sustain_wis; /* Keep wisdom */ - bool_ sustain_dex; /* Keep dexterity */ - bool_ sustain_con; /* Keep constitution */ - bool_ sustain_chr; /* Keep charisma */ - - bool_ aggravate; /* Aggravate monsters */ - bool_ teleport; /* Random teleporting */ - - bool_ exp_drain; /* Experience draining */ - byte drain_mana; /* mana draining */ - byte drain_life; /* hp draining */ - - bool_ magical_breath; /* Magical breathing -- can breath anywhere */ - bool_ water_breath; /* Water breathing -- can breath underwater */ - bool_ climb; /* Can climb mountains */ - bool_ fly; /* Can fly over some features */ - bool_ ffall; /* No damage falling */ - bool_ lite; /* Permanent light */ - bool_ free_act; /* Never paralyzed */ - bool_ see_inv; /* Can see invisible */ - bool_ regenerate; /* Regenerate hit pts */ - bool_ hold_life; /* Resist life draining */ - u32b telepathy; /* Telepathy */ - bool_ slow_digest; /* Slower digestion */ - bool_ bless_blade; /* Blessed blade */ - byte xtra_might; /* Extra might bow */ - bool_ impact; /* Earthquake blows */ - bool_ auto_id; /* Auto id items */ - - s16b invis; /* Invisibility */ - - s16b dis_to_h; /* Known bonus to hit */ - s16b dis_to_d; /* Known bonus to dam */ - s16b dis_to_a; /* Known bonus to ac */ - - s16b dis_ac; /* Known base ac */ - - s16b to_l; /* Bonus to life */ - s16b to_m; /* Bonus to mana */ - s16b to_s; /* Bonus to spell */ - s16b to_h; /* Bonus to hit */ - s16b to_d; /* Bonus to dam */ - s16b to_h_melee; /* Bonus to hit for melee */ - s16b to_d_melee; /* Bonus to dam for melee */ - s16b to_h_ranged; /* Bonus to hit for ranged */ - s16b to_d_ranged; /* Bonus to dam for ranged */ - s16b to_a; /* Bonus to ac */ - - s16b ac; /* Base ac */ - - byte antimagic; /* Power of the anti magic field */ - byte antimagic_dis; /* Radius of the anti magic field */ - - s16b see_infra; /* Infravision range */ - - s16b skill_dis; /* Skill: Disarming */ - s16b skill_dev; /* Skill: Magic Devices */ - s16b skill_sav; /* Skill: Saving throw */ - s16b skill_stl; /* Skill: Stealth factor */ - s16b skill_srh; /* Skill: Searching ability */ - s16b skill_fos; /* Skill: Searching frequency */ - s16b skill_thn; /* Skill: To hit (normal) */ - s16b skill_thb; /* Skill: To hit (shooting) */ - s16b skill_tht; /* Skill: To hit (throwing) */ - s16b skill_dig; /* Skill: Digging */ - - s16b num_blow; /* Number of blows */ - s16b num_fire; /* Number of shots */ - s16b xtra_crit; /* % of increased crits */ - - byte throw_mult; /* Multiplier for throw damage */ - - byte tval_ammo; /* Correct ammo tval */ - - s16b pspeed; /* Current speed */ - - u32b mimic_extra; /* Mimicry powers use that */ - u32b antimagic_extra; /* Antimagic powers */ - u32b music_extra; /* Music songs */ - u32b necro_extra; /* Necro powers */ - u32b necro_extra2; /* Necro powers */ + s32b lives = 0; /* How many times we resurected */ + + s16b oldpy = 0; /* Previous player location */ + s16b oldpx = 0; /* Previous player location */ + + s16b py = 0; /* Player location */ + s16b px = 0; /* Player location */ + + byte prace = 0; /* Race index */ + byte pracem = 0; /* Race Mod index */ + byte pclass = 0; /* Class index */ + byte pspec = 0; /* Class spec index */ + byte mimic_form = 0; /* Actualy transformation */ + s16b mimic_level = 0; /* Level of the mimic effect */ + + std::array inventory { }; /* Player inventory */ + + byte hitdie = 0; /* Hit dice (sides) */ + u16b expfact = 0; /* Experience factor */ + + byte preserve = 0; /* Preserve artifacts */ + byte special = 0; /* Special levels */ + byte allow_one_death = 0; /* Blood of life */ + + s32b au = 0; /* Current Gold */ + + s32b max_exp = 0; /* Max experience */ + s32b exp = 0; /* Cur experience */ + u16b exp_frac = 0; /* Cur exp frac (times 2^16) */ + + s16b lev = 0; /* Level */ + + s16b town_num = 0; /* Current town number */ + s16b inside_quest = 0; /* Inside quest level */ + + s32b wilderness_x = 0; /* Coordinates in the wilderness */ + s32b wilderness_y = 0; + bool_ wild_mode = FALSE; /* TRUE = Small map, FLASE = Big map */ + bool_ old_wild_mode = FALSE; /* TRUE = Small map, FLASE = Big map */ + + s16b mhp = 0; /* Max hit pts */ + s16b chp = 0; /* Cur hit pts */ + u16b chp_frac = 0; /* Cur hit frac (times 2^16) */ + s16b hp_mod = 0; /* A modificator (permanent) */ + + s16b msp = 0; /* Max mana pts */ + s16b csp = 0; /* Cur mana pts */ + u16b csp_frac = 0; /* Cur mana frac (times 2^16) */ + + s16b msane = 0; /* Max sanity */ + s16b csane = 0; /* Cur sanity */ + u16b csane_frac = 0; /* Cur sanity frac */ + + s32b grace = 0; /* Your God's appreciation factor. */ + s32b grace_delay = 0; /* Delay factor for granting piety. */ + byte pgod = 0; /* Your God. */ + bool_ praying = FALSE; /* Praying to your god. */ + s16b melkor_sacrifice = 0; /* How much hp has been sacrified for damage */ + + s16b max_plv = 0; /* Max Player Level */ + + s16b stat_max[6] = { 0 }; /* Current "maximal" stat values */ + s16b stat_cur[6] = { 0 }; /* Current "natural" stat values */ + + s16b luck_cur = 0; /* Current "natural" luck value (range -30 <> 30) */ + s16b luck_max = 0; /* Current "maximal base" luck value (range -30 <> 30) */ + s16b luck_base = 0; /* Current "base" luck value (range -30 <> 30) */ + + s16b speed_factor = 0; /* Timed -- Fast */ + s16b fast = 0; /* Timed -- Fast */ + s16b lightspeed = 0; /* Timed -- Light Speed */ + s16b slow = 0; /* Timed -- Slow */ + s16b blind = 0; /* Timed -- Blindness */ + s16b paralyzed = 0; /* Timed -- Paralysis */ + s16b confused = 0; /* Timed -- Confusion */ + s16b afraid = 0; /* Timed -- Fear */ + s16b image = 0; /* Timed -- Hallucination */ + s16b poisoned = 0; /* Timed -- Poisoned */ + s16b cut = 0; /* Timed -- Cut */ + s16b stun = 0; /* Timed -- Stun */ + + s16b protevil = 0; /* Timed -- Protection from Evil*/ + s16b protgood = 0; /* Timed -- Protection from Good*/ + s16b protundead = 0; /* Timed -- Protection from Undead*/ + s16b invuln = 0; /* Timed -- Invulnerable */ + s16b hero = 0; /* Timed -- Heroism */ + s16b shero = 0; /* Timed -- Super Heroism */ + s16b shield = 0; /* Timed -- Shield Spell */ + s16b shield_power = 0; /* Timed -- Shield Spell Power */ + s16b shield_opt = 0; /* Timed -- Shield Spell options */ + s16b shield_power_opt = 0; /* Timed -- Shield Spell Power */ + s16b shield_power_opt2 = 0; /* Timed -- Shield Spell Power */ + s16b blessed = 0; /* Timed -- Blessed */ + s16b tim_invis = 0; /* Timed -- See Invisible */ + s16b tim_infra = 0; /* Timed -- Infra Vision */ + + s16b oppose_acid = 0; /* Timed -- oppose acid */ + s16b oppose_elec = 0; /* Timed -- oppose lightning */ + s16b oppose_fire = 0; /* Timed -- oppose heat */ + s16b oppose_cold = 0; /* Timed -- oppose cold */ + s16b oppose_pois = 0; /* Timed -- oppose poison */ + s16b oppose_ld = 0; /* Timed -- oppose light & dark */ + s16b oppose_cc = 0; /* Timed -- oppose chaos & confusion */ + s16b oppose_ss = 0; /* Timed -- oppose sound & shards */ + s16b oppose_nex = 0; /* Timed -- oppose nexus */ + + s16b tim_esp = 0; /* Timed ESP */ + s16b tim_wraith = 0; /* Timed wraithform */ + s16b tim_ffall = 0; /* Timed Levitation */ + s16b tim_fly = 0; /* Timed Levitation */ + s16b tim_poison = 0; /* Timed poison hands */ + s16b tim_thunder = 0; /* Timed thunderstorm */ + s16b tim_thunder_p1 = 0; /* Timed thunderstorm */ + s16b tim_thunder_p2 = 0; /* Timed thunderstorm */ + + s16b tim_project = 0; /* Timed project upon melee blow */ + s16b tim_project_dam = 0; + s16b tim_project_gf = 0; + s16b tim_project_rad = 0; + s16b tim_project_flag = 0; + + s16b tim_roots = 0; /* Timed roots */ + s16b tim_roots_ac = 0; + s16b tim_roots_dam = 0; + + s16b tim_invisible = 0; /* Timed Invisibility */ + s16b tim_inv_pow = 0; /* Power of timed invisibility */ + s16b tim_mimic = 0; /* Timed Mimic */ + s16b tim_lite = 0; /* Timed Lite */ + s16b tim_regen = 0; /* Timed extra regen */ + s16b tim_regen_pow = 0; /* Timed extra regen power */ + s16b holy = 0; /* Holy Aura */ + s16b strike = 0; /* True Strike(+25 hit) */ + s16b tim_reflect = 0; /* Timed Reflection */ + s16b tim_deadly = 0; /* Timed deadly blow */ + s16b prob_travel = 0; /* Timed probability travel */ + s16b disrupt_shield = 0; /* Timed disruption shield */ + s16b parasite = 0; /* Timed parasite */ + s16b parasite_r_idx = 0; /* Timed parasite monster */ + s16b absorb_soul = 0; /* Timed soul absordtion */ + s16b tim_magic_breath = 0; /* Magical breathing -- can breath anywhere */ + s16b tim_water_breath = 0; /* Water breathing -- can breath underwater */ + s16b tim_precognition = 0; /* Timed precognition */ + + s16b immov_cntr = 0; /* Timed -- Last ``immovable'' command. */ + + s16b recall_dungeon = 0; /* Recall in which dungeon */ + s16b word_recall = 0; /* Word of recall counter */ + + s32b energy = 0; /* Current energy */ + + s16b food = 0; /* Current nutrition */ + + byte confusing = 0; /* Glowing hands */ + byte searching = 0; /* Currently searching */ + + bool_ old_cumber_armor = FALSE; + bool_ old_cumber_glove = FALSE; + bool_ old_heavy_wield = FALSE; + bool_ old_heavy_shoot = FALSE; + bool_ old_icky_wield = FALSE; + + s16b old_lite = 0; /* Old radius of lite (if any) */ + s16b old_view = 0; /* Old radius of view (if any) */ + + s16b old_food_aux = 0; /* Old value of food */ + + bool_ cumber_armor = FALSE; /* Mana draining armor */ + bool_ cumber_glove = FALSE; /* Mana draining gloves */ + bool_ heavy_wield = FALSE; /* Heavy weapon */ + bool_ heavy_shoot = FALSE; /* Heavy shooter */ + bool_ icky_wield = FALSE; /* Icky weapon */ + bool_ immovable = FALSE; /* Immovable character */ + + s16b cur_lite = 0; /* Radius of lite (if any) */ + + u32b notice = 0; /* Special Updates (bit flags) */ + u32b update = 0; /* Pending Updates (bit flags) */ + u32b redraw = 0; /* Normal Redraws (bit flags) */ + u32b window = 0; /* Window Redraws (bit flags) */ + + s16b stat_use[6] = { 0 }; /* Current modified stats */ + s16b stat_top[6] = { 0 }; /* Maximal modified stats */ + + s16b stat_add[6] = { 0 }; /* Modifiers to stat values */ + s16b stat_ind[6] = { 0 }; /* Indexes into stat tables */ + s16b stat_cnt[6] = { 0 }; /* Counter for temporary drains */ + s16b stat_los[6] = { 0 }; /* Amount of temporary drains */ + + bool_ immune_acid = FALSE; /* Immunity to acid */ + bool_ immune_elec = FALSE; /* Immunity to lightning */ + bool_ immune_fire = FALSE; /* Immunity to fire */ + bool_ immune_cold = FALSE; /* Immunity to cold */ + bool_ immune_neth = FALSE; /* Immunity to nether */ + + bool_ resist_acid = FALSE; /* Resist acid */ + bool_ resist_elec = FALSE; /* Resist lightning */ + bool_ resist_fire = FALSE; /* Resist fire */ + bool_ resist_cold = FALSE; /* Resist cold */ + bool_ resist_pois = FALSE; /* Resist poison */ + + bool_ resist_conf = FALSE; /* Resist confusion */ + bool_ resist_sound = FALSE; /* Resist sound */ + bool_ resist_lite = FALSE; /* Resist light */ + bool_ resist_dark = FALSE; /* Resist darkness */ + bool_ resist_chaos = FALSE; /* Resist chaos */ + bool_ resist_disen = FALSE; /* Resist disenchant */ + bool_ resist_shard = FALSE; /* Resist shards */ + bool_ resist_nexus = FALSE; /* Resist nexus */ + bool_ resist_blind = FALSE; /* Resist blindness */ + bool_ resist_neth = FALSE; /* Resist nether */ + bool_ resist_fear = FALSE; /* Resist fear */ + bool_ resist_continuum = FALSE; /* Resist space-time continuum disruption */ + + bool_ sensible_fire = FALSE; /* Fire does more damage on the player */ + bool_ sensible_lite = FALSE; /* Lite does more damage on the player and blinds her/him */ + + bool_ reflect = FALSE; /* Reflect 'bolt' attacks */ + bool_ sh_fire = FALSE; /* Fiery 'immolation' effect */ + bool_ sh_elec = FALSE; /* Electric 'immolation' effect */ + bool_ wraith_form = FALSE; /* wraithform */ + + bool_ anti_magic = FALSE; /* Anti-magic */ + bool_ anti_tele = FALSE; /* Prevent teleportation */ + + bool_ sustain_str = FALSE; /* Keep strength */ + bool_ sustain_int = FALSE; /* Keep intelligence */ + bool_ sustain_wis = FALSE; /* Keep wisdom */ + bool_ sustain_dex = FALSE; /* Keep dexterity */ + bool_ sustain_con = FALSE; /* Keep constitution */ + bool_ sustain_chr = FALSE; /* Keep charisma */ + + bool_ aggravate = FALSE; /* Aggravate monsters */ + bool_ teleport = FALSE; /* Random teleporting */ + + bool_ exp_drain = FALSE; /* Experience draining */ + byte drain_mana = FALSE; /* mana draining */ + byte drain_life = FALSE; /* hp draining */ + + bool_ magical_breath = FALSE; /* Magical breathing -- can breath anywhere */ + bool_ water_breath = FALSE; /* Water breathing -- can breath underwater */ + bool_ climb = FALSE; /* Can climb mountains */ + bool_ fly = FALSE; /* Can fly over some features */ + bool_ ffall = FALSE; /* No damage falling */ + bool_ lite = FALSE; /* Permanent light */ + bool_ free_act = FALSE; /* Never paralyzed */ + bool_ see_inv = FALSE; /* Can see invisible */ + bool_ regenerate = FALSE; /* Regenerate hit pts */ + bool_ hold_life = FALSE; /* Resist life draining */ + u32b telepathy = 0; /* Telepathy */ + bool_ slow_digest = FALSE; /* Slower digestion */ + bool_ bless_blade = FALSE; /* Blessed blade */ + byte xtra_might = 0; /* Extra might bow */ + bool_ impact = FALSE; /* Earthquake blows */ + bool_ auto_id = FALSE; /* Auto id items */ + + s16b invis = 0; /* Invisibility */ + + s16b dis_to_h = 0; /* Known bonus to hit */ + s16b dis_to_d = 0; /* Known bonus to dam */ + s16b dis_to_a = 0; /* Known bonus to ac */ + + s16b dis_ac = 0; /* Known base ac */ + + s16b to_l = 0; /* Bonus to life */ + s16b to_m = 0; /* Bonus to mana */ + s16b to_s = 0; /* Bonus to spell */ + s16b to_h = 0; /* Bonus to hit */ + s16b to_d = 0; /* Bonus to dam */ + s16b to_h_melee = 0; /* Bonus to hit for melee */ + s16b to_d_melee = 0; /* Bonus to dam for melee */ + s16b to_h_ranged = 0; /* Bonus to hit for ranged */ + s16b to_d_ranged = 0; /* Bonus to dam for ranged */ + s16b to_a = 0; /* Bonus to ac */ + + s16b ac = 0; /* Base ac */ + + byte antimagic = 0; /* Power of the anti magic field */ + byte antimagic_dis = 0; /* Radius of the anti magic field */ + + s16b see_infra; /* Infravision range */ + + s16b skill_dis = 0; /* Skill: Disarming */ + s16b skill_dev = 0; /* Skill: Magic Devices */ + s16b skill_sav = 0; /* Skill: Saving throw */ + s16b skill_stl = 0; /* Skill: Stealth factor */ + s16b skill_srh = 0; /* Skill: Searching ability */ + s16b skill_fos = 0; /* Skill: Searching frequency */ + s16b skill_thn = 0; /* Skill: To hit (normal) */ + s16b skill_thb = 0; /* Skill: To hit (shooting) */ + s16b skill_tht = 0; /* Skill: To hit (throwing) */ + s16b skill_dig = 0; /* Skill: Digging */ + + s16b num_blow = 0; /* Number of blows */ + s16b num_fire = 0; /* Number of shots */ + s16b xtra_crit = 0; /* % of increased crits */ + + byte throw_mult = 0; /* Multiplier for throw damage */ + + byte tval_ammo = 0; /* Correct ammo tval */ + + s16b pspeed = 0; /* Current speed */ + + u32b mimic_extra = 0; /* Mimicry powers use that */ + u32b antimagic_extra = 0; /* Antimagic powers */ + u32b music_extra = 0; /* Music songs */ + u32b necro_extra = 0; /* Necro powers */ + u32b necro_extra2 = 0; /* Necro powers */ - s16b dodge_chance; /* Dodging chance */ + s16b dodge_chance = 0; /* Dodging chance */ - u32b maintain_sum; /* Do we have partial summons */ + u32b maintain_sum = 0; /* Do we have partial summons */ - byte spellbinder_num; /* Number of spells bound */ - u32b spellbinder[4]; /* Spell bounds */ - byte spellbinder_trigger; /* Spellbinder trigger condition */ + byte spellbinder_num = 0; /* Number of spells bound */ + u32b spellbinder[4] = { 0 }; /* Spell bounds */ + byte spellbinder_trigger = 0; /* Spellbinder trigger condition */ - cptr mimic_name; + cptr mimic_name = nullptr; - char tactic; /* from 128-4 extremely coward to */ - /* 128+4 berserker */ - char movement; /* base movement way */ + char tactic = '\0'; /* from 128-4 "extremely coward" to, 128+4 "berserker" */ + char movement = '\0'; /* base movement way */ - s16b companion_killed; /* Number of companion death */ + s16b companion_killed = 0; /* Number of companion death */ - bool_ no_mortal; /* Fated to never die by the hand of a mortal being */ + bool_ no_mortal = FALSE; /* Fated to never die by the hand of a mortal being */ - bool_ black_breath; /* The Tolkien's Black Breath */ + bool_ black_breath = FALSE; /* The Tolkien's Black Breath */ - bool_ precognition; /* Like the cheat mode */ + bool_ precognition = FALSE; /* Like the cheat mode */ /*** Extra flags -- used for lua and easying stuff ***/ - u32b xtra_f1; - u32b xtra_f2; - u32b xtra_f3; - u32b xtra_f4; - u32b xtra_f5; - u32b xtra_esp; + u32b xtra_f1 = 0; + u32b xtra_f2 = 0; + u32b xtra_f3 = 0; + u32b xtra_f4 = 0; + u32b xtra_f5 = 0; + u32b xtra_esp = 0; /* Corruptions */ - bool_ corruptions[CORRUPTIONS_MAX]; - bool_ corrupt_anti_teleport_stopped; + bool_ corruptions[CORRUPTIONS_MAX] = { FALSE }; + bool_ corrupt_anti_teleport_stopped = FALSE; /*** Pet commands ***/ - byte pet_follow_distance; /* Length of the imaginary "leash" for pets */ - byte pet_open_doors; /* flag - allow pets to open doors */ - byte pet_pickup_items; /* flag - allow pets to pickup items */ + byte pet_follow_distance = 0; /* Length of the imaginary "leash" for pets */ + byte pet_open_doors = 0; /* flag - allow pets to open doors */ + byte pet_pickup_items = 0; /* flag - allow pets to pickup items */ - s16b control; /* Controlled monster */ - byte control_dir; /* Controlled monster */ + s16b control = 0; /* Controlled monster */ + byte control_dir; /* Controlled monster */ /*** Body changing variables ***/ - u16b body_monster; /* In which body is the player */ - bool_ disembodied; /* Is the player in a body ? */ - byte body_parts[INVEN_TOTAL - INVEN_WIELD]; /* Which body parts does he have ? */ + u16b body_monster = 0; /* In which body is the player */ + bool_ disembodied = FALSE; /* Is the player in a body ? */ + std::array body_parts = /* Which body parts does he have ? */ + { }; /* Astral */ - bool_ astral; /* We started at the bottom ? */ + bool_ astral = FALSE; /* We started at the bottom ? */ /* Powers */ - bool_ powers[POWER_MAX]; /* Actual powers */ - bool_ powers_mod[POWER_MAX]; /* Intrinsinc powers */ + bool_ powers[POWER_MAX] = { FALSE }; /* Actual powers */ + bool_ powers_mod[POWER_MAX] = { FALSE }; /* Intrinsinc powers */ /* Skills */ - s16b skill_points; - s16b skill_last_level; /* Prevents gaining skills by losing level and regaining them */ - s16b melee_style; /* How are */ - s16b use_piercing_shots; /* for archery */ + s16b skill_points = 0; + s16b skill_last_level = 0; /* Prevents gaining skills by losing level and regaining them */ + s16b melee_style = 0; /* How are */ + s16b use_piercing_shots = 0; /* for archery */ /* Dripping Tread spell timer */ - s16b dripping_tread; + s16b dripping_tread = 0; /* Help */ help_info help; /* Inertia control */ - s32b inertia_controlled_spell; + s32b inertia_controlled_spell = 0; /* For automatic stat-gain */ - s16b last_rewarded_level; + s16b last_rewarded_level = 0; /*** Temporary fields ***/ - bool_ did_nothing; /* True if the last action wasnt a real action */ - bool_ leaving; /* True if player is leaving */ + bool_ did_nothing = FALSE; /* True if the last action wasnt a real action */ + bool_ leaving = FALSE; /* True if player is leaving */ }; -- cgit v1.2.3 From 287df870759d0fc854f76d34151a597b9f529b43 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change object_type to non-POD type --- src/init2.cc | 2 +- src/object2.cc | 3 +- src/object_type.hpp | 97 ++++++++++++++++++++++++++--------------------------- 3 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 4201d214..5479708f 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -770,7 +770,7 @@ static errr init_other(void) /* Allocate and Wipe the object list */ - o_list = make_array(max_o_idx); + o_list = new object_type[max_o_idx]; /* Allocate and Wipe the monster list */ m_list = new monster_type[max_m_idx]; diff --git a/src/object2.cc b/src/object2.cc index 7a4b6211..8b81efae 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -1814,8 +1814,7 @@ s16b lookup_kind(int tval, int sval) void object_wipe(object_type *o_ptr) { /* Wipe the structure */ - static_assert(std::is_pod::value, "object_type must be POD type for memset to work"); - memset(o_ptr, 0, sizeof(object_type)); + *o_ptr = object_type(); } diff --git a/src/object_type.hpp b/src/object_type.hpp index d7f003e6..c0f59547 100644 --- a/src/object_type.hpp +++ b/src/object_type.hpp @@ -31,74 +31,73 @@ */ struct object_type { - s16b k_idx; /* Kind index (zero if "dead") */ + s16b k_idx = 0; /* Kind index (zero if "dead") */ - byte iy; /* Y-position on map, or zero */ - byte ix; /* X-position on map, or zero */ + byte iy = 0; /* Y-position on map, or zero */ + byte ix = 0; /* X-position on map, or zero */ - byte tval; /* Item type (from kind) */ - byte sval; /* Item sub-type (from kind) */ + byte tval = 0; /* Item type (from kind) */ + byte sval = 0; /* Item sub-type (from kind) */ - s32b pval; /* Item extra-parameter */ - s16b pval2; /* Item extra-parameter for some special - items*/ - s32b pval3; /* Item extra-parameter for some special - items*/ + s32b pval = 0; /* Item extra-parameter */ + s16b pval2 = 0; /* Item extra-parameter for some special items */ + s32b pval3 = 0; /* Item extra-parameter for some special items */ - byte discount; /* Discount (if any) */ + byte discount = 0; /* Discount (if any) */ - byte number; /* Number of items */ + byte number = 0; /* Number of items */ - s32b weight; /* Item weight */ + s32b weight = 0; /* Item weight */ - byte elevel; /* Item exp level */ - s32b exp; /* Item exp */ + byte elevel = 0; /* Item exp level */ + s32b exp = 0; /* Item exp */ - byte name1; /* Artifact type, if any */ - s16b name2; /* Ego-Item type, if any */ - s16b name2b; /* Second Ego-Item type, if any */ + byte name1 = 0; /* Artifact type, if any */ + s16b name2 = 0; /* Ego-Item type, if any */ + s16b name2b = 0; /* Second Ego-Item type, if any */ - byte xtra1; /* Extra info type */ - s16b xtra2; /* Extra info index */ + byte xtra1 = 0; /* Extra info type */ + s16b xtra2 = 0; /* Extra info index */ - s16b to_h; /* Plusses to hit */ - s16b to_d; /* Plusses to damage */ - s16b to_a; /* Plusses to AC */ + s16b to_h = 0; /* Plusses to hit */ + s16b to_d = 0; /* Plusses to damage */ + s16b to_a = 0; /* Plusses to AC */ - s16b ac; /* Normal AC */ + s16b ac = 0; /* Normal AC */ - byte dd, ds; /* Damage dice/sides */ + byte dd = 0; /* Damage dice/sides */ + byte ds = 0; /* Damage dice/sides */ - s16b timeout; /* Timeout Counter */ + s16b timeout = 0; /* Timeout Counter */ - byte ident; /* Special flags */ + byte ident = 0; /* Special flags */ - byte marked; /* Object is marked */ + byte marked = 0; /* Object is marked */ - u16b note; /* Inscription index */ - u16b art_name; /* Artifact name (random artifacts) */ + u16b note = 0; /* Inscription index */ + u16b art_name = 0; /* Artifact name (random artifacts) */ - u32b art_flags1; /* Flags, set 1 Alas, these were necessary */ - u32b art_flags2; /* Flags, set 2 for the random artifacts of*/ - u32b art_flags3; /* Flags, set 3 Zangband */ - u32b art_flags4; /* Flags, set 4 PernAngband */ - u32b art_flags5; /* Flags, set 5 PernAngband */ - u32b art_esp; /* Flags, set esp PernAngband */ + u32b art_flags1 = 0; /* Flags, set 1 Alas, these were necessary */ + u32b art_flags2 = 0; /* Flags, set 2 for the random artifacts of*/ + u32b art_flags3 = 0; /* Flags, set 3 Zangband */ + u32b art_flags4 = 0; /* Flags, set 4 PernAngband */ + u32b art_flags5 = 0; /* Flags, set 5 PernAngband */ + u32b art_esp = 0; /* Flags, set esp PernAngband */ - u32b art_oflags1; /* Obvious Flags, set 1 */ - u32b art_oflags2; /* Obvious Flags, set 2 */ - u32b art_oflags3; /* Obvious Flags, set 3 */ - u32b art_oflags4; /* Obvious Flags, set 4 */ - u32b art_oflags5; /* Obvious Flags, set 5 */ - u32b art_oesp; /* Obvious Flags, set esp */ + u32b art_oflags1 = 0; /* Obvious Flags, set 1 */ + u32b art_oflags2 = 0; /* Obvious Flags, set 2 */ + u32b art_oflags3 = 0; /* Obvious Flags, set 3 */ + u32b art_oflags4 = 0; /* Obvious Flags, set 4 */ + u32b art_oflags5 = 0; /* Obvious Flags, set 5 */ + u32b art_oesp = 0; /* Obvious Flags, set esp */ - s16b held_m_idx; /* Monster holding us (if any) */ + s16b held_m_idx = 0; /* Monster holding the object; if any */ - byte sense; /* Pseudo-id status */ + byte sense = 0; /* Pseudo-id status */ - byte found; /* How did we find it */ - s16b found_aux1; /* Stores info for found */ - s16b found_aux2; /* Stores info for found */ - s16b found_aux3; /* Stores info for found */ - s16b found_aux4; /* Stores info for found */ + byte found = 0; /* How did we find it */ + s16b found_aux1 = 0; /* Stores info for found */ + s16b found_aux2 = 0; /* Stores info for found */ + s16b found_aux3 = 0; /* Stores info for found */ + s16b found_aux4 = 0; /* Stores info for found */ }; -- cgit v1.2.3 From 9c26f78ce556d3a0717e4bc5668a1ed59217f414 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change player_{race, spec, class} to non-POD types --- src/init2.cc | 6 +- src/player_class.hpp | 167 +++++++++++++++++++-------------------- src/player_race.hpp | 85 ++++++++++---------- src/player_race_ability_type.hpp | 9 +++ src/player_race_mod.hpp | 95 +++++++++++----------- src/player_spec.hpp | 41 +++++----- src/xtra2.cc | 5 -- 7 files changed, 202 insertions(+), 206 deletions(-) create mode 100644 src/player_race_ability_type.hpp diff --git a/src/init2.cc b/src/init2.cc index 5479708f..a539a470 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -550,9 +550,9 @@ namespace { static void allocate() { - race_info = make_array(max_rp_idx); - race_mod_info = make_array(max_rmp_idx); - class_info = make_array(max_c_idx); + race_info = new player_race[max_rp_idx]; + race_mod_info = new player_race_mod[max_rmp_idx]; + class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); meta_class_info = make_array(max_mc_idx); for (std::size_t i = 0; i < max_mc_idx; i++) diff --git a/src/player_class.hpp b/src/player_class.hpp index d67d1d73..c5fc8916 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -15,91 +15,86 @@ constexpr int MAX_SPEC = 20; */ struct player_class { - const char *title; /* Type of class */ - char *desc; /* Small desc of the class */ - const char *titles[PY_MAX_LEVEL / 5]; - /* Titles */ - - s16b c_adj[6]; /* Class stat modifier */ - - s16b c_dis; /* class disarming */ - s16b c_dev; /* class magic devices */ - s16b c_sav; /* class saving throws */ - s16b c_stl; /* class stealth */ - s16b c_srh; /* class searching ability */ - s16b c_fos; /* class searching frequency */ - s16b c_thn; /* class to hit (normal) */ - s16b c_thb; /* class to hit (bows) */ - - s16b x_dis; /* extra disarming */ - s16b x_dev; /* extra magic devices */ - s16b x_sav; /* extra saving throws */ - s16b x_stl; /* extra stealth */ - s16b x_srh; /* extra searching ability */ - s16b x_fos; /* extra searching frequency */ - s16b x_thn; /* extra to hit (normal) */ - s16b x_thb; /* extra to hit (bows) */ - - s16b c_mhp; /* Class hit-dice adjustment */ - s16b c_exp; /* Class experience factor */ - - s16b powers[4]; /* Powers of the class */ - - s16b spell_book; /* Tval of spell books (if any) */ - s16b spell_stat; /* Stat for spells (if any) */ - s16b spell_lev; /* The higher it is the higher the spells level are */ - s16b spell_fail; /* The higher it is the higher the spells failure are */ - s16b spell_mana; /* The higher it is the higher the spells mana are */ - s16b spell_first; /* Level of first spell */ - s16b spell_weight; /* Weight that hurts spells */ - byte max_spell_level; /* Maximun spell level */ - byte magic_max_spell; /* Maximun numbner of spells one can learn by natural means */ - - u32b flags1; /* flags */ - u32b flags2; /* flags */ - - s16b mana; - s16b blow_num; - s16b blow_wgt; - s16b blow_mul; - s16b extra_blows; - - s32b sense_base; - s32b sense_pl; - s32b sense_plus; - byte sense_heavy; - byte sense_heavy_magic; - - s16b obj_tval[5]; - s16b obj_sval[5]; - s16b obj_pval[5]; - s16b obj_dd[5]; - s16b obj_ds[5]; - s16b obj_num; - - char body_parts[BODY_MAX]; /* To help to decide what to use when body changing */ - - u32b oflags1[PY_MAX_LEVEL + 1]; - u32b oflags2[PY_MAX_LEVEL + 1]; - u32b oflags3[PY_MAX_LEVEL + 1]; - u32b oflags4[PY_MAX_LEVEL + 1]; - u32b oflags5[PY_MAX_LEVEL + 1]; - u32b oesp[PY_MAX_LEVEL + 1]; - s16b opval[PY_MAX_LEVEL + 1]; - - char skill_basem[MAX_SKILLS]; - u32b skill_base[MAX_SKILLS]; - char skill_modm[MAX_SKILLS]; - s16b skill_mod[MAX_SKILLS]; - - u32b gods; - - player_spec spec[MAX_SPEC]; - - struct - { - s16b ability; - s16b level; - } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + const char *title = nullptr; /* Type of class */ + char *desc = nullptr; /* Small desc of the class */ + const char *titles[PY_MAX_LEVEL / 5] { }; /* Titles */ + + s16b c_adj[6] { }; /* Class stat modifier */ + + s16b c_dis = 0; /* class disarming */ + s16b c_dev = 0; /* class magic devices */ + s16b c_sav = 0; /* class saving throws */ + s16b c_stl = 0; /* class stealth */ + s16b c_srh = 0; /* class searching ability */ + s16b c_fos = 0; /* class searching frequency */ + s16b c_thn = 0; /* class to hit (normal) */ + s16b c_thb = 0; /* class to hit (bows) */ + + s16b x_dis = 0; /* extra disarming */ + s16b x_dev = 0; /* extra magic devices */ + s16b x_sav = 0; /* extra saving throws */ + s16b x_stl = 0; /* extra stealth */ + s16b x_srh = 0; /* extra searching ability */ + s16b x_fos = 0; /* extra searching frequency */ + s16b x_thn = 0; /* extra to hit (normal) */ + s16b x_thb = 0; /* extra to hit (bows) */ + + s16b c_mhp = 0; /* Class hit-dice adjustment */ + s16b c_exp = 0; /* Class experience factor */ + + s16b powers[4] { }; /* Powers of the class */ + + s16b spell_book = 0; /* Tval of spell books (if any) */ + s16b spell_stat = 0; /* Stat for spells (if any) */ + s16b spell_lev = 0; /* The higher it is the higher the spells level are */ + s16b spell_fail = 0; /* The higher it is the higher the spells failure are */ + s16b spell_mana = 0; /* The higher it is the higher the spells mana are */ + s16b spell_first = 0; /* Level of first spell */ + s16b spell_weight = 0; /* Weight that hurts spells */ + byte max_spell_level = 0; /* Maximun spell level */ + byte magic_max_spell = 0; /* Maximun numbner of spells one can learn by natural means */ + + u32b flags1 = 0; + u32b flags2 = 0; + + s16b mana = 0; + s16b blow_num = 0; + s16b blow_wgt = 0; + s16b blow_mul = 0; + s16b extra_blows = 0; + + s32b sense_base = 0; + s32b sense_pl = 0; + s32b sense_plus = 0; + byte sense_heavy = 0; + byte sense_heavy_magic = 0; + + s16b obj_tval[5] { }; + s16b obj_sval[5] { }; + s16b obj_pval[5] { }; + s16b obj_dd[5] { }; + s16b obj_ds[5] { }; + s16b obj_num = 0; + + char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ + + u32b oflags1[PY_MAX_LEVEL + 1] { }; + u32b oflags2[PY_MAX_LEVEL + 1] { }; + u32b oflags3[PY_MAX_LEVEL + 1] { }; + u32b oflags4[PY_MAX_LEVEL + 1] { }; + u32b oflags5[PY_MAX_LEVEL + 1] { }; + u32b oesp[PY_MAX_LEVEL + 1] { }; + s16b opval[PY_MAX_LEVEL + 1] { }; + + char skill_basem[MAX_SKILLS] { }; + u32b skill_base[MAX_SKILLS] { }; + char skill_modm[MAX_SKILLS] { }; + s16b skill_mod[MAX_SKILLS] { }; + + u32b gods = 0; + + std::array spec; + + std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ }; diff --git a/src/player_race.hpp b/src/player_race.hpp index 3be39bdf..f1933557 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -3,68 +3,67 @@ #include "h-basic.h" #include "body.hpp" #include "player_defs.hpp" +#include "player_race_ability_type.hpp" #include "skills_defs.hpp" +#include + /** * Player racial descriptior. */ struct player_race { - const char *title; /* Type of race */ - char *desc; + const char *title = nullptr; /* Type of race */ + char *desc = nullptr; - s16b r_adj[6]; /* Racial stat bonuses */ + s16b r_adj[6] { }; /* Racial stat bonuses */ - char luck; /* Luck */ + char luck = '\0'; /* Luck */ - s16b r_dis; /* disarming */ - s16b r_dev; /* magic devices */ - s16b r_sav; /* saving throw */ - s16b r_stl; /* stealth */ - s16b r_srh; /* search ability */ - s16b r_fos; /* search frequency */ - s16b r_thn; /* combat (normal) */ - s16b r_thb; /* combat (shooting) */ + s16b r_dis = 0; /* disarming */ + s16b r_dev = 0; /* magic devices */ + s16b r_sav = 0; /* saving throw */ + s16b r_stl = 0; /* stealth */ + s16b r_srh = 0; /* search ability */ + s16b r_fos = 0; /* search frequency */ + s16b r_thn = 0; /* combat (normal) */ + s16b r_thb = 0; /* combat (shooting) */ - byte r_mhp; /* Race hit-dice modifier */ - u16b r_exp; /* Race experience factor */ + byte r_mhp = 0; /* Race hit-dice modifier */ + u16b r_exp = 0; /* Race experience factor */ - byte infra; /* Infra-vision range */ + byte infra = 0; /* Infra-vision range */ - u32b choice[2]; /* Legal class choices */ + u32b choice[2] { }; /* Legal class choices */ - s16b powers[4]; /* Powers of the race */ + s16b powers[4] { }; /* Powers of the race */ - byte body_parts[BODY_MAX]; /* To help to decide what to use when body changing */ + byte body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - s16b chart; /* Chart history */ + s16b chart = 0; /* Chart history */ - u32b flags1; - u32b flags2; /* flags */ + u32b flags1 = 0; + u32b flags2 = 0; - u32b oflags1[PY_MAX_LEVEL + 1]; - u32b oflags2[PY_MAX_LEVEL + 1]; - u32b oflags3[PY_MAX_LEVEL + 1]; - u32b oflags4[PY_MAX_LEVEL + 1]; - u32b oflags5[PY_MAX_LEVEL + 1]; - u32b oesp[PY_MAX_LEVEL + 1]; - s16b opval[PY_MAX_LEVEL + 1]; + u32b oflags1[PY_MAX_LEVEL + 1] { }; + u32b oflags2[PY_MAX_LEVEL + 1] { }; + u32b oflags3[PY_MAX_LEVEL + 1] { }; + u32b oflags4[PY_MAX_LEVEL + 1] { }; + u32b oflags5[PY_MAX_LEVEL + 1] { }; + u32b oesp[PY_MAX_LEVEL + 1] { }; + s16b opval[PY_MAX_LEVEL + 1] { }; - char skill_basem[MAX_SKILLS]; - u32b skill_base[MAX_SKILLS]; - char skill_modm[MAX_SKILLS]; - s16b skill_mod[MAX_SKILLS]; + char skill_basem[MAX_SKILLS] { }; + u32b skill_base[MAX_SKILLS] { }; + char skill_modm[MAX_SKILLS] { }; + s16b skill_mod[MAX_SKILLS] { }; - s16b obj_tval[5]; - s16b obj_sval[5]; - s16b obj_pval[5]; - s16b obj_dd[5]; - s16b obj_ds[5]; - s16b obj_num; + s16b obj_tval[5] { }; + s16b obj_sval[5] { }; + s16b obj_pval[5] { }; + s16b obj_dd[5] { }; + s16b obj_ds[5] { }; + s16b obj_num = 0; - struct - { - s16b ability; - s16b level; - } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ }; diff --git a/src/player_race_ability_type.hpp b/src/player_race_ability_type.hpp new file mode 100644 index 00000000..5f520052 --- /dev/null +++ b/src/player_race_ability_type.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "h-basic.h" + +struct player_race_ability_type +{ + s16b ability = 0; + s16b level = 0; +}; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 9f21b253..23be55d7 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -3,73 +3,72 @@ #include "body.hpp" #include "h-basic.h" #include "player_defs.hpp" +#include "player_race_ability_type.hpp" #include "skills_defs.hpp" +#include + struct player_race_mod { - char *title; /* Type of race mod */ - char *desc; /* Desc */ + char *title = nullptr; /* Type of race mod */ + char *desc = nullptr; /* Desc */ - bool_ place; /* TRUE = race race modifier, FALSE = Race modifier race */ + bool_ place = FALSE; /* TRUE = race race modifier, FALSE = Race modifier race */ - s16b r_adj[6]; /* (+) Racial stat bonuses */ + s16b r_adj[6] { }; /* (+) Racial stat bonuses */ - char luck; /* Luck */ - s16b mana; /* Mana % */ + char luck = '\0'; /* Luck */ + s16b mana = 0; /* Mana % */ - s16b r_dis; /* (+) disarming */ - s16b r_dev; /* (+) magic devices */ - s16b r_sav; /* (+) saving throw */ - s16b r_stl; /* (+) stealth */ - s16b r_srh; /* (+) search ability */ - s16b r_fos; /* (+) search frequency */ - s16b r_thn; /* (+) combat (normal) */ - s16b r_thb; /* (+) combat (shooting) */ + s16b r_dis = 0; /* (+) disarming */ + s16b r_dev = 0; /* (+) magic devices */ + s16b r_sav = 0; /* (+) saving throw */ + s16b r_stl = 0; /* (+) stealth */ + s16b r_srh = 0; /* (+) search ability */ + s16b r_fos = 0; /* (+) search frequency */ + s16b r_thn = 0; /* (+) combat (normal) */ + s16b r_thb = 0; /* (+) combat (shooting) */ - char r_mhp; /* (+) Race mod hit-dice modifier */ - s16b r_exp; /* (+) Race mod experience factor */ + char r_mhp = 0; /* (+) Race mod hit-dice modifier */ + s16b r_exp = 0; /* (+) Race mod experience factor */ - char infra; /* (+) Infra-vision range */ + char infra = '\0'; /* (+) Infra-vision range */ - u32b choice[2]; /* Legal race choices */ + u32b choice[2] { }; /* Legal race choices */ - u32b pclass[2]; /* Classes allowed */ - u32b mclass[2]; /* Classes restricted */ + u32b pclass[2] { }; /* Classes allowed */ + u32b mclass[2] { }; /* Classes restricted */ - s16b powers[4]; /* Powers of the subrace */ + s16b powers[4] { }; /* Powers of the subrace */ - char body_parts[BODY_MAX]; /* To help to decide what to use when body changing */ + char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - u32b flags1; - u32b flags2; /* flags */ + u32b flags1 = 0; + u32b flags2 = 0; - u32b oflags1[PY_MAX_LEVEL + 1]; - u32b oflags2[PY_MAX_LEVEL + 1]; - u32b oflags3[PY_MAX_LEVEL + 1]; - u32b oflags4[PY_MAX_LEVEL + 1]; - u32b oflags5[PY_MAX_LEVEL + 1]; - u32b oesp[PY_MAX_LEVEL + 1]; - s16b opval[PY_MAX_LEVEL + 1]; + u32b oflags1[PY_MAX_LEVEL + 1] { }; + u32b oflags2[PY_MAX_LEVEL + 1] { }; + u32b oflags3[PY_MAX_LEVEL + 1] { }; + u32b oflags4[PY_MAX_LEVEL + 1] { }; + u32b oflags5[PY_MAX_LEVEL + 1] { }; + u32b oesp[PY_MAX_LEVEL + 1] { }; + s16b opval[PY_MAX_LEVEL + 1] { }; - byte g_attr; /* Overlay graphic attribute */ - char g_char; /* Overlay graphic character */ + byte g_attr = 0; /* Overlay graphic attribute */ + char g_char = '\0'; /* Overlay graphic character */ - char skill_basem[MAX_SKILLS]; - u32b skill_base[MAX_SKILLS]; - char skill_modm[MAX_SKILLS]; - s16b skill_mod[MAX_SKILLS]; + char skill_basem[MAX_SKILLS] { }; + u32b skill_base[MAX_SKILLS] { }; + char skill_modm[MAX_SKILLS] { }; + s16b skill_mod[MAX_SKILLS] { }; - s16b obj_tval[5]; - s16b obj_sval[5]; - s16b obj_pval[5]; - s16b obj_dd[5]; - s16b obj_ds[5]; - s16b obj_num; + s16b obj_tval[5] { }; + s16b obj_sval[5] { }; + s16b obj_pval[5] { }; + s16b obj_dd[5] { }; + s16b obj_ds[5] { }; + s16b obj_num = 0; - struct - { - s16b ability; - s16b level; - } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + std::array abilities; /* Abilities to be gained by level; doesnt take prereqs in account */ }; diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 28b32830..5105df31 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -1,38 +1,37 @@ #pragma once #include "h-basic.h" +#include "player_race_ability_type.hpp" #include "skills_defs.hpp" +#include + /** * Player class descriptor. */ struct player_spec { - const char *title; /* Type of class spec */ - char *desc; /* Small desc of the class spec */ + const char *title = nullptr; /* Type of class spec */ + char *desc = nullptr; /* Small desc of the class spec */ - char skill_basem[MAX_SKILLS]; /* Mod for value */ - u32b skill_base[MAX_SKILLS]; /* value */ - char skill_modm[MAX_SKILLS]; /* mod for mod */ - s16b skill_mod[MAX_SKILLS]; /* mod */ + char skill_basem[MAX_SKILLS] { }; /* Mod for value */ + u32b skill_base[MAX_SKILLS] { }; /* value */ + char skill_modm[MAX_SKILLS] { }; /* mod for mod */ + s16b skill_mod[MAX_SKILLS] { }; /* mod */ - u32b skill_ideal[MAX_SKILLS]; /* Ideal skill levels at level 50 */ + u32b skill_ideal[MAX_SKILLS] { }; /* Ideal skill levels at level 50 */ - s16b obj_tval[5]; - s16b obj_sval[5]; - s16b obj_pval[5]; - s16b obj_dd[5]; - s16b obj_ds[5]; - s16b obj_num; + s16b obj_tval[5] { }; + s16b obj_sval[5] { }; + s16b obj_pval[5] { }; + s16b obj_dd[5] { }; + s16b obj_ds[5] { }; + s16b obj_num = 0; - u32b gods; + u32b gods = 0; - u32b flags1; - u32b flags2; /* flags */ + u32b flags1 = 0; + u32b flags2 = 0; - struct - { - s16b ability; - s16b level; - } abilities[10]; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + std::array abilities; /* Abilities to be gained by level(doesnt take prereqs in account) */ }; diff --git a/src/xtra2.cc b/src/xtra2.cc index 222d12cd..5193aa81 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5356,11 +5356,6 @@ void switch_subrace(int racem, bool_ copy_old) /* If we switch to the saved subrace, we copy over the old subrace data */ if (copy_old && (racem == SUBRACE_SAVE)) { - // This code is very reliant on the race_mod_info - // elements being simple PODs, in particular the - // text pointers being *unmanaged* owned pointers. - static_assert(std::is_pod::value, - "This code needs reworking"); // Keep references to owned pointers. auto old_title = race_mod_info[SUBRACE_SAVE].title; auto old_desc = race_mod_info[SUBRACE_SAVE].desc; -- cgit v1.2.3 From 2fcc9f1712b630055ae9ce5c3ecf017b8a93fbbb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change flags_group to non-POD type --- src/defines.h | 2 - src/flags_group.hpp | 16 ++-- src/object1.cc | 30 +++---- src/tables.cc | 246 ++++++++++++++++++++++++++-------------------------- src/tables.hpp | 4 +- 5 files changed, 150 insertions(+), 148 deletions(-) diff --git a/src/defines.h b/src/defines.h index 7c33e15a..c99bcb39 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2476,8 +2476,6 @@ #define ESP_SPIDER 0x00001000L #define ESP_ALL 0x80000000L -/* Number of group of flags to choose from */ -#define MAX_FLAG_GROUP 12 #define NEW_GROUP_CHANCE 40 /* Chance to get a new group */ /* diff --git a/src/flags_group.hpp b/src/flags_group.hpp index bdf5216b..8bd4bacb 100644 --- a/src/flags_group.hpp +++ b/src/flags_group.hpp @@ -7,14 +7,14 @@ */ struct flags_group { - char name[30]; /* Name */ - byte color; /* Color */ + char name[30] { }; /* Name */ + byte color = 0; /* Color */ - byte price; /* Price to "buy" it */ + byte price = 0; /* Price to "buy" it */ - u32b flags1; /* Flags set 1 */ - u32b flags2; /* Flags set 2 */ - u32b flags3; /* Flags set 3 */ - u32b flags4; /* Flags set 4 */ - u32b esp; /* ESP flags set */ + u32b flags1 = 0; /* Flags set 1 */ + u32b flags2 = 0; /* Flags set 2 */ + u32b flags3 = 0; /* Flags set 3 */ + u32b flags4 = 0; /* Flags set 4 */ + u32b esp = 0; /* ESP flags set */ }; diff --git a/src/object1.cc b/src/object1.cc index fd3ab769..ae803db9 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2667,19 +2667,17 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if ((f4 & TR4_LEVELS) && (!trim_down)) { - int j = 0; - if (count_bits(o_ptr->pval3) == 0) text_out("It is sentient"); else if (count_bits(o_ptr->pval3) > 1) text_out("It is sentient and can have access to the realms of "); else text_out("It is sentient and can have access to the realm of "); bool_ first = TRUE; - for (j = 0; j < MAX_FLAG_GROUP; j++) + for (std::size_t j = 0; j < flags_groups().size(); j++) { if (BIT(j) & o_ptr->pval3) { check_first(&first); - text_out_c(flags_groups[j].color, flags_groups[j].name); + text_out_c(flags_groups()[j].color, flags_groups()[j].name); } } @@ -6057,13 +6055,13 @@ static void gain_flag_group(object_type *o_ptr) while (tries--) { - grp = rand_int(MAX_FLAG_GROUP); + grp = rand_int(flags_groups().size()); /* If we already got this group continue */ if (o_ptr->pval3 & BIT(grp)) continue; /* Not enough points ? */ - if (flags_groups[grp].price > o_ptr->pval2) continue; + if (flags_groups()[grp].price > o_ptr->pval2) continue; /* Ok, enough points and not already got it */ break; @@ -6072,7 +6070,7 @@ static void gain_flag_group(object_type *o_ptr) /* Ack, nothing found */ if (tries <= 1) return; - o_ptr->pval2 -= flags_groups[grp].price; + o_ptr->pval2 -= flags_groups()[grp].price; o_ptr->pval3 |= BIT(grp); /* Message */ @@ -6080,7 +6078,7 @@ static void gain_flag_group(object_type *o_ptr) char o_name[80]; object_desc(o_name, o_ptr, FALSE, 0); - msg_format("%s gains access to the %s realm.", o_name, flags_groups[grp].name); + msg_format("%s gains access to the %s realm.", o_name, flags_groups()[grp].name); } } @@ -6097,27 +6095,27 @@ static u32b get_flag(object_type *o_ptr, int grp, int k) switch (k) { case 0: - flag_set = flags_groups[grp].flags1; + flag_set = flags_groups()[grp].flags1; flag_test = f1; break; case 1: - flag_set = flags_groups[grp].flags2; + flag_set = flags_groups()[grp].flags2; flag_test = f2; break; case 2: - flag_set = flags_groups[grp].flags3; + flag_set = flags_groups()[grp].flags3; flag_test = f3; break; case 3: - flag_set = flags_groups[grp].flags4; + flag_set = flags_groups()[grp].flags4; flag_test = f4; break; case 4: - flag_set = flags_groups[grp].esp; + flag_set = flags_groups()[grp].esp; flag_test = esp; break; default: - flag_set = flags_groups[grp].flags1; + flag_set = flags_groups()[grp].flags1; flag_test = f1; break; } @@ -6159,7 +6157,7 @@ static void gain_flag_group_flag(object_type *o_ptr) k = rand_int(5); /* get a flag group */ - grp = rand_int(MAX_FLAG_GROUP); + grp = rand_int(flags_groups().size()); if (!(BIT(grp) & o_ptr->pval3)) continue; @@ -6197,7 +6195,7 @@ static void gain_flag_group_flag(object_type *o_ptr) char o_name[80]; object_desc(o_name, o_ptr, FALSE, 0); - msg_format("%s gains a new power from the %s realm.", o_name, flags_groups[grp].name); + msg_format("%s gains a new power from the %s realm.", o_name, flags_groups()[grp].name); } } diff --git a/src/tables.cc b/src/tables.cc index 5f873630..debee270 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2655,128 +2655,132 @@ cptr sense_desc[] = * Flags 4, * ESP, */ -flags_group flags_groups[MAX_FLAG_GROUP] = +extern std::vector const &flags_groups() { - { - "Fire", - TERM_L_RED, - 1, - TR1_SLAY_UNDEAD | TR1_BRAND_FIRE, - TR2_RES_FIRE, - TR3_SH_FIRE | TR3_LITE1 | TR3_IGNORE_FIRE, - 0, - 0, - }, - { - "Cold", - TERM_WHITE, - 1, - TR1_SLAY_DRAGON | TR1_SLAY_DEMON | TR1_BRAND_COLD, - TR2_RES_COLD | TR2_INVIS, - TR3_SLOW_DIGEST | TR3_IGNORE_COLD, - 0, - 0, - }, - { - "Acid", - TERM_GREEN, - 3, - TR1_SLAY_ANIMAL | TR1_IMPACT | TR1_TUNNEL | TR1_BRAND_ACID, - TR2_RES_ACID, - TR3_IGNORE_ACID, - 0, - 0, - }, - { - "Lightning", - TERM_L_BLUE, - 1, - TR1_SLAY_EVIL | TR1_BRAND_ELEC, - TR2_RES_ELEC, - TR3_IGNORE_ELEC | TR3_SH_ELEC | TR3_TELEPORT, - 0, - 0, - }, - { - "Poison", - TERM_L_GREEN, - 2, - TR1_CHR | TR1_VAMPIRIC | TR1_SLAY_ANIMAL | TR1_BRAND_POIS, - TR2_SUST_CHR | TR2_RES_POIS, - TR3_DRAIN_EXP, - 0, - ESP_TROLL | ESP_GIANT, - }, - { - "Air", - TERM_BLUE, - 5, - TR1_WIS | TR1_STEALTH | TR1_INFRA | TR1_SPEED, - TR2_RES_LITE | TR2_RES_DARK | TR2_RES_BLIND | TR2_SUST_WIS, - TR3_FEATHER | TR3_SEE_INVIS | TR3_BLESSED, - 0, - ESP_GOOD, - }, - { - "Earth", - TERM_L_UMBER, - 5, - TR1_STR | TR1_CON | TR1_TUNNEL | TR1_BLOWS | TR1_SLAY_TROLL | TR1_SLAY_GIANT | TR1_IMPACT, - TR2_SUST_STR | TR2_SUST_CON | TR2_FREE_ACT | TR2_RES_FEAR | TR2_RES_SHARDS, - TR3_REGEN, - 0, - ESP_TROLL | ESP_GIANT, - }, - { - "Mind", - TERM_YELLOW, - 7, - TR1_INT | TR1_SEARCH, - TR2_SUST_INT | TR2_RES_CONF | TR2_RES_FEAR, - 0, - 0, - ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON, - }, - { - "Shield", - TERM_RED, - 7, - TR1_DEX, - TR2_SUST_DEX | TR2_INVIS | TR2_REFLECT | TR2_HOLD_LIFE | TR2_RES_SOUND | TR2_RES_NEXUS, - TR3_REGEN, - 0, - 0, - }, - { - "Chaos", - TERM_VIOLET, - 7, - TR1_CHAOTIC | TR1_IMPACT, - TR2_RES_CHAOS | TR2_RES_DISEN, - TR3_REGEN, - 0, - ESP_ALL, - }, - { - "Magic", - TERM_L_BLUE, - 10, - TR1_MANA | TR1_SPELL, - TR2_RES_CHAOS | TR2_RES_DISEN, - TR3_WRAITH, - TR4_PRECOGNITION | TR4_FLY | TR4_CLONE, - 0, - }, - { - "Antimagic", - TERM_L_DARK, - 10, - TR1_VAMPIRIC | TR1_CHAOTIC | TR1_BLOWS | TR1_SPEED, - TR2_LIFE | TR2_REFLECT | TR2_FREE_ACT | TR2_HOLD_LIFE, - TR3_NO_MAGIC | TR3_NO_TELE | TR3_SEE_INVIS, - TR4_ANTIMAGIC_50, - 0, - }, + static auto *instance = new std::vector { + flags_group { + "Fire", + TERM_L_RED, + 1, + TR1_SLAY_UNDEAD | TR1_BRAND_FIRE, + TR2_RES_FIRE, + TR3_SH_FIRE | TR3_LITE1 | TR3_IGNORE_FIRE, + 0, + 0, + }, + flags_group { + "Cold", + TERM_WHITE, + 1, + TR1_SLAY_DRAGON | TR1_SLAY_DEMON | TR1_BRAND_COLD, + TR2_RES_COLD | TR2_INVIS, + TR3_SLOW_DIGEST | TR3_IGNORE_COLD, + 0, + 0, + }, + flags_group { + "Acid", + TERM_GREEN, + 3, + TR1_SLAY_ANIMAL | TR1_IMPACT | TR1_TUNNEL | TR1_BRAND_ACID, + TR2_RES_ACID, + TR3_IGNORE_ACID, + 0, + 0, + }, + flags_group { + "Lightning", + TERM_L_BLUE, + 1, + TR1_SLAY_EVIL | TR1_BRAND_ELEC, + TR2_RES_ELEC, + TR3_IGNORE_ELEC | TR3_SH_ELEC | TR3_TELEPORT, + 0, + 0, + }, + flags_group { + "Poison", + TERM_L_GREEN, + 2, + TR1_CHR | TR1_VAMPIRIC | TR1_SLAY_ANIMAL | TR1_BRAND_POIS, + TR2_SUST_CHR | TR2_RES_POIS, + TR3_DRAIN_EXP, + 0, + ESP_TROLL | ESP_GIANT, + }, + flags_group { + "Air", + TERM_BLUE, + 5, + TR1_WIS | TR1_STEALTH | TR1_INFRA | TR1_SPEED, + TR2_RES_LITE | TR2_RES_DARK | TR2_RES_BLIND | TR2_SUST_WIS, + TR3_FEATHER | TR3_SEE_INVIS | TR3_BLESSED, + 0, + ESP_GOOD, + }, + flags_group { + "Earth", + TERM_L_UMBER, + 5, + TR1_STR | TR1_CON | TR1_TUNNEL | TR1_BLOWS | TR1_SLAY_TROLL | TR1_SLAY_GIANT | TR1_IMPACT, + TR2_SUST_STR | TR2_SUST_CON | TR2_FREE_ACT | TR2_RES_FEAR | TR2_RES_SHARDS, + TR3_REGEN, + 0, + ESP_TROLL | ESP_GIANT, + }, + flags_group { + "Mind", + TERM_YELLOW, + 7, + TR1_INT | TR1_SEARCH, + TR2_SUST_INT | TR2_RES_CONF | TR2_RES_FEAR, + 0, + 0, + ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON, + }, + flags_group { + "Shield", + TERM_RED, + 7, + TR1_DEX, + TR2_SUST_DEX | TR2_INVIS | TR2_REFLECT | TR2_HOLD_LIFE | TR2_RES_SOUND | TR2_RES_NEXUS, + TR3_REGEN, + 0, + 0, + }, + flags_group { + "Chaos", + TERM_VIOLET, + 7, + TR1_CHAOTIC | TR1_IMPACT, + TR2_RES_CHAOS | TR2_RES_DISEN, + TR3_REGEN, + 0, + ESP_ALL, + }, + flags_group { + "Magic", + TERM_L_BLUE, + 10, + TR1_MANA | TR1_SPELL, + TR2_RES_CHAOS | TR2_RES_DISEN, + TR3_WRAITH, + TR4_PRECOGNITION | TR4_FLY | TR4_CLONE, + 0, + }, + flags_group { + "Antimagic", + TERM_L_DARK, + 10, + TR1_VAMPIRIC | TR1_CHAOTIC | TR1_BLOWS | TR1_SPEED, + TR2_LIFE | TR2_REFLECT | TR2_FREE_ACT | TR2_HOLD_LIFE, + TR3_NO_MAGIC | TR3_NO_TELE | TR3_SEE_INVIS, + TR4_ANTIMAGIC_50, + 0, + } + }; + + return *instance; }; /* Powers */ diff --git a/src/tables.hpp b/src/tables.hpp index c643d97e..aafbb763 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -21,6 +21,8 @@ #include "tactic_info_type.hpp" #include "tval_desc.hpp" +#include + extern s16b ddd[9]; extern s16b ddx[10]; extern s16b ddy[10]; @@ -64,7 +66,7 @@ extern tactic_info_type tactic_info[9]; extern activation activation_info[MAX_T_ACT]; extern inscription_info_type inscription_info[MAX_INSCRIPTIONS]; extern cptr sense_desc[]; -extern flags_group flags_groups[MAX_FLAG_GROUP]; +extern std::vector const &flags_groups(); extern power_type powers_type[POWER_MAX]; extern cptr artifact_names_list; extern monster_power monster_powers[MONSTER_POWERS_MAX]; -- cgit v1.2.3 From 5271c4676c2489766eb54db0fc53a7b471bed8ad Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove debug-only 'show all stats' code --- lib/help/debug.txt | 6 +- lib/mods/theme/help/debug.txt | 6 +- src/CMakeLists.txt | 1 - src/status.cc | 771 ------------------------------------------ src/status.hpp | 3 - src/wizard2.cc | 5 - 6 files changed, 2 insertions(+), 790 deletions(-) delete mode 100644 src/status.cc delete mode 100644 src/status.hpp diff --git a/lib/help/debug.txt b/lib/help/debug.txt index 65e7ff91..b3e9c223 100644 --- a/lib/help/debug.txt +++ b/lib/help/debug.txt @@ -12,7 +12,7 @@ will not be scored if you use debug commands. ~~~~~100|Debug|Command List #####R=== Command List Summary === - *****debug.txt*1[a Autorestore] *****debug.txt*2[A Show all stats] + *****debug.txt*1[a Autorestore] *****debug.txt*3[b Teleport to target] *****debug.txt*4[B HP to zero] *****debug.txt*5[c Create object] *****debug.txt*6[C Create artifact] *****debug.txt*7[d Detect all] *****debug.txt*8[D Teleport to the wilderness] @@ -85,10 +85,6 @@ maximal legal value. ~~~~~1 [[[[[GAutorestore (a)] Restores all your stats. This includes HP, SP, hunger, lost levels, etc. -~~~~~2 -[[[[[GShow all stats (A)] - This brings up the Character status menu, where you can view - all the stats about your character. ~~~~~3 [[[[[GTeleport to target (b)] You first need to have a monster targeted, then you can use diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt index 1fa0efd5..1d97bf2d 100644 --- a/lib/mods/theme/help/debug.txt +++ b/lib/mods/theme/help/debug.txt @@ -12,7 +12,7 @@ will not be scored if you use debug commands. ~~~~~100|Debug|Command List #####R=== Command List Summary === - *****debug.txt*1[a Autorestore] *****debug.txt*2[A Show all stats] + *****debug.txt*1[a Autorestore] *****debug.txt*3[b Teleport to target] *****debug.txt*4[B HP to zero] *****debug.txt*5[c Create object] *****debug.txt*6[C Create artifact] *****debug.txt*7[d Detect all] *****debug.txt*8[D Teleport to the wilderness] @@ -85,10 +85,6 @@ maximal legal value. ~~~~~1 [[[[[GAutorestore (a)] Restores all your stats. This includes HP, SP, hunger, lost levels, etc. -~~~~~2 -[[[[[GShow all stats (A)] - This brings up the Character status menu, where you can view - all the stats about your character. ~~~~~3 [[[[[GTeleport to target (b)] You first need to have a monster targeted, then you can use diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5a4b326f..6ce7dffa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,7 +97,6 @@ SET(SRCS_COMMON spells5.cc spells6.cc squeltch.cc - status.cc store.cc tables.cc traps.cc diff --git a/src/status.cc b/src/status.cc deleted file mode 100644 index c175fd7d..00000000 --- a/src/status.cc +++ /dev/null @@ -1,771 +0,0 @@ -/* File status.c */ - -/* Purpose: Status information */ - -/* Written by Pat Gunn for ToME - * This file is released into the public domain - */ - -/* Throughout this file, I make use of 2-d arrays called flag_arr. - * I fill them out with esp as the 0th element because then the second - * index is equal to the f-number that they are in the attributes, and - * that makes it more intuitive to use. I do need to fill them out in an - * odd order, but that's all abstracted nicely away. The 6th element is used - * to mark if the rest of the array is filled, that is, if there's an object - * there. - */ - -#include "files.hpp" -#include "monster2.hpp" -#include "monster_type.hpp" -#include "object1.hpp" -#include "player_type.hpp" -#include "stats.hpp" -#include "util.hpp" -#include "util.h" -#include "variable.h" -#include "variable.hpp" -#include "xtra1.hpp" - -#include -#include -#include - -static void row_trival(const char*, s16b, u32b, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static void row_bival(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static void row_npval(const char*, s16b, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static void statline(const char*, int, u32b, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static void row_hd_bon(int, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static void row_count(const char*, s16b, u32b, int, s16b, u32b, int, s16b, u32b, int, s16b, u32b, int, int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); -static int row_x_start = 0; - -static void status_count(s32b val1, int v1, s32b val2, int v2, s32b val3, int v3, s32b val4, int v4, byte ypos, byte xpos); -static void status_trival(s32b, s32b, byte, byte); -static void status_bival(s32b, byte, byte); -static void status_numeric(s32b, byte, byte); -static void status_curses(void); -static void status_companion(void); -static void status_sight(void); -static void status_attr(void); -static void status_combat(void); -static void status_move(void); -static void status_item(void); -static void az_line(int, u32b[INVEN_TOTAL - INVEN_WIELD + 2][7]); - -#define STATNM_LENGTH 11 -#define SL_LENGTH 11 - -#define INVEN_PLAYER (INVEN_TOTAL - INVEN_WIELD + 1) - -static void status_attr(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 0; - char c; - - clear_from(0); - c_put_str(TERM_L_BLUE, "Statistics", yo++, 1); - yo += 2; - az_line(SL_LENGTH, flag_arr); - statline("Str", A_STR, TR1_STR, yo++, flag_arr); - statline("Int", A_INT, TR1_INT, yo++, flag_arr); - statline("Wis", A_INT, TR1_WIS, yo++, flag_arr); - statline("Con", A_CON, TR1_CON, yo++, flag_arr); - statline("Dex", A_DEX, TR1_DEX, yo++, flag_arr); - statline("Chr", A_CHR, TR1_CHR, yo++, flag_arr); - row_npval("Luck", 5, TR5_LUCK, yo++, flag_arr); - yo++; - row_npval("Life", 2, TR2_LIFE, yo++, flag_arr); - row_npval("Mana", 1, TR1_MANA, yo++, flag_arr); - - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - c = inkey(); - if (c == ESCAPE) break; - } -} - -void status_move(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - clear_from(0); - c_put_str(TERM_L_BLUE, "Movement", 0, 1); - az_line(STATNM_LENGTH, flag_arr); - - row_trival("Fly/Lev", 4, TR4_FLY, 3, TR3_FEATHER, yo++, flag_arr); - row_bival("Climb", 4, TR4_CLIMB, yo++, flag_arr); - row_npval("Dig", 1, TR1_TUNNEL, yo++, flag_arr); - row_npval("Speed", 1, TR1_SPEED, yo++, flag_arr); - row_bival("Wraith", 3, TR3_WRAITH, yo++, flag_arr); - yo++; - row_npval("Stealth", 1, TR1_STEALTH, yo++, flag_arr); - row_bival("Telep", 3, TR3_TELEPORT, yo++, flag_arr); - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - c = inkey(); - switch (c) - { - case ESCAPE: - { - loop_exit = TRUE; - } - } - if (loop_exit) - { - break; - } - } -} - -static void status_sight(void) -/* Tell player about ESP, infravision, auto-id, see invis, and similar */ -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - clear_from(0); - c_put_str(TERM_L_BLUE, "Sight", 0, 1); - az_line(STATNM_LENGTH, flag_arr); - - row_bival("SeeInvis", 3, TR3_SEE_INVIS, yo++, flag_arr); - row_npval("Invis", 2, TR2_INVIS, yo++, flag_arr); - row_npval("Infra", 1, TR1_INFRA, yo++, flag_arr); - row_npval("Search", 1, TR1_SEARCH, yo++, flag_arr); - row_bival("AutoID", 4, TR4_AUTO_ID, yo++, flag_arr); - row_count("Light", 3, TR3_LITE1, 1, 4, TR4_LITE2, 2, 4, TR4_LITE3, 3, 0, 0, 0, yo++, flag_arr); - row_bival("Full ESP", 0, ESP_ALL, yo++, flag_arr); - row_bival("Orc ESP", 0, ESP_ORC, yo++, flag_arr); - row_bival("Trol ESP", 0, ESP_TROLL, yo++, flag_arr); - row_bival("Drag ESP", 0, ESP_DRAGON, yo++, flag_arr); - row_bival("GiantESP", 0, ESP_GIANT, yo++, flag_arr); - row_bival("DemonESP", 0, ESP_DEMON, yo++, flag_arr); - row_bival("Undd ESP", 0, ESP_UNDEAD, yo++, flag_arr); - row_bival("Evil ESP", 0, ESP_EVIL, yo++, flag_arr); - row_bival("Anim ESP", 0, ESP_ANIMAL, yo++, flag_arr); - row_bival("Drid ESP", 0, ESP_THUNDERLORD, yo++, flag_arr); - row_bival("Good ESP", 0, ESP_GOOD, yo++, flag_arr); - row_bival("SpidrESP", 0, ESP_SPIDER, yo++, flag_arr); - row_bival("NonlvESP", 0, ESP_NONLIVING, yo++, flag_arr); - row_bival("Uniq ESP", 0, ESP_UNIQUE, yo++, flag_arr); - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - c = inkey(); - switch (c) - { - case ESCAPE: - { - loop_exit = TRUE; - } - } - if (loop_exit) - { - break; - } - } -} - -static void status_item(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - clear_from(0); - c_put_str(TERM_L_BLUE, "Misc", 0, 1); - - row_x_start = 40; - az_line(STATNM_LENGTH + row_x_start, flag_arr); - row_bival("Blessed", 3, TR3_BLESSED, yo++, flag_arr); - row_bival("Activate", 3, TR3_ACTIVATE, yo++, flag_arr); - row_bival("EasyKnow", 3, TR3_EASY_KNOW, yo++, flag_arr); - row_bival("HideType", 3, TR3_HIDE_TYPE, yo++, flag_arr); - yo++; - row_bival("SafeAcid", 3, TR3_IGNORE_ACID, yo++, flag_arr); - row_bival("SafeElec", 3, TR3_IGNORE_ELEC, yo++, flag_arr); - row_bival("SafeFire", 3, TR3_IGNORE_FIRE, yo++, flag_arr); - row_bival("SafeCold", 3, TR3_IGNORE_COLD, yo++, flag_arr); - row_bival("ResMorgul", 5, TR5_RES_MORGUL, yo++, flag_arr); - - yo = 3; - row_x_start = 0; - az_line(STATNM_LENGTH, flag_arr); - row_bival("Sh.fire", 3, TR3_SH_FIRE, yo++, flag_arr); - row_bival("Sh.elec", 3, TR3_SH_ELEC, yo++, flag_arr); - row_bival("Regen", 3, TR3_REGEN, yo++, flag_arr); - row_bival("SlowDigest", 3, TR3_SLOW_DIGEST, yo++, flag_arr); - row_bival("Precog", 4, TR4_PRECOGNITION, yo++, flag_arr); - row_bival("Auto.Id", 4, TR4_AUTO_ID, yo++, flag_arr); - row_bival("Spell.In", 5, TR5_SPELL_CONTAIN, yo++, flag_arr); - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - c = inkey(); - switch (c) - { - case ESCAPE: - loop_exit = TRUE; - } - if (loop_exit) - { - break; - } - } -} - -static void status_combat(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - clear_from(0); - c_put_str(TERM_L_BLUE, "Combat", 0, 1); - az_line(STATNM_LENGTH, flag_arr); - - row_npval("Spell", 1, TR1_SPELL, yo++, flag_arr); - row_npval("Blows", 1, TR1_BLOWS, yo++, flag_arr); - row_npval("Crits", 5, TR5_CRIT, yo++, flag_arr); - row_npval("Ammo_Mgt", 3, TR3_XTRA_MIGHT, yo++, flag_arr); - row_npval("Ammo_Sht", 3, TR3_XTRA_SHOTS, yo++, flag_arr); - row_bival("Vorpal", 1, TR1_VORPAL, yo++, flag_arr); - row_bival("Quake", 1, TR1_IMPACT, yo++, flag_arr); - row_bival("Chaotic", 1, TR1_CHAOTIC, yo++, flag_arr); - row_bival("Vampiric", 1, TR1_VAMPIRIC, yo++, flag_arr); - row_bival("Poison", 1, TR1_BRAND_POIS, yo++, flag_arr); - row_bival("Acidic", 1, TR1_BRAND_ACID, yo++, flag_arr); - row_bival("Shocks", 1, TR1_BRAND_ELEC, yo++, flag_arr); - row_bival("Burns", 1, TR1_BRAND_FIRE, yo++, flag_arr); - row_bival("Chills", 1, TR1_BRAND_COLD, yo++, flag_arr); - row_bival("Wound", 5, TR5_WOUNDING, yo++, flag_arr); - - row_x_start = 40; - yo = 3; - az_line(row_x_start + STATNM_LENGTH, flag_arr); - row_bival("No.Blow", 4, TR4_NEVER_BLOW, yo++, flag_arr); - row_trival("S/K Undd", 1, TR1_SLAY_UNDEAD, 5, TR5_KILL_UNDEAD, yo++, flag_arr); - row_trival("S/K Dmn", 1, TR1_SLAY_DEMON, 5, TR5_KILL_DEMON, yo++, flag_arr); - row_trival("S/K Drag", 1, TR1_SLAY_DRAGON, 1, TR1_KILL_DRAGON, yo++, flag_arr); - row_bival("Sl.Orc", 1, TR1_SLAY_ORC, yo++, flag_arr); - row_bival("Sl.Troll", 1, TR1_SLAY_TROLL, yo++, flag_arr); - row_bival("Sl.Giant", 1, TR1_SLAY_GIANT, yo++, flag_arr); - row_bival("Sl.Evil", 1, TR1_SLAY_EVIL, yo++, flag_arr); - row_bival("Sl.Animal", 1, TR1_SLAY_ANIMAL, yo++, flag_arr); - row_hd_bon(0, yo++, flag_arr); - row_hd_bon(1, yo++, flag_arr); - row_x_start = 0; - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - c = inkey(); - switch (c) - { - case ESCAPE: - loop_exit = TRUE; - } - if (loop_exit) - { - break; - } - } -} - -static void status_curses(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - - clear_from(0); - c_put_str(TERM_L_BLUE, "Curses", 0, 1); - az_line(STATNM_LENGTH, flag_arr); - - row_trival("Hvy/Nrm", 3, TR3_HEAVY_CURSE, 3, TR3_CURSED, yo++, flag_arr); - row_bival("Perma", 3, TR3_PERMA_CURSE, yo++, flag_arr); - row_trival("DG/Ty", 4, TR4_DG_CURSE, 3, TR3_TY_CURSE, yo++, flag_arr); - row_trival("Prm/Auto", 3, TR3_PERMA_CURSE, 3, TR3_AUTO_CURSE, yo++, flag_arr); - row_bival("NoDrop", 4, TR4_CURSE_NO_DROP, yo++, flag_arr); - yo++; - row_bival("B.Breath", 4, TR4_BLACK_BREATH, yo++, flag_arr); - row_bival("Dr.Exp", 3, TR3_DRAIN_EXP, yo++, flag_arr); - row_bival("Dr.Mana", 5, TR5_DRAIN_MANA, yo++, flag_arr); - row_bival("Dr.HP", 5, TR5_DRAIN_HP, yo++, flag_arr); - row_bival("No Hit", 4, TR4_NEVER_BLOW, yo++, flag_arr); - row_bival("NoTelep", 3, TR3_NO_TELE, yo++, flag_arr); - row_bival("NoMagic", 3, TR3_NO_MAGIC, yo++, flag_arr); - row_bival("Aggrav", 3, TR3_AGGRAVATE, yo++, flag_arr); - row_bival("Clone", 4, TR4_CLONE, yo++, flag_arr); - row_bival("Temp", 5, TR5_TEMPORARY, yo++, flag_arr); - yo++; - row_bival("Antimagic", 4, TR4_ANTIMAGIC_50, yo++, flag_arr); - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - - c = inkey(); - switch (c) - { - case ESCAPE: - { - loop_exit = TRUE; - } - } - if (loop_exit == TRUE) - { - break; - } - } -} - -static void status_res(void) -{ - u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]; - int yo = 3; - - clear_from(0); - c_put_str(TERM_L_BLUE, "Resistances", 0, 1); - az_line(STATNM_LENGTH, flag_arr); - - row_trival("Fire", 2, TR2_IM_FIRE, 2, TR2_RES_FIRE, yo++, flag_arr); - row_trival("Cold", 2, TR2_IM_COLD, 2, TR2_RES_COLD, yo++, flag_arr); - row_trival("Acid", 2, TR2_IM_ACID, 2, TR2_RES_ACID, yo++, flag_arr); - row_trival("Lightning", 2, TR2_IM_ELEC, 2, TR2_RES_ELEC, yo++, flag_arr); - row_bival("Poison", 2, TR2_RES_POIS, yo++, flag_arr); - row_bival("Lite", 2, TR2_RES_LITE, yo++, flag_arr); - row_bival("Dark", 2, TR2_RES_DARK, yo++, flag_arr); - row_bival("Sound", 2, TR2_RES_SOUND, yo++, flag_arr); - row_bival("Shards", 2, TR2_RES_SHARDS, yo++, flag_arr); - row_trival("Nether", 4, TR4_IM_NETHER, 2, TR2_RES_NETHER, yo++, flag_arr); - row_bival("Nexus", 2, TR2_RES_NEXUS, yo++, flag_arr); - row_bival("Chaos", 2, TR2_RES_CHAOS, yo++, flag_arr); - row_bival("Disen.", 2, TR2_RES_DISEN, yo++, flag_arr); - row_bival("Confusion", 2, TR2_RES_CONF, yo++, flag_arr); - row_bival("Blindness", 2, TR2_RES_BLIND, yo++, flag_arr); - row_bival("Fear", 2, TR2_RES_FEAR, yo++, flag_arr); - row_bival("Free Act", 2, TR2_FREE_ACT, yo++, flag_arr); - row_bival("Reflect", 2, TR2_REFLECT, yo++, flag_arr); - row_bival("Hold Life", 2, TR2_HOLD_LIFE, yo++, flag_arr); - - c_put_str(TERM_WHITE, "Press ESC to continue", 23, 0); - Term_fresh(); - while (1) - { - bool_ loop_exit = FALSE; - char c; - - c = inkey(); - switch (c) - { - case ESCAPE: - { - loop_exit = TRUE; - } - } - if (loop_exit == TRUE) - { - break; - } - } -} - -void status_main() -{ - int do_quit = 0; - char c; - - character_icky = TRUE; - Term_save(); - while (1) - { - clear_from(0); - c_put_str(TERM_WHITE, format("%s Character Status screen", game_module), 0, 10); - c_put_str(TERM_WHITE, "1) Statistics", 2, 5); - c_put_str(TERM_WHITE, "2) Movement", 3, 5); - c_put_str(TERM_WHITE, "3) Combat", 4, 5); - c_put_str(TERM_WHITE, "4) Resistances", 5, 5); - c_put_str(TERM_WHITE, "5) Misc", 6, 5); - c_put_str(TERM_WHITE, "6) Curses", 7, 5); - c_put_str(TERM_WHITE, "7) Sight", 8, 5); - c_put_str(TERM_WHITE, "8) Companions", 9, 5); - c_put_str(TERM_RED, "Press 'q' to Quit", 23, 5); - c = inkey(); - switch (c) - { - case '1': - status_attr(); - break; - case '2': - status_move(); - break; - case '3': - status_combat(); - break; - case '4': - status_res(); - break; - case '5': - status_item(); - break; - case '6': - status_curses(); - break; - case '7': - status_sight(); - break; - case '8': - status_companion(); - break; - case 'q': - case ESCAPE: - do_quit = 1; /* Schedule leaving the outer loop */ - break; - } - Term_fresh(); - if (do_quit) break; - } - Term_load(); - character_icky = FALSE; - p_ptr->redraw |= (PR_WIPE | PR_FRAME | PR_MAP); - handle_stuff(); -} - -static void az_line(int xo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -{ - int index = xo; /* Leave room for description */ - int i; - for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) - { - if (p_ptr->inventory[i].k_idx) /* Wearing anything here? */ - { - char cstrng[2]; - cstrng[0] = (i - INVEN_WIELD) + 'a'; /* Assumes ASCII */ - cstrng[1] = '\0'; /* terminate it */ - c_put_str(TERM_WHITE, cstrng, 2, index++); /* Assumes ASCII */ - - /* DGDGDGDG */ - /* object_flags_known(&inventory[i],*/ - object_flags(&p_ptr->inventory[i], /* Help me debug */ - &flag_arr[i - INVEN_WIELD][1], /* f1 */ - &flag_arr[i - INVEN_WIELD][2], /* f2 */ - &flag_arr[i - INVEN_WIELD][3], /* f3 */ - &flag_arr[i - INVEN_WIELD][4], /* f4 */ - &flag_arr[i - INVEN_WIELD][5], /* f5 */ - &flag_arr[i - INVEN_WIELD][0]); /* esp */ - flag_arr[i - INVEN_WIELD][6] = 1; /* And mark it to display */ - } - else flag_arr[i - INVEN_WIELD][6] = 0; /* Otherwise don't display it */ - } - c_put_str(TERM_WHITE, "@", 2, index++); - player_flags( - &flag_arr[INVEN_PLAYER][1], /* f1 */ - &flag_arr[INVEN_PLAYER][2], /* f2 */ - &flag_arr[INVEN_PLAYER][3], /* f3 */ - &flag_arr[INVEN_PLAYER][4], /* f4 */ - &flag_arr[INVEN_PLAYER][5], /* f5 */ - &flag_arr[INVEN_PLAYER][0] /* esp */ - ); - flag_arr[INVEN_PLAYER][6] = 1; -} - -static void status_trival(s32b val1, s32b val2, byte ypos, byte xpos) -{ - if (val1 != 0) - c_put_str(TERM_L_BLUE, "*", ypos, xpos); - else if (val2 != 0) - c_put_str(TERM_L_BLUE, "+", ypos, xpos); - else - c_put_str(TERM_WHITE, ".", ypos, xpos); -} - -static void status_bival(s32b val, byte ypos, byte xpos) -{ - if (val != 0) - c_put_str(TERM_L_BLUE, "+", ypos, xpos); - else - c_put_str(TERM_WHITE, ".", ypos, xpos); -} - -static void status_numeric(s32b val, byte ypos, byte xpos) -{ - u32b magnitude = ABS(val); - int color = TERM_WHITE; /* default */ - char strnum[2]; - - if (val<0) { - color = TERM_RED; - }; - if (val>0) { - color = TERM_GREEN; - }; - - if (magnitude == 0) { - sprintf(strnum, "."); - } if (magnitude > 9) { - sprintf(strnum, "*"); - } else { - sprintf(strnum, "%lu", (unsigned long int) magnitude); - } - - c_put_str(color, strnum, ypos, xpos); -} - -static void status_count(s32b val1, int v1, s32b val2, int v2, s32b val3, int v3, s32b val4, int v4, byte ypos, byte xpos) -{ - int v = 0; - - if (val1 != 0) v += v1; - if (val2 != 0) v += v2; - if (val3 != 0) v += v3; - if (val4 != 0) v += v4; - - status_numeric(v, ypos, xpos); -} - -static void row_count(const char* statname, s16b row1, u32b flag1, int v1, s16b row2, u32b flag2, int v2, s16b row3, u32b flag3, int v3, s16b row4, u32b flag4, int v4, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -{ - int i; - int x = row_x_start; - - c_put_str(TERM_L_GREEN, statname, yo, row_x_start); - - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - if (flag_arr[i][6] == 1) - { - status_count((flag_arr[i][row1] & flag1), v1, (flag_arr[i][row2] & flag2), v2, (flag_arr[i][row3] & flag3), v3, (flag_arr[i][row4] & flag4), v4, yo, x + STATNM_LENGTH); - x++; - } - } -} - -static void row_trival(const char* statname, s16b row, u32b flag, s16b row2, u32b flag2, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -{ - int i; - int x = row_x_start; - c_put_str(TERM_L_GREEN, statname, yo, row_x_start); - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - if (flag_arr[i][6] == 1) - { - status_trival( - (flag_arr[i][row] & flag), - (flag_arr[i][row2] & flag2), - yo, x + STATNM_LENGTH); - x++; - } - } -} - -static void row_bival(const char* statname, s16b row, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -{ - int i; - int x = row_x_start; - c_put_str(TERM_L_GREEN, statname, yo, row_x_start); - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - if (flag_arr[i][6] == 1) - { - status_bival((flag_arr[i][row] & flag), yo, x + STATNM_LENGTH); - x++; - } - } -} - -static void row_npval(const char* statname, s16b row, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -/* Displays nicely a pval-based status row */ -{ - int i; - int x = row_x_start; - c_put_str(TERM_L_GREEN, statname, yo, row_x_start); - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - if (flag_arr[i][6] == 1) - { - if (i == INVEN_PLAYER) - /* Special case, player_flags */ - /* Players lack a pval, no way to calc value */ - { - if (flag_arr[i][row] & flag) - c_put_str(TERM_YELLOW, "*", yo, x + STATNM_LENGTH); - else c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH); - x++; - continue; - } - if (flag_arr[i][row] & flag) - status_numeric(p_ptr->inventory[i + INVEN_WIELD].pval, yo, x + STATNM_LENGTH); - else - c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH); - x++; - } - } -} - -static void statline(const char* statname, int statidx, u32b flag, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -/* Displays a status row for a primary stat */ -{ - int i; - int x = row_x_start; - char statstr[8]; - byte stat_color = TERM_L_RED; - - cnv_stat(p_ptr->stat_use[statidx], statstr); - - c_put_str(TERM_L_GREEN, statstr, yo, 4 + row_x_start); - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - byte color = TERM_L_RED; - - if (flag_arr[i][6] == 1) - { - switch (statidx) - { - case A_STR: - if (flag_arr[i][2] & TR2_SUST_STR) - color = TERM_L_BLUE; - break; - case A_INT: - if (flag_arr[i][2] & TR2_SUST_INT) - color = TERM_L_BLUE; - break; - case A_WIS: - if (flag_arr[i][2] & TR2_SUST_WIS) - color = TERM_L_BLUE; - break; - case A_DEX: - if (flag_arr[i][2] & TR2_SUST_DEX) - color = TERM_L_BLUE; - break; - case A_CON: - if (flag_arr[i][2] & TR2_SUST_CON) - color = TERM_L_BLUE; - break; - case A_CHR: - if (flag_arr[i][2] & TR2_SUST_CHR) - color = TERM_L_BLUE; - break; - } - - if (i == INVEN_PLAYER ) /* Player flags */ - { - if (flag_arr[i][1] & flag) - c_put_str((color == TERM_L_RED) ? TERM_YELLOW : color, "*", yo, x + SL_LENGTH); - else c_put_str((color == TERM_L_RED) ? TERM_WHITE : color, ".", yo, x + SL_LENGTH); - x++; - continue; - } - if (flag_arr[i][1] & flag) - status_numeric(p_ptr->inventory[i + INVEN_WIELD].pval, yo, x + SL_LENGTH); - else - c_put_str((color == TERM_L_RED) ? TERM_WHITE : color, ".", yo, x + SL_LENGTH); - - if (color != TERM_L_RED) - stat_color = color; - - x++; - } - } - - c_put_str(stat_color, statname, yo, row_x_start); -} - -static void row_hd_bon(int which, int yo, u32b flag_arr[INVEN_TOTAL - INVEN_WIELD + 2][7]) -/* To-hit/dmg modifiers, selected by 1st argument */ -{ - int i; - int x = row_x_start; - if ((which != 0) && (which != 1)) return; - c_put_str(TERM_L_GREEN, ((which == 0) ? "To-Hit" : "To-Dmg"), yo, row_x_start); - for (i = 0; i < (INVEN_TOTAL - INVEN_WIELD + 2); i++) - { - if (flag_arr[i][6] == 1) - { - if (i == INVEN_PLAYER) /* Player? */ - { - c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH); - x++; - continue; - } - if ( (which == 0) && (p_ptr->inventory[INVEN_WIELD + i].to_h != 0)) - { - status_numeric(p_ptr->inventory[INVEN_WIELD + i].to_h, yo, x + STATNM_LENGTH); - x++; - continue; - } - if ( (which == 1) && (p_ptr->inventory[INVEN_WIELD + i].to_d != 0)) - { - status_numeric(p_ptr->inventory[INVEN_WIELD + i].to_d, yo, x + STATNM_LENGTH); - x++; - continue; - } - c_put_str(TERM_WHITE, ".", yo, x + STATNM_LENGTH); - x++; - } - } -} - -static void status_companion(void) -{ - Term_clear(); - - fmt::MemoryWriter w; - - /* Process the monsters (backwards) */ - for (int i = m_max - 1; i >= 1; i--) - { - /* Access the monster */ - monster_type *m_ptr = &m_list[i]; - - if (m_ptr->status == MSTATUS_COMPANION) - { - char m_name[80]; - monster_desc(m_name, m_ptr, 0x80); - - std::string exp_for_next_level = (m_ptr->level < MONSTER_LEVEL_MAX) - ? std::to_string(monster_exp(m_ptr->level + 1)) - : "****"; - - w.write("#####BCompanion: {}\n", m_name); - - w.write(" Lev/Exp : [[[[[G{} / {}]\n", m_ptr->level, m_ptr->exp); - w.write(" Next lvl: [[[[[G{}]\n", exp_for_next_level); - - w.write(" HP : [[[[[G{} / {}]\n", m_ptr->hp, m_ptr->maxhp); - w.write(" AC : [[[[[G{}]\n", m_ptr->ac); - w.write(" Speed : [[[[[G{}]\n", m_ptr->mspeed - 110); - - int y = 0; - for (int b = 0; b < 4; b++) - { - if (!m_ptr->blow[b].d_dice) continue; - if (!m_ptr->blow[b].d_side) continue; - - w.write(" Blow {} : [[[[[G{}d{}]\n", y + 1, m_ptr->blow[b].d_dice, m_ptr->blow[b].d_side); - y++; - } - - w.write("\n"); - } - } - - /* Display */ - show_string(w.c_str(), "Companion List"); -} diff --git a/src/status.hpp b/src/status.hpp deleted file mode 100644 index 74624446..00000000 --- a/src/status.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void status_main(); diff --git a/src/wizard2.cc b/src/wizard2.cc index 0614022c..de1530d8 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -24,7 +24,6 @@ #include "object_kind.hpp" #include "player_type.hpp" #include "randart.hpp" -#include "status.hpp" #include "spells1.hpp" #include "spells2.hpp" #include "stats.hpp" @@ -1571,10 +1570,6 @@ void do_cmd_debug() do_cmd_spoilers(); break; - case 'A': - status_main(); - break; - /* Hack -- Help */ case '?': do_cmd_help(); -- cgit v1.2.3 From f66fbf3dc0a324fbf17e2148a025ea703c6b4d83 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Add do_flag_set() in loadsave.cc --- src/loadsave.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index c42dd4b9..75ce03b0 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -250,6 +250,22 @@ static void do_string(char *str, int max, ls_flag_t flag) } } +/* + * Load/save flag set + */ +namespace { + +template void do_flag_set(flag_set *flags, ls_flag_t flag) +{ + for (std::size_t i = 0; i < flags->size(); i++) + { + do_u32b(&(*flags)[i], flag); + } +} + +} // namespace (anonymous) + + /* * Load/Save quick start data */ @@ -1329,10 +1345,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) do_s16b(&max_panel_rows, flag); do_s16b(&max_panel_cols, flag); - for (std::size_t i = 0; i < dungeon_flags.size(); i++) - { - do_u32b(&dungeon_flags[i], flag); - } + do_flag_set(&dungeon_flags, flag); /* Last teleportation */ do_s16b(&last_teleportation_y, flag); -- cgit v1.2.3 From af3dd99eff4eeee5231a9e77f876126ef67ae664 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Add flag_set::count() method to count set bits --- src/flag_set.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/flag_set.hpp b/src/flag_set.hpp index b4bdc92f..aa90a217 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -67,6 +67,19 @@ public: return true; } + constexpr std::size_t count() const + { + std::size_t n = 0; + for (std::size_t i = 0; i < nbits; i++) + { + if (bit(i)) + { + n += 1; + } + } + return n; + } + uint32_t &operator[](std::size_t i) { assert(i < tiers); -- cgit v1.2.3 From 60a24b0f1b05917677760634f8e4db687119c235 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove FIXMEs from loadsave.cc --- src/loadsave.cc | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 75ce03b0..3be0c39f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1037,9 +1037,6 @@ static bool_ wearable_p(object_type *o_ptr) /* * rd/wr an object - * - * FIXME! This code probably has a lot of cruft from the old Z/V codebase. - * */ static void do_item(object_type *o_ptr, ls_flag_t flag) { @@ -1943,10 +1940,8 @@ static void do_options(ls_flag_t flag) /* - * Handle player inventory - * - * FIXME! This function probably could be unified better - * Note that the inventory is "re-sorted" later by "dungeon()". + * Handle player inventory. Note that the inventory is + * "re-sorted" later by "dungeon()". */ static bool_ do_inventory(ls_flag_t flag) { @@ -2046,7 +2041,7 @@ static bool_ do_inventory(ls_flag_t flag) /* * Read the saved messages */ -static void do_messages(ls_flag_t flag) /* FIXME! We should be able to unify this better */ +static void do_messages(ls_flag_t flag) { int i; char buf[128]; @@ -2265,7 +2260,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) sf_saves++; /* Increment the saves ctr */ } - /* Handle version bytes. FIXME! DG wants me to change this all around */ + /* Handle version bytes */ if (flag == ls_flag_t::LOAD) { u32b mt32b; -- cgit v1.2.3 From 201bae59fda1a477c4e55fd1d85f2c09937ab948 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove wizard1.cc It seems an awful lot of cruddy almost-duplicate code with functionality that's a) almost never used, and b) has absolutely *no* game impact whatsoever. So: Away it goes. --- lib/help/debug.txt | 5 +- lib/mods/theme/help/debug.txt | 5 +- src/CMakeLists.txt | 1 - src/wizard1.cc | 2494 ----------------------------------------- src/wizard1.hpp | 3 - src/wizard2.cc | 6 - 6 files changed, 2 insertions(+), 2512 deletions(-) delete mode 100644 src/wizard1.cc delete mode 100644 src/wizard1.hpp diff --git a/lib/help/debug.txt b/lib/help/debug.txt index b3e9c223..04869b71 100644 --- a/lib/help/debug.txt +++ b/lib/help/debug.txt @@ -59,7 +59,7 @@ will not be scored if you use debug commands. ; (unused) ^S (unused) : (unused) ^T (unused) ' (unused) ^U (unused) - *****debug.txt*75[" Create spoiler] ^V (unused) + ^V (unused) , (unused) ^W (unused) < (unused) ^X (unused) . (unused) ^Y (unused) @@ -256,9 +256,6 @@ maximal legal value. 3 monster becomes pet 4 monster becomes companion You then point at an enemy and press space. -~~~~~75 -[[[[[GCreate spoiler (")] - Brings up a menu that allows you to create a spoiler file. ~~~~~81 [[[[[GLua script (>)] Allows you to run a Lua script. diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt index 1d97bf2d..cdea423b 100644 --- a/lib/mods/theme/help/debug.txt +++ b/lib/mods/theme/help/debug.txt @@ -59,7 +59,7 @@ will not be scored if you use debug commands. ; (unused) ^S (unused) : (unused) ^T (unused) ' (unused) ^U (unused) - *****debug.txt*75[" Create spoiler] ^V (unused) + ^V (unused) , (unused) ^W (unused) < (unused) ^X (unused) . (unused) ^Y (unused) @@ -259,9 +259,6 @@ maximal legal value. 3 monster becomes pet 4 monster becomes companion You then point at an enemy and press space. -~~~~~75 -[[[[[GCreate spoiler (")] - Brings up a menu that allows you to create a spoiler file. ~~~~~81 [[[[[GLua script (>)] Allows you to run a Lua script. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ce7dffa..d0e34707 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -103,7 +103,6 @@ SET(SRCS_COMMON util.cc variable.cc wild.cc - wizard1.cc wizard2.cc xtra1.cc xtra2.cc diff --git a/src/wizard1.cc b/src/wizard1.cc deleted file mode 100644 index d1631ccf..00000000 --- a/src/wizard1.cc +++ /dev/null @@ -1,2494 +0,0 @@ -#include "wizard1.hpp" - -#include "artifact_type.hpp" -#include "cmd7.hpp" -#include "ego_item_type.hpp" -#include "monster_race.hpp" -#include "monster_race_flag.hpp" -#include "monster_spell_flag.hpp" -#include "object1.hpp" -#include "object2.hpp" -#include "object_kind.hpp" -#include "object_type.hpp" -#include "skill_type.hpp" -#include "tables.hpp" -#include "util.hpp" -#include "util.h" -#include "variable.h" -#include "variable.hpp" - -#include - -/* - * The spoiler file being created - */ -static FILE *fff = NULL; - - -/* - * Write out `n' of the character `c' to the spoiler file - */ -static void spoiler_out_n_chars(int n, char c) -{ - while (--n >= 0) fputc(c, fff); -} - - -/* - * Write out `n' blank lines to the spoiler file - */ -static void spoiler_blanklines(int n) -{ - spoiler_out_n_chars(n, '\n'); -} - - -/* - * Write a line to the spoiler file and then "underline" it with hyphens - */ -static void spoiler_underline(cptr str) -{ - fprintf(fff, "%s\n", str); - spoiler_out_n_chars(strlen(str), '-'); - fprintf(fff, "\n"); -} - - -/* - * Buffer text to the given file. (-SHAWN-) - * This is basically c_roff() from mon-desc.c with a few changes. - */ -static void spoil_out(cptr str) -{ - cptr r; - - /* Line buffer */ - static char roff_buf[256]; - - /* Current pointer into line roff_buf */ - static char *roff_p = roff_buf; - - /* Last space saved into roff_buf */ - static char *roff_s = NULL; - - /* Special handling for "new sequence" */ - if (!str) - { - if (roff_p != roff_buf) roff_p--; - while (*roff_p == ' ' && roff_p != roff_buf) roff_p--; - if (roff_p == roff_buf) fprintf(fff, "\n"); - else - { - *(roff_p + 1) = '\0'; - fprintf(fff, "%s\n\n", roff_buf); - } - roff_p = roff_buf; - roff_s = NULL; - roff_buf[0] = '\0'; - return; - } - - /* Scan the given string, character at a time */ - for (; *str; str++) - { - char ch = *str; - int wrap = (ch == '\n'); - - if (!isprint(ch)) ch = ' '; - if (roff_p >= roff_buf + 75) wrap = 1; - if ((ch == ' ') && (roff_p + 2 >= roff_buf + 75)) wrap = 1; - - /* Handle line-wrap */ - if (wrap) - { - *roff_p = '\0'; - r = roff_p; - if (roff_s && (ch != ' ')) - { - *roff_s = '\0'; - r = roff_s + 1; - } - fprintf(fff, "%s\n", roff_buf); - roff_s = NULL; - roff_p = roff_buf; - while (*r) *roff_p++ = *r++; - } - - /* Save the char */ - if ((roff_p > roff_buf) || (ch != ' ')) - { - if (ch == ' ') roff_s = roff_p; - *roff_p++ = ch; - } - } -} - - -/* - * Extract a textual representation of an attribute - */ -static cptr attr_to_text(byte a) -{ - switch (a) - { - case TERM_DARK: - return ("xxx"); - case TERM_WHITE: - return ("White"); - case TERM_SLATE: - return ("Slate"); - case TERM_ORANGE: - return ("Orange"); - case TERM_RED: - return ("Red"); - case TERM_GREEN: - return ("Green"); - case TERM_BLUE: - return ("Blue"); - case TERM_UMBER: - return ("Umber"); - case TERM_L_DARK: - return ("L.Dark"); - case TERM_L_WHITE: - return ("L.Slate"); - case TERM_VIOLET: - return ("Violet"); - case TERM_YELLOW: - return ("Yellow"); - case TERM_L_RED: - return ("L.Red"); - case TERM_L_GREEN: - return ("L.Green"); - case TERM_L_BLUE: - return ("L.Blue"); - case TERM_L_UMBER: - return ("L.Umber"); - } - - /* Oops */ - return ("Icky"); -} - - - -/* - * A tval grouper - */ -typedef struct -{ - byte tval; - cptr name; -} -grouper; - - - -/* - * Item Spoilers by: benh@phial.com (Ben Harrison) - */ - - -/* - * The basic items categorized by type - */ -static grouper group_item[] = -{ - { TV_SWORD, "Melee Weapons" }, - { TV_POLEARM, NULL }, - { TV_HAFTED, NULL }, - { TV_AXE, NULL }, - { TV_MSTAFF, NULL }, - - { TV_BOW, "Bows and Slings" }, - - { TV_SHOT, "Ammo" }, - { TV_ARROW, NULL }, - { TV_BOLT, NULL }, - - { TV_BOOMERANG, "Boomerangs" }, - - { TV_INSTRUMENT, "Instruments" }, - - { TV_SOFT_ARMOR, "Armour (Body)" }, - { TV_HARD_ARMOR, NULL }, - { TV_DRAG_ARMOR, NULL }, - - { TV_SHIELD, "Armour (Misc)" }, - { TV_HELM, NULL }, - { TV_CROWN, NULL }, - { TV_GLOVES, NULL }, - { TV_BOOTS, NULL }, - - { TV_CLOAK, "Cloaks" }, - { TV_AMULET, "Amulets" }, - { TV_RING, "Rings" }, - - { TV_SCROLL, "Scrolls" }, - { TV_POTION, "Potions" }, - { TV_POTION2, NULL }, - - { TV_FOOD, "Food" }, - - { TV_ROD_MAIN, "Rods" }, - { TV_ROD, "Rod Tips" }, - { TV_WAND, "Wands" }, - { TV_STAFF, "Staves" }, - - { TV_BOOK, "Books (Magic, Gods, Music)" }, - { TV_DAEMON_BOOK, "Demonic Equipment" }, - - { TV_RUNE1, "Runes" }, - { TV_RUNE2, NULL }, - - { TV_PARCHMENT, "Parchments" }, - - { TV_DIGGING, "Tools" }, - { TV_TOOL, NULL }, - - { TV_TRAPKIT, "Trapping Kits" }, - - { TV_CHEST, "Chests" }, - - { TV_SPIKE, "Various" }, - { TV_LITE, NULL }, - { TV_FLASK, NULL }, - { TV_BOTTLE, NULL }, - { TV_JUNK, NULL }, - - { TV_SKELETON, "Corpses and Eggs" }, - { TV_CORPSE, NULL }, - { TV_EGG, NULL }, - - { 0, "" } -}; - - -/* - * Describe the kind - */ -static void kind_info(char *buf, char *dam, char *wgt, int *lev, s32b *val, int k) -{ - object_type forge; - object_type *q_ptr; - - object_kind *k_ptr; - - - /* Get local object */ - q_ptr = &forge; - - /* Prepare a fake item */ - object_prep(q_ptr, k); - - /* Obtain the "kind" info */ - k_ptr = &k_info[q_ptr->k_idx]; - - /* It is known */ - q_ptr->ident |= (IDENT_KNOWN); - - /* Cancel bonuses */ - q_ptr->to_a = 0; - q_ptr->to_h = 0; - q_ptr->to_d = 0; - - if ((k_ptr->tval == TV_WAND) || (k_ptr->tval == TV_STAFF)) - { - apply_magic(q_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0)); - } - - /* Level */ - (*lev) = k_ptr->level; - - /* Value */ - (*val) = object_value(q_ptr); - - - /* Hack */ - if (!buf || !dam || !wgt) return; - - - /* Description (too brief) */ - object_desc_store(buf, q_ptr, FALSE, 0); - - - /* Misc info */ - strcpy(dam, ""); - - /* Damage */ - switch (q_ptr->tval) - { - /* Bows */ - case TV_BOW: - { - break; - } - - /* Ammo */ - case TV_SHOT: - case TV_BOLT: - case TV_ARROW: - - /* Boomerangs */ - case TV_BOOMERANG: - - /* Weapons */ - case TV_HAFTED: - case TV_POLEARM: - case TV_SWORD: - case TV_AXE: - case TV_MSTAFF: - - /* Tools */ - case TV_DIGGING: - { - sprintf(dam, "%dd%d", q_ptr->dd, q_ptr->ds); - break; - } - - /* Armour */ - case TV_BOOTS: - case TV_GLOVES: - case TV_CLOAK: - case TV_CROWN: - case TV_HELM: - case TV_SHIELD: - case TV_SOFT_ARMOR: - case TV_HARD_ARMOR: - case TV_DRAG_ARMOR: - { - sprintf(dam, "%d", q_ptr->ac); - break; - } - } - - - /* Weight */ - sprintf(wgt, "%3ld.%ld", (long int) (q_ptr->weight / 10), (long int) (q_ptr->weight % 10)); -} - - -/* - * Create a spoiler file for items - */ -static void spoil_obj_desc(cptr fname) -{ - int i, k, s, t, n = 0; - - u16b who[200]; - - char buf[1024]; - - char wgt[80]; - char dam[80]; - - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); - - /* Open the file */ - fff = my_fopen(buf, "w"); - - /* Oops */ - if (!fff) - { - msg_print("Cannot create spoiler file."); - return; - } - - - /* Header */ - sprintf(buf, "Basic Items Spoilers for %s", get_version_string()); - spoiler_underline(buf); - spoiler_blanklines(2); - - /* More Header */ - fprintf(fff, "%-45s %8s%7s%5s%9s\n", - "Description", "Dam/AC", "Wgt", "Lev", "Cost"); - fprintf(fff, "%-45s %8s%7s%5s%9s\n", - "----------------------------------------", - "------", "---", "---", "----"); - - /* List the groups */ - for (i = 0; TRUE; i++) - { - /* Write out the group title */ - if (group_item[i].name) - { - /* Hack -- bubble-sort by cost and then level */ - for (s = 0; s < n - 1; s++) - { - for (t = 0; t < n - 1; t++) - { - int i1 = t; - int i2 = t + 1; - - int e1; - int e2; - - s32b t1; - s32b t2; - - kind_info(NULL, NULL, NULL, &e1, &t1, who[i1]); - kind_info(NULL, NULL, NULL, &e2, &t2, who[i2]); - - if ((t1 > t2) || ((t1 == t2) && (e1 > e2))) - { - int tmp = who[i1]; - who[i1] = who[i2]; - who[i2] = tmp; - } - } - } - - /* Spoil each item */ - for (s = 0; s < n; s++) - { - int e; - s32b v; - - /* Describe the kind */ - kind_info(buf, dam, wgt, &e, &v, who[s]); - - /* Dump it */ - fprintf(fff, " %-45s%8s%7s%5d%9ld\n", - buf, dam, wgt, e, (long)(v)); - } - - /* Start a new set */ - n = 0; - - /* Notice the end */ - if (!group_item[i].tval) break; - - /* Start a new set */ - fprintf(fff, "\n\n%s\n\n", group_item[i].name); - } - - /* Acquire legal item types */ - for (k = 1; k < max_k_idx; k++) - { - object_kind *k_ptr = &k_info[k]; - - /* Skip wrong tval's */ - if (k_ptr->tval != group_item[i].tval) continue; - - /* Hack -- Skip artifacts */ - if (k_ptr->flags3 & (TR3_INSTA_ART | TR3_NORM_ART)) continue; - - /* Hack -- Skip Ring of Powers */ - if (k == 785) continue; - - /* Save the index */ - who[n++] = k; - } - } - - - /* Check for errors */ - if (ferror(fff) || my_fclose(fff)) - { - msg_print("Cannot close spoiler file."); - return; - } - - /* Message */ - msg_print("Successfully created a spoiler file."); -} - - - -/* - * Artifact Spoilers by: randy@PICARD.tamu.edu (Randy Hutson) - */ - - -/* - * Returns a "+" string if a number is non-negative and an empty - * string if negative - */ -#define POSITIZE(v) (((v) >= 0) ? "+" : "") - -/* - * These are used to format the artifact spoiler file. INDENT1 is used - * to indent all but the first line of an artifact spoiler. INDENT2 is - * used when a line "wraps". (Bladeturner's resistances cause this.) - */ -#define INDENT1 " " -#define INDENT2 " " - -/* - * MAX_LINE_LEN specifies when a line should wrap. - */ -#define MAX_LINE_LEN 75 - -/* - * Given an array, determine how many elements are in the array - */ -#define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0])) - -/* - * The artifacts categorized by type - */ -static grouper group_artifact[] = -{ - { TV_SWORD, "Edged Weapons" }, - { TV_POLEARM, "Polearms" }, - { TV_HAFTED, "Hafted Weapons" }, - { TV_AXE, "Axes" }, - - { TV_MSTAFF, "Mage Staffs" }, - - { TV_BOW, "Bows" }, - - { TV_SHOT, "Ammo" }, - { TV_ARROW, NULL }, - { TV_BOLT, NULL }, - - { TV_BOOMERANG, "Boomerangs" }, - - { TV_INSTRUMENT, "Instruments" }, - - { TV_SOFT_ARMOR, "Body Armor" }, - { TV_HARD_ARMOR, NULL }, - { TV_DRAG_ARMOR, NULL }, - - { TV_CLOAK, "Cloaks" }, - { TV_SHIELD, "Shields" }, - { TV_HELM, "Helms/Crowns" }, - { TV_CROWN, NULL }, - { TV_GLOVES, "Gloves" }, - { TV_BOOTS, "Boots" }, - - { TV_DAEMON_BOOK, "Demonic Equipment" }, - - { TV_LITE, "Light Sources" }, - { TV_AMULET, "Amulets" }, - { TV_RING, "Rings" }, - - { TV_TOOL, "Tools" }, - { TV_DIGGING, NULL }, - { TV_TRAPKIT, "Trapping Kits" }, - - { 0, NULL } -}; - - - -/* - * Pair together a constant flag with a textual description. - * - * Used by both "init.c" and "wiz-spo.c". - * - * Note that it sometimes more efficient to actually make an array - * of textual names, where entry 'N' is assumed to be paired with - * the flag whose value is "1L << N", but that requires hard-coding. - */ - -typedef struct flag_desc flag_desc; - -struct flag_desc -{ - const u32b flag; - const char *const desc; -}; - - - -/* - * These are used for "+3 to STR, DEX", etc. These are separate from - * the other pval affected traits to simplify the case where an object - * affects all stats. In this case, "All stats" is used instead of - * listing each stat individually. - */ - -static flag_desc stat_flags_desc[] = -{ - { TR1_STR, "STR" }, - { TR1_INT, "INT" }, - { TR1_WIS, "WIS" }, - { TR1_DEX, "DEX" }, - { TR1_CON, "CON" }, - { TR1_CHR, "CHR" } -}; - -/* - * Besides stats, these are the other player traits - * which may be affected by an object's pval - */ - -static flag_desc pval_flags1_desc[] = -{ - { TR1_STEALTH, "Stealth" }, - { TR1_SEARCH, "Searching" }, - { TR1_INFRA, "Infravision" }, - { TR1_TUNNEL, "Tunnelling" }, - { TR1_BLOWS, "Attacks" }, - { TR1_SPEED, "Speed" } -}; - -/* - * Slaying preferences for weapons - */ - -static flag_desc slay_flags_desc[] = -{ - { TR1_SLAY_ANIMAL, "Animal" }, - { TR1_SLAY_EVIL, "Evil" }, - { TR1_SLAY_UNDEAD, "Undead" }, - { TR1_SLAY_DEMON, "Demon" }, - { TR1_SLAY_ORC, "Orc" }, - { TR1_SLAY_TROLL, "Troll" }, - { TR1_SLAY_GIANT, "Giant" }, - { TR1_SLAY_DRAGON, "Dragon" }, - { TR1_KILL_DRAGON, "Xdragon" } -}; - -/* - * Elemental brands for weapons - * - * Clearly, TR1_IMPACT is a bit out of place here. To simplify - * coding, it has been included here along with the elemental - * brands. It does seem to fit in with the brands and slaying - * more than the miscellaneous section. - */ -static flag_desc brand_flags_desc[] = -{ - { TR1_BRAND_ACID, "Acid Brand" }, - { TR1_BRAND_ELEC, "Lightning Brand" }, - { TR1_BRAND_FIRE, "Flame Tongue" }, - { TR1_BRAND_COLD, "Frost Brand" }, - { TR1_BRAND_POIS, "Poisoned" }, - - { TR1_CHAOTIC, "Mark of Chaos" }, - { TR1_VAMPIRIC, "Vampiric" }, - { TR1_IMPACT, "Earthquake impact on hit" }, - { TR1_VORPAL, "Very sharp" }, -}; - - -/* - * The 15 resistables - */ -static const flag_desc resist_flags_desc[] = -{ - { TR2_RES_ACID, "Acid" }, - { TR2_RES_ELEC, "Lightning" }, - { TR2_RES_FIRE, "Fire" }, - { TR2_RES_COLD, "Cold" }, - { TR2_RES_POIS, "Poison" }, - { TR2_RES_FEAR, "Fear"}, - { TR2_RES_LITE, "Light" }, - { TR2_RES_DARK, "Dark" }, - { TR2_RES_BLIND, "Blindness" }, - { TR2_RES_CONF, "Confusion" }, - { TR2_RES_SOUND, "Sound" }, - { TR2_RES_SHARDS, "Shards" }, - { TR2_RES_NETHER, "Nether" }, - { TR2_RES_NEXUS, "Nexus" }, - { TR2_RES_CHAOS, "Chaos" }, - { TR2_RES_DISEN, "Disenchantment" }, -}; - -/* - * Elemental immunities (along with poison) - */ - -static const flag_desc immune_flags_desc[] = -{ - { TR2_IM_ACID, "Acid" }, - { TR2_IM_ELEC, "Lightning" }, - { TR2_IM_FIRE, "Fire" }, - { TR2_IM_COLD, "Cold" }, -}; - -/* - * Sustain stats - these are given their "own" line in the - * spoiler file, mainly for simplicity - */ -static const flag_desc sustain_flags_desc[] = -{ - { TR2_SUST_STR, "STR" }, - { TR2_SUST_INT, "INT" }, - { TR2_SUST_WIS, "WIS" }, - { TR2_SUST_DEX, "DEX" }, - { TR2_SUST_CON, "CON" }, - { TR2_SUST_CHR, "CHR" }, -}; - -/* - * Miscellaneous magic given by an object's "flags2" field - */ - -static const flag_desc misc_flags2_desc[] = -{ - { TR2_REFLECT, "Reflection" }, - { TR2_FREE_ACT, "Free Action" }, - { TR2_HOLD_LIFE, "Hold Life" }, -}; - -/* - * Miscellaneous magic given by an object's "flags3" field - * - * Note that cursed artifacts and objects with permanent light - * are handled "directly" -- see analyze_misc_magic() - */ - -static const flag_desc misc_flags3_desc[] = -{ - { TR3_SH_FIRE, "Fiery Aura" }, - { TR3_SH_ELEC, "Electric Aura" }, - { TR3_NO_TELE, "Prevent Teleportation" }, - { TR3_NO_MAGIC, "Anti-Magic" }, - { TR3_WRAITH, "Wraith Form" }, - { TR3_FEATHER, "Levitation" }, - { TR3_SEE_INVIS, "See Invisible" }, - { TR3_SLOW_DIGEST, "Slow Digestion" }, - { TR3_REGEN, "Regeneration" }, - { TR3_XTRA_SHOTS, "+1 Extra Shot" }, /* always +1? */ - { TR3_DRAIN_EXP, "Drains Experience" }, - { TR3_AGGRAVATE, "Aggravates" }, - { TR3_BLESSED, "Blessed Blade" }, -}; - - -/* - * A special type used just for dealing with pvals - */ -typedef struct -{ - /* - * This will contain a string such as "+2", "-10", etc. - */ - char pval_desc[12]; - - /* - * A list of various player traits affected by an object's pval such - * as stats, speed, stealth, etc. "Extra attacks" is NOT included in - * this list since it will probably be desirable to format its - * description differently. - * - * Note that room need only be reserved for the number of stats - 1 - * since the description "All stats" is used if an object affects all - * all stats. Also, room must be reserved for a sentinel NULL pointer. - * - * This will be a list such as ["STR", "DEX", "Stealth", NULL] etc. - * - * This list includes extra attacks, for simplicity. - */ - cptr pval_affects[N_ELEMENTS(stat_flags_desc) - 1 + - N_ELEMENTS(pval_flags1_desc) + 1]; - -} -pval_info_type; - - -/* - * An "object analysis structure" - * - * It will be filled with descriptive strings detailing an object's - * various magical powers. The "ignore X" traits are not noted since - * all artifacts ignore "normal" destruction. - */ - -typedef struct -{ - /* "The Longsword Dragonsmiter (6d4) (+20, +25)" */ - char description[160]; - - /* Description of what is affected by an object's pval */ - pval_info_type pval_info; - - /* A list of an object's slaying preferences */ - cptr slays[N_ELEMENTS(slay_flags_desc) + 1]; - - /* A list if an object's elemental brands */ - cptr brands[N_ELEMENTS(brand_flags_desc) + 1]; - - /* A list of immunities granted by an object */ - cptr immunities[N_ELEMENTS(immune_flags_desc) + 1]; - - /* A list of resistances granted by an object */ - cptr resistances[N_ELEMENTS(resist_flags_desc) + 1]; - - /* A list of stats sustained by an object */ - cptr sustains[N_ELEMENTS(sustain_flags_desc) - 1 + 1]; - - /* A list of various magical qualities an object may have */ - cptr misc_magic[N_ELEMENTS(misc_flags2_desc) + N_ELEMENTS(misc_flags3_desc) - + 1 /* Permanent Light */ - + 1 /* type of curse */ - + 1]; /* sentinel NULL */ - - /* A string describing an artifact's activation */ - cptr activation; - - /* "Level 20, Rarity 30, 3.0 lbs, 20000 Gold" */ - char misc_desc[80]; -} -obj_desc_list; - - - - - - -/* - * This function does most of the actual "analysis". Given a set of bit flags - * (which will be from one of the flags fields from the object in question), - * a "flag description structure", a "description list", and the number of - * elements in the "flag description structure", this function sets the - * "description list" members to the appropriate descriptions contained in - * the "flag description structure". - * - * The possibly updated description pointer is returned. - */ -static cptr *spoiler_flag_aux(const u32b art_flags, const flag_desc *flag_ptr, - cptr *desc_ptr, const int n_elmnts) -{ - int i; - - for (i = 0; i < n_elmnts; ++i) - { - if (art_flags & flag_ptr[i].flag) - { - *desc_ptr++ = flag_ptr[i].desc; - } - } - - return desc_ptr; -} - - -/* - * Acquire a "basic" description "The Cloak of Death [1,+10]" - */ -static void analyze_general (object_type *o_ptr, char *desc_ptr) -{ - /* Get a "useful" description of the object */ - object_desc_store(desc_ptr, o_ptr, TRUE, 1); -} - - -/* - * List "player traits" altered by an artifact's pval. These include stats, - * speed, infravision, tunnelling, stealth, searching, and extra attacks. - */ -static void analyze_pval (object_type *o_ptr, pval_info_type *p_ptr) -{ - const u32b all_stats = (TR1_STR | TR1_INT | TR1_WIS | - TR1_DEX | TR1_CON | TR1_CHR); - - u32b f1, f2, f3, f4, f5, esp; - - cptr *affects_list; - - /* If pval == 0, there is nothing to do. */ - if (!o_ptr->pval) - { - /* An "empty" pval description indicates that pval == 0 */ - p_ptr->pval_desc[0] = '\0'; - return; - } - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - affects_list = p_ptr->pval_affects; - - /* Create the "+N" string */ - sprintf(p_ptr->pval_desc, "%s%ld", POSITIZE(o_ptr->pval), (long int) o_ptr->pval); - - /* First, check to see if the pval affects all stats */ - if ((f1 & all_stats) == all_stats) - { - *affects_list++ = "All stats"; - } - - /* Are any stats affected? */ - else if (f1 & all_stats) - { - affects_list = spoiler_flag_aux(f1, stat_flags_desc, - affects_list, - N_ELEMENTS(stat_flags_desc)); - } - - /* And now the "rest" */ - affects_list = spoiler_flag_aux(f1, pval_flags1_desc, - affects_list, - N_ELEMENTS(pval_flags1_desc)); - - /* Terminate the description list */ - *affects_list = NULL; -} - - -/* Note the slaying specialties of a weapon */ -static void analyze_slay (object_type *o_ptr, cptr *slay_list) -{ - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - slay_list = spoiler_flag_aux(f1, slay_flags_desc, slay_list, - N_ELEMENTS(slay_flags_desc)); - - /* Terminate the description list */ - *slay_list = NULL; -} - -/* Note an object's elemental brands */ -static void analyze_brand (object_type *o_ptr, cptr *brand_list) -{ - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - brand_list = spoiler_flag_aux(f1, brand_flags_desc, brand_list, - N_ELEMENTS(brand_flags_desc)); - - /* Terminate the description list */ - *brand_list = NULL; -} - - -/* Note the resistances granted by an object */ -static void analyze_resist (object_type *o_ptr, cptr *resist_list) -{ - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - resist_list = spoiler_flag_aux(f2, resist_flags_desc, - resist_list, N_ELEMENTS(resist_flags_desc)); - - /* Terminate the description list */ - *resist_list = NULL; -} - - -/* Note the immunities granted by an object */ -static void analyze_immune (object_type *o_ptr, cptr *immune_list) -{ - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - immune_list = spoiler_flag_aux(f2, immune_flags_desc, - immune_list, N_ELEMENTS(immune_flags_desc)); - - /* Terminate the description list */ - *immune_list = NULL; -} - -/* Note which stats an object sustains */ - -static void analyze_sustains (object_type *o_ptr, cptr *sustain_list) -{ - const u32b all_sustains = (TR2_SUST_STR | TR2_SUST_INT | TR2_SUST_WIS | - TR2_SUST_DEX | TR2_SUST_CON | TR2_SUST_CHR); - - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - /* Simplify things if an item sustains all stats */ - if ((f2 & all_sustains) == all_sustains) - { - *sustain_list++ = "All stats"; - } - - /* Should we bother? */ - else if ((f2 & all_sustains)) - { - sustain_list = spoiler_flag_aux(f2, sustain_flags_desc, - sustain_list, - N_ELEMENTS(sustain_flags_desc)); - } - - /* Terminate the description list */ - *sustain_list = NULL; -} - - -/* - * Note miscellaneous powers bestowed by an artifact such as see invisible, - * free action, permanent light, etc. - */ -static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list) -{ - u32b f1, f2, f3, f4, f5, esp; - int radius = 0; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - misc_list = spoiler_flag_aux(f2, misc_flags2_desc, misc_list, - N_ELEMENTS(misc_flags2_desc)); - - misc_list = spoiler_flag_aux(f3, misc_flags3_desc, misc_list, - N_ELEMENTS(misc_flags3_desc)); - - /* - * Glowing artifacts -- small radius light. - */ - - if (f3 & TR3_LITE1) radius++; - if (f4 & TR4_LITE2) radius += 2; - if (f4 & TR4_LITE3) radius += 3; - - if (f4 & TR4_FUEL_LITE) - { - *misc_list++ = format("It provides light (radius %d) forever.", radius); - } - else - { - *misc_list++ = format("It provides light (radius %d) when fueled.", radius); - } - - /* - * Handle cursed objects here to avoid redundancies such as noting - * that a permanently cursed object is heavily cursed as well as - * being "lightly cursed". - */ - - if (cursed_p(o_ptr)) - { - if (f3 & (TR3_TY_CURSE)) - { - *misc_list++ = "Ancient Curse"; - } - if (f3 & (TR3_PERMA_CURSE)) - { - *misc_list++ = "Permanently Cursed"; - } - else if (f3 & (TR3_HEAVY_CURSE)) - { - *misc_list++ = "Heavily Cursed"; - } - else - { - *misc_list++ = "Cursed"; - } - } - - /* Terminate the description list */ - *misc_list = NULL; -} - - - - -/* - * Determine the minimum depth an artifact can appear, its rarity, its weight, - * and its value in gold pieces - */ -static void analyze_misc (object_type *o_ptr, char *misc_desc) -{ - artifact_type *a_ptr = &a_info[o_ptr->name1]; - - sprintf(misc_desc, "Level %u, Rarity %u, %d.%d lbs, %ld Gold", - a_ptr->level, a_ptr->rarity, - a_ptr->weight / 10, a_ptr->weight % 10, (long int) a_ptr->cost); -} - - -/* - * Fill in an object description structure for a given object - */ -static void object_analyze(object_type *o_ptr, obj_desc_list *desc_ptr) -{ - analyze_general(o_ptr, desc_ptr->description); - - analyze_pval(o_ptr, &desc_ptr->pval_info); - - analyze_brand(o_ptr, desc_ptr->brands); - - analyze_slay(o_ptr, desc_ptr->slays); - - analyze_immune(o_ptr, desc_ptr->immunities); - - analyze_resist(o_ptr, desc_ptr->resistances); - - analyze_sustains(o_ptr, desc_ptr->sustains); - - analyze_misc_magic(o_ptr, desc_ptr->misc_magic); - - analyze_misc(o_ptr, desc_ptr->misc_desc); - - desc_ptr->activation = item_activation(o_ptr, 0); -} - - -static void print_header(void) -{ - char buf[80]; - - sprintf(buf, "Artifact Spoilers for %s", get_version_string()); - spoiler_underline(buf); -} - -/* - * This is somewhat ugly. - * - * Given a header ("Resist", e.g.), a list ("Fire", "Cold", Acid", e.g.), - * and a separator character (',', e.g.), write the list to the spoiler file - * in a "nice" format, such as: - * - * Resist Fire, Cold, Acid - * - * That was a simple example, but when the list is long, a line wrap - * should occur, and this should induce a new level of indention if - * a list is being spread across lines. So for example, Bladeturner's - * list of resistances should look something like this - * - * Resist Acid, Lightning, Fire, Cold, Poison, Light, Dark, Blindness, - * Confusion, Sound, Shards, Nether, Nexus, Chaos, Disenchantment - * - * However, the code distinguishes between a single list of many items vs. - * many lists. (The separator is used to make this determination.) A single - * list of many items will not cause line wrapping (since there is no - * apparent reason to do so). So the lists of Ulmo's miscellaneous traits - * might look like this: - * - * Free Action; Hold Life; See Invisible; Slow Digestion; Regeneration - * Blessed Blade - * - * So comparing the two, "Regeneration" has no trailing separator and - * "Blessed Blade" was not indented. (Also, Ulmo's lists have no headers, - * but that's not relevant to line wrapping and indention.) - */ - -/* ITEM_SEP separates items within a list */ -#define ITEM_SEP ',' - - -/* LIST_SEP separates lists */ -#define LIST_SEP ';' - - -/* Create a spoiler file entry for an artifact */ - -static void spoiler_print_art(obj_desc_list *art_ptr, int name1, int set, object_type *o_ptr) -{ - /* Don't indent the first line */ - fprintf(fff, "%s\n ", art_ptr->description); - text_out_indent = 4; - object_out_desc(o_ptr, fff, FALSE, TRUE); - text_out_indent = 0; - - /* End with the miscellaneous facts */ - fprintf(fff, "%s%s\n\n", INDENT1, art_ptr->misc_desc); -} - - -/* - * Hack -- Create a "forged" artifact - */ -static bool_ make_fake_artifact(object_type *o_ptr, int name1) -{ - int i; - int cur; - - artifact_type *a_ptr = &a_info[name1]; - - - /* Ignore "empty" artifacts */ - if (!a_ptr->name) return FALSE; - - /* Acquire the "kind" index */ - i = lookup_kind(a_ptr->tval, a_ptr->sval); - - /* Oops */ - if (!i) return (FALSE); - - /* Create the artifact */ - object_prep(o_ptr, i); - - /* Save the name */ - o_ptr->name1 = name1; - - /* Keep the One Ring untouched by apply_magic */ - if (name1 != ART_POWER) - { - cur = a_ptr->cur_num; - apply_magic(o_ptr, -1, TRUE, TRUE, TRUE); - a_ptr->cur_num = cur; - } - else - { - o_ptr->pval = a_ptr->pval; - } - - /* Success */ - return (TRUE); -} - - -/* - * Create a spoiler file for artifacts - */ -static void spoil_artifact(cptr fname) -{ - int i, j; - - object_type forge; - object_type *q_ptr; - - obj_desc_list artifact; - - char buf[1024]; - - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); - - /* Open the file */ - fff = my_fopen(buf, "w"); - - /* Oops */ - if (!fff) - { - msg_print("Cannot create spoiler file."); - return; - } - - /* Dump the header */ - print_header(); - - /* List the artifacts by tval */ - for (i = 0; group_artifact[i].tval; i++) - { - /* Write out the group title */ - if (group_artifact[i].name) - { - spoiler_blanklines(2); - spoiler_underline(group_artifact[i].name); - spoiler_blanklines(1); - } - - /* Now search through all of the artifacts */ - for (j = 1; j < max_a_idx; ++j) - { - artifact_type *a_ptr = &a_info[j]; - - /* We only want objects in the current group */ - if (a_ptr->tval != group_artifact[i].tval) continue; - - /* Get local object */ - q_ptr = &forge; - - /* Wipe the object */ - object_wipe(q_ptr); - - /* Attempt to "forge" the artifact */ - if (!make_fake_artifact(q_ptr, j)) continue; - - /* Aware and Known */ - object_known(q_ptr); - - /* Mark the item as fully known */ - q_ptr->ident |= (IDENT_MENTAL); - - /* Analyze the artifact */ - object_analyze(q_ptr, &artifact); - - /* Write out the artifact description to the spoiler file */ - spoiler_print_art(&artifact, j, a_ptr->set, q_ptr); - } - } - - /* Check for errors */ - if (ferror(fff) || my_fclose(fff)) - { - msg_print("Cannot close spoiler file."); - return; - } - - /* Message */ - msg_print("Successfully created a spoiler file."); -} - - - - - -/* - * Create a spoiler file for monsters -BEN- - */ -static void spoil_mon_desc(cptr fname) -{ - char buf[1024]; - - char nam[80]; - char lev[80]; - char rar[80]; - char spd[80]; - char ac[80]; - char hp[80]; - char exp[80]; - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); - - /* Open the file */ - fff = my_fopen(buf, "w"); - - /* Oops */ - if (!fff) - { - msg_print("Cannot create spoiler file."); - return; - } - - /* Allocate the "who" array */ - std::vector who; - - /* Dump the header */ - sprintf(buf, "Monster Spoilers for %s", get_version_string()); - spoiler_underline(buf); - spoiler_blanklines(2); - - /* Dump the header */ - fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", - "Name", "Lev", "Rar", "Spd", "Hp", "Ac", "Visual Info"); - fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", - "----", "---", "---", "---", "--", "--", "-----------"); - - - /* Scan the monsters */ - for (size_t i = 1; i < max_r_idx; i++) - { - monster_race *r_ptr = &r_info[i]; - - /* Use that monster */ - if (r_ptr->name) { - who.push_back(i); - } - } - - - /* Scan again */ - for (auto const who_i : who) - { - monster_race *r_ptr = &r_info[who_i]; - - /* Get the "name" */ - if (r_ptr->flags & RF_UNIQUE) - { - sprintf(nam, "[U] %s", r_ptr->name); - } - else - { - sprintf(nam, "The %s", r_ptr->name); - } - - - /* Level */ - sprintf(lev, "%d", r_ptr->level); - - /* Rarity */ - sprintf(rar, "%d", r_ptr->rarity); - - /* Speed */ - if (r_ptr->speed >= 110) - { - sprintf(spd, "+%d", (r_ptr->speed - 110)); - } - else - { - sprintf(spd, "-%d", (110 - r_ptr->speed)); - } - - /* Armor Class */ - sprintf(ac, "%d", r_ptr->ac); - - /* Hitpoints */ - if ((r_ptr->flags & RF_FORCE_MAXHP) || (r_ptr->hside == 1)) - { - sprintf(hp, "%d", r_ptr->hdice * r_ptr->hside); - } - else - { - sprintf(hp, "%dd%d", r_ptr->hdice, r_ptr->hside); - } - - - /* Experience */ - sprintf(exp, "%ld", (long)(r_ptr->mexp)); - - /* Hack -- use visual instead */ - sprintf(exp, "%s '%c'", attr_to_text(r_ptr->d_attr), r_ptr->d_char); - - /* Dump the info */ - fprintf(fff, "%-40.40s%4s%4s%6s%8s%4s %11.11s\n", - nam, lev, rar, spd, hp, ac, exp); - } - - /* End it */ - fprintf(fff, "\n"); - - /* Check for errors */ - if (ferror(fff) || my_fclose(fff)) - { - msg_print("Cannot close spoiler file."); - return; - } - - /* Worked */ - msg_print("Successfully created a spoiler file."); -} - - - - -/* - * Monster spoilers by: smchorse@ringer.cs.utsa.edu (Shawn McHorse) - * - * Primarily based on code already in mon-desc.c, mostly by -BEN- - */ - -/* - * Pronoun arrays - */ -static cptr wd_che[3] = { "It", "He", "She" }; -static cptr wd_lhe[3] = { "it", "he", "she" }; - - - -/* - * Create a spoiler file for monsters (-SHAWN-) - */ -static void spoil_mon_info(cptr fname) -{ - char buf[1024]; - int msex, vn, i, j, k, n; - bool_ breath, magic, sin; - cptr p, q; - cptr vp[64]; - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); - - /* Open the file */ - fff = my_fopen(buf, "w"); - - /* Oops */ - if (!fff) - { - msg_print("Cannot create spoiler file."); - return; - } - - - /* Dump the header */ - sprintf(buf, "Monster Spoilers for %s", get_version_string()); - spoiler_underline(buf); - spoiler_blanklines(2); - - /* - * List all monsters in order. - */ - for (n = 1; n < max_r_idx; n++) - { - monster_race *r_ptr = &r_info[n]; - - /* Extract the flags */ - auto const flags = r_ptr->flags; - auto const spells = r_ptr->spells; - breath = FALSE; - magic = FALSE; - - /* Extract a gender (if applicable) */ - if (flags & RF_FEMALE) msex = 2; - else if (flags & RF_MALE) msex = 1; - else msex = 0; - - - /* Prefix */ - if (flags & RF_UNIQUE) - { - spoil_out("[U] "); - } - else - { - spoil_out("The "); - } - - /* Name */ - sprintf(buf, "%s (", r_ptr->name); /* ---)--- */ - spoil_out(buf); - - /* Color */ - spoil_out(attr_to_text(r_ptr->d_attr)); - - /* Symbol --(-- */ - sprintf(buf, " '%c')\n", r_ptr->d_char); - spoil_out(buf); - - - /* Indent */ - sprintf(buf, "=== "); - spoil_out(buf); - - /* Number */ - sprintf(buf, "Num:%d ", n); - spoil_out(buf); - - /* Level */ - sprintf(buf, "Lev:%d ", r_ptr->level); - spoil_out(buf); - - /* Rarity */ - sprintf(buf, "Rar:%d ", r_ptr->rarity); - spoil_out(buf); - - /* Speed */ - if (r_ptr->speed >= 110) - { - sprintf(buf, "Spd:+%d ", (r_ptr->speed - 110)); - } - else - { - sprintf(buf, "Spd:-%d ", (110 - r_ptr->speed)); - } - spoil_out(buf); - - /* Hitpoints */ - if ((flags & RF_FORCE_MAXHP) || (r_ptr->hside == 1)) - { - sprintf(buf, "Hp:%d ", r_ptr->hdice * r_ptr->hside); - } - else - { - sprintf(buf, "Hp:%dd%d ", r_ptr->hdice, r_ptr->hside); - } - spoil_out(buf); - - /* Armor Class */ - sprintf(buf, "Ac:%d ", r_ptr->ac); - spoil_out(buf); - - /* Experience */ - sprintf(buf, "Exp:%ld\n", (long)(r_ptr->mexp)); - spoil_out(buf); - - - /* Describe */ - spoil_out(r_ptr->text); - spoil_out(" "); - - - spoil_out("This"); - - if (flags & RF_ELDRITCH_HORROR) spoil_out (" sanity-blasting"); - if (flags & RF_ANIMAL) spoil_out(" natural"); - if (flags & RF_EVIL) spoil_out(" evil"); - if (flags & RF_GOOD) spoil_out(" good"); - if (flags & RF_UNDEAD) spoil_out(" undead"); - - if (flags & RF_DRAGON) spoil_out(" dragon"); - else if (flags & RF_DEMON) spoil_out(" demon"); - else if (flags & RF_GIANT) spoil_out(" giant"); - else if (flags & RF_TROLL) spoil_out(" troll"); - else if (flags & RF_ORC) spoil_out(" orc"); - else if (flags & RF_THUNDERLORD) spoil_out (" Thunderlord"); - else spoil_out(" creature"); - - spoil_out(" moves"); - - if ((flags & RF_RAND_50) && (flags & RF_RAND_25)) - { - spoil_out(" extremely erratically"); - } - else if (flags & RF_RAND_50) - { - spoil_out(" somewhat erratically"); - } - else if (flags & RF_RAND_25) - { - spoil_out(" a bit erratically"); - } - else - { - spoil_out(" normally"); - } - - if (flags & RF_NEVER_MOVE) - { - spoil_out(", but does not deign to chase intruders"); - } - - spoil_out(". "); - - if (!r_ptr->level || (flags & RF_FORCE_DEPTH)) - { - sprintf(buf, "%s is never found out of depth. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags & RF_FORCE_SLEEP) - { - sprintf(buf, "%s is always created sluggish. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags & RF_AURA_FIRE) - { - sprintf(buf, "%s is surrounded by flames. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags & RF_AURA_ELEC) - { - sprintf(buf, "%s is surrounded by electricity. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags & RF_REFLECTING) - { - sprintf(buf, "%s reflects bolt spells. ", wd_che[msex]); - spoil_out(buf); - } - - if (flags & RF_ESCORT) - { - sprintf(buf, "%s usually appears with ", wd_che[msex]); - spoil_out(buf); - if (flags & RF_ESCORTS) spoil_out("escorts. "); - else spoil_out("an escort. "); - } - - if ((flags & RF_FRIEND) || (flags & RF_FRIENDS)) - { - sprintf(buf, "%s usually appears in groups. ", wd_che[msex]); - spoil_out(buf); - } - - /* Collect innate attacks */ - vn = 0; - if (spells & SF_SHRIEK) vp[vn++] = "shriek for help"; - if (spells & SF_ROCKET) vp[vn++] = "shoot a rocket"; - if (spells & SF_ARROW_1) vp[vn++] = "fire arrows"; - if (spells & SF_ARROW_2) vp[vn++] = "fire arrows"; - if (spells & SF_ARROW_3) vp[vn++] = "fire missiles"; - if (spells & SF_ARROW_4) vp[vn++] = "fire missiles"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" may "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - /* Collect breaths */ - vn = 0; - if (spells & SF_BR_ACID) vp[vn++] = "acid"; - if (spells & SF_BR_ELEC) vp[vn++] = "lightning"; - if (spells & SF_BR_FIRE) vp[vn++] = "fire"; - if (spells & SF_BR_COLD) vp[vn++] = "frost"; - if (spells & SF_BR_POIS) vp[vn++] = "poison"; - if (spells & SF_BR_NETH) vp[vn++] = "nether"; - if (spells & SF_BR_LITE) vp[vn++] = "light"; - if (spells & SF_BR_DARK) vp[vn++] = "darkness"; - if (spells & SF_BR_CONF) vp[vn++] = "confusion"; - if (spells & SF_BR_SOUN) vp[vn++] = "sound"; - if (spells & SF_BR_CHAO) vp[vn++] = "chaos"; - if (spells & SF_BR_DISE) vp[vn++] = "disenchantment"; - if (spells & SF_BR_NEXU) vp[vn++] = "nexus"; - if (spells & SF_BR_TIME) vp[vn++] = "time"; - if (spells & SF_BR_INER) vp[vn++] = "inertia"; - if (spells & SF_BR_GRAV) vp[vn++] = "gravity"; - if (spells & SF_BR_SHAR) vp[vn++] = "shards"; - if (spells & SF_BR_PLAS) vp[vn++] = "plasma"; - if (spells & SF_BR_WALL) vp[vn++] = "force"; - if (spells & SF_BR_MANA) vp[vn++] = "mana"; - if (spells & SF_BR_NUKE) vp[vn++] = "toxic waste"; - if (spells & SF_BR_DISI) vp[vn++] = "disintegration"; - - if (vn) - { - breath = TRUE; - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" may breathe "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); - } - if (flags & RF_POWERFUL) spoil_out(" powerfully"); - } - - /* Collect spells */ - vn = 0; - if (spells & SF_BA_ACID) vp[vn++] = "produce acid balls"; - if (spells & SF_BA_ELEC) vp[vn++] = "produce lightning balls"; - if (spells & SF_BA_FIRE) vp[vn++] = "produce fire balls"; - if (spells & SF_BA_COLD) vp[vn++] = "produce frost balls"; - if (spells & SF_BA_POIS) vp[vn++] = "produce poison balls"; - if (spells & SF_BA_NETH) vp[vn++] = "produce nether balls"; - if (spells & SF_BA_WATE) vp[vn++] = "produce water balls"; - if (spells & SF_BA_NUKE) vp[vn++] = "produce balls of radiation"; - if (spells & SF_BA_MANA) vp[vn++] = "produce mana storms"; - if (spells & SF_BA_DARK) vp[vn++] = "produce darkness storms"; - if (spells & SF_BA_CHAO) vp[vn++] = "invoke raw Chaos"; - if (spells & SF_HAND_DOOM) vp[vn++] = "invoke the Hand of Doom"; - if (spells & SF_DRAIN_MANA) vp[vn++] = "drain mana"; - if (spells & SF_MIND_BLAST) vp[vn++] = "cause mind blasting"; - if (spells & SF_BRAIN_SMASH) vp[vn++] = "cause brain smashing"; - if (spells & (SF_CAUSE_1)) vp[vn++] = "cause light wounds and cursing"; - if (spells & (SF_CAUSE_2)) vp[vn++] = "cause serious wounds and cursing"; - if (spells & (SF_CAUSE_3)) vp[vn++] = "cause critical wounds and cursing"; - if (spells & (SF_CAUSE_4)) vp[vn++] = "cause mortal wounds"; - if (spells & SF_BO_ACID) vp[vn++] = "produce acid bolts"; - if (spells & SF_BO_ELEC) vp[vn++] = "produce lightning bolts"; - if (spells & SF_BO_FIRE) vp[vn++] = "produce fire bolts"; - if (spells & SF_BO_COLD) vp[vn++] = "produce frost bolts"; - if (spells & SF_BO_POIS) vp[vn++] = "produce poison bolts"; - if (spells & SF_BO_NETH) vp[vn++] = "produce nether bolts"; - if (spells & SF_BO_WATE) vp[vn++] = "produce water bolts"; - if (spells & SF_BO_MANA) vp[vn++] = "produce mana bolts"; - if (spells & SF_BO_PLAS) vp[vn++] = "produce plasma bolts"; - if (spells & SF_BO_ICEE) vp[vn++] = "produce ice bolts"; - if (spells & SF_MISSILE) vp[vn++] = "produce magic missiles"; - if (spells & SF_SCARE) vp[vn++] = "terrify"; - if (spells & SF_BLIND) vp[vn++] = "blind"; - if (spells & SF_CONF) vp[vn++] = "confuse"; - if (spells & SF_SLOW) vp[vn++] = "slow"; - if (spells & SF_HOLD) vp[vn++] = "paralyse"; - if (spells & SF_HASTE) vp[vn++] = "haste-self"; - if (spells & SF_HEAL) vp[vn++] = "heal-self"; - if (spells & SF_BLINK) vp[vn++] = "blink-self"; - if (spells & SF_TPORT) vp[vn++] = "teleport-self"; - if (spells & SF_S_BUG) vp[vn++] = "summon software bugs"; - if (spells & SF_S_RNG) vp[vn++] = "summon RNGs"; - if (spells & SF_TELE_TO) vp[vn++] = "teleport to"; - if (spells & SF_TELE_AWAY) vp[vn++] = "teleport away"; - if (spells & SF_TELE_LEVEL) vp[vn++] = "teleport level"; - if (spells & SF_DARKNESS) vp[vn++] = "create darkness"; - if (spells & SF_TRAPS) vp[vn++] = "create traps"; - if (spells & SF_FORGET) vp[vn++] = "cause amnesia"; - if (spells & SF_RAISE_DEAD) vp[vn++] = "raise dead"; - if (spells & SF_S_THUNDERLORD) vp[vn++] = "summon a thunderlord"; - if (spells & SF_S_MONSTER) vp[vn++] = "summon a monster"; - if (spells & SF_S_MONSTERS) vp[vn++] = "summon monsters"; - if (spells & SF_S_KIN) vp[vn++] = "summon aid"; - if (spells & SF_S_ANT) vp[vn++] = "summon ants"; - if (spells & SF_S_SPIDER) vp[vn++] = "summon spiders"; - if (spells & SF_S_HOUND) vp[vn++] = "summon hounds"; - if (spells & SF_S_HYDRA) vp[vn++] = "summon hydras"; - if (spells & SF_S_ANGEL) vp[vn++] = "summon an angel"; - if (spells & SF_S_DEMON) vp[vn++] = "summon a demon"; - if (spells & SF_S_UNDEAD) vp[vn++] = "summon an undead"; - if (spells & SF_S_DRAGON) vp[vn++] = "summon a dragon"; - if (spells & SF_S_ANIMAL) vp[vn++] = "summon animal"; - if (spells & SF_S_ANIMALS) vp[vn++] = "summon animals"; - if (spells & SF_S_HI_UNDEAD) vp[vn++] = "summon greater undead"; - if (spells & SF_S_HI_DRAGON) vp[vn++] = "summon ancient dragons"; - if (spells & SF_S_HI_DEMON) vp[vn++] = "summon greater demons"; - if (spells & SF_S_WRAITH) vp[vn++] = "summon Ringwraith"; - if (spells & SF_S_UNIQUE) vp[vn++] = "summon unique monsters"; - - if (vn) - { - magic = TRUE; - if (breath) - { - spoil_out(", and is also"); - } - else - { - spoil_out(wd_che[msex]); - spoil_out(" is"); - } - - spoil_out(" magical, casting spells"); - if (flags & RF_SMART) spoil_out(" intelligently"); - - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" which "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); - } - } - - if (breath || magic) - { - int times = r_ptr->freq_inate + r_ptr->freq_spell; - sprintf(buf, "; 1 time in %d. ", - 200 / ((times) ? times : 1)); - spoil_out(buf); - } - - /* Collect special abilities. */ - vn = 0; - if (flags & RF_OPEN_DOOR) vp[vn++] = "open doors"; - if (flags & RF_BASH_DOOR) vp[vn++] = "bash down doors"; - if (flags & RF_PASS_WALL) vp[vn++] = "pass through walls"; - if (flags & RF_KILL_WALL) vp[vn++] = "bore through walls"; - if (flags & RF_MOVE_BODY) vp[vn++] = "push past weaker monsters"; - if (flags & RF_KILL_BODY) vp[vn++] = "destroy weaker monsters"; - if (flags & RF_TAKE_ITEM) vp[vn++] = "pick up objects"; - if (flags & RF_KILL_ITEM) vp[vn++] = "destroy objects"; - if (flags & RF_HAS_LITE) vp[vn++] = "illuminate the dungeon"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" can "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - if (flags & RF_INVISIBLE) - { - spoil_out(wd_che[msex]); - spoil_out(" is invisible. "); - } - if (flags & RF_COLD_BLOOD) - { - spoil_out(wd_che[msex]); - spoil_out(" is cold blooded. "); - } - if (flags & RF_EMPTY_MIND) - { - spoil_out(wd_che[msex]); - spoil_out(" is not detected by telepathy. "); - } - if (flags & RF_WEIRD_MIND) - { - spoil_out(wd_che[msex]); - spoil_out(" is rarely detected by telepathy. "); - } - if (spells & SF_MULTIPLY) - { - spoil_out(wd_che[msex]); - spoil_out(" breeds explosively. "); - } - if (flags & RF_REGENERATE) - { - spoil_out(wd_che[msex]); - spoil_out(" regenerates quickly. "); - } - - /* Collect susceptibilities */ - vn = 0; - if (flags & RF_HURT_ROCK) vp[vn++] = "rock remover"; - if (flags & RF_HURT_LITE) vp[vn++] = "bright light"; - if (flags & RF_SUSCEP_FIRE) vp[vn++] = "fire"; - if (flags & RF_SUSCEP_COLD) vp[vn++] = "cold"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" is hurt by "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - /* Collect immunities */ - vn = 0; - if (flags & RF_IM_ACID) vp[vn++] = "acid"; - if (flags & RF_IM_ELEC) vp[vn++] = "lightning"; - if (flags & RF_IM_FIRE) vp[vn++] = "fire"; - if (flags & RF_IM_COLD) vp[vn++] = "cold"; - if (flags & RF_IM_POIS) vp[vn++] = "poison"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" resists "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - /* Collect resistances */ - vn = 0; - if (flags & RF_RES_NETH) vp[vn++] = "nether"; - if (flags & RF_RES_WATE) vp[vn++] = "water"; - if (flags & RF_RES_PLAS) vp[vn++] = "plasma"; - if (flags & RF_RES_NEXU) vp[vn++] = "nexus"; - if (flags & RF_RES_DISE) vp[vn++] = "disenchantment"; - if (flags & RF_RES_TELE) vp[vn++] = "teleportation"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" resists "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" and "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - /* Collect non-effects */ - vn = 0; - if (flags & RF_NO_STUN) vp[vn++] = "stunned"; - if (flags & RF_NO_FEAR) vp[vn++] = "frightened"; - if (flags & RF_NO_CONF) vp[vn++] = "confused"; - if (flags & RF_NO_SLEEP) vp[vn++] = "slept"; - - if (vn) - { - spoil_out(wd_che[msex]); - for (i = 0; i < vn; i++) - { - if (!i) spoil_out(" cannot be "); - else if (i < vn - 1) spoil_out(", "); - else spoil_out(" or "); - spoil_out(vp[i]); - } - spoil_out(". "); - } - - spoil_out(wd_che[msex]); - if (r_ptr->sleep > 200) spoil_out(" prefers to ignore"); - else if (r_ptr->sleep > 95) spoil_out(" pays very little attention to"); - else if (r_ptr->sleep > 75) spoil_out(" pays little attention to"); - else if (r_ptr->sleep > 45) spoil_out(" tends to overlook"); - else if (r_ptr->sleep > 25) spoil_out(" takes quite a while to see"); - else if (r_ptr->sleep > 10) spoil_out(" takes a while to see"); - else if (r_ptr->sleep > 5) spoil_out(" is fairly observant of"); - else if (r_ptr->sleep > 3) spoil_out(" is observant of"); - else if (r_ptr->sleep > 1) spoil_out(" is very observant of"); - else if (r_ptr->sleep > 0) spoil_out(" is vigilant for"); - else spoil_out(" is ever vigilant for"); - - sprintf(buf, " intruders, which %s may notice from %d feet. ", - wd_lhe[msex], 10 * r_ptr->aaf); - spoil_out(buf); - - i = 0; - if (flags & RF_DROP_60) i += 1; - if (flags & RF_DROP_90) i += 2; - if (flags & RF_DROP_1D2) i += 2; - if (flags & RF_DROP_2D2) i += 4; - if (flags & RF_DROP_3D2) i += 6; - if (flags & RF_DROP_4D2) i += 8; - - /* Drops gold and/or items */ - if (i) - { - sin = FALSE; - spoil_out(wd_che[msex]); - spoil_out(" will carry"); - - if (i == 1) - { - spoil_out(" a"); - sin = TRUE; - } - else if (i == 2) - { - spoil_out(" one or two"); - } - else - { - sprintf(buf, " up to %u", i); - spoil_out(buf); - } - - if (flags & RF_DROP_GREAT) - { - if (sin) spoil_out("n"); - spoil_out(" exceptional object"); - } - else if (flags & RF_DROP_GOOD) - { - spoil_out(" good object"); - } - else if (flags & RF_DROP_USEFUL) - { - spoil_out(" useful object"); - } - else if (flags & RF_ONLY_ITEM) - { - spoil_out(" object"); - } - else if (flags & RF_ONLY_GOLD) - { - spoil_out(" treasure"); - } - else - { - if (sin) spoil_out("n"); - spoil_out(" object"); - if (i > 1) spoil_out("s"); - spoil_out(" or treasure"); - } - if (i > 1) spoil_out("s"); - - if (flags & RF_DROP_CHOSEN) - { - spoil_out(", in addition to chosen objects"); - } - - spoil_out(". "); - } - - /* Count the actual attacks */ - for (i = 0, j = 0; j < 4; j++) - { - if (r_ptr->blow[j].method) i++; - } - - /* Examine the actual attacks */ - for (k = 0, j = 0; j < 4; j++) - { - if (!r_ptr->blow[j].method) continue; - - /* No method yet */ - p = "???"; - - /* Acquire the method */ - switch (r_ptr->blow[j].method) - { - case RBM_HIT: - p = "hit"; - break; - case RBM_TOUCH: - p = "touch"; - break; - case RBM_PUNCH: - p = "punch"; - break; - case RBM_KICK: - p = "kick"; - break; - case RBM_CLAW: - p = "claw"; - break; - case RBM_BITE: - p = "bite"; - break; - case RBM_STING: - p = "sting"; - break; - case RBM_XXX1: - break; - case RBM_BUTT: - p = "butt"; - break; - case RBM_CRUSH: - p = "crush"; - break; - case RBM_ENGULF: - p = "engulf"; - break; - case RBM_CHARGE: - p = "charge"; - break; - case RBM_CRAWL: - p = "crawl on you"; - break; - case RBM_DROOL: - p = "drool on you"; - break; - case RBM_SPIT: - p = "spit"; - break; - case RBM_EXPLODE: - p = "explode"; - break; - case RBM_GAZE: - p = "gaze"; - break; - case RBM_WAIL: - p = "wail"; - break; - case RBM_SPORE: - p = "release spores"; - break; - case RBM_XXX4: - break; - case RBM_BEG: - p = "beg"; - break; - case RBM_INSULT: - p = "insult"; - break; - case RBM_MOAN: - p = "moan"; - break; - case RBM_SHOW: - p = "sing"; - break; - } - - - /* Default effect */ - q = "???"; - - /* Acquire the effect */ - switch (r_ptr->blow[j].effect) - { - case RBE_HURT: - q = "attack"; - break; - case RBE_POISON: - q = "poison"; - break; - case RBE_UN_BONUS: - q = "disenchant"; - break; - case RBE_UN_POWER: - q = "drain charges"; - break; - case RBE_EAT_GOLD: - q = "steal gold"; - break; - case RBE_EAT_ITEM: - q = "steal items"; - break; - case RBE_EAT_FOOD: - q = "eat your food"; - break; - case RBE_EAT_LITE: - q = "absorb light"; - break; - case RBE_ACID: - q = "shoot acid"; - break; - case RBE_ELEC: - q = "electrocute"; - break; - case RBE_FIRE: - q = "burn"; - break; - case RBE_COLD: - q = "freeze"; - break; - case RBE_BLIND: - q = "blind"; - break; - case RBE_CONFUSE: - q = "confuse"; - break; - case RBE_TERRIFY: - q = "terrify"; - break; - case RBE_PARALYZE: - q = "paralyze"; - break; - case RBE_LOSE_STR: - q = "reduce strength"; - break; - case RBE_LOSE_INT: - q = "reduce intelligence"; - break; - case RBE_LOSE_WIS: - q = "reduce wisdom"; - break; - case RBE_LOSE_DEX: - q = "reduce dexterity"; - break; - case RBE_LOSE_CON: - q = "reduce constitution"; - break; - case RBE_LOSE_CHR: - q = "reduce charisma"; - break; - case RBE_LOSE_ALL: - q = "reduce all stats"; - break; - case RBE_SHATTER: - q = "shatter"; - break; - case RBE_EXP_10: - q = "lower experience (by 10d6+)"; - break; - case RBE_EXP_20: - q = "lower experience (by 20d6+)"; - break; - case RBE_EXP_40: - q = "lower experience (by 40d6+)"; - break; - case RBE_EXP_80: - q = "lower experience (by 80d6+)"; - break; - case RBE_DISEASE: - q = "disease"; - break; - case RBE_TIME: - q = "time"; - break; - case RBE_SANITY: - q = "make insane"; - break; - case RBE_HALLU: - q = "cause hallucinations"; - break; - case RBE_PARASITE: - q = "parasite"; - break; - } - - - if (!k) - { - spoil_out(wd_che[msex]); - spoil_out(" can "); - } - else if (k < i - 1) - { - spoil_out(", "); - } - else - { - spoil_out(", and "); - } - - /* Describe the method */ - spoil_out(p); - - /* Describe the effect, if any */ - if (r_ptr->blow[j].effect) - { - spoil_out(" to "); - spoil_out(q); - if (r_ptr->blow[j].d_dice && r_ptr->blow[j].d_side) - { - spoil_out(" with damage"); - if (r_ptr->blow[j].d_side == 1) - sprintf(buf, " %d", r_ptr->blow[j].d_dice); - else - sprintf(buf, " %dd%d", - r_ptr->blow[j].d_dice, r_ptr->blow[j].d_side); - spoil_out(buf); - } - } - - k++; - } - - if (k) - { - spoil_out(". "); - } - else if (flags & RF_NEVER_BLOW) - { - sprintf(buf, "%s has no physical attacks. ", wd_che[msex]); - spoil_out(buf); - } - - spoil_out(NULL); - } - - /* Check for errors */ - if (ferror(fff) || my_fclose(fff)) - { - msg_print("Cannot close spoiler file."); - return; - } - - msg_print("Successfully created a spoiler file."); -} - -/* - * Print a bookless spell list - */ -void print_magic_powers( magic_power *powers, int max_powers, void(*power_info)(char *p, int power), int skill_num ) -{ - int i, save_skill; - - char buf[80]; - - magic_power spell; - - /* Use a maximal skill */ - save_skill = s_info[skill_num].value; - s_info[skill_num].value = SKILL_MAX; - - /* Dump the header line */ - spoiler_blanklines(2); - sprintf(buf, "%s", s_info[skill_num].name); - spoiler_underline(buf); - spoiler_blanklines(1); - - fprintf(fff, " Name Lvl Mana Fail Info\n"); - - /* Dump the spells */ - for (i = 0; i < max_powers; i++) - { - /* Access the spell */ - spell = powers[i]; - - /* Get the additional info */ - power_info(buf, i); - - /* Dump the spell */ - spoil_out(format("%c) %-30s%2d %4d %3d%%%s\n", - I2A(i), spell.name, - spell.min_lev, spell.mana_cost, spell.fail, buf)); - spoil_out(format("%s\n", spell.desc)); - } - - /* Restore skill */ - s_info[skill_num].value = save_skill; -} - - -/* - * Create a spoiler file for spells - */ - -static void spoil_spells(cptr fname) -{ - char buf[1024]; - - /* Build the filename */ - path_build(buf, sizeof(buf), ANGBAND_DIR_USER, fname); - - fff = my_fopen(buf, "w"); - - /* Oops */ - if (!fff) - { - msg_print("Cannot create spoiler file."); - return; - } - - /* Dump the header */ - sprintf(buf, "Spell Spoiler (Skill Level 50) for %s", get_version_string()); - spoiler_underline(buf); - - /* Dump the bookless magic powers in alphabetical order */ - - /* Mimicry */ - print_magic_powers(mimic_powers, MAX_MIMIC_POWERS, mimic_info, SKILL_MIMICRY); - - /* Mindcraft */ - print_magic_powers(mindcraft_powers, MAX_MINDCRAFT_POWERS, mindcraft_info, SKILL_MINDCRAFT); - - /* Necromancy */ - print_magic_powers(necro_powers, MAX_NECRO_POWERS, necro_info, SKILL_NECROMANCY); - - /* Symbiosis */ - print_magic_powers(symbiotic_powers, MAX_SYMBIOTIC_POWERS, symbiotic_info, SKILL_SYMBIOTIC); - - /* Check for errors */ - if (ferror(fff) || my_fclose(fff)) - { - msg_print("Cannot close spoiler file."); - return; - } - - /* Message */ - msg_print("Successfully created a spoiler file."); -} - - -/* - * Create Spoiler files -BEN- - */ -void do_cmd_spoilers() -{ - int i; - - - /* Enter "icky" mode */ - character_icky = TRUE; - - /* Save the screen */ - Term_save(); - - /* Interact */ - while (1) - { - /* Clear screen */ - Term_clear(); - - /* Info */ - prt("Create a spoiler file.", 2, 0); - - /* Prompt for a file */ - prt("(1) Brief Object Info (obj-desc.spo)", 5, 5); - prt("(2) Full Artifact Info (artifact.spo)", 6, 5); - prt("(3) Brief Monster Info (mon-desc.spo)", 7, 5); - prt("(4) Full Monster Info (mon-info.spo)", 8, 5); - prt("(5) Spell Info (spell.spo)", 10, 5); - - /* Prompt */ - prt("Command: ", 12, 0); - - /* Get a choice */ - i = inkey(); - - /* Escape */ - if (i == ESCAPE) - { - break; - } - - /* Option (1) */ - else if (i == '1') - { - spoil_obj_desc("obj-desc.spo"); - } - - /* Option (2) */ - else if (i == '2') - { - spoil_artifact("artifact.spo"); - } - - /* Option (3) */ - else if (i == '3') - { - spoil_mon_desc("mon-desc.spo"); - } - - /* Option (4) */ - else if (i == '4') - { - spoil_mon_info("mon-info.spo"); - } - - /* Option (5) */ - else if (i == '5') - { - spoil_spells("spell.spo"); - } - - /* Oops */ - else - { - bell(); - } - - /* Flush messages */ - msg_print(NULL); - } - - - /* Restore the screen */ - Term_load(); - - /* Leave "icky" mode */ - character_icky = FALSE; -} diff --git a/src/wizard1.hpp b/src/wizard1.hpp deleted file mode 100644 index 0429aa70..00000000 --- a/src/wizard1.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void do_cmd_spoilers(); diff --git a/src/wizard2.cc b/src/wizard2.cc index de1530d8..eb3b375c 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -35,7 +35,6 @@ #include "variable.hpp" #include "wilderness_map.hpp" #include "wilderness_type_info.hpp" -#include "wizard1.hpp" #include "xtra1.hpp" #include "xtra2.hpp" #include "z-rand.hpp" @@ -1565,11 +1564,6 @@ void do_cmd_debug() break; - /* Hack -- Generate Spoilers */ - case '"': - do_cmd_spoilers(); - break; - /* Hack -- Help */ case '?': do_cmd_help(); -- cgit v1.2.3 From ca3fab4c43e155494e7eddfede551f3ced7ddad0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove a couple of debug.txt references to Lua --- lib/help/debug.txt | 11 ++--------- lib/mods/theme/help/debug.txt | 11 ++--------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/lib/help/debug.txt b/lib/help/debug.txt index 04869b71..5328af35 100644 --- a/lib/help/debug.txt +++ b/lib/help/debug.txt @@ -53,7 +53,7 @@ will not be scored if you use debug commands. [ (unused) ^M (unused) ] (unused) ^N (unused) *****debug.txt*67[- Create object] ^O (unused) - *****debug.txt*69[_ The path to the god dark] ^P (unused) + ^P (unused) *****debug.txt*71[+ Gain a fate] ^Q (unused) *****debug.txt*73[= Align monster] ^R (unused) ; (unused) ^S (unused) @@ -63,7 +63,7 @@ will not be scored if you use debug commands. , (unused) ^W (unused) < (unused) ^X (unused) . (unused) ^Y (unused) - *****debug.txt*81[> Lua script] ^Z (unused) + ^Z (unused) \ (unused) | (unused) ` (unused) ~ (unused) *****debug.txt*91[/ Summon monster] *****debug.txt*92[? Help] @@ -239,10 +239,6 @@ maximal legal value. [[[[[GCreate object (-)] Allows you to create a new object where you stand. You must specify an object number from k_info.txt. -~~~~~69 -[[[[[GThe path to the god dark (_)] - Do not use this as it is used by DarkGod as a test for Lua - and will CRASH the game. You have been warned. ~~~~~71 [[[[[GGain a fate (+)] Unearth more of your prophecy. @@ -256,9 +252,6 @@ maximal legal value. 3 monster becomes pet 4 monster becomes companion You then point at an enemy and press space. -~~~~~81 -[[[[[GLua script (>)] - Allows you to run a Lua script. ~~~~~91 [[[[[GSummon monster (/)] Summons a random monster next to you. diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt index cdea423b..3cb444f4 100644 --- a/lib/mods/theme/help/debug.txt +++ b/lib/mods/theme/help/debug.txt @@ -53,7 +53,7 @@ will not be scored if you use debug commands. [ (unused) ^M (unused) ] (unused) ^N (unused) *****debug.txt*67[- Create object] ^O (unused) - *****debug.txt*69[_ The path to the god dark] ^P (unused) + ^P (unused) *****debug.txt*71[+ Gain a fate] ^Q (unused) *****debug.txt*73[= Align monster] ^R (unused) ; (unused) ^S (unused) @@ -63,7 +63,7 @@ will not be scored if you use debug commands. , (unused) ^W (unused) < (unused) ^X (unused) . (unused) ^Y (unused) - *****debug.txt*81[> Lua script] ^Z (unused) + ^Z (unused) \ (unused) | (unused) ` (unused) ~ (unused) *****debug.txt*91[/ Summon monster] *****debug.txt*92[? Help] @@ -242,10 +242,6 @@ maximal legal value. [[[[[GCreate object (-)] Allows you to create a new object where you stand. You must specify an object number from k_info.txt. -~~~~~69 -[[[[[GThe path to the god dark (_)] - Do not use this as it is used by DarkGod as a test for Lua - and will CRASH the game. You have been warned. ~~~~~71 [[[[[GGain a fate (+)] Unearth more of your prophecy. @@ -259,9 +255,6 @@ maximal legal value. 3 monster becomes pet 4 monster becomes companion You then point at an enemy and press space. -~~~~~81 -[[[[[GLua script (>)] - Allows you to run a Lua script. ~~~~~91 [[[[[GSummon monster (/)] Summons a random monster next to you. -- cgit v1.2.3 From 145ea9e004c6014c790abb8d7b81f7f1547af3b9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Change flag_set bool conversion to 'explicit' --- src/flag_set.hpp | 12 +++++++++++- src/monster2.cc | 6 +++--- src/spells1.cc | 2 +- src/spells2.cc | 6 +++--- src/spells3.cc | 2 +- tests/flag_set.cc | 4 ++-- 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/flag_set.hpp b/src/flag_set.hpp index aa90a217..490f0daf 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -92,11 +92,21 @@ public: return m_data[i]; } - constexpr operator bool() const + explicit constexpr operator bool() const { return !empty(); } + constexpr bool operator == (flag_set const &other) const + { + return m_data == other.m_data; + } + + constexpr bool operator != (flag_set const &other) const + { + return !(*this == other); + } + constexpr bool bit(std::size_t i) const { assert(i < nbits); diff --git a/src/monster2.cc b/src/monster2.cc index 52b342d4..bf1d3d12 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -2218,9 +2218,9 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) const bool_ good = (r_ptr->flags & RF_DROP_GOOD) ? TRUE : FALSE; const bool_ great = (r_ptr->flags & RF_DROP_GREAT) ? TRUE : FALSE; - const bool_ do_gold = (!(r_ptr->flags & RF_ONLY_ITEM)); - const bool_ do_item = (!(r_ptr->flags & RF_ONLY_GOLD)); - const bool_ do_mimic = (r_ptr->flags & RF_MIMIC); + auto const do_gold = (r_ptr->flags & RF_ONLY_ITEM).empty(); + auto const do_item = (r_ptr->flags & RF_ONLY_GOLD).empty(); + auto const do_mimic = bool(r_ptr->flags & RF_MIMIC); const int force_coin = get_coin_type(r_ptr); diff --git a/src/spells1.cc b/src/spells1.cc index 8e109a77..2b34e98c 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -6622,7 +6622,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) if ((who > 0) && (dam > m_ptr->hp)) dam = m_ptr->hp; } - if (do_pois && (!(r_ptr->flags & RF_IM_POIS)) && (!(r_ptr->flags & SF_BR_POIS)) && hurt_monster(m_ptr)) + if (do_pois && (r_ptr->flags & RF_IM_POIS).empty() && (r_ptr->spells & SF_BR_POIS).empty() && hurt_monster(m_ptr)) { if (m_ptr->poisoned) note = " is more poisoned."; else note = " is poisoned."; diff --git a/src/spells2.cc b/src/spells2.cc index 535b03f2..c08cad97 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -1163,7 +1163,7 @@ void self_knowledge(FILE *fff) /* Not implemented */ if (r_ptr->flags & RF_CAN_FLY) info[i++] = "You can fly."; - if ((r_ptr->flags & RF_MORTAL) == 0) + if ((r_ptr->flags & RF_MORTAL).empty()) info[i++] = "You are immortal."; /* Not implemented */ if (r_ptr->flags & RF_NAZGUL) @@ -2506,7 +2506,7 @@ bool_ detect_monsters_normal(int rad) bool_ detect_monsters_invis(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (r_ptr->flags & RF_INVISIBLE); + return bool(r_ptr->flags & RF_INVISIBLE); }; if (detect_monsters_fn(rad, predicate)) @@ -2529,7 +2529,7 @@ bool_ detect_monsters_invis(int rad) void detect_monsters_orcs(int rad) { auto predicate = [](monster_race *r_ptr) -> bool { - return (r_ptr->flags & RF_ORC); + return bool(r_ptr->flags & RF_ORC); }; if (detect_monsters_fn(rad, predicate)) diff --git a/src/spells3.cc b/src/spells3.cc index 26a15541..b5a767c5 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -2272,7 +2272,7 @@ casting_result melkor_mind_steal() auto const r_ptr = m_ptr->race(); if ((randint(m_ptr->level) < chance) && - ((r_ptr->flags & RF_UNIQUE) == 0)) + ((r_ptr->flags & RF_UNIQUE).empty())) { p_ptr->control = target_who; m_ptr->mflag |= MFLAG_CONTROL; diff --git a/tests/flag_set.cc b/tests/flag_set.cc index 125d8a81..3abd505d 100644 --- a/tests/flag_set.cc +++ b/tests/flag_set.cc @@ -45,7 +45,7 @@ go_bandit([]() { // Setup fs_t fs = fs_t(); // Exercise - bool result = fs; + auto result = bool(fs); // Verify AssertThat(result, Equals(false)); }); @@ -54,7 +54,7 @@ go_bandit([]() { // Setup fs_t fs = fs_t::make(1, 3); // Exercise - bool result = fs; + auto result = bool(fs); // Verify AssertThat(result, Equals(true)); }); -- cgit v1.2.3 From 3db678db7315e6c188a5eb192198385a9971e803 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Fix a bad 'nullptr' check --- src/monster2.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monster2.cc b/src/monster2.cc index bf1d3d12..2ef3cc78 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1189,7 +1189,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { hallu_race = &r_info[randint(max_r_idx - 2)]; } - while ((hallu_race->flags & RF_UNIQUE) && (hallu_race->name != nullptr)); + while ((hallu_race->flags & RF_UNIQUE) && (hallu_race->name == nullptr)); strcpy(silly_name, hallu_race->name); } -- cgit v1.2.3 From 9dd2f09626ad96caae709ce1fb51c7e87ee00d36 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Fix extraneous space in light descriptions --- src/object1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object1.cc b/src/object1.cc index ae803db9..d68775df 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2018,7 +2018,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Hack -- Process Lanterns/Torches */ else if ((o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE)) { - t += fmt::format(" (with {:d} turns of light)", o_ptr->timeout); + t += fmt::format(" (with {:d} turns of light)", o_ptr->timeout); } -- cgit v1.2.3 From d5c980c319fca578d30c888c58b9384bce889ccb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Remove unused is_scroll parameter from random_resistance() --- src/object2.cc | 18 +++++++++--------- src/spells2.cc | 16 ++++++++-------- src/spells2.hpp | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/object2.cc b/src/object2.cc index 8b81efae..d9c0b5f7 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -2133,7 +2133,7 @@ void random_artifact_resistance(object_type * o_ptr) // gets a resistance that it doesn't actually already have. for (int tries = 0; tries < 1000; tries++) { - random_resistance(o_ptr, FALSE, ((randint(22)) + 16)); + random_resistance(o_ptr, randint(22) + 16); // Picked up a new resistance? if (f2 != o_ptr->art_flags2) { @@ -2607,9 +2607,9 @@ static void dragon_resist(object_type * o_ptr) artifact_bias = 0; if (randint(4) == 1) - random_resistance(o_ptr, FALSE, ((randint(14)) + 4)); + random_resistance(o_ptr, randint(14) + 4); else - random_resistance(o_ptr, FALSE, ((randint(22)) + 16)); + random_resistance(o_ptr, randint(22) + 16); } while (randint(2) == 1); } @@ -2858,7 +2858,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) { do { - random_resistance(o_ptr, FALSE, ((randint(20)) + 18)); + random_resistance(o_ptr, randint(20) + 18); } while (randint(4) == 1); @@ -3085,7 +3085,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) case SV_AMULET_RESISTANCE: { - if (randint(3) == 1) random_resistance(o_ptr, FALSE, ((randint(34)) + 4)); + if (randint(3) == 1) random_resistance(o_ptr, randint(34) + 4); if (randint(5) == 1) o_ptr->art_flags2 |= TR2_RES_POIS; } break; @@ -3567,23 +3567,23 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) if (fego & ETR4_R_ELEM) { /* Make an acid/elec/fire/cold/poison resist */ - random_resistance(o_ptr, FALSE, randint(14) + 4); + random_resistance(o_ptr, randint(14) + 4); } if (fego & ETR4_R_LOW) { /* Make an acid/elec/fire/cold resist */ - random_resistance(o_ptr, FALSE, randint(12) + 4); + random_resistance(o_ptr, randint(12) + 4); } if (fego & ETR4_R_HIGH) { /* Make a high resist */ - random_resistance(o_ptr, FALSE, randint(22) + 16); + random_resistance(o_ptr, randint(22) + 16); } if (fego & ETR4_R_ANY) { /* Make any resist */ - random_resistance(o_ptr, FALSE, randint(34) + 4); + random_resistance(o_ptr, randint(34) + 4); } if (fego & ETR4_R_DRAGON) diff --git a/src/spells2.cc b/src/spells2.cc index c08cad97..010bc424 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -2954,7 +2954,7 @@ void curse_artifact(object_type * o_ptr) -void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) +void random_resistance(object_type *o_ptr, int specific) { /* To avoid a number of possible bugs */ if (!specific) @@ -3086,7 +3086,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) { case 1 : if (randint(WEIRD_LUCK) != 1) - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); else { o_ptr->art_flags2 |= TR2_IM_ACID; @@ -3097,7 +3097,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) break; case 2: if (randint(WEIRD_LUCK) != 1) - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); else { o_ptr->art_flags2 |= TR2_IM_ELEC; @@ -3108,7 +3108,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) break; case 3: if (randint(WEIRD_LUCK) != 1) - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); else { o_ptr->art_flags2 |= TR2_IM_COLD; @@ -3119,7 +3119,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) break; case 4: if (randint(WEIRD_LUCK) != 1) - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); else { o_ptr->art_flags2 |= TR2_IM_FIRE; @@ -3236,7 +3236,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR) o_ptr->art_flags3 |= TR3_SH_ELEC; else - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); if (!(artifact_bias)) artifact_bias = BIAS_ELEC; break; @@ -3244,7 +3244,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR) o_ptr->art_flags3 |= TR3_SH_FIRE; else - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); if (!(artifact_bias)) artifact_bias = BIAS_FIRE; break; @@ -3253,7 +3253,7 @@ void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific) o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR) o_ptr->art_flags2 |= TR2_REFLECT; else - random_resistance(o_ptr, is_scroll, specific); + random_resistance(o_ptr, specific); break; } } diff --git a/src/spells2.hpp b/src/spells2.hpp index ae3099da..09d5ea68 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -111,4 +111,4 @@ extern void geomancy_random_wall(int y, int x); extern void geomancy_random_floor(int y, int x, bool_ kill_wall); extern void geomancy_dig(int oy, int ox, int dir, int length); extern void channel_the_elements(int y, int x, int level); -extern void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific); +extern void random_resistance(object_type *o_ptr, int specific); -- cgit v1.2.3 From 101204882990d660e08b48b1e5675b8647db4a4d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Minor cleanups for mimic.cc --- src/mimic.cc | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/mimic.cc b/src/mimic.cc index edf79f4b..55622a41 100644 --- a/src/mimic.cc +++ b/src/mimic.cc @@ -588,11 +588,9 @@ static mimic_form_type mimic_forms[MIMIC_FORMS_MAX] = /* * Is the mimicry form enabled for the current module? */ -static bool_ mimic_form_enabled(mimic_form_type *f) +static bool mimic_form_enabled(mimic_form_type const *f) { - int i; - - for (i = 0; f->modules[i] >= 0; i++) + for (int i = 0; f->modules[i] >= 0; i++) { if (f->modules[i] == game_module_idx) { @@ -618,11 +616,9 @@ static mimic_form_type *get_mimic_form(int mf_idx) */ s16b resolve_mimic_name(cptr name) { - s16b i; - - for (i = 0; i < MIMIC_FORMS_MAX; i++) + for (s16b i = 0; i < MIMIC_FORMS_MAX; i++) { - mimic_form_type *mf_ptr = get_mimic_form(i); + auto const mf_ptr = get_mimic_form(i); if (mimic_form_enabled(mf_ptr) && streq(mf_ptr->name, name)) { return i; @@ -641,13 +637,10 @@ s16b find_random_mimic_shape(byte level, bool_ limit) while (tries > 0) { - int mf_idx = 0; - mimic_form_type *mf_ptr = NULL; - tries = tries - 1; - mf_idx = rand_int(MIMIC_FORMS_MAX); - mf_ptr = get_mimic_form(mf_idx); + int mf_idx = rand_int(MIMIC_FORMS_MAX); + auto const mf_ptr = get_mimic_form(mf_idx); if (mimic_form_enabled(mf_ptr)) { @@ -695,7 +688,7 @@ byte get_mimic_level(s16b mf_idx) */ s32b get_mimic_random_duration(s16b mf_idx) { - mimic_form_type *mf_ptr = get_mimic_form(mf_idx); + auto const mf_ptr = get_mimic_form(mf_idx); return rand_range(mf_ptr->duration.min, mf_ptr->duration.max); } @@ -704,7 +697,7 @@ s32b get_mimic_random_duration(s16b mf_idx) */ byte calc_mimic() { - mimic_form_type *mf_ptr = get_mimic_form(p_ptr->mimic_form); + auto const mf_ptr = get_mimic_form(p_ptr->mimic_form); if (mf_ptr->calc != NULL) { return mf_ptr->calc(); -- cgit v1.2.3 From fb4c38851b5c91b561714400bbf3335833c42598 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Comment fix for rand_int() --- src/z-rand.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/z-rand.hpp b/src/z-rand.hpp index f2e3ce5c..bbf14584 100644 --- a/src/z-rand.hpp +++ b/src/z-rand.hpp @@ -40,7 +40,7 @@ s32b maxroll(s16b num, s16b sides); bool magik(s32b p); /* - * Generates a random long integer X where O<=X Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Shorten a bit of text --- src/cmd1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index cff05246..b69d3602 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -1857,7 +1857,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) if (!(r_ptr->flags & RF_UNIQUE) && (randint(plev) > m_ptr->level) && m_ptr->mspeed > 60) { - msg_format("%^s starts limping slower.", m_name); + msg_format("%^s starts limping.", m_name); m_ptr->mspeed -= 10; } } -- cgit v1.2.3 From 43d7c01d6d76706a55e852055f09f0301408ce5d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Mon, 20 Jun 2016 22:49:05 +0200 Subject: Clean up "quick start" prompt --- src/birth.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 76d032f9..6ce86c5a 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1517,14 +1517,10 @@ static bool_ player_birth_aux_ask() if (previous_char.quick_ok) { - /* Extra info */ - Term_putstr(1, 15, -1, TERM_WHITE, - "Do you want to use the quick start function(same character as your last one)."); - /* Choose */ while (1) { - put_str("Use quick start (y/n)?", 20, 2); + put_str("Use same character as last time (y/n)? ", 20, 2); c = inkey(); if (c == 'Q') quit(NULL); else if (c == 'S') return (FALSE); -- cgit v1.2.3 From 117c211cf7ca94914eef75aa1c1912cd5d6de2ec Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 06:05:58 +0200 Subject: Fix bug in flag_set '==' operator --- src/flag_set.hpp | 9 ++++++++- tests/flag_set.cc | 10 ++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/flag_set.hpp b/src/flag_set.hpp index 490f0daf..737513d5 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -99,7 +99,14 @@ public: constexpr bool operator == (flag_set const &other) const { - return m_data == other.m_data; + for (std::size_t i = 0; i < tiers; i++) + { + if (m_data[i] != other.m_data[i]) + { + return false; + } + } + return true; } constexpr bool operator != (flag_set const &other) const diff --git a/tests/flag_set.cc b/tests/flag_set.cc index 3abd505d..05418a05 100644 --- a/tests/flag_set.cc +++ b/tests/flag_set.cc @@ -59,6 +59,16 @@ go_bandit([]() { AssertThat(result, Equals(true)); }); + it("== operator should compare equals as equals", [&] { + // Setup + fs_t fs1 = fs_t::make(1, 3); + fs_t fs2 = fs_t::make(1, 3); + // Exercise + auto result = (fs1 == fs2); + // Verify + AssertThat(result, Equals(true)); + }); + it("| operator should respect the tier and index", [&] { // Setup fs_t fs1 = fs_t::make(0, 31); -- cgit v1.2.3 From ad2388b043f6ff47a8f50b1f7627d2d7e8a24345 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 12 Jun 2016 18:48:29 +0200 Subject: Fix dimensions of "prison" vault --- lib/edit/v_info.txt | 2 +- lib/mods/theme/edit/v_info.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/edit/v_info.txt b/lib/edit/v_info.txt index 964f2b54..d5a92ee2 100644 --- a/lib/edit/v_info.txt +++ b/lib/edit/v_info.txt @@ -228,7 +228,7 @@ D:%........XXXXXXXXXXX.% D:%%%%%%%%%%%%%%%%%%%%%% N:12:Lesser vault (prison) -X:7:10:16:35 +X:7:10:15:35 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.+..&..+..&..+..&..+..&..+..&..+.% D:%.###.#####.#####.#####.#####.###.% diff --git a/lib/mods/theme/edit/v_info.txt b/lib/mods/theme/edit/v_info.txt index 964f2b54..d5a92ee2 100644 --- a/lib/mods/theme/edit/v_info.txt +++ b/lib/mods/theme/edit/v_info.txt @@ -228,7 +228,7 @@ D:%........XXXXXXXXXXX.% D:%%%%%%%%%%%%%%%%%%%%%% N:12:Lesser vault (prison) -X:7:10:16:35 +X:7:10:15:35 D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% D:%.+..&..+..&..+..&..+..&..+..&..+.% D:%.###.#####.#####.#####.#####.###.% -- cgit v1.2.3 From fd6403dfe2219fefa60246b2f4744be116e01180 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Remove misleading comment --- src/monster2.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/monster2.cc b/src/monster2.cc index 2ef3cc78..b1419b0a 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -709,8 +709,6 @@ void wipe_m_list(void) /* Skip dead monsters */ if (!m_ptr->r_idx) continue; - /* Mega-Hack -- preserve Unique's XXX XXX XXX */ - /* Hack -- Reduce the racial counter */ auto r_ptr = m_ptr->race(); r_ptr->cur_num--; -- cgit v1.2.3 From b9e4f471c2e23283945ba9324912c7e29dd8fbd8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Fix a debug-mode prompt --- src/wizard2.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wizard2.cc b/src/wizard2.cc index eb3b375c..8685f242 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -158,7 +158,7 @@ static void wiz_create_named_art() object_type forge; object_type *q_ptr; int i, a_idx; - cptr p = "Number of the artifact :"; + cptr p = "Number of the artifact: "; char out_val[80] = ""; artifact_type *a_ptr; -- cgit v1.2.3 From 073ad3584fbf781ce10bef61ad4ff38850282f47 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Rework TR{1,2,3,4,5}_* flags to flag_set<> --- src/CMakeLists.txt | 1 + src/artifact_type.hpp | 17 +- src/bldg.cc | 64 ++-- src/cave.cc | 10 +- src/cmd1.cc | 70 ++-- src/cmd2.cc | 6 +- src/cmd3.cc | 62 +--- src/cmd4.cc | 18 +- src/cmd5.cc | 25 +- src/cmd6.cc | 61 ++- src/cmd7.cc | 3 +- src/corrupt.cc | 17 +- src/defines.h | 219 ----------- src/dungeon.cc | 70 ++-- src/ego_item_type.hpp | 43 +-- src/files.cc | 926 ++++++++++++++++++++++++---------------------- src/files.hpp | 3 +- src/flag_set.hpp | 8 + src/flags_group.hpp | 7 +- src/generate.cc | 3 +- src/help.cc | 6 +- src/init1.cc | 634 +++++-------------------------- src/init2.cc | 9 +- src/loadsave.cc | 30 +- src/melee2.cc | 62 ++-- src/mimic.cc | 135 +++---- src/monoid.hpp | 37 ++ src/monster2.cc | 36 +- src/object1.cc | 871 +++++++++++++++++++++---------------------- src/object1.hpp | 8 +- src/object2.cc | 698 +++++++++++++++++----------------- src/object_filter.cc | 29 +- src/object_filter.hpp | 15 +- src/object_flag.hpp | 12 + src/object_flag_list.hpp | 196 ++++++++++ src/object_flag_meta.cc | 59 +++ src/object_flag_meta.hpp | 75 ++++ src/object_flag_set.hpp | 7 + src/object_kind.hpp | 16 +- src/object_type.hpp | 16 +- src/player_class.hpp | 8 +- src/player_race.hpp | 8 +- src/player_race_mod.hpp | 8 +- src/player_type.hpp | 13 +- src/q_fireprof.cc | 3 +- src/q_rand.cc | 3 +- src/q_ultrag.cc | 7 +- src/q_wight.cc | 24 +- src/randart.cc | 42 +-- src/randart_part_type.hpp | 58 ++- src/set_component.hpp | 14 +- src/spells1.cc | 53 ++- src/spells2.cc | 328 ++++++++-------- src/squelch/rule.cc | 7 +- src/store.cc | 43 +-- src/tables.cc | 86 ++--- src/traps.cc | 67 ++-- src/wizard2.cc | 85 ++--- src/xtra1.cc | 268 +++++++------- src/xtra1.hpp | 3 +- src/xtra2.cc | 54 +-- tests/flag_set.cc | 15 + 62 files changed, 2617 insertions(+), 3164 deletions(-) create mode 100644 src/monoid.hpp create mode 100644 src/object_flag.hpp create mode 100644 src/object_flag_list.hpp create mode 100644 src/object_flag_meta.cc create mode 100644 src/object_flag_meta.hpp create mode 100644 src/object_flag_set.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d0e34707..e3dd63fb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -54,6 +54,7 @@ SET(SRCS_COMMON object1.cc object2.cc object_filter.cc + object_flag_meta.cc options.cc powers.cc q_betwen.cc diff --git a/src/artifact_type.hpp b/src/artifact_type.hpp index ea962bc2..8ff53433 100644 --- a/src/artifact_type.hpp +++ b/src/artifact_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" /** * Artifact descriptor. @@ -34,17 +35,8 @@ struct artifact_type s32b cost = 0; /* Artifact "cost" */ - u32b flags1 = 0; /* Artifact Flags, set 1 */ - u32b flags2 = 0; /* Artifact Flags, set 2 */ - u32b flags3 = 0; /* Artifact Flags, set 3 */ - u32b flags4 = 0; /* Artifact Flags, set 4 */ - u32b flags5 = 0; /* Artifact Flags, set 5 */ - - u32b oflags1 = 0; /* Obvious Flags, set 1 */ - u32b oflags2 = 0; /* Obvious Flags, set 2 */ - u32b oflags3 = 0; /* Obvious Flags, set 3 */ - u32b oflags4 = 0; /* Obvious Flags, set 4 */ - u32b oflags5 = 0; /* Obvious Flags, set 5 */ + object_flag_set flags; /* Artifact Flags */ + object_flag_set oflags; /* Obvious Flags */ byte level = 0; /* Artifact level */ byte rarity = 0; /* Artifact rarity */ @@ -52,9 +44,6 @@ struct artifact_type byte cur_num = 0; /* Number created (0 or 1) */ byte max_num = 0; /* Unused (should be "1") */ - u32b esp = 0; /* ESP flags */ - u32b oesp = 0; /* ESP flags */ - s16b power = 0; /* Power granted, if any */ s16b set = 0; /* Which set does it belong it, if any? */ diff --git a/src/bldg.cc b/src/bldg.cc index db76b92a..4f1747db 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -23,6 +23,7 @@ #include "mimic.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "owner_type.hpp" #include "player_type.hpp" #include "q_library.hpp" @@ -770,7 +771,7 @@ static void town_history(void) /* * compare_weapon_aux2 -KMW- */ -static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, int mult, const char *attr, u32b f1, u32b f2, u32b f3, byte color) +static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, int mult, const char *attr, byte color) { char tmp_str[80]; @@ -788,80 +789,77 @@ static void compare_weapon_aux2(object_type *o_ptr, int numblows, int r, int c, */ static void compare_weapon_aux1(object_type *o_ptr, int col, int r) { - u32b f1, f2, f3, f4, f5, esp; + auto const f = object_flags(o_ptr); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - - if (f1 & (TR1_SLAY_ANIMAL)) + if (f & TR_SLAY_ANIMAL) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Animals:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_EVIL)) + if (f & TR_SLAY_EVIL) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 2, "Evil:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_UNDEAD)) + if (f & TR_SLAY_UNDEAD) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Undead:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_DEMON)) + if (f & TR_SLAY_DEMON) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Demons:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_ORC)) + if (f & TR_SLAY_ORC) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Orcs:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_TROLL)) + if (f & TR_SLAY_TROLL) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Trolls:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_GIANT)) + if (f & TR_SLAY_GIANT) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Giants:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_SLAY_DRAGON)) + if (f & TR_SLAY_DRAGON) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Dragons:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_KILL_DRAGON)) + if (f & TR_KILL_DRAGON) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 5, "Dragons:", - f1, f2, f3, TERM_YELLOW); + TERM_YELLOW); } - if (f1 & (TR1_BRAND_ACID)) + if (f & TR_BRAND_ACID) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Acid:", - f1, f2, f3, TERM_RED); + TERM_RED); } - if (f1 & (TR1_BRAND_ELEC)) + if (f & TR_BRAND_ELEC) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Elec:", - f1, f2, f3, TERM_RED); + TERM_RED); } - if (f1 & (TR1_BRAND_FIRE)) + if (f & TR_BRAND_FIRE) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Fire:", - f1, f2, f3, TERM_RED); + TERM_RED); } - if (f1 & (TR1_BRAND_COLD)) + if (f & TR_BRAND_COLD) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Cold:", - f1, f2, f3, TERM_RED); + TERM_RED); } - if (f1 & (TR1_BRAND_POIS)) + if (f & TR_BRAND_POIS) { compare_weapon_aux2(o_ptr, p_ptr->num_blow, r++, col, 3, "Poison:", - f1, f2, f3, TERM_RED); + TERM_RED); } } diff --git a/src/cave.cc b/src/cave.cc index 48aa7740..97f022c1 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -10,6 +10,7 @@ #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" @@ -1090,7 +1091,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *ap = object_attr(o_ptr); /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI)) + if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } @@ -1127,7 +1128,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *ap = object_attr(o_ptr); /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI)) + if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } @@ -1519,8 +1520,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) *ap = object_attr_default(o_ptr); /* Multi-hued attr */ - if (!avoid_other && - (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI)) + if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } @@ -1557,7 +1557,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) *ap = object_attr_default(o_ptr); /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags5 & TR5_ATTR_MULTI)) + if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } diff --git a/src/cmd1.cc b/src/cmd1.cc index b69d3602..bb0aa5f3 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -28,6 +28,7 @@ #include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" #include "monster_type.hpp" +#include "object_flag.hpp" #include "object1.hpp" #include "object2.hpp" #include "options.hpp" @@ -241,11 +242,8 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, auto const r_ptr = m_ptr->race(); - u32b f1, f2, f3, f4, f5, esp; - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const f = object_flags(o_ptr); /* Some "weapons" and "ammo" do extra damage */ switch (o_ptr->tval) @@ -261,75 +259,75 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, case TV_DIGGING: { /* Slay Animal */ - if ((f1 & (TR1_SLAY_ANIMAL)) && (r_ptr->flags & RF_ANIMAL)) + if ((f & TR_SLAY_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) { if (mult < 2) mult = 2; } /* Slay Evil */ - if ((f1 & (TR1_SLAY_EVIL)) && (r_ptr->flags & RF_EVIL)) + if ((f & TR_SLAY_EVIL) && (r_ptr->flags & RF_EVIL)) { if (mult < 2) mult = 2; } /* Slay Undead */ - if ((f1 & (TR1_SLAY_UNDEAD)) && (r_ptr->flags & RF_UNDEAD)) + if ((f & TR_SLAY_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) { if (mult < 3) mult = 3; } /* Slay Demon */ - if ((f1 & (TR1_SLAY_DEMON)) && (r_ptr->flags & RF_DEMON)) + if ((f & TR_SLAY_DEMON) && (r_ptr->flags & RF_DEMON)) { if (mult < 3) mult = 3; } /* Slay Orc */ - if ((f1 & (TR1_SLAY_ORC)) && (r_ptr->flags & RF_ORC)) + if ((f & TR_SLAY_ORC) && (r_ptr->flags & RF_ORC)) { if (mult < 3) mult = 3; } /* Slay Troll */ - if ((f1 & (TR1_SLAY_TROLL)) && (r_ptr->flags & RF_TROLL)) + if ((f & TR_SLAY_TROLL) && (r_ptr->flags & RF_TROLL)) { if (mult < 3) mult = 3; } /* Slay Giant */ - if ((f1 & (TR1_SLAY_GIANT)) && (r_ptr->flags & RF_GIANT)) + if ((f & TR_SLAY_GIANT) && (r_ptr->flags & RF_GIANT)) { if (mult < 3) mult = 3; } /* Slay Dragon */ - if ((f1 & (TR1_SLAY_DRAGON)) && (r_ptr->flags & RF_DRAGON)) + if ((f & TR_SLAY_DRAGON) && (r_ptr->flags & RF_DRAGON)) { if (mult < 3) mult = 3; } /* Execute Dragon */ - if ((f1 & (TR1_KILL_DRAGON)) && (r_ptr->flags & RF_DRAGON)) + if ((f & TR_KILL_DRAGON) && (r_ptr->flags & RF_DRAGON)) { if (mult < 5) mult = 5; } /* Execute Undead */ - if ((f5 & (TR5_KILL_UNDEAD)) && (r_ptr->flags & RF_UNDEAD)) + if ((f & TR_KILL_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) { if (mult < 5) mult = 5; } /* Execute Demon */ - if ((f5 & (TR5_KILL_DEMON)) && (r_ptr->flags & RF_DEMON)) + if ((f & TR_KILL_DEMON) && (r_ptr->flags & RF_DEMON)) { if (mult < 5) mult = 5; } /* Brand (Acid) */ - if (f1 & (TR1_BRAND_ACID)) + if (f & TR_BRAND_ACID) { if (r_ptr->flags & RF_IM_ACID) { @@ -346,7 +344,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } /* Brand (Elec) */ - if (f1 & (TR1_BRAND_ELEC)) + if (f & TR_BRAND_ELEC) { if (r_ptr->flags & RF_IM_ELEC) { @@ -363,7 +361,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } /* Brand (Fire) */ - if (f1 & (TR1_BRAND_FIRE)) + if (f & TR_BRAND_FIRE) { if (r_ptr->flags & RF_IM_FIRE) { @@ -380,7 +378,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } /* Brand (Cold) */ - if (f1 & (TR1_BRAND_COLD)) + if (f & TR_BRAND_COLD) { if (r_ptr->flags & RF_IM_COLD) { @@ -397,7 +395,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } /* Brand (Poison) */ - if (f1 & (TR1_BRAND_POIS) || (p_ptr->tim_poison)) + if ((f & TR_BRAND_POIS) || (p_ptr->tim_poison)) { if (r_ptr->flags & RF_IM_POIS) { @@ -416,7 +414,7 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } /* Wounding */ - if (f5 & (TR5_WOUNDING)) + if (f & TR_WOUNDING) { if (r_ptr->flags & RF_NO_CUT) { @@ -1883,21 +1881,22 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) static void do_nazgul(int *k, int *num, int num_blow, int weap, std::shared_ptr r_ptr, object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - - bool_ mundane; bool_ allow_shatter = TRUE; /* Extract mundane-ness of the current weapon */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const f = object_flags(o_ptr); /* It should be Slay Evil, Slay Undead, or *Slay Undead* */ - mundane = !(f1 & TR1_SLAY_EVIL) && !(f1 & TR1_SLAY_UNDEAD) && - !(f5 & TR5_KILL_UNDEAD); + bool_ const mundane = + !(f & TR_SLAY_EVIL) && + !(f & TR_SLAY_UNDEAD) && + !(f & TR_KILL_UNDEAD); /* Some blades can resist shattering */ - if (f5 & TR5_RES_MORGUL) + if (f & TR_RES_MORGUL) + { allow_shatter = FALSE; + } /* Mega Hack -- Hitting Nazgul is REALY dangerous (ideas from Akhronath) */ if (r_ptr->flags & RF_NAZGUL) @@ -2007,9 +2006,6 @@ void py_attack(int y, int x, int max_blow) int drain_left = MAX_VAMPIRIC_DRAIN; - /* A massive hack -- life-draining weapons */ - u32b f1, f2, f3, f4, f5, esp; - int weap; /* Disturb the player */ @@ -2128,9 +2124,9 @@ void py_attack(int y, int x, int max_blow) bonus = p_ptr->to_h + p_ptr->to_h_melee + o_ptr->to_h; chance = p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (!(f4 & TR4_NEVER_BLOW)) + if (!(flags & TR_NEVER_BLOW)) { int num_blow = p_ptr->num_blow; @@ -2151,7 +2147,7 @@ void py_attack(int y, int x, int max_blow) k = 1; /* Select a chaotic effect (50% chance) */ - if ((f1 & TR1_CHAOTIC) && (rand_int(2) == 0)) + if ((flags & TR_CHAOTIC) && (rand_int(2) == 0)) { if (randint(5) < 3) { @@ -2181,7 +2177,7 @@ void py_attack(int y, int x, int max_blow) } /* Vampiric drain */ - if ((f1 & TR1_VAMPIRIC) || (chaos_effect == 1)) + if ((flags & TR_VAMPIRIC) || (chaos_effect == 1)) { if (! ((r_ptr->flags & RF_UNDEAD) || @@ -2191,7 +2187,7 @@ void py_attack(int y, int x, int max_blow) drain_result = 0; } - if (f1 & TR1_VORPAL && (randint(6) == 1)) + if ((flags & TR_VORPAL) && (randint(6) == 1)) vorpal_cut = TRUE; else vorpal_cut = FALSE; @@ -2308,7 +2304,7 @@ void py_attack(int y, int x, int max_blow) } /* May it clone the monster ? */ - if ((f4 & TR4_CLONE) && magik(30)) + if ((flags & TR_CLONE) && magik(30)) { msg_format("Oh no! Your weapon clones %^s!", m_name); diff --git a/src/cmd2.cc b/src/cmd2.cc index 5bd508b2..c57518bb 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -31,6 +31,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" @@ -3594,11 +3595,10 @@ void do_cmd_throw(void) /* Access the item */ object_type *o_ptr = get_object(item); - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack - Cannot throw away 'no drop' cursed items */ - if (cursed_p(o_ptr) && (f4 & TR4_CURSE_NO_DROP)) + if (cursed_p(o_ptr) && (flags & TR_CURSE_NO_DROP)) { /* Oops */ msg_print("Hmmm, you seem to be unable to throw it."); diff --git a/src/cmd3.cc b/src/cmd3.cc index 473f5c0d..4d9c0bcf 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -21,6 +21,7 @@ #include "monster_race_flag.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -161,28 +162,18 @@ void do_cmd_equip(void) */ static bool item_tester_hook_wear(object_type const *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; int slot = wield_slot(o_ptr); - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - /* Only one ultimate at a time */ - if (f4 & TR4_ULTIMATE) + if (object_flags(o_ptr) & TR_ULTIMATE) { - int i; - - for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) + for (int i = INVEN_WIELD; i < INVEN_TOTAL; i++) { object_type *q_ptr = &p_ptr->inventory[i]; - /* Extract the flags */ - object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (!q_ptr->k_idx) continue; - if (f4 & TR4_ULTIMATE) return (FALSE); + if (object_flags(q_ptr) & TR_ULTIMATE) return (FALSE); } } @@ -227,9 +218,6 @@ void do_cmd_wield(void) char o_name[80]; - u32b f1, f2, f3, f4, f5, esp; - - /* Get an item */ if (!get_item(&item, "Wear/Wield which item? ", @@ -283,11 +271,11 @@ void do_cmd_wield(void) } /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Two handed weapons can't be wielded with a shield */ if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) && - (f4 & TR4_MUST2H) && + (flags & TR_MUST2H) && (p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0)) { object_desc(o_name, o_ptr, FALSE, 0); @@ -300,10 +288,10 @@ void do_cmd_wield(void) i_ptr = &p_ptr->inventory[slot - INVEN_ARM + INVEN_WIELD]; /* Extract the flags */ - object_flags(i_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const i_flags = object_flags(i_ptr); /* Prevent shield from being put on if wielding 2H */ - if ((f4 & TR4_MUST2H) && (i_ptr->k_idx) && + if ((i_flags & TR_MUST2H) && (i_ptr->k_idx) && (p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM)) { object_desc(o_name, o_ptr, FALSE, 0); @@ -312,7 +300,7 @@ void do_cmd_wield(void) } if ((p_ptr->body_parts[slot - INVEN_WIELD] == INVEN_ARM) && - (f4 & TR4_COULD2H)) + (i_flags & TR_COULD2H)) { if (!get_check("Are you sure you want to restrict your fighting? ")) { @@ -321,13 +309,9 @@ void do_cmd_wield(void) } } - - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if ((is_slot_ok(slot - INVEN_WIELD + INVEN_ARM)) && (p_ptr->inventory[slot - INVEN_WIELD + INVEN_ARM].k_idx != 0) && - (f4 & TR4_COULD2H)) + (flags & TR_COULD2H)) { if (!get_check("Are you sure you want to use this weapon with a shield?")) { @@ -519,8 +503,7 @@ void do_cmd_drop(void) /* Get the item */ object_type *o_ptr = get_object(item); - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Can we drop */ struct hook_drop_in in = { item }; @@ -539,7 +522,7 @@ void do_cmd_drop(void) } else { - if (f4 & TR4_CURSE_NO_DROP) + if (flags & TR_CURSE_NO_DROP) { /* Oops */ msg_print("Hmmm, you seem to be unable to drop it."); @@ -628,10 +611,8 @@ void do_cmd_destroy(void) /* Take no time, just like the automatizer */ energy_use = 0; - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if ((f4 & TR4_CURSE_NO_DROP) && cursed_p(o_ptr)) + auto const flags = object_flags(o_ptr); + if ((flags & TR_CURSE_NO_DROP) && cursed_p(o_ptr)) { /* Oops */ msg_print("Hmmm, you seem to be unable to destroy it."); @@ -691,8 +672,10 @@ void do_cmd_destroy(void) } /* Eru wont be happy */ - if (f3 & TR3_BLESSED) + if (flags & TR_BLESSED) + { inc_piety(GOD_ERU, -10 * k_info[o_ptr->k_idx].level); + } /* Eliminate the item */ inc_stack_size(item, -amt); @@ -958,13 +941,8 @@ static void do_cmd_refill_torch(void) */ void do_cmd_refill(void) { - object_type *o_ptr; - - u32b f1, f2, f3, f4, f5, esp; - - /* Get the light */ - o_ptr = &p_ptr->inventory[INVEN_LITE]; + auto o_ptr = &p_ptr->inventory[INVEN_LITE]; /* It is nothing */ if (o_ptr->tval != TV_LITE) @@ -973,9 +951,9 @@ void do_cmd_refill(void) return; } - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (f4 & TR4_FUEL_LITE) + if (flags & TR_FUEL_LITE) { /* It's a torch */ if (o_ptr->sval == SV_LITE_TORCH || diff --git a/src/cmd4.cc b/src/cmd4.cc index 45ee0363..b8a92ddd 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -25,6 +25,7 @@ #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "player_type.hpp" #include "skills.hpp" @@ -3046,7 +3047,7 @@ void do_cmd_knowledge_artifacts(void) okayk[k] = FALSE; /* Skip "empty" artifacts */ - if (!(k_ptr->flags3 & TR3_NORM_ART)) continue; + if (!(k_ptr->flags & TR_NORM_ART)) continue; /* Skip "uncreated" artifacts */ if (!k_ptr->artifact) continue; @@ -3078,7 +3079,7 @@ void do_cmd_knowledge_artifacts(void) if (object_known_p(o_ptr)) continue; /* Note the artifact */ - if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { okayk[o_ptr->k_idx] = FALSE; } @@ -3111,7 +3112,7 @@ void do_cmd_knowledge_artifacts(void) if (object_known_p(o_ptr)) continue; /* Note the artifact */ - if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { okayk[o_ptr->k_idx] = FALSE; } @@ -3140,7 +3141,7 @@ void do_cmd_knowledge_artifacts(void) if (object_known_p(o_ptr)) continue; /* Note the artifact */ - if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { okayk[o_ptr->k_idx] = FALSE; } @@ -3172,7 +3173,6 @@ void do_cmd_knowledge_artifacts(void) { object_type forge; object_type *q_ptr; - u32b f1, f2, f3, f4, f5, esp; /* Get local object */ q_ptr = &forge; @@ -3184,9 +3184,11 @@ void do_cmd_knowledge_artifacts(void) q_ptr->name1 = k; /* Spell in it ? no ! */ - 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; + } /* Describe the artifact */ object_desc_store(base_name, q_ptr, FALSE, 0); @@ -3589,7 +3591,7 @@ static void do_cmd_knowledge_objects(void) object_kind *k_ptr = &k_info[k]; /* Hack -- skip artifacts */ - if (k_ptr->flags3 & (TR3_INSTA_ART)) continue; + if (k_ptr->flags & (TR_INSTA_ART)) continue; /* List known flavored objects */ if (k_ptr->flavor && k_ptr->aware) diff --git a/src/cmd5.cc b/src/cmd5.cc index 29651cf2..5850f3ce 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -20,6 +20,7 @@ #include "monster_spell_flag.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -72,7 +73,7 @@ static object_filter_t const &hook_school_spellable() static auto instance = Or( is_school_book(), And( - HasFlag5(TR5_SPELL_CONTAIN), + HasFlags(TR_SPELL_CONTAIN), has_pval2)); return instance; } @@ -226,14 +227,13 @@ static void browse_school_spell(int book, int spell_idx, object_type *o_ptr) extern void do_cmd_browse_aux(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); if (is_school_book()(o_ptr)) { browse_school_spell(o_ptr->sval, o_ptr->pval, o_ptr); } - else if (f5 & TR5_SPELL_CONTAIN && o_ptr->pval2 != -1) + else if ((flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 != -1)) { browse_school_spell(255, o_ptr->pval2, o_ptr); } @@ -1867,11 +1867,10 @@ boost::optional get_item_hook_find_spell(object_filter_t const &) object_type *o_ptr = &p_ptr->inventory[i]; /* Extract object flags */ - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Must we wield it to cast from it? */ - if ((wield_slot(o_ptr) != -1) && (i < INVEN_WIELD) && (f5 & TR5_WIELD_CAST)) + if ((wield_slot(o_ptr) != -1) && (i < INVEN_WIELD) && (flags & TR_WIELD_CAST)) { continue; } @@ -1880,7 +1879,7 @@ boost::optional get_item_hook_find_spell(object_filter_t const &) if (!is_school_book()(o_ptr)) { /* Does it contain the appropriate spell? */ - if ((f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 == spell)) + if ((flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 == spell)) { hack_force_spell = spell; hack_force_spell_pval = o_ptr->pval; @@ -1940,7 +1939,6 @@ s32b get_school_spell(cptr do_what, s16b force_book) object_type *o_ptr, forge; int tmp; int sval, pval; - u32b f1, f2, f3, f4, f5, esp; hack_force_spell = -1; hack_force_spell_pval = -1; @@ -1966,10 +1964,10 @@ s32b get_school_spell(cptr do_what, s16b force_book) /* Get the item */ o_ptr = get_object(item); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const f = object_flags(o_ptr); /* If it can be wielded, it must */ - if ((wield_slot(o_ptr) != -1) && (item < INVEN_WIELD) && (f5 & TR5_WIELD_CAST)) + if ((wield_slot(o_ptr) != -1) && (item < INVEN_WIELD) && (f & TR_WIELD_CAST)) { msg_format("You cannot %s from that object; it must be wielded first.", do_what); return -1; @@ -2157,10 +2155,9 @@ void cast_school_spell() /* Can it contains a schooled spell ? */ static bool hook_school_can_spellable(object_type const *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const f = object_flags(o_ptr); - return ((f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 == -1)); + return ((f & TR_SPELL_CONTAIN) && (o_ptr->pval2 == -1)); } /* diff --git a/src/cmd6.cc b/src/cmd6.cc index b34efeb3..0c0fb63d 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -30,6 +30,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -2767,10 +2768,7 @@ bool_ curse_armor(void) o_ptr->ac = 0; o_ptr->dd = 0; o_ptr->ds = 0; - o_ptr->art_flags1 = 0; - o_ptr->art_flags2 = 0; - o_ptr->art_flags3 = 0; - o_ptr->art_flags4 = 0; + o_ptr->art_flags = object_flag_set(); /* Curse it */ o_ptr->ident |= (IDENT_CURSED); @@ -2832,10 +2830,7 @@ bool_ curse_weapon(void) o_ptr->ac = 0; o_ptr->dd = 0; o_ptr->ds = 0; - o_ptr->art_flags1 = 0; - o_ptr->art_flags2 = 0; - o_ptr->art_flags3 = 0; - o_ptr->art_flags4 = 0; + o_ptr->art_flags = object_flag_set(); /* Curse it */ @@ -3701,8 +3696,6 @@ void do_cmd_use_staff(void) { bool_ obvious, use_charge; - u32b f1, f2, f3, f4, f5, esp; - /* No magic */ if (p_ptr->antimagic) { @@ -3749,10 +3742,10 @@ void do_cmd_use_staff(void) unset_stick_mode(); /* Extract object flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Is it simple to use ? */ - if (f4 & TR4_EASY_USE) + if (flags & TR_EASY_USE) { chance /= 3; } @@ -3878,9 +3871,6 @@ void do_cmd_aim_wand(void) { bool_ obvious, use_charge; - u32b f1, f2, f3, f4, f5, esp; - - /* No magic */ if (p_ptr->antimagic) { @@ -3927,10 +3917,10 @@ void do_cmd_aim_wand(void) unset_stick_mode(); /* Extract object flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Is it simple to use ? */ - if (f4 & TR4_EASY_USE) + if (flags & TR_EASY_USE) { chance /= 3; } @@ -4041,12 +4031,6 @@ static bool item_tester_hook_attachable(object_type const *o_ptr) */ void zap_combine_rod_tip(object_type *q_ptr, int tip_item) { - int item; - - u32b f1, f2, f3, f4, f5, esp; - s32b cost; - - /* No magic */ if (p_ptr->antimagic) { @@ -4055,6 +4039,7 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item) } /* Get an item */ + int item; if (!get_item(&item, "Attach the rod tip with which rod? ", "You have no rod to attach to.", @@ -4068,12 +4053,11 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item) object_type *o_ptr = get_object(item); /* Examine the rod */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Calculate rod tip's mana cost */ - cost = q_ptr->pval; - - if (f4 & TR4_CHEAPNESS) + s32b cost = q_ptr->pval; + if (flags & TR_CHEAPNESS) { cost /= 2; } @@ -4109,8 +4093,6 @@ void do_cmd_zap_rod(void) object_kind *tip_ptr; - u32b f1, f2, f3, f4, f5, esp; - /* Hack -- let perception get aborted */ bool_ use_charge = TRUE; @@ -4191,9 +4173,12 @@ void do_cmd_zap_rod(void) energy_use = 100; /* Examine the rod */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (f4 & TR4_FAST_CAST) energy_use /= 2; + if (flags & TR_FAST_CAST) + { + energy_use /= 2; + } /* Not identified yet */ ident = FALSE; @@ -4217,7 +4202,7 @@ void do_cmd_zap_rod(void) } /* Is it simple to use ? */ - if (f4 & TR4_EASY_USE) + if (flags & TR_EASY_USE) { chance *= 10; } @@ -4246,7 +4231,7 @@ void do_cmd_zap_rod(void) cost = tip_ptr->pval; /* "Cheapness" ego halven the cost */ - if (f4 & TR4_CHEAPNESS) cost = cost / 2; + if (flags & TR_CHEAPNESS) cost = cost / 2; /* A single rod is still charging */ if (o_ptr->timeout < cost) @@ -4565,7 +4550,7 @@ static object_filter_t const &item_tester_hook_activate() using namespace object_filter; static auto instance = And( IsKnown(), - HasFlag3(TR3_ACTIVATE)); + HasFlags(TR_ACTIVATE)); return instance; } @@ -4878,8 +4863,6 @@ void do_cmd_activate(void) char ch, spell_choice; - u32b f1, f2, f3, f4, f5, esp; - /* Get an item */ command_wrk = USE_EQUIP; if (!get_item(&item, @@ -4895,10 +4878,10 @@ void do_cmd_activate(void) object_type *o_ptr = get_object(item); /* Extract object flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Wearable items have to be worn */ - if (!(f5 & TR5_ACTIVATE_NO_WIELD)) + if (!(flags & TR_ACTIVATE_NO_WIELD)) { if (item < INVEN_WIELD) { @@ -4941,7 +4924,7 @@ void do_cmd_activate(void) } /* Is it simple to use ? */ - if (f4 & TR4_EASY_USE) + if (flags & TR_EASY_USE) { chance *= 10; } diff --git a/src/cmd7.cc b/src/cmd7.cc index 1d6718a9..42f82ea3 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -24,6 +24,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" @@ -2311,7 +2312,7 @@ void do_cmd_necromancer(void) object_prep(o_ptr, k_idx); apply_magic(o_ptr, plev * 2, TRUE, TRUE, TRUE); - o_ptr->art_flags5 |= TR5_TEMPORARY; + o_ptr->art_flags |= TR_TEMPORARY; o_ptr->timeout = dur; /* These objects are "storebought" */ diff --git a/src/corrupt.cc b/src/corrupt.cc index 47d79d53..8d5670c6 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -1,6 +1,7 @@ #include "corrupt.hpp" #include "init1.hpp" +#include "object_flag.hpp" #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" @@ -105,14 +106,14 @@ static void player_gain_vampire() /* Bonus/and .. not bonus :) */ rmp_ptr->flags1 = rmp_ptr->flags1 | PR1_HURT_LITE; - rmp_ptr->oflags2[2] = rmp_ptr->oflags2[2] - | TR2_RES_POIS - | TR2_RES_NETHER - | TR2_RES_COLD - | TR2_RES_DARK - | TR2_HOLD_LIFE; - rmp_ptr->oflags3[2] = rmp_ptr->oflags3[2] - | TR3_LITE1; + rmp_ptr->oflags[2] = rmp_ptr->oflags[2] + | TR_RES_POIS + | TR_RES_NETHER + | TR_RES_COLD + | TR_RES_DARK + | TR_HOLD_LIFE; + rmp_ptr->oflags[2] = rmp_ptr->oflags[2] + | TR_LITE1; } /** diff --git a/src/defines.h b/src/defines.h index c99bcb39..1d078609 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2270,227 +2270,8 @@ MFLAG_PARTIAL | MFLAG_CONTROL | MFLAG_NO_DROP \ ) - -/* - * As of 2.7.8, the "object flags" are valid for all objects, and as - * of 2.7.9, these flags are not actually stored with the object. - * - * Note that "flags1" contains all flags dependant on "pval" (including - * stat bonuses, but NOT stat sustainers), plus all "extra attack damage" - * flags (SLAY_XXX and BRAND_XXX). - * - * Note that "flags2" contains all "resistances" (including "Stat Sustainers", - * actual immunities, and resistances). Note that "Hold Life" is really an - * "immunity" to ExpLoss, and "Free Action" is "immunity to paralysis". - * - * Note that "flags3" contains everything else -- including the three "CURSED" - * flags, and the "BLESSED" flag, several "item display" parameters, some new - * flags for powerful Bows, and flags which affect the player in a "general" - * way (LITE, TELEPATHY, SEE_INVIS, SLOW_DIGEST, REGEN, FEATHER), including - * all the "general" curses (TELEPORT, AGGRAVATE, EXP_DRAIN). It also has - * four new flags called "ITEM_IGNORE_XXX" which lets an item specify that - * it can not be affected by various forms of destruction. This is NOT as - * powerful as actually granting resistance/immunity to the wearer. - */ - -#define TR1_STR 0x00000001L /* STR += "pval" */ -#define TR1_INT 0x00000002L /* INT += "pval" */ -#define TR1_WIS 0x00000004L /* WIS += "pval" */ -#define TR1_DEX 0x00000008L /* DEX += "pval" */ -#define TR1_CON 0x00000010L /* CON += "pval" */ -#define TR1_CHR 0x00000020L /* CHR += "pval" */ -#define TR1_MANA 0x00000040L /* Mana multipler */ -#define TR1_SPELL 0x00000080L /* Spell power increase */ -#define TR1_STEALTH 0x00000100L /* Stealth += "pval" */ -#define TR1_SEARCH 0x00000200L /* Search += "pval" */ -#define TR1_INFRA 0x00000400L /* Infra += "pval" */ -#define TR1_TUNNEL 0x00000800L /* Tunnel += "pval" */ -#define TR1_SPEED 0x00001000L /* Speed += "pval" */ -#define TR1_BLOWS 0x00002000L /* Blows += "pval" */ -#define TR1_CHAOTIC 0x00004000L -#define TR1_VAMPIRIC 0x00008000L -#define TR1_SLAY_ANIMAL 0x00010000L -#define TR1_SLAY_EVIL 0x00020000L -#define TR1_SLAY_UNDEAD 0x00040000L -#define TR1_SLAY_DEMON 0x00080000L -#define TR1_SLAY_ORC 0x00100000L -#define TR1_SLAY_TROLL 0x00200000L -#define TR1_SLAY_GIANT 0x00400000L -#define TR1_SLAY_DRAGON 0x00800000L -#define TR1_KILL_DRAGON 0x01000000L /* Execute Dragon */ -#define TR1_VORPAL 0x02000000L /* Later */ -#define TR1_IMPACT 0x04000000L /* Cause Earthquakes */ -#define TR1_BRAND_POIS 0x08000000L -#define TR1_BRAND_ACID 0x10000000L -#define TR1_BRAND_ELEC 0x20000000L -#define TR1_BRAND_FIRE 0x40000000L -#define TR1_BRAND_COLD 0x80000000L -#define TR1_NULL_MASK 0x00000000L - -#define TRAP2_AUTOMATIC_5 0x00000001L /* Trap automatically rearms itself, 1 in 5 failure */ -#define TRAP2_AUTOMATIC_99 0x00000002L /* Trap automatically rearms itself */ -#define TRAP2_KILL_GHOST 0x00000004L /* Trap also affects PASS_WALL creatures */ -#define TRAP2_TELEPORT_TO 0x00000008L /* After everything else, teleport to player */ -#define TRAP2_ONLY_DRAGON 0x00000010L /* Affect only dragons & other AFFECTed creatures */ -#define TRAP2_ONLY_DEMON 0x00000020L /* Affect only demons & other AFFECTed creatures */ -#define TRAP2_ONLY_ANIMAL 0x00000100L /* Affect only animals & other AFFECTed creatures */ -#define TRAP2_ONLY_UNDEAD 0x00000200L /* Affect only undead & others */ -#define TRAP2_ONLY_EVIL 0x00000400L /* Affect only evil creatures &c. */ - -#define TRAP2_ONLY_MASK (TRAP2_ONLY_DRAGON | TRAP2_ONLY_DEMON | TRAP2_ONLY_ANIMAL | \ - TRAP2_ONLY_UNDEAD | TRAP2_ONLY_EVIL ) - -#define TR2_SUST_STR 0x00000001L -#define TR2_SUST_INT 0x00000002L -#define TR2_SUST_WIS 0x00000004L -#define TR2_SUST_DEX 0x00000008L -#define TR2_SUST_CON 0x00000010L -#define TR2_SUST_CHR 0x00000020L -#define TR2_INVIS 0x00000040L /* Invisibility */ -#define TR2_LIFE 0x00000080L /* Life multiplier */ -#define TR2_IM_ACID 0x00000100L -#define TR2_IM_ELEC 0x00000200L -#define TR2_IM_FIRE 0x00000400L -#define TR2_IM_COLD 0x00000800L -#define TR2_SENS_FIRE 0x00001000L /* Sensibility to fire */ -#define TR2_REFLECT 0x00002000L /* Reflect 'bolts' */ -#define TR2_FREE_ACT 0x00004000L /* Free Action */ -#define TR2_HOLD_LIFE 0x00008000L /* Hold Life */ -#define TR2_RES_ACID 0x00010000L -#define TR2_RES_ELEC 0x00020000L -#define TR2_RES_FIRE 0x00040000L -#define TR2_RES_COLD 0x00080000L -#define TR2_RES_POIS 0x00100000L -#define TR2_RES_FEAR 0x00200000L -#define TR2_RES_LITE 0x00400000L -#define TR2_RES_DARK 0x00800000L -#define TR2_RES_BLIND 0x01000000L -#define TR2_RES_CONF 0x02000000L -#define TR2_RES_SOUND 0x04000000L -#define TR2_RES_SHARDS 0x08000000L -#define TR2_RES_NETHER 0x10000000L -#define TR2_RES_NEXUS 0x20000000L -#define TR2_RES_CHAOS 0x40000000L -#define TR2_RES_DISEN 0x80000000L -#define TR2_NULL_MASK 0x00000000L - -#define TR3_SH_FIRE 0x00000001L /* Immolation (Fire) */ -#define TR3_SH_ELEC 0x00000002L /* Electric Sheath */ -#define TR3_AUTO_CURSE 0x00000004L /* The obj will recurse itself */ -#define TR3_DECAY 0x00000008L /* Decay */ -#define TR3_NO_TELE 0x00000010L /* Anti-teleportation */ -#define TR3_NO_MAGIC 0x00000020L /* Anti-magic */ -#define TR3_WRAITH 0x00000040L /* Wraithform */ -#define TR3_TY_CURSE 0x00000080L /* The Ancient Curse */ -#define TR3_EASY_KNOW 0x00000100L /* Aware -> Known */ -#define TR3_HIDE_TYPE 0x00000200L /* Hide "pval" description */ -#define TR3_SHOW_MODS 0x00000400L /* Always show Tohit/Todam */ -#define TR3_INSTA_ART 0x00000800L /* Item must be an artifact */ -#define TR3_FEATHER 0x00001000L /* Feather Falling */ -#define TR3_LITE1 0x00002000L /* lite radius 1 */ -#define TR3_SEE_INVIS 0x00004000L /* See Invisible */ -#define TR3_NORM_ART 0x00008000L /* Artifact in k_info */ -#define TR3_SLOW_DIGEST 0x00010000L /* Item slows down digestion */ -#define TR3_REGEN 0x00020000L /* Item induces regeneration */ -#define TR3_XTRA_MIGHT 0x00040000L /* Bows get extra multiplier */ -#define TR3_XTRA_SHOTS 0x00080000L /* Bows get extra shots */ -#define TR3_IGNORE_ACID 0x00100000L /* Item ignores Acid Damage */ -#define TR3_IGNORE_ELEC 0x00200000L /* Item ignores Elec Damage */ -#define TR3_IGNORE_FIRE 0x00400000L /* Item ignores Fire Damage */ -#define TR3_IGNORE_COLD 0x00800000L /* Item ignores Cold Damage */ -#define TR3_ACTIVATE 0x01000000L /* Item can be activated */ -#define TR3_DRAIN_EXP 0x02000000L /* Item drains Experience */ -#define TR3_TELEPORT 0x04000000L /* Item teleports player */ -#define TR3_AGGRAVATE 0x08000000L /* Item aggravates monsters */ -#define TR3_BLESSED 0x10000000L /* Item is Blessed */ -#define TR3_CURSED 0x20000000L /* Item is Cursed */ -#define TR3_HEAVY_CURSE 0x40000000L /* Item is Heavily Cursed */ -#define TR3_PERMA_CURSE 0x80000000L /* Item is Perma Cursed */ -#define TR3_NULL_MASK 0x00000000L - - -#define TR4_NEVER_BLOW 0x00000001L /* Weapon can't attack */ -#define TR4_PRECOGNITION 0x00000002L /* Like activating the cheat mode */ -#define TR4_BLACK_BREATH 0x00000004L /* Tolkien's Black Breath */ -#define TR4_RECHARGE 0x00000008L /* For artifact Wands and Staffs */ -#define TR4_FLY 0x00000010L /* This one and ONLY this one allow you to fly over trees */ -#define TR4_DG_CURSE 0x00000020L /* The Ancient Morgothian Curse */ -#define TR4_COULD2H 0x00000040L /* Can wield it 2 Handed */ -#define TR4_MUST2H 0x00000080L /* Must wield it 2 Handed */ -#define TR4_LEVELS 0x00000100L /* Can gain exp/exp levels !! */ -#define TR4_CLONE 0x00000200L /* Can clone monsters */ -#define TR4_SPECIAL_GENE 0x00000400L /* The object can only be generated in special conditions like quests, special dungeons, ... */ -#define TR4_CLIMB 0x00000800L /* Allow climbing mountains */ -#define TR4_FAST_CAST 0x00001000L /* Rod is x2 time faster to use */ -#define TR4_CAPACITY 0x00002000L /* Rod can take x2 mana */ -#define TR4_CHARGING 0x00004000L /* Rod recharge faster */ -#define TR4_CHEAPNESS 0x00008000L /* Rod spells are cheaper(in mana cost) to cast */ -#define TR4_FOUNTAIN 0x00010000L /* Available as fountain (for potions) */ -#define TR4_ANTIMAGIC_50 0x00020000L /* Forbid magic */ -#define TR4_EASY_USE 0x00200000L /* Easily activable */ -#define TR4_IM_NETHER 0x00400000L /* Immunity to nether */ -#define TR4_RECHARGED 0x00800000L /* Object has been recharged once */ -#define TR4_ULTIMATE 0x01000000L /* ULTIMATE artifact */ -#define TR4_AUTO_ID 0x02000000L /* Id stuff on floor */ -#define TR4_LITE2 0x04000000L /* lite radius 2 */ -#define TR4_LITE3 0x08000000L /* lite radius 3 */ -#define TR4_FUEL_LITE 0x10000000L /* fuelable lite */ -#define TR4_CURSE_NO_DROP 0x40000000L /* The obj wont be dropped */ -#define TR4_NO_RECHARGE 0x80000000L /* Object Cannot be recharged */ -#define TR4_NULL_MASK 0xFFFFFFFCL - -#define TR5_TEMPORARY 0x00000001L /* In timeout turns it is destroyed */ -#define TR5_DRAIN_MANA 0x00000002L /* Drains mana */ -#define TR5_DRAIN_HP 0x00000004L /* Drains hp */ -#define TR5_KILL_DEMON 0x00000008L /* Execute Demon */ -#define TR5_KILL_UNDEAD 0x00000010L /* Execute Undead */ -#define TR5_CRIT 0x00000020L /* More critical hits */ -#define TR5_ATTR_MULTI 0x00000040L /* Object shimmer -- only allowed in k_info */ -#define TR5_WOUNDING 0x00000080L /* Wounds monsters */ -#define TR5_FULL_NAME 0x00000100L /* Uses direct name from k_info */ -#define TR5_LUCK 0x00000200L /* Luck += pval */ -#define TR5_IMMOVABLE 0x00000400L /* Cannot move */ -#define TR5_SPELL_CONTAIN 0x00000800L /* Can contain a spell */ -#define TR5_RES_MORGUL 0x00001000L /* Is not shattered by morgul fiends(nazguls) */ -#define TR5_ACTIVATE_NO_WIELD 0x00002000L /* Can be 'A'ctivated without being wielded */ -#define TR5_MAGIC_BREATH 0x00004000L /* Can breath anywere */ -#define TR5_WATER_BREATH 0x00008000L /* Can breath underwater */ -#define TR5_WIELD_CAST 0x00010000L /* Must be wielded to cast spell from it */ -#define TR5_RANDOM_RESIST 0x00020000L /* Grants random resistance */ -#define TR5_RANDOM_POWER 0x00040000L /* Grants random power */ -#define TR5_RANDOM_RES_OR_POWER 0x00080000L /* Grants random resistance OR power (50-50 chance) */ - -/* ESP defines */ -#define ESP_ORC 0x00000001L -#define ESP_TROLL 0x00000002L -#define ESP_DRAGON 0x00000004L -#define ESP_GIANT 0x00000008L -#define ESP_DEMON 0x00000010L -#define ESP_UNDEAD 0x00000020L -#define ESP_EVIL 0x00000040L -#define ESP_ANIMAL 0x00000080L -#define ESP_THUNDERLORD 0x00000100L -#define ESP_GOOD 0x00000200L -#define ESP_NONLIVING 0x00000400L -#define ESP_UNIQUE 0x00000800L -#define ESP_SPIDER 0x00001000L -#define ESP_ALL 0x80000000L - #define NEW_GROUP_CHANCE 40 /* Chance to get a new group */ -/* - * Hack masks for "pval-dependant" flags. - */ -#define TR1_PVAL_MASK \ - (TR1_STR | TR1_INT | TR1_WIS | TR1_DEX | \ - TR1_CON | TR1_CHR | \ - TR1_STEALTH | TR1_SEARCH | TR1_INFRA | TR1_TUNNEL | \ - TR1_SPEED | TR1_BLOWS | TR1_SPELL) - -#define TR5_PVAL_MASK \ - (TR5_CRIT | TR5_LUCK) - - /*** Ego flags ***/ #define ETR4_SUSTAIN 0x00000001L /* Ego-Item gives a Random Sustain */ #define ETR4_OLD_RESIST 0x00000002L /* The old "extra power" random high resist */ diff --git a/src/dungeon.cc b/src/dungeon.cc index c05c6ed3..d70ffcde 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -46,6 +46,7 @@ #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -849,17 +850,10 @@ static void regen_monsters(void) * * Should belong to object1.c, renamed to object_decays() -- pelpel */ -static bool_ decays(object_type *o_ptr) +static bool decays(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - - - /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if (f3 & TR3_DECAY) return (TRUE); - - return (FALSE); + auto const flags = object_flags(o_ptr); + return bool(flags & TR_DECAY); } @@ -1233,8 +1227,6 @@ static void process_world(void) cave_type *c_ptr; object_type *o_ptr; - u32b f1 = 0 , f2 = 0 , f3 = 0, f4 = 0, f5 = 0, esp = 0; - /* * Every 10 game turns -- which means this section is invoked once @@ -1582,10 +1574,10 @@ static void process_world(void) o_ptr = &p_ptr->inventory[INVEN_WIELD]; /* Examine the sword */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hitpoints multiplier consume a lot of food */ - if (o_ptr->k_idx && (f2 & (TR2_LIFE))) i += o_ptr->pval * 5; + if (o_ptr->k_idx && (flags & TR_LIFE)) i += o_ptr->pval * 5; /* Slow digestion takes less food */ if (p_ptr->slow_digest) i -= 10; @@ -2580,8 +2572,6 @@ static void process_world(void) */ if (((turn % 3000) == 0) && p_ptr->black_breath) { - u32b f1, f2, f3, f4, f5; - bool_ be_silent = FALSE; /* check all equipment for the Black Breath flag. */ @@ -2593,10 +2583,10 @@ static void process_world(void) if (!o_ptr->k_idx) continue; /* Extract the item flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* No messages if object has the flag, to avoid annoyance. */ - if (f4 & (TR4_BLACK_BREATH)) be_silent = TRUE; + if (flags & TR_BLACK_BREATH) be_silent = TRUE; } /* If we are allowed to speak, warn and disturb. */ @@ -2618,10 +2608,10 @@ static void process_world(void) if (o_ptr->tval == TV_LITE) { /* Extract the item flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack -- Use some fuel */ - if ((f4 & TR4_FUEL_LITE) && (o_ptr->timeout > 0)) + if ((flags & TR_FUEL_LITE) && (o_ptr->timeout > 0)) { /* Decrease life-span */ o_ptr->timeout--; @@ -2767,17 +2757,17 @@ static void process_world(void) /* Get the object */ o_ptr = &p_ptr->inventory[i]; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* TY Curse */ - if ((f3 & TR3_TY_CURSE) && (rand_int(TY_CURSE_CHANCE) == 0)) + if ((flags & TR_TY_CURSE) && (rand_int(TY_CURSE_CHANCE) == 0)) { activate_ty_curse(); } /* DG Curse */ - if ((f4 & TR4_DG_CURSE) && (rand_int(DG_CURSE_CHANCE) == 0)) + if ((flags & TR_DG_CURSE) && (rand_int(DG_CURSE_CHANCE) == 0)) { activate_dg_curse(); @@ -2786,7 +2776,7 @@ static void process_world(void) } /* Auto Curse */ - if ((f3 & TR3_AUTO_CURSE) && (rand_int(AUTO_CURSE_CHANCE) == 0)) + if ((flags & TR_AUTO_CURSE) && (rand_int(AUTO_CURSE_CHANCE) == 0)) { /* The object recurse itself ! */ o_ptr->ident |= IDENT_CURSED; @@ -2796,7 +2786,7 @@ static void process_world(void) * Hack: Uncursed teleporting items (e.g. Dragon Weapons) * can actually be useful! */ - if ((f3 & TR3_TELEPORT) && (rand_int(100) < 1)) + if ((flags & TR_TELEPORT) && (rand_int(100) < 1)) { if ((o_ptr->ident & IDENT_CURSED) && !p_ptr->anti_tele) { @@ -2826,7 +2816,7 @@ static void process_world(void) if (!o_ptr->k_idx) continue; /* Hack: Skip wielded lights that need fuel (already handled above) */ - if ((i == INVEN_LITE) && (o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE)) continue; + if ((i == INVEN_LITE) && (o_ptr->tval == TV_LITE) && (flags & TR_FUEL_LITE)) continue; /* Recharge activatable objects */ if (o_ptr->timeout > 0) @@ -2869,10 +2859,10 @@ static void process_world(void) if (!o_ptr->k_idx) continue; /* Examine the rod */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Temporary items are destroyed */ - if (f5 & TR5_TEMPORARY) + if (flags & TR_TEMPORARY) { o_ptr->timeout--; @@ -2889,7 +2879,7 @@ static void process_world(void) if ((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->timeout < o_ptr->pval2)) { /* Increase the rod's mana. */ - o_ptr->timeout += (f4 & TR4_CHARGING) ? 2 : 1; + o_ptr->timeout += (flags & TR_CHARGING) ? 2 : 1; /* Always notice */ j++; @@ -2903,7 +2893,7 @@ static void process_world(void) } /* Examine all charging random artifacts */ - if ((f5 & TR5_ACTIVATE_NO_WIELD) && (o_ptr->timeout > 0)) + if ((flags & TR_ACTIVATE_NO_WIELD) && (o_ptr->timeout > 0)) { /* Charge it */ o_ptr->timeout--; @@ -3004,10 +2994,10 @@ static void process_world(void) if (!o_ptr->k_idx) continue; /* Examine the rod */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Temporary items are destroyed */ - if (f5 & TR5_TEMPORARY) + if (flags & TR_TEMPORARY) { o_ptr->timeout--; @@ -3025,7 +3015,7 @@ static void process_world(void) if ((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->timeout < o_ptr->pval2)) { /* Increase the rod's mana. */ - o_ptr->timeout += (f4 & TR4_CHARGING) ? 2 : 1; + o_ptr->timeout += (flags & TR_CHARGING) ? 2 : 1; /* Do not overflow */ if (o_ptr->timeout >= o_ptr->pval2) @@ -3493,16 +3483,8 @@ static void process_command(void) /* Go up staircase */ case '<': { - object_type *o_ptr; - u32b f1 = 0 , f2 = 0 , f3 = 0, f4 = 0, f5 = 0, esp = 0; - - - /* Check for light being wielded */ - o_ptr = &p_ptr->inventory[INVEN_LITE]; - /* Burn some fuel in the current lite */ - if (o_ptr->tval == TV_LITE) - /* Extract the item flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + /* Get the light being wielded */ + auto o_ptr = &p_ptr->inventory[INVEN_LITE]; /* Cannot move if rooted in place */ if (p_ptr->tim_roots) break; @@ -4540,7 +4522,7 @@ static void process_player(void) if ((!o_ptr->k_idx) || (!o_ptr->ix)) continue; /* Skip non-multi-hued monsters */ - if (!(k_ptr->flags5 & (TR5_ATTR_MULTI))) continue; + if (!(k_ptr->flags & TR_ATTR_MULTI)) continue; /* Reset the flag */ shimmer_objects = TRUE; diff --git a/src/ego_item_type.hpp b/src/ego_item_type.hpp index b5cf2781..77fe6637 100644 --- a/src/ego_item_type.hpp +++ b/src/ego_item_type.hpp @@ -1,6 +1,9 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" + +#include /* * Size of flag rarity tables @@ -38,33 +41,21 @@ struct ego_item_type byte rar[FLAG_RARITY_MAX] = { 0 }; - u32b flags1[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 1 */ - u32b flags2[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 2 */ - u32b flags3[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 3 */ - u32b flags4[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 4 */ - u32b flags5[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Flags, set 5 */ - u32b esp[FLAG_RARITY_MAX] = { 0 }; /* ESP flags */ - u32b oflags1[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 1 */ - u32b oflags2[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 2 */ - u32b oflags3[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 3 */ - u32b oflags4[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 4 */ - u32b oflags5[FLAG_RARITY_MAX] = { 0 }; /* Ego-Item Obvious Flags, set 5 */ - u32b oesp[FLAG_RARITY_MAX] = { 0 }; /* Obvious ESP flags */ + std::array flags; + std::array oflags; u32b fego[FLAG_RARITY_MAX] = { 0 }; /* ego flags */ - u32b need_flags1 = 0; /* Ego-Item Flags, set 1 */ - u32b need_flags2 = 0; /* Ego-Item Flags, set 2 */ - u32b need_flags3 = 0; /* Ego-Item Flags, set 3 */ - u32b need_flags4 = 0; /* Ego-Item Flags, set 4 */ - u32b need_flags5 = 0; /* Ego-Item Flags, set 5 */ - u32b need_esp = 0; /* ESP flags */ - u32b forbid_flags1 = 0; /* Ego-Item Flags, set 1 */ - u32b forbid_flags2 = 0; /* Ego-Item Flags, set 2 */ - u32b forbid_flags3 = 0; /* Ego-Item Flags, set 3 */ - u32b forbid_flags4 = 0; /* Ego-Item Flags, set 4 */ - u32b forbid_flags5 = 0; /* Ego-Item Flags, set 5 */ - u32b forbid_esp = 0; /* ESP flags */ - - s16b power = 0; /* Power granted, if any */ + object_flag_set need_flags; + object_flag_set forbid_flags; + + s16b power = -1; /* Power granted, if any */ + +public: + ego_item_type() + { + std::fill(std::begin(tval), + std::end(tval), + 255); + } }; diff --git a/src/files.cc b/src/files.cc index e375e7b0..9ebc18ab 100644 --- a/src/files.cc +++ b/src/files.cc @@ -23,6 +23,7 @@ #include "loadsave.h" #include "loadsave.hpp" #include "mimic.hpp" +#include "monoid.hpp" #include "monster2.hpp" #include "monster3.hpp" #include "monster_ego.hpp" @@ -32,6 +33,8 @@ #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" +#include "object_flag_meta.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_class.hpp" @@ -56,9 +59,10 @@ #include "z-rand.hpp" #include -#include #include #include +#include +#include #include /* @@ -1546,620 +1550,642 @@ static void display_player_various(void) * Obtain the "flags" of the wielded symbiote */ -void wield_monster_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) +static object_flag_set wield_monster_flags() { - object_type *o_ptr; - monster_race *r_ptr; - - /* Clear */ - (*f1) = (*f2) = (*f3) = (*f4) = (*f5) = (*esp) = 0L; + object_flag_set flags; /* Get the carried monster */ - o_ptr = &p_ptr->inventory[INVEN_CARRY]; - + auto o_ptr = &p_ptr->inventory[INVEN_CARRY]; if (o_ptr->k_idx) { - r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; if (r_ptr->flags & RF_INVISIBLE) - (*f2) |= TR2_INVIS; + flags |= TR_INVIS; if (r_ptr->flags & RF_REFLECTING) - (*f2) |= TR2_REFLECT; + flags |= TR_REFLECT; if (r_ptr->flags & RF_CAN_FLY) - (*f3) |= TR3_FEATHER; + flags |= TR_FEATHER; if (r_ptr->flags & RF_AQUATIC) - (*f5) |= TR5_WATER_BREATH; + flags |= TR_WATER_BREATH; } + + return flags; } /* * Obtain the "flags" for the player as if he was an item */ -void player_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) +object_flag_set player_flags() { - int i; - /* Clear */ - (*f1) = (*f2) = (*f3) = (*f4) = (*f5) = (*esp) = 0L; + object_flag_set f; /* Astral chars */ if (p_ptr->astral) { - (*f3) |= TR3_WRAITH; + f |= TR_WRAITH; } /* Skills */ - if (get_skill(SKILL_DAEMON) > 20) (*f2) |= TR2_RES_CONF; - if (get_skill(SKILL_DAEMON) > 30) (*f2) |= TR2_RES_FEAR; - if (get_skill(SKILL_MINDCRAFT) >= 40) (*esp) |= ESP_ALL; + if (get_skill(SKILL_DAEMON) > 20) f |= TR_RES_CONF; + if (get_skill(SKILL_DAEMON) > 30) f |= TR_RES_FEAR; + if (get_skill(SKILL_MINDCRAFT) >= 40) f |= ESP_ALL; if (p_ptr->melee_style == SKILL_HAND && get_skill(SKILL_HAND) > 24 && !monk_heavy_armor()) - (*f2) |= TR2_FREE_ACT; -/* Hack - from Lua */ - if (get_skill(SKILL_MANA) >= 35) (*f1) |= TR1_MANA; - if (get_skill(SKILL_AIR) >= 50) (*f5) |= (TR5_MAGIC_BREATH | TR5_WATER_BREATH); - if (get_skill(SKILL_WATER) >= 30) (*f5) |= TR5_WATER_BREATH; + { + f |= TR_FREE_ACT; + } + if (get_skill(SKILL_MANA) >= 35) f |= TR_MANA; + if (get_skill(SKILL_AIR) >= 50) f |= (TR_MAGIC_BREATH | TR_WATER_BREATH); + if (get_skill(SKILL_WATER) >= 30) f |= TR_WATER_BREATH; /* Gods */ if (p_ptr->pgod == GOD_ERU) { - if ((p_ptr->grace >= 100) || (p_ptr->grace <= -100)) (*f1) |= TR1_MANA; - if (p_ptr->grace > 10000) (*f1) |= TR1_WIS; + if ((p_ptr->grace >= 100) || (p_ptr->grace <= -100)) f |= TR_MANA; + if (p_ptr->grace > 10000) f |= TR_WIS; } if (p_ptr->pgod == GOD_MELKOR) { - (*f2) |= TR2_RES_FIRE; - if (p_ptr->melkor_sacrifice > 0) (*f2) |= TR2_LIFE; - if (p_ptr->grace > 10000) (*f1) |= (TR1_STR | TR1_CON | TR1_INT | TR1_WIS | TR1_CHR); + f |= TR_RES_FIRE; + if (p_ptr->melkor_sacrifice > 0) f |= TR_LIFE; + if (p_ptr->grace > 10000) f |= (TR_STR | TR_CON | TR_INT | TR_WIS | TR_CHR); if (p_ptr->praying) { - if (p_ptr->grace > 5000) (*f2) |= TR2_INVIS; - if (p_ptr->grace > 15000) (*f2) |= TR2_IM_FIRE; + if (p_ptr->grace > 5000) f |= TR_INVIS; + if (p_ptr->grace > 15000) f |= TR_IM_FIRE; } } if (p_ptr->pgod == GOD_MANWE) { - if (p_ptr->grace >= 2000) (*f3) |= TR3_FEATHER; + if (p_ptr->grace >= 2000) f |= TR_FEATHER; if (p_ptr->praying) { - if (p_ptr->grace >= 7000) (*f2) |= TR2_FREE_ACT; - if (p_ptr->grace >= 15000) (*f4) |= TR4_FLY; - if ((p_ptr->grace >= 5000) || (p_ptr->grace <= -5000)) (*f1) |= TR1_SPEED; + if (p_ptr->grace >= 7000) f |= TR_FREE_ACT; + if (p_ptr->grace >= 15000) f |= TR_FLY; + if ((p_ptr->grace >= 5000) || (p_ptr->grace <= -5000)) f |= TR_SPEED; } } if (p_ptr->pgod == GOD_TULKAS) { - if (p_ptr->grace > 5000) (*f1) |= TR1_CON; - if (p_ptr->grace > 10000) (*f1) |= TR1_STR; + if (p_ptr->grace > 5000) f |= TR_CON; + if (p_ptr->grace > 10000) f |= TR_STR; } if (p_ptr->pgod == GOD_AULE) { if (p_ptr->grace > 5000) { - (*f2) |= TR2_RES_FIRE; + f |= TR_RES_FIRE; } } if (p_ptr->pgod == GOD_MANDOS) { - (*f2) |= TR2_RES_NETHER; + f |= TR_RES_NETHER; if ((p_ptr->grace > 10000) && (p_ptr->praying == TRUE)) { - (*f3) |= TR3_NO_TELE; + f |= TR_NO_TELE; } if ((p_ptr->grace > 20000) && (p_ptr->praying == TRUE)) { - (*f4) |= TR4_IM_NETHER; + f |= TR_IM_NETHER; } } if (p_ptr->pgod == GOD_ULMO) { - (*f5) |= TR5_WATER_BREATH; + f |= TR_WATER_BREATH; if ((p_ptr->grace > 1000) && (p_ptr->praying == TRUE)) { - (*f2) |= TR2_RES_POIS; + f |= TR_RES_POIS; } if ((p_ptr->grace > 15000) && (p_ptr->praying == TRUE)) { - (*f5) |= TR5_MAGIC_BREATH; + f |= TR_MAGIC_BREATH; } } /* Classes */ - for (i = 1; i <= p_ptr->lev; i++) + for (int i = 1; i <= p_ptr->lev; i++) { - (*f1) |= cp_ptr->oflags1[i]; - (*f2) |= cp_ptr->oflags2[i]; - (*f3) |= cp_ptr->oflags3[i]; - (*f4) |= cp_ptr->oflags4[i]; - (*f5) |= cp_ptr->oflags5[i]; - (*esp) |= cp_ptr->oesp[i]; + f |= cp_ptr->oflags[i]; } /* Races */ if ((!p_ptr->mimic_form) && (!p_ptr->body_monster)) { - for (i = 1; i <= p_ptr->lev; i++) + for (int i = 1; i <= p_ptr->lev; i++) { - (*f1) |= rp_ptr->oflags1[i]; - (*f2) |= rp_ptr->oflags2[i]; - (*f3) |= rp_ptr->oflags3[i]; - (*f4) |= rp_ptr->oflags4[i]; - (*f5) |= rp_ptr->oflags5[i]; - (*esp) |= rp_ptr->oesp[i]; + f |= rp_ptr->oflags[i]; - (*f1) |= rmp_ptr->oflags1[i]; - (*f2) |= rmp_ptr->oflags2[i]; - (*f3) |= rmp_ptr->oflags3[i]; - (*f4) |= rmp_ptr->oflags4[i]; - (*f5) |= rmp_ptr->oflags5[i]; - (*esp) |= rmp_ptr->oesp[i]; + f |= rmp_ptr->oflags[i]; } } else { monster_race *r_ptr = &r_info[p_ptr->body_monster]; - if (r_ptr->flags & RF_REFLECTING) (*f2) |= TR2_REFLECT; - if (r_ptr->flags & RF_REGENERATE) (*f3) |= TR3_REGEN; - if (r_ptr->flags & RF_AURA_FIRE) (*f3) |= TR3_SH_FIRE; - if (r_ptr->flags & RF_AURA_ELEC) (*f3) |= TR3_SH_ELEC; - if (r_ptr->flags & RF_PASS_WALL) (*f3) |= TR3_WRAITH; - if (r_ptr->flags & RF_SUSCEP_FIRE) (*f2) |= TR2_SENS_FIRE; - if (r_ptr->flags & RF_IM_ACID) (*f2) |= TR2_RES_ACID; - if (r_ptr->flags & RF_IM_ELEC) (*f2) |= TR2_RES_ELEC; - if (r_ptr->flags & RF_IM_FIRE) (*f2) |= TR2_RES_FIRE; - if (r_ptr->flags & RF_IM_POIS) (*f2) |= TR2_RES_POIS; - if (r_ptr->flags & RF_IM_COLD) (*f2) |= TR2_RES_COLD; - if (r_ptr->flags & RF_RES_NETH) (*f2) |= TR2_RES_NETHER; - if (r_ptr->flags & RF_RES_NEXU) (*f2) |= TR2_RES_NEXUS; - if (r_ptr->flags & RF_RES_DISE) (*f2) |= TR2_RES_DISEN; - if (r_ptr->flags & RF_NO_FEAR) (*f2) |= TR2_RES_FEAR; - if (r_ptr->flags & RF_NO_SLEEP) (*f2) |= TR2_FREE_ACT; - if (r_ptr->flags & RF_NO_CONF) (*f2) |= TR2_RES_CONF; - if (r_ptr->flags & RF_CAN_FLY) (*f3) |= TR3_FEATHER; - } - - (*f1) |= p_ptr->xtra_f1; - (*f2) |= p_ptr->xtra_f2; - (*f3) |= p_ptr->xtra_f3; - (*f4) |= p_ptr->xtra_f4; - (*f5) |= p_ptr->xtra_f5; - (*esp) |= p_ptr->xtra_esp; + if (r_ptr->flags & RF_REFLECTING) f |= TR_REFLECT; + if (r_ptr->flags & RF_REGENERATE) f |= TR_REGEN; + if (r_ptr->flags & RF_AURA_FIRE) f |= TR_SH_FIRE; + if (r_ptr->flags & RF_AURA_ELEC) f |= TR_SH_ELEC; + if (r_ptr->flags & RF_PASS_WALL) f |= TR_WRAITH; + if (r_ptr->flags & RF_SUSCEP_FIRE) f |= TR_SENS_FIRE; + if (r_ptr->flags & RF_IM_ACID) f |= TR_RES_ACID; + if (r_ptr->flags & RF_IM_ELEC) f |= TR_RES_ELEC; + if (r_ptr->flags & RF_IM_FIRE) f |= TR_RES_FIRE; + if (r_ptr->flags & RF_IM_POIS) f |= TR_RES_POIS; + if (r_ptr->flags & RF_IM_COLD) f |= TR_RES_COLD; + if (r_ptr->flags & RF_RES_NETH) f |= TR_RES_NETHER; + if (r_ptr->flags & RF_RES_NEXU) f |= TR_RES_NEXUS; + if (r_ptr->flags & RF_RES_DISE) f |= TR_RES_DISEN; + if (r_ptr->flags & RF_NO_FEAR) f |= TR_RES_FEAR; + if (r_ptr->flags & RF_NO_SLEEP) f |= TR_FREE_ACT; + if (r_ptr->flags & RF_NO_CONF) f |= TR_RES_CONF; + if (r_ptr->flags & RF_CAN_FLY) f |= TR_FEATHER; + } + + f |= p_ptr->xtra_flags; if (p_ptr->black_breath) { - (*f4) |= TR4_BLACK_BREATH; + f |= TR_BLACK_BREATH; } if (p_ptr->hp_mod != 0) { - (*f2) |= TR2_LIFE; + f |= TR_LIFE; } + + return f; } +namespace { // + /* - * Object flag names + * Build an return a (static) index of all the object_flag_meta + * information indexed by page->column->row. */ -static cptr object_flag_names[192] = +static std::vector const &object_flag_metas_by_pcr(int page, int column, int row) { - "Add Str", - "Add Int", - "Add Wis", - "Add Dex", - "Add Con", - "Add Chr", - "Mul Mana", - "Mul SPower", - "Add Stea.", - "Add Sear.", - "Add Infra", - "Add Tun..", - "Add Speed", - "Add Blows", - "Chaotic", - "Vampiric", - "Slay Anim.", - "Slay Evil", - "Slay Und.", - "Slay Demon", - "Slay Orc", - "Slay Troll", - "Slay Giant", - "Slay Drag.", - "Kill Drag.", - "Sharpness", - "Impact", - "Poison Brd", - "Acid Brand", - "Elec Brand", - "Fire Brand", - "Cold Brand", - - "Sust Str", - "Sust Int", - "Sust Wis", - "Sust Dex", - "Sust Con", - "Sust Chr", - "Invisible", - "Mul life", - "Imm Acid", - "Imm Elec", - "Imm Fire", - "Imm Cold", - "Sens Fire", - "Reflect", - "Free Act", - "Hold Life", - "Res Acid", - "Res Elec", - "Res Fire", - "Res Cold", - "Res Pois", - "Res Fear", - "Res Light", - "Res Dark", - "Res Blind", - "Res Conf", - "Res Sound", - "Res Shard", - "Res Neth", - "Res Nexus", - "Res Chaos", - "Res Disen", - - - - "Aura Fire", - "Aura Elec", - "Auto Curse", - NULL, - "NoTeleport", - "AntiMagic", - "WraithForm", - "EvilCurse", - NULL, - NULL, - NULL, - NULL, - "Levitate", - "Lite", - "See Invis", - NULL, - "Digestion", - "Regen", - "Xtra Might", - "Xtra Shots", - NULL, - NULL, - NULL, - NULL, - "Activate", - "Drain Exp", - "Teleport", - "Aggravate", - "Blessed", - "Cursed", - "Hvy Curse", - "Prm Curse", - - "No blows", - "Precogn.", - "B.Breath", - "Recharge", - "Fly", - "Mrg.Curse", - NULL, - NULL, - "Sentient", - "Clone", - NULL, - "Climb", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "Imm Neth", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - - "Orc.ESP", - "Troll.ESP", - "Dragon.ESP", - "Giant.ESP", - "Demon.ESP", - "Undead.ESP", - "Evil.ESP", - "Animal.ESP", - "TLord.ESP", - "Good.ESP", - "Nlive.ESP", - "Unique.ESP", - "Spider ESP", - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - "Full ESP", + static std::vector>>> instance; + + if (instance.empty()) + { + // Find number of pages, columns and rows. + std::size_t n_pages = 0; + std::size_t n_columns = 0; + std::size_t n_rows = 0; + + for (auto const &object_flag_meta: object_flags_meta()) + { + n_pages = std::max(n_pages, object_flag_meta->c_page + 1); + n_columns = std::max(n_columns, object_flag_meta->c_column + 1); + n_rows = std::max(n_rows, object_flag_meta->c_row + 1); + } + + // Sanity check; we should always have enough data. + assert(n_pages > 0); + assert(n_columns > 0); + assert(n_rows > 0); + + // Build the scaffolding structure without the actual data. + instance.reserve(n_pages); + for (std::size_t i = 0; i < n_pages; i++) + { + std::vector>> page; + page.reserve(n_columns); + + for (std::size_t j = 0; j < n_columns; j++) + { + std::vector> column; + column.reserve(n_rows); + + for (std::size_t k = 0; k < n_rows; k++) + { + std::vector row; + column.push_back(row); + } + + page.push_back(column); + } + + instance.push_back(page); + } + + // Insert all the data. + for (auto const object_flag_meta: object_flags_meta()) + { + // Ignore if not mapped to any page. + if (!object_flag_meta->c_name) + { + continue; + } + + // Find the row + auto &row = instance + .at(object_flag_meta->c_page) + .at(object_flag_meta->c_column) + .at(object_flag_meta->c_row); + + // Insert + row.push_back(object_flag_meta); + } + } + + return instance.at(page).at(column).at(row); +} + + +/** + * Convert a number to a digit, capping at '9'. Ignores the sign of the number. + */ +static char number_to_digit(int n) { + // Throw away sign. + n = std::abs(n); + // Convert to digit or '*' + return (n > 9 ? '*' : I2D(n)); }; -/* - * Summarize resistances + +/** + * Check that two object_flag types are compatible. */ -static void display_player_ben_one(int mode) +static bool object_flag_types_are_compatible(char type_a, char type_b) { - int i, n, x, y, z, dispx, modetemp, xtemp; + switch (type_a) + { + case 'n': + return (type_b == 'n'); + case 'b': + return (type_b == 'b'); + case '+': + case '*': + return (type_b == '+') || (type_b == '*'); + case 'f': + return (type_b == 'f'); + case '\0': + return true; + default: + abort(); + } +} - object_type *o_ptr; +/** + * Object flag data for calculating cells on the character sheet. + */ +struct object_flag_cell { + /** + * Type designator for the cell, if any. + */ + char type; + + /** + * Associated PVAL, if any. + */ + int pval; - char dummy[80], c; + /** + * Label for the cell, given its current contents. + */ + const char *label; - u32b f1, f2, f3, f4, f5, esp; + /** + * Create object_flag_cell from object_flag_meta. + */ + static object_flag_cell from_object_flag_meta(object_flag_meta const &object_flag_meta, int pval) + { + // The FIXED type flags require special handling. + if ((object_flag_meta.c_type == '1') || (object_flag_meta.c_type == '2') || (object_flag_meta.c_type == '3')) + { + return object_flag_cell { + 'f', + D2I(object_flag_meta.c_type), + object_flag_meta.c_name + }; + } + else + { + return object_flag_cell { + object_flag_meta.c_type, + pval, + object_flag_meta.c_name + }; + } + } - u16b b[INVEN_TOTAL - INVEN_WIELD + 1][10]; +}; - int d[INVEN_TOTAL - INVEN_WIELD + 1]; +namespace detail { // "hide" from surrounding scope; should only be accessed through the monoid - bool_ got; +static object_flag_cell object_flag_cell_append(object_flag_cell const &a, object_flag_cell const &b) +{ + // The "empty" value automatically gets swallowed, whatever + // "side" of the append it's on. + if (a.type == '\0') + { + return b; + } - byte a; + if (b.type == '\0') + { + return a; + } - cptr name; + // The rest of the code assumes compatible types, so we + // assert this to a) avoid over-complicated logic, and + // b) breaking under 'unexpected' changes to the object + // flag list. + if (!object_flag_types_are_compatible(a.type, b.type)) + { + abort(); + } - /* Scan equipment */ - for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) + // Any boolean flag which is "set" overrides the previous + // flag. (If the flag was already set we won't lose any + // information.) + if (b.type == 'b') { - /* Index */ - n = (i - INVEN_WIELD); + return b; + } - /* Object */ - o_ptr = &p_ptr->inventory[i]; + // Flags with a numerical value get added together. + if (b.type == 'n') // (a.type == 'n') by symmetry and object_flag_types_are_compatible() + { + // Arbitrary choice of label -- the labels *should* be the same, by definition + return object_flag_cell { 'n', a.pval + b.pval, a.label }; + } - /* Known object flags */ - object_flags_known(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + // Fixed-value flags. + if (a.type == 'f') // (b.type == 'f') by symmetry and object_flag_types_are_compatible() + { + // Arbitrary choice of label -- the labels *should* be the same, by definition + return object_flag_cell { 'f', a.pval + b.pval, a.label }; + } - /* Incorporate */ - b[n][0] = (u16b)(f1 & 0xFFFF); - b[n][1] = (u16b)(f1 >> 16); - b[n][2] = (u16b)(f2 & 0xFFFF); - b[n][3] = (u16b)(f2 >> 16); - b[n][4] = (u16b)(f3 & 0xFFFF); - b[n][5] = (u16b)(f3 >> 16); - b[n][6] = (u16b)(f4 & 0xFFFF); - b[n][7] = (u16b)(f4 >> 16); - b[n][8] = (u16b)(esp & 0xFFFF); - b[n][9] = (u16b)(esp >> 16); - d[n] = o_ptr->pval; + // Flags of the TERNARY variety have a "supercedes" rule + // where immunity supercedes resistance. + if (a.type == '*') + { + return object_flag_cell { '*', 0, a.label }; + } + else if (b.type == '*') + { + return object_flag_cell { '*', 0, b.label }; + } + else // Both must be '+' + { + // Arbitrary choice of label -- the labels *should* be the same, by definition + return object_flag_cell { '+', 0, a.label }; } +} - /* Carried symbiote */ - n = INVEN_CARRY - INVEN_WIELD; +constexpr object_flag_cell object_flag_cell_empty { '\0', 0, nullptr }; - /* Player flags */ - wield_monster_flags(&f1, &f2, &f3, &f4, &f5, &esp); +} // namespace "detail" - /* Incorporate */ - b[n][0] = (u16b)(f1 & 0xFFFF); - b[n][1] = (u16b)(f1 >> 16); - b[n][2] = (u16b)(f2 & 0xFFFF); - b[n][3] = (u16b)(f2 >> 16); - b[n][4] = (u16b)(f3 & 0xFFFF); - b[n][5] = (u16b)(f3 >> 16); - b[n][6] = (u16b)(f4 & 0xFFFF); - b[n][7] = (u16b)(f4 >> 16); - b[n][8] = (u16b)(esp & 0xFFFF); - b[n][9] = (u16b)(esp >> 16); +using object_flag_cell_monoid = monoid; - /* Index */ - n = INVEN_TOTAL - INVEN_WIELD; +} // namespace - /* Player flags */ - player_flags(&f1, &f2, &f3, &f4, &f5, &esp); +namespace { // - /* Incorporate */ - b[n][0] = (u16b)(f1 & 0xFFFF); - b[n][1] = (u16b)(f1 >> 16); - b[n][2] = (u16b)(f2 & 0xFFFF); - b[n][3] = (u16b)(f2 >> 16); - b[n][4] = (u16b)(f3 & 0xFFFF); - b[n][5] = (u16b)(f3 >> 16); - b[n][6] = (u16b)(f4 & 0xFFFF); - b[n][7] = (u16b)(f4 >> 16); - b[n][8] = (u16b)(esp & 0xFFFF); - b[n][9] = (u16b)(esp >> 16); +static object_flag_meta const *get_lowest_priority_object_flag_meta(std::vector const &object_flag_metas) +{ + object_flag_meta const *found = nullptr; - /* Generate the equip chars */ - sprintf(dummy, " "); - for (i = 0; i < INVEN_TOTAL - INVEN_WIELD; i++) + for (auto object_flag_meta: object_flag_metas) { - /* If you have that body part then show it */ - if (p_ptr->body_parts[i]) + if ((!found) || (found->c_priority > object_flag_meta->c_priority)) { - strcat(dummy, format("%c", i + 'a')); + found = object_flag_meta; } } - strcat(dummy, "@"); - /* Scan cols */ - for (x = 1; x > -1; x--) + return found; +} + + +static std::tuple object_flag_cell_to_char(object_flag_cell const &object_flag_cell) +{ + switch (object_flag_cell.type) { - /* Label */ - Term_putstr(x * 40 + 11, 3, -1, TERM_WHITE, dummy); + case 'n': + case 'f': + // If we have no pval, we use a simple '+'. This applies + // to the 'player' slot. + if (object_flag_cell.pval == 0) + { + return std::make_tuple('+', 1); + } + else + { + return std::make_tuple( + number_to_digit(object_flag_cell.pval), + (object_flag_cell.pval >= 0) ? 1 : -1); + } + break; + + case 'b': + case '+': + return std::make_tuple('+', 1); + break; + + case '*': + return std::make_tuple('*', 1); + break; + + default: + return std::make_tuple('.', 0); + break; + } + + abort(); +} + - /* Scan rows */ - for (y = 0; y < 16; y++) +/* + * Output a slot + */ +static void display_flag_row( + int y, + int x0, + std::vector> const &slots, + std::vector const &object_flag_metas_at_pcr) +{ + assert(!object_flag_metas_at_pcr.empty()); + + // Accumulated value of all of the slots + auto acc = object_flag_cell_monoid::empty; + + // Go through each slot + for (std::size_t i = 0; i < slots.size(); i++) + { + object_flag_cell combined = object_flag_cell_monoid::empty; + + // Go through all flags that are actually set for this 'cell'. { - if (mode == 3 && x == 1) - { - modetemp = 4; - xtemp = 0; - } - else + auto const &slot = slots[i]; + auto const pval = std::get<1>(slot); + auto const flags = std::get<2>(slot); + + for (auto const object_flag_meta: object_flag_metas_at_pcr) { - modetemp = mode; - xtemp = x; + if (object_flag_meta->flag_set & flags) + { + combined = object_flag_cell_monoid::append( + combined, + object_flag_cell::from_object_flag_meta(*object_flag_meta, pval)); + } } + } - for (z = mode; z <= modetemp; z++) - { - if (mode == 3 && x == 1 && z == modetemp) xtemp = 1; - name = object_flag_names[32 * modetemp + 16 * xtemp + y]; - got = FALSE; + // Accumulate into the global accumulator + acc = object_flag_cell_monoid::append(acc, combined); - /* No name */ - if (!name) continue; + // Write the cell's value. + auto const char_and_rating = object_flag_cell_to_char(combined); + auto const ch = std::get<0>(char_and_rating); + auto const rating = std::get<1>(char_and_rating); - /* Dump colon */ - if (!(modetemp == 1 && x == 0 && y > 7 && y < 12)) - { - Term_putch(x * 40 + 10, y + 4, TERM_WHITE, ':'); - } + // Convert good flag into a color. + byte a; + if (rating == 0) + { + a = (i & 0x02) ? TERM_GREEN : TERM_SLATE; + } + else if (rating < 0) + { + a = TERM_RED; + } + else + { + a = TERM_L_GREEN; + } - /* Check flags */ - dispx = 0; - for (n = 0; n < INVEN_TOTAL - INVEN_WIELD + 1; n++) - { - /* Change colour every two columns */ - bool_ is_green = (dispx & 0x02); - a = (is_green ? TERM_GREEN : TERM_SLATE); - c = '.'; + // Output the flag + Term_putch(x0 + 11 + i, y, a, ch); + } - /* If the body part doesn't exists then skip it :) */ - if ((n < INVEN_TOTAL - INVEN_WIELD) && (!p_ptr->body_parts[n])) continue; + // Extract the label. If the flag isn't set at all then we don't have + // an actual label, so we'll use the one from the meta-level object + // flag definition. Note that the prioritization is crucial for the + // labeling to work properly; e.g. IMM_FIRE comes *before* the + // RES_FIRE flag in the object flag list, but we don't want the *label* + // from IMM_FIRE to be used when the flag is not set at all. + auto const label = (acc.label != nullptr) + ? acc.label + : get_lowest_priority_object_flag_meta(object_flag_metas_at_pcr)->c_name; - /* Increment the drawing coordinates */ - dispx++; + // Get the "rating" for the label. + auto const rating = std::get<1>(object_flag_cell_to_char(acc)); - /* Check flag */ - if (b[n][2 * modetemp + xtemp] & (1 << y)) - { - a = (is_green ? TERM_L_GREEN : TERM_WHITE); - if (modetemp == 1 && x == 0 && y > 7 && y < 12) - { - c = '*'; - } - else if (modetemp == 0 && x == 0 && y < 14 && (y < 6 || y > 7)) - { - if (n == INVEN_TOTAL - INVEN_WIELD) - { - c = '+'; - } - else - { - c = d[n]; - if (c < 0) - { - c = -c; - a = TERM_RED; - } - c = (c > 9 ? '*' : I2D(c)); - } - } - else - { - c = '+'; - } - got = TRUE; - } + byte label_attr; + if (rating == 0) { + label_attr = TERM_WHITE; + } else if (rating < 0) { + label_attr = TERM_RED; + } else { + label_attr = TERM_L_GREEN; + } - /* HACK - Check for nether immunity and - apply to Res Neth line */ - if (modetemp == 1 && x == 1 && y == 12) - { - if (b[n][7] & (1 << 6)) - { - a = (is_green ? TERM_L_GREEN : TERM_WHITE); - c = '*'; - got = TRUE; - } - } + Term_putch(x0 + 10, y, TERM_WHITE, ':'); + Term_putstr(x0, y, -1, label_attr, label); +} - /* Dump flag */ - if (modetemp == 1 && x == 0 && y > 7 && y < 12) - { - if (c == '*') Term_putch(40 + 11 + dispx, y - 4, a, c); - } - else - { - Term_putch(x * 40 + 11 + dispx, y + 4, a, c); - } - } +/* + * Summarize resistances + */ +static void display_player_ben_one(int page) +{ + // Slots of flags to show. + std::vector> slots; + slots.reserve(INVEN_TOTAL - INVEN_WIELD + 1); - a = TERM_WHITE; - if (got) - { - if (modetemp == 1 && x == 0 && y > 7 && y < 12) - { - a = TERM_L_GREEN; - } - else if (modetemp != 0) - { - a = TERM_GREEN; - } - } + // Scan equipment + for (std::size_t i = INVEN_WIELD; i < INVEN_TOTAL; i++) + { + // Skip inventory slots that don't exist on the body. + auto n = i - INVEN_WIELD; + if ((n < INVEN_TOTAL - INVEN_WIELD) && (!p_ptr->body_parts[n])) continue; - /* HACK - Check for nether immunity and change "Res Neth" */ - if (modetemp == 1 && x == 1 && y == 12 && p_ptr->immune_neth) - { - name = "Imm Neth"; - a = TERM_L_GREEN; - } + // Extract object flags + auto const o_ptr = &p_ptr->inventory[i]; + auto const flags = object_flags_known(o_ptr); + // Add slot + slots.emplace_back( + std::make_tuple('a' + i - INVEN_WIELD, o_ptr->pval, flags)); + } - /* Dump name */ - if (modetemp == 1 && x == 0 && y > 7 && y < 12) - { - if (got) Term_putstr(40, y - 4, -1, a, name); - } - else - { - Term_putstr(x * 40, y + 4, -1, a, name); - } + // Carried symbiote + { + // Extract flags + auto const flags = wield_monster_flags(); + // Add slot + slots.emplace_back( + std::make_tuple('z', 0, flags)); + } + + // Player + slots.emplace_back( + std::make_tuple('@', 0, player_flags())); + + // Go through each column + for (int col = 0; col < 2; col++) + { + // Base coordinate for output + const auto x0 = col * 40; + const auto y0 = 3; + + // Add slot headings. + { + std::string buf; + buf.reserve(slots.size()); + + for (auto const &slot: slots) + { + buf += std::get<0>(slot); + } + + Term_putstr(x0 + 11, y0, -1, TERM_WHITE, buf.c_str()); + } + + // Scan rows + for (int row = 0; row < 16; row++) + { + // Extract the flag metadata for the current page/col/row + auto const object_flag_metas_at_pcr = + object_flag_metas_by_pcr(page, col, row); + + // Ignore flags which we don't actually map to anything. + if (object_flag_metas_at_pcr.empty()) + { + continue; } + + // Y coordinate for the row + auto const y = y0 + 1 + row; + + // Show the row + display_flag_row(y, x0, slots, object_flag_metas_at_pcr); } } } +} // namespace /* * Display the character on the screen (various modes) @@ -4030,7 +4056,7 @@ static long total_points(void) object_kind *k_ptr = &k_info[k]; /* Hack -- skip artifacts */ - if (k_ptr->flags3 & (TR3_INSTA_ART)) continue; + if (k_ptr->flags & TR_INSTA_ART) continue; /* List known flavored objects */ if (k_ptr->flavor && k_ptr->aware) diff --git a/src/files.hpp b/src/files.hpp index d90f6660..35a10079 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -2,13 +2,14 @@ #include "h-basic.h" #include "monster_type_fwd.hpp" +#include "object_flag_set.hpp" #include #include extern void html_screenshot(cptr name); extern void help_file_screenshot(cptr name); -extern void player_flags(u32b* f1, u32b* f2, u32b* f3, u32b* f4, u32b* f5, u32b* esp); +extern object_flag_set player_flags(); extern void wipe_saved(void); extern s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2); extern void display_player(int mode); diff --git a/src/flag_set.hpp b/src/flag_set.hpp index 737513d5..7960de42 100644 --- a/src/flag_set.hpp +++ b/src/flag_set.hpp @@ -50,6 +50,14 @@ public: return f; } + static constexpr flag_set make_bit(std::size_t ibit) + { + assert(ibit < nbits); + flag_set f; + f.m_data[ibit / 32] = (1UL << (ibit % 32)); + return f; + } + constexpr std::size_t size() const { return tiers; diff --git a/src/flags_group.hpp b/src/flags_group.hpp index 8bd4bacb..84809e37 100644 --- a/src/flags_group.hpp +++ b/src/flags_group.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" /** * For level gaining artifacts @@ -12,9 +13,5 @@ struct flags_group byte price = 0; /* Price to "buy" it */ - u32b flags1 = 0; /* Flags set 1 */ - u32b flags2 = 0; /* Flags set 2 */ - u32b flags3 = 0; /* Flags set 3 */ - u32b flags4 = 0; /* Flags set 4 */ - u32b esp = 0; /* ESP flags set */ + object_flag_set flags; /* Flags set */ }; diff --git a/src/generate.cc b/src/generate.cc index 6474f6de..d1bcbe31 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -25,6 +25,7 @@ #include "monster_spell_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" @@ -823,7 +824,7 @@ static void place_fountain(int y, int x) object_kind *k_ptr = &k_info[k]; if (((k_ptr->tval == TV_POTION) || (k_ptr->tval == TV_POTION2)) && - (k_ptr->level <= dun_level) && (k_ptr->flags4 & TR4_FOUNTAIN)) + (k_ptr->level <= dun_level) && (k_ptr->flags & TR_FOUNTAIN)) { if (k_ptr->tval == TV_POTION2) svals[maxsval] = k_ptr->sval + SV_POTION_LAST; else svals[maxsval] = k_ptr->sval; diff --git a/src/help.cc b/src/help.cc index e8eec115..a0847af1 100644 --- a/src/help.cc +++ b/src/help.cc @@ -16,6 +16,7 @@ #include "hook_move_in.hpp" #include "hooks.hpp" #include "object1.hpp" +#include "object_flag.hpp" #include "options.hpp" #include "player_type.hpp" #include "skills.hpp" @@ -389,9 +390,8 @@ static bool_ trigger_identify_spell_item(void *in_, void *out) { if (in->mode == IDENT_FULL) { - u32b f1, f2, f3, f4, f5, esp; - object_flags(in->o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f5 & TR5_SPELL_CONTAIN) + auto const f = object_flags(in->o_ptr); + if (f & TR_SPELL_CONTAIN) { return TRUE; } 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; @@ -1263,19 +992,30 @@ static int get_activation(char *activation) return -1; } +/* + * 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; @@ -3058,39 +2801,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 */ @@ -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 */ diff --git a/src/init2.cc b/src/init2.cc index a539a470..678a018c 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -25,6 +25,7 @@ #include "monster_race.hpp" #include "monster_race_flag.hpp" #include "monster_type.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "owner_type.hpp" @@ -390,7 +391,7 @@ namespace { static void allocate() { - ra_info = make_array(max_ra_idx); + ra_info = new randart_part_type[max_ra_idx]; } static errr parse(FILE *fp) @@ -1110,16 +1111,14 @@ static void init_guardians(void) if (d_ptr->final_artifact) { artifact_type *a_ptr = &a_info[d_ptr->final_artifact]; - - a_ptr->flags4 |= TR4_SPECIAL_GENE; + a_ptr->flags |= TR_SPECIAL_GENE; } /* Mark the final object */ if (d_ptr->final_object) { object_kind *k_ptr = &k_info[d_ptr->final_object]; - - k_ptr->flags4 |= TR4_SPECIAL_GENE; + k_ptr->flags |= TR_SPECIAL_GENE; } /* Give randart if there are no final artifacts */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 3be0c39f..93f2679c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -358,12 +358,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < PY_MAX_LEVEL + 1; i++) { - do_u32b(&sr_ptr->oflags1[i], flag); - do_u32b(&sr_ptr->oflags2[i], flag); - do_u32b(&sr_ptr->oflags3[i], flag); - do_u32b(&sr_ptr->oflags4[i], flag); - do_u32b(&sr_ptr->oflags5[i], flag); - do_u32b(&sr_ptr->oesp[i], flag); + do_flag_set(&sr_ptr->oflags[i], flag); do_s16b(&sr_ptr->opval[i], flag); } @@ -1043,10 +1038,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) byte old_dd; byte old_ds; - u32b f1, f2, f3, f4, f5, esp; - - object_kind *k_ptr; - /* Kind */ do_s16b(&o_ptr->k_idx, flag); @@ -1099,20 +1090,10 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) do_byte(&o_ptr->marked, flag); /* flags */ - do_u32b(&o_ptr->art_flags1, flag); - do_u32b(&o_ptr->art_flags2, flag); - do_u32b(&o_ptr->art_flags3, flag); - do_u32b(&o_ptr->art_flags4, flag); - do_u32b(&o_ptr->art_flags5, flag); - do_u32b(&o_ptr->art_esp, flag); + do_flag_set(&o_ptr->art_flags, flag); /* obvious flags */ - do_u32b(&o_ptr->art_oflags1, flag); - do_u32b(&o_ptr->art_oflags2, flag); - do_u32b(&o_ptr->art_oflags3, flag); - do_u32b(&o_ptr->art_oflags4, flag); - do_u32b(&o_ptr->art_oflags5, flag); - do_u32b(&o_ptr->art_oesp, flag); + do_flag_set(&o_ptr->art_oflags, flag); /* Monster holding object */ do_s16b(&o_ptr->held_m_idx, flag); @@ -1177,7 +1158,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) /*********** END OF ls_flag_t::SAVE ***************/ /* Obtain the "kind" template */ - k_ptr = &k_info[o_ptr->k_idx]; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Obtain tval/sval from k_info */ o_ptr->tval = k_ptr->tval; @@ -1202,9 +1183,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) } - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - /* Paranoia */ if (o_ptr->name1) { diff --git a/src/melee2.cc b/src/melee2.cc index 9d09fb67..f52c7061 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -34,6 +34,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "options.hpp" #include "player_type.hpp" #include "quark.hpp" @@ -2571,7 +2572,6 @@ static bool_ monst_spell_monst(int m_idx) void curse_equipment(int chance, int heavy_chance) { bool_ changed = FALSE; - u32b o1, o2, o3, o4, esp, o5; object_type * o_ptr = &p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)]; @@ -2579,11 +2579,11 @@ void curse_equipment(int chance, int heavy_chance) if (!(o_ptr->k_idx)) return; - object_flags(o_ptr, &o1, &o2, &o3, &o4, &o5, &esp); + auto const flags = object_flags(o_ptr); /* Extra, biased saving throw for blessed items */ - if ((o3 & (TR3_BLESSED)) && (randint(888) > chance)) + if ((flags & TR_BLESSED) && (randint(888) > chance)) { char o_name[256]; object_desc(o_name, o_ptr, FALSE, 0); @@ -2596,17 +2596,17 @@ void curse_equipment(int chance, int heavy_chance) if ((randint(100) <= heavy_chance) && (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) { - if (!(o3 & TR3_HEAVY_CURSE)) + if (!(flags & TR_HEAVY_CURSE)) changed = TRUE; - o_ptr->art_flags3 |= TR3_HEAVY_CURSE; - o_ptr->art_flags3 |= TR3_CURSED; + o_ptr->art_flags |= TR_HEAVY_CURSE; + o_ptr->art_flags |= TR_CURSED; o_ptr->ident |= IDENT_CURSED; } else { - if (!(o_ptr->ident & (IDENT_CURSED))) + if (!(o_ptr->ident & IDENT_CURSED)) changed = TRUE; - o_ptr->art_flags3 |= TR3_CURSED; + o_ptr->art_flags |= TR_CURSED; o_ptr->ident |= IDENT_CURSED; } @@ -2627,7 +2627,7 @@ void curse_equipment(int chance, int heavy_chance) void curse_equipment_dg(int chance, int heavy_chance) { bool_ changed = FALSE; - u32b o1, o2, o3, o4, esp, o5; + object_type * o_ptr = &p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)]; @@ -2635,37 +2635,35 @@ void curse_equipment_dg(int chance, int heavy_chance) if (!(o_ptr->k_idx)) return; - object_flags(o_ptr, &o1, &o2, &o3, &o4, &o5, &esp); + auto const flags = object_flags(o_ptr); /* Extra, biased saving throw for blessed items */ - if ((o3 & (TR3_BLESSED)) && (randint(888) > chance)) + if ((flags & TR_BLESSED) && (randint(888) > chance)) { char o_name[256]; object_desc(o_name, o_ptr, FALSE, 0); msg_format("Your %s resist%s cursing!", o_name, ((o_ptr->number > 1) ? "" : "s")); - /* Hmmm -- can we wear multiple items? If not, this is unnecessary */ - /* DG -- Yes we can, in the quiver */ return; } if ((randint(100) <= heavy_chance) && (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) { - if (!(o3 & TR3_HEAVY_CURSE)) + if (!(flags & TR_HEAVY_CURSE)) changed = TRUE; - o_ptr->art_flags3 |= TR3_HEAVY_CURSE; - o_ptr->art_flags3 |= TR3_CURSED; - o_ptr->art_flags4 |= TR4_DG_CURSE; + o_ptr->art_flags |= TR_HEAVY_CURSE; + o_ptr->art_flags |= TR_CURSED; + o_ptr->art_flags |= TR_DG_CURSE; o_ptr->ident |= IDENT_CURSED; } else { - if (!(o_ptr->ident & (IDENT_CURSED))) + if (!(o_ptr->ident & IDENT_CURSED)) changed = TRUE; - o_ptr->art_flags3 |= TR3_CURSED; - o_ptr->art_flags4 |= TR4_DG_CURSE; + o_ptr->art_flags |= TR_CURSED; + o_ptr->art_flags |= TR_DG_CURSE; o_ptr->ident |= IDENT_CURSED; } @@ -6584,13 +6582,11 @@ static void process_monster(int m_idx, bool_ is_frien) (r_ptr->flags & RF_KILL_ITEM)) && (is_friend(m_ptr) <= 0)) { - u32b f1, f2, f3, f4, f5, esp; - char m_name[80]; char o_name[80]; /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Acquire the object name */ object_desc(o_name, o_ptr, TRUE, 3); @@ -6600,16 +6596,16 @@ static void process_monster(int m_idx, bool_ is_frien) /* React to objects that hurt the monster */ monster_race_flag_set flg; - if (f5 & (TR5_KILL_DEMON)) flg |= RF_DEMON; - if (f5 & (TR5_KILL_UNDEAD)) flg |= RF_UNDEAD; - if (f1 & (TR1_SLAY_DRAGON)) flg |= RF_DRAGON; - if (f1 & (TR1_SLAY_TROLL)) flg |= RF_TROLL; - if (f1 & (TR1_SLAY_GIANT)) flg |= RF_GIANT; - if (f1 & (TR1_SLAY_ORC)) flg |= RF_ORC; - if (f1 & (TR1_SLAY_DEMON)) flg |= RF_DEMON; - if (f1 & (TR1_SLAY_UNDEAD)) flg |= RF_UNDEAD; - if (f1 & (TR1_SLAY_ANIMAL)) flg |= RF_ANIMAL; - if (f1 & (TR1_SLAY_EVIL)) flg |= RF_EVIL; + if (flags & TR_KILL_DEMON) flg |= RF_DEMON; + if (flags & TR_KILL_UNDEAD) flg |= RF_UNDEAD; + if (flags & TR_SLAY_DRAGON) flg |= RF_DRAGON; + if (flags & TR_SLAY_TROLL) flg |= RF_TROLL; + if (flags & TR_SLAY_GIANT) flg |= RF_GIANT; + if (flags & TR_SLAY_ORC) flg |= RF_ORC; + if (flags & TR_SLAY_DEMON) flg |= RF_DEMON; + if (flags & TR_SLAY_UNDEAD) flg |= RF_UNDEAD; + if (flags & TR_SLAY_ANIMAL) flg |= RF_ANIMAL; + if (flags & TR_SLAY_EVIL) flg |= RF_EVIL; /* The object cannot be picked up by the monster */ if (artifact_p(o_ptr) || (r_ptr->flags & flg) || diff --git a/src/mimic.cc b/src/mimic.cc index 55622a41..c540c732 100644 --- a/src/mimic.cc +++ b/src/mimic.cc @@ -1,5 +1,6 @@ #include "mimic.hpp" +#include "object_flag.hpp" #include "player_type.hpp" #include "skill_type.hpp" #include "stats.hpp" @@ -37,8 +38,8 @@ struct mimic_form_type static s32b abomination_calc() { - apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10, 0, 0, 0, 0); - p_ptr->xtra_f3 |= TR3_AGGRAVATE; + apply_flags(TR_SPEED | TR_STR | TR_INT | TR_WIS | TR_DEX | TR_CON | TR_CHR, -10, 0, 0, 0, 0); + p_ptr->xtra_flags |= TR_AGGRAVATE; return 0; } @@ -89,23 +90,23 @@ static s32b eagle_calc() if (p_ptr->mimic_level >= 20) { - p_ptr->xtra_f4 |= TR4_FLY; - p_ptr->xtra_f3 |= TR3_SEE_INVIS; + p_ptr->xtra_flags |= TR_FLY; + p_ptr->xtra_flags |= TR_SEE_INVIS; } if (p_ptr->mimic_level >= 25) { - p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_flags |= TR_FREE_ACT; } if (p_ptr->mimic_level >= 30) { - p_ptr->xtra_f2 |= TR2_RES_ELEC; + p_ptr->xtra_flags |= TR_RES_ELEC; } if (p_ptr->mimic_level >= 35) { - p_ptr->xtra_f3 |= TR3_SH_ELEC; + p_ptr->xtra_flags |= TR_SH_ELEC; } return 0; @@ -120,27 +121,27 @@ static s32b wolf_calc() p_ptr->pspeed = p_ptr->pspeed + 10 + (p_ptr->mimic_level / 5); - p_ptr->xtra_f2 |= TR2_FREE_ACT; - p_ptr->xtra_f2 |= TR2_RES_FEAR; + p_ptr->xtra_flags |= TR_FREE_ACT; + p_ptr->xtra_flags |= TR_RES_FEAR; if (p_ptr->mimic_level >= 10) { - p_ptr->xtra_f2 |= TR2_RES_COLD; + p_ptr->xtra_flags |= TR_RES_COLD; } if (p_ptr->mimic_level >= 15) { - p_ptr->xtra_f3 |= TR3_SEE_INVIS; + p_ptr->xtra_flags |= TR_SEE_INVIS; } if (p_ptr->mimic_level >= 30) { - p_ptr->xtra_f2 |= TR2_RES_DARK; + p_ptr->xtra_flags |= TR_RES_DARK; } if (p_ptr->mimic_level >= 35) { - p_ptr->xtra_f2 |= TR2_RES_CONF; + p_ptr->xtra_flags |= TR_RES_CONF; } return 0; @@ -157,13 +158,13 @@ static s32b spider_calc() p_ptr->pspeed = p_ptr->pspeed + 5; - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f2 |= TR2_RES_FEAR; - p_ptr->xtra_f2 |= TR2_RES_DARK; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_RES_FEAR; + p_ptr->xtra_flags |= TR_RES_DARK; if (p_ptr->mimic_level >= 40) { - p_ptr->xtra_f4 |= TR4_CLIMB; + p_ptr->xtra_flags |= TR_CLIMB; } return 0; @@ -191,12 +192,12 @@ static s32b ent_calc() p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 5; p_ptr->stat_add[A_CHR] += -7; - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f2 |= TR2_RES_COLD; - p_ptr->xtra_f2 |= TR2_FREE_ACT; - p_ptr->xtra_f3 |= TR3_REGEN; - p_ptr->xtra_f3 |= TR3_SEE_INVIS; - p_ptr->xtra_f2 |= TR2_SENS_FIRE; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_RES_COLD; + p_ptr->xtra_flags |= TR_FREE_ACT; + p_ptr->xtra_flags |= TR_REGEN; + p_ptr->xtra_flags |= TR_SEE_INVIS; + p_ptr->xtra_flags |= TR_SENS_FIRE; return 0; } @@ -226,14 +227,14 @@ static s32b vapour_calc() /* But they are stealthy */ p_ptr->skill_stl = p_ptr->skill_stl + 10 + (p_ptr->mimic_level / 5); - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f2 |= TR2_RES_SHARDS; - p_ptr->xtra_f2 |= TR2_IM_COLD; - p_ptr->xtra_f2 |= TR2_FREE_ACT; - p_ptr->xtra_f3 |= TR3_REGEN; - p_ptr->xtra_f3 |= TR3_SEE_INVIS; - p_ptr->xtra_f2 |= TR2_SENS_FIRE; - p_ptr->xtra_f3 |= TR3_FEATHER; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_RES_SHARDS; + p_ptr->xtra_flags |= TR_IM_COLD; + p_ptr->xtra_flags |= TR_FREE_ACT; + p_ptr->xtra_flags |= TR_REGEN; + p_ptr->xtra_flags |= TR_SEE_INVIS; + p_ptr->xtra_flags |= TR_SENS_FIRE; + p_ptr->xtra_flags |= TR_FEATHER; return 0; } @@ -252,10 +253,10 @@ static s32b serpent_calc() p_ptr->stat_add[A_CON] += p_ptr->mimic_level / 7; p_ptr->stat_add[A_CHR] += -6; - p_ptr->xtra_f2 |= TR2_RES_POIS; + p_ptr->xtra_flags |= TR_RES_POIS; if (p_ptr->mimic_level >= 25) { - p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_flags |= TR_FREE_ACT; } return 0; @@ -279,22 +280,22 @@ static s32b mumak_calc() if (p_ptr->mimic_level >= 10) { - p_ptr->xtra_f2 |= TR2_RES_FEAR; + p_ptr->xtra_flags |= TR_RES_FEAR; } if (p_ptr->mimic_level >= 25) { - p_ptr->xtra_f2 |= TR2_RES_CONF; + p_ptr->xtra_flags |= TR_RES_CONF; } if (p_ptr->mimic_level >= 30) { - p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_flags |= TR_FREE_ACT; } if (p_ptr->mimic_level >= 35) { - p_ptr->xtra_f2 |= TR2_RES_NEXUS; + p_ptr->xtra_flags |= TR_RES_NEXUS; } return 0; @@ -316,22 +317,22 @@ static s32b bear_calc() if (p_ptr->mimic_level >= 10) { - p_ptr->xtra_f2 |= TR2_FREE_ACT; + p_ptr->xtra_flags |= TR_FREE_ACT; } if (p_ptr->mimic_level >= 20) { - p_ptr->xtra_f3 |= TR3_REGEN; + p_ptr->xtra_flags |= TR_REGEN; } if (p_ptr->mimic_level >= 30) { - p_ptr->xtra_f2 |= TR2_RES_CONF; + p_ptr->xtra_flags |= TR_RES_CONF; } if (p_ptr->mimic_level >= 35) { - p_ptr->xtra_f2 |= TR2_RES_NEXUS; + p_ptr->xtra_flags |= TR_RES_NEXUS; } /* activate the skill */ @@ -349,17 +350,17 @@ static s32b balrog_calc() p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5; p_ptr->stat_add[A_CHR] += - ( 5 + p_ptr->mimic_level / 10); - p_ptr->xtra_f2 |= TR2_IM_ACID; - p_ptr->xtra_f2 |= TR2_IM_FIRE; - p_ptr->xtra_f2 |= TR2_IM_ELEC; - p_ptr->xtra_f2 |= TR2_RES_DARK; - p_ptr->xtra_f2 |= TR2_RES_CHAOS; - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f2 |= TR2_HOLD_LIFE; - p_ptr->xtra_f3 |= TR3_FEATHER; - p_ptr->xtra_f3 |= TR3_REGEN; - p_ptr->xtra_f3 |= TR3_SH_FIRE; - p_ptr->xtra_f3 |= TR3_LITE1; + p_ptr->xtra_flags |= TR_IM_ACID; + p_ptr->xtra_flags |= TR_IM_FIRE; + p_ptr->xtra_flags |= TR_IM_ELEC; + p_ptr->xtra_flags |= TR_RES_DARK; + p_ptr->xtra_flags |= TR_RES_CHAOS; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_HOLD_LIFE; + p_ptr->xtra_flags |= TR_FEATHER; + p_ptr->xtra_flags |= TR_REGEN; + p_ptr->xtra_flags |= TR_SH_FIRE; + p_ptr->xtra_flags |= TR_LITE1; return 1; /* Adds a blow */ } @@ -373,17 +374,17 @@ static s32b maia_calc() p_ptr->stat_add[A_CON] += 5 + p_ptr->mimic_level / 5; p_ptr->stat_add[A_CHR] += 5 + p_ptr->mimic_level / 5; - p_ptr->xtra_f2 |= TR2_IM_FIRE; - p_ptr->xtra_f2 |= TR2_IM_ELEC; - p_ptr->xtra_f2 |= TR2_IM_ACID; - p_ptr->xtra_f2 |= TR2_IM_COLD; - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f2 |= TR2_RES_LITE; - p_ptr->xtra_f2 |= TR2_RES_DARK; - p_ptr->xtra_f2 |= TR2_RES_CHAOS; - p_ptr->xtra_f2 |= TR2_HOLD_LIFE; - p_ptr->xtra_f3 |= TR3_FEATHER; - p_ptr->xtra_f3 |= TR3_REGEN; + p_ptr->xtra_flags |= TR_IM_FIRE; + p_ptr->xtra_flags |= TR_IM_ELEC; + p_ptr->xtra_flags |= TR_IM_ACID; + p_ptr->xtra_flags |= TR_IM_COLD; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_RES_LITE; + p_ptr->xtra_flags |= TR_RES_DARK; + p_ptr->xtra_flags |= TR_RES_CHAOS; + p_ptr->xtra_flags |= TR_HOLD_LIFE; + p_ptr->xtra_flags |= TR_FEATHER; + p_ptr->xtra_flags |= TR_REGEN; return 2; /* Add two blows */ } @@ -394,10 +395,10 @@ static s32b fire_elemental_calc() p_ptr->stat_add[A_DEX] += 5 + (p_ptr->mimic_level / 5); p_ptr->stat_add[A_WIS] += -5 - (p_ptr->mimic_level / 5); - p_ptr->xtra_f2 |= TR2_IM_FIRE; - p_ptr->xtra_f2 |= TR2_RES_POIS; - p_ptr->xtra_f3 |= TR3_SH_FIRE; - p_ptr->xtra_f3 |= TR3_LITE1; + p_ptr->xtra_flags |= TR_IM_FIRE; + p_ptr->xtra_flags |= TR_RES_POIS; + p_ptr->xtra_flags |= TR_SH_FIRE; + p_ptr->xtra_flags |= TR_LITE1; return 0; } diff --git a/src/monoid.hpp b/src/monoid.hpp new file mode 100644 index 00000000..465e58af --- /dev/null +++ b/src/monoid.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + +/** + * A monoid is an algebraic structure with a single associative + * binary operation ('append') and an identity element ('empty'). + * + * See https://en.wikipedia.org/wiki/Monoid + * + * Shamelessly adapted from: + * + * https://gist.github.com/evincarofautumn/2b5f004ca81e33c62ff0 + */ +template +struct monoid { + /* Access the type the monoid operates on */ + typedef T type; + + /* Append two T's */ + static T append(T const& a, T const& b) { + return append_(a, b); + } + + /* The value of an empty T */ + static constexpr T empty = empty_; +}; + +/** + * mconcat :: (Monoid m mappend) -> [m] -> m + * mconcat = fold mappend mempty + */ +template +typename M::type mconcat(const std::vector& xs) { + return std::accumulate(std::begin(xs), std::end(xs), M::empty, M::append); +} diff --git a/src/monster2.cc b/src/monster2.cc index b1419b0a..e5957770 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -27,6 +27,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -484,7 +485,7 @@ void delete_monster_idx(int i) { random_artifacts[o_ptr->sval].generated = FALSE; } - else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { k_info[o_ptr->k_idx].artifact = FALSE; } @@ -1670,26 +1671,25 @@ void update_mon(int m_idx, bool_ full) } /* Telepathy can see all "nearby" monsters with "minds" */ - if (p_ptr->telepathy) { /* Assume we cant see */ - bool_ can_esp = FALSE; + bool can_esp = false; /* Different ESP */ - if ((p_ptr->telepathy & ESP_ORC) && (r_ptr->flags & RF_ORC)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_SPIDER) && (r_ptr->flags & RF_SPIDER)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_TROLL) && (r_ptr->flags & RF_TROLL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_DRAGON) && (r_ptr->flags & RF_DRAGON)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_GIANT) && (r_ptr->flags & RF_GIANT)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_DEMON) && (r_ptr->flags & RF_DEMON)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_EVIL) && (r_ptr->flags & RF_EVIL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_THUNDERLORD) && (r_ptr->flags & RF_THUNDERLORD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_GOOD) && (r_ptr->flags & RF_GOOD)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_NONLIVING) && (r_ptr->flags & RF_NONLIVING)) can_esp = TRUE; - if ((p_ptr->telepathy & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE) || (r_ptr->flags & RF_UNIQUE_4))) can_esp = TRUE; - if (p_ptr->telepathy & ESP_ALL) can_esp = TRUE; + can_esp |= ((p_ptr->computed_flags & ESP_ORC) && (r_ptr->flags & RF_ORC)); + can_esp |= ((p_ptr->computed_flags & ESP_SPIDER) && (r_ptr->flags & RF_SPIDER)); + can_esp |= ((p_ptr->computed_flags & ESP_TROLL) && (r_ptr->flags & RF_TROLL)); + can_esp |= ((p_ptr->computed_flags & ESP_DRAGON) && (r_ptr->flags & RF_DRAGON)); + can_esp |= ((p_ptr->computed_flags & ESP_GIANT) && (r_ptr->flags & RF_GIANT)); + can_esp |= ((p_ptr->computed_flags & ESP_DEMON) && (r_ptr->flags & RF_DEMON)); + can_esp |= ((p_ptr->computed_flags & ESP_UNDEAD) && (r_ptr->flags & RF_UNDEAD)); + can_esp |= ((p_ptr->computed_flags & ESP_EVIL) && (r_ptr->flags & RF_EVIL)); + can_esp |= ((p_ptr->computed_flags & ESP_ANIMAL) && (r_ptr->flags & RF_ANIMAL)); + can_esp |= ((p_ptr->computed_flags & ESP_THUNDERLORD) && (r_ptr->flags & RF_THUNDERLORD)); + can_esp |= ((p_ptr->computed_flags & ESP_GOOD) && (r_ptr->flags & RF_GOOD)); + can_esp |= ((p_ptr->computed_flags & ESP_NONLIVING) && (r_ptr->flags & RF_NONLIVING)); + can_esp |= ((p_ptr->computed_flags & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE) || (r_ptr->flags & RF_UNIQUE_4))); + can_esp |= bool(p_ptr->computed_flags & ESP_ALL); /* Only do this when we can really detect monster */ if (can_esp) @@ -1880,7 +1880,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) { a_info[q_ptr->name1].cur_num = 0; } - else if (k_info[q_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[q_ptr->k_idx].flags & TR_NORM_ART) { k_info[q_ptr->k_idx].artifact = 0; } diff --git a/src/object1.cc b/src/object1.cc index d68775df..5aa53c7f 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -29,6 +29,9 @@ #include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object2.hpp" +#include "object_flag.hpp" +#include "object_flag_meta.hpp" +#include "object_flag_set.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -60,8 +63,7 @@ using boost::starts_with; -static bool_ apply_flags_set(s16b a_idx, s16b set_idx, - u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); +static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f); /* * Hack -- note that "TERM_MULTI" is now just "TERM_VIOLET". @@ -433,7 +435,7 @@ static bool_ object_easy_know(int i) case TV_ROD: case TV_ROD_MAIN: { - if (k_ptr->flags3 & TR3_NORM_ART) + if (k_ptr->flags & TR_NORM_ART) return ( FALSE ); return (TRUE); } @@ -443,7 +445,7 @@ static bool_ object_easy_know(int i) case TV_AMULET: case TV_LITE: { - if (k_ptr->flags3 & (TR3_EASY_KNOW)) return (TRUE); + if (k_ptr->flags & TR_EASY_KNOW) return (TRUE); return (FALSE); } } @@ -779,8 +781,15 @@ void reset_visuals(void) /* * Extract "xtra" flags from object. */ -static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b *esp) +static void object_flags_xtra(object_type const *o_ptr, object_flag_set *f) { + // Artifacts don't get *ego* extra powers. + if (o_ptr->art_name) + { + return; + } + + // Add sustain or power. switch (o_ptr->xtra1) { case EGO_XTRA_SUSTAIN: @@ -789,22 +798,22 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b switch (o_ptr->xtra2 % 6) { case 0: - (*f2) |= (TR2_SUST_STR); + (*f) |= TR_SUST_STR; break; case 1: - (*f2) |= (TR2_SUST_INT); + (*f) |= TR_SUST_INT; break; case 2: - (*f2) |= (TR2_SUST_WIS); + (*f) |= TR_SUST_WIS; break; case 3: - (*f2) |= (TR2_SUST_DEX); + (*f) |= TR_SUST_DEX; break; case 4: - (*f2) |= (TR2_SUST_CON); + (*f) |= TR_SUST_CON; break; case 5: - (*f2) |= (TR2_SUST_CHR); + (*f) |= TR_SUST_CHR; break; } @@ -817,37 +826,37 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b switch (o_ptr->xtra2 % 11) { case 0: - (*f2) |= (TR2_RES_BLIND); + (*f) |= TR_RES_BLIND; break; case 1: - (*f2) |= (TR2_RES_CONF); + (*f) |= TR_RES_CONF; break; case 2: - (*f2) |= (TR2_RES_SOUND); + (*f) |= TR_RES_SOUND; break; case 3: - (*f2) |= (TR2_RES_SHARDS); + (*f) |= TR_RES_SHARDS; break; case 4: - (*f2) |= (TR2_RES_NETHER); + (*f) |= TR_RES_NETHER; break; case 5: - (*f2) |= (TR2_RES_NEXUS); + (*f) |= TR_RES_NEXUS; break; case 6: - (*f2) |= (TR2_RES_CHAOS); + (*f) |= TR_RES_CHAOS; break; case 7: - (*f2) |= (TR2_RES_DISEN); + (*f) |= TR_RES_DISEN; break; case 8: - (*f2) |= (TR2_RES_POIS); + (*f) |= TR_RES_POIS; break; case 9: - (*f2) |= (TR2_RES_DARK); + (*f) |= TR_RES_DARK; break; case 10: - (*f2) |= (TR2_RES_LITE); + (*f) |= TR_RES_LITE; break; } @@ -857,52 +866,41 @@ static void object_flags_xtra(object_type const *o_ptr, u32b *f2, u32b *f3, u32b } } +/* + * Disregard sets when calculating flags? + */ +bool_ object_flags_no_set = FALSE; /* * Obtain the "flags" for an item */ -bool_ object_flags_no_set = FALSE; -void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) +object_flag_set object_flags(object_type const *o_ptr) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Base object */ - (*f1) = k_ptr->flags1; - (*f2) = k_ptr->flags2; - (*f3) = k_ptr->flags3; - (*f4) = k_ptr->flags4; - (*f5) = k_ptr->flags5; - (*esp) = k_ptr->esp; + auto f = k_ptr->flags; /* Artifact */ if (o_ptr->name1) { artifact_type *a_ptr = &a_info[o_ptr->name1]; - (*f1) = a_ptr->flags1; - (*f2) = a_ptr->flags2; - (*f3) = a_ptr->flags3; - (*f4) = a_ptr->flags4; - (*f5) = a_ptr->flags5; - (*esp) = a_ptr->esp; + f = a_ptr->flags; if ((!object_flags_no_set) && (a_ptr->set != -1)) - apply_flags_set(o_ptr->name1, a_ptr->set, f1, f2, f3, f4, f5, esp); + { + apply_flags_set(o_ptr->name1, a_ptr->set, &f); + } } - /* Mix in art_{flagsX,esp} */ - (*f1) |= o_ptr->art_flags1; - (*f2) |= o_ptr->art_flags2; - (*f3) |= o_ptr->art_flags3; - (*f4) |= o_ptr->art_flags4; - (*f5) |= o_ptr->art_flags5; - (*esp) |= o_ptr->art_esp; + /* Mix in art_{flags,esp} */ + f |= o_ptr->art_flags; /* Extra powers */ - if (!(o_ptr->art_name)) - { - object_flags_xtra(o_ptr, f2, f3, esp); - } + object_flags_xtra(o_ptr, &f); + + return f; } /* Return object granted power */ @@ -945,30 +943,21 @@ int object_power(object_type *o_ptr) /* * Obtain the "flags" for an item which are known to the player */ -void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) +object_flag_set object_flags_known(object_type const *o_ptr) { object_kind *k_ptr = &k_info[o_ptr->k_idx]; - /* Clear */ - (*f1) = (*f2) = (*f3) = (*f4) = (*esp) = (*f5) = 0L; - /* Must be identified */ - if (!object_known_p(o_ptr)) return; + if (!object_known_p(o_ptr)) + { + return object_flag_set(); + } /* Base object */ - (*f1) = k_ptr->flags1; - (*f2) = k_ptr->flags2; - (*f3) = k_ptr->flags3; - (*f4) = k_ptr->flags4; - (*f5) = k_ptr->flags5; - (*esp) = k_ptr->esp; - - (*f1) |= k_ptr->oflags1; - (*f2) |= k_ptr->oflags2; - (*f3) |= k_ptr->oflags3; - (*f4) |= k_ptr->oflags4; - (*f5) |= k_ptr->oflags5; - (*esp) |= k_ptr->oesp; + auto flags = k_ptr->flags; + + /* Obvious flags */ + flags |= k_ptr->oflags; /* Artifact */ if (o_ptr->name1) @@ -978,61 +967,50 @@ void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, /* Need full knowledge or spoilers */ if ((o_ptr->ident & IDENT_MENTAL)) { - (*f1) = a_ptr->flags1; - (*f2) = a_ptr->flags2; - (*f3) = a_ptr->flags3; - (*f4) = a_ptr->flags4; - (*f5) = a_ptr->flags5; - (*esp) = a_ptr->esp; + flags = a_ptr->flags; if ((!object_flags_no_set) && (a_ptr->set != -1)) - apply_flags_set(o_ptr->name1, a_ptr->set, f1, f2, f3, f4, f5, esp); + { + apply_flags_set(o_ptr->name1, a_ptr->set, &flags); + } } else { - (*f1) = (*f2) = (*f3) = (*f4) = (*esp) = (*f5) = 0L; + flags = object_flag_set(); } - (*f1) |= a_ptr->oflags1; - (*f2) |= a_ptr->oflags2; - (*f3) |= a_ptr->oflags3; - (*f4) |= a_ptr->oflags4; - (*f5) |= a_ptr->oflags5; - (*esp) |= a_ptr->oesp; + flags |= a_ptr->oflags; } /* Random artifact or ego item! */ - if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3 || o_ptr->art_flags4 || o_ptr->art_flags5 || o_ptr->art_esp) + if (o_ptr->art_flags) { /* Need full knowledge or spoilers */ if ((o_ptr->ident & IDENT_MENTAL)) { - (*f1) |= o_ptr->art_flags1; - (*f2) |= o_ptr->art_flags2; - (*f3) |= o_ptr->art_flags3; - (*f4) |= o_ptr->art_flags4; - (*f5) |= o_ptr->art_flags5; - (*esp) |= o_ptr->art_esp; + flags |= o_ptr->art_flags; } - (*f1) |= o_ptr->art_oflags1; - (*f2) |= o_ptr->art_oflags2; - (*f3) |= o_ptr->art_oflags3; - (*f4) |= o_ptr->art_oflags4; - (*f5) |= o_ptr->art_oflags5; - (*esp) |= o_ptr->art_oesp; + flags |= o_ptr->art_oflags; } /* Full knowledge for *identified* objects */ - if (!(o_ptr->ident & IDENT_MENTAL)) return; - - if (!(o_ptr->art_name)) + if (!(o_ptr->ident & IDENT_MENTAL)) { - object_flags_xtra(o_ptr, f2, f3, esp); + return flags; } + /* Extra powers */ + object_flags_xtra(o_ptr, &flags); + /* Hack - Res Chaos -> Res Confusion */ - if (*f2 & TR2_RES_CHAOS) (*f2) |= (TR2_RES_CONF); + if (flags & TR_RES_CHAOS) + { + flags |= TR_RES_CONF; + } + + // Done + return flags; } @@ -1046,6 +1024,23 @@ s32b calc_object_need_exp(object_type const *o_ptr) } +/** + * Calculate the PVAL mask. + */ +static object_flag_set compute_pval_mask() +{ + object_flag_set f; + for (auto const object_flag_meta: object_flags_meta()) + { + if (object_flag_meta->is_pval) + { + f |= object_flag_meta->flag_set; + } + } + return f; +} + + /* * Creates a description of the item "o_ptr", and stores it in "out_val". @@ -1094,6 +1089,8 @@ s32b calc_object_need_exp(object_type const *o_ptr) */ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { + static auto const TR_PVAL_MASK = compute_pval_mask(); + bool_ hack_name = FALSE; bool_ append_name = FALSE; @@ -1104,8 +1101,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Extract some flags */ - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* See if the object is "aware" */ bool_ aware = object_aware_p(o_ptr); @@ -1468,7 +1464,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Mega Hack */ - if ((!hack_name) && known && (k_ptr->flags5 & TR5_FULL_NAME)) + if ((!hack_name) && known && (k_ptr->flags & TR_FULL_NAME)) { basenm = k_ptr->name; } @@ -1804,7 +1800,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* It contains a spell */ - if ((known) && (f5 & TR5_SPELL_CONTAIN) && (o_ptr->pval2 != -1)) + if (known && (flags & TR_SPELL_CONTAIN) && (o_ptr->pval2 != -1)) { t += fmt::format(" [{}]", spell_type_name(spell_at(o_ptr->pval2))); } @@ -1822,7 +1818,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Hack -- Some objects can have an exp level */ - if ((f4 & TR4_LEVELS) && known) + if ((flags & TR_LEVELS) && known) { auto need_exp = (o_ptr->elevel < PY_MAX_LEVEL) ? std::to_string(calc_object_need_exp(o_ptr) - o_ptr->exp) @@ -1865,7 +1861,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Display the item like a weapon */ - if (f3 & (TR3_SHOW_MODS)) show_weapon = TRUE; + if (flags & TR_SHOW_MODS) show_weapon = TRUE; /* Display the item like a weapon */ if (o_ptr->to_h && o_ptr->to_d) show_weapon = TRUE; @@ -1908,7 +1904,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) s32b power = (o_ptr->sval % 10); /* Apply the "Extra Might" flag */ - if (f3 & (TR3_XTRA_MIGHT)) power += o_ptr->pval; + if (flags & TR_XTRA_MIGHT) power += o_ptr->pval; /* Append a special "damage" string */ t += fmt::format(" (x{:d})", power); @@ -1931,7 +1927,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) else if (o_ptr->to_h) { t += fmt::format(" ({:+d}", o_ptr->to_h); - if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name) + if (!(flags & TR_HIDE_TYPE) || o_ptr->art_name) { t += " to accuracy"; } @@ -1942,7 +1938,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) else if (o_ptr->to_d) { t += fmt::format(" ({:+d}", o_ptr->to_d); - if (!(f3 & (TR3_HIDE_TYPE)) || o_ptr->art_name) + if (!(flags & TR_HIDE_TYPE) || o_ptr->art_name) { t += " to damage"; } @@ -1973,12 +1969,12 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) t += fmt::format(" [{:d}]", o_ptr->ac); } - if ((f1 & TR1_MANA) && (known) && (o_ptr->pval > 0)) + if ((flags & TR_MANA) && known && (o_ptr->pval > 0)) { t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5); } - if ((known) && (f2 & TR2_LIFE) ) /* Can disp neg now -- Improv */ + if (known && (flags & TR_LIFE) ) /* Can disp neg now -- Improv */ { t += fmt::format("({:d}%)", 100 * o_ptr->pval / 5); } @@ -2016,32 +2012,32 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Hack -- Process Lanterns/Torches */ - else if ((o_ptr->tval == TV_LITE) && (f4 & TR4_FUEL_LITE)) + else if ((o_ptr->tval == TV_LITE) && (flags & TR_FUEL_LITE)) { t += fmt::format(" (with {:d} turns of light)", o_ptr->timeout); } /* Dump "pval" flags for wearable items */ - if (known && ((f1 & (TR1_PVAL_MASK)) || (f5 & (TR5_PVAL_MASK)))) + if (known && (flags & TR_PVAL_MASK)) { /* Start the display */ t += fmt::format(" ({:+d}", o_ptr->pval); /* Do not display the "pval" flags */ - if (f3 & (TR3_HIDE_TYPE)) + if (flags & TR_HIDE_TYPE) { /* Nothing */ } /* Speed */ - else if (f1 & (TR1_SPEED)) + else if (flags & TR_SPEED) { t += " to speed"; } /* Attack speed */ - else if (f1 & (TR1_BLOWS)) + else if (flags & TR_BLOWS) { t += " attack"; if (ABS(o_ptr->pval) != 1) @@ -2051,31 +2047,31 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Critical chance */ - else if (f5 & (TR5_CRIT)) + else if (flags & TR_CRIT) { t += "% of critical hits"; } /* Stealth */ - else if (f1 & (TR1_STEALTH)) + else if (flags & TR_STEALTH) { t += " to stealth"; } /* Search */ - else if (f1 & (TR1_SEARCH)) + else if (flags & TR_SEARCH) { t += " to searching"; } /* Infravision */ - else if (f1 & (TR1_INFRA)) + else if (flags & TR_INFRA) { t += " to infravision"; } /* Tunneling */ - else if (f1 & (TR1_TUNNEL)) + else if (flags & TR_TUNNEL) { /* Nothing */ } @@ -2086,7 +2082,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Indicate "charging" artifacts XXX XXX XXX */ - if (known && (f3 & TR3_ACTIVATE) && o_ptr->timeout) + if (known && (flags & TR_ACTIVATE) && o_ptr->timeout) { if (o_ptr->tval == TV_EGG) { @@ -2227,16 +2223,14 @@ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode) */ cptr item_activation(object_type *o_ptr, byte num) { - u32b f1, f2, f3, f4, f5, esp; - /* Needed hacks */ static char rspell[2][80]; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Require activation ability */ - if (!(f3 & (TR3_ACTIVATE))) return (NULL); + if (!(flags & TR_ACTIVATE)) return (NULL); /* @@ -2366,12 +2360,11 @@ void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr agai void display_weapon_damage(object_type *o_ptr) { object_type forge, *old_ptr = &forge; - u32b f1, f2, f3, f4, f5, esp; bool_ first = TRUE; bool_ full = o_ptr->ident & (IDENT_MENTAL); /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Ok now the hackish stuff, we replace the current weapon with this one */ object_copy(old_ptr, &p_ptr->inventory[INVEN_WIELD]); @@ -2382,23 +2375,23 @@ void display_weapon_damage(object_type *o_ptr) text_out_c(TERM_L_GREEN, format("%d ", p_ptr->num_blow)); text_out(format("blow%s and do an average damage per turn of ", (p_ptr->num_blow) ? "s" : "")); - if (full && (f1 & TR1_SLAY_ANIMAL)) output_dam(o_ptr, 2, 0, "animals", NULL, &first); - if (full && (f1 & TR1_SLAY_EVIL)) output_dam(o_ptr, 2, 0, "evil creatures", NULL, &first); - if (full && (f1 & TR1_SLAY_ORC)) output_dam(o_ptr, 3, 0, "orcs", NULL, &first); - if (full && (f1 & TR1_SLAY_TROLL)) output_dam(o_ptr, 3, 0, "trolls", NULL, &first); - if (full && (f1 & TR1_SLAY_GIANT)) output_dam(o_ptr, 3, 0, "giants", NULL, &first); - if (full && (f1 & TR1_KILL_DRAGON)) output_dam(o_ptr, 5, 0, "dragons", NULL, &first); - else if (full && (f1 & TR1_SLAY_DRAGON)) output_dam(o_ptr, 3, 0, "dragons", NULL, &first); - if (full && (f5 & TR5_KILL_UNDEAD)) output_dam(o_ptr, 5, 0, "undead", NULL, &first); - else if (full && (f1 & TR1_SLAY_UNDEAD)) output_dam(o_ptr, 3, 0, "undead", NULL, &first); - if (full && (f5 & TR5_KILL_DEMON)) output_dam(o_ptr, 5, 0, "demons", NULL, &first); - else if (full && (f1 & TR1_SLAY_DEMON)) output_dam(o_ptr, 3, 0, "demons", NULL, &first); - - if (full && (f1 & TR1_BRAND_FIRE)) output_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_COLD)) output_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_ELEC)) output_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_ACID)) output_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_POIS)) output_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first); + if (full && (flags & TR_SLAY_ANIMAL)) output_dam(o_ptr, 2, 0, "animals", NULL, &first); + if (full && (flags & TR_SLAY_EVIL)) output_dam(o_ptr, 2, 0, "evil creatures", NULL, &first); + if (full && (flags & TR_SLAY_ORC)) output_dam(o_ptr, 3, 0, "orcs", NULL, &first); + if (full && (flags & TR_SLAY_TROLL)) output_dam(o_ptr, 3, 0, "trolls", NULL, &first); + if (full && (flags & TR_SLAY_GIANT)) output_dam(o_ptr, 3, 0, "giants", NULL, &first); + if (full && (flags & TR_KILL_DRAGON)) output_dam(o_ptr, 5, 0, "dragons", NULL, &first); + else if (full && (flags & TR_SLAY_DRAGON)) output_dam(o_ptr, 3, 0, "dragons", NULL, &first); + if (full && (flags & TR_KILL_UNDEAD)) output_dam(o_ptr, 5, 0, "undead", NULL, &first); + else if (full && (flags & TR_SLAY_UNDEAD)) output_dam(o_ptr, 3, 0, "undead", NULL, &first); + if (full && (flags & TR_KILL_DEMON)) output_dam(o_ptr, 5, 0, "demons", NULL, &first); + else if (full && (flags & TR_SLAY_DEMON)) output_dam(o_ptr, 3, 0, "demons", NULL, &first); + + if (full && (flags & TR_BRAND_FIRE)) output_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first); + if (full && (flags & TR_BRAND_COLD)) output_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first); + if (full && (flags & TR_BRAND_ELEC)) output_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first); + if (full && (flags & TR_BRAND_ACID)) output_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first); + if (full && (flags & TR_BRAND_POIS)) output_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first); output_dam(o_ptr, 1, 0, (first) ? "all monsters" : "other monsters", NULL, &first); @@ -2465,35 +2458,34 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr */ void display_ammo_damage(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; bool_ first = TRUE; int i; bool_ full = o_ptr->ident & (IDENT_MENTAL); /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); if (o_ptr->tval == TV_BOOMERANG) text_out("\nUsing it you would do an average damage per throw of "); else text_out("\nUsing it with your current shooter you would do an average damage per shot of "); - if (full && (f1 & TR1_SLAY_ANIMAL)) output_ammo_dam(o_ptr, 2, 0, "animals", NULL, &first); - if (full && (f1 & TR1_SLAY_EVIL)) output_ammo_dam(o_ptr, 2, 0, "evil creatures", NULL, &first); - if (full && (f1 & TR1_SLAY_ORC)) output_ammo_dam(o_ptr, 3, 0, "orcs", NULL, &first); - if (full && (f1 & TR1_SLAY_TROLL)) output_ammo_dam(o_ptr, 3, 0, "trolls", NULL, &first); - if (full && (f1 & TR1_SLAY_GIANT)) output_ammo_dam(o_ptr, 3, 0, "giants", NULL, &first); - if (full && (f1 & TR1_KILL_DRAGON)) output_ammo_dam(o_ptr, 5, 0, "dragons", NULL, &first); - else if (full && (f1 & TR1_SLAY_DRAGON)) output_ammo_dam(o_ptr, 3, 0, "dragons", NULL, &first); - if (full && (f5 & TR5_KILL_UNDEAD)) output_ammo_dam(o_ptr, 5, 0, "undeads", NULL, &first); - else if (full && (f1 & TR1_SLAY_UNDEAD)) output_ammo_dam(o_ptr, 3, 0, "undeads", NULL, &first); - if (full && (f5 & TR5_KILL_DEMON)) output_ammo_dam(o_ptr, 5, 0, "demons", NULL, &first); - else if (full && (f1 & TR1_SLAY_DEMON)) output_ammo_dam(o_ptr, 3, 0, "demons", NULL, &first); - - if (full && (f1 & TR1_BRAND_FIRE)) output_ammo_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_COLD)) output_ammo_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_ELEC)) output_ammo_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_ACID)) output_ammo_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first); - if (full && (f1 & TR1_BRAND_POIS)) output_ammo_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first); + if (full && (flags & TR_SLAY_ANIMAL)) output_ammo_dam(o_ptr, 2, 0, "animals", NULL, &first); + if (full && (flags & TR_SLAY_EVIL)) output_ammo_dam(o_ptr, 2, 0, "evil creatures", NULL, &first); + if (full && (flags & TR_SLAY_ORC)) output_ammo_dam(o_ptr, 3, 0, "orcs", NULL, &first); + if (full && (flags & TR_SLAY_TROLL)) output_ammo_dam(o_ptr, 3, 0, "trolls", NULL, &first); + if (full && (flags & TR_SLAY_GIANT)) output_ammo_dam(o_ptr, 3, 0, "giants", NULL, &first); + if (full && (flags & TR_KILL_DRAGON)) output_ammo_dam(o_ptr, 5, 0, "dragons", NULL, &first); + else if (full && (flags & TR_SLAY_DRAGON)) output_ammo_dam(o_ptr, 3, 0, "dragons", NULL, &first); + if (full && (flags & TR_KILL_UNDEAD)) output_ammo_dam(o_ptr, 5, 0, "undeads", NULL, &first); + else if (full && (flags & TR_SLAY_UNDEAD)) output_ammo_dam(o_ptr, 3, 0, "undeads", NULL, &first); + if (full && (flags & TR_KILL_DEMON)) output_ammo_dam(o_ptr, 5, 0, "demons", NULL, &first); + else if (full && (flags & TR_SLAY_DEMON)) output_ammo_dam(o_ptr, 3, 0, "demons", NULL, &first); + + if (full && (flags & TR_BRAND_FIRE)) output_ammo_dam(o_ptr, 3, 6, "non fire resistant creatures", "fire susceptible creatures", &first); + if (full && (flags & TR_BRAND_COLD)) output_ammo_dam(o_ptr, 3, 6, "non cold resistant creatures", "cold susceptible creatures", &first); + if (full && (flags & TR_BRAND_ELEC)) output_ammo_dam(o_ptr, 3, 6, "non lightning resistant creatures", "lightning susceptible creatures", &first); + if (full && (flags & TR_BRAND_ACID)) output_ammo_dam(o_ptr, 3, 6, "non acid resistant creatures", "acid susceptible creatures", &first); + if (full && (flags & TR_BRAND_POIS)) output_ammo_dam(o_ptr, 3, 6, "non poison resistant creatures", "poison susceptible creatures", &first); output_ammo_dam(o_ptr, 1, 0, (first) ? "all monsters" : "other monsters", NULL, &first); text_out(". "); @@ -2597,25 +2589,20 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon) */ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it) { - u32b f1, f2, f3, f4, f5, esp; - cptr vp[64]; byte vc[64]; int vn; + object_flag_set flags; + /* Extract the flags */ if ((!(o_ptr->ident & (IDENT_MENTAL))) && (!fff)) { - f1 = o_ptr->art_oflags1; - f2 = o_ptr->art_oflags2; - f3 = o_ptr->art_oflags3; - f4 = o_ptr->art_oflags4; - f5 = o_ptr->art_oflags5; - esp = o_ptr->art_oesp; + flags = o_ptr->art_oflags; } else { - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + flags = object_flags(o_ptr); } if (fff) @@ -2665,9 +2652,9 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } } - if ((f4 & TR4_LEVELS) && (!trim_down)) + if ((flags & TR_LEVELS) && (!trim_down)) { - if (count_bits(o_ptr->pval3) == 0) text_out("It is sentient"); + if (o_ptr->pval3 == 0) text_out("It is sentient"); else if (count_bits(o_ptr->pval3) > 1) text_out("It is sentient and can have access to the realms of "); else text_out("It is sentient and can have access to the realm of "); @@ -2684,7 +2671,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } - if (f4 & TR4_ULTIMATE) + if (flags & TR_ULTIMATE) { if ((wield_slot(o_ptr) == INVEN_WIELD) || (wield_slot(o_ptr) == INVEN_BOW)) @@ -2693,11 +2680,11 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out_c(TERM_VIOLET, "It is the ultimate armor. "); } - if (f4 & TR4_COULD2H) text_out("It can be wielded two-handed. "); - if (f4 & TR4_MUST2H) text_out("It must be wielded two-handed. "); + if (flags & TR_COULD2H) text_out("It can be wielded two-handed. "); + if (flags & TR_MUST2H) text_out("It must be wielded two-handed. "); /* Mega-Hack -- describe activation */ - if (f3 & (TR3_ACTIVATE)) + if (flags & TR_ACTIVATE) { text_out("It can be activated for "); if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) @@ -2710,7 +2697,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(item_activation(o_ptr, 0)); /* Mega-hack -- get rid of useless line for e.g. randarts */ - if (f5 & (TR5_ACTIVATE_NO_WIELD)) + if (flags & TR_ACTIVATE_NO_WIELD) text_out(". "); else text_out(" if it is being worn. "); @@ -2723,23 +2710,25 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(" if it is being worn. "); } - /* Hack -- describe lites */ - if ((o_ptr->tval == TV_LITE) || (f3 & TR3_LITE1) || (f4 & TR4_LITE2) || (f4 & TR4_LITE3)) + /* Describe light sources */ { int radius = 0; - if (f3 & TR3_LITE1) radius++; - if (f4 & TR4_LITE2) radius += 2; - if (f4 & TR4_LITE3) radius += 3; + if (flags & TR_LITE1) radius += 1; + if (flags & TR_LITE2) radius += 2; + if (flags & TR_LITE3) radius += 3; if (radius > 5) radius = 5; - if (f4 & TR4_FUEL_LITE) + if (radius > 0) { - text_out(format("It provides light (radius %d) when fueled. ", radius)); - } - else - { - text_out(format("It provides light (radius %d) forever. ", radius)); + if (flags & TR_FUEL_LITE) + { + text_out(format("It provides light (radius %d) when fueled. ", radius)); + } + else + { + text_out(format("It provides light (radius %d) forever. ", radius)); + } } } @@ -2749,12 +2738,12 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out("It prevents the space-time continuum from being disrupted. "); } - if (f4 & TR4_ANTIMAGIC_50) + if (flags & TR_ANTIMAGIC_50) { text_out("It generates an antimagic field. "); } - if (f5 & TR5_SPELL_CONTAIN) + if (flags & TR_SPELL_CONTAIN) { if (o_ptr->pval2 == -1) text_out("It can be used to store a spell. "); @@ -2764,21 +2753,21 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait /* Pick up stat bonuses */ vn = 0; - if (f1 & (TR1_STR)) vp[vn++] = "strength"; - if (f1 & (TR1_INT)) vp[vn++] = "intelligence"; - if (f1 & (TR1_WIS)) vp[vn++] = "wisdom"; - if (f1 & (TR1_DEX)) vp[vn++] = "dexterity"; - if (f1 & (TR1_CON)) vp[vn++] = "constitution"; - if (f1 & (TR1_CHR)) vp[vn++] = "charisma"; - if ((o_ptr->tval != TV_TRAPKIT) && (f1 & (TR1_STEALTH))) vp[vn++] = "stealth"; - if (f1 & (TR1_SEARCH)) vp[vn++] = "searching"; - if (f1 & (TR1_INFRA)) vp[vn++] = "infravision"; - if (f1 & (TR1_TUNNEL)) vp[vn++] = "ability to tunnel"; - if (f1 & (TR1_SPEED)) vp[vn++] = "speed"; - if (f1 & (TR1_BLOWS)) vp[vn++] = "attack speed"; - if (f5 & (TR5_CRIT)) vp[vn++] = "ability to score critical hits"; - if (f5 & (TR5_LUCK)) vp[vn++] = "luck"; - if (f1 & (TR1_SPELL)) vp[vn++] = "spell power"; + if (flags & TR_STR) vp[vn++] = "strength"; + if (flags & TR_INT) vp[vn++] = "intelligence"; + if (flags & TR_WIS) vp[vn++] = "wisdom"; + if (flags & TR_DEX) vp[vn++] = "dexterity"; + if (flags & TR_CON) vp[vn++] = "constitution"; + if (flags & TR_CHR) vp[vn++] = "charisma"; + if ((o_ptr->tval != TV_TRAPKIT) && (flags & TR_STEALTH)) vp[vn++] = "stealth"; + if (flags & TR_SEARCH) vp[vn++] = "searching"; + if (flags & TR_INFRA) vp[vn++] = "infravision"; + if (flags & TR_TUNNEL) vp[vn++] = "ability to tunnel"; + if (flags & TR_SPEED) vp[vn++] = "speed"; + if (flags & TR_BLOWS) vp[vn++] = "attack speed"; + if (flags & TR_CRIT) vp[vn++] = "ability to score critical hits"; + if (flags & TR_LUCK) vp[vn++] = "luck"; + if (flags & TR_SPELL) vp[vn++] = "spell power"; /* Describe */ if (vn) @@ -2814,8 +2803,8 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait vn = 0; - if (f1 & (TR1_MANA)) vp[vn++] = "mana capacity"; - if (f2 & (TR2_LIFE)) vp[vn++] = "hit points"; + if (flags & TR_MANA) vp[vn++] = "mana capacity"; + if (flags & TR_LIFE) vp[vn++] = "hit points"; /* Describe with percentuals */ if (vn) @@ -2847,28 +2836,28 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } - if ((o_ptr->tval == TV_TRAPKIT) && (f1 & (TR1_STEALTH))) + if ((o_ptr->tval == TV_TRAPKIT) && (flags & TR_STEALTH)) { text_out("It is well-hidden. "); } vn = 0; - if (f1 & (TR1_BRAND_ACID)) + if (flags & TR_BRAND_ACID) { vc[vn] = TERM_GREEN; vp[vn++] = "acid"; } - if (f1 & (TR1_BRAND_ELEC)) + if (flags & TR_BRAND_ELEC) { vc[vn] = TERM_L_BLUE; vp[vn++] = "electricity"; } - if (f1 & (TR1_BRAND_FIRE)) + if (flags & TR_BRAND_FIRE) { vc[vn] = TERM_RED; vp[vn++] = "fire"; } - if (f1 & (TR1_BRAND_COLD)) + if (flags & TR_BRAND_COLD) { vc[vn] = TERM_L_WHITE; vp[vn++] = "frost"; @@ -2896,84 +2885,91 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } - if (f1 & (TR1_BRAND_POIS)) + if (flags & TR_BRAND_POIS) { text_out("It "); text_out_c(TERM_L_GREEN, "poisons your foes"); text_out(". "); } - if (f1 & (TR1_CHAOTIC)) + if (flags & TR_CHAOTIC) { text_out("It produces chaotic effects. "); } - if (f1 & (TR1_VAMPIRIC)) + if (flags & TR_VAMPIRIC) { text_out("It drains life from your foes. "); } - if (f1 & (TR1_IMPACT)) + if (flags & TR_IMPACT) { text_out("It can cause earthquakes. "); } - if (f1 & (TR1_VORPAL)) + if (flags & TR_VORPAL) { text_out("It is very sharp and can cut your foes. "); } - if (f5 & (TR5_WOUNDING)) + if (flags & TR_WOUNDING) { text_out("It is very sharp and can make your foes bleed. "); } - if (f1 & (TR1_KILL_DRAGON)) + if (flags & TR_KILL_DRAGON) { text_out("It is a great bane of dragons. "); } - else if (f1 & (TR1_SLAY_DRAGON)) + else if (flags & TR_SLAY_DRAGON) { text_out("It is especially deadly against dragons. "); } - if (f1 & (TR1_SLAY_ORC)) + + if (flags & TR_SLAY_ORC) { text_out("It is especially deadly against orcs. "); } - if (f1 & (TR1_SLAY_TROLL)) + + if (flags & TR_SLAY_TROLL) { text_out("It is especially deadly against trolls. "); } - if (f1 & (TR1_SLAY_GIANT)) + + if (flags & TR_SLAY_GIANT) { text_out("It is especially deadly against giants. "); } - if (f5 & (TR5_KILL_DEMON)) + + if (flags & TR_KILL_DEMON) { text_out("It is a great bane of demons. "); } - else if (f1 & (TR1_SLAY_DEMON)) + else if (flags & TR_SLAY_DEMON) { text_out("It strikes at demons with holy wrath. "); } - if (f5 & (TR5_KILL_UNDEAD)) + + if (flags & TR_KILL_UNDEAD) { text_out("It is a great bane of undead. "); } - else if (f1 & (TR1_SLAY_UNDEAD)) + else if (flags & TR_SLAY_UNDEAD) { text_out("It strikes at undead with holy wrath. "); } - if (f1 & (TR1_SLAY_EVIL)) + + if (flags & TR_SLAY_EVIL) { text_out("It fights against evil with holy fury. "); } - if (f1 & (TR1_SLAY_ANIMAL)) + + if (flags & TR_SLAY_ANIMAL) { text_out("It is especially deadly against natural creatures. "); } - if (f2 & (TR2_INVIS)) + if (flags & TR_INVIS) { text_out("It makes you invisible. "); } @@ -2981,27 +2977,27 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (o_ptr->tval != TV_TRAPKIT) { vn = 0; - if (f2 & (TR2_SUST_STR)) + if (flags & TR_SUST_STR) { vp[vn++] = "strength"; } - if (f2 & (TR2_SUST_INT)) + if (flags & TR_SUST_INT) { vp[vn++] = "intelligence"; } - if (f2 & (TR2_SUST_WIS)) + if (flags & TR_SUST_WIS) { vp[vn++] = "wisdom"; } - if (f2 & (TR2_SUST_DEX)) + if (flags & TR_SUST_DEX) { vp[vn++] = "dexterity"; } - if (f2 & (TR2_SUST_CON)) + if (flags & TR_SUST_CON) { vp[vn++] = "constitution"; } - if (f2 & (TR2_SUST_CHR)) + if (flags & TR_SUST_CHR) { vp[vn++] = "charisma"; } @@ -3028,27 +3024,27 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } vn = 0; - if (f2 & (TR2_IM_ACID)) + if (flags & TR_IM_ACID) { vc[vn] = TERM_GREEN; vp[vn++] = "acid"; } - if (f2 & (TR2_IM_ELEC)) + if (flags & TR_IM_ELEC) { vc[vn] = TERM_L_BLUE; vp[vn++] = "electricity"; } - if (f2 & (TR2_IM_FIRE)) + if (flags & TR_IM_FIRE) { vc[vn] = TERM_RED; vp[vn++] = "fire"; } - if (f2 & (TR2_IM_COLD)) + if (flags & TR_IM_COLD) { vc[vn] = TERM_L_WHITE; vp[vn++] = "cold"; } - if (f4 & (TR4_IM_NETHER)) + if (flags & TR_IM_NETHER) { vc[vn] = TERM_L_GREEN; vp[vn++] = "nether"; @@ -3077,115 +3073,115 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } else { - if (f2 & (TRAP2_AUTOMATIC_5)) + if (flags & TR_AUTOMATIC_5) { text_out("It can rearm itself. "); } - if (f2 & (TRAP2_AUTOMATIC_99)) + if (flags & TR_AUTOMATIC_99) { text_out("It rearms itself. "); } - if (f2 & (TRAP2_KILL_GHOST)) + if (flags & TR_KILL_GHOST) { text_out("It is effective against Ghosts. "); } - if (f2 & (TRAP2_TELEPORT_TO)) + if (flags & TR_TELEPORT_TO) { text_out("It can teleport monsters to you. "); } - if (f2 & (TRAP2_ONLY_DRAGON)) + if (flags & TR_ONLY_DRAGON) { text_out("It can only be set off by dragons. "); } - if (f2 & (TRAP2_ONLY_DEMON)) + if (flags & TR_ONLY_DEMON) { text_out("It can only be set off by demons. "); } - if (f2 & (TRAP2_ONLY_UNDEAD)) + if (flags & TR_ONLY_UNDEAD) { text_out("It can only be set off by undead. "); } - if (f2 & (TRAP2_ONLY_ANIMAL)) + if (flags & TR_ONLY_ANIMAL) { text_out("It can only be set off by animals. "); } - if (f2 & (TRAP2_ONLY_EVIL)) + if (flags & TR_ONLY_EVIL) { text_out("It can only be set off by evil creatures. "); } } - if (f2 & (TR2_FREE_ACT)) + if (flags & TR_FREE_ACT) { text_out("It provides immunity to paralysis. "); } - if (f2 & (TR2_RES_FEAR)) + if (flags & TR_RES_FEAR) { text_out("It makes you completely fearless. "); } vn = 0; - if (f2 & (TR2_HOLD_LIFE)) + if (flags & TR_HOLD_LIFE) { vp[vn++] = "life draining"; } - if ((f2 & (TR2_RES_ACID)) && !(f2 & (TR2_IM_ACID))) + if ((flags & TR_RES_ACID) && !(flags & TR_IM_ACID)) { vp[vn++] = "acid"; } - if ((f2 & (TR2_RES_ELEC)) && !(f2 & (TR2_IM_ELEC))) + if ((flags & TR_RES_ELEC) && !(flags & TR_IM_ELEC)) { vp[vn++] = "electricity"; } - if ((f2 & (TR2_RES_FIRE)) && !(f2 & (TR2_IM_FIRE))) + if ((flags & TR_RES_FIRE) && !(flags & TR_IM_FIRE)) { vp[vn++] = "fire"; } - if ((f2 & (TR2_RES_COLD)) && !(f2 & (TR2_IM_COLD))) + if ((flags & TR_RES_COLD) && !(flags & TR_IM_COLD)) { vp[vn++] = "cold"; } - if (f2 & (TR2_RES_POIS)) + if (flags & TR_RES_POIS) { vp[vn++] = "poison"; } - if (f2 & (TR2_RES_LITE)) + if (flags & TR_RES_LITE) { vp[vn++] = "light"; } - if (f2 & (TR2_RES_DARK)) + if (flags & TR_RES_DARK) { vp[vn++] = "dark"; } - if (f2 & (TR2_RES_BLIND)) + if (flags & TR_RES_BLIND) { vp[vn++] = "blindness"; } - if (f2 & (TR2_RES_CONF)) + if (flags & TR_RES_CONF) { vp[vn++] = "confusion"; } - if (f2 & (TR2_RES_SOUND)) + if (flags & TR_RES_SOUND) { vp[vn++] = "sound"; } - if (f2 & (TR2_RES_SHARDS)) + if (flags & TR_RES_SHARDS) { vp[vn++] = "shards"; } - if ((f2 & (TR2_RES_NETHER)) && !(f4 & (TR4_IM_NETHER))) + if ((flags & TR_RES_NETHER) && !(flags & TR_IM_NETHER)) { vp[vn++] = "nether"; } - if (f2 & (TR2_RES_NEXUS)) + if (flags & TR_RES_NEXUS) { vp[vn++] = "nexus"; } - if (f2 & (TR2_RES_CHAOS)) + if (flags & TR_RES_CHAOS) { vp[vn++] = "chaos"; } - if (f2 & (TR2_RES_DISEN)) + if (flags & TR_RES_DISEN) { vp[vn++] = "disenchantment"; } @@ -3211,61 +3207,65 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } - if (f2 & (TR2_SENS_FIRE)) + if (flags & TR_SENS_FIRE) { text_out("It renders you especially vulnerable to fire. "); } - if (f3 & (TR3_WRAITH)) + if (flags & TR_WRAITH) { text_out("It renders you incorporeal. "); } - if (f5 & (TR5_WATER_BREATH)) + if (flags & TR_WATER_BREATH) { text_out("It allows you to breathe underwater. "); } - if (f5 & (TR5_MAGIC_BREATH)) + if (flags & TR_MAGIC_BREATH) { text_out("It allows you to breathe without air. "); } - if (f3 & (TR3_FEATHER)) + if (flags & TR_FEATHER) { text_out("It allows you to levitate. "); } - if (f4 & (TR4_FLY)) + if (flags & TR_FLY) { text_out("It allows you to fly. "); } - if (f4 & (TR4_CLIMB)) + if (flags & TR_CLIMB) { text_out("It allows you to climb mountains. "); } - if (f5 & (TR5_IMMOVABLE)) + if (flags & TR_IMMOVABLE) { text_out("It renders you immovable. "); } - if (f3 & (TR3_SEE_INVIS)) + if (flags & TR_SEE_INVIS) { text_out("It allows you to see invisible monsters. "); } - if (esp) + + // ESP_* { - if (esp & ESP_ALL) text_out("It gives telepathic powers. "); + if (flags & ESP_ALL) + { + text_out("It gives telepathic powers. "); + } else { vn = 0; - if (esp & ESP_ORC) vp[vn++] = "orcs"; - if (esp & ESP_TROLL) vp[vn++] = "trolls"; - if (esp & ESP_DRAGON) vp[vn++] = "dragons"; - if (esp & ESP_SPIDER) vp[vn++] = "spiders"; - if (esp & ESP_GIANT) vp[vn++] = "giants"; - if (esp & ESP_DEMON) vp[vn++] = "demons"; - if (esp & ESP_UNDEAD) vp[vn++] = "undead"; - if (esp & ESP_EVIL) vp[vn++] = "evil beings"; - if (esp & ESP_ANIMAL) vp[vn++] = "animals"; - if (esp & ESP_THUNDERLORD) vp[vn++] = "thunderlords"; - if (esp & ESP_GOOD) vp[vn++] = "good beings"; - if (esp & ESP_NONLIVING) vp[vn++] = "non-living things"; - if (esp & ESP_UNIQUE) vp[vn++] = "unique beings"; + if (flags & ESP_ORC) vp[vn++] = "orcs"; + if (flags & ESP_TROLL) vp[vn++] = "trolls"; + if (flags & ESP_DRAGON) vp[vn++] = "dragons"; + if (flags & ESP_SPIDER) vp[vn++] = "spiders"; + if (flags & ESP_GIANT) vp[vn++] = "giants"; + if (flags & ESP_DEMON) vp[vn++] = "demons"; + if (flags & ESP_UNDEAD) vp[vn++] = "undead"; + if (flags & ESP_EVIL) vp[vn++] = "evil beings"; + if (flags & ESP_ANIMAL) vp[vn++] = "animals"; + if (flags & ESP_THUNDERLORD) vp[vn++] = "thunderlords"; + if (flags & ESP_GOOD) vp[vn++] = "good beings"; + if (flags & ESP_NONLIVING) vp[vn++] = "non-living things"; + if (flags & ESP_UNIQUE) vp[vn++] = "unique beings"; /* Describe */ if (vn) { @@ -3290,55 +3290,55 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } } - if (f3 & (TR3_SLOW_DIGEST)) + if (flags & TR_SLOW_DIGEST) { text_out("It slows your metabolism. "); } - if (f3 & (TR3_REGEN)) + if (flags & TR_REGEN) { text_out("It speeds your regenerative powers. "); } - if (f2 & (TR2_REFLECT)) + if (flags & TR_REFLECT) { text_out("It reflects bolts and arrows. "); } - if (f3 & (TR3_SH_FIRE)) + if (flags & TR_SH_FIRE) { text_out("It produces a fiery sheath. "); } - if (f3 & (TR3_SH_ELEC)) + if (flags & TR_SH_ELEC) { text_out("It produces an electric sheath. "); } - if (f3 & (TR3_NO_MAGIC)) + if (flags & TR_NO_MAGIC) { text_out("It produces an anti-magic shell. "); } - if (f3 & (TR3_NO_TELE)) + if (flags & TR_NO_TELE) { text_out("It prevents teleportation. "); } - if (f3 & (TR3_XTRA_MIGHT)) + if (flags & TR_XTRA_MIGHT) { text_out("It fires missiles with extra might. "); } - if (f3 & (TR3_XTRA_SHOTS)) + if (flags & TR_XTRA_SHOTS) { text_out("It fires missiles excessively fast. "); } vn = 0; - if (f5 & (TR5_DRAIN_MANA)) + if (flags & TR_DRAIN_MANA) { vc[vn] = TERM_BLUE; vp[vn++] = "mana"; } - if (f5 & (TR5_DRAIN_HP)) + if (flags & TR_DRAIN_HP) { vc[vn] = TERM_RED; vp[vn++] = "life"; } - if (f3 & (TR3_DRAIN_EXP)) + if (flags & TR_DRAIN_EXP) { vc[vn] = TERM_L_DARK; vp[vn++] = "experience"; @@ -3365,38 +3365,38 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } - if (f3 & (TR3_BLESSED)) + if (flags & TR_BLESSED) { text_out("It has been blessed by the gods. "); } - if (f4 & (TR4_AUTO_ID)) + if (flags & TR_AUTO_ID) { text_out("It identifies all items for you. "); } - if (f3 & (TR3_TELEPORT)) + if (flags & TR_TELEPORT) { text_out("It induces random teleportation. "); } - if (f3 & (TR3_AGGRAVATE)) + if (flags & TR_AGGRAVATE) { text_out("It aggravates nearby creatures. "); } - if (f4 & (TR4_NEVER_BLOW)) + if (flags & TR_NEVER_BLOW) { text_out("It can't attack. "); } - if (f4 & (TR4_BLACK_BREATH)) + if (flags & TR_BLACK_BREATH) { text_out("It fills you with the Black Breath. "); } if (cursed_p(o_ptr)) { - if (f3 & (TR3_PERMA_CURSE)) + if (flags & TR_PERMA_CURSE) { text_out("It is permanently cursed. "); } - else if (f3 & (TR3_HEAVY_CURSE)) + else if (flags & TR_HEAVY_CURSE) { text_out("It is heavily cursed. "); } @@ -3405,68 +3405,68 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out("It is cursed. "); } } - if (f3 & (TR3_TY_CURSE)) + if (flags & TR_TY_CURSE) { text_out("It carries an ancient foul curse. "); } - if (f4 & (TR4_DG_CURSE)) + if (flags & TR_DG_CURSE) { text_out("It carries an ancient Morgothian curse. "); } - if (f4 & (TR4_CLONE)) + if (flags & TR_CLONE) { text_out("It can clone monsters. "); } - if (f4 & (TR4_CURSE_NO_DROP)) + if (flags & TR_CURSE_NO_DROP) { text_out("It cannot be dropped while cursed. "); } - if (f3 & (TR3_AUTO_CURSE)) + if (flags & TR_AUTO_CURSE) { text_out("It can re-curse itself. "); } - if (f4 & (TR4_CAPACITY)) + if (flags & TR_CAPACITY) { text_out("It can hold more mana. "); } - if (f4 & (TR4_CHEAPNESS)) + if (flags & TR_CHEAPNESS) { text_out("It can cast spells for a lesser mana cost. "); } - if (f4 & (TR4_FAST_CAST)) + if (flags & TR_FAST_CAST) { text_out("It can cast spells faster. "); } - if (f4 & (TR4_CHARGING)) + if (flags & TR_CHARGING) { text_out("It regenerates its mana faster. "); } - if (f5 & (TR5_RES_MORGUL)) + if (flags & TR_RES_MORGUL) { text_out("It can resist being shattered by morgul beings. "); } - if ((f3 & (TR3_IGNORE_ACID)) && (f3 & (TR3_IGNORE_FIRE)) && (f3 & (TR3_IGNORE_COLD)) && (f3 & (TR3_IGNORE_ELEC))) + if ((flags & TR_IGNORE_ACID) && (flags & TR_IGNORE_FIRE) && (flags & TR_IGNORE_COLD) && (flags & TR_IGNORE_ELEC)) { text_out("It cannot be harmed by acid, cold, lightning or fire. "); } else { - if (f3 & (TR3_IGNORE_ACID)) + if (flags & TR_IGNORE_ACID) { text_out("It cannot be harmed by acid. "); } - if (f3 & (TR3_IGNORE_ELEC)) + if (flags & TR_IGNORE_ELEC) { text_out("It cannot be harmed by electricity. "); } - if (f3 & (TR3_IGNORE_FIRE)) + if (flags & TR_IGNORE_FIRE) { text_out("It cannot be harmed by fire. "); } - if (f3 & (TR3_IGNORE_COLD)) + if (flags & TR_IGNORE_COLD) { text_out("It cannot be harmed by cold. "); } @@ -4162,7 +4162,7 @@ byte get_item_letter_color(object_type const *o_ptr) if (ego_item_p(o_ptr)) color = TERM_L_BLUE; if (artifact_p(o_ptr)) color = TERM_YELLOW; if (o_ptr->name1 && ( -1 != a_info[o_ptr->name1].set)) color = TERM_GREEN; - if (o_ptr->name1 && (a_info[o_ptr->name1].flags4 & TR4_ULTIMATE) && (o_ptr->ident & (IDENT_MENTAL))) color = TERM_VIOLET; + if (o_ptr->name1 && (a_info[o_ptr->name1].flags & TR_ULTIMATE) && (o_ptr->ident & (IDENT_MENTAL))) color = TERM_VIOLET; return (color); } @@ -4415,7 +4415,6 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte !o_ptr->k_idx && p_ptr->inventory[i - INVEN_ARM + INVEN_WIELD].k_idx) { - u32b f1, f2, f3, f4, f5, esp; object_type *q_ptr = &p_ptr->inventory[i - INVEN_ARM + INVEN_WIELD]; char q_name[80]; @@ -4423,9 +4422,9 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte object_desc(q_name, q_ptr, TRUE, 3); /* Get weapon flags */ - object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(q_ptr); - if (f4 & TR4_MUST2H) + if (flags & TR_MUST2H) { sprintf(o_name, "(two handed) %s", q_name); @@ -6082,120 +6081,79 @@ static void gain_flag_group(object_type *o_ptr) } } -static u32b get_flag(object_type *o_ptr, int grp, int k) +static object_flag_set get_flag(object_type *o_ptr, int grp) { - u32b f = 0, flag_set = 0; int tries = 1000; - u32b f1, f2, f3, f4, f5, esp, flag_test; - - /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); /* get the corresponding flag set of the group */ - switch (k) - { - case 0: - flag_set = flags_groups()[grp].flags1; - flag_test = f1; - break; - case 1: - flag_set = flags_groups()[grp].flags2; - flag_test = f2; - break; - case 2: - flag_set = flags_groups()[grp].flags3; - flag_test = f3; - break; - case 3: - flag_set = flags_groups()[grp].flags4; - flag_test = f4; - break; - case 4: - flag_set = flags_groups()[grp].esp; - flag_test = esp; - break; - default: - flag_set = flags_groups()[grp].flags1; - flag_test = f1; - break; - } + auto const flag_set = flags_groups()[grp].flags; + auto const flag_test = object_flags(o_ptr); /* If no flags, no need to look */ - if (!count_bits(flag_set)) return 0; + if (flag_set.empty()) + { + return object_flag_set(); + } while (tries--) { - /* get a random flag */ - f = BIT(rand_int(32)); + // Choose a random flag + auto const f = object_flag_set::make_bit(rand_int(object_flag_set::nbits)); - /* is it part of the group */ - if (!(f & flag_set)) continue; + // Ignore if not part of the group + if (!(f & flag_set)) + { + continue; + } - /* Already got it */ - if (f & flag_test) continue; + // Ignore if already present + if (f & flag_test) + { + continue; + } - /* Ok one */ - break; + // Got a match! + return f; } - if (tries <= 1) return (0); - else return (f); + // Exhausted the number of tries + return object_flag_set(); } /* Add a flags from a flag group */ static void gain_flag_group_flag(object_type *o_ptr) { - int grp = 0, k = 0; - u32b f = 0; - int tries = 20000; - - if (!count_bits(o_ptr->pval3)) return; - - while (tries--) + // Try a "few" times to see if we can't find a flag. + for (int tries = 20000; tries > 0; tries--) { - /* Get a flag set */ - k = rand_int(5); - - /* get a flag group */ - grp = rand_int(flags_groups().size()); - - if (!(BIT(grp) & o_ptr->pval3)) continue; + // Choose a random flag group + auto grp = rand_int(flags_groups().size()); - /* Return a flag from the group/set */ - f = get_flag(o_ptr, grp, k); + // If that group isn't available to the object, then choose a new one. + if (!(BIT(grp) & o_ptr->pval3)) + { + continue; + } - if (!f) continue; + // Get an as-yet unused flag from the group, if possible. + auto const f = get_flag(o_ptr, grp); - break; - } + // If we couldn't find a flag, then we try again. + if (f.empty()) + { + continue; + } - if (tries <= 1) return; + // Got a flag; mix it into the object. + o_ptr->art_flags |= f; - switch (k) - { - case 0: - o_ptr->art_flags1 |= f; - break; - case 1: - o_ptr->art_flags2 |= f; - break; - case 2: - o_ptr->art_flags3 |= f; - break; - case 3: - o_ptr->art_flags4 |= f; - break; - case 4: - o_ptr->art_esp |= f; - break; - } - - /* Message */ - { + // Describe what happened char o_name[80]; - object_desc(o_name, o_ptr, FALSE, 0); msg_format("%s gains a new power from the %s realm.", o_name, flags_groups()[grp].name); + + // We're done. + return; } } @@ -6204,11 +6162,6 @@ static void gain_flag_group_flag(object_type *o_ptr) */ void object_gain_level(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - - /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - /* First it can gain some tohit and todam */ if ((o_ptr->tval == TV_AXE) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED) || (o_ptr->tval == TV_MSTAFF)) @@ -6231,16 +6184,31 @@ void object_gain_level(object_type *o_ptr) } else { - if (!o_ptr->pval3) gain_flag_group(o_ptr); + // Gain a group if none are available. + if (!o_ptr->pval3) + { + gain_flag_group(o_ptr); + } + // Gain a flag gain_flag_group_flag(o_ptr); - if (!o_ptr->pval) o_ptr->pval = 1; + // Increase/grant PVAL + if (!o_ptr->pval) + { + o_ptr->pval = 1; + } else { - while (magik(20 - (o_ptr->pval * 2))) o_ptr->pval++; + while (magik(20 - (o_ptr->pval * 2))) + { + o_ptr->pval++; + } - if (o_ptr->pval > 5) o_ptr->pval = 5; + if (o_ptr->pval > 5) + { + o_ptr->pval = 5; + } } } } @@ -6301,40 +6269,42 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx) return (FALSE); } -bool_ apply_set(s16b a_idx, s16b set_idx) +void apply_set(s16b a_idx, s16b set_idx) { set_type *s_ptr = &set_info[set_idx]; - int i, j; - if ( -1 == a_info[a_idx].set) return (FALSE); + if ( -1 == a_info[a_idx].set) + { + return; + } + + int i; for (i = 0; i < s_ptr->num; i++) + { if (a_idx == s_ptr->arts[i].a_idx) break; + } + if (s_ptr->arts[i].present) { - for (j = 0; j < s_ptr->num_use; j++) + for (int j = 0; j < s_ptr->num_use; j++) { - apply_flags(s_ptr->arts[i].flags1[j], - s_ptr->arts[i].flags2[j], - s_ptr->arts[i].flags3[j], - s_ptr->arts[i].flags4[j], - s_ptr->arts[i].flags5[j], - s_ptr->arts[i].esp[j], + apply_flags(s_ptr->arts[i].flags[j], s_ptr->arts[i].pval[j], 0, 0, 0, 0); } - return (TRUE); } - return (FALSE); } -static bool_ apply_flags_set(s16b a_idx, s16b set_idx, - u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp) +static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) { - set_type *s_ptr = &set_info[set_idx]; - int i, j; + if ( -1 == a_info[a_idx].set) + { + return; + } - if ( -1 == a_info[a_idx].set) return (FALSE); + set_type *s_ptr = &set_info[set_idx]; + int i; for (i = 0; i < s_ptr->num; i++) { if (a_idx == s_ptr->arts[i].a_idx) break; @@ -6342,18 +6312,11 @@ static bool_ apply_flags_set(s16b a_idx, s16b set_idx, if (s_ptr->arts[i].present) { - for (j = 0; j < s_ptr->num_use; j++) + for (int j = 0; j < s_ptr->num_use; j++) { - (*f1) |= s_ptr->arts[i].flags1[j]; - (*f2) |= s_ptr->arts[i].flags2[j]; - (*f3) |= s_ptr->arts[i].flags3[j]; - (*f4) |= s_ptr->arts[i].flags4[j]; - (*f5) |= s_ptr->arts[i].flags5[j]; - (*esp) |= s_ptr->arts[i].esp[j]; + (*f) |= s_ptr->arts[i].flags[j]; } - return (TRUE); } - return (FALSE); } /* @@ -6433,7 +6396,7 @@ bool artifact_p(object_type const *o_ptr) (o_ptr->tval == TV_RANDART) || (o_ptr->name1 ? true : false) || (o_ptr->art_name ? true : false) || - ((k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) ? true : false); + ((k_info[o_ptr->k_idx].flags & TR_NORM_ART) ? true : false); } /** diff --git a/src/object1.hpp b/src/object1.hpp index da4a6ead..af055985 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "object_filter.hpp" +#include "object_flag_set.hpp" #include #include @@ -10,7 +11,7 @@ typedef std::function(object_filter_t const &filter)> selec extern byte get_item_letter_color(object_type const *o_ptr); extern void object_pickup(int this_o_idx); -extern bool_ apply_set(s16b a_idx, s16b set_idx); +extern void apply_set(s16b a_idx, s16b set_idx); extern bool_ takeoff_set(s16b a_idx, s16b set_idx); extern bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent); extern bool_ verify(cptr prompt, int item); @@ -18,8 +19,9 @@ extern void flavor_init(void); extern void reset_visuals(void); extern int object_power(object_type *o_ptr); extern bool_ object_flags_no_set; -extern void object_flags(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); -extern void object_flags_known(object_type const *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp); +extern object_flag_set object_flags(object_type const *o_ptr); +extern object_flag_set object_flags_known(object_type const *o_ptr); + extern s32b calc_object_need_exp(object_type const *o_ptr); extern void object_desc(char *buf, object_type const *o_ptr, int pref, int mode); extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode); diff --git a/src/object2.cc b/src/object2.cc index d9c0b5f7..f6b526f6 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -24,6 +24,8 @@ #include "monster_race_flag.hpp" #include "monster_type.hpp" #include "object1.hpp" +#include "object_flag.hpp" +#include "object_flag_meta.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -315,7 +317,7 @@ void compact_objects(int size) continue; /* That's 400 + level for fixed artifacts */ - if ( (k_ptr->flags3 & TR3_NORM_ART) && cur_lev < 400 + k_ptr->level ) + if ( (k_ptr->flags & TR_NORM_ART) && cur_lev < 400 + k_ptr->level ) continue; /* Never protect if level is high enough; so we don't wipe a better artifact */ @@ -393,7 +395,7 @@ void wipe_o_list(void) { random_artifacts[o_ptr->sval].generated = FALSE; } - else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { k_info[o_ptr->k_idx].artifact = FALSE; } @@ -826,139 +828,140 @@ static s32b object_value_base(object_type const *o_ptr) } /* Return the value of the flags the object has... */ -s32b flag_cost(object_type const * o_ptr, int plusses) +s32b flag_cost(object_type const *o_ptr, int plusses) { - s32b total = 0; - u32b f1, f2, f3, f4, f5, esp; - - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (f5 & TR5_TEMPORARY) + if (flags & TR_TEMPORARY) { return 0; } - if (f4 & TR4_CURSE_NO_DROP) + + if (flags & TR_CURSE_NO_DROP) { return 0; } - if (f1 & TR1_STR) total += (1000 * plusses); - if (f1 & TR1_INT) total += (1000 * plusses); - if (f1 & TR1_WIS) total += (1000 * plusses); - if (f1 & TR1_DEX) total += (1000 * plusses); - if (f1 & TR1_CON) total += (1000 * plusses); - if (f1 & TR1_CHR) total += (250 * plusses); - if (f1 & TR1_CHAOTIC) total += 10000; - if (f1 & TR1_VAMPIRIC) total += 13000; - if (f1 & TR1_STEALTH) total += (250 * plusses); - if (f1 & TR1_SEARCH) total += (100 * plusses); - if (f1 & TR1_INFRA) total += (150 * plusses); - if (f1 & TR1_TUNNEL) total += (175 * plusses); - if ((f1 & TR1_SPEED) && (plusses > 0)) + + s32b total = 0; + + if (flags & TR_STR) total += (1000 * plusses); + if (flags & TR_INT) total += (1000 * plusses); + if (flags & TR_WIS) total += (1000 * plusses); + if (flags & TR_DEX) total += (1000 * plusses); + if (flags & TR_CON) total += (1000 * plusses); + if (flags & TR_CHR) total += (250 * plusses); + if (flags & TR_CHAOTIC) total += 10000; + if (flags & TR_VAMPIRIC) total += 13000; + if (flags & TR_STEALTH) total += (250 * plusses); + if (flags & TR_SEARCH) total += (100 * plusses); + if (flags & TR_INFRA) total += (150 * plusses); + if (flags & TR_TUNNEL) total += (175 * plusses); + if ((flags & TR_SPEED) && (plusses > 0)) total += (10000 + (2500 * plusses)); - if ((f1 & TR1_BLOWS) && (plusses > 0)) + if ((flags & TR_BLOWS) && (plusses > 0)) total += (10000 + (2500 * plusses)); - if (f1 & TR1_MANA) total += (1000 * plusses); - if (f1 & TR1_SPELL) total += (2000 * plusses); - if (f1 & TR1_SLAY_ANIMAL) total += 3500; - if (f1 & TR1_SLAY_EVIL) total += 4500; - if (f1 & TR1_SLAY_UNDEAD) total += 3500; - if (f1 & TR1_SLAY_DEMON) total += 3500; - if (f1 & TR1_SLAY_ORC) total += 3000; - if (f1 & TR1_SLAY_TROLL) total += 3500; - if (f1 & TR1_SLAY_GIANT) total += 3500; - if (f1 & TR1_SLAY_DRAGON) total += 3500; - if (f5 & TR5_KILL_DEMON) total += 5500; - if (f5 & TR5_KILL_UNDEAD) total += 5500; - if (f1 & TR1_KILL_DRAGON) total += 5500; - if (f1 & TR1_VORPAL) total += 5000; - if (f1 & TR1_IMPACT) total += 5000; - if (f1 & TR1_BRAND_POIS) total += 7500; - if (f1 & TR1_BRAND_ACID) total += 7500; - if (f1 & TR1_BRAND_ELEC) total += 7500; - if (f1 & TR1_BRAND_FIRE) total += 5000; - if (f1 & TR1_BRAND_COLD) total += 5000; - if (f2 & TR2_SUST_STR) total += 850; - if (f2 & TR2_SUST_INT) total += 850; - if (f2 & TR2_SUST_WIS) total += 850; - if (f2 & TR2_SUST_DEX) total += 850; - if (f2 & TR2_SUST_CON) total += 850; - if (f2 & TR2_SUST_CHR) total += 250; - if (f2 & TR2_INVIS) total += 3000; - if (f2 & TR2_LIFE) total += (5000 * plusses); - if (f2 & TR2_IM_ACID) total += 10000; - if (f2 & TR2_IM_ELEC) total += 10000; - if (f2 & TR2_IM_FIRE) total += 10000; - if (f2 & TR2_IM_COLD) total += 10000; - if (f2 & TR2_SENS_FIRE) total -= 100; - if (f2 & TR2_REFLECT) total += 10000; - if (f2 & TR2_FREE_ACT) total += 4500; - if (f2 & TR2_HOLD_LIFE) total += 8500; - if (f2 & TR2_RES_ACID) total += 1250; - if (f2 & TR2_RES_ELEC) total += 1250; - if (f2 & TR2_RES_FIRE) total += 1250; - if (f2 & TR2_RES_COLD) total += 1250; - if (f2 & TR2_RES_POIS) total += 2500; - if (f2 & TR2_RES_FEAR) total += 2500; - if (f2 & TR2_RES_LITE) total += 1750; - if (f2 & TR2_RES_DARK) total += 1750; - if (f2 & TR2_RES_BLIND) total += 2000; - if (f2 & TR2_RES_CONF) total += 2000; - if (f2 & TR2_RES_SOUND) total += 2000; - if (f2 & TR2_RES_SHARDS) total += 2000; - if (f2 & TR2_RES_NETHER) total += 2000; - if (f2 & TR2_RES_NEXUS) total += 2000; - if (f2 & TR2_RES_CHAOS) total += 2000; - if (f2 & TR2_RES_DISEN) total += 10000; - if (f3 & TR3_SH_FIRE) total += 5000; - if (f3 & TR3_SH_ELEC) total += 5000; - if (f3 & TR3_DECAY) total += 0; - if (f3 & TR3_NO_TELE) total += 2500; - if (f3 & TR3_NO_MAGIC) total += 2500; - if (f3 & TR3_WRAITH) total += 250000; - if (f3 & TR3_TY_CURSE) total -= 15000; - if (f3 & TR3_EASY_KNOW) total += 0; - if (f3 & TR3_HIDE_TYPE) total += 0; - if (f3 & TR3_SHOW_MODS) total += 0; - if (f3 & TR3_INSTA_ART) total += 0; - if (f3 & TR3_LITE1) total += 750; - if (f4 & TR4_LITE2) total += 1250; - if (f4 & TR4_LITE3) total += 2750; - if (f3 & TR3_SEE_INVIS) total += 2000; - if (esp) total += (12500 * count_bits(esp)); - if (f3 & TR3_SLOW_DIGEST) total += 750; - if (f3 & TR3_REGEN) total += 2500; - if (f3 & TR3_XTRA_MIGHT) total += 2250; - if (f3 & TR3_XTRA_SHOTS) total += 10000; - if (f3 & TR3_IGNORE_ACID) total += 100; - if (f3 & TR3_IGNORE_ELEC) total += 100; - if (f3 & TR3_IGNORE_FIRE) total += 100; - if (f3 & TR3_IGNORE_COLD) total += 100; - if (f3 & TR3_ACTIVATE) total += 100; - if (f3 & TR3_DRAIN_EXP) total -= 12500; - if (f3 & TR3_TELEPORT) + if (flags & TR_MANA) total += (1000 * plusses); + if (flags & TR_SPELL) total += (2000 * plusses); + if (flags & TR_SLAY_ANIMAL) total += 3500; + if (flags & TR_SLAY_EVIL) total += 4500; + if (flags & TR_SLAY_UNDEAD) total += 3500; + if (flags & TR_SLAY_DEMON) total += 3500; + if (flags & TR_SLAY_ORC) total += 3000; + if (flags & TR_SLAY_TROLL) total += 3500; + if (flags & TR_SLAY_GIANT) total += 3500; + if (flags & TR_SLAY_DRAGON) total += 3500; + if (flags & TR_KILL_DEMON) total += 5500; + if (flags & TR_KILL_UNDEAD) total += 5500; + if (flags & TR_KILL_DRAGON) total += 5500; + if (flags & TR_VORPAL) total += 5000; + if (flags & TR_IMPACT) total += 5000; + if (flags & TR_BRAND_POIS) total += 7500; + if (flags & TR_BRAND_ACID) total += 7500; + if (flags & TR_BRAND_ELEC) total += 7500; + if (flags & TR_BRAND_FIRE) total += 5000; + if (flags & TR_BRAND_COLD) total += 5000; + if (flags & TR_SUST_STR) total += 850; + if (flags & TR_SUST_INT) total += 850; + if (flags & TR_SUST_WIS) total += 850; + if (flags & TR_SUST_DEX) total += 850; + if (flags & TR_SUST_CON) total += 850; + if (flags & TR_SUST_CHR) total += 250; + if (flags & TR_INVIS) total += 3000; + if (flags & TR_LIFE) total += (5000 * plusses); + if (flags & TR_IM_ACID) total += 10000; + if (flags & TR_IM_ELEC) total += 10000; + if (flags & TR_IM_FIRE) total += 10000; + if (flags & TR_IM_COLD) total += 10000; + if (flags & TR_SENS_FIRE) total -= 100; + if (flags & TR_REFLECT) total += 10000; + if (flags & TR_FREE_ACT) total += 4500; + if (flags & TR_HOLD_LIFE) total += 8500; + if (flags & TR_RES_ACID) total += 1250; + if (flags & TR_RES_ELEC) total += 1250; + if (flags & TR_RES_FIRE) total += 1250; + if (flags & TR_RES_COLD) total += 1250; + if (flags & TR_RES_POIS) total += 2500; + if (flags & TR_RES_FEAR) total += 2500; + if (flags & TR_RES_LITE) total += 1750; + if (flags & TR_RES_DARK) total += 1750; + if (flags & TR_RES_BLIND) total += 2000; + if (flags & TR_RES_CONF) total += 2000; + if (flags & TR_RES_SOUND) total += 2000; + if (flags & TR_RES_SHARDS) total += 2000; + if (flags & TR_RES_NETHER) total += 2000; + if (flags & TR_RES_NEXUS) total += 2000; + if (flags & TR_RES_CHAOS) total += 2000; + if (flags & TR_RES_DISEN) total += 10000; + if (flags & TR_SH_FIRE) total += 5000; + if (flags & TR_SH_ELEC) total += 5000; + if (flags & TR_DECAY) total += 0; + if (flags & TR_NO_TELE) total += 2500; + if (flags & TR_NO_MAGIC) total += 2500; + if (flags & TR_WRAITH) total += 250000; + if (flags & TR_TY_CURSE) total -= 15000; + if (flags & TR_EASY_KNOW) total += 0; + if (flags & TR_HIDE_TYPE) total += 0; + if (flags & TR_SHOW_MODS) total += 0; + if (flags & TR_INSTA_ART) total += 0; + if (flags & TR_LITE1) total += 750; + if (flags & TR_LITE2) total += 1250; + if (flags & TR_LITE3) total += 2750; + if (flags & TR_SEE_INVIS) total += 2000; + total += 12500 * ((flags & object_flags_esp()).count()); + if (flags & TR_SLOW_DIGEST) total += 750; + if (flags & TR_REGEN) total += 2500; + if (flags & TR_XTRA_MIGHT) total += 2250; + if (flags & TR_XTRA_SHOTS) total += 10000; + if (flags & TR_IGNORE_ACID) total += 100; + if (flags & TR_IGNORE_ELEC) total += 100; + if (flags & TR_IGNORE_FIRE) total += 100; + if (flags & TR_IGNORE_COLD) total += 100; + if (flags & TR_ACTIVATE) total += 100; + if (flags & TR_DRAIN_EXP) total -= 12500; + if (flags & TR_TELEPORT) { if (o_ptr->ident & IDENT_CURSED) total -= 7500; else total += 250; } - if (f3 & TR3_AGGRAVATE) total -= 10000; - if (f3 & TR3_BLESSED) total += 750; - if ((f3 & TR3_CURSED) && (o_ptr->ident & IDENT_CURSED)) total -= 5000; - if ((f3 & TR3_HEAVY_CURSE) && (o_ptr->ident & IDENT_CURSED)) total -= 12500; - if (f3 & TR3_PERMA_CURSE) total -= 15000; - if (f3 & TR3_FEATHER) total += 1250; - if (f4 & TR4_FLY) total += 10000; - if (f4 & TR4_NEVER_BLOW) total -= 15000; - if (f4 & TR4_PRECOGNITION) total += 250000; - if (f4 & TR4_BLACK_BREATH) total -= 12500; - if (f4 & TR4_DG_CURSE) total -= 25000; - if (f4 & TR4_CLONE) total -= 10000; - if (f4 & TR4_LEVELS) total += o_ptr->elevel * 2000; + if (flags & TR_AGGRAVATE) total -= 10000; + if (flags & TR_BLESSED) total += 750; + if ((flags & TR_CURSED) && (o_ptr->ident & IDENT_CURSED)) total -= 5000; + if ((flags & TR_HEAVY_CURSE) && (o_ptr->ident & IDENT_CURSED)) total -= 12500; + if (flags & TR_PERMA_CURSE) total -= 15000; + if (flags & TR_FEATHER) total += 1250; + if (flags & TR_FLY) total += 10000; + if (flags & TR_NEVER_BLOW) total -= 15000; + if (flags & TR_PRECOGNITION) total += 250000; + if (flags & TR_BLACK_BREATH) total -= 12500; + if (flags & TR_DG_CURSE) total -= 25000; + if (flags & TR_CLONE) total -= 10000; + if (flags & TR_LEVELS) total += o_ptr->elevel * 2000; /* Also, give some extra for activatable powers... */ - if ((o_ptr->art_name) && (o_ptr->art_flags3 & (TR3_ACTIVATE))) + if ((o_ptr->art_name) && (o_ptr->art_flags & TR_ACTIVATE)) { int type = o_ptr->xtra2; @@ -1066,8 +1069,6 @@ s32b object_value_real(object_type const *o_ptr) { s32b value; - u32b f1, f2, f3, f4, f5, esp; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; if (o_ptr->tval == TV_RANDART) @@ -1082,11 +1083,11 @@ s32b object_value_real(object_type const *o_ptr) value = k_ptr->cost; /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (f5 & TR5_TEMPORARY) return (0L); + if (flags & TR_TEMPORARY) return (0L); - if (o_ptr->art_flags1 || o_ptr->art_flags2 || o_ptr->art_flags3) + if (o_ptr->art_flags) { value += flag_cost (o_ptr, o_ptr->pval); } @@ -1126,7 +1127,7 @@ s32b object_value_real(object_type const *o_ptr) } /* Pay the spell */ - if (f5 & TR5_SPELL_CONTAIN) + if (flags & TR_SPELL_CONTAIN) { if (o_ptr->pval2 != -1) value += 5000 + 500 * spell_type_skill_level(spell_at(o_ptr->pval2)); @@ -1164,28 +1165,28 @@ s32b object_value_real(object_type const *o_ptr) if (!o_ptr->pval) break; /* Give credit for stat bonuses */ - if (f1 & (TR1_STR)) value += (o_ptr->pval * 200L); - if (f1 & (TR1_INT)) value += (o_ptr->pval * 200L); - if (f1 & (TR1_WIS)) value += (o_ptr->pval * 200L); - if (f1 & (TR1_DEX)) value += (o_ptr->pval * 200L); - if (f1 & (TR1_CON)) value += (o_ptr->pval * 200L); - if (f1 & (TR1_CHR)) value += (o_ptr->pval * 200L); + if (flags & TR_STR) value += (o_ptr->pval * 200L); + if (flags & TR_INT) value += (o_ptr->pval * 200L); + if (flags & TR_WIS) value += (o_ptr->pval * 200L); + if (flags & TR_DEX) value += (o_ptr->pval * 200L); + if (flags & TR_CON) value += (o_ptr->pval * 200L); + if (flags & TR_CHR) value += (o_ptr->pval * 200L); - if (f5 & (TR5_CRIT)) value += (o_ptr->pval * 500L); + if (flags & TR_CRIT) value += (o_ptr->pval * 500L); /* Give credit for stealth and searching */ - if (f1 & (TR1_STEALTH)) value += (o_ptr->pval * 100L); - if (f1 & (TR1_SEARCH)) value += (o_ptr->pval * 100L); + if (flags & TR_STEALTH) value += (o_ptr->pval * 100L); + if (flags & TR_SEARCH) value += (o_ptr->pval * 100L); /* Give credit for infra-vision and tunneling */ - if (f1 & (TR1_INFRA)) value += (o_ptr->pval * 50L); - if (f1 & (TR1_TUNNEL)) value += (o_ptr->pval * 50L); + if (flags & TR_INFRA) value += (o_ptr->pval * 50L); + if (flags & TR_TUNNEL) value += (o_ptr->pval * 50L); /* Give credit for extra attacks */ - if (f1 & (TR1_BLOWS)) value += (o_ptr->pval * 2000L); + if (flags & TR_BLOWS) value += (o_ptr->pval * 2000L); /* Give credit for speed bonus */ - if (f1 & (TR1_SPEED)) value += (o_ptr->pval * 30000L); + if (flags & TR_SPEED) value += (o_ptr->pval * 30000L); break; } @@ -1435,17 +1436,15 @@ s32b object_value(object_type const *o_ptr) bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) { int total = o_ptr->number + j_ptr->number; - u32b f1, f2, f3, f4, f5, esp, f11, f12, f13, f14, esp1, f15; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - object_flags(j_ptr, &f11, &f12, &f13, &f14, &f15, &esp1); - + auto const o_flags = object_flags(o_ptr); + auto const j_flags = object_flags(j_ptr); /* Require identical object types */ if (o_ptr->k_idx != j_ptr->k_idx) return (0); - if ((f5 & TR5_SPELL_CONTAIN) || (f15 & TR5_SPELL_CONTAIN)) + if ((o_flags & TR_SPELL_CONTAIN) || (j_flags & TR_SPELL_CONTAIN)) return FALSE; /* Analyze the items */ @@ -1549,7 +1548,7 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) if (o_ptr->pval != j_ptr->pval) return (0); /* Do not combine recharged ones with non recharged ones. */ - if ((f4 & TR4_RECHARGED) != (f14 & TR4_RECHARGED)) return (0); + if ((o_flags & TR_RECHARGED) != (j_flags & TR_RECHARGED)) return (0); /* Do not combine different spells */ if (o_ptr->pval2 != j_ptr->pval2) return (0); @@ -1584,7 +1583,7 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) if (o_ptr->name1 != j_ptr->name1) return (0); /* Do not combine recharged ones with non recharged ones. */ - if ((f4 & TR4_RECHARGED) != (f14 & TR4_RECHARGED)) return (0); + if ((o_flags & TR_RECHARGED) != (j_flags & TR_RECHARGED)) return (0); /* Do not combine different spells */ if (o_ptr->pval2 != j_ptr->pval2) return (0); @@ -1724,10 +1723,10 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) /* Hack -- Identical art_flags! */ - if ((o_ptr->art_flags1 != j_ptr->art_flags1) || - (o_ptr->art_flags2 != j_ptr->art_flags2) || - (o_ptr->art_flags3 != j_ptr->art_flags3)) + if (o_ptr->art_flags != j_ptr->art_flags) + { return (0); + } /* Hack -- Require identical "cursed" status */ if ((o_ptr->ident & (IDENT_CURSED)) != (j_ptr->ident & (IDENT_CURSED))) return (0); @@ -1828,6 +1827,17 @@ void object_copy(object_type *o_ptr, object_type *j_ptr) } +/* + * Initialize the experience of an object which is a + * "sentient" object. + */ +static void init_obj_exp(object_type *o_ptr, object_kind const *k_ptr) +{ + o_ptr->elevel = (k_ptr->level / 10) + 1; + o_ptr->exp = player_exp[o_ptr->elevel - 1]; +} + + /* * Prepare an object based on an object kind. */ @@ -1866,13 +1876,15 @@ void object_prep(object_type *o_ptr, int k_idx) o_ptr->ds = k_ptr->ds; /* Hack -- cursed items are always "cursed" */ - if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED); + if (k_ptr->flags & TR_CURSED) + { + o_ptr->ident |= (IDENT_CURSED); + } /* Hack give a basic exp/exp level to an object that needs it */ - if (k_ptr->flags4 & TR4_LEVELS) + if (k_ptr->flags & TR_LEVELS) { - o_ptr->elevel = (k_ptr->level / 10) + 1; - o_ptr->exp = player_exp[o_ptr->elevel - 1]; + init_obj_exp(o_ptr, k_ptr); o_ptr->pval2 = 1; /* Start with one point */ o_ptr->pval3 = 0; /* No flags groups */ } @@ -2043,45 +2055,41 @@ static void object_mention(object_type *o_ptr) static void random_artifact_power(object_type *o_ptr) { // Shorthand - auto f2 = &o_ptr->art_flags2; - auto f3 = &o_ptr->art_flags3; - auto esp = &o_ptr->art_esp; + auto flags = &o_ptr->art_flags; // Choose ability - auto try_choose = [&o_ptr, &f2, &f3, &esp](int choice) { + auto try_choose = [&o_ptr, &flags](int choice) { switch (choice) { case 0: - (*f3) |= (TR3_FEATHER); + (*flags) |= (TR_FEATHER); break; case 1: - (*f3) |= (TR3_LITE1); + (*flags) |= (TR_LITE1); break; case 2: - (*f3) |= (TR3_SEE_INVIS); + (*flags) |= (TR_SEE_INVIS); break; case 3: - (*esp) |= (ESP_ALL); + (*flags) |= (ESP_ALL); break; case 4: - (*f3) |= (TR3_SLOW_DIGEST); + (*flags) |= (TR_SLOW_DIGEST); break; case 5: - (*f3) |= (TR3_REGEN); + (*flags) |= (TR_REGEN); break; case 6: - (*f2) |= (TR2_FREE_ACT); + (*flags) |= (TR_FREE_ACT); break; case 7: - (*f2) |= (TR2_HOLD_LIFE); + (*flags) |= (TR_HOLD_LIFE); break; } }; // Save old values for comparison - u32b const old_f2 = *f2; - u32b const old_f3 = *f3; - u32b const old_esp = *esp; + auto const old_flags = *flags; // Choose an ability; make sure we choose one that isn't already chosen for (int tries = 0; tries < 1000; tries++) @@ -2090,8 +2098,8 @@ static void random_artifact_power(object_type *o_ptr) int choice = rand_int(8); try_choose(choice); - // If there's any difference, then we chose a non-overlapping power. - if ((*f2 != old_f2) || (*f3 != old_f3) || (*esp != old_esp)) + // If there's any difference, then we've chosen a non-overlapping power. + if (*flags != old_flags) { break; } @@ -2100,12 +2108,12 @@ static void random_artifact_power(object_type *o_ptr) void random_artifact_resistance(object_type * o_ptr) { - auto f5 = a_info[o_ptr->name1].flags5; + auto art_flags = a_info[o_ptr->name1].flags; - // Check flags - bool give_resistance = (f5 & TR5_RANDOM_RESIST); - bool give_power = (f5 & TR5_RANDOM_POWER); - if (f5 & TR5_RANDOM_RES_OR_POWER) + // Check flags of the 'protype' artifact + auto give_resistance = bool(art_flags & TR_RANDOM_RESIST); + auto give_power = bool(art_flags & TR_RANDOM_POWER); + if (art_flags & TR_RANDOM_RES_OR_POWER) { if (randint(2) == 1) { @@ -2127,15 +2135,15 @@ void random_artifact_resistance(object_type * o_ptr) if (give_resistance) { - // Save resistance flags - u32b const f2 = o_ptr->art_flags2; + // Save flags + auto const flags = o_ptr->art_flags; // We'll be a little generous here and make sure that the object // gets a resistance that it doesn't actually already have. for (int tries = 0; tries < 1000; tries++) { random_resistance(o_ptr, randint(22) + 16); // Picked up a new resistance? - if (f2 != o_ptr->art_flags2) + if (flags != o_ptr->art_flags) { break; } @@ -2154,15 +2162,11 @@ void random_artifact_resistance(object_type * o_ptr) */ static bool_ make_artifact_special(object_type *o_ptr) { - int i; - int k_idx = 0; - u32b f1, f2, f3, f4, f5, esp; - /* No artifacts in the town */ if (!dun_level) return (FALSE); /* Check the artifact list (just the "specials") */ - for (i = 0; i < max_a_idx; i++) + for (int i = 0; i < max_a_idx; i++) { artifact_type *a_ptr = &a_info[i]; @@ -2173,10 +2177,10 @@ static bool_ make_artifact_special(object_type *o_ptr) if (a_ptr->cur_num) continue; /* Cannot generate non special ones */ - if (!(a_ptr->flags3 & TR3_INSTA_ART)) continue; + if (!(a_ptr->flags & TR_INSTA_ART)) continue; /* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */ - if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue; + if ((a_ptr->flags & TR_SPECIAL_GENE) && (!a_allow_special[i])) continue; /* XXX XXX Enforce minimum "depth" (loosely) */ if (a_ptr->level > dun_level) @@ -2192,7 +2196,7 @@ static bool_ make_artifact_special(object_type *o_ptr) if (rand_int(a_ptr->rarity - luck( -(a_ptr->rarity / 2), a_ptr->rarity / 2)) != 0) continue; /* Find the base object */ - k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); + int k_idx = lookup_kind(a_ptr->tval, a_ptr->sval); /* XXX XXX Enforce minimum "object" level (loosely) */ if (k_info[k_idx].level > object_level) @@ -2211,13 +2215,12 @@ static bool_ make_artifact_special(object_type *o_ptr) o_ptr->name1 = i; /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack give a basic exp/exp level to an object that needs it */ - if (f4 & TR4_LEVELS) + if (flags & TR_LEVELS) { - o_ptr->elevel = (k_info[k_idx].level / 10) + 1; - o_ptr->exp = player_exp[o_ptr->elevel - 1]; + init_obj_exp(o_ptr, &k_info[k_idx]); } /* Success */ @@ -2238,10 +2241,6 @@ static bool_ make_artifact_special(object_type *o_ptr) */ static bool_ make_artifact(object_type *o_ptr) { - int i; - u32b f1, f2, f3, f4, f5, esp; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - /* No artifacts in the town */ if (!dun_level) return (FALSE); @@ -2249,7 +2248,7 @@ static bool_ make_artifact(object_type *o_ptr) if (o_ptr->number != 1) return (FALSE); /* Check the artifact list (skip the "specials") */ - for (i = 0; i < max_a_idx; i++) + for (int i = 0; i < max_a_idx; i++) { artifact_type *a_ptr = &a_info[i]; @@ -2260,10 +2259,10 @@ static bool_ make_artifact(object_type *o_ptr) if (a_ptr->cur_num) continue; /* Cannot generate special ones */ - if (a_ptr->flags3 & TR3_INSTA_ART) continue; + if (a_ptr->flags & TR_INSTA_ART) continue; /* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */ - if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue; + if ((a_ptr->flags & TR_SPECIAL_GENE) && (!a_allow_special[i])) continue; /* Must have the correct fields */ if (a_ptr->tval != o_ptr->tval) continue; @@ -2289,13 +2288,12 @@ static bool_ make_artifact(object_type *o_ptr) random_artifact_resistance(o_ptr); /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack give a basic exp/exp level to an object that needs it */ - if (f4 & TR4_LEVELS) + if (flags & TR_LEVELS) { - o_ptr->elevel = (k_ptr->level / 10) + 1; - o_ptr->exp = player_exp[o_ptr->elevel - 1]; + init_obj_exp(o_ptr, &k_info[o_ptr->k_idx]); } /* Success */ @@ -2350,19 +2348,9 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good) if ((!good) && e_ptr->cost) continue; /* Must posses the good flags */ - if (((k_ptr->flags1 & e_ptr->need_flags1) != e_ptr->need_flags1) || - ((k_ptr->flags2 & e_ptr->need_flags2) != e_ptr->need_flags2) || - ((k_ptr->flags3 & e_ptr->need_flags3) != e_ptr->need_flags3) || - ((k_ptr->flags4 & e_ptr->need_flags4) != e_ptr->need_flags4) || - ((k_ptr->flags5 & e_ptr->need_flags5) != e_ptr->need_flags5) || - ((k_ptr->esp & e_ptr->need_esp) != e_ptr->need_esp)) + if ((k_ptr->flags & e_ptr->need_flags) != e_ptr->need_flags) continue; - if ((k_ptr->flags1 & e_ptr->forbid_flags1) || - (k_ptr->flags2 & e_ptr->forbid_flags2) || - (k_ptr->flags3 & e_ptr->forbid_flags3) || - (k_ptr->flags4 & e_ptr->forbid_flags4) || - (k_ptr->flags5 & e_ptr->forbid_flags5) || - (k_ptr->esp & e_ptr->forbid_esp)) + if (k_ptr->flags & e_ptr->forbid_flags) continue; /* ok */ @@ -2569,7 +2557,9 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) o_ptr->pval2 = randint(70) + (randint(70) << 8); } else - o_ptr->art_flags5 |= (TR5_SPELL_CONTAIN | TR5_WIELD_CAST); + { + o_ptr->art_flags |= (TR_SPELL_CONTAIN | TR_WIELD_CAST); + } break; } case TV_BOLT: @@ -3085,8 +3075,8 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) case SV_AMULET_RESISTANCE: { - if (randint(3) == 1) random_resistance(o_ptr, randint(34) + 4); - if (randint(5) == 1) o_ptr->art_flags2 |= TR2_RES_POIS; + if (randint(3) == 1) random_resistance(o_ptr, randint(34) + 4); + if (randint(5) == 1) o_ptr->art_flags |= TR_RES_POIS; } break; @@ -3113,7 +3103,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) { o_ptr->pval = 1 + m_bonus(3, level); - if (randint(3) == 1) o_ptr->art_flags3 |= TR3_SLOW_DIGEST; + if (randint(3) == 1) o_ptr->art_flags |= TR_SLOW_DIGEST; /* Boost the rating */ rating += 25; @@ -3194,7 +3184,6 @@ static int get_stick_max_level(byte tval, int level, int spl) */ static void a_m_aux_4(object_type *o_ptr, int level, int power) { - u32b f1, f2, f3, f4, f5, esp; s32b bonus_lvl, max_lvl; object_kind *k_ptr = &k_info[o_ptr->k_idx]; @@ -3243,12 +3232,15 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) case TV_LITE: { - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack -- random fuel */ - if (f4 & TR4_FUEL_LITE) + if (flags & TR_FUEL_LITE) { - if (k_info[o_ptr->k_idx].pval2 > 0) o_ptr->timeout = randint(k_info[o_ptr->k_idx].pval2); + if (k_info[o_ptr->k_idx].pval2 > 0) + { + o_ptr->timeout = randint(k_info[o_ptr->k_idx].pval2); + } } break; @@ -3471,22 +3463,22 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) switch (randint(6)) { case 1: - o_ptr->art_flags2 |= TR2_SUST_STR; + o_ptr->art_flags |= TR_SUST_STR; break; case 2: - o_ptr->art_flags2 |= TR2_SUST_INT; + o_ptr->art_flags |= TR_SUST_INT; break; case 3: - o_ptr->art_flags2 |= TR2_SUST_WIS; + o_ptr->art_flags |= TR_SUST_WIS; break; case 4: - o_ptr->art_flags2 |= TR2_SUST_DEX; + o_ptr->art_flags |= TR_SUST_DEX; break; case 5: - o_ptr->art_flags2 |= TR2_SUST_CON; + o_ptr->art_flags |= TR_SUST_CON; break; case 6: - o_ptr->art_flags2 |= TR2_SUST_CHR; + o_ptr->art_flags |= TR_SUST_CHR; break; } } @@ -3497,37 +3489,37 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) switch (randint(11)) { case 1: - o_ptr->art_flags2 |= (TR2_RES_BLIND); + o_ptr->art_flags |= TR_RES_BLIND; break; case 2: - o_ptr->art_flags2 |= (TR2_RES_CONF); + o_ptr->art_flags |= TR_RES_CONF; break; case 3: - o_ptr->art_flags2 |= (TR2_RES_SOUND); + o_ptr->art_flags |= TR_RES_SOUND; break; case 4: - o_ptr->art_flags2 |= (TR2_RES_SHARDS); + o_ptr->art_flags |= TR_RES_SHARDS; break; case 5: - o_ptr->art_flags2 |= (TR2_RES_NETHER); + o_ptr->art_flags |= TR_RES_NETHER; break; case 6: - o_ptr->art_flags2 |= (TR2_RES_NEXUS); + o_ptr->art_flags |= TR_RES_NEXUS; break; case 7: - o_ptr->art_flags2 |= (TR2_RES_CHAOS); + o_ptr->art_flags |= TR_RES_CHAOS; break; case 8: - o_ptr->art_flags2 |= (TR2_RES_DISEN); + o_ptr->art_flags |= TR_RES_DISEN; break; case 9: - o_ptr->art_flags2 |= (TR2_RES_POIS); + o_ptr->art_flags |= TR_RES_POIS; break; case 10: - o_ptr->art_flags2 |= (TR2_RES_DARK); + o_ptr->art_flags |= TR_RES_DARK; break; case 11: - o_ptr->art_flags2 |= (TR2_RES_LITE); + o_ptr->art_flags |= TR_RES_LITE; break; } } @@ -3538,28 +3530,28 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) switch (randint(8)) { case 1: - o_ptr->art_flags3 |= (TR3_FEATHER); + o_ptr->art_flags |= TR_FEATHER; break; case 2: - o_ptr->art_flags3 |= (TR3_LITE1); + o_ptr->art_flags |= TR_LITE1; break; case 3: - o_ptr->art_flags3 |= (TR3_SEE_INVIS); + o_ptr->art_flags |= TR_SEE_INVIS; break; case 4: - o_ptr->art_esp |= (ESP_ALL); + o_ptr->art_flags |= ESP_ALL; break; case 5: - o_ptr->art_flags3 |= (TR3_SLOW_DIGEST); + o_ptr->art_flags |= TR_SLOW_DIGEST; break; case 6: - o_ptr->art_flags3 |= (TR3_REGEN); + o_ptr->art_flags |= TR_REGEN; break; case 7: - o_ptr->art_flags2 |= (TR2_FREE_ACT); + o_ptr->art_flags |= TR_FREE_ACT; break; case 8: - o_ptr->art_flags2 |= (TR2_HOLD_LIFE); + o_ptr->art_flags |= TR_HOLD_LIFE; break; } } @@ -3613,11 +3605,11 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } if (randint(5) == 1) { - o_ptr->art_flags1 |= TR1_BRAND_POIS; + o_ptr->art_flags |= TR_BRAND_POIS; } if (o_ptr->tval == TV_SWORD && (randint(3) == 1)) { - o_ptr->art_flags1 |= TR1_VORPAL; + o_ptr->art_flags |= TR_VORPAL; } } @@ -3741,22 +3733,22 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) switch (randint(6)) { case 1: - o_ptr->art_flags1 |= TR1_STEALTH; + o_ptr->art_flags |= TR_STEALTH; break; case 2: - o_ptr->art_flags1 |= TR1_SEARCH; + o_ptr->art_flags |= TR_SEARCH; break; case 3: - o_ptr->art_flags1 |= TR1_INFRA; + o_ptr->art_flags |= TR_INFRA; break; case 4: - o_ptr->art_flags1 |= TR1_TUNNEL; + o_ptr->art_flags |= TR_TUNNEL; break; case 5: - o_ptr->art_flags1 |= TR1_SPEED; + o_ptr->art_flags |= TR_SPEED; break; case 6: - o_ptr->art_flags1 |= TR1_BLOWS; + o_ptr->art_flags |= TR_BLOWS; break; } } @@ -3766,22 +3758,22 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) switch (randint(6)) { case 1: - o_ptr->art_flags1 |= TR1_STR; + o_ptr->art_flags |= TR_STR; break; case 2: - o_ptr->art_flags1 |= TR1_INT; + o_ptr->art_flags |= TR_INT; break; case 3: - o_ptr->art_flags1 |= TR1_WIS; + o_ptr->art_flags |= TR_WIS; break; case 4: - o_ptr->art_flags1 |= TR1_DEX; + o_ptr->art_flags |= TR_DEX; break; case 5: - o_ptr->art_flags1 |= TR1_CON; + o_ptr->art_flags |= TR_CON; break; case 6: - o_ptr->art_flags1 |= TR1_CHR; + o_ptr->art_flags |= TR_CHR; break; } } @@ -3793,42 +3785,42 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) { case 1: { - o_ptr->art_flags1 |= TR1_STR; - o_ptr->art_flags2 |= TR2_SUST_STR; + o_ptr->art_flags |= TR_STR; + o_ptr->art_flags |= TR_SUST_STR; break; } case 2: { - o_ptr->art_flags1 |= TR1_INT; - o_ptr->art_flags2 |= TR2_SUST_INT; + o_ptr->art_flags |= TR_INT; + o_ptr->art_flags |= TR_SUST_INT; break; } case 3: { - o_ptr->art_flags1 |= TR1_WIS; - o_ptr->art_flags2 |= TR2_SUST_WIS; + o_ptr->art_flags |= TR_WIS; + o_ptr->art_flags |= TR_SUST_WIS; break; } case 4: { - o_ptr->art_flags1 |= TR1_DEX; - o_ptr->art_flags2 |= TR2_SUST_DEX; + o_ptr->art_flags |= TR_DEX; + o_ptr->art_flags |= TR_SUST_DEX; break; } case 5: { - o_ptr->art_flags1 |= TR1_CON; - o_ptr->art_flags2 |= TR2_SUST_CON; + o_ptr->art_flags |= TR_CON; + o_ptr->art_flags |= TR_SUST_CON; break; } case 6: { - o_ptr->art_flags1 |= TR1_CHR; - o_ptr->art_flags2 |= TR2_SUST_CHR; + o_ptr->art_flags |= TR_CHR; + o_ptr->art_flags |= TR_SUST_CHR; break; } } @@ -3841,26 +3833,26 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) { case 1: { - o_ptr->art_flags2 |= TR2_IM_FIRE; - o_ptr->art_flags3 |= TR3_IGNORE_FIRE; + o_ptr->art_flags |= TR_IM_FIRE; + o_ptr->art_flags |= TR_IGNORE_FIRE; break; } case 2: { - o_ptr->art_flags2 |= TR2_IM_ACID; - o_ptr->art_flags3 |= TR3_IGNORE_ACID; + o_ptr->art_flags |= TR_IM_ACID; + o_ptr->art_flags |= TR_IGNORE_ACID; break; } case 3: { - o_ptr->art_flags2 |= TR2_IM_ELEC; - o_ptr->art_flags3 |= TR3_IGNORE_ELEC; + o_ptr->art_flags |= TR_IM_ELEC; + o_ptr->art_flags |= TR_IGNORE_ELEC; break; } case 4: { - o_ptr->art_flags2 |= TR2_IM_COLD; - o_ptr->art_flags3 |= TR3_IGNORE_COLD; + o_ptr->art_flags |= TR_IM_COLD; + o_ptr->art_flags |= TR_IGNORE_COLD; break; } } @@ -3900,30 +3892,25 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) */ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional force_power) { - int i, rolls, f1, f2, power; + int i, rolls; object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Aply luck */ lev += luck( -7, 7); - /* Spell in it ? no ! */ - if (k_ptr->flags5 & TR5_SPELL_CONTAIN) + /* Spell in it? No! */ + if (k_ptr->flags & TR_SPELL_CONTAIN) o_ptr->pval2 = -1; /* Important to do before all else, be sure to have the basic obvious flags set */ - o_ptr->art_oflags1 = k_ptr->oflags1; - o_ptr->art_oflags2 = k_ptr->oflags2; - o_ptr->art_oflags3 = k_ptr->oflags3; - o_ptr->art_oflags4 = k_ptr->oflags4; - o_ptr->art_oflags5 = k_ptr->oflags5; - o_ptr->art_oesp = k_ptr->oesp; + o_ptr->art_oflags = k_ptr->oflags; /* No need to touch normal artifacts */ - if (k_ptr->flags3 & TR3_NORM_ART) + if (k_ptr->flags & TR_NORM_ART) { /* Ahah! we tried to trick us !! */ if (k_ptr->artifact || - ((k_ptr->flags4 & TR4_SPECIAL_GENE) && + ((k_ptr->flags & TR_SPECIAL_GENE) && (!k_allow_special[o_ptr->k_idx]))) { object_prep(o_ptr, lookup_kind(k_ptr->btval, k_ptr->bsval)); @@ -3962,47 +3949,49 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea /* Maximum "level" for various things */ if (lev > MAX_DEPTH - 1) lev = MAX_DEPTH - 1; + /* Roll for power */ + int power = 0; + { + /* Base chance of being "good" */ + int f1 = lev + 10 + luck( -15, 15); - /* Base chance of being "good" */ - f1 = lev + 10 + luck( -15, 15); - - /* Maximal chance of being "good" */ - if (f1 > 75) f1 = 75; - - /* Base chance of being "great" */ - f2 = f1 / 2; + /* Maximal chance of being "good" */ + if (f1 > 75) f1 = 75; - /* Maximal chance of being "great" */ - if (f2 > 20) f2 = 20; + /* Base chance of being "great" */ + int f2 = f1 / 2; + /* Maximal chance of being "great" */ + if (f2 > 20) f2 = 20; - /* Assume normal */ - power = 0; + /* Assume normal */ + power = 0; - /* Roll for "good" */ - if (good || magik(f1)) - { - /* Assume "good" */ - power = 1; + /* Roll for "good" */ + if (good || magik(f1)) + { + /* Assume "good" */ + power = 1; - /* Roll for "great" */ - if (great || magik(f2)) power = 2; - } + /* Roll for "great" */ + if (great || magik(f2)) power = 2; + } - /* Roll for "cursed" */ - else if (magik(f1)) - { - /* Assume "cursed" */ - power = -1; + /* Roll for "cursed" */ + else if (magik(f1)) + { + /* Assume "cursed" */ + power = -1; - /* Roll for "broken" */ - if (magik(f2)) power = -2; - } + /* Roll for "broken" */ + if (magik(f2)) power = -2; + } - /* Override power with parameter? */ - if (auto power_override = force_power) - { - power = *power_override; + /* Override power with parameter? */ + if (auto power_override = force_power) + { + power = *power_override; + } } /* Assume no rolls */ @@ -4054,7 +4043,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea o_ptr->number = 1; /* Hack -- extract the "cursed" flag */ - if (a_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED); + if (a_ptr->flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED); /* Mega-Hack -- increase the rating */ rating += 10; @@ -4068,15 +4057,14 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea /* Cheat -- peek at the item */ if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); - /* Spell in it ? no ! */ - if (a_ptr->flags5 & TR5_SPELL_CONTAIN) + /* Spell in it? No! */ + if (a_ptr->flags & TR_SPELL_CONTAIN) o_ptr->pval2 = -1; /* Give a basic exp/exp level to an artifact that needs it */ - if (a_ptr->flags4 & TR4_LEVELS) + if (a_ptr->flags & TR_LEVELS) { - o_ptr->elevel = (k_ptr->level / 10) + 1; - o_ptr->exp = player_exp[o_ptr->elevel - 1]; + init_obj_exp(o_ptr, k_ptr); } /* Done */ @@ -4159,7 +4147,6 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea ego_item_type *e_ptr; int j; bool_ limit_blows = FALSE; - u32b f1, f2, f3, f4, f5, esp; s16b e_idx; e_idx = o_ptr->name2; @@ -4174,35 +4161,23 @@ try_an_other_ego: /* Rarity check */ if (magik(e_ptr->rar[j])) { - o_ptr->art_flags1 |= e_ptr->flags1[j]; - o_ptr->art_flags2 |= e_ptr->flags2[j]; - o_ptr->art_flags3 |= e_ptr->flags3[j]; - o_ptr->art_flags4 |= e_ptr->flags4[j]; - o_ptr->art_flags5 |= e_ptr->flags5[j]; - o_ptr->art_esp |= e_ptr->esp[j]; - - o_ptr->art_oflags1 |= e_ptr->oflags1[j]; - o_ptr->art_oflags2 |= e_ptr->oflags2[j]; - o_ptr->art_oflags3 |= e_ptr->oflags3[j]; - o_ptr->art_oflags4 |= e_ptr->oflags4[j]; - o_ptr->art_oflags5 |= e_ptr->oflags5[j]; - o_ptr->art_oesp |= e_ptr->oesp[j]; - + o_ptr->art_flags |= e_ptr->flags[j]; + o_ptr->art_oflags |= e_ptr->oflags[j]; add_random_ego_flag(o_ptr, e_ptr->fego[j], &limit_blows); } } /* No insane number of blows */ - if (limit_blows && (o_ptr->art_flags1 & TR1_BLOWS)) + if (limit_blows && (o_ptr->art_flags & TR_BLOWS)) { if (o_ptr->pval > 2) o_ptr->pval = randint(2); } /* get flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack -- acquire "cursed" flag */ - if (f3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED); + if (flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED); /* Hack -- obtain bonuses */ if (e_ptr->max_to_h > 0) o_ptr->to_h += randint(e_ptr->max_to_h); @@ -4225,16 +4200,18 @@ try_an_other_ego: goto try_an_other_ego; } - /* Spell in it ? no ! */ - if (f5 & TR5_SPELL_CONTAIN) + /* Spell in it ? No! */ + if (flags & TR_SPELL_CONTAIN) { /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */ if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) { - o_ptr->art_flags5 &= ~TR5_SPELL_CONTAIN; + o_ptr->art_flags &= ~TR_SPELL_CONTAIN; } else + { o_ptr->pval2 = -1; + } } /* Cheat -- describe the item */ @@ -4245,33 +4222,32 @@ try_an_other_ego: /* Examine real objects */ if (o_ptr->k_idx) { - u32b f1, f2, f3, f4, f5, esp; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Hack -- acquire "cursed" flag */ - if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED); + if (k_ptr->flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED); /* Extract some flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack give a basic exp/exp level to an object that needs it */ - if (f4 & TR4_LEVELS) + if (flags & TR_LEVELS) { - o_ptr->elevel = (k_ptr->level / 10) + 1; - o_ptr->exp = player_exp[o_ptr->elevel - 1]; + init_obj_exp(o_ptr, k_ptr); } - /* Spell in it ? no ! */ - if (f5 & TR5_SPELL_CONTAIN) + /* Spell in it ? No! */ + if (flags & TR_SPELL_CONTAIN) { /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */ if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) { - o_ptr->art_flags5 &= ~TR5_SPELL_CONTAIN; + o_ptr->art_flags &= ~TR_SPELL_CONTAIN; } else + { o_ptr->pval2 = -1; + } } /* Hacccccccckkkkk attack ! :) -- To prevent som ugly crashs */ @@ -4284,7 +4260,7 @@ try_an_other_ego: if (o_ptr->tval == TV_ROD_MAIN) { /* Set the max mana and the current mana */ - o_ptr->pval2 = (f4 & TR4_CAPACITY) ? o_ptr->sval * 2 : o_ptr->sval; + o_ptr->pval2 = (flags & TR_CAPACITY) ? o_ptr->sval * 2 : o_ptr->sval; o_ptr->timeout = o_ptr->pval2; } @@ -4522,14 +4498,14 @@ bool_ kind_is_legal(int k_idx) if (!kind_is_theme(match_theme, k_idx)) return FALSE; - if (k_ptr->flags4 & TR4_SPECIAL_GENE) + if (k_ptr->flags & TR_SPECIAL_GENE) { if (k_allow_special[k_idx]) return TRUE; else return FALSE; } /* No 2 times the same normal artifact */ - if ((k_ptr->flags3 & TR3_NORM_ART) && (k_ptr->artifact)) + if ((k_ptr->flags & TR_NORM_ART) && (k_ptr->artifact)) { return FALSE; } @@ -4895,7 +4871,7 @@ void place_object(int y, int x, bool_ good, bool_ great, int where) { a_info[q_ptr->name1].cur_num = 0; } - else if (k_info[q_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[q_ptr->k_idx].flags & TR_NORM_ART) { k_info[q_ptr->k_idx].artifact = 0; } @@ -5266,7 +5242,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) { a_info[j_ptr->name1].cur_num = 0; } - else if (k_info[j_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[j_ptr->k_idx].flags & TR_NORM_ART) { k_info[j_ptr->k_idx].artifact = 0; } diff --git a/src/object_filter.cc b/src/object_filter.cc index 39961146..936eef7d 100644 --- a/src/object_filter.cc +++ b/src/object_filter.cc @@ -17,33 +17,10 @@ object_filter_t SVal(byte sval) { }; } -object_filter_t HasFlag3(u32b mask) { +object_filter_t HasFlags(object_flag_set const &mask) { return [=](object_type const *o_ptr) -> bool { - // Extract the flags - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - // Does the item have the flag? - return (f3 & mask); - }; -} - -object_filter_t HasFlag4(u32b mask) { - return [=](object_type const *o_ptr) -> bool { - // Extract the flags - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - // Does the item have the flag? - return (f4 & mask); - }; -} - -object_filter_t HasFlag5(u32b mask) { - return [=](object_type const *o_ptr) -> bool { - // Extract the flags - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - // Does the item have the flag? - return (f5 & mask); + auto const flags = object_flags(o_ptr); + return bool(flags & mask); }; } diff --git a/src/object_filter.hpp b/src/object_filter.hpp index 9a22090b..d18e13ee 100644 --- a/src/object_filter.hpp +++ b/src/object_filter.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" #include "object_type_fwd.hpp" #include @@ -21,19 +22,9 @@ object_filter_t TVal(byte tval); object_filter_t SVal(byte sval); /** - * Has given bit mask in flag3 value. + * Has given set of flags set. */ -object_filter_t HasFlag3(u32b mask); - -/** - * Has given bit mask in flag4 value. - */ -object_filter_t HasFlag4(u32b mask); - -/** - * Has given bit mask in flag5 value. - */ -object_filter_t HasFlag5(u32b mask); +object_filter_t HasFlags(object_flag_set const &); /** * Is the object an artifact? diff --git a/src/object_flag.hpp b/src/object_flag.hpp new file mode 100644 index 00000000..d5ec2fef --- /dev/null +++ b/src/object_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "object_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define TR(tier, index, name, e_name, c_name, c_page, c_col, c_row, c_type, c_prio, is_pval, is_esp) \ + DECLARE_FLAG(object_flag_set, name, tier, index) +#include "object_flag_list.hpp" +#undef TR diff --git a/src/object_flag_list.hpp b/src/object_flag_list.hpp new file mode 100644 index 00000000..56cf1b88 --- /dev/null +++ b/src/object_flag_list.hpp @@ -0,0 +1,196 @@ +/** + * X-macro list of all the object flags. + * + * Parameters: + * + * - e_name: name of the flag in the edit files. + * - c_name: name of the flag on the character sheet + * (10 characters max). If nullptrptr the + * flag doesn't appear and the other c_* + * values are ignored. + * - c_page: page on the character sheet (0-3). + * - c_col: column number on the character sheet (0-1). + * - c_row: row number on the character sheet (0-15). + * - c_type: type of the character sheet; either + * NUMERIC, BINARY or TERNARY(n). + * - c_prio: priority if the flag overlaps another flag + * on the character sheet. 0 is lowes priority. + * - is_pval: true iff the flag _description_ depends on PVAL. + * - is_esp: true iff the flag affects ESP. + */ + +/* TR(, , , , , , , , , , , ) */ + +TR(1, 0, TR_STR , STR , "Add Str" , 0, 0, 0, NUMERIC , 0, true , false) +TR(1, 1, TR_INT , INT , "Add Int" , 0, 0, 1, NUMERIC , 0, true , false) +TR(1, 2, TR_WIS , WIS , "Add Wis" , 0, 0, 2, NUMERIC , 0, true , false) +TR(1, 3, TR_DEX , DEX , "Add Dex" , 0, 0, 3, NUMERIC , 0, true , false) +TR(1, 4, TR_CON , CON , "Add Con" , 0, 0, 4, NUMERIC , 0, true , false) +TR(1, 5, TR_CHR , CHR , "Add Chr" , 0, 0, 5, NUMERIC , 0, true , false) +TR(1, 6, TR_MANA , MANA , "Mul Mana" , 0, 0, 6, BINARY , 0, false, false) +TR(1, 7, TR_SPELL , SPELL , "Mul SPower", 0, 0, 7, BINARY , 0, true , false) +TR(1, 8, TR_STEALTH , STEALTH , "Add Stea." , 0, 0, 8, NUMERIC , 0, true , false) +TR(1, 9, TR_SEARCH , SEARCH , "Add Sear." , 0, 0, 9, NUMERIC , 0, true , false) +TR(1, 10, TR_INFRA , INFRA , "Add Infra" , 0, 0, 10, NUMERIC , 0, true , false) +TR(1, 11, TR_TUNNEL , TUNNEL , "Add Tun.." , 0, 0, 11, NUMERIC , 0, true , false) +TR(1, 12, TR_SPEED , SPEED , "Add Speed" , 0, 0, 12, NUMERIC , 0, true , false) +TR(1, 13, TR_BLOWS , BLOWS , "Add Blows" , 0, 0, 13, NUMERIC , 0, true , false) +TR(1, 14, TR_CHAOTIC , CHAOTIC , "Chaotic" , 0, 0, 14, BINARY , 0, false, false) +TR(1, 15, TR_VAMPIRIC , VAMPIRIC , "Vampiric" , 0, 0, 15, BINARY , 0, false, false) +TR(1, 16, TR_SLAY_ANIMAL , SLAY_ANIMAL , "Slay Anim.", 0, 1, 0, BINARY , 0, false, false) +TR(1, 17, TR_SLAY_EVIL , SLAY_EVIL , "Slay Evil" , 0, 1, 1, BINARY , 0, false, false) +TR(1, 18, TR_SLAY_UNDEAD , SLAY_UNDEAD , "Slay Und." , 0, 1, 2, BINARY , 0, false, false) +TR(1, 19, TR_SLAY_DEMON , SLAY_DEMON , "Slay Demon", 0, 1, 3, BINARY , 0, false, false) +TR(1, 20, TR_SLAY_ORC , SLAY_ORC , "Slay Orc" , 0, 1, 4, BINARY , 0, false, false) +TR(1, 21, TR_SLAY_TROLL , SLAY_TROLL , "Slay Troll", 0, 1, 5, BINARY , 0, false, false) +TR(1, 22, TR_SLAY_GIANT , SLAY_GIANT , "Slay Giant", 0, 1, 6, BINARY , 0, false, false) +TR(1, 23, TR_SLAY_DRAGON , SLAY_DRAGON , "Slay Drag.", 0, 1, 7, BINARY , 0, false, false) +TR(1, 24, TR_KILL_DRAGON , KILL_DRAGON , "Kill Drag.", 0, 1, 8, BINARY , 0, false, false) +TR(1, 25, TR_VORPAL , VORPAL , "Sharpness" , 0, 1, 9, BINARY , 0, false, false) +TR(1, 26, TR_IMPACT , IMPACT , "Impact" , 0, 1, 10, BINARY , 0, false, false) +TR(1, 27, TR_BRAND_POIS , BRAND_POIS , "Poison Brd", 0, 1, 11, BINARY , 0, false, false) +TR(1, 28, TR_BRAND_ACID , BRAND_ACID , "Acid Brand", 0, 1, 12, BINARY , 0, false, false) +TR(1, 29, TR_BRAND_ELEC , BRAND_ELEC , "Elec Brand", 0, 1, 13, BINARY , 0, false, false) +TR(1, 30, TR_BRAND_FIRE , BRAND_FIRE , "Fire Brand", 0, 1, 14, BINARY , 0, false, false) +TR(1, 31, TR_BRAND_COLD , BRAND_COLD , "Cold Brand", 0, 1, 15, BINARY , 0, false, false) + +TR(2, 0, TR_SUST_STR , SUST_STR , "Sust Str" , 1, 0, 0, BINARY , 0, false, false) +TR(2, 1, TR_SUST_INT , SUST_INT , "Sust Int" , 1, 0, 1, BINARY , 0, false, false) +TR(2, 2, TR_SUST_WIS , SUST_WIS , "Sust Wis" , 1, 0, 2, BINARY , 0, false, false) +TR(2, 3, TR_SUST_DEX , SUST_DEX , "Sust Dex" , 1, 0, 3, BINARY , 0, false, false) +TR(2, 4, TR_SUST_CON , SUST_CON , "Sust Con" , 1, 0, 4, BINARY , 0, false, false) +TR(2, 5, TR_SUST_CHR , SUST_CHR , "Sust Chr" , 1, 0, 5, BINARY , 0, false, false) +TR(2, 6, TR_INVIS , INVIS , "Invisible" , 1, 0, 6, BINARY , 0, false, false) +TR(2, 7, TR_LIFE , LIFE , "Mul life" , 1, 0, 7, BINARY , 0, false, false) +TR(2, 8, TR_IM_ACID , IM_ACID , "Imm Acid" , 1, 1, 0, TERNARY(2), 1, false, false) +TR(2, 9, TR_IM_ELEC , IM_ELEC , "Imm Elec" , 1, 1, 1, TERNARY(2), 1, false, false) +TR(2, 10, TR_IM_FIRE , IM_FIRE , "Imm Fire" , 1, 1, 2, TERNARY(2), 1, false, false) +TR(2, 11, TR_IM_COLD , IM_COLD , "Imm Cold" , 1, 1, 3, TERNARY(2), 1, false, false) +TR(2, 12, TR_SENS_FIRE , SENS_FIRE , "Sens Fire" , 1, 0, 12, BINARY , 0, false, false) +TR(2, 13, TR_REFLECT , REFLECT , "Reflect" , 1, 0, 13, BINARY , 0, false, false) +TR(2, 14, TR_FREE_ACT , FREE_ACT , "Free Act" , 1, 0, 14, BINARY , 0, false, false) +TR(2, 15, TR_HOLD_LIFE , HOLD_LIFE , "Hold Life" , 1, 0, 15, BINARY , 0, false, false) +TR(2, 16, TR_RES_ACID , RES_ACID , "Res Acid" , 1, 1, 0, TERNARY(1), 0, false, false) +TR(2, 17, TR_RES_ELEC , RES_ELEC , "Res Elec" , 1, 1, 1, TERNARY(1), 0, false, false) +TR(2, 18, TR_RES_FIRE , RES_FIRE , "Res Fire" , 1, 1, 2, TERNARY(1), 0, false, false) +TR(2, 19, TR_RES_COLD , RES_COLD , "Res Cold" , 1, 1, 3, TERNARY(1), 0, false, false) +TR(2, 20, TR_RES_POIS , RES_POIS , "Res Pois" , 1, 1, 4, BINARY , 0, false, false) +TR(2, 21, TR_RES_FEAR , RES_FEAR , "Res Fear" , 1, 1, 5, BINARY , 0, false, false) +TR(2, 22, TR_RES_LITE , RES_LITE , "Res Light" , 1, 1, 6, BINARY , 0, false, false) +TR(2, 23, TR_RES_DARK , RES_DARK , "Res Dark" , 1, 1, 7, BINARY , 0, false, false) +TR(2, 24, TR_RES_BLIND , RES_BLIND , "Res Blind" , 1, 1, 8, BINARY , 0, false, false) +TR(2, 25, TR_RES_CONF , RES_CONF , "Res Conf" , 1, 1, 9, BINARY , 0, false, false) +TR(2, 26, TR_RES_SOUND , RES_SOUND , "Res Sound" , 1, 1, 10, BINARY , 0, false, false) +TR(2, 27, TR_RES_SHARDS , RES_SHARDS , "Res Shard" , 1, 1, 11, BINARY , 0, false, false) +TR(2, 28, TR_RES_NETHER , RES_NETHER , "Res Neth" , 1, 1, 12, TERNARY(1), 0, false, false) +TR(2, 29, TR_RES_NEXUS , RES_NEXUS , "Res Nexus" , 1, 1, 13, BINARY , 0, false, false) +TR(2, 30, TR_RES_CHAOS , RES_CHAOS , "Res Chaos" , 1, 1, 14, BINARY , 0, false, false) +TR(2, 31, TR_RES_DISEN , RES_DISEN , "Res Disen" , 1, 1, 15, BINARY , 0, false, false) + +TR(3, 0, TR_SH_FIRE , SH_FIRE , "Aura Fire" , 2, 0, 0, BINARY , 0, false, false) +TR(3, 1, TR_SH_ELEC , SH_ELEC , "Aura Elec" , 2, 0, 1, BINARY , 0, false, false) +TR(3, 2, TR_AUTO_CURSE , AUTO_CURSE , "Auto Curse", 2, 0, 2, BINARY , 0, false, false) +TR(3, 3, TR_DECAY , DECAY , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 4, TR_NO_TELE , NO_TELE , "NoTeleport", 2, 0, 4, BINARY , 0, false, false) +TR(3, 5, TR_NO_MAGIC , NO_MAGIC , "AntiMagic" , 2, 0, 5, BINARY , 0, false, false) +TR(3, 6, TR_WRAITH , WRAITH , "WraithForm", 2, 0, 6, BINARY , 0, false, false) +TR(3, 7, TR_TY_CURSE , TY_CURSE , "EvilCurse" , 2, 0, 7, BINARY , 0, false, false) +TR(3, 8, TR_EASY_KNOW , EASY_KNOW , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 9, TR_HIDE_TYPE , HIDE_TYPE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 10, TR_SHOW_MODS , SHOW_MODS , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 11, TR_INSTA_ART , INSTA_ART , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 12, TR_FEATHER , FEATHER , "Levitate" , 2, 0, 12, BINARY , 0, false, false) +TR(3, 13, TR_LITE1 , LITE1 , "Lite" , 2, 0, 13, FIXED(1) , 0, false, false) +TR(3, 14, TR_SEE_INVIS , SEE_INVIS , "See Invis" , 2, 0, 14, BINARY , 0, false, false) +TR(3, 15, TR_NORM_ART , NORM_ART , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 16, TR_SLOW_DIGEST , SLOW_DIGEST , "Digestion" , 2, 1, 0, BINARY , 0, false, false) +TR(3, 17, TR_REGEN , REGEN , "Regen" , 2, 1, 1, BINARY , 0, false, false) +TR(3, 18, TR_XTRA_MIGHT , XTRA_MIGHT , "Xtra Might", 2, 1, 2, BINARY , 0, false, false) +TR(3, 19, TR_XTRA_SHOTS , XTRA_SHOTS , "Xtra Shots", 2, 1, 3, BINARY , 0, false, false) +TR(3, 20, TR_IGNORE_ACID , IGNORE_ACID , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 21, TR_IGNORE_ELEC , IGNORE_ELEC , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 22, TR_IGNORE_FIRE , IGNORE_FIRE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 23, TR_IGNORE_COLD , IGNORE_COLD , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(3, 24, TR_ACTIVATE , ACTIVATE , "Activate" , 2, 1, 8, BINARY , 0, false, false) +TR(3, 25, TR_DRAIN_EXP , DRAIN_EXP , "Drain Exp" , 2, 1, 9, BINARY , 0, false, false) +TR(3, 26, TR_TELEPORT , TELEPORT , "Teleport" , 2, 1, 10, BINARY , 0, false, false) +TR(3, 27, TR_AGGRAVATE , AGGRAVATE , "Aggravate" , 2, 1, 11, BINARY , 0, false, false) +TR(3, 28, TR_BLESSED , BLESSED , "Blessed" , 2, 1, 12, BINARY , 0, false, false) +TR(3, 29, TR_CURSED , CURSED , "Cursed" , 2, 1, 13, BINARY , 0, false, false) +TR(3, 30, TR_HEAVY_CURSE , HEAVY_CURSE , "Hvy Curse" , 2, 1, 14, BINARY , 0, false, false) +TR(3, 31, TR_PERMA_CURSE , PERMA_CURSE , "Prm Curse" , 2, 1, 15, BINARY , 0, false, false) + +TR(4, 0, TR_NEVER_BLOW , NEVER_BLOW , "No blows" , 3, 0, 0, BINARY , 0, false, false) +TR(4, 1, TR_PRECOGNITION , PRECOGNITION , "Precogn." , 3, 0, 1, BINARY , 0, false, false) +TR(4, 2, TR_BLACK_BREATH , BLACK_BREATH , "B.Breath" , 3, 0, 2, BINARY , 0, false, false) +TR(4, 3, TR_RECHARGE , RECHARGE , "Recharge" , 3, 0, 3, BINARY , 0, false, false) +TR(4, 4, TR_FLY , FLY , "Fly" , 3, 0, 4, BINARY , 0, false, false) +TR(4, 5, TR_DG_CURSE , DG_CURSE , "Mrg.Curse" , 3, 0, 5, BINARY , 0, false, false) +TR(4, 6, TR_COULD2H , COULD2H , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 7, TR_MUST2H , MUST2H , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 8, TR_LEVELS , LEVELS , "Sentient" , 3, 0, 8, BINARY , 0, false, false) +TR(4, 9, TR_CLONE , CLONE , "Clone" , 3, 0, 9, BINARY , 0, false, false) +TR(4, 10, TR_SPECIAL_GENE , SPECIAL_GENE , nullptr , 3, 0, 10, BINARY , 0, false, false) +TR(4, 11, TR_CLIMB , CLIMB , "Climb" , 3, 0, 11, BINARY , 0, false, false) +TR(4, 12, TR_FAST_CAST , FAST_CAST , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 13, TR_CAPACITY , CAPACITY , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 14, TR_CHARGING , CHARGING , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 15, TR_CHEAPNESS , CHEAPNESS , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 16, TR_FOUNTAIN , FOUNTAIN , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 17, TR_ANTIMAGIC_50 , ANTIMAGIC_50 , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 21, TR_EASY_USE , EASY_USE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 22, TR_IM_NETHER , IM_NETHER , "Imm Neth" , 1, 1, 12, TERNARY(2), 1, false, false) +TR(4, 23, TR_RECHARGED , RECHARGED , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 24, TR_ULTIMATE , ULTIMATE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 25, TR_AUTO_ID , AUTO_ID , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 26, TR_LITE2 , LITE2 , "Lite" , 2, 0, 13, FIXED(2) , 0, false, false) +TR(4, 27, TR_LITE3 , LITE3 , "Lite" , 2, 0, 13, FIXED(3) , 0, false, false) +TR(4, 28, TR_FUEL_LITE , FUEL_LITE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 30, TR_CURSE_NO_DROP , CURSE_NO_DROP , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(4, 31, TR_NO_RECHARGE , NO_RECHARGE , nullptr , -1, -1, -1, BINARY , 0, false, false) + +TR(5, 0, TR_TEMPORARY , TEMPORARY , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 1, TR_DRAIN_MANA , DRAIN_MANA , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 2, TR_DRAIN_HP , DRAIN_HP , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 3, TR_KILL_DEMON , KILL_DEMON , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 4, TR_KILL_UNDEAD , KILL_UNDEAD , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 5, TR_CRIT , CRIT , nullptr , -1, -1, -1, BINARY , 0, true , false) +TR(5, 6, TR_ATTR_MULTI , ATTR_MULTI , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 7, TR_WOUNDING , WOUNDING , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 8, TR_FULL_NAME , FULL_NAME , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 9, TR_LUCK , LUCK , nullptr , -1, -1, -1, BINARY , 0, true , false) +TR(5, 10, TR_IMMOVABLE , IMMOVABLE , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 11, TR_SPELL_CONTAIN , SPELL_CONTAIN , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 12, TR_RES_MORGUL , RES_MORGUL , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 13, TR_ACTIVATE_NO_WIELD , ACTIVATE_NO_WIELD , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 14, TR_MAGIC_BREATH , MAGIC_BREATH , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 15, TR_WATER_BREATH , WATER_BREATH , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 16, TR_WIELD_CAST , WIELD_CAST , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 17, TR_RANDOM_RESIST , RANDOM_RESIST , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 18, TR_RANDOM_POWER , RANDOM_POWER , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(5, 19, TR_RANDOM_RES_OR_POWER, RANDOM_RES_OR_POWER, nullptr , -1, -1, -1, BINARY , 0, false, false) + +TR(6, 0, TR_AUTOMATIC_5 , AUTOMATIC_5 , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 1, TR_AUTOMATIC_99 , AUTOMATIC_99 , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 2, TR_KILL_GHOST , KILL_GHOST , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 3, TR_TELEPORT_TO , TELEPORT_TO , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 4, TR_ONLY_DRAGON , ONLY_DRAGON , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 5, TR_ONLY_DEMON , ONLY_DEMON , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 8, TR_ONLY_ANIMAL , ONLY_ANIMAL , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 9, TR_ONLY_UNDEAD , ONLY_UNDEAD , nullptr , -1, -1, -1, BINARY , 0, false, false) +TR(6, 10, TR_ONLY_EVIL , ONLY_EVIL , nullptr , -1, -1, -1, BINARY , 0, false, false) + +TR(7, 0, ESP_ORC , ESP_ORC , "Orc.ESP" , 3, 1, 0, BINARY , 0, false, true ) +TR(7, 1, ESP_TROLL , ESP_TROLL , "Troll.ESP" , 3, 1, 1, BINARY , 0, false, true ) +TR(7, 2, ESP_DRAGON , ESP_DRAGON , "Dragon.ESP", 3, 1, 2, BINARY , 0, false, true ) +TR(7, 3, ESP_GIANT , ESP_GIANT , "Giant.ESP" , 3, 1, 3, BINARY , 0, false, true ) +TR(7, 4, ESP_DEMON , ESP_DEMON , "Demon.ESP" , 3, 1, 4, BINARY , 0, false, true ) +TR(7, 5, ESP_UNDEAD , ESP_UNDEAD , "Undead.ESP", 3, 1, 5, BINARY , 0, false, true ) +TR(7, 6, ESP_EVIL , ESP_EVIL , "Evil.ESP" , 3, 1, 6, BINARY , 0, false, true ) +TR(7, 7, ESP_ANIMAL , ESP_ANIMAL , "Animal.ESP", 3, 1, 7, BINARY , 0, false, true ) +TR(7, 8, ESP_THUNDERLORD , ESP_THUNDERLORD , "TLord.ESP" , 3, 1, 8, BINARY , 0, false, true ) +TR(7, 9, ESP_GOOD , ESP_GOOD , "Good.ESP" , 3, 1, 9, BINARY , 0, false, true ) +TR(7, 10, ESP_NONLIVING , ESP_NONLIVING , "Nlive.ESP" , 3, 1, 10, BINARY , 0, false, true ) +TR(7, 11, ESP_UNIQUE , ESP_UNIQUE , "Unique.ESP", 3, 1, 11, BINARY , 0, false, true ) +TR(7, 12, ESP_SPIDER , ESP_SPIDER , "Spider ESP", 3, 1, 12, BINARY , 0, false, true ) +TR(7, 31, ESP_ALL , ESP_ALL , "Full ESP" , 3, 1, 15, BINARY , 0, false, true ) diff --git a/src/object_flag_meta.cc b/src/object_flag_meta.cc new file mode 100644 index 00000000..89b91fea --- /dev/null +++ b/src/object_flag_meta.cc @@ -0,0 +1,59 @@ +#include "object_flag_meta.hpp" + +#include "object_flag.hpp" + +std::vector const &object_flags_meta() +{ + static std::vector instance; + + if (instance.empty()) + { +#define NUMERIC 'n' +#define BINARY 'b' +#define TERNARY(n) ((n == 1) ? '+' : ((n == 2) ? '*' : '?')) +#define FIXED(n) ((n == 1) ? '1' : ((n == 2) ? '2' : ((n == 3) ? '3' : '?'))) +#define TR(tier, index, name, e_name, c_name, c_page, c_col, c_row, c_type, c_prio, is_pval, is_esp) \ + instance.emplace_back(new object_flag_meta { \ + name, \ + #name, \ + #e_name, \ + c_name, \ + c_page, \ + c_col, \ + c_row, \ + c_type, \ + c_prio, \ + is_pval, \ + is_esp \ + }); +#include "object_flag_list.hpp" +#undef TR +#undef FIXED +#undef TERNARY +#undef BINARY +#undef NUMERIC + }; + + return instance; +} + +object_flag_set const &object_flags_esp() +{ + static object_flag_set instance; + static bool initialized = false; + + if (!initialized) + { + for (auto const object_flag_meta: object_flags_meta()) + { + if (object_flag_meta->is_esp) + { + instance |= object_flag_meta->flag_set; + } + } + + initialized = true; + } + + return instance; +} diff --git a/src/object_flag_meta.hpp b/src/object_flag_meta.hpp new file mode 100644 index 00000000..d488c0d5 --- /dev/null +++ b/src/object_flag_meta.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "object_flag_set.hpp" + +#include + +struct object_flag_meta { + + /** + * Flag set representation of the object flag. + */ + const object_flag_set flag_set; + + /** + * Name of the object flag. + */ + const char *name; + + /** + * Edit file name of the object flag. + */ + const char *e_name; + + /** + * Character sheet name of the object flag. + */ + const char *c_name; + + /** + * Character sheet page. + */ + const int c_page; + + /** + * Character sheet column. + */ + const int c_column; + + /** + * Character sheet row. + */ + const int c_row; + + /** + * Character sheet type. + */ + char c_type; + + /** + * Priority wrt. other flags in the same position + * on the character sheet. + */ + int c_priority; + + /** + * Is this flag *described* using PVAL? + */ + bool is_pval; + + /** + * Is this a flag which affects ESP? + */ + bool is_esp; + +}; + +/** + * Get a vector of all the object flags. + */ +std::vector const &object_flags_meta(); + +/** + * Get a flag representing all ESP flags. + */ +object_flag_set const &object_flags_esp(); diff --git a/src/object_flag_set.hpp b/src/object_flag_set.hpp new file mode 100644 index 00000000..478b6c03 --- /dev/null +++ b/src/object_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t TR_MAX_TIERS = 7; + +typedef flag_set object_flag_set; diff --git a/src/object_kind.hpp b/src/object_kind.hpp index 767c7e05..2f347f3f 100644 --- a/src/object_kind.hpp +++ b/src/object_kind.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" /** * Size of allocation table for objects @@ -38,17 +39,9 @@ struct object_kind s32b cost = 0; /* Object "base cost" */ - u32b flags1 = 0; /* Flags, set 1 */ - u32b flags2 = 0; /* Flags, set 2 */ - u32b flags3 = 0; /* Flags, set 3 */ - u32b flags4 = 0; /* Flags, set 4 */ - u32b flags5 = 0; /* Flags, set 5 */ + object_flag_set flags; - u32b oflags1 = 0; /* Obvious Flags, set 1 */ - u32b oflags2 = 0; /* Obvious Flags, set 2 */ - u32b oflags3 = 0; /* Obvious Flags, set 3 */ - u32b oflags4 = 0; /* Obvious Flags, set 4 */ - u32b oflags5 = 0; /* Obvious Flags, set 5 */ + object_flag_set oflags; byte locale[ALLOCATION_MAX] = { 0 }; /* Allocation level(s) */ byte chance[ALLOCATION_MAX] = { 0 }; /* Allocation chance(s) */ @@ -72,9 +65,6 @@ struct object_kind bool_ tried = 0; /* The player has "tried" one of the items */ - u32b esp = 0; /* ESP flags */ - u32b oesp = 0; /* Obvious ESP flags */ - byte btval = 0; /* Become Object type */ byte bsval = 0; /* Become Object sub type */ bool_ artifact = 0; /* Is it a normal artifact(already generated) */ diff --git a/src/object_type.hpp b/src/object_type.hpp index c0f59547..48d18cf1 100644 --- a/src/object_type.hpp +++ b/src/object_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" /** * Object information for a specific object. @@ -77,19 +78,8 @@ struct object_type u16b note = 0; /* Inscription index */ u16b art_name = 0; /* Artifact name (random artifacts) */ - u32b art_flags1 = 0; /* Flags, set 1 Alas, these were necessary */ - u32b art_flags2 = 0; /* Flags, set 2 for the random artifacts of*/ - u32b art_flags3 = 0; /* Flags, set 3 Zangband */ - u32b art_flags4 = 0; /* Flags, set 4 PernAngband */ - u32b art_flags5 = 0; /* Flags, set 5 PernAngband */ - u32b art_esp = 0; /* Flags, set esp PernAngband */ - - u32b art_oflags1 = 0; /* Obvious Flags, set 1 */ - u32b art_oflags2 = 0; /* Obvious Flags, set 2 */ - u32b art_oflags3 = 0; /* Obvious Flags, set 3 */ - u32b art_oflags4 = 0; /* Obvious Flags, set 4 */ - u32b art_oflags5 = 0; /* Obvious Flags, set 5 */ - u32b art_oesp = 0; /* Obvious Flags, set esp */ + object_flag_set art_flags; /* Flags */ + object_flag_set art_oflags; /* Obvious flags */ s16b held_m_idx = 0; /* Monster holding the object; if any */ diff --git a/src/player_class.hpp b/src/player_class.hpp index c5fc8916..98414158 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -2,6 +2,7 @@ #include "body.hpp" #include "h-basic.h" +#include "object_flag_set.hpp" #include "player_defs.hpp" #include "player_spec.hpp" @@ -78,12 +79,7 @@ struct player_class char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - u32b oflags1[PY_MAX_LEVEL + 1] { }; - u32b oflags2[PY_MAX_LEVEL + 1] { }; - u32b oflags3[PY_MAX_LEVEL + 1] { }; - u32b oflags4[PY_MAX_LEVEL + 1] { }; - u32b oflags5[PY_MAX_LEVEL + 1] { }; - u32b oesp[PY_MAX_LEVEL + 1] { }; + std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; char skill_basem[MAX_SKILLS] { }; diff --git a/src/player_race.hpp b/src/player_race.hpp index f1933557..e01034ba 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "body.hpp" +#include "object_flag_set.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" #include "skills_defs.hpp" @@ -45,12 +46,7 @@ struct player_race u32b flags1 = 0; u32b flags2 = 0; - u32b oflags1[PY_MAX_LEVEL + 1] { }; - u32b oflags2[PY_MAX_LEVEL + 1] { }; - u32b oflags3[PY_MAX_LEVEL + 1] { }; - u32b oflags4[PY_MAX_LEVEL + 1] { }; - u32b oflags5[PY_MAX_LEVEL + 1] { }; - u32b oesp[PY_MAX_LEVEL + 1] { }; + std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; char skill_basem[MAX_SKILLS] { }; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 23be55d7..983c3471 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -2,6 +2,7 @@ #include "body.hpp" #include "h-basic.h" +#include "object_flag_set.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" #include "skills_defs.hpp" @@ -46,12 +47,7 @@ struct player_race_mod u32b flags1 = 0; u32b flags2 = 0; - u32b oflags1[PY_MAX_LEVEL + 1] { }; - u32b oflags2[PY_MAX_LEVEL + 1] { }; - u32b oflags3[PY_MAX_LEVEL + 1] { }; - u32b oflags4[PY_MAX_LEVEL + 1] { }; - u32b oflags5[PY_MAX_LEVEL + 1] { }; - u32b oesp[PY_MAX_LEVEL + 1] { }; + std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; byte g_attr = 0; /* Overlay graphic attribute */ diff --git a/src/player_type.hpp b/src/player_type.hpp index 7e615715..0e89605c 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -275,7 +275,6 @@ struct player_type bool_ see_inv = FALSE; /* Can see invisible */ bool_ regenerate = FALSE; /* Regenerate hit pts */ bool_ hold_life = FALSE; /* Resist life draining */ - u32b telepathy = 0; /* Telepathy */ bool_ slow_digest = FALSE; /* Slower digestion */ bool_ bless_blade = FALSE; /* Blessed blade */ byte xtra_might = 0; /* Extra might bow */ @@ -356,13 +355,11 @@ struct player_type bool_ precognition = FALSE; /* Like the cheat mode */ - /*** Extra flags -- used for lua and easying stuff ***/ - u32b xtra_f1 = 0; - u32b xtra_f2 = 0; - u32b xtra_f3 = 0; - u32b xtra_f4 = 0; - u32b xtra_f5 = 0; - u32b xtra_esp = 0; + /*** Extra flags ***/ + object_flag_set xtra_flags; + + /** Computed flags based on all worn items, etc. */ + object_flag_set computed_flags; /* Corruptions */ bool_ corruptions[CORRUPTIONS_MAX] = { FALSE }; diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 1e75b1b1..777ce690 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -8,6 +8,7 @@ #include "lua_bind.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_type.hpp" #include "player_type.hpp" #include "quark.hpp" @@ -90,7 +91,7 @@ static object_filter_t const &item_tester_hook_proofable() TVal(TV_STAFF)), // Must NOT already be fireproof Not( - HasFlag3(TR3_IGNORE_FIRE))); + HasFlags(TR_IGNORE_FIRE))); return instance; } diff --git a/src/q_rand.cc b/src/q_rand.cc index f22675b7..62511dec 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -21,6 +21,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "player_type.hpp" @@ -266,7 +267,7 @@ static void do_get_new_obj(int y, int x) { random_artifacts[o_ptr->sval].generated = FALSE; } - else if (k_info[o_ptr->k_idx].flags3 & TR3_NORM_ART) + else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { k_info[o_ptr->k_idx].artifact = FALSE; } diff --git a/src/q_ultrag.cc b/src/q_ultrag.cc index c7c0312b..fcee52a2 100644 --- a/src/q_ultrag.cc +++ b/src/q_ultrag.cc @@ -10,6 +10,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_type.hpp" #include "options.hpp" #include "player_type.hpp" @@ -119,15 +120,13 @@ static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *) /* Now look for an ULTIMATE artifact, that is, one imbued with the flame */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { - u32b f1, f2, f3, f4, f5, esp; object_type *o_ptr = get_object(i); if (!o_ptr->k_idx) continue; - /* Examine the gloves */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if (f4 & TR4_ULTIMATE) + if (flags & TR_ULTIMATE) { ultimate = TRUE; break; diff --git a/src/q_wight.cc b/src/q_wight.cc index f2cc630c..7d459dee 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -9,6 +9,7 @@ #include "monster2.hpp" #include "monster_type.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "player_type.hpp" #include "quark.hpp" #include "tables.hpp" @@ -76,23 +77,30 @@ static bool_ quest_wight_gen_hook(void *, void *, void *) q_ptr->art_name = quark_add("of the Wight"); - q_ptr->art_flags1 |= ( TR1_INT | TR1_SEARCH ); - q_ptr->art_flags2 |= ( TR2_RES_BLIND | TR2_SENS_FIRE | TR2_RES_CONF ); - q_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC | - TR3_IGNORE_FIRE | TR3_IGNORE_COLD | TR3_SEE_INVIS); + q_ptr->art_flags |= + TR_INT | + TR_SEARCH | + TR_RES_BLIND | + TR_SENS_FIRE | + TR_RES_CONF | + TR_IGNORE_ACID | + TR_IGNORE_ELEC | + TR_IGNORE_FIRE | + TR_IGNORE_COLD | + TR_SEE_INVIS | + TR_CURSED | + TR_HEAVY_CURSE; - /* For game balance... */ - q_ptr->art_flags3 |= (TR3_CURSED | TR3_HEAVY_CURSE); q_ptr->ident |= IDENT_CURSED; if (randint(2) == 1) { - q_ptr->art_flags1 |= (TR1_SPELL); + q_ptr->art_flags |= TR_SPELL; q_ptr->pval = 6; } else { - q_ptr->art_flags1 |= (TR1_MANA); + q_ptr->art_flags |= TR_MANA; q_ptr->pval = 2; } diff --git a/src/randart.cc b/src/randart.cc index 5135438a..9528faee 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -10,6 +10,7 @@ #include "mimic.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_type.hpp" #include "options.hpp" #include "player_type.hpp" @@ -37,7 +38,6 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *max_times) { bool_ ret = FALSE; - u32b f1, f2, f3, f4, f5, esp; std::vector ok_ra; @@ -71,13 +71,8 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m if (max_times[i] >= ra_ptr->max) continue; /* Must NOT have the antagonic flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f1 & ra_ptr->aflags1) continue; - if (f2 & ra_ptr->aflags2) continue; - if (f3 & ra_ptr->aflags3) continue; - if (f4 & ra_ptr->aflags4) continue; - if (f5 & ra_ptr->aflags5) continue; - if (esp & ra_ptr->aesp) continue; + auto const flags = object_flags(o_ptr); + if (flags & ra_ptr->aflags) continue; /* ok */ ok_ra.push_back(i); @@ -124,7 +119,7 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m void give_activation_power (object_type * o_ptr) { o_ptr->xtra2 = 0; - o_ptr->art_flags3 &= ~TR3_ACTIVATE; + o_ptr->art_flags &= ~TR_ACTIVATE; o_ptr->timeout = 0; } @@ -268,7 +263,6 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) int powers = 0, i; s32b total_flags, total_power = 0; bool_ a_cursed = FALSE; - u32b f1, f2, f3, f4, f5, esp; s16b pval = 0; bool_ limit_blows = FALSE; @@ -308,20 +302,15 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) total_power += ra_ptr->value; - o_ptr->art_flags1 |= ra_ptr->flags1; - o_ptr->art_flags2 |= ra_ptr->flags2; - o_ptr->art_flags3 |= ra_ptr->flags3; - o_ptr->art_flags4 |= ra_ptr->flags4; - o_ptr->art_flags5 |= ra_ptr->flags5; - o_ptr->art_esp |= ra_ptr->esp; + o_ptr->art_flags |= ra_ptr->flags; add_random_ego_flag(o_ptr, ra_ptr->fego, &limit_blows); /* get flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack -- acquire "cursed" flag */ - if (f3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED); + if (flags & TR_CURSED) o_ptr->ident |= (IDENT_CURSED); /* Hack -- obtain bonuses */ if (ra_ptr->max_to_h > 0) o_ptr->to_h += randint(ra_ptr->max_to_h); @@ -339,23 +328,23 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) if (pval < 0) o_ptr->pval = randint( -pval); /* No insane number of blows */ - if (limit_blows && (o_ptr->art_flags1 & TR1_BLOWS)) + if (limit_blows && (o_ptr->art_flags & TR_BLOWS)) { if (o_ptr->pval > 2) o_ptr->pval = randint(2); } /* Just to be sure */ - o_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC | - TR3_IGNORE_FIRE | TR3_IGNORE_COLD); + o_ptr->art_flags |= + TR_IGNORE_ACID | + TR_IGNORE_ELEC | + TR_IGNORE_FIRE | + TR_IGNORE_COLD; total_flags = flag_cost(o_ptr, o_ptr->pval); if (cheat_peek) msg_format("%ld", total_flags); if (a_cursed) curse_artifact(o_ptr); - /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (get_name) { if (a_scroll) @@ -393,13 +382,16 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) /* Window stuff */ p_ptr->window |= (PW_INVEN | PW_EQUIP); + /* Extract the flags */ + auto const flags = object_flags(o_ptr); + /* HACKS for ToME */ if (o_ptr->tval == TV_CLOAK && o_ptr->sval == SV_MIMIC_CLOAK) { s32b mimic = find_random_mimic_shape(127, TRUE); o_ptr->pval2 = mimic; } - else if (f5 & TR5_SPELL_CONTAIN) + else if (flags & TR_SPELL_CONTAIN) { o_ptr->pval2 = -1; } diff --git a/src/randart_part_type.hpp b/src/randart_part_type.hpp index c2fa5386..39329a57 100644 --- a/src/randart_part_type.hpp +++ b/src/randart_part_type.hpp @@ -1,43 +1,35 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" /** * Random artifact part descriptor. */ struct randart_part_type { - byte tval[20]; - byte min_sval[20]; - byte max_sval[20]; - - byte level; /* Minimum level */ - byte rarity; /* Object rarity */ - byte mrarity; /* Object rarity */ - - s16b max_to_h; /* Maximum to-hit bonus */ - s16b max_to_d; /* Maximum to-dam bonus */ - s16b max_to_a; /* Maximum to-ac bonus */ - - s32b max_pval; /* Maximum pval */ - - s32b value; /* power value */ - s16b max; /* Number of time it can appear on a single item */ - - u32b flags1; /* Ego-Item Flags, set 1 */ - u32b flags2; /* Ego-Item Flags, set 2 */ - u32b flags3; /* Ego-Item Flags, set 3 */ - u32b flags4; /* Ego-Item Flags, set 4 */ - u32b flags5; /* Ego-Item Flags, set 5 */ - u32b esp; /* ESP flags */ - u32b fego; /* ego flags */ - - u32b aflags1; /* Ego-Item Flags, set 1 */ - u32b aflags2; /* Ego-Item Flags, set 2 */ - u32b aflags3; /* Ego-Item Flags, set 3 */ - u32b aflags4; /* Ego-Item Flags, set 4 */ - u32b aflags5; /* Ego-Item Flags, set 5 */ - u32b aesp; /* ESP flags */ - - s16b power; /* Power granted(if any) */ + byte tval[20] { }; + byte min_sval[20] { }; + byte max_sval[20] { }; + + byte level = 0; /* Minimum level */ + byte rarity = 0; /* Object rarity */ + byte mrarity = 0; /* Object rarity */ + + s16b max_to_h = 0; /* Maximum to-hit bonus */ + s16b max_to_d = 0; /* Maximum to-dam bonus */ + s16b max_to_a = 0; /* Maximum to-ac bonus */ + + s32b max_pval = 0; /* Maximum pval */ + + s32b value = 0; /* power value */ + s16b max = 0; /* Number of time it can appear on a single item */ + + object_flag_set flags; /* Ego item flags */ + + u32b fego = 0; /* ego flags */ + + object_flag_set aflags; /* Antagonistic ego item flags */ + + s16b power = 0; /* Power granted(if any) */ }; diff --git a/src/set_component.hpp b/src/set_component.hpp index ceb82cbd..18dc4d57 100644 --- a/src/set_component.hpp +++ b/src/set_component.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" #include #include @@ -8,13 +9,8 @@ constexpr std::size_t SET_MAX_SIZE = 6; struct set_component { - bool_ present = FALSE; /* Is it actually wore ? */ - s16b a_idx = 0; /* What artifact? */ - std::array pval; /* Pval for each combination */ - std::array flags1; /* Flags */ - std::array flags2; /* Flags */ - std::array flags3; /* Flags */ - std::array flags4; /* Flags */ - std::array flags5; /* Flags */ - std::array esp; /* Flags */ + bool_ present = FALSE; /* Is it being worn? */ + s16b a_idx = 0; /* What artifact? */ + std::array pval; /* Pval for each combination */ + std::array flags; /* Flags */ }; diff --git a/src/spells1.cc b/src/spells1.cc index 2b34e98c..bd5f7c99 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -27,6 +27,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" @@ -1730,12 +1731,10 @@ static bool_ hates_cold(object_type *o_ptr) */ static int set_acid_destroy(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - if (!hates_acid(o_ptr)) return (FALSE); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f3 & (TR3_IGNORE_ACID)) return (FALSE); + auto const f = object_flags(o_ptr); + if (f & TR_IGNORE_ACID) return (FALSE); return (TRUE); } @@ -1745,12 +1744,10 @@ static int set_acid_destroy(object_type *o_ptr) */ static int set_elec_destroy(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - if (!hates_elec(o_ptr)) return (FALSE); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f3 & (TR3_IGNORE_ELEC)) return (FALSE); + auto const f = object_flags(o_ptr); + if (f & TR_IGNORE_ELEC) return (FALSE); return (TRUE); } @@ -1760,12 +1757,10 @@ static int set_elec_destroy(object_type *o_ptr) */ static int set_fire_destroy(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - if (!hates_fire(o_ptr)) return (FALSE); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f3 & (TR3_IGNORE_FIRE)) return (FALSE); + auto const f = object_flags(o_ptr); + if (f & TR_IGNORE_FIRE) return (FALSE); return (TRUE); } @@ -1775,12 +1770,10 @@ static int set_fire_destroy(object_type *o_ptr) */ static int set_cold_destroy(object_type *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - if (!hates_cold(o_ptr)) return (FALSE); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f3 & (TR3_IGNORE_COLD)) return (FALSE); + auto const f = object_flags(o_ptr); + if (f & (TR_IGNORE_COLD)) return (FALSE); return (TRUE); } @@ -1888,8 +1881,6 @@ static int minus_ac(void) { object_type *o_ptr = NULL; - u32b f1, f2, f3, f4, f5, esp; - char o_name[80]; @@ -1927,10 +1918,10 @@ static int minus_ac(void) object_desc(o_name, o_ptr, FALSE, 0); /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Object resists */ - if (f3 & (TR3_IGNORE_ACID)) + if (flags & TR_IGNORE_ACID) { msg_format("Your %s is unaffected!", o_name); @@ -3839,8 +3830,6 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) bool_ obvious = FALSE; - u32b f1, f2, f3, f4, f5, esp; - char o_name[80]; int o_sval = 0; @@ -3873,7 +3862,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) object_type * o_ptr = &o_list[this_o_idx]; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Get the "plural"-ness */ if (o_ptr->number > 1) plural = TRUE; @@ -3917,7 +3906,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " melt!" : " melts!"); - if (f3 & (TR3_IGNORE_ACID)) ignore = TRUE; + if (flags & TR_IGNORE_ACID) ignore = TRUE; } break; } @@ -3929,7 +3918,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); - if (f3 & (TR3_IGNORE_ELEC)) ignore = TRUE; + if (flags & TR_IGNORE_ELEC) ignore = TRUE; } break; } @@ -3941,7 +3930,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); - if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE; + if (flags & TR_IGNORE_FIRE) ignore = TRUE; } break; } @@ -3953,7 +3942,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { note_kill = (plural ? " shatter!" : " shatters!"); do_kill = TRUE; - if (f3 & (TR3_IGNORE_COLD)) ignore = TRUE; + if (flags & TR_IGNORE_COLD) ignore = TRUE; } break; } @@ -3965,14 +3954,14 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); - if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE; + if (flags & TR_IGNORE_FIRE) ignore = TRUE; } if (hates_elec(o_ptr)) { ignore = FALSE; do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); - if (f3 & (TR3_IGNORE_ELEC)) ignore = TRUE; + if (flags & TR_IGNORE_ELEC) ignore = TRUE; } break; } @@ -3984,14 +3973,14 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " burn up!" : " burns up!"); - if (f3 & (TR3_IGNORE_FIRE)) ignore = TRUE; + if (flags & TR_IGNORE_FIRE) ignore = TRUE; } if (hates_cold(o_ptr)) { ignore = FALSE; do_kill = TRUE; note_kill = (plural ? " shatter!" : " shatters!"); - if (f3 & (TR3_IGNORE_COLD)) ignore = TRUE; + if (flags & TR_IGNORE_COLD) ignore = TRUE; } break; } @@ -4029,7 +4018,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { do_kill = TRUE; note_kill = (plural ? " are destroyed!" : " is destroyed!"); - if (f2 & (TR2_RES_CHAOS)) ignore = TRUE; + if (flags & TR_RES_CHAOS) ignore = TRUE; break; } diff --git a/src/spells2.cc b/src/spells2.cc index 010bc424..60aafc16 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -28,6 +28,7 @@ #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" @@ -547,8 +548,6 @@ static int enchant_table[16] = static bool_ remove_curse_object(object_type *o_ptr, bool_ all) { - u32b f1, f2, f3, f4, f5, esp; - /* Skip non-objects */ if (!o_ptr->k_idx) return FALSE; @@ -556,13 +555,13 @@ static bool_ remove_curse_object(object_type *o_ptr, bool_ all) if (!cursed_p(o_ptr)) return FALSE; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Heavily Cursed Items need a special spell */ - if (!all && (f3 & (TR3_HEAVY_CURSE))) return FALSE; + if (!all && (flags & TR_HEAVY_CURSE)) return FALSE; /* Perma-Cursed Items can NEVER be uncursed */ - if (f3 & (TR3_PERMA_CURSE)) return FALSE; + if (flags & TR_PERMA_CURSE) return FALSE; /* Uncurse it */ o_ptr->ident &= ~(IDENT_CURSED); @@ -570,11 +569,9 @@ static bool_ remove_curse_object(object_type *o_ptr, bool_ all) /* Hack -- Assume felt */ o_ptr->ident |= (IDENT_SENSE); - if (o_ptr->art_flags3 & (TR3_CURSED)) - o_ptr->art_flags3 &= ~(TR3_CURSED); - - if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE)) - o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE); + /* Strip curse flags */ + o_ptr->art_flags &= ~TR_CURSED; + o_ptr->art_flags &= ~TR_HEAVY_CURSE; /* Take note */ o_ptr->sense = SENSE_UNCURSED; @@ -803,8 +800,6 @@ void self_knowledge(FILE *fff) { int i = 0, j, k; - u32b f1 = 0L, f2 = 0L, f3 = 0L, f4 = 0L, f5 = 0L, esp = 0L; - int iter; /* Iterator for a loop */ object_type *o_ptr; @@ -816,22 +811,16 @@ void self_knowledge(FILE *fff) strcpy (Dummy, ""); /* Acquire item flags from equipment */ + auto flags = object_flag_set(); for (k = INVEN_WIELD; k < INVEN_TOTAL; k++) { - u32b t1, t2, t3, t4, t5, esp; - o_ptr = &p_ptr->inventory[k]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; /* Extract the flags */ - object_flags(o_ptr, &t1, &t2, &t3, &t4, &t5, &esp); - - /* Extract flags */ - f1 |= t1; - f2 |= t2; - f3 |= t3; + flags |= object_flags(o_ptr); } if (death) @@ -1326,24 +1315,27 @@ void self_knowledge(FILE *fff) { info[i++] = "Your appetite is small."; } - if (p_ptr->telepathy) + // Telepathy { - if (p_ptr->telepathy & ESP_ALL) info[i++] = "You have ESP."; + if (p_ptr->computed_flags & ESP_ALL) + { + info[i++] = "You have ESP."; + } else { - if (p_ptr->telepathy & ESP_ORC) info[i++] = "You can sense the presence of orcs."; - if (p_ptr->telepathy & ESP_TROLL) info[i++] = "You can sense the presence of trolls."; - if (p_ptr->telepathy & ESP_DRAGON) info[i++] = "You can sense the presence of dragons."; - if (p_ptr->telepathy & ESP_SPIDER) info[i++] = "You can sense the presence of spiders."; - if (p_ptr->telepathy & ESP_GIANT) info[i++] = "You can sense the presence of giants."; - if (p_ptr->telepathy & ESP_DEMON) info[i++] = "You can sense the presence of demons."; - if (p_ptr->telepathy & ESP_UNDEAD) info[i++] = "You can sense presence of undead."; - if (p_ptr->telepathy & ESP_EVIL) info[i++] = "You can sense the presence of evil beings."; - if (p_ptr->telepathy & ESP_ANIMAL) info[i++] = "You can sense the presence of animals."; - if (p_ptr->telepathy & ESP_THUNDERLORD) info[i++] = "You can sense the presence of thunderlords."; - if (p_ptr->telepathy & ESP_GOOD) info[i++] = "You can sense the presence of good beings."; - if (p_ptr->telepathy & ESP_NONLIVING) info[i++] = "You can sense the presence of non-living things."; - if (p_ptr->telepathy & ESP_UNIQUE) info[i++] = "You can sense the presence of unique beings."; + if (p_ptr->computed_flags & ESP_ORC) info[i++] = "You can sense the presence of orcs."; + if (p_ptr->computed_flags & ESP_TROLL) info[i++] = "You can sense the presence of trolls."; + if (p_ptr->computed_flags & ESP_DRAGON) info[i++] = "You can sense the presence of dragons."; + if (p_ptr->computed_flags & ESP_SPIDER) info[i++] = "You can sense the presence of spiders."; + if (p_ptr->computed_flags & ESP_GIANT) info[i++] = "You can sense the presence of giants."; + if (p_ptr->computed_flags & ESP_DEMON) info[i++] = "You can sense the presence of demons."; + if (p_ptr->computed_flags & ESP_UNDEAD) info[i++] = "You can sense presence of undead."; + if (p_ptr->computed_flags & ESP_EVIL) info[i++] = "You can sense the presence of evil beings."; + if (p_ptr->computed_flags & ESP_ANIMAL) info[i++] = "You can sense the presence of animals."; + if (p_ptr->computed_flags & ESP_THUNDERLORD) info[i++] = "You can sense the presence of thunderlords."; + if (p_ptr->computed_flags & ESP_GOOD) info[i++] = "You can sense the presence of good beings."; + if (p_ptr->computed_flags & ESP_NONLIVING) info[i++] = "You can sense the presence of non-living things."; + if (p_ptr->computed_flags & ESP_UNIQUE) info[i++] = "You can sense the presence of unique beings."; } } if (!luck( -100, 100)) @@ -1576,56 +1568,56 @@ void self_knowledge(FILE *fff) info[i++] = "You suffer from Black Breath."; } - if (f1 & (TR1_STR)) + if (flags & TR_STR) { info[i++] = "Your strength is affected by your equipment."; } - if (f1 & (TR1_INT)) + if (flags & TR_INT) { info[i++] = "Your intelligence is affected by your equipment."; } - if (f1 & (TR1_WIS)) + if (flags & TR_WIS) { info[i++] = "Your wisdom is affected by your equipment."; } - if (f1 & (TR1_DEX)) + if (flags & TR_DEX) { info[i++] = "Your dexterity is affected by your equipment."; } - if (f1 & (TR1_CON)) + if (flags & TR_CON) { info[i++] = "Your constitution is affected by your equipment."; } - if (f1 & (TR1_CHR)) + if (flags & TR_CHR) { info[i++] = "Your charisma is affected by your equipment."; } - if (f1 & (TR1_STEALTH)) + if (flags & TR_STEALTH) { info[i++] = "Your stealth is affected by your equipment."; } - if (f1 & (TR1_SEARCH)) + if (flags & TR_SEARCH) { info[i++] = "Your searching ability is affected by your equipment."; } - if (f1 & (TR1_INFRA)) + if (flags & TR_INFRA) { info[i++] = "Your infravision is affected by your equipment."; } - if (f1 & (TR1_TUNNEL)) + if (flags & TR_TUNNEL) { info[i++] = "Your digging ability is affected by your equipment."; } - if (f1 & (TR1_SPEED)) + if (flags & TR_SPEED) { info[i++] = "Your speed is affected by your equipment."; } - if (f1 & (TR1_BLOWS)) + if (flags & TR_BLOWS) { info[i++] = "Your attack speed is affected by your equipment."; } - if (f5 & (TR5_CRIT)) + if (flags & TR_CRIT) { info[i++] = "Your ability to score critical hits is affected by your equipment."; } @@ -1637,103 +1629,103 @@ void self_knowledge(FILE *fff) /* Analyze the weapon */ if (o_ptr->k_idx) { - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + flags = object_flags(o_ptr); /* Indicate Blessing */ - if (f3 & (TR3_BLESSED)) + if (flags & TR_BLESSED) { info[i++] = "Your weapon has been blessed by the gods."; } - if (f1 & (TR1_CHAOTIC)) + if (flags & TR_CHAOTIC) { info[i++] = "Your weapon is branded with the Sign of Chaos."; } /* Hack */ - if (f1 & (TR1_IMPACT)) + if (flags & TR_IMPACT) { info[i++] = "The impact of your weapon can cause earthquakes."; } - if (f1 & (TR1_VORPAL)) + if (flags & TR_VORPAL) { info[i++] = "Your weapon is very sharp."; } - if (f1 & (TR1_VAMPIRIC)) + if (flags & TR_VAMPIRIC) { info[i++] = "Your weapon drains life from your foes."; } /* Special "Attack Bonuses" */ - if (f1 & (TR1_BRAND_ACID)) + if (flags & TR_BRAND_ACID) { info[i++] = "Your weapon melts your foes."; } - if (f1 & (TR1_BRAND_ELEC)) + if (flags & TR_BRAND_ELEC) { info[i++] = "Your weapon shocks your foes."; } - if (f1 & (TR1_BRAND_FIRE)) + if (flags & TR_BRAND_FIRE) { info[i++] = "Your weapon burns your foes."; } - if (f1 & (TR1_BRAND_COLD)) + if (flags & TR_BRAND_COLD) { info[i++] = "Your weapon freezes your foes."; } - if (f1 & (TR1_BRAND_POIS)) + if (flags & TR_BRAND_POIS) { info[i++] = "Your weapon poisons your foes."; } /* Special "slay" flags */ - if (f1 & (TR1_SLAY_ANIMAL)) + if (flags & TR_SLAY_ANIMAL) { info[i++] = "Your weapon strikes at animals with extra force."; } - if (f1 & (TR1_SLAY_EVIL)) + if (flags & TR_SLAY_EVIL) { info[i++] = "Your weapon strikes at evil with extra force."; } - if (f1 & (TR1_SLAY_UNDEAD)) + if (flags & TR_SLAY_UNDEAD) { info[i++] = "Your weapon strikes at undead with holy wrath."; } - if (f1 & (TR1_SLAY_DEMON)) + if (flags & TR_SLAY_DEMON) { info[i++] = "Your weapon strikes at demons with holy wrath."; } - if (f1 & (TR1_SLAY_ORC)) + if (flags & TR_SLAY_ORC) { info[i++] = "Your weapon is especially deadly against orcs."; } - if (f1 & (TR1_SLAY_TROLL)) + if (flags & TR_SLAY_TROLL) { info[i++] = "Your weapon is especially deadly against trolls."; } - if (f1 & (TR1_SLAY_GIANT)) + if (flags & TR_SLAY_GIANT) { info[i++] = "Your weapon is especially deadly against giants."; } - if (f1 & (TR1_SLAY_DRAGON)) + if (flags & TR_SLAY_DRAGON) { info[i++] = "Your weapon is especially deadly against dragons."; } /* Special "kill" flags */ - if (f1 & (TR1_KILL_DRAGON)) + if (flags & TR_KILL_DRAGON) { info[i++] = "Your weapon is a great bane of dragons."; } /* Special "kill" flags */ - if (f5 & (TR5_KILL_DEMON)) + if (flags & TR_KILL_DEMON) { info[i++] = "Your weapon is a great bane of demons."; } /* Special "kill" flags */ - if (f5 & (TR5_KILL_UNDEAD)) + if (flags & TR_KILL_UNDEAD) { info[i++] = "Your weapon is a great bane of undeads."; } @@ -2711,11 +2703,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) int i, chance, prob; bool_ res = FALSE; bool_ a = (artifact_p(o_ptr) || o_ptr->art_name); - u32b f1, f2, f3, f4, f5, esp; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Large piles resist enchantment */ prob = o_ptr->number * 100; @@ -2748,17 +2739,17 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) /* only when you get it above -1 -CFT */ if (cursed_p(o_ptr) && - (!(f3 & (TR3_PERMA_CURSE))) && + (!(flags & TR_PERMA_CURSE)) && (o_ptr->to_h >= 0) && (rand_int(100) < 25)) { msg_print("The curse is broken!"); o_ptr->ident &= ~(IDENT_CURSED); o_ptr->ident |= (IDENT_SENSE); - if (o_ptr->art_flags3 & (TR3_CURSED)) - o_ptr->art_flags3 &= ~(TR3_CURSED); - if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE)) - o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE); + if (o_ptr->art_flags & TR_CURSED) + o_ptr->art_flags &= ~TR_CURSED; + if (o_ptr->art_flags & TR_HEAVY_CURSE) + o_ptr->art_flags &= ~TR_HEAVY_CURSE; o_ptr->sense = SENSE_UNCURSED; } @@ -2779,17 +2770,17 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) /* only when you get it above -1 -CFT */ if (cursed_p(o_ptr) && - (!(f3 & (TR3_PERMA_CURSE))) && + (!(flags & TR_PERMA_CURSE)) && (o_ptr->to_d >= 0) && (rand_int(100) < 25)) { msg_print("The curse is broken!"); o_ptr->ident &= ~(IDENT_CURSED); o_ptr->ident |= (IDENT_SENSE); - if (o_ptr->art_flags3 & (TR3_CURSED)) - o_ptr->art_flags3 &= ~(TR3_CURSED); - if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE)) - o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE); + if (o_ptr->art_flags & TR_CURSED) + o_ptr->art_flags &= ~TR_CURSED; + if (o_ptr->art_flags & TR_HEAVY_CURSE) + o_ptr->art_flags &= ~TR_HEAVY_CURSE; o_ptr->sense = SENSE_UNCURSED; } @@ -2811,17 +2802,17 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) /* only when you get it above -1 -CFT */ if (cursed_p(o_ptr) && - (!(f3 & (TR3_PERMA_CURSE))) && + (!(flags & TR_PERMA_CURSE)) && (o_ptr->pval >= 0) && (rand_int(100) < 25)) { msg_print("The curse is broken!"); o_ptr->ident &= ~(IDENT_CURSED); o_ptr->ident |= (IDENT_SENSE); - if (o_ptr->art_flags3 & (TR3_CURSED)) - o_ptr->art_flags3 &= ~(TR3_CURSED); - if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE)) - o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE); + if (o_ptr->art_flags & TR_CURSED) + o_ptr->art_flags &= ~TR_CURSED; + if (o_ptr->art_flags & TR_HEAVY_CURSE) + o_ptr->art_flags &= ~TR_HEAVY_CURSE; o_ptr->sense = SENSE_UNCURSED; } @@ -2842,17 +2833,17 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) /* only when you get it above -1 -CFT */ if (cursed_p(o_ptr) && - (!(f3 & (TR3_PERMA_CURSE))) && + (!(flags & TR_PERMA_CURSE)) && (o_ptr->to_a >= 0) && (rand_int(100) < 25)) { msg_print("The curse is broken!"); o_ptr->ident &= ~(IDENT_CURSED); o_ptr->ident |= (IDENT_SENSE); - if (o_ptr->art_flags3 & (TR3_CURSED)) - o_ptr->art_flags3 &= ~(TR3_CURSED); - if (o_ptr->art_flags3 & (TR3_HEAVY_CURSE)) - o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE); + if (o_ptr->art_flags & TR_CURSED) + o_ptr->art_flags &= ~TR_CURSED; + if (o_ptr->art_flags & TR_HEAVY_CURSE) + o_ptr->art_flags &= ~TR_HEAVY_CURSE; o_ptr->sense = SENSE_UNCURSED; } @@ -2942,13 +2933,13 @@ void curse_artifact(object_type * o_ptr) if (o_ptr->to_a) o_ptr->to_a = 0 - ((o_ptr->to_a) + randint(4)); if (o_ptr->to_h) o_ptr->to_h = 0 - ((o_ptr->to_h) + randint(4)); if (o_ptr->to_d) o_ptr->to_d = 0 - ((o_ptr->to_d) + randint(4)); - o_ptr->art_flags3 |= ( TR3_HEAVY_CURSE | TR3_CURSED ); - if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_TY_CURSE; - if (randint(2) == 1) o_ptr-> art_flags3 |= TR3_AGGRAVATE; - if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_DRAIN_EXP; - if (randint(3) == 1) o_ptr-> art_flags4 |= TR4_BLACK_BREATH; - if (randint(2) == 1) o_ptr-> art_flags3 |= TR3_TELEPORT; - else if (randint(3) == 1) o_ptr->art_flags3 |= TR3_NO_TELE; + o_ptr->art_flags |= TR_HEAVY_CURSE | TR_CURSED; + if (randint(3) == 1) o_ptr-> art_flags |= TR_TY_CURSE; + if (randint(2) == 1) o_ptr-> art_flags |= TR_AGGRAVATE; + if (randint(3) == 1) o_ptr-> art_flags |= TR_DRAIN_EXP; + if (randint(3) == 1) o_ptr-> art_flags |= TR_BLACK_BREATH; + if (randint(2) == 1) o_ptr-> art_flags |= TR_TELEPORT; + else if (randint(3) == 1) o_ptr->art_flags |= TR_NO_TELE; o_ptr->ident |= IDENT_CURSED; } @@ -2961,122 +2952,122 @@ void random_resistance(object_type *o_ptr, int specific) { if (artifact_bias == BIAS_ACID) { - if (!(o_ptr->art_flags2 & TR2_RES_ACID)) + if (!(o_ptr->art_flags & TR_RES_ACID)) { - o_ptr->art_flags2 |= TR2_RES_ACID; + o_ptr->art_flags |= TR_RES_ACID; if (rand_int(2) == 0) return; } - if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_ACID)) + if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_ACID)) { - o_ptr->art_flags2 |= TR2_IM_ACID; + o_ptr->art_flags |= TR_IM_ACID; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_ELEC) { - if (!(o_ptr->art_flags2 & TR2_RES_ELEC)) + if (!(o_ptr->art_flags & TR_RES_ELEC)) { - o_ptr->art_flags2 |= TR2_RES_ELEC; + o_ptr->art_flags |= TR_RES_ELEC; if (rand_int(2) == 0) return; } if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR && - !(o_ptr->art_flags3 & TR3_SH_ELEC)) + !(o_ptr->art_flags & TR_SH_ELEC)) { - o_ptr->art_flags2 |= TR3_SH_ELEC; + o_ptr->art_flags |= TR_SH_ELEC; if (rand_int(2) == 0) return; } - if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_ELEC)) + if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_ELEC)) { - o_ptr->art_flags2 |= TR2_IM_ELEC; + o_ptr->art_flags |= TR_IM_ELEC; if (rand_int(2) == 1) return; } } else if (artifact_bias == BIAS_FIRE) { - if (!(o_ptr->art_flags2 & TR2_RES_FIRE)) + if (!(o_ptr->art_flags & TR_RES_FIRE)) { - o_ptr->art_flags2 |= TR2_RES_FIRE; + o_ptr->art_flags |= TR_RES_FIRE; if (rand_int(2) == 0) return; } if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR && - !(o_ptr->art_flags3 & TR3_SH_FIRE)) + !(o_ptr->art_flags & TR_SH_FIRE)) { - o_ptr->art_flags2 |= TR3_SH_FIRE; + o_ptr->art_flags |= TR_SH_FIRE; if (rand_int(2) == 0) return; } - if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_FIRE)) + if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_FIRE)) { - o_ptr->art_flags2 |= TR2_IM_FIRE; + o_ptr->art_flags |= TR_IM_FIRE; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_COLD) { - if (!(o_ptr->art_flags2 & TR2_RES_COLD)) + if (!(o_ptr->art_flags & TR_RES_COLD)) { - o_ptr->art_flags2 |= TR2_RES_COLD; + o_ptr->art_flags |= TR_RES_COLD; if (rand_int(2) == 0) return; } - if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags2 & TR2_IM_COLD)) + if (rand_int(BIAS_LUCK) == 0 && !(o_ptr->art_flags & TR_IM_COLD)) { - o_ptr->art_flags2 |= TR2_IM_COLD; + o_ptr->art_flags |= TR_IM_COLD; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_POIS) { - if (!(o_ptr->art_flags2 & TR2_RES_POIS)) + if (!(o_ptr->art_flags & TR_RES_POIS)) { - o_ptr->art_flags2 |= TR2_RES_POIS; + o_ptr->art_flags |= TR_RES_POIS; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_WARRIOR) { - if (rand_int(3) && (!(o_ptr->art_flags2 & TR2_RES_FEAR))) + if (rand_int(3) && (!(o_ptr->art_flags & TR_RES_FEAR))) { - o_ptr->art_flags2 |= TR2_RES_FEAR; + o_ptr->art_flags |= TR_RES_FEAR; if (rand_int(2) == 0) return; } - if ((rand_int(3) == 0) && (!(o_ptr->art_flags3 & TR3_NO_MAGIC))) + if ((rand_int(3) == 0) && (!(o_ptr->art_flags & TR_NO_MAGIC))) { - o_ptr->art_flags3 |= TR3_NO_MAGIC; + o_ptr->art_flags |= TR_NO_MAGIC; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_NECROMANTIC) { - if (!(o_ptr->art_flags2 & TR2_RES_NETHER)) + if (!(o_ptr->art_flags & TR_RES_NETHER)) { - o_ptr->art_flags2 |= TR2_RES_NETHER; + o_ptr->art_flags |= TR_RES_NETHER; if (rand_int(2) == 0) return; } - if (!(o_ptr->art_flags2 & TR2_RES_POIS)) + if (!(o_ptr->art_flags & TR_RES_POIS)) { - o_ptr->art_flags2 |= TR2_RES_POIS; + o_ptr->art_flags |= TR_RES_POIS; if (rand_int(2) == 0) return; } - if (!(o_ptr->art_flags2 & TR2_RES_DARK)) + if (!(o_ptr->art_flags & TR_RES_DARK)) { - o_ptr->art_flags2 |= TR2_RES_DARK; + o_ptr->art_flags |= TR_RES_DARK; if (rand_int(2) == 0) return; } } else if (artifact_bias == BIAS_CHAOS) { - if (!(o_ptr->art_flags2 & TR2_RES_CHAOS)) + if (!(o_ptr->art_flags & TR_RES_CHAOS)) { - o_ptr->art_flags2 |= TR2_RES_CHAOS; + o_ptr->art_flags |= TR_RES_CHAOS; if (rand_int(2) == 0) return; } - if (!(o_ptr->art_flags2 & TR2_RES_CONF)) + if (!(o_ptr->art_flags & TR_RES_CONF)) { - o_ptr->art_flags2 |= TR2_RES_CONF; + o_ptr->art_flags |= TR_RES_CONF; if (rand_int(2) == 0) return; } - if (!(o_ptr->art_flags2 & TR2_RES_DISEN)) + if (!(o_ptr->art_flags & TR_RES_DISEN)) { - o_ptr->art_flags2 |= TR2_RES_DISEN; + o_ptr->art_flags |= TR_RES_DISEN; if (rand_int(2) == 0) return; } } @@ -3089,7 +3080,7 @@ void random_resistance(object_type *o_ptr, int specific) random_resistance(o_ptr, specific); else { - o_ptr->art_flags2 |= TR2_IM_ACID; + o_ptr->art_flags |= TR_IM_ACID; /* if (is_scroll) msg_print("It looks totally incorruptible."); */ if (!(artifact_bias)) artifact_bias = BIAS_ACID; @@ -3100,7 +3091,7 @@ void random_resistance(object_type *o_ptr, int specific) random_resistance(o_ptr, specific); else { - o_ptr->art_flags2 |= TR2_IM_ELEC; + o_ptr->art_flags |= TR_IM_ELEC; /* if (is_scroll) msg_print("It looks completely grounded."); */ if (!(artifact_bias)) artifact_bias = BIAS_ELEC; @@ -3111,7 +3102,7 @@ void random_resistance(object_type *o_ptr, int specific) random_resistance(o_ptr, specific); else { - o_ptr->art_flags2 |= TR2_IM_COLD; + o_ptr->art_flags |= TR_IM_COLD; /* if (is_scroll) msg_print("It feels very warm."); */ if (!(artifact_bias)) artifact_bias = BIAS_COLD; @@ -3122,7 +3113,7 @@ void random_resistance(object_type *o_ptr, int specific) random_resistance(o_ptr, specific); else { - o_ptr->art_flags2 |= TR2_IM_FIRE; + o_ptr->art_flags |= TR_IM_FIRE; /* if (is_scroll) msg_print("It feels very cool."); */ if (!(artifact_bias)) artifact_bias = BIAS_FIRE; @@ -3131,7 +3122,7 @@ void random_resistance(object_type *o_ptr, int specific) case 5: case 6: case 13: - o_ptr->art_flags2 |= TR2_RES_ACID; + o_ptr->art_flags |= TR_RES_ACID; /* if (is_scroll) msg_print("It makes your stomach rumble."); */ if (!(artifact_bias)) artifact_bias = BIAS_ACID; @@ -3139,7 +3130,7 @@ void random_resistance(object_type *o_ptr, int specific) case 7: case 8: case 14: - o_ptr->art_flags2 |= TR2_RES_ELEC; + o_ptr->art_flags |= TR_RES_ELEC; /* if (is_scroll) msg_print("It makes you feel grounded."); */ if (!(artifact_bias)) artifact_bias = BIAS_ELEC; @@ -3147,7 +3138,7 @@ void random_resistance(object_type *o_ptr, int specific) case 9: case 10: case 15: - o_ptr->art_flags2 |= TR2_RES_FIRE; + o_ptr->art_flags |= TR_RES_FIRE; /* if (is_scroll) msg_print("It makes you feel cool!");*/ if (!(artifact_bias)) artifact_bias = BIAS_FIRE; @@ -3155,14 +3146,14 @@ void random_resistance(object_type *o_ptr, int specific) case 11: case 12: case 16: - o_ptr->art_flags2 |= TR2_RES_COLD; + o_ptr->art_flags |= TR_RES_COLD; /* if (is_scroll) msg_print("It makes you feel full of hot air!");*/ if (!(artifact_bias)) artifact_bias = BIAS_COLD; break; case 17: case 18: - o_ptr->art_flags2 |= TR2_RES_POIS; + o_ptr->art_flags |= TR_RES_POIS; /* if (is_scroll) msg_print("It makes breathing easier for you."); */ if (!(artifact_bias) && randint(4) != 1) artifact_bias = BIAS_POIS; @@ -3173,68 +3164,68 @@ void random_resistance(object_type *o_ptr, int specific) break; case 19: case 20: - o_ptr->art_flags2 |= TR2_RES_FEAR; + o_ptr->art_flags |= TR_RES_FEAR; /* if (is_scroll) msg_print("It makes you feel brave!"); */ if (!(artifact_bias) && randint(3) == 1) artifact_bias = BIAS_WARRIOR; break; case 21: - o_ptr->art_flags2 |= TR2_RES_LITE; + o_ptr->art_flags |= TR_RES_LITE; /* if (is_scroll) msg_print("It makes everything look darker.");*/ break; case 22: - o_ptr->art_flags2 |= TR2_RES_DARK; + o_ptr->art_flags |= TR_RES_DARK; /* if (is_scroll) msg_print("It makes everything look brigher.");*/ break; case 23: case 24: - o_ptr->art_flags2 |= TR2_RES_BLIND; + o_ptr->art_flags |= TR_RES_BLIND; /* if (is_scroll) msg_print("It makes you feel you are wearing glasses.");*/ break; case 25: case 26: - o_ptr->art_flags2 |= TR2_RES_CONF; + o_ptr->art_flags |= TR_RES_CONF; /* if (is_scroll) msg_print("It makes you feel very determined.");*/ if (!(artifact_bias) && randint(6) == 1) artifact_bias = BIAS_CHAOS; break; case 27: case 28: - o_ptr->art_flags2 |= TR2_RES_SOUND; + o_ptr->art_flags |= TR_RES_SOUND; /* if (is_scroll) msg_print("It makes you feel deaf!");*/ break; case 29: case 30: - o_ptr->art_flags2 |= TR2_RES_SHARDS; + o_ptr->art_flags |= TR_RES_SHARDS; /* if (is_scroll) msg_print("It makes your skin feel thicker.");*/ break; case 31: case 32: - o_ptr->art_flags2 |= TR2_RES_NETHER; + o_ptr->art_flags |= TR_RES_NETHER; /* if (is_scroll) msg_print("It makes you feel like visiting a graveyard!");*/ if (!(artifact_bias) && randint(3) == 1) artifact_bias = BIAS_NECROMANTIC; break; case 33: case 34: - o_ptr->art_flags2 |= TR2_RES_NEXUS; + o_ptr->art_flags |= TR_RES_NEXUS; /* if (is_scroll) msg_print("It makes you feel normal.");*/ break; case 35: case 36: - o_ptr->art_flags2 |= TR2_RES_CHAOS; + o_ptr->art_flags |= TR_RES_CHAOS; /* if (is_scroll) msg_print("It makes you feel very firm.");*/ if (!(artifact_bias) && randint(2) == 1) artifact_bias = BIAS_CHAOS; break; case 37: case 38: - o_ptr->art_flags2 |= TR2_RES_DISEN; + o_ptr->art_flags |= TR_RES_DISEN; /* if (is_scroll) msg_print("It is surrounded by a static feeling.");*/ break; case 39: if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR) - o_ptr->art_flags3 |= TR3_SH_ELEC; + o_ptr->art_flags |= TR_SH_ELEC; else random_resistance(o_ptr, specific); if (!(artifact_bias)) @@ -3242,7 +3233,7 @@ void random_resistance(object_type *o_ptr, int specific) break; case 40: if (o_ptr->tval >= TV_CLOAK && o_ptr->tval <= TV_HARD_ARMOR) - o_ptr->art_flags3 |= TR3_SH_FIRE; + o_ptr->art_flags |= TR_SH_FIRE; else random_resistance(o_ptr, specific); if (!(artifact_bias)) @@ -3251,7 +3242,7 @@ void random_resistance(object_type *o_ptr, int specific) case 41: if (o_ptr->tval == TV_SHIELD || o_ptr->tval == TV_CLOAK || o_ptr->tval == TV_HELM || o_ptr->tval == TV_HARD_ARMOR) - o_ptr->art_flags2 |= TR2_REFLECT; + o_ptr->art_flags |= TR_REFLECT; else random_resistance(o_ptr, specific); break; @@ -3460,7 +3451,7 @@ object_filter_t const &item_tester_hook_recharge() static auto instance = And( // Must NOT have NO_RECHARGE flag. - Not(HasFlag4(TR4_NO_RECHARGE)), + Not(HasFlags(TR_NO_RECHARGE)), // ... and must be a device. Or( TVal(TV_STAFF), @@ -3514,8 +3505,7 @@ bool_ recharge(int power) object_type *o_ptr = get_object(item); /* Extract the flags */ - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Extract the object "level" */ lev = k_info[o_ptr->k_idx].level; @@ -3530,7 +3520,7 @@ bool_ recharge(int power) if (recharge_strength < 0) recharge_strength = 0; /* Back-fire */ - if ((rand_int(recharge_strength) == 0) && (!(f4 & TR4_RECHARGE))) + if ((rand_int(recharge_strength) == 0) && (!(flags & TR_RECHARGE))) { /* Activate the failure code. */ fail = TRUE; @@ -3567,8 +3557,8 @@ bool_ recharge(int power) /* Back-fire XXX XXX XXX */ - if (((rand_int(recharge_strength) == 0) && (!(f4 & TR4_RECHARGE))) || - (f4 & TR4_NO_RECHARGE)) + if (((rand_int(recharge_strength) == 0) && (!(flags & TR_RECHARGE))) || + (flags & TR_NO_RECHARGE)) { /* Activate the failure code. */ fail = TRUE; @@ -3601,7 +3591,7 @@ bool_ recharge(int power) /* Recharge the wand or staff. */ o_ptr->pval += recharge_amount; - if (!(f4 & TR4_RECHARGE)) + if (!(flags & TR_RECHARGE)) { /* Hack -- we no longer "know" the item */ o_ptr->ident &= ~(IDENT_KNOWN); @@ -3613,7 +3603,7 @@ bool_ recharge(int power) } /* Mark as recharged */ - o_ptr->art_flags4 |= TR4_RECHARGED; + o_ptr->art_flags |= TR_RECHARGED; /* Inflict the penalties for failing a recharge. */ if (fail) @@ -5799,7 +5789,7 @@ case 27: case 28: case 29: if (p_ptr->inventory[INVEN_WIELD].k_idx) { msg_print("Your weapon now seems useless..."); - p_ptr->inventory[INVEN_WIELD].art_flags4 = TR4_NEVER_BLOW; + p_ptr->inventory[INVEN_WIELD].art_flags = TR_NEVER_BLOW; } break; case 25: diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc index 1c17d2fd..2bdef61b 100644 --- a/src/squelch/rule.cc +++ b/src/squelch/rule.cc @@ -8,6 +8,7 @@ #include "../modules.hpp" #include "../object1.hpp" #include "../object2.hpp" +#include "../object_flag.hpp" #include "../object_type.hpp" #include "../quark.hpp" #include "../tables.hpp" @@ -250,10 +251,8 @@ bool DestroyRule::do_apply_rule(object_type *o_ptr, int item_idx) const // Cannot destroy CURSE_NO_DROP objects. { - u32b f1, f2, f3, f4, f5, esp; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if ((f4 & TR4_CURSE_NO_DROP) != 0) + auto const f = object_flags(o_ptr); + if (f & TR_CURSE_NO_DROP) { return false; } diff --git a/src/store.cc b/src/store.cc index 088de82a..972dd096 100644 --- a/src/store.cc +++ b/src/store.cc @@ -19,6 +19,7 @@ #include "obj_theme.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "owner_type.hpp" @@ -523,9 +524,7 @@ static bool_ store_object_similar(object_type const *o_ptr, object_type *j_ptr) if (o_ptr->art_name || j_ptr->art_name) return (0); /* Hack -- Identical art_flags! */ - if ((o_ptr->art_flags1 != j_ptr->art_flags1) || - (o_ptr->art_flags2 != j_ptr->art_flags2) || - (o_ptr->art_flags3 != j_ptr->art_flags3)) + if (o_ptr->art_flags != j_ptr->art_flags) return (0); /* Hack -- Never stack "powerful" items */ @@ -622,12 +621,10 @@ static bool_ store_check_num(object_type *o_ptr) } -static bool_ is_blessed(object_type const *o_ptr) +static bool is_blessed(object_type const *o_ptr) { - u32b f1, f2, f3, f4, f5, esp; - object_flags_known(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if (f3 & TR3_BLESSED) return (TRUE); - else return (FALSE); + auto flags = object_flags_known(o_ptr); + return bool(flags & TR_BLESSED); } @@ -1173,10 +1170,10 @@ static bool_ kind_is_storeok(int k_idx) { object_kind *k_ptr = &k_info[k_idx]; - if (k_info[k_idx].flags3 & TR3_NORM_ART) + if (k_info[k_idx].flags & TR_NORM_ART) return ( FALSE ); - if (k_info[k_idx].flags3 & TR3_INSTA_ART) + if (k_info[k_idx].flags & TR_INSTA_ART) return ( FALSE ); if (!kind_is_legal(k_idx)) return FALSE; @@ -1288,7 +1285,7 @@ static void store_create(void) chance = st_info[st_ptr->st_idx].table[item][1]; /* Don't allow k_info artifacts */ - if ((i <= 10000) && (k_info[i].flags3 & TR3_NORM_ART)) + if ((i <= 10000) && (k_info[i].flags & TR_NORM_ART)) continue; /* Does it passes the rarity check ? */ @@ -1328,11 +1325,11 @@ static void store_create(void) if (!obj_all_done) { /* Don't allow k_info artifacts */ - if (k_info[i].flags3 & TR3_NORM_ART) + if (k_info[i].flags & TR_NORM_ART) continue; /* Don't allow artifacts */ - if (k_info[i].flags3 & TR3_INSTA_ART) + if (k_info[i].flags & TR_INSTA_ART) continue; /* Get local object */ @@ -1347,11 +1344,11 @@ static void store_create(void) /* Hack -- Charge lite's */ if (q_ptr->tval == TV_LITE) { - u32b f1, f2, f3, f4, f5, esp; - - object_flags(q_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - - if (f4 & TR4_FUEL_LITE) q_ptr->timeout = k_info[q_ptr->k_idx].pval2; + auto const flags = object_flags(q_ptr); + if (flags & TR_FUEL_LITE) + { + q_ptr->timeout = k_info[q_ptr->k_idx].pval2; + } } } @@ -2401,12 +2398,8 @@ void store_sell(void) object_type forge; object_type *q_ptr; - object_type *o_ptr; - char o_name[80]; - u32b f1, f2, f3, f4, f5, esp; - bool_ museum = (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) ? TRUE : FALSE; /* Prepare prompt */ @@ -2434,9 +2427,9 @@ void store_sell(void) } /* Get the item */ - o_ptr = get_object(item); + auto o_ptr = get_object(item); - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Hack -- Cannot remove cursed items */ if (cursed_p(o_ptr)) @@ -2451,7 +2444,7 @@ void store_sell(void) } else { - if (f4 & TR4_CURSE_NO_DROP) + if (flags & TR_CURSE_NO_DROP) { /* Oops */ msg_print("Hmmm, you seem to be unable to drop it."); diff --git a/src/tables.cc b/src/tables.cc index debee270..ba86c577 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -12,6 +12,7 @@ #include "modules.hpp" #include "monster_race_flag.hpp" #include "monster_spell_flag.hpp" +#include "object_flag.hpp" #include "options.hpp" #include "q_library.hpp" #include "q_fireprof.hpp" @@ -2662,121 +2663,92 @@ extern std::vector const &flags_groups() "Fire", TERM_L_RED, 1, - TR1_SLAY_UNDEAD | TR1_BRAND_FIRE, - TR2_RES_FIRE, - TR3_SH_FIRE | TR3_LITE1 | TR3_IGNORE_FIRE, - 0, - 0, + TR_SLAY_UNDEAD | TR_BRAND_FIRE | TR_RES_FIRE | + TR_SH_FIRE | TR_LITE1 | TR_IGNORE_FIRE, }, flags_group { "Cold", TERM_WHITE, 1, - TR1_SLAY_DRAGON | TR1_SLAY_DEMON | TR1_BRAND_COLD, - TR2_RES_COLD | TR2_INVIS, - TR3_SLOW_DIGEST | TR3_IGNORE_COLD, - 0, - 0, + TR_SLAY_DRAGON | TR_SLAY_DEMON | TR_BRAND_COLD | TR_RES_COLD | + TR_INVIS | TR_SLOW_DIGEST | TR_IGNORE_COLD, }, flags_group { "Acid", TERM_GREEN, 3, - TR1_SLAY_ANIMAL | TR1_IMPACT | TR1_TUNNEL | TR1_BRAND_ACID, - TR2_RES_ACID, - TR3_IGNORE_ACID, - 0, - 0, + TR_SLAY_ANIMAL | TR_IMPACT | TR_TUNNEL | + TR_BRAND_ACID | TR_RES_ACID | TR_IGNORE_ACID, }, flags_group { "Lightning", TERM_L_BLUE, 1, - TR1_SLAY_EVIL | TR1_BRAND_ELEC, - TR2_RES_ELEC, - TR3_IGNORE_ELEC | TR3_SH_ELEC | TR3_TELEPORT, - 0, - 0, + TR_SLAY_EVIL | TR_BRAND_ELEC | TR_RES_ELEC | + TR_IGNORE_ELEC | TR_SH_ELEC | TR_TELEPORT, }, flags_group { "Poison", TERM_L_GREEN, 2, - TR1_CHR | TR1_VAMPIRIC | TR1_SLAY_ANIMAL | TR1_BRAND_POIS, - TR2_SUST_CHR | TR2_RES_POIS, - TR3_DRAIN_EXP, - 0, - ESP_TROLL | ESP_GIANT, + TR_CHR | TR_VAMPIRIC | TR_SLAY_ANIMAL | TR_BRAND_POIS | + TR_SUST_CHR | TR_RES_POIS | TR_DRAIN_EXP | + ESP_TROLL | ESP_GIANT, }, flags_group { "Air", TERM_BLUE, 5, - TR1_WIS | TR1_STEALTH | TR1_INFRA | TR1_SPEED, - TR2_RES_LITE | TR2_RES_DARK | TR2_RES_BLIND | TR2_SUST_WIS, - TR3_FEATHER | TR3_SEE_INVIS | TR3_BLESSED, - 0, - ESP_GOOD, + TR_WIS | TR_STEALTH | TR_INFRA | TR_SPEED | + TR_RES_LITE | TR_RES_DARK | TR_RES_BLIND | TR_SUST_WIS | + TR_FEATHER | TR_SEE_INVIS | TR_BLESSED | + ESP_GOOD, }, flags_group { "Earth", TERM_L_UMBER, 5, - TR1_STR | TR1_CON | TR1_TUNNEL | TR1_BLOWS | TR1_SLAY_TROLL | TR1_SLAY_GIANT | TR1_IMPACT, - TR2_SUST_STR | TR2_SUST_CON | TR2_FREE_ACT | TR2_RES_FEAR | TR2_RES_SHARDS, - TR3_REGEN, - 0, + TR_STR | TR_CON | TR_TUNNEL | TR_BLOWS | TR_SLAY_TROLL | + TR_SLAY_GIANT | TR_IMPACT | TR_SUST_STR | TR_SUST_CON | + TR_FREE_ACT | TR_RES_FEAR | TR_RES_SHARDS | TR_REGEN | ESP_TROLL | ESP_GIANT, }, flags_group { "Mind", TERM_YELLOW, 7, - TR1_INT | TR1_SEARCH, - TR2_SUST_INT | TR2_RES_CONF | TR2_RES_FEAR, - 0, - 0, + TR_INT | TR_SEARCH | TR_SUST_INT | TR_RES_CONF | TR_RES_FEAR | ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON, }, flags_group { "Shield", TERM_RED, 7, - TR1_DEX, - TR2_SUST_DEX | TR2_INVIS | TR2_REFLECT | TR2_HOLD_LIFE | TR2_RES_SOUND | TR2_RES_NEXUS, - TR3_REGEN, - 0, - 0, + TR_DEX | TR_SUST_DEX | TR_INVIS | TR_REFLECT | + TR_HOLD_LIFE | TR_RES_SOUND | TR_RES_NEXUS | + TR_REGEN, }, flags_group { "Chaos", TERM_VIOLET, 7, - TR1_CHAOTIC | TR1_IMPACT, - TR2_RES_CHAOS | TR2_RES_DISEN, - TR3_REGEN, - 0, + TR_CHAOTIC | TR_IMPACT | TR_RES_CHAOS | TR_RES_DISEN | TR_REGEN | ESP_ALL, }, flags_group { "Magic", TERM_L_BLUE, 10, - TR1_MANA | TR1_SPELL, - TR2_RES_CHAOS | TR2_RES_DISEN, - TR3_WRAITH, - TR4_PRECOGNITION | TR4_FLY | TR4_CLONE, - 0, + TR_MANA | TR_SPELL | TR_RES_CHAOS | TR_RES_DISEN | TR_WRAITH | + TR_PRECOGNITION | TR_FLY | TR_CLONE, }, flags_group { "Antimagic", TERM_L_DARK, 10, - TR1_VAMPIRIC | TR1_CHAOTIC | TR1_BLOWS | TR1_SPEED, - TR2_LIFE | TR2_REFLECT | TR2_FREE_ACT | TR2_HOLD_LIFE, - TR3_NO_MAGIC | TR3_NO_TELE | TR3_SEE_INVIS, - TR4_ANTIMAGIC_50, - 0, + TR_VAMPIRIC | TR_CHAOTIC | TR_BLOWS | TR_SPEED | TR_LIFE | + TR_REFLECT | TR_FREE_ACT | TR_HOLD_LIFE | TR_NO_MAGIC | + TR_NO_TELE | TR_SEE_INVIS | TR_ANTIMAGIC_50, } }; diff --git a/src/traps.cc b/src/traps.cc index 8786e858..2f8578d4 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -25,6 +25,7 @@ #include "monster_type.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "player_race.hpp" #include "player_race_mod.hpp" @@ -974,7 +975,6 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) { s16b i, j, slot1, slot2; object_type *j_ptr, *k_ptr; - u32b f1, f2, f3, f4, f5, esp; for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { @@ -983,8 +983,8 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) if (!j_ptr->k_idx) continue; /* Do not allow this trap to touch the One Ring */ - object_flags(j_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if(f3 & TR3_PERMA_CURSE) continue; + auto const j_flags = object_flags(j_ptr); + if(j_flags & TR_PERMA_CURSE) continue; slot1 = wield_slot(j_ptr); @@ -995,8 +995,8 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) if (!k_ptr->k_idx) continue; /* Do not allow this trap to touch the One Ring */ - object_flags(k_ptr, &f1, &f2, &f3, &f4, &f5, &esp); - if(f3 & TR3_PERMA_CURSE) continue; + auto const k_flags = object_flags(k_ptr); + if(k_flags & TR_PERMA_CURSE) continue; /* this is a crude hack, but it prevent wielding 6 torches... */ if (k_ptr->number > 1) continue; @@ -1424,9 +1424,7 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) case TRAP_OF_DRAIN_SPEED: { - object_type *j_ptr; s16b j, chance = 75; - u32b f1, f2, f3, f4, f5, esp; for (j = 0; j < INVEN_TOTAL; j++) { @@ -1435,11 +1433,11 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) if (!p_ptr->inventory[j].k_idx) continue; - j_ptr = &p_ptr->inventory[j]; - object_flags(j_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto j_ptr = &p_ptr->inventory[j]; + auto const flags = object_flags(j_ptr); /* is it a non-artifact speed item? */ - if ((!j_ptr->name1) && (f1 & TR1_SPEED)) + if ((!j_ptr->name1) && (flags & TR_SPEED)) { if (randint(100) < chance) { @@ -2091,8 +2089,6 @@ void do_cmd_set_trap(void) object_type object_type_body; - u32b f1, f2, f3, f4, f5, esp; - /* Check some conditions */ if (p_ptr->blind) { @@ -2167,11 +2163,11 @@ void do_cmd_set_trap(void) /* In some cases, take multiple objects to load */ if (o_ptr->sval != SV_TRAPKIT_DEVICE) { - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); - if ((f3 & TR3_XTRA_SHOTS) && (o_ptr->pval > 0)) num += o_ptr->pval; + if ((flags & TR_XTRA_SHOTS) && (o_ptr->pval > 0)) num += o_ptr->pval; - if (f2 & (TRAP2_AUTOMATIC_5 | TRAP2_AUTOMATIC_99)) num = 99; + if (flags & (TR_AUTOMATIC_5 | TR_AUTOMATIC_99)) num = 99; if (num > j_ptr->number) num = j_ptr->number; @@ -2648,8 +2644,6 @@ bool_ mon_hit_trap(int m_idx) monster_type *m_ptr = &m_list[m_idx]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - u32b f1, f2, f3, f4, f5, esp; - object_type object_type_body; int mx = m_ptr->fx; @@ -2680,21 +2674,21 @@ bool_ mon_hit_trap(int m_idx) auto j_ptr = &object_type_body; /* Get trap properties */ - object_flags(kit_o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(kit_o_ptr); /* Can set off check */ /* Ghosts only set off Ghost traps */ - if ((r_ptr->flags & RF_PASS_WALL) && !(f2 & TRAP2_KILL_GHOST)) return (FALSE); + if ((r_ptr->flags & RF_PASS_WALL) && !(flags & TR_KILL_GHOST)) return (FALSE); /* Some traps are specialized to some creatures */ - if (f2 & TRAP2_ONLY_MASK) + if (flags & (TR_ONLY_DRAGON | TR_ONLY_DEMON | TR_ONLY_ANIMAL | TR_ONLY_UNDEAD | TR_ONLY_EVIL)) { bool_ affect = FALSE; - if ((f2 & TRAP2_ONLY_DRAGON) && (r_ptr->flags & RF_DRAGON)) affect = TRUE; - if ((f2 & TRAP2_ONLY_DEMON) && (r_ptr->flags & RF_DEMON)) affect = TRUE; - if ((f2 & TRAP2_ONLY_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) affect = TRUE; - if ((f2 & TRAP2_ONLY_EVIL) && (r_ptr->flags & RF_EVIL)) affect = TRUE; - if ((f2 & TRAP2_ONLY_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) affect = TRUE; + if ((flags & TR_ONLY_DRAGON) && (r_ptr->flags & RF_DRAGON)) affect = TRUE; + if ((flags & TR_ONLY_DEMON) && (r_ptr->flags & RF_DEMON)) affect = TRUE; + if ((flags & TR_ONLY_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) affect = TRUE; + if ((flags & TR_ONLY_EVIL) && (r_ptr->flags & RF_EVIL)) affect = TRUE; + if ((flags & TR_ONLY_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) affect = TRUE; /* Don't set it off if forbidden */ if (!affect) return (FALSE); @@ -2704,7 +2698,7 @@ bool_ mon_hit_trap(int m_idx) difficulty = 25; /* Some traps are well-hidden */ - if (f1 & TR1_STEALTH) + if (flags & TR_STEALTH) { difficulty += 10 * (kit_o_ptr->pval); } @@ -2795,7 +2789,7 @@ bool_ mon_hit_trap(int m_idx) { /* Get number of shots */ shots = 1; - if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval; + if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; if (shots <= 0) shots = 1; if (shots > load_o_ptr->number) shots = load_o_ptr->number; @@ -2811,7 +2805,7 @@ bool_ mon_hit_trap(int m_idx) if (kit_o_ptr->sval == SV_TRAPKIT_BOW) mul = 3; if (kit_o_ptr->sval == SV_TRAPKIT_XBOW) mul = 4; if (kit_o_ptr->sval == SV_TRAPKIT_SLING) mul = 2; - if (f3 & TR3_XTRA_MIGHT) mul += kit_o_ptr->pval; + if (flags & TR_XTRA_MIGHT) mul += kit_o_ptr->pval; if (mul < 0) mul = 0; /* Multiply damage */ @@ -2932,7 +2926,7 @@ bool_ mon_hit_trap(int m_idx) { /* Get number of shots */ shots = 1; - if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval; + if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; if (shots <= 0) shots = 1; if (shots > load_o_ptr->number) shots = load_o_ptr->number; @@ -2973,7 +2967,7 @@ bool_ mon_hit_trap(int m_idx) { /* Get number of shots */ shots = 1; - if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval; + if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; if (shots <= 0) shots = 1; if (shots > load_o_ptr->number) shots = load_o_ptr->number; @@ -3015,16 +3009,15 @@ bool_ mon_hit_trap(int m_idx) if (load_o_ptr->tval == TV_ROD_MAIN) { /* Extract mana cost of the rod tip */ - u32b tf1, tf2, tf3, tf4, tf5, tesp; object_kind *tip_o_ptr = &k_info[lookup_kind(TV_ROD, load_o_ptr->pval)]; - object_flags(load_o_ptr, &tf1, &tf2, &tf3, &tf4, &tf5, &tesp); - cost = (tf4 & TR4_CHEAPNESS) ? tip_o_ptr->pval / 2 : tip_o_ptr->pval; + auto const tflags = object_flags(load_o_ptr); + cost = (tflags & TR_CHEAPNESS) ? tip_o_ptr->pval / 2 : tip_o_ptr->pval; if (cost <= 0) cost = 1; } /* Get number of shots */ shots = 1; - if (f3 & TR3_XTRA_SHOTS) shots += kit_o_ptr->pval; + if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; if (shots <= 0) shots = 1; if (load_o_ptr->tval == TV_ROD_MAIN) @@ -3073,16 +3066,16 @@ bool_ mon_hit_trap(int m_idx) } /* Non-automatic traps are removed */ - if (!(f2 & (TRAP2_AUTOMATIC_5 | TRAP2_AUTOMATIC_99))) + if (!(flags & (TR_AUTOMATIC_5 | TR_AUTOMATIC_99))) { remove = TRUE; } - else if (f2 & TRAP2_AUTOMATIC_5) remove = (randint(5) == 1); + else if (flags & TR_AUTOMATIC_5) remove = (randint(5) == 1); } /* Special trap effect -- teleport to */ - if ((f2 & TRAP2_TELEPORT_TO) && (!disarm) && (!dead)) + if ((flags & TR_TELEPORT_TO) && (!disarm) && (!dead)) { teleport_monster_to(m_idx, p_ptr->py, p_ptr->px); } diff --git a/src/wizard2.cc b/src/wizard2.cc index 8685f242..46850be3 100644 --- a/src/wizard2.cc +++ b/src/wizard2.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 "player_type.hpp" #include "randart.hpp" @@ -223,32 +225,6 @@ static void do_cmd_summon_horde() } -/* - * Output a long int in binary format. - */ -static void prt_binary(u32b flags, int row, int col) -{ - int i; - u32b bitmask; - - /* Scan the flags */ - for (i = bitmask = 1; i <= 32; i++, bitmask *= 2) - { - /* Dump set bits */ - if (flags & bitmask) - { - Term_putch(col++, row, TERM_BLUE, '*'); - } - - /* Dump unset bits */ - else - { - Term_putch(col++, row, TERM_WHITE, '-'); - } - } -} - - /* * Hack -- Teleport to the target */ @@ -442,11 +418,10 @@ static void do_cmd_wiz_change(void) static void wiz_display_item(object_type *o_ptr) { int i, j = 13; - u32b f1, f2, f3, f4, f5, esp; char buf[256]; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Clear the screen */ for (i = 1; i <= 23; i++) prt("", i, j - 2); @@ -473,32 +448,27 @@ static void wiz_display_item(object_type *o_ptr) prt(format("ident = %04x timeout = %-d", o_ptr->ident, o_ptr->timeout), 8, j); - prt("+------------FLAGS1------------+", 10, j); - prt("AFFECT........SLAY........BRAND.", 11, j); - prt(" cvae xsqpaefc", 12, j); - prt("siwdcc ssidsahanvudotgddhuoclio", 13, j); - prt("tnieoh trnipttmiinmrrnrrraiierl", 14, j); - prt("rtsxna..lcfgdkcpmldncltggpksdced", 15, j); - prt_binary(f1, 16, j); - - prt("+------------FLAGS2------------+", 17, j); - prt("SUST....IMMUN.RESIST............", 18, j); - prt(" aefcprpsaefcpfldbc sn ", 19, j); - prt("siwdcc cliooeatcliooeialoshtncd", 20, j); - prt("tnieoh ierlifraierliatrnnnrhehi", 21, j); - prt("rtsxna..dcedslatdcedsrekdfddrxss", 22, j); - prt_binary(f2, 23, j); - - prt("+------------FLAGS3------------+", 10, j + 32); - prt("fe ehsi st iiiiadta hp", 11, j + 32); - prt("il n taihnf ee ggggcregb vr", 12, j + 32); - prt("re nowysdose eld nnnntalrl ym", 13, j + 32); - prt("ec omrcyewta ieirmsrrrriieaeccc", 14, j + 32); - prt("aa taauktmatlnpgeihaefcvnpvsuuu", 15, j + 32); - prt("uu egirnyoahivaeggoclioaeoasrrr", 16, j + 32); - prt("rr litsopdretitsehtierltxrtesss", 17, j + 32); - prt("aa echewestreshtntsdcedeptedeee", 18, j + 32); - prt_binary(f3, 19, j + 32); + /* Print all the flags which are set */ + prt("Flags:", 10, j); + + int const row0 = 11; + int row = row0; + int col = 0; + for (auto const &object_flag_meta: object_flags_meta()) + { + // Is the flag set? + if (object_flag_meta->flag_set & flags) + { + // Advance to next row/column + row += 1; + if (row >= 23) { + row = row0 + 1; + col += 1; + } + // Display + prt(object_flag_meta->name, row, j + 1 + 20 * col); + } + } } @@ -622,7 +592,7 @@ static int wiz_create_itemtype(void) if (k_ptr->tval == tval) { /* Hack -- Skip instant artifacts */ - if (k_ptr->flags3 & (TR3_INSTA_ART)) continue; + if (k_ptr->flags & TR_INSTA_ART) continue; /* Acquire the "name" of object "i" */ strip_name(buf, i); @@ -662,10 +632,9 @@ static void wiz_tweak_item(object_type *o_ptr) { cptr p; char tmp_val[80]; - u32b f1, f2, f3, f4, f5, esp; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); p = "Enter new 'pval' setting: "; @@ -727,7 +696,7 @@ static void wiz_tweak_item(object_type *o_ptr) if (!get_string(p, tmp_val, 9)) return; wiz_display_item(o_ptr); o_ptr->exp = atoi(tmp_val); - if (f4 & TR4_LEVELS) check_experience_obj(o_ptr); + if (flags & TR_LEVELS) check_experience_obj(o_ptr); p = "Enter new 'timeout' setting: "; sprintf(tmp_val, "%d", o_ptr->timeout); diff --git a/src/xtra1.cc b/src/xtra1.cc index db057278..1bf2b9a6 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -30,6 +30,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 "options.hpp" #include "player_class.hpp" @@ -1647,9 +1649,6 @@ static void calc_sanity() static void calc_mana(void) { int msp, levels, cur_wgt, max_wgt; - u32b f1, f2, f3, f4, f5, esp; - - object_type *o_ptr; levels = p_ptr->lev; @@ -1700,16 +1699,16 @@ static void calc_mana(void) p_ptr->cumber_glove = FALSE; /* Get the gloves */ - o_ptr = &p_ptr->inventory[INVEN_HANDS]; + object_type *o_ptr = &p_ptr->inventory[INVEN_HANDS]; /* Examine the gloves */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* Normal gloves hurt mage-type spells */ if (o_ptr->k_idx && - !(f2 & (TR2_FREE_ACT)) && - !((f1 & (TR1_DEX)) && (o_ptr->pval > 0)) && - !(f5 & TR5_SPELL_CONTAIN)) + !(flags & TR_FREE_ACT) && + !((flags & TR_DEX) && (o_ptr->pval > 0)) && + !(flags & TR_SPELL_CONTAIN)) { /* Encumbered */ p_ptr->cumber_glove = TRUE; @@ -1953,7 +1952,6 @@ static void calc_torch(void) { int i; object_type *o_ptr; - u32b f1, f2, f3, f4, f5, esp; /* Assume no light */ p_ptr->cur_lite = 0; @@ -1967,14 +1965,14 @@ static void calc_torch(void) if (!o_ptr->k_idx) continue; /* Extract the flags */ - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto const flags = object_flags(o_ptr); /* does this item glow? */ - if (((f4 & TR4_FUEL_LITE) && (o_ptr->timeout > 0)) || (!(f4 & TR4_FUEL_LITE))) + if (((flags & TR_FUEL_LITE) && (o_ptr->timeout > 0)) || (!(flags & TR_FUEL_LITE))) { - if (f3 & TR3_LITE1) p_ptr->cur_lite++; - if (f4 & TR4_LITE2) p_ptr->cur_lite += 2; - if (f4 & TR4_LITE3) p_ptr->cur_lite += 3; + if (flags & TR_LITE1) p_ptr->cur_lite++; + if (flags & TR_LITE2) p_ptr->cur_lite += 2; + if (flags & TR_LITE3) p_ptr->cur_lite += 3; } } @@ -2496,13 +2494,13 @@ static void calc_corruptions() { if (player_has_corruption(CORRUPT_BALROG_AURA)) { - p_ptr->xtra_f3 |= TR3_SH_FIRE; - p_ptr->xtra_f3 |= TR3_LITE1; + p_ptr->xtra_flags |= TR_SH_FIRE; + p_ptr->xtra_flags |= TR_LITE1; } if (player_has_corruption(CORRUPT_BALROG_WINGS)) { - p_ptr->xtra_f4 |= TR4_FLY; + p_ptr->xtra_flags |= TR_FLY; p_ptr->stat_add[A_CHR] -= 4; p_ptr->stat_add[A_DEX] -= 2; } @@ -2528,7 +2526,7 @@ static void calc_corruptions() p_ptr->pspeed = p_ptr->pspeed - (p_ptr->lev / 7); if (p_ptr->lev >= 40) { - p_ptr->xtra_f2 |= TR2_IM_FIRE; + p_ptr->xtra_flags |= TR_IM_FIRE; } } @@ -2545,7 +2543,7 @@ static void calc_corruptions() if (player_has_corruption(CORRUPT_RANDOM_TELEPORT)) { - p_ptr->xtra_f3 |= TR3_TELEPORT; + p_ptr->xtra_flags |= TR_TELEPORT; } if (player_has_corruption(CORRUPT_ANTI_TELEPORT)) @@ -2558,136 +2556,137 @@ static void calc_corruptions() if (player_has_corruption(CORRUPT_TROLL_BLOOD)) { - p_ptr->xtra_f3 |= (TR3_REGEN | TR3_AGGRAVATE); - p_ptr->xtra_esp |= ESP_TROLL; + p_ptr->xtra_flags |= (TR_REGEN | TR_AGGRAVATE | ESP_TROLL); } } /* Apply flags */ static int extra_blows; static int extra_shots; -void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a) +void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a) { s16b antimagic_mod; + // Mix into computed flags + p_ptr->computed_flags |= f; + /* Affect stats */ - if (f1 & (TR1_STR)) p_ptr->stat_add[A_STR] += pval; - if (f1 & (TR1_INT)) p_ptr->stat_add[A_INT] += pval; - if (f1 & (TR1_WIS)) p_ptr->stat_add[A_WIS] += pval; - if (f1 & (TR1_DEX)) p_ptr->stat_add[A_DEX] += pval; - if (f1 & (TR1_CON)) p_ptr->stat_add[A_CON] += pval; - if (f1 & (TR1_CHR)) p_ptr->stat_add[A_CHR] += pval; - if (f5 & (TR5_LUCK)) p_ptr->luck_cur += pval; + if (f & TR_STR) p_ptr->stat_add[A_STR] += pval; + if (f & TR_INT) p_ptr->stat_add[A_INT] += pval; + if (f & TR_WIS) p_ptr->stat_add[A_WIS] += pval; + if (f & TR_DEX) p_ptr->stat_add[A_DEX] += pval; + if (f & TR_CON) p_ptr->stat_add[A_CON] += pval; + if (f & TR_CHR) p_ptr->stat_add[A_CHR] += pval; + if (f & TR_LUCK) p_ptr->luck_cur += pval; /* Affect spell power */ - if (f1 & (TR1_SPELL)) p_ptr->to_s += pval; + if (f & TR_SPELL) p_ptr->to_s += pval; /* Affect mana capacity */ - if (f1 & (TR1_MANA)) p_ptr->to_m += pval; + if (f & TR_MANA) p_ptr->to_m += pval; /* Affect life capacity */ - if (f2 & (TR2_LIFE)) p_ptr->to_l += pval; + if (f & TR_LIFE) p_ptr->to_l += pval; /* Affect stealth */ - if (f1 & (TR1_STEALTH)) p_ptr->skill_stl += pval; + if (f & TR_STEALTH) p_ptr->skill_stl += pval; /* Affect searching ability (factor of five) */ - if (f1 & (TR1_SEARCH)) p_ptr->skill_srh += (pval * 5); + if (f & TR_SEARCH) p_ptr->skill_srh += (pval * 5); /* Affect searching frequency (factor of five) */ - if (f1 & (TR1_SEARCH)) p_ptr->skill_fos += (pval * 5); + if (f & TR_SEARCH) p_ptr->skill_fos += (pval * 5); /* Affect infravision */ - if (f1 & (TR1_INFRA)) p_ptr->see_infra += pval; + if (f & TR_INFRA) p_ptr->see_infra += pval; /* Affect digging (factor of 20) */ - if (f1 & (TR1_TUNNEL)) p_ptr->skill_dig += (pval * 20); + if (f & TR_TUNNEL) p_ptr->skill_dig += (pval * 20); /* Affect speed */ - if (f1 & (TR1_SPEED)) p_ptr->pspeed += pval; + if (f & TR_SPEED) p_ptr->pspeed += pval; /* Affect blows */ - if (f1 & (TR1_BLOWS)) extra_blows += pval; - if (f5 & (TR5_CRIT)) p_ptr->xtra_crit += pval; + if (f & TR_BLOWS) extra_blows += pval; + if (f & TR_CRIT) p_ptr->xtra_crit += pval; /* Hack -- Sensible fire */ - if (f2 & (TR2_SENS_FIRE)) p_ptr->sensible_fire = TRUE; + if (f & TR_SENS_FIRE) p_ptr->sensible_fire = TRUE; /* Hack -- cause earthquakes */ - if (f1 & (TR1_IMPACT)) p_ptr->impact = TRUE; + if (f & TR_IMPACT) p_ptr->impact = TRUE; /* Affect invisibility */ - if (f2 & (TR2_INVIS)) p_ptr->invis += (pval * 10); + if (f & TR_INVIS) p_ptr->invis += (pval * 10); /* Boost shots */ - if (f3 & (TR3_XTRA_SHOTS)) extra_shots++; + if (f & TR_XTRA_SHOTS) extra_shots++; /* Various flags */ - if (f3 & (TR3_AGGRAVATE)) p_ptr->aggravate = TRUE; - if (f3 & (TR3_TELEPORT)) p_ptr->teleport = TRUE; - if (f5 & (TR5_DRAIN_MANA)) p_ptr->drain_mana++; - if (f5 & (TR5_DRAIN_HP)) p_ptr->drain_life++; - if (f3 & (TR3_DRAIN_EXP)) p_ptr->exp_drain = TRUE; - if (f3 & (TR3_BLESSED)) p_ptr->bless_blade = TRUE; - if (f3 & (TR3_XTRA_MIGHT)) p_ptr->xtra_might += pval; - if (f3 & (TR3_SLOW_DIGEST)) p_ptr->slow_digest = TRUE; - if (f3 & (TR3_REGEN)) p_ptr->regenerate = TRUE; - if (esp) p_ptr->telepathy |= esp; - if ((tval != TV_LITE) && (f3 & (TR3_LITE1))) p_ptr->lite = TRUE; - if ((tval != TV_LITE) && (f4 & (TR4_LITE2))) p_ptr->lite = TRUE; - if ((tval != TV_LITE) && (f4 & (TR4_LITE3))) p_ptr->lite = TRUE; - if (f3 & (TR3_SEE_INVIS)) p_ptr->see_inv = TRUE; - if (f2 & (TR2_FREE_ACT)) p_ptr->free_act = TRUE; - if (f2 & (TR2_HOLD_LIFE)) p_ptr->hold_life = TRUE; - if (f3 & (TR3_WRAITH)) p_ptr->wraith_form = TRUE; - if (f3 & (TR3_FEATHER)) p_ptr->ffall = TRUE; - if (f4 & (TR4_FLY)) p_ptr->fly = TRUE; - if (f4 & (TR4_CLIMB)) p_ptr->climb = TRUE; + if (f & TR_AGGRAVATE) p_ptr->aggravate = TRUE; + if (f & TR_TELEPORT) p_ptr->teleport = TRUE; + if (f & TR_DRAIN_MANA) p_ptr->drain_mana++; + if (f & TR_DRAIN_HP) p_ptr->drain_life++; + if (f & TR_DRAIN_EXP) p_ptr->exp_drain = TRUE; + if (f & TR_BLESSED) p_ptr->bless_blade = TRUE; + if (f & TR_XTRA_MIGHT) p_ptr->xtra_might += pval; + if (f & TR_SLOW_DIGEST) p_ptr->slow_digest = TRUE; + if (f & TR_REGEN) p_ptr->regenerate = TRUE; + if ((tval != TV_LITE) && (f & TR_LITE1)) p_ptr->lite = TRUE; + if ((tval != TV_LITE) && (f & TR_LITE2)) p_ptr->lite = TRUE; + if ((tval != TV_LITE) && (f & TR_LITE3)) p_ptr->lite = TRUE; + if (f & TR_SEE_INVIS) p_ptr->see_inv = TRUE; + if (f & TR_FREE_ACT) p_ptr->free_act = TRUE; + if (f & TR_HOLD_LIFE) p_ptr->hold_life = TRUE; + if (f & TR_WRAITH) p_ptr->wraith_form = TRUE; + if (f & TR_FEATHER) p_ptr->ffall = TRUE; + if (f & TR_FLY) p_ptr->fly = TRUE; + if (f & TR_CLIMB) p_ptr->climb = TRUE; /* Immunity flags */ - if (f2 & (TR2_IM_FIRE)) p_ptr->immune_fire = TRUE; - if (f2 & (TR2_IM_ACID)) p_ptr->immune_acid = TRUE; - if (f2 & (TR2_IM_COLD)) p_ptr->immune_cold = TRUE; - if (f2 & (TR2_IM_ELEC)) p_ptr->immune_elec = TRUE; + if (f & TR_IM_FIRE) p_ptr->immune_fire = TRUE; + if (f & TR_IM_ACID) p_ptr->immune_acid = TRUE; + if (f & TR_IM_COLD) p_ptr->immune_cold = TRUE; + if (f & TR_IM_ELEC) p_ptr->immune_elec = TRUE; /* Resistance flags */ - if (f2 & (TR2_RES_ACID)) p_ptr->resist_acid = TRUE; - if (f2 & (TR2_RES_ELEC)) p_ptr->resist_elec = TRUE; - if (f2 & (TR2_RES_FIRE)) p_ptr->resist_fire = TRUE; - if (f2 & (TR2_RES_COLD)) p_ptr->resist_cold = TRUE; - if (f2 & (TR2_RES_POIS)) p_ptr->resist_pois = TRUE; - if (f2 & (TR2_RES_FEAR)) p_ptr->resist_fear = TRUE; - if (f2 & (TR2_RES_CONF)) p_ptr->resist_conf = TRUE; - if (f2 & (TR2_RES_SOUND)) p_ptr->resist_sound = TRUE; - if (f2 & (TR2_RES_LITE)) p_ptr->resist_lite = TRUE; - if (f2 & (TR2_RES_DARK)) p_ptr->resist_dark = TRUE; - if (f2 & (TR2_RES_CHAOS)) p_ptr->resist_chaos = TRUE; - if (f2 & (TR2_RES_DISEN)) p_ptr->resist_disen = TRUE; - if (f2 & (TR2_RES_SHARDS)) p_ptr->resist_shard = TRUE; - if (f2 & (TR2_RES_NEXUS)) p_ptr->resist_nexus = TRUE; - if (f2 & (TR2_RES_BLIND)) p_ptr->resist_blind = TRUE; - if (f2 & (TR2_RES_NETHER)) p_ptr->resist_neth = TRUE; - if (f4 & (TR4_IM_NETHER)) p_ptr->immune_neth = TRUE; - - if (f2 & (TR2_REFLECT)) p_ptr->reflect = TRUE; - if (f3 & (TR3_SH_FIRE)) p_ptr->sh_fire = TRUE; - if (f3 & (TR3_SH_ELEC)) p_ptr->sh_elec = TRUE; - if (f3 & (TR3_NO_MAGIC)) p_ptr->anti_magic = TRUE; - if (f3 & (TR3_NO_TELE)) p_ptr->anti_tele = TRUE; + if (f & TR_RES_ACID) p_ptr->resist_acid = TRUE; + if (f & TR_RES_ELEC) p_ptr->resist_elec = TRUE; + if (f & TR_RES_FIRE) p_ptr->resist_fire = TRUE; + if (f & TR_RES_COLD) p_ptr->resist_cold = TRUE; + if (f & TR_RES_POIS) p_ptr->resist_pois = TRUE; + if (f & TR_RES_FEAR) p_ptr->resist_fear = TRUE; + if (f & TR_RES_CONF) p_ptr->resist_conf = TRUE; + if (f & TR_RES_SOUND) p_ptr->resist_sound = TRUE; + if (f & TR_RES_LITE) p_ptr->resist_lite = TRUE; + if (f & TR_RES_DARK) p_ptr->resist_dark = TRUE; + if (f & TR_RES_CHAOS) p_ptr->resist_chaos = TRUE; + if (f & TR_RES_DISEN) p_ptr->resist_disen = TRUE; + if (f & TR_RES_SHARDS) p_ptr->resist_shard = TRUE; + if (f & TR_RES_NEXUS) p_ptr->resist_nexus = TRUE; + if (f & TR_RES_BLIND) p_ptr->resist_blind = TRUE; + if (f & TR_RES_NETHER) p_ptr->resist_neth = TRUE; + if (f & TR_IM_NETHER) p_ptr->immune_neth = TRUE; + + if (f & TR_REFLECT) p_ptr->reflect = TRUE; + if (f & TR_SH_FIRE) p_ptr->sh_fire = TRUE; + if (f & TR_SH_ELEC) p_ptr->sh_elec = TRUE; + if (f & TR_NO_MAGIC) p_ptr->anti_magic = TRUE; + if (f & TR_NO_TELE) p_ptr->anti_tele = TRUE; /* Sustain flags */ - if (f2 & (TR2_SUST_STR)) p_ptr->sustain_str = TRUE; - if (f2 & (TR2_SUST_INT)) p_ptr->sustain_int = TRUE; - if (f2 & (TR2_SUST_WIS)) p_ptr->sustain_wis = TRUE; - if (f2 & (TR2_SUST_DEX)) p_ptr->sustain_dex = TRUE; - if (f2 & (TR2_SUST_CON)) p_ptr->sustain_con = TRUE; - if (f2 & (TR2_SUST_CHR)) p_ptr->sustain_chr = TRUE; + if (f & TR_SUST_STR) p_ptr->sustain_str = TRUE; + if (f & TR_SUST_INT) p_ptr->sustain_int = TRUE; + if (f & TR_SUST_WIS) p_ptr->sustain_wis = TRUE; + if (f & TR_SUST_DEX) p_ptr->sustain_dex = TRUE; + if (f & TR_SUST_CON) p_ptr->sustain_con = TRUE; + if (f & TR_SUST_CHR) p_ptr->sustain_chr = TRUE; - if (f4 & (TR4_PRECOGNITION)) p_ptr->precognition = TRUE; + if (f & TR_PRECOGNITION) p_ptr->precognition = TRUE; antimagic_mod = to_h + to_d + to_a; - if (f4 & (TR4_ANTIMAGIC_50)) + if (f & TR_ANTIMAGIC_50) { s32b tmp; @@ -2698,7 +2697,7 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva if (tmp > 0) p_ptr->antimagic_dis += tmp; } - if (f4 & (TR4_AUTO_ID)) + if (f & TR_AUTO_ID) { p_ptr->auto_id = TRUE; } @@ -2708,13 +2707,17 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva * "black_breath". This flag can also be set by a unlucky blow from * an undead. -LM- */ - if (f4 & (TR4_BLACK_BREATH)) p_ptr->black_breath = TRUE; + if (f & TR_BLACK_BREATH) p_ptr->black_breath = TRUE; - if (f5 & (TR5_IMMOVABLE)) p_ptr->immovable = TRUE; + if (f & TR_IMMOVABLE) p_ptr->immovable = TRUE; /* Breaths */ - if (f5 & (TR5_WATER_BREATH)) p_ptr->water_breath = TRUE; - if (f5 & (TR5_MAGIC_BREATH)) + if (f & TR_WATER_BREATH) + { + p_ptr->water_breath = TRUE; + } + + if (f & TR_MAGIC_BREATH) { p_ptr->magical_breath = TRUE; p_ptr->water_breath = TRUE; @@ -2774,20 +2777,20 @@ void calc_bonuses(bool_ silent) static bool_ monk_notify_aux = FALSE; int i, j, hold; int old_speed; - u32b old_telepathy; int old_see_inv; int old_dis_ac; int old_dis_to_a; object_type *o_ptr; - u32b f1, f2, f3, f4, f5, esp; bool_ monk_armour_aux; + /* Save the old computed_flags */ + auto old_computed_flags = p_ptr->computed_flags; + /* Save the old speed */ old_speed = p_ptr->pspeed; /* Save the old vision stuff */ - old_telepathy = p_ptr->telepathy; old_see_inv = p_ptr->see_inv; /* Save the old armor class */ @@ -2855,7 +2858,7 @@ void calc_bonuses(bool_ silent) p_ptr->climb = FALSE; p_ptr->ffall = FALSE; p_ptr->hold_life = FALSE; - p_ptr->telepathy = 0; + p_ptr->computed_flags = object_flag_set(); p_ptr->lite = FALSE; p_ptr->sustain_str = FALSE; p_ptr->sustain_int = FALSE; @@ -2942,12 +2945,7 @@ void calc_bonuses(bool_ silent) p_ptr->skill_dig = 0; /* Xtra player flags */ - p_ptr->xtra_f1 = 0; - p_ptr->xtra_f2 = 0; - p_ptr->xtra_f3 = 0; - p_ptr->xtra_f4 = 0; - p_ptr->xtra_f5 = 0; - p_ptr->xtra_esp = 0; + p_ptr->xtra_flags = object_flag_set(); /* Hide the skills that should auto hide */ for (i = 0; i < max_s_idx; i++) @@ -2980,7 +2978,7 @@ void calc_bonuses(bool_ silent) for (i = 1; i <= p_ptr->lev; i++) { - apply_flags(cp_ptr->oflags1[i], cp_ptr->oflags2[i], cp_ptr->oflags3[i], cp_ptr->oflags4[i], cp_ptr->oflags5[i], cp_ptr->oesp[i], cp_ptr->opval[i], 0, 0, 0, 0); + apply_flags(cp_ptr->oflags[i], cp_ptr->opval[i], 0, 0, 0, 0); } if (p_ptr->melee_style == SKILL_HAND) @@ -3009,7 +3007,10 @@ void calc_bonuses(bool_ silent) if (get_skill(SKILL_DAEMON) > 20) p_ptr->resist_conf = TRUE; if (get_skill(SKILL_DAEMON) > 30) p_ptr->resist_fear = TRUE; - if ( get_skill(SKILL_MINDCRAFT) >= 40 ) p_ptr->telepathy = ESP_ALL; + if ( get_skill(SKILL_MINDCRAFT) >= 40 ) + { + p_ptr->computed_flags |= ESP_ALL; + } if (p_ptr->astral) { @@ -3023,8 +3024,8 @@ void calc_bonuses(bool_ silent) for (i = 1; i <= p_ptr->lev; i++) { - apply_flags(rp_ptr->oflags1[i], rp_ptr->oflags2[i], rp_ptr->oflags3[i], rp_ptr->oflags4[i], rp_ptr->oflags5[i], rp_ptr->oesp[i], rp_ptr->opval[i], 0, 0, 0, 0); - apply_flags(rmp_ptr->oflags1[i], rmp_ptr->oflags2[i], rmp_ptr->oflags3[i], rmp_ptr->oflags4[i], rmp_ptr->oflags5[i], rmp_ptr->oesp[i], rmp_ptr->opval[i], 0, 0, 0, 0); + apply_flags(rp_ptr->oflags[i], rp_ptr->opval[i], 0, 0, 0, 0); + apply_flags(rmp_ptr->oflags[i], rmp_ptr->opval[i], 0, 0, 0, 0); } if (race_flags1_p(PR1_HURT_LITE)) @@ -3032,7 +3033,7 @@ void calc_bonuses(bool_ silent) } /* The extra flags */ - apply_flags(p_ptr->xtra_f1, p_ptr->xtra_f2, p_ptr->xtra_f3, p_ptr->xtra_f4, p_ptr->xtra_f5, p_ptr->xtra_esp, 0, 0, 0, 0, 0); + apply_flags(p_ptr->xtra_flags, 0, 0, 0, 0, 0); /* Apply the racial modifiers */ for (i = 0; i < 6; i++) @@ -3052,7 +3053,7 @@ void calc_bonuses(bool_ silent) /* Extract the item flags */ object_flags_no_set = TRUE; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + auto flags = object_flags(o_ptr); object_flags_no_set = FALSE; /* MEGA ugly hack -- set spacetime distortion resistance */ @@ -3064,10 +3065,10 @@ void calc_bonuses(bool_ silent) /* Hack - don't give the Black Breath when merely inspecting a weapon */ if (silent) { - f4 &= ~TR4_BLACK_BREATH; + flags &= ~TR_BLACK_BREATH; } - apply_flags(f1, f2, f3, f4, f5, esp, o_ptr->pval, o_ptr->tval, o_ptr->to_h, o_ptr->to_d, o_ptr->to_a); + apply_flags(flags, o_ptr->pval, o_ptr->tval, o_ptr->to_h, o_ptr->to_d, o_ptr->to_a); if (o_ptr->name1) { @@ -3285,7 +3286,7 @@ void calc_bonuses(bool_ silent) /* Temporary precognition */ if (p_ptr->tim_precognition > 0) { - apply_flags(0, 0, 0, TR4_PRECOGNITION, 0, 0, 0, 0, 0, 0, 0); + apply_flags(TR_PRECOGNITION, 0, 0, 0, 0, 0); } /* Breath */ @@ -3441,7 +3442,7 @@ void calc_bonuses(bool_ silent) if (p_ptr->tim_esp) { - p_ptr->telepathy |= ESP_ALL; + p_ptr->computed_flags |= ESP_ALL; } /* Temporary see invisible */ @@ -3482,9 +3483,12 @@ void calc_bonuses(bool_ silent) /* Hack -- Telepathy Change */ - if (p_ptr->telepathy != old_telepathy) { - p_ptr->update |= (PU_MONSTERS); + auto const &esp_mask = object_flags_esp(); + if ((p_ptr->computed_flags & esp_mask) != (old_computed_flags & esp_mask)) + { + p_ptr->update |= (PU_MONSTERS); + } } /* Hack -- See Invis Change */ @@ -3826,10 +3830,8 @@ void calc_bonuses(bool_ silent) /* 2handed weapon and shield = less damage */ if (p_ptr->inventory[INVEN_WIELD + i].k_idx && p_ptr->inventory[INVEN_ARM + i].k_idx) { - /* Extract the item flags */ - object_flags(&p_ptr->inventory[INVEN_WIELD + i], &f1, &f2, &f3, &f4, &f5, &esp); - - if (f4 & TR4_COULD2H) + auto const flags = object_flags(&p_ptr->inventory[INVEN_WIELD + i]); + if (flags & TR_COULD2H) { int tmp; @@ -4376,7 +4378,7 @@ static int get_artifact_idx(int level) if (a_ptr->level > level) continue; /* Avoid granting SPECIAL_GENE artifacts */ - if (a_ptr->flags4 & TR4_SPECIAL_GENE) continue; + if (a_ptr->flags & TR_SPECIAL_GENE) continue; return i; } @@ -4482,7 +4484,7 @@ void gain_fate(byte fate) k_ptr = &k_info[fates[i].o_idx]; - if (!(k_ptr->flags3 & TR3_INSTA_ART) && !(k_ptr->flags3 & TR3_NORM_ART)) break; + if (!(k_ptr->flags & TR_INSTA_ART) && !(k_ptr->flags & TR_NORM_ART)) break; } level = rand_range(max_dlv[dungeon_type] - 20, max_dlv[dungeon_type] + 20); fates[i].level = (level < 1) ? 1 : (level > 98) ? 98 : level; @@ -4601,7 +4603,7 @@ std::string fate_desc(int fate) q_ptr->weight = a_ptr->weight; /* Hack -- acquire "cursed" flag */ - if (a_ptr->flags3 & (TR3_CURSED)) q_ptr->ident |= (IDENT_CURSED); + if (a_ptr->flags & (TR_CURSED)) q_ptr->ident |= (IDENT_CURSED); random_artifact_resistance(q_ptr); diff --git a/src/xtra1.hpp b/src/xtra1.hpp index e2a41b13..3e434828 100644 --- a/src/xtra1.hpp +++ b/src/xtra1.hpp @@ -1,11 +1,12 @@ #pragma once #include "h-basic.h" +#include "object_flag_set.hpp" #include extern void fix_message(void); -extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); +extern void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); extern int luck(int min, int max); extern int weight_limit(void); extern bool_ calc_powers_silent; diff --git a/src/xtra2.cc b/src/xtra2.cc index 5193aa81..4f1536db 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -32,6 +32,7 @@ #include "notes.hpp" #include "object1.hpp" #include "object2.hpp" +#include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" #include "player_class.hpp" @@ -2572,24 +2573,34 @@ void monster_death(int m_idx) q_ptr->dd = 6; q_ptr->pval = 2; - q_ptr->art_flags1 |= ( TR1_VAMPIRIC | TR1_STR | TR1_CON | TR1_BLOWS ); - q_ptr->art_flags2 |= ( TR2_FREE_ACT | TR2_HOLD_LIFE | - TR2_RES_NEXUS | TR2_RES_CHAOS | TR2_RES_NETHER | - TR2_RES_CONF ); /* No longer resist_disen */ - q_ptr->art_flags3 |= ( TR3_IGNORE_ACID | TR3_IGNORE_ELEC | - TR3_IGNORE_FIRE | TR3_IGNORE_COLD); - /* Just to be sure */ + q_ptr->art_flags |= + TR_VAMPIRIC | + TR_STR | + TR_CON | + TR_BLOWS | + TR_FREE_ACT | + TR_HOLD_LIFE | + TR_RES_NEXUS | + TR_RES_CHAOS | + TR_RES_NETHER | + TR_RES_CONF | + TR_IGNORE_ACID | + TR_IGNORE_ELEC | + TR_IGNORE_FIRE | + TR_IGNORE_COLD | + TR_NO_TELE | + TR_CURSED | + TR_HEAVY_CURSE; - q_ptr->art_flags3 |= TR3_NO_TELE; /* How's that for a downside? */ - - /* For game balance... */ - q_ptr->art_flags3 |= (TR3_CURSED | TR3_HEAVY_CURSE); q_ptr->ident |= IDENT_CURSED; - if (randint(2) == 1) - q_ptr->art_flags3 |= (TR3_DRAIN_EXP); + { + q_ptr->art_flags |= TR_DRAIN_EXP; + } else - q_ptr->art_flags3 |= (TR3_AGGRAVATE); + { + q_ptr->art_flags |= TR_AGGRAVATE; + } q_ptr->found = OBJ_FOUND_MONSTER; q_ptr->found_aux1 = m_ptr->r_idx; @@ -2799,7 +2810,7 @@ void monster_death(int m_idx) q_ptr->weight = a_ptr->weight; /* Hack -- acquire "cursed" flag */ - if (a_ptr->flags3 & (TR3_CURSED)) q_ptr->ident |= (IDENT_CURSED); + if (a_ptr->flags & TR_CURSED) q_ptr->ident |= (IDENT_CURSED); random_artifact_resistance(q_ptr); @@ -3145,15 +3156,12 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) if (!note) { - object_type *o_ptr; - u32b f1, f2, f3, f4, f5, esp; - /* Access the weapon */ - o_ptr = &p_ptr->inventory[INVEN_WIELD]; - object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp); + object_type *o_ptr = &p_ptr->inventory[INVEN_WIELD]; + auto const flags = object_flags(o_ptr); /* Can the weapon gain levels ? */ - if ((o_ptr->k_idx) && (f4 & TR4_LEVELS)) + if ((o_ptr->k_idx) && (flags & TR_LEVELS)) { /* Give some experience for the kill */ const int new_exp = ((long)r_ptr->mexp * m_ptr->level) / (div * 2); @@ -5061,8 +5069,8 @@ static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge o_ptr = forge; if (!k_ptr->name) continue; - if (k_ptr->flags3 & TR3_NORM_ART) continue; - if (k_ptr->flags3 & TR3_INSTA_ART) continue; + if (k_ptr->flags & TR_NORM_ART) continue; + if (k_ptr->flags & TR_INSTA_ART) continue; if (k_ptr->tval == TV_GOLD) continue; object_prep(o_ptr, i); diff --git a/tests/flag_set.cc b/tests/flag_set.cc index 05418a05..fe1ad4a4 100644 --- a/tests/flag_set.cc +++ b/tests/flag_set.cc @@ -90,6 +90,21 @@ go_bandit([]() { AssertThat(result[1], Equals(8UL)); }); + it("make_bit(5) should set the 5th bit in the 1st tier", [&] { + // Exercise + fs_t result = fs_t::make_bit(5); + // Verify + AssertThat(result[0], Equals(32L)); + AssertThat(result[1], Equals(0L)); + }); + + it("make_bit(37) should set the 5th bit in the 2nd tier", [&] { + // Exercise + fs_t result = fs_t::make_bit(37); + // Verify + AssertThat(result[0], Equals(0L)); + AssertThat(result[1], Equals(32L)); + }); }); }); -- cgit v1.2.3 From 60ff0466730fdccea279e5320b3991788cff125f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Apply random_artifact_resistance() to debug-created artifacts too --- src/wizard2.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wizard2.cc b/src/wizard2.cc index 46850be3..a4f697bd 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -195,6 +195,9 @@ static void wiz_create_named_art() apply_magic(q_ptr, -1, TRUE, TRUE, TRUE); + /* Apply any random resistances/powers */ + random_artifact_resistance(q_ptr); + /* Identify it fully */ object_aware(q_ptr); object_known(q_ptr); -- cgit v1.2.3 From 81585d95403e6e32a5dff056c018f2eff755cc94 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 13:37:02 +0200 Subject: Fix random_artifact_resistance() granting 'duplicate' resistance --- src/object2.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/object2.cc b/src/object2.cc index f6b526f6..ce0679cc 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -2108,7 +2108,7 @@ static void random_artifact_power(object_type *o_ptr) void random_artifact_resistance(object_type * o_ptr) { - auto art_flags = a_info[o_ptr->name1].flags; + auto const art_flags = a_info[o_ptr->name1].flags; // Check flags of the 'protype' artifact auto give_resistance = bool(art_flags & TR_RANDOM_RESIST); @@ -2125,7 +2125,7 @@ void random_artifact_resistance(object_type * o_ptr) } } - // Grant the resistance/power + // Grant a power? if (give_power) { random_artifact_power(o_ptr); @@ -2135,15 +2135,17 @@ void random_artifact_resistance(object_type * o_ptr) if (give_resistance) { - // Save flags - auto const flags = o_ptr->art_flags; + // Save the *combined* pre-existing flags on the object; + // including any power we may have granted above. + auto const flags_before = art_flags | o_ptr->art_flags; + // We'll be a little generous here and make sure that the object // gets a resistance that it doesn't actually already have. for (int tries = 0; tries < 1000; tries++) { random_resistance(o_ptr, randint(22) + 16); - // Picked up a new resistance? - if (flags != o_ptr->art_flags) + // Picked up new resistance? + if (flags_before != (art_flags | o_ptr->art_flags)) { break; } -- cgit v1.2.3 From 71742f41caf3721e993f169b9259e29e26f566cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 21:17:20 +0200 Subject: Remove unused fields in feature_type --- src/feature_type.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/feature_type.hpp b/src/feature_type.hpp index 1a79aeb3..54975269 100644 --- a/src/feature_type.hpp +++ b/src/feature_type.hpp @@ -17,14 +17,9 @@ struct feature_type u32b flags1; /* First set of flags */ - byte extra; /* Extra byte (unused) */ - - s16b unused; /* Extra bytes (unused) */ - byte d_attr; /* Default feature attribute */ char d_char; /* Default feature character */ - byte x_attr; /* Desired feature attribute */ char x_char; /* Desired feature character */ -- cgit v1.2.3 From ebc402cfa4182a50f46ac2d56e3b74c5372eed84 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 21:17:20 +0200 Subject: Change feature_type to non-POD type --- src/feature_type.hpp | 30 +++++++++++++++--------------- src/init2.cc | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/feature_type.hpp b/src/feature_type.hpp index 54975269..40a1f58b 100644 --- a/src/feature_type.hpp +++ b/src/feature_type.hpp @@ -7,26 +7,26 @@ */ struct feature_type { - char *name; /* Name */ + char *name = nullptr; /* Name */ - const char *text; /* Text. May point to shared read-only memory, DO NOT FREE! */ - const char *tunnel; /* Text for tunneling. May point to shared read-only memory, DO NOT FREE! */ - const char *block; /* Text for blocking. May point to shared read-only memory, DO NOT FREE! */ + const char *text = nullptr; /* Text. May point to shared read-only memory, DO NOT FREE! */ + const char *tunnel = nullptr; /* Text for tunneling. May point to shared read-only memory, DO NOT FREE! */ + const char *block = nullptr; /* Text for blocking. May point to shared read-only memory, DO NOT FREE! */ - byte mimic; /* Feature to mimic */ + byte mimic = 0; /* Feature to mimic */ - u32b flags1; /* First set of flags */ + u32b flags1 = 0; /* First set of flags */ - byte d_attr; /* Default feature attribute */ - char d_char; /* Default feature character */ + byte d_attr = 0; /* Default feature attribute */ + char d_char = '\0'; /* Default feature character */ - byte x_attr; /* Desired feature attribute */ - char x_char; /* Desired feature character */ + byte x_attr = 0; /* Desired feature attribute */ + char x_char = '\0'; /* Desired feature character */ - byte shimmer[7]; /* Shimmer colors */ + byte shimmer[7]; /* Shimmer colors */ - int d_dice[4]; /* Number of dices */ - int d_side[4]; /* Number of sides */ - int d_frequency[4]; /* Frequency of damage (1 is the minimum) */ - int d_type[4]; /* Type of damage */ + int d_dice[4] = { 0 }; /* Number of dice */ + int d_side[4] = { 0 }; /* Number of sides */ + int d_frequency[4] = { 0 }; /* Frequency of damage (1 is the minimum) */ + int d_type[4] = { 0 }; /* Type of damage */ }; diff --git a/src/init2.cc b/src/init2.cc index 678a018c..29c4e3e1 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -279,7 +279,7 @@ namespace { static void allocate() { - f_info = make_array(max_f_idx); + f_info = new feature_type[max_f_idx]; } static errr parse(FILE *fp) -- cgit v1.2.3 From 3966bfb2f6836d13c1a93bfab1e9fa61ec4fff35 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 21:17:20 +0200 Subject: Rework FF1_* flags to flags_set<> --- src/cave.cc | 41 +++++++++++++++++----------------- src/cmd1.cc | 23 +++++++++---------- src/cmd2.cc | 11 +++++----- src/defines.h | 21 ------------------ src/dungeon.cc | 10 ++++++--- src/feature_flag.hpp | 12 ++++++++++ src/feature_flag_list.hpp | 25 +++++++++++++++++++++ src/feature_flag_set.hpp | 7 ++++++ src/feature_type.hpp | 4 +++- src/gen_evol.cc | 15 +++++++------ src/generate.cc | 35 +++++++++++++++-------------- src/init1.cc | 56 ++++++++++------------------------------------- src/melee2.cc | 15 +++++++------ src/object2.cc | 3 ++- src/powers.cc | 3 ++- src/q_dragons.cc | 13 +++++------ src/q_evil.cc | 8 +++---- src/q_fireprof.cc | 5 +++-- src/q_god.cc | 5 +++-- src/q_haunted.cc | 16 ++++++-------- src/q_wolves.cc | 15 ++++++------- src/spells1.cc | 35 +++++++++++++++-------------- src/spells2.cc | 23 +++++++++---------- src/spells3.cc | 5 +++-- src/traps.cc | 13 ++++++----- src/wild.cc | 5 +++-- src/xtra2.cc | 5 +++-- 27 files changed, 218 insertions(+), 211 deletions(-) create mode 100644 src/feature_flag.hpp create mode 100644 src/feature_flag_list.hpp create mode 100644 src/feature_flag_set.hpp diff --git a/src/cave.cc b/src/cave.cc index 97f022c1..52855a8b 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -2,6 +2,7 @@ #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_enter_dungeon_in.hpp" #include "monster2.hpp" @@ -91,7 +92,7 @@ static bool_ is_wall(cave_type *c_ptr) if (feat == FEAT_SMALL_TREES) return TRUE; /* Normal cases: use the WALL flag in f_info.txt */ - return (f_info[feat].flags1 & FF1_WALL) ? TRUE : FALSE; + return (f_info[feat].flags & FF_WALL) ? TRUE : FALSE; } @@ -918,7 +919,7 @@ static void map_info(int y, int x, byte *ap, char *cp) * Cave macros cannot be used safely here, because of * c_ptr->mimic XXX XXX */ - if ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR) + if ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR) { c = f_info[FEAT_TRAP].x_char; } @@ -948,7 +949,7 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* Multi-hued attr */ - else if (f_ptr->flags1 & FF1_ATTR_MULTI) + else if (f_ptr->flags & FF_ATTR_MULTI) { a = f_ptr->shimmer[rand_int(7)]; } @@ -971,7 +972,7 @@ static void map_info(int y, int x, byte *ap, char *cp) /* view_special_lite: lighting effects for boring features */ if (view_special_lite && - ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR)) + ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) { @@ -1011,7 +1012,7 @@ static void map_info(int y, int x, byte *ap, char *cp) /* view_granite_lite: lighting effects for walls and doors */ else if (view_granite_lite && - (f_ptr->flags1 & (FF1_NO_VISION | FF1_DOOR))) + (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) { @@ -1352,7 +1353,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) * Cave macros cannot be used safely here, because of * c_ptr->mimic XXX XXX */ - if ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR) + if ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR) { c = f_info[FEAT_TRAP].d_char; } @@ -1382,7 +1383,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Multi-hued attr */ - else if (f_ptr->flags1 & FF1_ATTR_MULTI) + else if (f_ptr->flags & FF_ATTR_MULTI) { a = f_ptr->shimmer[rand_int(7)]; } @@ -1405,7 +1406,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) /* view_special_lite: lighting effects for boring features */ if (view_special_lite && - ((f_ptr->flags1 & (FF1_FLOOR | FF1_REMEMBER)) == FF1_FLOOR)) + ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) { @@ -1445,7 +1446,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) /* view_granite_lite: lighting effects for walls and doors */ else if (view_granite_lite && - (f_ptr->flags1 & (FF1_NO_VISION | FF1_DOOR))) + (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) { @@ -3691,7 +3692,7 @@ void update_mon_lite(void) * * We don't have four sides for a wall grid, so... */ - if (invis && (f_info[c_ptr->feat].flags1 & FF1_NO_VISION)) continue; + if (invis && (f_info[c_ptr->feat].flags & FF_NO_VISION)) continue; /* Give monster light to the location */ c_ptr->info |= (CAVE_MLIT | CAVE_SEEN); @@ -4548,7 +4549,7 @@ bool cave_floor_bold(int y, int x) */ bool cave_floor_grid(cave_type const *c) { - return (f_info[c->feat].flags1 & FF1_FLOOR) && (c->feat != FEAT_MON_TRAP); + return (f_info[c->feat].flags & FF_FLOOR) && (c->feat != FEAT_MON_TRAP); } @@ -4568,8 +4569,8 @@ bool cave_plain_floor_bold(int y, int x) bool cave_plain_floor_grid(cave_type const *c) { return - (f_info[c->feat].flags1 & FF1_FLOOR) && - !(f_info[c->feat].flags1 & FF1_REMEMBER); + (f_info[c->feat].flags & FF_FLOOR) && + !(f_info[c->feat].flags & FF_REMEMBER); } @@ -4593,7 +4594,7 @@ bool cave_sight_bold(int y, int x) bool cave_sight_grid(cave_type const *c) { - return !(f_info[c->feat].flags1 & FF1_NO_VISION); + return !(f_info[c->feat].flags & FF_NO_VISION); } @@ -4608,10 +4609,10 @@ bool cave_sight_grid(cave_type const *c) bool cave_clean_bold(int y, int x) { return - (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) && + (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && (cave[y][x].o_idxs.empty()) && - !(f_info[cave[y][x].feat].flags1 & FF1_PERMANENT); + !(f_info[cave[y][x].feat].flags & FF_PERMANENT); } /* @@ -4640,9 +4641,9 @@ bool cave_empty_bold(int y, int x) bool cave_naked_bold(int y, int x) { return - (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) && + (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && - !(f_info[cave[y][x].feat].flags1 & FF1_PERMANENT) && + !(f_info[cave[y][x].feat].flags & FF_PERMANENT) && (cave[y][x].o_idxs.empty()) && (cave[y][x].m_idx == 0); } @@ -4650,7 +4651,7 @@ bool cave_naked_bold(int y, int x) bool cave_naked_bold2(int y, int x) { return - (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) && + (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && (cave[y][x].o_idxs.empty()) && (cave[y][x].m_idx == 0); @@ -4667,7 +4668,7 @@ bool cave_perma_bold(int y, int x) bool cave_perma_grid(cave_type const *c) { - return f_info[c->feat].flags1 & FF1_PERMANENT; + return bool(f_info[c->feat].flags & FF_PERMANENT); } /* diff --git a/src/cmd1.cc b/src/cmd1.cc index bb0aa5f3..55b1954e 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -13,6 +13,7 @@ #include "cmd4.hpp" #include "cmd5.hpp" #include "dungeon_info_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -2601,23 +2602,23 @@ bool_ player_can_enter(byte feature) return (TRUE); } - if ((p_ptr->climb) && (f_info[feature].flags1 & FF1_CAN_CLIMB)) + if ((p_ptr->climb) && (f_info[feature].flags & FF_CAN_CLIMB)) return (TRUE); if ((p_ptr->fly) && - ((f_info[feature].flags1 & FF1_CAN_FLY) || - (f_info[feature].flags1 & FF1_CAN_LEVITATE))) + ((f_info[feature].flags & FF_CAN_FLY) || + (f_info[feature].flags & FF_CAN_LEVITATE))) return (TRUE); - else if (only_wall && (f_info[feature].flags1 & FF1_FLOOR)) + else if (only_wall && (f_info[feature].flags & FF_FLOOR)) return (FALSE); else if ((p_ptr->ffall) && - (f_info[feature].flags1 & FF1_CAN_LEVITATE)) + (f_info[feature].flags & FF_CAN_LEVITATE)) return (TRUE); else if ((pass_wall || only_wall) && - (f_info[feature].flags1 & FF1_CAN_PASS)) + (f_info[feature].flags & FF_CAN_PASS)) return (TRUE); - else if (f_info[feature].flags1 & FF1_NO_WALK) + else if (f_info[feature].flags & FF_NO_WALK) return (FALSE); - else if ((f_info[feature].flags1 & FF1_WEB) && + else if ((f_info[feature].flags & FF_WEB) && ((!(r_info[p_ptr->body_monster].flags & RF_SPIDER)) && (p_ptr->mimic_form != resolve_mimic_name("Spider")))) return (FALSE); @@ -3232,7 +3233,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Discover invisible traps */ else if ((c_ptr->t_idx != 0) && - !(f_info[cave[y][x].feat].flags1 & FF1_DOOR)) + !(f_info[cave[y][x].feat].flags & FF_DOOR)) { /* Disturb */ disturb(0); @@ -3318,7 +3319,7 @@ static int see_obstacle_grid(cave_type *c_ptr) /* "Safe" floor grids aren't obstacles */ - if (f_info[c_ptr->feat].flags1 & FF1_CAN_RUN) return (FALSE); + if (f_info[c_ptr->feat].flags & FF_CAN_RUN) return (FALSE); /* Must be known to the player */ if (!(c_ptr->info & (CAVE_MARK))) return (FALSE); @@ -3771,7 +3772,7 @@ static bool_ run_test(void) } /* Check the "don't notice running" flag */ - if (f_info[c_ptr->feat].flags1 & FF1_DONT_NOTICE_RUNNING) + if (f_info[c_ptr->feat].flags & FF_DONT_NOTICE_RUNNING) { notice = FALSE; } diff --git a/src/cmd2.cc b/src/cmd2.cc index c57518bb..f4e85847 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -14,6 +14,7 @@ #include "cmd1.hpp" #include "dungeon_info_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -1410,7 +1411,7 @@ static bool_ do_cmd_tunnel_test(int y, int x) } /* Must be tunnelable */ - if (!(f_info[cave[y][x].feat].flags1 & FF1_TUNNELABLE)) + if (!(f_info[cave[y][x].feat].flags & FF_TUNNELABLE)) { /* Message */ msg_print(f_info[cave[y][x].feat].tunnel); @@ -1502,7 +1503,7 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) sound(SOUND_DIG); /* Titanium */ - if (f_ptr->flags1 & FF1_PERMANENT) + if (f_ptr->flags & FF_PERMANENT) { msg_print(f_ptr->tunnel); } @@ -1976,7 +1977,7 @@ static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) c_ptr->t_idx = 0; /* Move the player onto the trap */ - if (!(f_info[c_ptr->feat].flags1 & FF1_DOOR)) + if (!(f_info[c_ptr->feat].flags & FF_DOOR)) move_player_aux(dir, do_pickup, 0, TRUE); /* Remove trap attr from grid */ @@ -2004,7 +2005,7 @@ static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) msg_format("You set off the %s!", name); /* Move the player onto the trap */ - if (!(f_info[c_ptr->feat].flags1 & FF1_DOOR)) + if (!(f_info[c_ptr->feat].flags & FF_DOOR)) move_player_aux(dir, do_pickup, 0, FALSE); } @@ -2398,7 +2399,7 @@ void do_cmd_alter(void) } /* Tunnel through walls */ - else if (f_info[c_ptr->feat].flags1 & FF1_TUNNELABLE) + else if (f_info[c_ptr->feat].flags & FF_TUNNELABLE) { /* Tunnel */ more = do_cmd_tunnel_aux(y, x, dir); diff --git a/src/defines.h b/src/defines.h index 1d078609..7243eb9c 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2306,27 +2306,6 @@ #define ETR4_R_IMMUNITY 0x40000000L /* Item gives a random immunity */ #define ETR4_LIMIT_BLOWS 0x80000000L /* switch the "limit blows" feature */ -/*** Features flags -- DG ***/ -#define FF1_NO_WALK 0x00000001L -#define FF1_NO_VISION 0x00000002L -#define FF1_CAN_LEVITATE 0x00000004L -#define FF1_CAN_PASS 0x00000008L -#define FF1_FLOOR 0x00000010L -#define FF1_WALL 0x00000020L -#define FF1_PERMANENT 0x00000040L -#define FF1_CAN_FLY 0x00000080L -#define FF1_REMEMBER 0x00000100L -#define FF1_NOTICE 0x00000200L -#define FF1_DONT_NOTICE_RUNNING 0x00000400L -#define FF1_CAN_RUN 0x00000800L -#define FF1_DOOR 0x00001000L -#define FF1_SUPPORT_LIGHT 0x00002000L -#define FF1_CAN_CLIMB 0x00004000L -#define FF1_TUNNELABLE 0x00008000L -#define FF1_WEB 0x00010000L -#define FF1_ATTR_MULTI 0x00020000L -#define FF1_SUPPORT_GROWTH 0x00040000L - /*** Town flags ***/ #define TOWN_REAL 0x01 /* Town is really present */ #define TOWN_KNOWN 0x02 /* Town is found by the player */ diff --git a/src/dungeon.cc b/src/dungeon.cc index d70ffcde..bbb60aa5 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -22,6 +22,7 @@ #include "corrupt.hpp" #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.h" #include "files.hpp" @@ -1489,11 +1490,11 @@ static void process_world(void) /* Do nothing */ } /* Player can climb over mountains */ - else if ((p_ptr->climb) && (f_info[feature].flags1 & FF1_CAN_CLIMB)) + else if ((p_ptr->climb) && (f_info[feature].flags & FF_CAN_CLIMB)) { /* Do nothing */ } - else if (race_flags1_p(PR1_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_CAN_PASS)) + else if (race_flags1_p(PR1_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_CAN_PASS)) { int amt = 1 + ((p_ptr->lev) / 5); @@ -4563,7 +4564,10 @@ static void process_player(void) } /* Skip normal features */ - if (!(f_ptr->flags1 & (FF1_ATTR_MULTI))) continue; + if (!(f_ptr->flags & FF_ATTR_MULTI)) + { + continue; + } /* Redraw a shimmering spot */ lite_spot(j, i); diff --git a/src/feature_flag.hpp b/src/feature_flag.hpp new file mode 100644 index 00000000..09aa5b43 --- /dev/null +++ b/src/feature_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "feature_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define FF(tier, index, name) \ + DECLARE_FLAG(feature_flag_set, BOOST_PP_CAT(FF_,name), tier, index) +#include "feature_flag_list.hpp" +#undef FF diff --git a/src/feature_flag_list.hpp b/src/feature_flag_list.hpp new file mode 100644 index 00000000..0a433c3a --- /dev/null +++ b/src/feature_flag_list.hpp @@ -0,0 +1,25 @@ +/** + * X-macro list of all the feature flags + */ + +/* FF(, , ) */ + +FF(1, 0, NO_WALK) +FF(1, 1, NO_VISION) +FF(1, 2, CAN_LEVITATE) +FF(1, 3, CAN_PASS) +FF(1, 4, FLOOR) +FF(1, 5, WALL) +FF(1, 6, PERMANENT) +FF(1, 7, CAN_FLY) +FF(1, 8, REMEMBER) +FF(1, 9, NOTICE) +FF(1, 10, DONT_NOTICE_RUNNING) +FF(1, 11, CAN_RUN) +FF(1, 12, DOOR) +FF(1, 13, SUPPORT_LIGHT) +FF(1, 14, CAN_CLIMB) +FF(1, 15, TUNNELABLE) +FF(1, 16, WEB) +FF(1, 17, ATTR_MULTI) +FF(1, 18, SUPPORT_GROWTH) diff --git a/src/feature_flag_set.hpp b/src/feature_flag_set.hpp new file mode 100644 index 00000000..abc4f47d --- /dev/null +++ b/src/feature_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t FF_MAX_TIERS = 1; + +typedef flag_set feature_flag_set; diff --git a/src/feature_type.hpp b/src/feature_type.hpp index 40a1f58b..e818f17a 100644 --- a/src/feature_type.hpp +++ b/src/feature_type.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include "feature_flag_set.hpp" + /** * Terrain feature descriptor. */ @@ -15,7 +17,7 @@ struct feature_type byte mimic = 0; /* Feature to mimic */ - u32b flags1 = 0; /* First set of flags */ + feature_flag_set flags; /* First set of flags */ byte d_attr = 0; /* Default feature attribute */ char d_char = '\0'; /* Default feature character */ diff --git a/src/gen_evol.cc b/src/gen_evol.cc index 6f3fbcba..889e7a01 100644 --- a/src/gen_evol.cc +++ b/src/gen_evol.cc @@ -10,6 +10,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "generate.hpp" #include "levels.hpp" @@ -34,8 +35,8 @@ void evolve_level(bool_ noise) { for (j = 1; j < cur_hgt - 1; j++) { - if (f_info[cave[j][i].feat].flags1 & FF1_WALL) cw++; - if (f_info[cave[j][i].feat].flags1 & FF1_FLOOR) cf++; + if (f_info[cave[j][i].feat].flags & FF_WALL) cw++; + if (f_info[cave[j][i].feat].flags & FF_FLOOR) cf++; } } @@ -49,7 +50,7 @@ void evolve_level(bool_ noise) c_ptr = &cave[j][i]; /* Permanent features should stay */ - if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) continue; + if (f_info[c_ptr->feat].flags & FF_PERMANENT) continue; /* Avoid evolving grids with object or monster */ if ((!c_ptr->o_idxs.empty()) || c_ptr->m_idx) continue; @@ -83,7 +84,7 @@ void evolve_level(bool_ noise) c_ptr = &cave[j][i]; /* Permanent features should stay */ - if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) continue; + if (f_info[c_ptr->feat].flags & FF_PERMANENT) continue; /* Avoid evolving grids with object or monster */ if ((!c_ptr->o_idxs.empty()) || c_ptr->m_idx) continue; @@ -101,7 +102,7 @@ void evolve_level(bool_ noise) for (y = j - 1; y <= j + 1; y++) { if ((x == i) && (y == j)) continue; - if (f_info[cave[y][x].feat].flags1 & FF1_WALL) c++; + if (f_info[cave[y][x].feat].flags & FF_WALL) c++; } } @@ -112,7 +113,7 @@ void evolve_level(bool_ noise) /* Starved or suffocated */ if ((c < 4) || (c >= 7)) { - if (f_info[c_ptr->feat].flags1 & FF1_WALL) + if (f_info[c_ptr->feat].flags & FF_WALL) { place_floor(j, i); } @@ -121,7 +122,7 @@ void evolve_level(bool_ noise) /* Spawned */ else if ((c == 4) || (c == 5)) { - if (!(f_info[c_ptr->feat].flags1 & FF1_WALL)) + if (!(f_info[c_ptr->feat].flags & FF_WALL)) { place_filler(j, i); } diff --git a/src/generate.cc b/src/generate.cc index d1bcbe31..3f74bc24 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -13,6 +13,7 @@ #include "cave_type.hpp" #include "dungeon_info_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_build_room1_in.hpp" #include "hooks.hpp" @@ -560,8 +561,8 @@ void place_new_way(int *y, int *x) if (c_ptr->info & (CAVE_ICKY)) continue; /* Reject permanent features */ - if ((f_info[c_ptr->feat].flags1 & (FF1_PERMANENT)) && - (f_info[c_ptr->feat].flags1 & (FF1_FLOOR))) continue; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT) && + (f_info[c_ptr->feat].flags & FF_FLOOR)) continue; /* Reject room walls */ if ((c_ptr->info & (CAVE_ROOM)) && @@ -780,10 +781,10 @@ static int next_to_walls(int y, int x) { int k = 0; - if (f_info[cave[y + 1][x].feat].flags1 & FF1_WALL) k++; - if (f_info[cave[y - 1][x].feat].flags1 & FF1_WALL) k++; - if (f_info[cave[y][x + 1].feat].flags1 & FF1_WALL) k++; - if (f_info[cave[y][x - 1].feat].flags1 & FF1_WALL) k++; + if (f_info[cave[y + 1][x].feat].flags & FF_WALL) k++; + if (f_info[cave[y - 1][x].feat].flags & FF_WALL) k++; + if (f_info[cave[y][x + 1].feat].flags & FF_WALL) k++; + if (f_info[cave[y][x - 1].feat].flags & FF_WALL) k++; return (k); } @@ -1534,13 +1535,13 @@ static void build_streamer2(int feat, int killwall) if (c_ptr->info & (CAVE_ICKY)) continue; /* Reject permanent features */ - if ((f_info[c_ptr->feat].flags1 & (FF1_PERMANENT)) && - (f_info[c_ptr->feat].flags1 & (FF1_FLOOR))) continue; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT) && + (f_info[c_ptr->feat].flags & FF_FLOOR)) continue; /* Avoid converting walls when told so */ if (killwall == 0) { - if (f_info[c_ptr->feat].flags1 & FF1_WALL) continue; + if (f_info[c_ptr->feat].flags & FF_WALL) continue; } /* Clear mimic feature to avoid nasty consequences */ @@ -1597,7 +1598,7 @@ static void build_streamer2(int feat, int killwall) continue; /* Only convert non-permanent features */ - if (f_info[cave[ty][tx].feat].flags1 & FF1_PERMANENT) continue; + if (f_info[cave[ty][tx].feat].flags & FF_PERMANENT) continue; /* Clear mimic feature to avoid nasty consequences */ cave[ty][tx].mimic = 0; @@ -1715,7 +1716,7 @@ static bool_ get_is_floor(int x, int y) if (!in_bounds(y, x)) return (FALSE); /* Do the real check: */ - if (f_info[cave[y][x].feat].flags1 & FF1_FLOOR) return (TRUE); + if (f_info[cave[y][x].feat].flags & FF_FLOOR) return (TRUE); return (FALSE); } @@ -4410,7 +4411,7 @@ bool_ generate_fracave(int y0, int x0, int xsize, int ysize, c_ptr = &cave[y + y0 - yhsize][x + x0 - xhsize]; /* A floor grid to be converted */ - if ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) && + if ((f_info[c_ptr->feat].flags & FF_FLOOR) && (c_ptr->info & CAVE_ICKY)) { @@ -6386,15 +6387,15 @@ static bool_ possible_doorway(int y, int x) if (next_to_corr(y, x) >= 2) { /* Check Vertical */ - if ((f_info[cave[y - 1][x].feat].flags1 & FF1_WALL) && - (f_info[cave[y + 1][x].feat].flags1 & FF1_WALL)) + if ((f_info[cave[y - 1][x].feat].flags & FF_WALL) && + (f_info[cave[y + 1][x].feat].flags & FF_WALL)) { return (TRUE); } /* Check Horizontal */ - if ((f_info[cave[y][x - 1].feat].flags1 & FF1_WALL) && - (f_info[cave[y][x + 1].feat].flags1 & FF1_WALL)) + if ((f_info[cave[y][x - 1].feat].flags & FF_WALL) && + (f_info[cave[y][x + 1].feat].flags & FF_WALL)) { return (TRUE); } @@ -6437,7 +6438,7 @@ static void try_doors(int y, int x) if (!in_bounds(yy, xx)) continue; /* Ignore walls */ - if (f_info[cave[yy][xx].feat].flags1 & (FF1_WALL)) continue; + if (f_info[cave[yy][xx].feat].flags & FF_WALL) continue; /* Ignore room grids */ if (cave[yy][xx].info & (CAVE_ROOM)) continue; diff --git a/src/init1.cc b/src/init1.cc index 0a6ecff0..ec12ad34 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -7,6 +7,7 @@ #include "dungeon_info_type.hpp" #include "dungeon_flag.hpp" #include "ego_item_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -193,45 +194,6 @@ static cptr ego_flags[] = "LIMIT_BLOWS" }; -/* - * Feature flags - */ -static cptr f_info_flags1[] = -{ - "NO_WALK", - "NO_VISION", - "CAN_LEVITATE", - "CAN_PASS", - "FLOOR", - "WALL", - "PERMANENT", - "CAN_FLY", - "REMEMBER", - "NOTICE", - "DONT_NOTICE_RUNNING", - "CAN_RUN", - "DOOR", - "SUPPORT_LIGHT", - "CAN_CLIMB", - "TUNNELABLE", - "WEB", - "ATTR_MULTI", - "SUPPORT_GROWTH", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1" -}; - /* * Trap flags */ @@ -2540,12 +2502,16 @@ errr init_v_info_txt(FILE *fp) /* * Grab one flag in an feature_type from a textual string */ -static errr grab_one_feature_flag(u32b *f1, cptr what) +static int grab_one_feature_flag(cptr what, feature_flag_set *flags) { - if (lookup_flags(what, flag_tie(f1, f_info_flags1))) - { - return (0); - } +#define FF(tier, index, name) \ + if (streq(what, #name)) \ + { \ + *flags |= BOOST_PP_CAT(FF_,name); \ + return 0; \ + }; +#include "feature_flag_list.hpp" +#undef FF /* Oops */ msg_format("Unknown feature flag '%s'.", what); @@ -2783,7 +2749,7 @@ errr init_f_info_txt(FILE *fp) /* Hack -- Process 'F' for flags */ if (buf[0] == 'F') { - if (0 != grab_one_feature_flag(&f_ptr->flags1, buf + 2)) + if (0 != grab_one_feature_flag(buf + 2, &f_ptr->flags)) { return (5); } diff --git a/src/melee2.cc b/src/melee2.cc index f52c7061..a0f43492 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -17,6 +17,7 @@ #include "cave_type.hpp" #include "cmd1.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "hook_mon_speak_in.hpp" @@ -6136,35 +6137,35 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Permanent wall */ - else if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) + else if (f_info[c_ptr->feat].flags & FF_PERMANENT) { /* Nothing */ } /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_LEVITATE) && (r_ptr->flags & RF_CAN_FLY)) + else if ((f_info[c_ptr->feat].flags & FF_CAN_LEVITATE) && (r_ptr->flags & RF_CAN_FLY)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Some monsters can fly */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_FLY) && (r_ptr->flags & RF_CAN_FLY)) + else if ((f_info[c_ptr->feat].flags & FF_CAN_FLY) && (r_ptr->flags & RF_CAN_FLY)) { /* Pass through trees/... */ do_move = TRUE; } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) + else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Monster destroys walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_KILL_WALL)) + else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_KILL_WALL)) { /* Eat through walls/doors/rubble */ do_move = TRUE; @@ -6185,14 +6186,14 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Monster moves through walls (and doors) */ - else if ((f_info[c_ptr->feat].flags1 & FF1_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) + else if ((f_info[c_ptr->feat].flags & FF_CAN_PASS) && (r_ptr->flags & RF_PASS_WALL)) { /* Pass through walls/doors/rubble */ do_move = TRUE; } /* Monster moves through webs */ - else if ((f_info[c_ptr->feat].flags1 & FF1_WEB) && + else if ((f_info[c_ptr->feat].flags & FF_WEB) && (r_ptr->flags & RF_SPIDER)) { /* Pass through webs */ diff --git a/src/object2.cc b/src/object2.cc index ce0679cc..231a67df 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -16,6 +16,7 @@ #include "device_allocation.hpp" #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hooks.hpp" #include "mimic.hpp" @@ -5096,7 +5097,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) c_ptr = &cave[ty][tx]; /* Require floor space (or shallow terrain) -KMW- */ - if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) continue; + if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) continue; /* No traps */ if (c_ptr->t_idx) continue; diff --git a/src/powers.cc b/src/powers.cc index 45ca3e0c..b58eb164 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -14,6 +14,7 @@ #include "cmd2.hpp" #include "cmd7.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "hooks.hpp" @@ -722,7 +723,7 @@ static void power_activate(int power) msg_print("You bite into thin air!"); break; } - else if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT) || (c_ptr->feat == FEAT_MOUNTAIN)) + else if ((f_info[c_ptr->feat].flags & FF_PERMANENT) || (c_ptr->feat == FEAT_MOUNTAIN)) { msg_print("Ouch! This wall is harder than your teeth!"); break; diff --git a/src/q_dragons.cc b/src/q_dragons.cc index 45666e77..8dc990d2 100644 --- a/src/q_dragons.cc +++ b/src/q_dragons.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -53,13 +54,12 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) /* Place some columns */ for (i = 35; i > 0; ) { - int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; /* Bar columns on even squares so the whole level is guaranteed to be accessible */ - flags = f_info[cave[y][x].feat].flags1; - if (!(flags % 2) && !(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(x % 2) && !(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { --i; cave_set_feat(y, x, FEAT_MOUNTAIN); @@ -69,11 +69,10 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) /* Place some random dragons */ for (i = 25; i > 0; ) { - int m_idx, flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { /* blue, white, red, black, bronze, gold, green, multi-hued */ int baby_dragons[8] = {163, 164, 167, 166, 218, 219, 165, 204}; @@ -95,7 +94,7 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) dragon = mature_dragons[color]; --i; - m_idx = place_monster_one(y, x, dragon, 0, magik(33), MSTATUS_ENEMY); + int m_idx = place_monster_one(y, x, dragon, 0, magik(33), MSTATUS_ENEMY); if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; } } diff --git a/src/q_evil.cc b/src/q_evil.cc index 5e93bdf1..d27e8986 100644 --- a/src/q_evil.cc +++ b/src/q_evil.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -53,13 +54,12 @@ static bool_ quest_evil_gen_hook(void *, void *, void *) /* Place some random balrogs */ for (i = 6; i > 0; ) { - int m_idx, flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { - m_idx = place_monster_one(y, x, 996, 0, FALSE, MSTATUS_ENEMY); + int m_idx = place_monster_one(y, x, 996, 0, FALSE, MSTATUS_ENEMY); if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; --i; } diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 777ce690..fe635971 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -2,6 +2,7 @@ #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_get_in.hpp" #include "hooks.hpp" @@ -531,8 +532,8 @@ static bool_ fireproof_gen_hook(void *, void *, void *) cave_type *c_ptr = &cave[trap_y][trap_x]; /* are the coordinates on a stair, or a wall? */ - if (((f_info[c_ptr->feat].flags1 & FF1_PERMANENT) != 0) || - ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) == 0)) + if (bool(f_info[c_ptr->feat].flags & FF_PERMANENT) || + (f_info[c_ptr->feat].flags & FF_FLOOR).empty()) { /* try again */ tries = 0; diff --git a/src/q_god.cc b/src/q_god.cc index 4634b46b..24dfa6a7 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -3,6 +3,7 @@ #include "cave_type.hpp" #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_chardump_in.hpp" #include "hook_get_in.hpp" @@ -376,8 +377,8 @@ static void quest_god_generate_relic() c_ptr = &cave[y][x]; /* are the coordinates on a floor, not on a permanent feature (eg stairs), and not on a trap ? */ - if ((f_info[c_ptr->feat].flags1 & FF1_FLOOR) && - (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) && + if ((f_info[c_ptr->feat].flags & FF_FLOOR) && + (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) && (c_ptr->t_idx == 0)) { break; diff --git a/src/q_haunted.cc b/src/q_haunted.cc index 5295945d..b72eb1ca 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -54,11 +55,10 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) /* Place some ghosts */ for (i = 12; i > 0; ) { - int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { m_idx = place_monster_one(y, x, 477, 0, FALSE, MSTATUS_ENEMY); if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; @@ -69,11 +69,10 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) /* Place some random monsters to haunt us */ for (i = damroll(4, 4); i > 0; ) { - int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { int monsters[22] = { 65, 100, 124, 125, 133, 231, 273, 327, 365, 416, 418, 507, 508, 533, 534, 553, 554, 555, 577, 607, 622, 665}; @@ -87,11 +86,10 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) /* Place some random traps */ for (i = 10 + damroll(4, 4); i > 0; ) { - int flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { --i; place_trap(y, x); diff --git a/src/q_wolves.cc b/src/q_wolves.cc index 96869fc9..46a66935 100644 --- a/src/q_wolves.cc +++ b/src/q_wolves.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -54,13 +55,12 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) /* Place some random wolves */ for (i = damroll(4, 4); i > 0; ) { - int m_idx, flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { - m_idx = place_monster_one(y, x, 196, 0, magik(50), MSTATUS_ENEMY); + int m_idx = place_monster_one(y, x, 196, 0, magik(50), MSTATUS_ENEMY); if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; --i; } @@ -69,13 +69,12 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) /* Place some random wargs */ for (i = damroll(4, 4); i > 0; ) { - int m_idx, flags; y = rand_int(21) + 3; x = rand_int(31) + 3; - flags = f_info[cave[y][x].feat].flags1; - if (!(flags & FF1_PERMANENT) && (flags & FF1_FLOOR)) + auto const flags = f_info[cave[y][x].feat].flags; + if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) { - m_idx = place_monster_one(y, x, 257, 0, magik(50), MSTATUS_ENEMY); + int m_idx = place_monster_one(y, x, 257, 0, magik(50), MSTATUS_ENEMY); if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; --i; } diff --git a/src/spells1.cc b/src/spells1.cc index bd5f7c99..bb4febf0 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -16,6 +16,7 @@ #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "gods.hpp" #include "melee2.hpp" @@ -2987,12 +2988,12 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) * the conditional... -- pelpel */ if (!cave_plain_floor_bold(y, x) || - (f_info[cave[y][x].feat].flags1 & FF1_PERMANENT)) break; + (f_info[cave[y][x].feat].flags & FF_PERMANENT)) break; /* Destination shouldn't be "interesting" either */ while (tries && (!cave_plain_floor_bold(y2, x2) || - (f_info[cave[y2][x2].feat].flags1 & FF1_PERMANENT))) + (f_info[cave[y2][x2].feat].flags & FF_PERMANENT))) { y2 = y1 = randint(cur_hgt) - 1; x2 = x1 = randint(cur_wid) - 1; @@ -3033,7 +3034,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) case GF_HELL_FIRE: { /* "Permanent" features will stay */ - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Trees *will* burn */ if (c_ptr->feat == FEAT_TREES) @@ -3072,7 +3073,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) } /* Floors can become ash or lava (chance == 25%) */ - else if (f_info[c_ptr->feat].flags1 & FF1_FLOOR) + else if (f_info[c_ptr->feat].flags & FF_FLOOR) { int k = rand_int(100); @@ -3119,7 +3120,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) int k; /* "Permanent" features will stay */ - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Needs more than 30 damage */ if (dam < 30) break; @@ -3188,7 +3189,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) case GF_NUKE: { /* "Permanent" features will stay */ - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; if ((c_ptr->feat == FEAT_TREES) || (c_ptr->feat == FEAT_SMALL_TREES)) @@ -3208,11 +3209,11 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) case GF_DISINTEGRATE: { /* "Permanent" features will stay */ - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; if (((c_ptr->feat == FEAT_TREES) || (c_ptr->feat == FEAT_SMALL_TREES) || - (f_info[c_ptr->feat].flags1 & FF1_FLOOR)) && + (f_info[c_ptr->feat].flags & FF_FLOOR)) && (rand_int(100) < 30)) { /* Flow change */ @@ -3258,7 +3259,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) c_ptr->special = c_ptr->special2 = 0; /* Remove the feature */ - if (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) + if (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) place_floor_convert_glass(y, x); } @@ -3328,7 +3329,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) c_ptr->special = c_ptr->special2 = 0; /* Remove the feature */ - if (!(f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) + if (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) place_floor_convert_glass(y, x); /* Hack -- Force redraw */ @@ -3369,7 +3370,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) if (cave_floor_bold(y, x)) break; /* "Permanent" features will stay */ - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Granite -- How about other wall types? */ if ((c_ptr->feat >= FEAT_WALL_EXTRA) && @@ -3497,7 +3498,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) /* Require a "naked" floor grid */ if (!cave_clean_bold(y, x)) break; - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Create a closed door */ cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00); @@ -3529,7 +3530,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) /* Require a "naked" floor grid */ if (!cave_clean_bold(y, x)) break; - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; cave_set_feat(y, x, FEAT_GLYPH); @@ -3545,8 +3546,8 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) /* Require a "naked" floor grid */ if (!cave_clean_bold(y, x)) break; - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; - if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; + if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) break; /* Place a wall */ cave_set_feat(y, x, FEAT_WALL_EXTRA); @@ -3589,7 +3590,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) case GF_LAVA_FLOW: { - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Shallow Lava */ if (dam == 1) @@ -3703,7 +3704,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) /* Delete the monster (if any) */ delete_monster(y, x); - if ((f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) break; + if ((f_info[c_ptr->feat].flags & FF_PERMANENT)) break; /* Destroy "valid" grids */ if (cave_valid_bold(y, x)) diff --git a/src/spells2.cc b/src/spells2.cc index 60aafc16..7b7c3b7b 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -14,6 +14,7 @@ #include "cmd7.hpp" #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "hook_identify_in.hpp" @@ -104,7 +105,7 @@ void grow_trees(int rad) if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue; if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue; - if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_SUPPORT_GROWTH)) + if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_SUPPORT_GROWTH)) { cave_set_feat(p_ptr->py + j, p_ptr->px + i, FEAT_TREES); } @@ -126,7 +127,7 @@ void grow_grass(int rad) if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue; if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue; - if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_SUPPORT_GROWTH)) + if (cave_clean_bold(p_ptr->py + j, p_ptr->px + i) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_SUPPORT_GROWTH)) { cave_set_feat(p_ptr->py + j, p_ptr->px + i, FEAT_GRASS); } @@ -5471,11 +5472,11 @@ bool_ wall_stone(int y, int x) { cave_type *c_ptr = &cave[y][x]; int flg = PROJECT_GRID | PROJECT_ITEM; - int featflags = f_info[c_ptr->feat].flags1; + auto const featflags = f_info[c_ptr->feat].flags; bool_ dummy = (project(0, 1, y, x, 0, GF_STONE_WALL, flg)); - if (!(featflags & FF1_PERMANENT) && !(featflags & FF1_WALL)) + if (!(featflags & FF_PERMANENT) && !(featflags & FF_WALL)) cave_set_feat(y, x, FEAT_FLOOR); /* Update stuff */ @@ -6023,7 +6024,7 @@ bool_ passwall(int dir, bool_ safe) c_ptr = &cave[y][x]; /* Perm walls stops the transfer */ - if ((!in_bounds(y, x)) && (f_info[c_ptr->feat].flags1 & FF1_PERMANENT)) + if ((!in_bounds(y, x)) && (f_info[c_ptr->feat].flags & FF_PERMANENT)) { /* get the last working position */ x -= ddx[dir]; @@ -6043,7 +6044,7 @@ bool_ passwall(int dir, bool_ safe) ly = y; /* Pass over walls */ - if (f_info[c_ptr->feat].flags1 & FF1_WALL) continue; + if (f_info[c_ptr->feat].flags & FF_WALL) continue; /* So it must be ok */ ok = TRUE; @@ -6340,12 +6341,12 @@ void create_between_gate(int dist, int y, int x) ij = y; ii = x; } - if (!(f_info[cave[p_ptr->py][p_ptr->px].feat].flags1 & FF1_PERMANENT)) + if (!(f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_PERMANENT)) { cave_set_feat(p_ptr->py, p_ptr->px, FEAT_BETWEEN); cave[p_ptr->py][p_ptr->px].special = ii + (ij << 8); } - if (!(f_info[cave[ij][ii].feat].flags1 & FF1_PERMANENT)) + if (!(f_info[cave[ij][ii].feat].flags & FF_PERMANENT)) { cave_set_feat(ij, ii, FEAT_BETWEEN); cave[ij][ii].special = p_ptr->px + (p_ptr->py << 8); @@ -6427,7 +6428,7 @@ void geomancy_random_wall(int y, int x) }; /* Do not destroy permanent things */ - if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) { + if (f_info[c_ptr->feat].flags & FF_PERMANENT) { return; } @@ -6461,10 +6462,10 @@ void geomancy_random_floor(int y, int x, bool_ kill_wall) }; /* Do not destroy permanent things */ - if (f_info[c_ptr->feat].flags1 & FF1_PERMANENT) { + if (f_info[c_ptr->feat].flags & FF_PERMANENT) { return; } - if (!(kill_wall || (f_info[c_ptr->feat].flags1 & FF1_FLOOR))) { + if (!(kill_wall || (f_info[c_ptr->feat].flags & FF_FLOOR))) { return; } diff --git a/src/spells3.cc b/src/spells3.cc index b5a767c5..fad11049 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "cmd5.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "lua_bind.hpp" #include "mimic.hpp" @@ -2738,8 +2739,8 @@ casting_result tempo_magelock() c_ptr = &cave[y][x]; - if ((!(f_info[c_ptr->feat].flags1 | FF1_FLOOR)) || - (f_info[c_ptr->feat].flags1 | FF1_PERMANENT) || + if ((!(f_info[c_ptr->feat].flags | FF_FLOOR)) || + (f_info[c_ptr->feat].flags | FF_PERMANENT) || (!los(p_ptr->py, p_ptr->px, y, x))) { msg_print("You cannot place it there."); diff --git a/src/traps.cc b/src/traps.cc index 2f8578d4..5ba66cbd 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -16,6 +16,7 @@ #include "cmd2.hpp" #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -125,7 +126,7 @@ static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x) c_ptr = &cave[y1][x1]; /* Require floor space (or shallow terrain) -KMW- */ - if (!(f_info[c_ptr->feat].flags1 & FF1_FLOOR)) continue; + if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) continue; o_idx = drop_near(i_ptr, 0, y1, x1); } @@ -348,7 +349,7 @@ static bool_ player_handle_trap_of_walls(void) /* Destroy location (if valid) */ if ((cx < cur_wid) && (cy < cur_hgt) && cave_valid_bold(cy, cx)) { - bool_ floor = (f_info[cave[cy][cx].feat].flags1 & FF1_FLOOR); + bool floor = bool(f_info[cave[cy][cx].feat].flags & FF_FLOOR); /* Delete any object that is still there */ delete_object(cy, cx); @@ -1904,7 +1905,7 @@ void player_activate_door_trap(s16b y, s16b x) /* Return if trap or door not found */ if ((c_ptr->t_idx == 0) || - !(f_info[c_ptr->feat].flags1 & FF1_DOOR)) return; + !(f_info[c_ptr->feat].flags & FF_DOOR)) return; /* Disturb */ disturb(0); @@ -1952,10 +1953,10 @@ void place_trap(int y, int x) /* Traps only appears on empty floor */ if (!cave_floor_grid(c_ptr) && - !(f_info[c_ptr->feat].flags1 & (FF1_DOOR))) return; + !(f_info[c_ptr->feat].flags & FF_DOOR)) return; /* Set flags */ - if (f_info[c_ptr->feat].flags1 & FF1_DOOR) flags = FTRAP_DOOR; + if (f_info[c_ptr->feat].flags & FF_DOOR) flags = FTRAP_DOOR; else flags = FTRAP_FLOOR; /* Try 100 times */ @@ -2054,7 +2055,7 @@ void wiz_place_trap(int y, int x, int idx) cave_type *c_ptr = &cave[y][x]; /* Dangerous enough as it is... */ - if (!cave_floor_grid(c_ptr) && (!(f_info[c_ptr->feat].flags1 & FF1_DOOR))) return; + if (!cave_floor_grid(c_ptr) && (!(f_info[c_ptr->feat].flags & FF_DOOR))) return; c_ptr->t_idx = idx; } diff --git a/src/wild.cc b/src/wild.cc index 7724176f..7e7b20d0 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -10,6 +10,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "hook_wild_gen_in.hpp" #include "hooks.hpp" @@ -522,7 +523,7 @@ void wilderness_gen() else { /* Darken "boring" features */ - if (!(f_info[c_ptr->feat].flags1 & FF1_REMEMBER)) + if (!(f_info[c_ptr->feat].flags & FF_REMEMBER)) { /* Forget the grid */ c_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); @@ -915,7 +916,7 @@ static void set_border(int y, int x) /* Was a floor */ if (cave_floor_bold(y, x) || - (f_info[cave[y][x].feat].flags1 & FF1_DOOR)) + (f_info[cave[y][x].feat].flags & FF_DOOR)) { cave_set_feat(y, x, FEAT_DOOR_HEAD); } diff --git a/src/xtra2.cc b/src/xtra2.cc index 4f1536db..3665ee5b 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -14,6 +14,7 @@ #include "corrupt.hpp" #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" +#include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" #include "gods.hpp" @@ -2975,7 +2976,7 @@ void monster_death(int m_idx) { for (int j = -1; j <= 1; j++) { - if (!(f_info[cave[y + j][x + i].feat].flags1 & FF1_PERMANENT)) + if (!(f_info[cave[y + j][x + i].feat].flags & FF_PERMANENT)) { cave_set_feat(y + j, x + i, d_info[dungeon_type].floor1); } @@ -3849,7 +3850,7 @@ static bool_ target_set_accept(int y, int x) (c_ptr->feat <= FEAT_DOOR_TAIL)) return (FALSE); /* Accept 'naturally' interesting features */ - if (f_info[c_ptr->feat].flags1 & FF1_NOTICE) return (TRUE); + if (f_info[c_ptr->feat].flags & FF_NOTICE) return (TRUE); } /* Nope */ -- cgit v1.2.3 From 3941b7834f0a038ed544e6ee96b9920d43db4c32 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 07:42:43 +0200 Subject: Rework PR{1,2}_* flags to flag_set<> Since there's no need for two tiers we also reduce the flag set to 1 tier. (Breaks savefile compatbility.) --- src/birth.cc | 31 ++++++------ src/bldg.cc | 3 +- src/cmd1.cc | 3 +- src/cmd2.cc | 3 +- src/cmd6.cc | 7 +-- src/corrupt.cc | 13 +++--- src/defines.h | 38 --------------- src/dungeon.cc | 13 +++--- src/files.cc | 3 +- src/init1.cc | 106 +++++++----------------------------------- src/loadsave.cc | 3 +- src/monster2.cc | 3 +- src/player_class.hpp | 4 +- src/player_race.hpp | 4 +- src/player_race_flag.hpp | 12 +++++ src/player_race_flag_list.hpp | 26 +++++++++++ src/player_race_flag_set.hpp | 7 +++ src/player_race_mod.hpp | 4 +- src/player_spec.hpp | 4 +- src/spells2.cc | 3 +- src/xtra1.cc | 20 ++++---- src/xtra1.hpp | 4 +- src/xtra2.cc | 9 ++-- 23 files changed, 132 insertions(+), 191 deletions(-) create mode 100644 src/player_race_flag.hpp create mode 100644 src/player_race_flag_list.hpp create mode 100644 src/player_race_flag_set.hpp diff --git a/src/birth.cc b/src/birth.cc index 6ce86c5a..bd59161f 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -35,6 +35,7 @@ #include "options.hpp" #include "player_class.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" #include "q_rand.hpp" @@ -1204,7 +1205,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions) std::string desc; desc += cp_ptr->desc; - if (cp_ptr->flags1 & PR1_EXPERIMENTAL) + if (cp_ptr->flags & PR_EXPERIMENTAL) { desc += "\nEXPERIMENTAL"; } @@ -1212,7 +1213,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions) print_desc(desc.c_str()); if (!(restrictions[classes[n] / 32] & BIT(classes[n])) || - cp_ptr->flags1 & PR1_EXPERIMENTAL) + (cp_ptr->flags & PR_EXPERIMENTAL)) c_put_str(TERM_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); else c_put_str(TERM_L_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); @@ -1220,7 +1221,7 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions) else { if (!(restrictions[classes[n] / 32] & BIT(classes[n])) || - cp_ptr->flags1 & PR1_EXPERIMENTAL) + (cp_ptr->flags & PR_EXPERIMENTAL)) c_put_str(TERM_SLATE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); else put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4)); @@ -1266,21 +1267,21 @@ int dump_specs(int sel) std::string desc; desc += spp_ptr->desc; - if (spp_ptr->flags1 & PR1_EXPERIMENTAL) + if (spp_ptr->flags & PR_EXPERIMENTAL) { desc += "\nEXPERIMENTAL"; } print_desc(desc.c_str()); - if (spp_ptr->flags1 & PR1_EXPERIMENTAL) + if (spp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); else c_put_str(TERM_L_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); } else { - if (spp_ptr->flags1 & PR1_EXPERIMENTAL) + if (spp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_SLATE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); else put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4)); @@ -1322,21 +1323,21 @@ int dump_races(int sel) std::string desc; desc += rp_ptr->desc; - if (rp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rp_ptr->flags & PR_EXPERIMENTAL) { desc += "\nEXPERIMENTAL"; } print_desc(desc.c_str()); - if (rp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); else c_put_str(TERM_L_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); } else { - if (rp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_SLATE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); else put_str(buf, 18 + (n / 5), 1 + 15 * (n % 5)); @@ -1383,21 +1384,21 @@ int dump_rmods(int sel, int *racem, int max) std::string desc; desc += rmp_ptr->desc; - if (rmp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rmp_ptr->flags & PR_EXPERIMENTAL) { desc += "\nEXPERIMENTAL"; } print_desc(desc.c_str()); - if (rmp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rmp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); else c_put_str(TERM_L_BLUE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); } else { - if (rmp_ptr->flags1 & PR1_EXPERIMENTAL) + if (rmp_ptr->flags & PR_EXPERIMENTAL) c_put_str(TERM_SLATE, buf, 18 + (n / 5), 1 + 15 * (n % 5)); else put_str(buf, 18 + (n / 5), 1 + 15 * (n % 5)); @@ -1998,7 +1999,7 @@ static bool_ player_birth_aux_ask() p_ptr->pgod = k; set_grace(previous_char.grace); } - else if (race_flags1_p(PR1_NO_GOD)) + else if (race_flags_p(PR_NO_GOD)) { p_ptr->pgod = GOD_NONE; } @@ -2105,7 +2106,7 @@ static bool_ player_birth_aux_ask() } /* A god that like us ? more grace ! */ - if (race_flags1_p(PR1_GOD_FRIEND)) + if (race_flags_p(PR_GOD_FRIEND)) { set_grace(200); } @@ -2135,7 +2136,7 @@ static bool_ player_birth_aux_ask() /* Set birth options: maximize, preserve, sepcial levels and astral */ p_ptr->preserve = preserve; p_ptr->special = special_lvls; - p_ptr->astral = (race_flags2_p(PR2_ASTRAL)) ? TRUE : FALSE; + p_ptr->astral = (race_flags_p(PR_ASTRAL)) ? TRUE : FALSE; /* * A note by pelpel. (remove this please) diff --git a/src/bldg.cc b/src/bldg.cc index 4f1747db..34a4576c 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -25,6 +25,7 @@ #include "object2.hpp" #include "object_flag.hpp" #include "owner_type.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "q_library.hpp" #include "q_fireprof.hpp" @@ -542,7 +543,7 @@ static bool_ inn_comm(int cmd) /* Extract race info */ - vampire = ((race_flags1_p(PR1_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))); + vampire = ((race_flags_p(PR_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))); switch (cmd) { diff --git a/src/cmd1.cc b/src/cmd1.cc index 55b1954e..ab3f29d9 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -33,6 +33,7 @@ #include "object1.hpp" #include "object2.hpp" #include "options.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "quark.hpp" #include "skills.hpp" @@ -2560,7 +2561,7 @@ bool_ player_can_enter(byte feature) /* Player can not walk through "walls" unless in Shadow Form */ - if (p_ptr->wraith_form || (race_flags1_p(PR1_SEMI_WRAITH))) + if (p_ptr->wraith_form || (race_flags_p(PR_SEMI_WRAITH))) pass_wall = TRUE; else pass_wall = FALSE; diff --git a/src/cmd2.cc b/src/cmd2.cc index f4e85847..059170d4 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -35,6 +35,7 @@ #include "object_flag.hpp" #include "object_kind.hpp" #include "options.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "skills.hpp" #include "spells1.hpp" @@ -4886,7 +4887,7 @@ void do_cmd_steal() m_ptr->hold_o_idxs.erase(m_ptr->hold_o_idxs.begin() + k); /* Rogues gain some xp */ - if (race_flags1_p(PR1_EASE_STEAL)) + if (race_flags_p(PR_EASE_STEAL)) { s32b max_point; diff --git a/src/cmd6.cc b/src/cmd6.cc index 0c0fb63d..661a950c 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -34,6 +34,7 @@ #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "randart.hpp" #include "skills.hpp" @@ -1495,7 +1496,7 @@ void do_cmd_eat_food(void) /* Food can feed the player, in a different ways */ /* Vampires */ - if ((race_flags1_p(PR1_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))) + if ((race_flags_p(PR_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))) { /* Reduced nutritional benefit */ /* (void)set_food(p_ptr->food + (fval / 10)); -- No more */ @@ -1508,9 +1509,9 @@ void do_cmd_eat_food(void) } } - else if (race_flags1_p(PR1_NO_FOOD)) + else if (race_flags_p(PR_NO_FOOD)) { - if (race_flags1_p(PR1_UNDEAD)) + if (race_flags_p(PR_UNDEAD)) { msg_print("The food of mortals is poor sustenance for you."); } diff --git a/src/corrupt.cc b/src/corrupt.cc index 8d5670c6..64569264 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -3,6 +3,7 @@ #include "init1.hpp" #include "object_flag.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" #include "stats.hpp" @@ -60,10 +61,10 @@ static void player_gain_vampire_teeth() rmp_ptr = &race_mod_info[SUBRACE_SAVE]; subrace_add_power(rmp_ptr, PWR_VAMPIRISM); - rmp_ptr->flags1 = rmp_ptr->flags1 - | PR1_VAMPIRE - | PR1_UNDEAD - | PR1_NO_SUBRACE_CHANGE; + rmp_ptr->flags = rmp_ptr->flags + | PR_VAMPIRE + | PR_UNDEAD + | PR_NO_SUBRACE_CHANGE; } static void player_gain_vampire_strength() @@ -105,7 +106,7 @@ static void player_gain_vampire() } /* Bonus/and .. not bonus :) */ - rmp_ptr->flags1 = rmp_ptr->flags1 | PR1_HURT_LITE; + rmp_ptr->flags = rmp_ptr->flags | PR_HURT_LITE; rmp_ptr->oflags[2] = rmp_ptr->oflags[2] | TR_RES_POIS | TR_RES_NETHER @@ -766,7 +767,7 @@ static bool_ player_allow_corruption(int corruption_idx) /* Vampire teeth is special */ if (corruption_idx == CORRUPT_VAMPIRE_TEETH) { - if (race_flags1_p(PR1_NO_SUBRACE_CHANGE)) + if (race_flags_p(PR_NO_SUBRACE_CHANGE)) { return TRUE; } diff --git a/src/defines.h b/src/defines.h index 7243eb9c..d69247ce 100644 --- a/src/defines.h +++ b/src/defines.h @@ -383,44 +383,6 @@ #define MAX_STACK_SIZE 100 -/* Race flags */ -#define PR1_EXPERIMENTAL 0x00000001L /* Is still under developemnt */ -/* XXX */ -#define PR1_RESIST_BLACK_BREATH 0x00000004L /* Resist black breath */ -#define PR1_NO_STUN 0x00000008L /* Never stunned */ -#define PR1_XTRA_MIGHT_BOW 0x00000010L /* Xtra might with bows */ -#define PR1_XTRA_MIGHT_XBOW 0x00000020L /* Xtra might with xbows */ -#define PR1_XTRA_MIGHT_SLING 0x00000040L /* Xtra might with slings */ -#define PR1_AC_LEVEL 0x00000080L /* More AC with levels */ -#define PR1_HURT_LITE 0x00000100L /* Hurt by light */ -#define PR1_VAMPIRE 0x00000200L /* Vampire */ -#define PR1_UNDEAD 0x00000400L /* Undead */ -#define PR1_NO_CUT 0x00000800L /* no cuts */ -#define PR1_CORRUPT 0x00001000L /* hack-- corrupted */ -#define PR1_NO_FOOD 0x00002000L /* little gain from food */ -#define PR1_NO_GOD 0x00004000L /* cannot worship */ -/* XXX */ -#define PR1_ELF 0x00010000L /* Is an elf */ -#define PR1_SEMI_WRAITH 0x00020000L /* Takes damage when going in walls */ -#define PR1_NO_SUBRACE_CHANGE 0x00040000L /* Impossible to change subrace */ -/* XXX */ -#define PR1_ANTIMAGIC 0x00100000L /* antimagic ... hack */ -#define PR1_MOLD_FRIEND 0x00200000L /* Not attacked by molds wielded */ -#define PR1_GOD_FRIEND 0x00400000L /* Better grace */ -/* XXX */ -#define PR1_INNATE_SPELLS 0x01000000L /* KNown all spells, only need books */ -/* XXX */ -/* XXX */ -#define PR1_EASE_STEAL 0x08000000L /* Gain xp by stealing */ -/* XXX */ -/* XXX */ -/* XXX */ -/* XXX */ - -/* XXX */ -#define PR2_ASTRAL 0x00000002L /* Is it an astral being coming from th halls of mandos ? */ -/* XXX */ - /* XXX */ #define MKEY_MINDCRAFT 2 #define MKEY_ANTIMAGIC 3 diff --git a/src/dungeon.cc b/src/dungeon.cc index bbb60aa5..2e71278e 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -52,6 +52,7 @@ #include "object_type.hpp" #include "options.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_spec.hpp" #include "player_type.hpp" @@ -1494,7 +1495,7 @@ static void process_world(void) { /* Do nothing */ } - else if (race_flags1_p(PR1_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_CAN_PASS)) + else if (race_flags_p(PR_SEMI_WRAITH) && (!p_ptr->wraith_form) && (f_info[cave[p_ptr->py][p_ptr->px].feat].flags & FF_CAN_PASS)) { int amt = 1 + ((p_ptr->lev) / 5); @@ -1719,7 +1720,7 @@ static void process_world(void) dec++; } - if (race_flags1_p(PR1_ELF)) + if (race_flags_p(PR_ELF)) { dec -= wisdom_scale(2); } @@ -1738,7 +1739,7 @@ static void process_world(void) dec++; } - if (race_flags1_p(PR1_ELF)) + if (race_flags_p(PR_ELF)) { dec += 5 - wisdom_scale(4); } @@ -2663,7 +2664,7 @@ static void process_world(void) byte chance = 0; int plev = p_ptr->lev; - if (race_flags1_p(PR1_RESIST_BLACK_BREATH)) chance = 2; + if (race_flags_p(PR_RESIST_BLACK_BREATH)) chance = 2; else chance = 5; if ((rand_int(100) < chance) && (p_ptr->exp > 0)) @@ -3908,7 +3909,7 @@ static void process_command(void) if (p_ptr->control) break; if (p_ptr->wild_mode) break; - if (race_flags1_p(PR1_NO_GOD)) + if (race_flags_p(PR_NO_GOD)) { msg_print("You cannot worship gods."); } @@ -5223,7 +5224,7 @@ void play_game() /* Hack -- enter the world */ /* Mega-hack Vampires and Spectres start at midnight */ - if (race_flags1_p(PR1_UNDEAD)) + if (race_flags_p(PR_UNDEAD)) { turn = (10L * DAY / 2) + 1; } diff --git a/src/files.cc b/src/files.cc index 9ebc18ab..4cd95447 100644 --- a/src/files.cc +++ b/src/files.cc @@ -39,6 +39,7 @@ #include "options.hpp" #include "player_class.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_spec.hpp" #include "player_type.hpp" @@ -2698,7 +2699,7 @@ errr file_character(cptr name, bool_ full) if (noscore) fprintf(fff, "\n You have done something illegal."); - if (race_flags1_p(PR1_EXPERIMENTAL)) + if (race_flags_p(PR_EXPERIMENTAL)) fprintf(fff, "\n You have done something experimental."); { diff --git a/src/init1.cc b/src/init1.cc index ec12ad34..53e9d851 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -28,6 +28,7 @@ #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" #include "randart_gen_type.hpp" @@ -272,84 +273,6 @@ static cptr st_info_flags1[] = "XXX1" }; -/* - * Race flags - */ -static cptr rp_info_flags1[] = -{ - "EXPERIMENTAL", - "XXX", - "RESIST_BLACK_BREATH", - "NO_STUN", - "XTRA_MIGHT_BOW", - "XTRA_MIGHT_XBOW", - "XTRA_MIGHT_SLING", - "AC_LEVEL", - "HURT_LITE", - "VAMPIRE", - "UNDEAD", - "NO_CUT", - "CORRUPT", - "NO_FOOD", - "NO_GOD", - "XXX", - "ELF", - "SEMI_WRAITH", - "NO_SUBRACE_CHANGE", - "XXX", - "XXX", - "MOLD_FRIEND", - "GOD_FRIEND", - "XXX", - "INNATE_SPELLS", - "XXX", - "XXX", - "EASE_STEAL", - "XXX", - "XXX", - "XXX", - "XXX" -}; - -/* - * Race flags - */ -static cptr rp_info_flags2[] = -{ - "XXX", - "ASTRAL", - "XXX", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1" -}; - /* Skill flags */ static cptr s_info_flags1[] = { @@ -922,14 +845,16 @@ static errr grab_one_skill_flag(u32b *f1, cptr what) /* * Grab one flag from a textual string */ -static errr grab_one_player_race_flag(u32b *f1, u32b *f2, cptr what) +static errr grab_one_player_race_flag(player_race_flag_set *flags, cptr what) { - if (lookup_flags(what, - flag_tie(f1, rp_info_flags1), - flag_tie(f2, rp_info_flags2))) - { - return 0; - } +#define PR(tier, index, name) \ + if (streq(what, #name)) \ + { \ + *flags |= BOOST_PP_CAT(PR_,name); \ + return 0; \ + }; +#include "player_race_flag_list.hpp" +#undef PR /* Oops */ msg_format("(2)Unknown race flag '%s'.", what); @@ -1310,7 +1235,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'R') && (buf[2] == 'G')) { - if (0 != grab_one_player_race_flag(&rp_ptr->flags1, &rp_ptr->flags2, buf + 4)) + if (0 != grab_one_player_race_flag(&rp_ptr->flags, buf + 4)) { return (5); } @@ -1606,7 +1531,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'S') && (buf[2] == 'G')) { - if (0 != grab_one_player_race_flag(&rmp_ptr->flags1, &rmp_ptr->flags2, buf + 4)) + if (0 != grab_one_player_race_flag(&rmp_ptr->flags, buf + 4)) { return (5); } @@ -2046,7 +1971,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'G' for "Player flags" (multiple lines) */ if ((buf[0] == 'C') && (buf[2] == 'G')) { - if (0 != grab_one_player_race_flag(&c_ptr->flags1, &c_ptr->flags2, buf + 4)) + if (0 != grab_one_player_race_flag(&c_ptr->flags, buf + 4)) { return (5); } @@ -2244,7 +2169,10 @@ errr init_player_info_txt(FILE *fp) } /* Parse this entry */ - if (0 != grab_one_player_race_flag(&s_ptr->flags1, &s_ptr->flags2, s)) return (5); + if (0 != grab_one_player_race_flag(&s_ptr->flags, s)) + { + return (5); + } /* Start the next entry */ s = t; diff --git a/src/loadsave.cc b/src/loadsave.cc index 93f2679c..5c257518 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -353,8 +353,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < BODY_MAX; i++) do_byte((byte*)&sr_ptr->body_parts[i], flag); - do_u32b(&sr_ptr->flags1, flag); - do_u32b(&sr_ptr->flags2, flag); + do_flag_set(&sr_ptr->flags, flag); for (i = 0; i < PY_MAX_LEVEL + 1; i++) { diff --git a/src/monster2.cc b/src/monster2.cc index e5957770..7c05f9f6 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -31,6 +31,7 @@ #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "randart.hpp" #include "spells1.hpp" @@ -1470,7 +1471,7 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) } /* Undead characters are 50% likely to be unaffected */ - if ((race_flags1_p(PR1_UNDEAD)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))) + if ((race_flags_p(PR_UNDEAD)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))) { if (randint(100) < (25 + (p_ptr->lev))) return; } diff --git a/src/player_class.hpp b/src/player_class.hpp index 98414158..236a3007 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -4,6 +4,7 @@ #include "h-basic.h" #include "object_flag_set.hpp" #include "player_defs.hpp" +#include "player_race_flag_set.hpp" #include "player_spec.hpp" /** @@ -55,8 +56,7 @@ struct player_class byte max_spell_level = 0; /* Maximun spell level */ byte magic_max_spell = 0; /* Maximun numbner of spells one can learn by natural means */ - u32b flags1 = 0; - u32b flags2 = 0; + player_race_flag_set flags; s16b mana = 0; s16b blow_num = 0; diff --git a/src/player_race.hpp b/src/player_race.hpp index e01034ba..9af977aa 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -5,6 +5,7 @@ #include "object_flag_set.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" +#include "player_race_flag_set.hpp" #include "skills_defs.hpp" #include @@ -43,8 +44,7 @@ struct player_race s16b chart = 0; /* Chart history */ - u32b flags1 = 0; - u32b flags2 = 0; + player_race_flag_set flags; std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; diff --git a/src/player_race_flag.hpp b/src/player_race_flag.hpp new file mode 100644 index 00000000..1268c3c0 --- /dev/null +++ b/src/player_race_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "player_race_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define PR(tier, index, name) \ + DECLARE_FLAG(player_race_flag_set, BOOST_PP_CAT(PR_,name), tier, index) +#include "player_race_flag_list.hpp" +#undef PR diff --git a/src/player_race_flag_list.hpp b/src/player_race_flag_list.hpp new file mode 100644 index 00000000..5116ad87 --- /dev/null +++ b/src/player_race_flag_list.hpp @@ -0,0 +1,26 @@ +/** + * X-macro list of all the player race flags + */ + +/* PR(, , ) */ + +PR(1, 0, EXPERIMENTAL) /* Experimental */ +PR(1, 1, RESIST_BLACK_BREATH) /* Resists black breath */ +PR(1, 2, NO_STUN) /* Cannot be stunned */ +PR(1, 3, XTRA_MIGHT_BOW) /* Xtra might with bows */ +PR(1, 4, XTRA_MIGHT_XBOW) /* Xtra might with x-bows */ +PR(1, 5, XTRA_MIGHT_SLING) /* Xtra might with slings */ +PR(1, 6, AC_LEVEL) /* AC increases with levels */ +PR(1, 7, HURT_LITE) /* Hurt by light */ +PR(1, 8, VAMPIRE) /* Vampire */ +PR(1, 9, UNDEAD) /* Undead */ +PR(1, 10, NO_CUT) /* No cuts */ +PR(1, 11, CORRUPT) /* Corrupted; automatically gains corruptions */ +PR(1, 12, NO_FOOD) /* Little gain from food */ +PR(1, 13, NO_GOD) /* Cannot worship any gods */ +PR(1, 14, ELF) /* Is an elf */ +PR(1, 15, SEMI_WRAITH) /* Allows walking through walls; taking damage */ +PR(1, 16, NO_SUBRACE_CHANGE) /* Impossible to change subrace */ +PR(1, 17, GOD_FRIEND) /* Better grace */ +PR(1, 18, EASE_STEAL) /* Gain XP by stealing */ +PR(1, 19, ASTRAL) /* Astral being from the halls of Mandos */ diff --git a/src/player_race_flag_set.hpp b/src/player_race_flag_set.hpp new file mode 100644 index 00000000..4dd8dd9f --- /dev/null +++ b/src/player_race_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t PR_MAX_TIERS = 1; + +typedef flag_set player_race_flag_set; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 983c3471..756da347 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -5,6 +5,7 @@ #include "object_flag_set.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" +#include "player_race_flag_set.hpp" #include "skills_defs.hpp" #include @@ -44,8 +45,7 @@ struct player_race_mod char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - u32b flags1 = 0; - u32b flags2 = 0; + player_race_flag_set flags; std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 5105df31..5fcec7cd 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "player_race_ability_type.hpp" +#include "player_race_flag_set.hpp" #include "skills_defs.hpp" #include @@ -30,8 +31,7 @@ struct player_spec u32b gods = 0; - u32b flags1 = 0; - u32b flags2 = 0; + player_race_flag_set flags; std::array abilities; /* Abilities to be gained by level(doesnt take prereqs in account) */ }; diff --git a/src/spells2.cc b/src/spells2.cc index 7b7c3b7b..15df2f37 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -33,6 +33,7 @@ #include "object_kind.hpp" #include "object_type.hpp" #include "options.hpp" +#include "player_race_flag.hpp" #include "player_type.hpp" #include "skills.hpp" #include "spells1.hpp" @@ -4492,7 +4493,7 @@ void earthquake(int cy, int cx, int r) map[16 + p_ptr->py - cy][16 + p_ptr->px - cx] = FALSE; /* Semi-wraiths have to be hurt *some*, says DG */ - if (race_flags1_p(PR1_SEMI_WRAITH)) + if (race_flags_p(PR_SEMI_WRAITH)) damage /= 4; /* Take some damage */ diff --git a/src/xtra1.cc b/src/xtra1.cc index 1bf2b9a6..6fbbfdf0 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -36,6 +36,7 @@ #include "options.hpp" #include "player_class.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" #include "skill_type.hpp" @@ -3028,7 +3029,7 @@ void calc_bonuses(bool_ silent) apply_flags(rmp_ptr->oflags[i], rmp_ptr->opval[i], 0, 0, 0, 0); } - if (race_flags1_p(PR1_HURT_LITE)) + if (race_flags_p(PR_HURT_LITE)) p_ptr->sensible_lite = TRUE; } @@ -3146,7 +3147,7 @@ void calc_bonuses(bool_ silent) /* Hack -- aura of fire also provides light */ if (p_ptr->sh_fire) p_ptr->lite = TRUE; - if (race_flags1_p(PR1_AC_LEVEL)) + if (race_flags_p(PR_AC_LEVEL)) { p_ptr->to_a += 20 + (p_ptr->lev / 5); p_ptr->dis_to_a += 20 + (p_ptr->lev / 5); @@ -3617,13 +3618,13 @@ void calc_bonuses(bool_ silent) if (p_ptr->num_fire < 1) p_ptr->num_fire = 1; } - if (race_flags1_p(PR1_XTRA_MIGHT_BOW) && p_ptr->tval_ammo == TV_ARROW) + if (race_flags_p(PR_XTRA_MIGHT_BOW) && p_ptr->tval_ammo == TV_ARROW) p_ptr->xtra_might += 1; - if (race_flags1_p(PR1_XTRA_MIGHT_SLING) && p_ptr->tval_ammo == TV_SHOT) + if (race_flags_p(PR_XTRA_MIGHT_SLING) && p_ptr->tval_ammo == TV_SHOT) p_ptr->xtra_might += 1; - if (race_flags1_p(PR1_XTRA_MIGHT_XBOW) && p_ptr->tval_ammo == TV_BOLT) + if (race_flags_p(PR_XTRA_MIGHT_XBOW) && p_ptr->tval_ammo == TV_BOLT) p_ptr->xtra_might += 1; /* Examine the "current tool" */ @@ -4679,12 +4680,7 @@ int luck(int min, int max) return (luck + min); } -bool race_flags1_p(u32b flags1_mask) +bool race_flags_p(player_race_flag_set const &flags_mask) { - return (rp_ptr->flags1 | rmp_ptr->flags1 | cp_ptr->flags1 | spp_ptr->flags1) & flags1_mask; -} - -bool race_flags2_p(u32b flags2_mask) -{ - return (rp_ptr->flags2 | rmp_ptr->flags2 | cp_ptr->flags2 | spp_ptr->flags2) & flags2_mask; + return bool((rp_ptr->flags | rmp_ptr->flags | cp_ptr->flags | spp_ptr->flags) & flags_mask); } diff --git a/src/xtra1.hpp b/src/xtra1.hpp index 3e434828..0c1b93bf 100644 --- a/src/xtra1.hpp +++ b/src/xtra1.hpp @@ -2,6 +2,7 @@ #include "h-basic.h" #include "object_flag_set.hpp" +#include "player_race_flag_set.hpp" #include @@ -23,5 +24,4 @@ extern void calc_bonuses(bool_ silent); extern void gain_fate(byte fate); extern std::string fate_desc(int fate); extern std::string dump_fates(); -extern bool race_flags1_p(u32b flags1_mask); -extern bool race_flags2_p(u32b flags2_mask); +extern bool race_flags_p(player_race_flag_set const &flags_mask); diff --git a/src/xtra2.cc b/src/xtra2.cc index 3665ee5b..93a0603b 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -38,6 +38,7 @@ #include "options.hpp" #include "player_class.hpp" #include "player_race.hpp" +#include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" #include "point.hpp" @@ -1362,7 +1363,7 @@ bool_ set_stun(int v) /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; - if (race_flags1_p(PR1_NO_STUN)) v = 0; + if (race_flags_p(PR_NO_STUN)) v = 0; /* Knocked out */ if (p_ptr->stun > 100) @@ -1523,7 +1524,7 @@ bool_ set_cut(int v) /* Hack -- Force good values */ v = (v > 10000) ? 10000 : (v < 0) ? 0 : v; - if (race_flags1_p(PR1_NO_CUT)) v = 0; + if (race_flags_p(PR_NO_CUT)) v = 0; /* Mortal wound */ if (p_ptr->cut > 1000) @@ -1998,7 +1999,7 @@ void check_experience(void) if (p_ptr->lev > p_ptr->max_plv) { p_ptr->max_plv = p_ptr->lev; - if ((race_flags1_p(PR1_CORRUPT)) && + if ((race_flags_p(PR_CORRUPT)) && (randint(3) == 1)) { level_corruption = TRUE; @@ -2093,7 +2094,7 @@ void check_experience_obj(object_type *o_ptr) */ void gain_exp(s32b amount) { - if ((p_ptr->max_exp > 0) && (race_flags1_p(PR1_CORRUPT))) + if ((p_ptr->max_exp > 0) && (race_flags_p(PR_CORRUPT))) { if ((randint(p_ptr->max_exp) < amount) || (randint(12000000) < amount)) { -- cgit v1.2.3 From 6f02ef2e62739efc23d10ae2c7cea69a908b657b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 21 Jun 2016 11:02:48 +0200 Subject: Rework ETR4_* flags to flag_set<> --- src/defines.h | 34 ------------------------ src/ego_flag.hpp | 12 +++++++++ src/ego_flag_list.hpp | 38 +++++++++++++++++++++++++++ src/ego_flag_set.hpp | 7 +++++ src/ego_item_type.hpp | 3 ++- src/init1.cc | 62 +++++++++++++++---------------------------- src/object2.cc | 67 ++++++++++++++++++++++++----------------------- src/object2.hpp | 3 ++- src/randart_part_type.hpp | 3 ++- 9 files changed, 118 insertions(+), 111 deletions(-) create mode 100644 src/ego_flag.hpp create mode 100644 src/ego_flag_list.hpp create mode 100644 src/ego_flag_set.hpp diff --git a/src/defines.h b/src/defines.h index d69247ce..52ce7c3e 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2234,40 +2234,6 @@ #define NEW_GROUP_CHANCE 40 /* Chance to get a new group */ -/*** Ego flags ***/ -#define ETR4_SUSTAIN 0x00000001L /* Ego-Item gives a Random Sustain */ -#define ETR4_OLD_RESIST 0x00000002L /* The old "extra power" random high resist */ -#define ETR4_ABILITY 0x00000004L /* Ego-Item has a random Sustain */ -#define ETR4_R_ELEM 0x00000008L /* Item resists Acid/Fire/Cold/Elec or Poison */ -#define ETR4_R_LOW 0x00000010L /* Item has a random low resist */ -#define ETR4_R_HIGH 0x00000020L /* Item has a random high resist */ -#define ETR4_R_ANY 0x00000040L /* Item has one additional resist */ -#define ETR4_R_DRAGON 0x00000080L /* Item gets "Dragon" Resist */ -#define ETR4_SLAY_WEAP 0x00000100L /* Special 'Slaying' bonus */ -#define ETR4_DAM_DIE 0x00000200L /* Item has an additional dam die */ -#define ETR4_DAM_SIZE 0x00000400L /* Item has greater damage dice */ -#define ETR4_PVAL_M1 0x00000800L /* Item has +1 to pval */ -#define ETR4_PVAL_M2 0x00001000L /* Item has +(up to 2) to pval */ -#define ETR4_PVAL_M3 0x00002000L /* Item has +(up to 3) to pval */ -#define ETR4_PVAL_M5 0x00004000L /* Item has +(up to 5) to pval */ -#define ETR4_AC_M1 0x00008000L /* Item has +1 to AC */ -#define ETR4_AC_M2 0x00010000L /* Item has +(up to 2) to AC */ -#define ETR4_AC_M3 0x00020000L /* Item has +(up to 3) to AC */ -#define ETR4_AC_M5 0x00040000L /* Item has +(up to 5) to AC */ -#define ETR4_TH_M1 0x00080000L /* Item has +1 to hit */ -#define ETR4_TH_M2 0x00100000L /* Item has +(up to 2) to hit */ -#define ETR4_TH_M3 0x00200000L /* Item has +(up to 3) to hit */ -#define ETR4_TH_M5 0x00400000L /* Item has +(up to 5) to hit */ -#define ETR4_TD_M1 0x00800000L /* Item has +1 to dam */ -#define ETR4_TD_M2 0x01000000L /* Item has +(up to 2) to dam */ -#define ETR4_TD_M3 0x02000000L /* Item has +(up to 3) to dam */ -#define ETR4_TD_M5 0x04000000L /* Item has +(up to 5) to dam */ -#define ETR4_R_P_ABILITY 0x08000000L /* Item has a random pval-affected ability */ -#define ETR4_R_STAT 0x10000000L /* Item affects a random stat */ -#define ETR4_R_STAT_SUST 0x20000000L /* Item affects a random stat & sustains it */ -#define ETR4_R_IMMUNITY 0x40000000L /* Item gives a random immunity */ -#define ETR4_LIMIT_BLOWS 0x80000000L /* switch the "limit blows" feature */ - /*** Town flags ***/ #define TOWN_REAL 0x01 /* Town is really present */ #define TOWN_KNOWN 0x02 /* Town is found by the player */ diff --git a/src/ego_flag.hpp b/src/ego_flag.hpp new file mode 100644 index 00000000..8afb6b19 --- /dev/null +++ b/src/ego_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "ego_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define ETR(tier, index, name) \ + DECLARE_FLAG(ego_flag_set, BOOST_PP_CAT(ETR_,name), tier, index) +#include "ego_flag_list.hpp" +#undef ETR diff --git a/src/ego_flag_list.hpp b/src/ego_flag_list.hpp new file mode 100644 index 00000000..b05fb9b1 --- /dev/null +++ b/src/ego_flag_list.hpp @@ -0,0 +1,38 @@ +/** + * X-macro list of all the ego flags + */ + +/* ETR(, , ) */ + +ETR(1, 0, SUSTAIN ) /* Ego-Item gives a Random Sustain */ +ETR(1, 1, OLD_RESIST ) /* The old "extra power" random high resist */ +ETR(1, 2, ABILITY ) /* Ego-Item has a random Sustain */ +ETR(1, 3, R_ELEM ) /* Item resists Acid/Fire/Cold/Elec or Poison */ +ETR(1, 4, R_LOW ) /* Item has a random low resist */ +ETR(1, 5, R_HIGH ) /* Item has a random high resist */ +ETR(1, 6, R_ANY ) /* Item has one additional resist */ +ETR(1, 7, R_DRAGON ) /* Item gets "Dragon" Resist */ +ETR(1, 8, SLAY_WEAP ) /* Special 'Slaying' bonus */ +ETR(1, 9, DAM_DIE ) /* Item has an additional dam die */ +ETR(1, 10, DAM_SIZE ) /* Item has greater damage dice */ +ETR(1, 11, PVAL_M1 ) /* Item has +1 to pval */ +ETR(1, 12, PVAL_M2 ) /* Item has +(up to 2) to pval */ +ETR(1, 13, PVAL_M3 ) /* Item has +(up to 3) to pval */ +ETR(1, 14, PVAL_M5 ) /* Item has +(up to 5) to pval */ +ETR(1, 15, AC_M1 ) /* Item has +1 to AC */ +ETR(1, 16, AC_M2 ) /* Item has +(up to 2) to AC */ +ETR(1, 17, AC_M3 ) /* Item has +(up to 3) to AC */ +ETR(1, 18, AC_M5 ) /* Item has +(up to 5) to AC */ +ETR(1, 19, TH_M1 ) /* Item has +1 to hit */ +ETR(1, 20, TH_M2 ) /* Item has +(up to 2) to hit */ +ETR(1, 21, TH_M3 ) /* Item has +(up to 3) to hit */ +ETR(1, 22, TH_M5 ) /* Item has +(up to 5) to hit */ +ETR(1, 23, TD_M1 ) /* Item has +1 to dam */ +ETR(1, 24, TD_M2 ) /* Item has +(up to 2) to dam */ +ETR(1, 25, TD_M3 ) /* Item has +(up to 3) to dam */ +ETR(1, 26, TD_M5 ) /* Item has +(up to 5) to dam */ +ETR(1, 27, R_P_ABILITY) /* Item has a random pval-affected ability */ +ETR(1, 28, R_STAT ) /* Item affects a random stat */ +ETR(1, 29, R_STAT_SUST) /* Item affects a random stat & sustains it */ +ETR(1, 30, R_IMMUNITY ) /* Item gives a random immunity */ +ETR(1, 31, LIMIT_BLOWS) /* switch the "limit blows" feature */ diff --git a/src/ego_flag_set.hpp b/src/ego_flag_set.hpp new file mode 100644 index 00000000..0e77d5e0 --- /dev/null +++ b/src/ego_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t ETR_MAX_TIERS = 1; + +typedef flag_set ego_flag_set; diff --git a/src/ego_item_type.hpp b/src/ego_item_type.hpp index 77fe6637..2082c083 100644 --- a/src/ego_item_type.hpp +++ b/src/ego_item_type.hpp @@ -1,5 +1,6 @@ #pragma once +#include "ego_flag_set.hpp" #include "h-basic.h" #include "object_flag_set.hpp" @@ -44,7 +45,7 @@ struct ego_item_type std::array flags; std::array oflags; - u32b fego[FLAG_RARITY_MAX] = { 0 }; /* ego flags */ + std::array fego; object_flag_set need_flags; object_flag_set forbid_flags; diff --git a/src/init1.cc b/src/init1.cc index 53e9d851..7b15440a 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6,6 +6,7 @@ #include "cave_type.hpp" #include "dungeon_info_type.hpp" #include "dungeon_flag.hpp" +#include "ego_flag.hpp" #include "ego_item_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" @@ -157,44 +158,6 @@ static cptr r_info_blow_effect[] = }; -/* Specially handled properties for ego-items */ - -static cptr ego_flags[] = -{ - "SUSTAIN", - "OLD_RESIST", - "ABILITY", - "R_ELEM", - "R_LOW", - "R_HIGH", - "R_ANY", - "R_DRAGON", - "SLAY_WEAP", - "DAM_DIE", - "DAM_SIZE", - "PVAL_M1", - "PVAL_M2", - "PVAL_M3", - "PVAL_M5", - "AC_M1", - "AC_M2", - "AC_M3", - "AC_M5", - "TH_M1", - "TH_M2", - "TH_M3", - "TH_M5", - "TD_M1", - "TD_M2", - "TD_M3", - "TD_M5", - "R_P_ABILITY", - "R_STAT", - "R_STAT_SUST", - "R_IMMUNITY", - "LIMIT_BLOWS" -}; - /* * Trap flags */ @@ -3975,12 +3938,28 @@ errr init_ab_info_txt(FILE *fp) } +/* + * Look up ego flag + */ +static ego_flag_set lookup_ego_flag(const char *what) +{ +#define ETR(tier, index, name) \ + if (streq(what, #name)) \ + { \ + return BOOST_PP_CAT(ETR_,name); \ + }; +#include "ego_flag_list.hpp" +#undef ETR + return ego_flag_set(); +} + + /* * 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(object_flag_set *flags, u32b *ego, cptr what) +static bool_ grab_one_ego_item_flag(object_flag_set *flags, ego_flag_set *ego, cptr what) { /* Lookup as an object_flag */ if (auto f = object_flag_set_from_string(what)) @@ -3992,8 +3971,9 @@ static bool_ grab_one_ego_item_flag(object_flag_set *flags, u32b *ego, cptr what /* Lookup as ego flag */ if (ego) { - if (lookup_flags(what, flag_tie(ego, ego_flags))) + if (auto f = lookup_ego_flag(what)) { + *ego |= f; return (0); } } @@ -4423,7 +4403,7 @@ errr init_ra_info_txt(FILE *fp) ra_ptr->tval[j] = 255; } ra_ptr->flags = object_flag_set(); - ra_ptr->fego = 0; + ra_ptr->fego = ego_flag_set(); /* Next... */ continue; diff --git a/src/object2.cc b/src/object2.cc index 231a67df..8e16fe48 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -15,6 +15,7 @@ #include "spell_type.hpp" #include "device_allocation.hpp" #include "dungeon_info_type.hpp" +#include "ego_flag.hpp" #include "ego_item_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" @@ -3458,9 +3459,9 @@ void trap_hack(object_type *o_ptr) } /* Add a random glag to the ego item */ -void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) +void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows) { - if (fego & ETR4_SUSTAIN) + if (fego & ETR_SUSTAIN) { /* Make a random sustain */ switch (randint(6)) @@ -3486,7 +3487,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_OLD_RESIST) + if (fego & ETR_OLD_RESIST) { /* Make a random resist, equal probabilities */ switch (randint(11)) @@ -3527,7 +3528,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_ABILITY) + if (fego & ETR_ABILITY) { /* Choose an ability */ switch (randint(8)) @@ -3559,35 +3560,35 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_R_ELEM) + if (fego & ETR_R_ELEM) { /* Make an acid/elec/fire/cold/poison resist */ random_resistance(o_ptr, randint(14) + 4); } - if (fego & ETR4_R_LOW) + if (fego & ETR_R_LOW) { /* Make an acid/elec/fire/cold resist */ random_resistance(o_ptr, randint(12) + 4); } - if (fego & ETR4_R_HIGH) + if (fego & ETR_R_HIGH) { /* Make a high resist */ random_resistance(o_ptr, randint(22) + 16); } - if (fego & ETR4_R_ANY) + if (fego & ETR_R_ANY) { /* Make any resist */ random_resistance(o_ptr, randint(34) + 4); } - if (fego & ETR4_R_DRAGON) + if (fego & ETR_R_DRAGON) { /* Make "dragon resist" */ dragon_resist(o_ptr); } - if (fego & ETR4_SLAY_WEAP) + if (fego & ETR_SLAY_WEAP) { /* Make a Weapon of Slaying */ @@ -3616,120 +3617,120 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_DAM_DIE) + if (fego & ETR_DAM_DIE) { /* Increase damage dice */ o_ptr->dd++; } - if (fego & ETR4_DAM_SIZE) + if (fego & ETR_DAM_SIZE) { /* Increase damage dice size */ o_ptr->ds++; } - if (fego & ETR4_LIMIT_BLOWS) + if (fego & ETR_LIMIT_BLOWS) { /* Swap this flag */ *limit_blows = !(*limit_blows); } - if (fego & ETR4_PVAL_M1) + if (fego & ETR_PVAL_M1) { /* Increase pval */ o_ptr->pval++; } - if (fego & ETR4_PVAL_M2) + if (fego & ETR_PVAL_M2) { /* Increase pval */ o_ptr->pval += m_bonus(2, dun_level); } - if (fego & ETR4_PVAL_M3) + if (fego & ETR_PVAL_M3) { /* Increase pval */ o_ptr->pval += m_bonus(3, dun_level); } - if (fego & ETR4_PVAL_M5) + if (fego & ETR_PVAL_M5) { /* Increase pval */ o_ptr->pval += m_bonus(5, dun_level); } - if (fego & ETR4_AC_M1) + if (fego & ETR_AC_M1) { /* Increase ac */ o_ptr->to_a++; } - if (fego & ETR4_AC_M2) + if (fego & ETR_AC_M2) { /* Increase ac */ o_ptr->to_a += m_bonus(2, dun_level); } - if (fego & ETR4_AC_M3) + if (fego & ETR_AC_M3) { /* Increase ac */ o_ptr->to_a += m_bonus(3, dun_level); } - if (fego & ETR4_AC_M5) + if (fego & ETR_AC_M5) { /* Increase ac */ o_ptr->to_a += m_bonus(5, dun_level); } - if (fego & ETR4_TH_M1) + if (fego & ETR_TH_M1) { /* Increase to hit */ o_ptr->to_h++; } - if (fego & ETR4_TH_M2) + if (fego & ETR_TH_M2) { /* Increase to hit */ o_ptr->to_h += m_bonus(2, dun_level); } - if (fego & ETR4_TH_M3) + if (fego & ETR_TH_M3) { /* Increase to hit */ o_ptr->to_h += m_bonus(3, dun_level); } - if (fego & ETR4_TH_M5) + if (fego & ETR_TH_M5) { /* Increase to hit */ o_ptr->to_h += m_bonus(5, dun_level); } - if (fego & ETR4_TD_M1) + if (fego & ETR_TD_M1) { /* Increase to dam */ o_ptr->to_d++; } - if (fego & ETR4_TD_M2) + if (fego & ETR_TD_M2) { /* Increase to dam */ o_ptr->to_d += m_bonus(2, dun_level); } - if (fego & ETR4_TD_M3) + if (fego & ETR_TD_M3) { /* Increase to dam */ o_ptr->to_d += m_bonus(3, dun_level); } - if (fego & ETR4_TD_M5) + if (fego & ETR_TD_M5) { /* Increase to dam */ o_ptr->to_d += m_bonus(5, dun_level); } - if (fego & ETR4_R_P_ABILITY) + if (fego & ETR_R_P_ABILITY) { /* Add a random pval-affected ability */ /* This might cause boots with + to blows */ @@ -3755,7 +3756,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) break; } } - if (fego & ETR4_R_STAT) + if (fego & ETR_R_STAT) { /* Add a random stat */ switch (randint(6)) @@ -3781,7 +3782,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_R_STAT_SUST) + if (fego & ETR_R_STAT_SUST) { /* Add a random stat and sustain it */ switch (randint(6)) @@ -3829,7 +3830,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows) } } - if (fego & ETR4_R_IMMUNITY) + if (fego & ETR_R_IMMUNITY) { /* Give a random immunity */ switch (randint(4)) diff --git a/src/object2.hpp b/src/object2.hpp index a8d0fab9..8a99753d 100644 --- a/src/object2.hpp +++ b/src/object2.hpp @@ -1,5 +1,6 @@ #pragma once +#include "ego_flag_set.hpp" #include "h-basic.h" #include "object_type_fwd.hpp" #include "obj_theme_fwd.hpp" @@ -13,7 +14,7 @@ extern void inc_stack_size(int item, int delta); extern void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc); extern object_type *get_object(int item); extern s32b calc_total_weight(void); -extern void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows); +extern void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows); extern bool init_match_theme(obj_theme const &theme); extern bool_ kind_is_artifactable(int k_idx); extern bool_ kind_is_legal(int k_idx); diff --git a/src/randart_part_type.hpp b/src/randart_part_type.hpp index 39329a57..ad7b0c30 100644 --- a/src/randart_part_type.hpp +++ b/src/randart_part_type.hpp @@ -1,5 +1,6 @@ #pragma once +#include "ego_flag_set.hpp" #include "h-basic.h" #include "object_flag_set.hpp" @@ -27,7 +28,7 @@ struct randart_part_type object_flag_set flags; /* Ego item flags */ - u32b fego = 0; /* ego flags */ + ego_flag_set fego; /* Ego flags */ object_flag_set aflags; /* Antagonistic ego item flags */ -- cgit v1.2.3 From 9e04bdd234e09e3e2e50c65ec21688a496ae1c4f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 09:36:59 +0200 Subject: Split store_info_type::table into a "kind" and "chance" component --- src/init1.cc | 17 ++++++++++------- src/store.cc | 6 +++--- src/store_info_type.hpp | 6 ++++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 7b15440a..e4c2bc98 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6100,13 +6100,14 @@ errr init_st_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - st_ptr->table[item_idx][1] = atoi(buf + 2); + st_ptr->item_chance[item_idx] = atoi(buf + 2); /* Append chars to the name */ - st_ptr->table[item_idx++][0] = test_item_name(s); + st_ptr->item_kind[item_idx] = test_item_name(s); - st_ptr->table_num = item_idx; - assert(st_ptr->table_num <= STORE_CHOICES); + item_idx++; + st_ptr->item_num = item_idx; + assert(st_ptr->item_num <= STORE_CHOICES); /* Next... */ continue; @@ -6122,11 +6123,13 @@ errr init_st_info_txt(FILE *fp) &rar1, &tv1, &sv1)) return (1); /* Get the index */ - st_ptr->table[item_idx][1] = rar1; + st_ptr->item_chance[item_idx] = rar1; /* Hack -- 256 as a sval means all possible items */ - st_ptr->table[item_idx++][0] = (sv1 < 256) ? lookup_kind(tv1, sv1) : tv1 + 10000; + st_ptr->item_kind[item_idx] = (sv1 < 256) ? lookup_kind(tv1, sv1) : tv1 + 10000; - st_ptr->table_num = item_idx; + item_idx++; + st_ptr->item_num = item_idx; + assert(st_ptr->item_num <= STORE_CHOICES); /* Next... */ continue; diff --git a/src/store.cc b/src/store.cc index 972dd096..72ae4eb0 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1280,9 +1280,9 @@ static void store_create(void) else { /* Hack -- Pick an item to sell */ - item = rand_int(st_info[st_ptr->st_idx].table_num); - i = st_info[st_ptr->st_idx].table[item][0]; - chance = st_info[st_ptr->st_idx].table[item][1]; + item = rand_int(st_info[st_ptr->st_idx].item_num); + i = st_info[st_ptr->st_idx].item_kind[item]; + chance = st_info[st_ptr->st_idx].item_chance[item]; /* Don't allow k_info artifacts */ if ((i <= 10000) && (k_info[i].flags & TR_NORM_ART)) diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index 030afe91..6a6efd65 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -14,8 +14,10 @@ struct store_info_type { const char *name; /* Name */ - s16b table[STORE_CHOICES][2]; /* Table -- Legal item kinds */ - byte table_num; /* Number of items */ + s16b item_kind[STORE_CHOICES]; /* Table -- Legal item kinds */ + s16b item_chance[STORE_CHOICES]; + byte item_num; /* Number of items */ + s16b max_obj; /* Number of items this store can hold */ u16b owners[4]; /* List of owners(refers to ow_info) */ -- cgit v1.2.3 From 7bbfa3f27a97c6e0546f53a3254de38e513ed334 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 09:37:08 +0200 Subject: Change store_info_type to non-POD type --- src/init2.cc | 2 +- src/store_info_type.hpp | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 29c4e3e1..3f785424 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -455,7 +455,7 @@ namespace { static void allocate() { - st_info = make_array(max_st_idx); + st_info = new store_info_type[max_st_idx]; } static errr parse(FILE *fp) diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index 6a6efd65..3923438f 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -12,23 +12,23 @@ constexpr int STORE_CHOICES = 56; */ struct store_info_type { - const char *name; /* Name */ + const char *name = nullptr; /* Name */ - s16b item_kind[STORE_CHOICES]; /* Table -- Legal item kinds */ - s16b item_chance[STORE_CHOICES]; - byte item_num; /* Number of items */ + s16b item_kind[STORE_CHOICES] = { 0 }; /* Table -- Legal item kinds */ + s16b item_chance[STORE_CHOICES] = { 0 }; + byte item_num = 0; /* Number of items */ - s16b max_obj; /* Number of items this store can hold */ + s16b max_obj = 0; /* Number of items this store can hold */ - u16b owners[4]; /* List of owners(refers to ow_info) */ + u16b owners[4] = { 0 }; /* List of owners(refers to ow_info) */ - u16b actions[6]; /* Actions(refers to ba_info) */ + u16b actions[6] = { 0 }; /* Actions(refers to ba_info) */ - byte d_attr; /* Default building attribute */ - char d_char; /* Default building character */ + byte d_attr = 0; /* Default building attribute */ + char d_char = '\0'; /* Default building character */ - byte x_attr; /* Desired building attribute */ - char x_char; /* Desired building character */ + byte x_attr = 0; /* Desired building attribute */ + char x_char = '\0'; /* Desired building character */ - u32b flags1; /* Flags */ + u32b flags1 = 0; /* Flags */ }; -- cgit v1.2.3 From e3cd14d9d6d0e90bae7864025e5b2865c045ef96 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 10:13:59 +0200 Subject: Rework SF1_* flags to flag_set<> --- src/defines.h | 15 ------------- src/init1.cc | 59 +++++++++++-------------------------------------- src/store.cc | 53 +++++++++++++++++++++++++------------------- src/store_flag.hpp | 12 ++++++++++ src/store_flag_list.hpp | 17 ++++++++++++++ src/store_flag_set.hpp | 7 ++++++ src/store_info_type.hpp | 3 ++- src/wild.cc | 9 ++++---- 8 files changed, 86 insertions(+), 89 deletions(-) create mode 100644 src/store_flag.hpp create mode 100644 src/store_flag_list.hpp create mode 100644 src/store_flag_set.hpp diff --git a/src/defines.h b/src/defines.h index 52ce7c3e..6337e6b7 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2627,21 +2627,6 @@ #define TOWN_CHANCE 50 /* Chance of 1 town */ -/* - * Store flags - */ -#define SF1_DEPEND_LEVEL 0x00000001L -#define SF1_SHALLOW_LEVEL 0x00000002L -#define SF1_MEDIUM_LEVEL 0x00000004L -#define SF1_DEEP_LEVEL 0x00000008L -#define SF1_RARE 0x00000010L -#define SF1_VERY_RARE 0x00000020L -#define SF1_COMMON 0x00000040L -#define SF1_ALL_ITEM 0x00000080L /* Works as the BM */ -#define SF1_RANDOM 0x00000100L -#define SF1_FORCE_LEVEL 0x00000200L -#define SF1_MUSEUM 0x00000400L - /* * Shield effect options */ diff --git a/src/init1.cc b/src/init1.cc index e4c2bc98..37cc9de3 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -39,6 +39,7 @@ #include "skills.hpp" #include "spells5.hpp" #include "store_action_type.hpp" +#include "store_flag.hpp" #include "store_info_type.hpp" #include "store_type.hpp" #include "tables.hpp" @@ -197,45 +198,6 @@ static cptr t_info_flags[] = "XXX32" }; -/* - * Stores flags - */ -static cptr st_info_flags1[] = -{ - "DEPEND_LEVEL", - "SHALLOW_LEVEL", - "MEDIUM_LEVEL", - "DEEP_LEVEL", - "RARE", - "VERY_RARE", - "COMMON", - "ALL_ITEM", - "RANDOM", - "FORCE_LEVEL", - "MUSEUM", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1" -}; - /* Skill flags */ static cptr s_info_flags1[] = { @@ -5994,13 +5956,15 @@ static errr grab_one_race_flag(owner_type *ow_ptr, int state, cptr what) /* * Grab one store flag from a textual string */ -static errr grab_one_store_flag(store_info_type *st_ptr, cptr what) +static errr grab_one_store_flag(store_flag_set *flags, cptr what) { - /* Scan store flags */ - if (lookup_flags(what, flag_tie(&st_ptr->flags1, st_info_flags1))) - { - return 0; - } +#define STF(tier, index, name) \ + if (streq(what, #name)) { \ + *flags |= BOOST_PP_CAT(STF_,name); \ + return 0; \ + } +#include "store_flag_list.hpp" +#undef STF /* Oops */ msg_format("Unknown store flag '%s'.", what); @@ -6183,7 +6147,10 @@ errr init_st_info_txt(FILE *fp) /* Process 'F' for "store Flags" (multiple lines) */ if (buf[0] == 'F') { - if (0 != grab_one_store_flag(st_ptr, buf + 2)) return (5); + if (0 != grab_one_store_flag(&st_ptr->flags, buf + 2)) + { + return (5); + } /* Next... */ continue; diff --git a/src/store.cc b/src/store.cc index 72ae4eb0..63f9f0d1 100644 --- a/src/store.cc +++ b/src/store.cc @@ -30,6 +30,7 @@ #include "spells5.hpp" #include "stats.hpp" #include "store_action_type.hpp" +#include "store_flag.hpp" #include "store_type.hpp" #include "store_info_type.hpp" #include "tables.hpp" @@ -308,7 +309,7 @@ static s32b price_item(object_type *o_ptr, int greed, bool_ flip) if (adjust > 100) adjust = 100; /* Mega-Hack -- Black market sucks */ - if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) price = price / 2; + if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) price = price / 2; /* No selling means you get no money */ if (no_selling) price = 0; @@ -324,7 +325,7 @@ static s32b price_item(object_type *o_ptr, int greed, bool_ flip) if (adjust < 100) adjust = 100; /* Mega-Hack -- Black market sucks */ - if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) price = price * 2; + if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) price = price * 2; /* Never give items away for free */ if (price <= 0L) price = 1L; @@ -589,7 +590,7 @@ static bool_ store_check_num(object_type *o_ptr) } /* The "home" acts like the player */ - if ((cur_store_num == 7) || (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)) + if ((cur_store_num == 7) || (st_info[st_ptr->st_idx].flags & STF_MUSEUM)) { /* Check all the items */ for (auto const &o_ref: st_ptr->stock) @@ -644,7 +645,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } - if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) + if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) { return true; } @@ -1096,7 +1097,7 @@ static bool_ black_market_crap(object_type *o_ptr) for (std::size_t i = 0; i < max_st_idx; i++) { if (i == STORE_HOME) continue; - if (st_info[i].flags1 & SF1_MUSEUM) continue; + if (st_info[i].flags & STF_MUSEUM) continue; /* Check every item in the store */ for (auto const &stock_obj: town_info[p_ptr->town_num].store[i].stock) @@ -1146,16 +1147,16 @@ int return_level() store_info_type *sti_ptr = &st_info[st_ptr->st_idx]; int level; - if (sti_ptr->flags1 & SF1_RANDOM) level = 0; + if (sti_ptr->flags & STF_RANDOM) level = 0; else level = rand_range(1, STORE_OBJ_LEVEL); - if (sti_ptr->flags1 & SF1_DEPEND_LEVEL) level += dun_level; + if (sti_ptr->flags & STF_DEPEND_LEVEL) level += dun_level; - if (sti_ptr->flags1 & SF1_SHALLOW_LEVEL) level += 5 + rand_int(5); - if (sti_ptr->flags1 & SF1_MEDIUM_LEVEL) level += 25 + rand_int(25); - if (sti_ptr->flags1 & SF1_DEEP_LEVEL) level += 45 + rand_int(45); + if (sti_ptr->flags & STF_SHALLOW_LEVEL) level += 5 + rand_int(5); + if (sti_ptr->flags & STF_MEDIUM_LEVEL) level += 25 + rand_int(25); + if (sti_ptr->flags & STF_DEEP_LEVEL) level += 45 + rand_int(45); - if (sti_ptr->flags1 & SF1_ALL_ITEM) level += p_ptr->lev; + if (sti_ptr->flags & STF_ALL_ITEM) level += p_ptr->lev; return (level); } @@ -1248,7 +1249,7 @@ static void store_create(void) } /* Black Market */ - else if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) + else if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) { /* No themes */ init_match_theme(obj_theme::no_theme()); @@ -1305,8 +1306,14 @@ static void store_create(void) store_tval = i - 10000; /* Do we forbid too shallow items ? */ - if (st_info[st_ptr->st_idx].flags1 & SF1_FORCE_LEVEL) store_level = level; - else store_level = 0; + if (st_info[st_ptr->st_idx].flags & STF_FORCE_LEVEL) + { + store_level = level; + } + else + { + store_level = 0; + } /* Prepare allocation table */ get_obj_num_prep(); @@ -1363,7 +1370,7 @@ static void store_create(void) if (q_ptr->tval == TV_CHEST) continue; /* Prune the black market */ - if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) + if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) { /* Hack -- No "crappy" items */ if (black_market_crap(q_ptr)) continue; @@ -1429,7 +1436,7 @@ static void display_entry(int pos) /* Describe an item in the home */ if ((cur_store_num == 7) || - (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM)) + (st_info[st_ptr->st_idx].flags & STF_MUSEUM)) { int maxwid = 75; @@ -1565,7 +1572,7 @@ void display_store(void) put_str("Weight", 5, 70); } - else if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) + else if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) { /* Show the name of the store */ strnfmt(buf, 80, "%s", st_info[cur_store_num].name); @@ -2078,7 +2085,7 @@ void store_stole(void) void store_purchase(void) { /* Museum? */ - if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) + if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) { msg_print("You cannot take items from the museum!"); return; @@ -2400,7 +2407,7 @@ void store_sell(void) char o_name[80]; - bool_ museum = (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) ? TRUE : FALSE; + bool museum = bool(st_info[st_ptr->st_idx].flags & STF_MUSEUM); /* Prepare prompt */ cptr q, s; @@ -2695,7 +2702,7 @@ void store_examine(void) if (st_ptr->stock.empty()) { if (cur_store_num == 7) msg_print("Your home is empty."); - else if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) msg_print("The museum is empty."); + else if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) msg_print("The museum is empty."); else msg_print("I am currently out of stock."); return; } @@ -3380,7 +3387,7 @@ void store_shuffle(int which) if (which == STORE_HOME) return; /* Ignoer Museum */ - if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) return; + if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) return; /* Save the store index */ @@ -3434,13 +3441,13 @@ void store_maint(int town_num, int store_num) st_ptr = &town_info[town_num].store[store_num]; /* Ignoer Museum */ - if (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) return; + if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) return; /* Activate the owner */ ot_ptr = &ow_info[st_ptr->owner]; /* Mega-Hack -- prune the black market */ - if (st_info[st_ptr->st_idx].flags1 & SF1_ALL_ITEM) + if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) { /* Destroy crappy black market items */ for (int j = st_ptr->stock.size() - 1; j >= 0; j--) diff --git a/src/store_flag.hpp b/src/store_flag.hpp new file mode 100644 index 00000000..6844bd84 --- /dev/null +++ b/src/store_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "store_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define STF(tier, index, name) \ + DECLARE_FLAG(store_flag_set, BOOST_PP_CAT(STF_,name), tier, index) +#include "store_flag_list.hpp" +#undef STF diff --git a/src/store_flag_list.hpp b/src/store_flag_list.hpp new file mode 100644 index 00000000..f8e4b177 --- /dev/null +++ b/src/store_flag_list.hpp @@ -0,0 +1,17 @@ +/** + * X-macro list of all the store flags + */ + +/* STF(, , ) */ + +STF(1, 0, DEPEND_LEVEL ) +STF(1, 1, SHALLOW_LEVEL) +STF(1, 2, MEDIUM_LEVEL ) +STF(1, 3, DEEP_LEVEL ) +STF(1, 4, RARE ) +STF(1, 5, VERY_RARE ) +STF(1, 6, COMMON ) +STF(1, 7, ALL_ITEM ) +STF(1, 8, RANDOM ) +STF(1, 9, FORCE_LEVEL ) +STF(1, 10, MUSEUM ) diff --git a/src/store_flag_set.hpp b/src/store_flag_set.hpp new file mode 100644 index 00000000..0529baed --- /dev/null +++ b/src/store_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t STF_MAX_TIERS = 1; + +typedef flag_set store_flag_set; diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index 3923438f..a735fdfc 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "store_flag_set.hpp" /** * Number of items to choose stock from @@ -30,5 +31,5 @@ struct store_info_type byte x_attr = 0; /* Desired building attribute */ char x_char = '\0'; /* Desired building character */ - u32b flags1 = 0; /* Flags */ + store_flag_set flags; /* Flags */ }; diff --git a/src/wild.cc b/src/wild.cc index 7e7b20d0..d928b4a3 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -21,6 +21,7 @@ #include "options.hpp" #include "player_type.hpp" #include "store_info_type.hpp" +#include "store_flag.hpp" #include "tables.hpp" #include "town_type.hpp" #include "util.hpp" @@ -890,9 +891,9 @@ static int get_shops(int *rooms) { int chance = 50; - if (st_info[n].flags1 & SF1_COMMON) chance += 30; - if (st_info[n].flags1 & SF1_RARE) chance -= 20; - if (st_info[n].flags1 & SF1_VERY_RARE) chance -= 30; + if (st_info[n].flags & STF_COMMON) chance += 30; + if (st_info[n].flags & STF_RARE) chance -= 20; + if (st_info[n].flags & STF_VERY_RARE) chance -= 30; if (!magik(chance)) continue; @@ -900,7 +901,7 @@ static int get_shops(int *rooms) if (rooms[i] == n) continue; - if (st_info[n].flags1 & SF1_RANDOM) rooms[num++] = n; + if (st_info[n].flags & STF_RANDOM) rooms[num++] = n; } return num; -- cgit v1.2.3 From c7544e07ecec46084970e708176a12d94ecf7bd0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 10:42:25 +0200 Subject: Remove unused "rate" field from store_type --- lib/edit/s_info.txt | 58 ------------------------------------------ lib/mods/theme/edit/s_info.txt | 58 ------------------------------------------ src/init1.cc | 18 ------------- src/skill_type.hpp | 1 - src/skills.cc | 3 --- 5 files changed, 138 deletions(-) diff --git a/lib/edit/s_info.txt b/lib/edit/s_info.txt index 1e1d7a07..87251694 100644 --- a/lib/edit/s_info.txt +++ b/lib/edit/s_info.txt @@ -14,7 +14,6 @@ # N:idx:name # D:desc # A:action mkey:action desc -# I:rate # E:exclusive skill:exclusive skill # O:skill:opposing skill%percent @@ -27,107 +26,90 @@ N:56:Magic-Device D:Eases the use of magical devices, such as wands, staves and rods D:It also helps pseudo-id of magic objects -I:1000 F:RANDOM_GAIN N:54:Spell-learning D:You should not see that ! that is a BUG! #A:18:Learn a spell from a realm -I:1000 F:HIDDEN N:41:Sorcery D:Ability to use all the magic schools as if their skill was sorcery D:But the price to channel that much magic is your health A:17:Cast a spell -I:1000 N:1:Conveyance D:Ability to learn and use spells from the Conveyance school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:RANDOM_GAIN N:2:Mana D:Ability to learn and use spells from the Mana school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:3:Fire D:Ability to learn and use spells from the Fire school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:4:Air D:Ability to learn and use spells from the Air school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:5:Water D:Ability to learn and use spells from the Water school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:6:Nature D:Ability to learn and use spells from the Nature school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:7:Earth D:Ability to learn and use spells from the Earth school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:10:Divination D:Ability to learn and use spells from the Divination school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:RANDOM_GAIN N:11:Temporal D:Ability to learn and use spells from the Temporal school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:14:Meta D:Ability to learn and use spells from the Meta school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:51:Mind D:Ability to learn and use spells from the Mind school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:55:Udun D:Ability to learn and use spells from the Udun school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:HIDDEN N:13:Demonology D:Ability to use incantations from the Demonblades D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:31:Necromancy D:Ability to harness the powers of the dead D:Spells use the intelligence stat A:7:Use Necromancy -I:1000 F:RANDOM_GAIN G:60 @@ -135,31 +117,26 @@ N:34:Runecraft D:Ability to combine magic runes to create your own spells D:Runespells use the dexterity stat A:9:Use Runespells -I:1000 N:43:Thaumaturgy D:Ability to gain and cast innate spells D:Spells use the intelligence stat A:8:Cast a thaumaturgy spell -I:1000 F:RANDOM_GAIN N:15:Magic D:General ability to do magic, also affects mana reserves and D:magic device ability. Helps pseudo-id of magic objects A:19:Copy a spell -I:1000 F:RANDOM_GAIN N:45:Spell-power D:Ability to increase the power of spells -I:1000 N:59:Geomancy D:Ability to understand the raw elemental forces of nature and use D:them to your advantage. Most spells need Fire/Water/Earth/Air skills A:101:Use Geomancy -I:1000 # All magic skills affect magic skill f:Magic-Device:Magic%7 @@ -193,82 +170,65 @@ f:Thaumaturgy:Magic%6 N:16:Combat D:General ability to fight and to pseudo-id armour and weapons D:It also allows the use of heavier armour without penalties -I:1000 F:RANDOM_GAIN N:17:Weaponmastery D:General ability to use melee weapons -I:1000 F:RANDOM_GAIN N:18:Sword-mastery D:Ability to use swords -I:1000 N:19:Axe-mastery D:Ability to use axes -I:1000 N:20:Polearm-mastery D:Ability to use polearms -I:1000 N:21:Hafted-mastery D:Ability to use hafted weapons -I:1000 N:22:Backstab D:Ability to backstab fleeing and sleeping monsters to increase damage -I:1000 N:23:Archery D:General ability to use ranged weapons -I:1000 F:RANDOM_GAIN N:24:Sling-mastery D:Ability to use slings A:23:Fire piercing shots -I:1000 N:25:Bow-mastery D:Ability to use bows A:23:Fire piercing shots -I:1000 N:26:Crossbow-mastery D:Ability to use crossbows A:23:Fire piercing shots -I:1000 N:27:Boomerang-mastery D:Ability to use boomerangs -I:1000 N:58:Boulder-throwing D:Ability to make and throw boulders A:21:Tear down a wall to create boulders -I:1000 N:42:Barehand-combat D:Ability to fight barehanded -I:1000 F:RANDOM_GAIN G:70 N:47:Bearform-combat D:Ability to fight in bear form -I:1000 F:AUTO_HIDE F:HIDDEN N:52:Critical-hits D:Ability to deal critical hits with swords < 5lb -I:1000 N:57:Stunning-blows D:Ability to stun opponents when doing critical hits with hafted weapons > 5 lb -I:1000 # List of combat friendly skills @@ -315,26 +275,22 @@ f:Boulder-throwing:Combat%40 N:28:Spirituality D:General ability to use spiritual skills and also influence your Saving Throw -I:1000 F:RANDOM_GAIN N:53:Prayer D:Ability to learn and use spells from the gods' schools D:Spells use the wisdom stat and cost piety instead of mana A:17:Cast a spell -I:1000 N:12:Druidistic D:Ability to learn and use prayers from the Druidistic realm D:Nature powers use the wisdom stat A:1:Cast a druidistic spell -I:1000 N:29:Mindcraft D:Ability to focus the powers of the mind D:Mindpowers use the wisdom stat A:2:Use Mindcraft -I:1000 F:RANDOM_GAIN G:50 @@ -342,7 +298,6 @@ N:9:Music D:Ability to learn and sing songs D:Songs use the charisma stat A:17:Cast a spell -I:1000 f:Prayer:Spirituality%10 f:Druidistic:Spirituality%10 @@ -359,12 +314,10 @@ f:Music:Magic%10 N:30:Misc D:Not a real skill, it is only used to regroup some skills -I:0 N:33:Antimagic D:Ability to generate an antimagic field A:3:Use antimagic -I:1000 F:RANDOM_GAIN G:80 @@ -398,28 +351,23 @@ E:Thaumaturgy:Antimagic N:35:Sneakiness D:General ability at the sneakiness skills. D:It also affects the searching abilities -I:0 F:RANDOM_GAIN N:36:Stealth D:Ability to move unnoticed, silently -I:0 F:RANDOM_GAIN N:37:Disarming D:Ability to disarm the various traps -I:0 F:RANDOM_GAIN N:40:Stealing D:Ability to steal objects A:15:Steal object -I:0 N:46:Dodging D:Ability to dodge blows and bolts A:16:Check dodge chance -I:0 f:Stealth:Sneakiness%15 f:Disarming:Sneakiness%10 @@ -433,38 +381,32 @@ f:Dodging:Sneakiness%10 N:48:Monster-lore D:General ability at the monster related skills, ability to gain experience D:from friendly kills. It also affects the number of companions you can have -I:0 A:22:Turn pet into companion F:RANDOM_GAIN N:44:Summoning D:Ability to create totems from monsters and use them to summon monsters A:13:Manipulate totems -I:1000 F:RANDOM_GAIN G:60 N:49:Corpse-preservation D:Ability not to destroy the monsters' corpses when killing them -I:0 N:50:Possession D:Ability to incarnate into monsters A:11:Use the possession skill -I:0 N:8:Symbiosis D:Ability to enter in symbiosis with monsters unable to move by themselves D:Spells use the intelligence stat A:20:Use symbiotic powers -I:1000 F:RANDOM_GAIN G:70 N:32:Mimicry D:Ability to use cloaks of mimicry to change form A:6:Use Mimicry -I:1000 F:RANDOM_GAIN G:80 diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt index b3d8e485..2d42bf4a 100644 --- a/lib/mods/theme/edit/s_info.txt +++ b/lib/mods/theme/edit/s_info.txt @@ -14,7 +14,6 @@ # N:idx:name # D:desc # A:action mkey:action desc -# I:rate # E:exclusive skill:exclusive skill # O:skill:opposing skill%percent @@ -27,108 +26,91 @@ N:56:Magic-Device D:Eases the use of magical devices, such as wands, staves and rods D:It also helps pseudo-id of magic objects -I:1000 F:RANDOM_GAIN N:54:Spell-learning D:You should not see that ! that is a BUG! #A:18:Learn a spell from a realm -I:1000 F:HIDDEN N:41:Sorcery D:Ability to use all the magic schools as if their skill was sorcery D:But the price to channel that much magic is your health A:17:Cast a spell -I:1000 N:1:Conveyance D:Ability to learn and use spells from the Conveyance school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:RANDOM_GAIN N:2:Mana D:Ability to learn and use spells from the Mana school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:3:Fire D:Ability to learn and use spells from the Fire school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:4:Air D:Ability to learn and use spells from the Air school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:5:Water D:Ability to learn and use spells from the Water school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:6:Nature D:Ability to learn and use spells from the Nature school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:RANDOM_GAIN N:7:Earth D:Ability to learn and use spells from the Earth school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:10:Divination D:Ability to learn and use spells from the Divination school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:RANDOM_GAIN N:11:Temporal D:Ability to learn and use spells from the Temporal school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:14:Meta D:Ability to learn and use spells from the Meta school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:51:Mind D:Ability to learn and use spells from the Mind school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:55:Udun D:Ability to learn and use spells from the Udun school D:Spells use the intelligence stat A:17:Cast a spell -I:1000 F:HIDDEN N:13:Demonology D:Ability to use incantations from the Demonblades D:Spells use the intelligence stat A:17:Cast a spell -I:1000 N:31:Necromancy D:Ability to harness the powers of the dead D:Spells use the intelligence stat A:7:Use Necromancy -I:1000 F:RANDOM_GAIN G:60 @@ -136,31 +118,26 @@ N:34:Runecraft D:Ability to combine magic runes to create your own spells D:Runespells use the dexterity stat A:9:Use Runespells -I:1000 N:43:Thaumaturgy D:Ability to gain and cast innate spells D:Spells use the intelligence stat A:8:Cast a thaumaturgy spell -I:1000 F:RANDOM_GAIN N:15:Magic D:General ability to do magic, also affects mana reserves and D:magic device ability. Helps pseudo-id of magic objects A:19:Copy a spell -I:1000 F:RANDOM_GAIN N:45:Spell-power D:Ability to increase the power of spells -I:1000 N:59:Geomancy D:Ability to understand the raw elemental forces of nature and use D:them to your advantage. Most spells need Fire/Water/Earth/Air skills A:101:Use Geomancy -I:1000 # All magic skills affect magic skill f:Magic-Device:Magic%7 @@ -194,83 +171,66 @@ f:Thaumaturgy:Magic%6 N:16:Combat D:General ability to fight and to pseudo-id armour and weapons D:It also allows the use of heavier armour without penalties -I:1000 F:RANDOM_GAIN N:17:Weaponmastery D:General ability to use melee weapons -I:1000 F:RANDOM_GAIN N:18:Sword-mastery D:Ability to use swords -I:1000 N:19:Axe-mastery D:Ability to use axes -I:1000 N:20:Polearm-mastery D:Ability to use polearms -I:1000 N:21:Hafted-mastery D:Ability to use hafted weapons -I:1000 N:22:Backstab D:Ability to backstab fleeing and sleeping monsters to increase damage -I:1000 N:23:Archery D:General ability to use ranged weapons -I:1000 F:RANDOM_GAIN N:24:Sling-mastery D:Ability to use slings A:23:Fire piercing shots -I:1000 N:25:Bow-mastery D:Ability to use bows A:23:Fire piercing shots -I:1000 N:26:Crossbow-mastery D:Ability to use crossbows A:23:Fire piercing shots -I:1000 N:27:Boomerang-mastery D:Ability to use boomerangs -I:1000 N:58:Boulder-throwing D:Ability to make and throw boulders A:21:Tear down a wall to create boulders -I:1000 F:RANDOM_GAIN N:42:Barehand-combat D:Ability to fight barehanded -I:1000 F:RANDOM_GAIN G:70 N:47:Bearform-combat D:Ability to fight in bear form -I:1000 F:AUTO_HIDE F:HIDDEN N:52:Critical-hits D:Ability to deal critical hits with swords < 5lb -I:1000 N:57:Stunning-blows D:Ability to stun opponents when doing critical hits with hafted weapons > 5 lb -I:1000 # List of combat friendly skills @@ -317,26 +277,22 @@ f:Boulder-throwing:Combat%40 N:28:Spirituality D:General ability to use spiritual skills and also influence your Saving Throw -I:1000 F:RANDOM_GAIN N:53:Prayer D:Ability to learn and use spells from the gods' schools D:Spells use the wisdom stat and cost piety instead of mana A:17:Cast a spell -I:1000 N:12:Druidistic D:Ability to learn and use prayers from the Druidistic realm D:Nature powers use the wisdom stat A:1:Cast a druidistic spell -I:1000 N:29:Mindcraft D:Ability to focus the powers of the mind D:Mindpowers use the wisdom stat A:2:Use Mindcraft -I:1000 F:RANDOM_GAIN G:50 @@ -344,7 +300,6 @@ N:9:Music D:Ability to learn and sing songs D:Songs use the charisma stat A:17:Cast a spell -I:1000 f:Prayer:Spirituality%10 f:Druidistic:Spirituality%10 @@ -361,12 +316,10 @@ f:Music:Magic%10 N:30:Misc D:Not a real skill, it is only used to regroup some skills -I:0 N:33:Antimagic D:Ability to generate an antimagic field A:3:Use antimagic -I:1000 F:RANDOM_GAIN G:80 @@ -400,28 +353,23 @@ E:Thaumaturgy:Antimagic N:35:Sneakiness D:General ability at the sneakiness skills. D:It also affects the searching abilities -I:0 F:RANDOM_GAIN N:36:Stealth D:Ability to move unnoticed, silently -I:0 F:RANDOM_GAIN N:37:Disarming D:Ability to disarm the various traps -I:0 F:RANDOM_GAIN N:40:Stealing D:Ability to steal objects A:15:Steal object -I:0 N:46:Dodging D:Ability to dodge blows and bolts A:16:Check dodge chance -I:0 f:Stealth:Sneakiness%15 f:Disarming:Sneakiness%10 @@ -435,38 +383,32 @@ f:Dodging:Sneakiness%10 N:48:Monster-lore D:General ability at the monster related skills, ability to gain experience D:from friendly kills. It also affects the number of companions you can have -I:0 A:22:Turn pet into companion F:RANDOM_GAIN N:44:Summoning D:Ability to create totems from monsters and use them to summon monsters A:13:Manipulate totems -I:1000 F:RANDOM_GAIN G:60 N:49:Corpse-preservation D:Ability not to destroy the monsters' corpses when killing them -I:0 N:50:Possession D:Ability to incarnate into monsters A:11:Use the possession skill -I:0 N:8:Symbiosis D:Ability to enter in symbiosis with monsters unable to move by themselves D:Spells use the intelligence stat A:20:Use symbiotic powers -I:1000 F:RANDOM_GAIN G:70 N:32:Mimicry D:Ability to use cloaks of mimicry to change form A:6:Use Mimicry -I:1000 F:RANDOM_GAIN G:80 diff --git a/src/init1.cc b/src/init1.cc index 37cc9de3..ba13cfae 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3569,24 +3569,6 @@ errr init_s_info_txt(FILE *fp) continue; } - /* Process 'I' for "Info" (one line only) */ - if (buf[0] == 'I') - { - int rate; - - /* Scan for the values */ - if (1 != sscanf(buf + 2, "%d", &rate)) - { - return (1); - } - - /* Save the values */ - s_ptr->rate = rate; - - /* Next... */ - continue; - } - /* Process 'G' for "random Gain" (one line only) */ if (buf[0] == 'G') { diff --git a/src/skill_type.hpp b/src/skill_type.hpp index c6de1dc1..5b29d1ac 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -20,7 +20,6 @@ struct skill_type s32b value; /* Actual value */ s32b mod; /* Modifier(1 skill point = modifier skill) */ - s16b rate; /* Modifier decreasing rate */ u32b uses; /* Number of times used */ diff --git a/src/skills.cc b/src/skills.cc index eef3b77c..4a56de05 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -487,7 +487,6 @@ void do_cmd_skill() /* Allocate arrays to save skill values */ std::unique_ptr skill_values_save(new s32b[MAX_SKILLS]); std::unique_ptr skill_mods_save(new s32b[MAX_SKILLS]); - std::unique_ptr skill_rates_save(new s16b[MAX_SKILLS]); std::unique_ptr skill_invest(new s16b[MAX_SKILLS]); std::unique_ptr skill_bonus(new s32b[MAX_SKILLS]); @@ -501,7 +500,6 @@ void do_cmd_skill() skill_values_save[i] = s_ptr->value; skill_mods_save[i] = s_ptr->mod; - skill_rates_save[i] = s_ptr->rate; skill_invest[i] = 0; skill_bonus[i] = 0; } @@ -615,7 +613,6 @@ void do_cmd_skill() s_ptr->value = skill_values_save[i]; s_ptr->mod = skill_mods_save[i]; - s_ptr->rate = skill_rates_save[i]; } } } -- cgit v1.2.3 From 6da48c4a3bdd2ff105c3ae55d29c6796bec5338b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 11:00:28 +0200 Subject: Remove unused "uses" field from skill_type --- src/loadsave.cc | 2 -- src/skill_type.hpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 5c257518..4c924527 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -544,7 +544,6 @@ static bool_ do_extra(ls_flag_t flag) do_s32b(&s_info[i].mod, flag); do_byte((byte*)&s_info[i].dev, flag); do_byte((byte*)&s_info[i].hidden, flag); - do_u32b(&s_info[i].uses, flag); } else { @@ -552,7 +551,6 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&tmp16s, flag); do_byte(&tmp8u, flag); do_byte(&tmp8u, flag); - do_u32b(&tmp32u, flag); } } diff --git a/src/skill_type.hpp b/src/skill_type.hpp index 5b29d1ac..fdcdc2d7 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -21,8 +21,6 @@ struct skill_type s32b value; /* Actual value */ s32b mod; /* Modifier(1 skill point = modifier skill) */ - u32b uses; /* Number of times used */ - s16b action[MAX_SKILLS]; /* List of actions against other skills */ s16b father; /* Father in the skill tree */ -- cgit v1.2.3 From 2f7774c60767d5579af0596caadbb0f9ca822963 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 10:13:52 +0200 Subject: Change skill_type to non-POD type --- src/init2.cc | 2 +- src/skill_type.hpp | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 3f785424..eefed7ca 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -343,7 +343,7 @@ namespace { static void allocate() { - s_info = make_array(max_s_idx); + s_info = new skill_type[max_s_idx]; } static errr parse(FILE *fp) diff --git a/src/skill_type.hpp b/src/skill_type.hpp index fdcdc2d7..4be4459a 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -8,27 +8,27 @@ */ struct skill_type { - const char *name; /* Name */ - char *desc; /* Description */ + const char *name = nullptr; /* Name */ + char *desc = nullptr; /* Description */ - const char *action_desc; /* Action Description */ + const char *action_desc = nullptr; /* Action Description */ - s16b action_mkey; /* Action do to */ + s16b action_mkey = 0; /* Action do to */ - s32b i_value; /* Actual value */ - s32b i_mod; /* Modifier(1 skill point = modifier skill) */ + s32b i_value = 0; /* Current value */ + s32b i_mod = 0; /* Modifier, i.e. how much value 1 skill point gives */ - s32b value; /* Actual value */ - s32b mod; /* Modifier(1 skill point = modifier skill) */ + s32b value = 0; /* Current value */ + s32b mod = 0; /* Modifier, i.e. how much value 1 skill point gives */ - s16b action[MAX_SKILLS]; /* List of actions against other skills */ + s16b action[MAX_SKILLS] = { 0 }; /* List of actions against other skills */ - s16b father; /* Father in the skill tree */ - bool_ dev; /* Is the branch developped ? */ - s16b order; /* Order in the tree */ - bool_ hidden; /* Innactive */ + s16b father = 0; /* Father in the skill tree */ + bool_ dev = FALSE; /* Is the branch developped ? */ + s16b order = 0; /* Order in the tree */ + bool_ hidden = FALSE; /* Inactive */ - byte random_gain_chance; /* random gain chance, still needs the flag */ + byte random_gain_chance = 0; /* Chance to gain from Lost Sword quest; if applicable */ - u32b flags1; /* Skill flags */ + u32b flags1 = 0; /* Skill flags */ }; -- cgit v1.2.3 From 85143506abfb231a6ffc717a0ebc1a8339cd8a50 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 11:26:23 +0200 Subject: Rework SKF1_* flags to flag_set<> --- src/defines.h | 5 ----- src/init1.cc | 54 ++++++++++--------------------------------------- src/skill_flag.hpp | 12 +++++++++++ src/skill_flag_list.hpp | 9 +++++++++ src/skill_flag_set.hpp | 7 +++++++ src/skill_type.hpp | 3 ++- src/skills.cc | 12 +++++------ src/xtra1.cc | 3 ++- 8 files changed, 49 insertions(+), 56 deletions(-) create mode 100644 src/skill_flag.hpp create mode 100644 src/skill_flag_list.hpp create mode 100644 src/skill_flag_set.hpp diff --git a/src/defines.h b/src/defines.h index 6337e6b7..8c451ccb 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2801,11 +2801,6 @@ /* Number of skill choices for Lost Sword quests. */ #define LOST_SWORD_NSKILLS 4 -/* SKill flags */ -#define SKF1_HIDDEN 0x00000001 /* Starts hidden */ -#define SKF1_AUTO_HIDE 0x00000002 /* Tries to rehide at calc_bonus */ -#define SKF1_RANDOM_GAIN 0x00000004 /* Can be randomly gained by certain quests & such */ - #define MAX_MELEE 3 diff --git a/src/init1.cc b/src/init1.cc index ba13cfae..13a376d3 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -35,6 +35,7 @@ #include "randart_gen_type.hpp" #include "randart_part_type.hpp" #include "set_type.hpp" +#include "skill_flag.hpp" #include "skill_type.hpp" #include "skills.hpp" #include "spells5.hpp" @@ -198,43 +199,6 @@ static cptr t_info_flags[] = "XXX32" }; -/* Skill flags */ -static cptr s_info_flags1[] = -{ - "HIDDEN", - "AUTO_HIDE", - "RANDOM_GAIN", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1", - "XXX1" -}; - /* * Helpers for looking up flags in the above arrays @@ -754,12 +718,16 @@ static errr grab_one_race_allow_flag(u32b *choice, cptr what) /* * Grab one flag from a textual string */ -static errr grab_one_skill_flag(u32b *f1, cptr what) +static errr grab_one_skill_flag(skill_flag_set *flags, cptr what) { - if (lookup_flags(what, flag_tie(f1, s_info_flags1))) - { - return 0; - } +#define SKF(tier, index, name) \ + if (streq(what, #name)) \ + { \ + *flags |= BOOST_PP_CAT(SKF_,name); \ + return 0; \ + }; +#include "skill_flag_list.hpp" +#undef SKF /* Oops */ msg_format("(2)Unknown skill flag '%s'.", what); @@ -3590,7 +3558,7 @@ errr init_s_info_txt(FILE *fp) /* Process 'F' for flags */ if (buf[0] == 'F') { - if (0 != grab_one_skill_flag(&s_ptr->flags1, buf + 2)) + if (0 != grab_one_skill_flag(&s_ptr->flags, buf + 2)) { return (5); } diff --git a/src/skill_flag.hpp b/src/skill_flag.hpp new file mode 100644 index 00000000..15c6de9c --- /dev/null +++ b/src/skill_flag.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "skill_flag_set.hpp" +#include + +// +// Define flag set for each flag. +// +#define SKF(tier, index, name) \ + DECLARE_FLAG(skill_flag_set, BOOST_PP_CAT(SKF_,name), tier, index) +#include "skill_flag_list.hpp" +#undef SKF diff --git a/src/skill_flag_list.hpp b/src/skill_flag_list.hpp new file mode 100644 index 00000000..49cdc045 --- /dev/null +++ b/src/skill_flag_list.hpp @@ -0,0 +1,9 @@ +/** + * X-macro list of all the skill flags + */ + +/* SKF(, , ) */ + +SKF(1, 0, HIDDEN ) /* Starts hidden */ +SKF(1, 1, AUTO_HIDE ) /* Tries to rehide at calc_bonus */ +SKF(1, 2, RANDOM_GAIN) /* Can be gained through Lost Sword quest */ diff --git a/src/skill_flag_set.hpp b/src/skill_flag_set.hpp new file mode 100644 index 00000000..a2768b70 --- /dev/null +++ b/src/skill_flag_set.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "flag_set.hpp" + +constexpr std::size_t SKF_MAX_TIERS = 1; + +typedef flag_set skill_flag_set; diff --git a/src/skill_type.hpp b/src/skill_type.hpp index 4be4459a..95ce3516 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "skill_flag_set.hpp" #include "skills_defs.hpp" /** @@ -30,5 +31,5 @@ struct skill_type byte random_gain_chance = 0; /* Chance to gain from Lost Sword quest; if applicable */ - u32b flags1 = 0; /* Skill flags */ + skill_flag_set flags; /* Skill flags */ }; diff --git a/src/skills.cc b/src/skills.cc index 4a56de05..8949e9ad 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -27,6 +27,7 @@ #include "player_race_mod.hpp" #include "player_spec.hpp" #include "player_type.hpp" +#include "skill_flag.hpp" #include "skill_type.hpp" #include "spells1.hpp" #include "spells4.hpp" @@ -1241,11 +1242,10 @@ void init_skill(s32b value, s32b mod, int i) { s_info[i].value = value; s_info[i].mod = mod; - - if (s_info[i].flags1 & SKF1_HIDDEN) - s_info[i].hidden = TRUE; - else - s_info[i].hidden = FALSE; + s_info[i].hidden = (s_info[i].flags & SKF_HIDDEN) + ? TRUE + : FALSE + ; } /* @@ -1320,7 +1320,7 @@ void do_get_new_skill() max_a = 0; for (i = 0; i < max_s_idx; i++) { - if (s_info[i].flags1 & SKF1_RANDOM_GAIN) { + if (s_info[i].flags & SKF_RANDOM_GAIN) { available_skills[max_a] = i; max_a++; } diff --git a/src/xtra1.cc b/src/xtra1.cc index 6fbbfdf0..a816efb1 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -39,6 +39,7 @@ #include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" +#include "skill_flag.hpp" #include "skill_type.hpp" #include "skills.hpp" #include "spells3.hpp" @@ -2951,7 +2952,7 @@ void calc_bonuses(bool_ silent) /* Hide the skills that should auto hide */ for (i = 0; i < max_s_idx; i++) { - if (s_info[i].flags1 & SKF1_AUTO_HIDE) + if (s_info[i].flags & SKF_AUTO_HIDE) s_info[i].hidden = TRUE; } -- cgit v1.2.3 From 2190e84bd31c6cb0078df0fd674177989880afee Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 22 Jun 2016 15:50:36 +0200 Subject: Clean up flavor_init() and use Fisher-Yates shuffle --- src/object1.cc | 126 +++++++++++++++------------------------------------------ 1 file changed, 32 insertions(+), 94 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 5aa53c7f..9e130be9 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -60,6 +60,7 @@ #include #include #include +#include using boost::starts_with; @@ -454,6 +455,25 @@ static bool_ object_easy_know(int i) return (FALSE); } + + +/** + * Shuffle flavor arrays into a random permutation + */ +template +static void shuffle_flavors(cptr adj[], byte col[]) +{ + // The classic Fisher-Yates shuffle + for (std::size_t i = N - 1; i > 0; i--) + { + int j = rand_int(i + 1); + std::swap(adj[i], adj[j]); + std::swap(col[i], col[j]); + } +} + + + /* * Prepare the "variable" part of the "k_info" array. * @@ -487,13 +507,6 @@ static bool_ object_easy_know(int i) */ void flavor_init(void) { - int i, j; - - byte temp_col; - - cptr temp_adj; - - /* Hack -- Use the "simple" RNG */ Rand_quick = TRUE; @@ -502,99 +515,24 @@ void flavor_init(void) /* Efficiency -- Rods/Wands share initial array */ - for (i = 0; i < MAX_METALS; i++) + for (std::size_t i = 0; i < MAX_METALS; i++) { rod_adj[i] = wand_adj[i]; rod_col[i] = wand_col[i]; } - /* Rings have "ring colors" */ - for (i = 0; i < MAX_ROCKS; i++) - { - j = rand_int(MAX_ROCKS); - temp_adj = ring_adj[i]; - ring_adj[i] = ring_adj[j]; - ring_adj[j] = temp_adj; - temp_col = ring_col[i]; - ring_col[i] = ring_col[j]; - ring_col[j] = temp_col; - } - - /* Amulets have "amulet colors" */ - for (i = 0; i < MAX_AMULETS; i++) - { - j = rand_int(MAX_AMULETS); - temp_adj = amulet_adj[i]; - amulet_adj[i] = amulet_adj[j]; - amulet_adj[j] = temp_adj; - temp_col = amulet_col[i]; - amulet_col[i] = amulet_col[j]; - amulet_col[j] = temp_col; - } - - /* Staffs */ - for (i = 0; i < MAX_WOODS; i++) - { - j = rand_int(MAX_WOODS); - temp_adj = staff_adj[i]; - staff_adj[i] = staff_adj[j]; - staff_adj[j] = temp_adj; - temp_col = staff_col[i]; - staff_col[i] = staff_col[j]; - staff_col[j] = temp_col; - } - - /* Wands */ - for (i = 0; i < MAX_METALS; i++) - { - j = rand_int(MAX_METALS); - temp_adj = wand_adj[i]; - wand_adj[i] = wand_adj[j]; - wand_adj[j] = temp_adj; - temp_col = wand_col[i]; - wand_col[i] = wand_col[j]; - wand_col[j] = temp_col; - } - - /* Rods */ - for (i = 0; i < MAX_METALS; i++) - { - j = rand_int(MAX_METALS); - temp_adj = rod_adj[i]; - rod_adj[i] = rod_adj[j]; - rod_adj[j] = temp_adj; - temp_col = rod_col[i]; - rod_col[i] = rod_col[j]; - rod_col[j] = temp_col; - } - - /* Foods (Mushrooms) */ - for (i = 0; i < MAX_SHROOM; i++) - { - j = rand_int(MAX_SHROOM); - temp_adj = food_adj[i]; - food_adj[i] = food_adj[j]; - food_adj[j] = temp_adj; - temp_col = food_col[i]; - food_col[i] = food_col[j]; - food_col[j] = temp_col; - } - - /* Potions */ - for (i = 4; i < MAX_COLORS; i++) - { - j = rand_int(MAX_COLORS - 4) + 4; - temp_adj = potion_adj[i]; - potion_adj[i] = potion_adj[j]; - potion_adj[j] = temp_adj; - temp_col = potion_col[i]; - potion_col[i] = potion_col[j]; - potion_col[j] = temp_col; - } + /* Object flavors */ + shuffle_flavors(ring_adj, ring_col); + shuffle_flavors(amulet_adj, amulet_col); + shuffle_flavors(staff_adj, staff_col); + shuffle_flavors(wand_adj, wand_col); + shuffle_flavors(rod_adj, rod_col); + shuffle_flavors(food_adj, food_col); + shuffle_flavors(potion_adj + 4, potion_col + 4); /* Scrolls (random titles, always white) */ - for (i = 0; i < MAX_TITLES; i++) + for (std::size_t i = 0; i < MAX_TITLES; i++) { /* Get a new title */ while (TRUE) @@ -635,7 +573,7 @@ void flavor_init(void) bool_ okay = TRUE; /* Check for "duplicate" scroll titles */ - for (j = 0; j < i; j++) + for (std::size_t j = 0; j < i; j++) { cptr hack1 = scroll_adj[j]; cptr hack2 = scroll_adj[i]; @@ -666,7 +604,7 @@ void flavor_init(void) Rand_quick = FALSE; /* Analyze every object */ - for (i = 1; i < max_k_idx; i++) + for (std::size_t i = 1; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; -- cgit v1.2.3 From b31e77642582a730b11ca80f495172a774fa6783 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 00:52:48 +0200 Subject: Change town_type to non-POD type --- src/init2.cc | 12 ++++-------- src/town_type.hpp | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index eefed7ca..93982bcc 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -678,14 +678,9 @@ static errr init_misc(void) */ static errr init_towns(void) { - int i = 0, j = 0; + town_info = new town_type[max_towns]; - /*** Prepare the Towns ***/ - - /* Allocate the towns */ - town_info = make_array(max_towns); - - for (i = 1; i < max_towns; i++) + for (std::size_t i = 1; i < max_towns; i++) { if (i <= max_real_towns) town_info[i].flags |= (TOWN_REAL); @@ -693,7 +688,7 @@ static errr init_towns(void) town_info[i].store = new store_type[max_st_idx]; /* Fill in each store */ - for (j = 0; j < max_st_idx; j++) + for (std::size_t j = 0; j < max_st_idx; j++) { /* Access the store */ store_type *st_ptr = &town_info[i].store[j]; @@ -705,6 +700,7 @@ static errr init_towns(void) st_ptr->stock_size = 0; } } + return 0; } diff --git a/src/town_type.hpp b/src/town_type.hpp index f8458c60..7758f7fd 100644 --- a/src/town_type.hpp +++ b/src/town_type.hpp @@ -8,14 +8,16 @@ */ struct town_type { - cptr name; - u32b seed; /* Seed for RNG */ - store_type *store; /* The stores [max_st_idx] */ - byte numstores; + cptr name = nullptr; - byte flags; /* Town flags */ - /* Left this for the sake of compatibility */ - bool_ stocked; /* Is the town actualy stocked ? */ + u32b seed = 0; /* Seed for RNG */ - bool_ destroyed; /* Is the town destroyed? */ + store_type *store = nullptr; /* The stores [max_st_idx] */ + byte numstores = 0; + + byte flags = 0; /* Town flags */ + + bool_ stocked = FALSE; /* Is the town actualy stocked ? */ + + bool_ destroyed = FALSE; /* Is the town destroyed? */ }; -- cgit v1.2.3 From ace1dc4db2d1025f1973b05bdd859e7577dc2835 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 00:18:18 +0200 Subject: Change wilderness_type_info to a non-POD type --- src/init2.cc | 2 +- src/wilderness_type_info.hpp | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 93982bcc..1a8ca839 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -503,7 +503,7 @@ namespace { static void allocate() { - wf_info = make_array(max_wf_idx); + wf_info = new wilderness_type_info[max_wf_idx]; } static errr parse(FILE *fp) diff --git a/src/wilderness_type_info.hpp b/src/wilderness_type_info.hpp index bc23c03e..fa834e09 100644 --- a/src/wilderness_type_info.hpp +++ b/src/wilderness_type_info.hpp @@ -9,17 +9,16 @@ */ struct wilderness_type_info { - const char *name; /* Name */ - const char *text; /* Text */ + const char *name = nullptr; /* Name */ + const char *text = nullptr; /* Text */ - u16b entrance; /* Which town is there(<1000 i's a town, >=1000 it a dungeon) */ - s32b wild_x; /* Map coordinates (backed out while parsing map) */ - s32b wild_y; - byte road; /* Flags of road */ - int level; /* Difficulty level */ - u32b flags1; /* Some flags */ - byte feat; /* The feature of f_info.txt that is used to allow passing, ... and to get a char/color/graph */ - byte terrain_idx; /* Terrain index(defined in defines.h) */ + u16b entrance = 0; /* Which town is there(<1000 i's a town, >=1000 it a dungeon) */ + s32b wild_x = 0; /* Map coordinates (backed out while parsing map) */ + s32b wild_y = 0; + byte road = 0; /* Flags of road */ + int level = 0; /* Difficulty level */ + byte feat = 0; /* The feature of f_info.txt that is used to allow passing, ... and to get a char/color/graph */ + byte terrain_idx = 0; /* Terrain index(defined in defines.h) */ - byte terrain[MAX_WILD_TERRAIN];/* Feature types for the plasma generator */ + byte terrain[MAX_WILD_TERRAIN] = { 0 }; /* Feature types for the plasma generator */ }; -- cgit v1.2.3 From f921de3438624fb4b4e6d1fc3e256c1ca7292067 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 00:22:03 +0200 Subject: Change wilderness_map to non-POD type --- src/init2.cc | 6 ++---- src/wilderness_map.hpp | 9 ++++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 1a8ca839..fca7473a 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -728,15 +728,13 @@ void create_stores_stock(int t) */ static errr init_wilderness(void) { - int i; - /* Allocate the wilderness (two-dimension array) */ wild_map = make_array(max_wild_y); /* Init the other pointers */ - for (i = 0; i < max_wild_y; i++) + for (std::size_t i = 0; i < max_wild_y; i++) { - wild_map[i] = make_array(max_wild_x); + wild_map[i] = new wilderness_map[max_wild_x]; } /* No encounter right now */ diff --git a/src/wilderness_map.hpp b/src/wilderness_map.hpp index 41e873bd..e1d795f5 100644 --- a/src/wilderness_map.hpp +++ b/src/wilderness_map.hpp @@ -7,9 +7,8 @@ */ struct wilderness_map { - int feat; /* Wilderness feature */ - u32b seed; /* Seed for the RNG */ - u16b entrance; /* Entrance for dungeons */ - - bool_ known; /* Is it seen by the player ? */ + int feat = 0; /* Wilderness feature */ + u32b seed = 0; /* Seed for the RNG */ + u16b entrance = 0; /* Entrance for dungeons */ + bool_ known = FALSE; /* Is it seen by the player ? */ }; -- cgit v1.2.3 From 3dfd51d15686de33737a58fe74751122f272816a Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 20:11:44 +0200 Subject: Remove 'alert_hitpoint' option; behave as if always set This actually preserves previous behavior since setting the warning threshold to 0% (default) has the same effect as disabling the alert entirely. --- lib/help/macrofaq.txt | 1 - lib/help/option.txt | 4 ---- lib/mods/theme/help/macrofaq.txt | 1 - lib/mods/theme/help/option.txt | 4 ---- lib/mods/theme/user/all.prf | 3 --- src/dungeon.cc | 5 ++++- src/options.cc | 1 - src/options.hpp | 1 - src/spells1.cc | 10 ++++++++-- src/tables.cc | 3 --- 10 files changed, 12 insertions(+), 21 deletions(-) diff --git a/lib/help/macrofaq.txt b/lib/help/macrofaq.txt index 8194d7fe..a82074c1 100644 --- a/lib/help/macrofaq.txt +++ b/lib/help/macrofaq.txt @@ -1772,7 +1772,6 @@ options screen. rogue_like_commands use_old_target always_pickup -alert_hitpoint auto_scum #####G---------------------------------------------------------------------- diff --git a/lib/help/option.txt b/lib/help/option.txt index 7563f83b..636fe2d1 100644 --- a/lib/help/option.txt +++ b/lib/help/option.txt @@ -171,10 +171,6 @@ off at will during the course of the game. even if this option is unset. (You may also inscribe an item with {.} to suppress its random-teleportation power, unless it is cursed.) -#####GAlert user to critical hitpoints [alert_hitpoint] - Produce a "bell" noise, and flushes all pending input, when your hitpoints - reach the warning point chosen elsewhere, preventing stupid deaths. - #####GAlert user to various failures [alert_failure] Produce a "bell" noise, and flushes all pending input, when various failures occur, as described above. diff --git a/lib/mods/theme/help/macrofaq.txt b/lib/mods/theme/help/macrofaq.txt index 035f674b..d285194c 100644 --- a/lib/mods/theme/help/macrofaq.txt +++ b/lib/mods/theme/help/macrofaq.txt @@ -1776,7 +1776,6 @@ options screen. rogue_like_commands use_old_target always_pickup -alert_hitpoint auto_scum #####G---------------------------------------------------------------------- diff --git a/lib/mods/theme/help/option.txt b/lib/mods/theme/help/option.txt index 00ee15a4..96d84b86 100644 --- a/lib/mods/theme/help/option.txt +++ b/lib/mods/theme/help/option.txt @@ -171,10 +171,6 @@ off at will during the course of the game. even if this option is unset. (You may also inscribe an item with {.} to suppress its random-teleportation power, unless it is cursed.) -#####GAlert user to critical hitpoints [alert_hitpoint] - Produce a "bell" noise, and flushes all pending input, when your hitpoints - reach the warning point chosen elsewhere, preventing stupid deaths. - #####GAlert user to various failures [alert_failure] Produce a "bell" noise, and flushes all pending input, when various failures occur, as described above. diff --git a/lib/mods/theme/user/all.prf b/lib/mods/theme/user/all.prf index 67671aa4..98b22fc5 100644 --- a/lib/mods/theme/user/all.prf +++ b/lib/mods/theme/user/all.prf @@ -62,9 +62,6 @@ X:disturb_minor # Option 'Disturb whenever random things happen' X:disturb_other -# Option 'Alert user to critical hitpoints' -Y:alert_hitpoint - # Option 'Alert user to various failures' Y:alert_failure diff --git a/src/dungeon.cc b/src/dungeon.cc index 2e71278e..417e8010 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1909,7 +1909,10 @@ static void process_world(void) if (p_ptr->chp < warning) { /* Hack -- bell on first notice */ - if (alert_hitpoint && (old_chp > warning)) bell(); + if (old_chp > warning) + { + bell(); + } sound(SOUND_WARN); diff --git a/src/options.cc b/src/options.cc index 5501ab52..c59644e3 100644 --- a/src/options.cc +++ b/src/options.cc @@ -25,7 +25,6 @@ bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */ bool_ disturb_state; /* Disturn whenever player state changes */ bool_ disturb_minor; /* Disturb whenever boring things happen */ bool_ disturb_other; /* Disturb whenever various things happen */ -bool_ alert_hitpoint; /* Alert user to critical hitpoints */ bool_ alert_failure; /* Alert user to various failures */ bool_ last_words; /* Get last words upon dying */ bool_ small_levels; /* Allow unusually small dungeon levels */ diff --git a/src/options.hpp b/src/options.hpp index 45e19cf7..0a15570f 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -27,7 +27,6 @@ extern bool_ disturb_detect; extern bool_ disturb_state; extern bool_ disturb_minor; extern bool_ disturb_other; -extern bool_ alert_hitpoint; extern bool_ alert_failure; extern bool_ last_words; extern bool_ small_levels; diff --git a/src/spells1.cc b/src/spells1.cc index bb4febf0..daee9f03 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1410,7 +1410,10 @@ void take_hit(int damage, cptr hit_from) if (p_ptr->chp < warning) { /* Hack -- bell on first notice */ - if (alert_hitpoint && (old_chp > warning)) bell(); + if (old_chp > warning) + { + bell(); + } sound(SOUND_WARN); @@ -1551,7 +1554,10 @@ void take_sanity_hit(int damage, cptr hit_from) if (p_ptr->csane < warning) { /* Hack -- bell on first notice */ - if (alert_hitpoint && (old_csane > warning)) bell(); + if (old_csane > warning) + { + bell(); + } sound(SOUND_WARN); diff --git a/src/tables.cc b/src/tables.cc index ba86c577..340919aa 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -1313,9 +1313,6 @@ option_type option_info[] = { &disturb_other, FALSE, 2, 9, "disturb_other", "Disturb whenever random things happen" }, - { &alert_hitpoint, FALSE, 2, 10, - "alert_hitpoint", "Alert user to critical hitpoints" }, - { &alert_failure, FALSE, 2, 11, "alert_failure", "Alert user to various failures" }, -- cgit v1.2.3 From c9874a503bc391c815e94b87580b86b1b7ba7cf6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 23:18:19 +0200 Subject: Remove 'alert_failure' option It does nothing interesting anyway. --- src/options.cc | 1 - src/options.hpp | 1 - src/tables.cc | 3 --- src/util.cc | 4 ---- 4 files changed, 9 deletions(-) diff --git a/src/options.cc b/src/options.cc index c59644e3..07dd7869 100644 --- a/src/options.cc +++ b/src/options.cc @@ -25,7 +25,6 @@ bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */ bool_ disturb_state; /* Disturn whenever player state changes */ bool_ disturb_minor; /* Disturb whenever boring things happen */ bool_ disturb_other; /* Disturb whenever various things happen */ -bool_ alert_failure; /* Alert user to various failures */ bool_ last_words; /* Get last words upon dying */ bool_ small_levels; /* Allow unusually small dungeon levels */ bool_ empty_levels; /* Allow empty 'arena' levels */ diff --git a/src/options.hpp b/src/options.hpp index 0a15570f..6900b9a3 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -27,7 +27,6 @@ extern bool_ disturb_detect; extern bool_ disturb_state; extern bool_ disturb_minor; extern bool_ disturb_other; -extern bool_ alert_failure; extern bool_ last_words; extern bool_ small_levels; extern bool_ empty_levels; diff --git a/src/tables.cc b/src/tables.cc index 340919aa..b48a2565 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -1313,9 +1313,6 @@ option_type option_info[] = { &disturb_other, FALSE, 2, 9, "disturb_other", "Disturb whenever random things happen" }, - { &alert_failure, FALSE, 2, 11, - "alert_failure", "Alert user to various failures" }, - { &last_words, TRUE, 2, 12, "last_words", "Get last words when the character dies" }, diff --git a/src/util.cc b/src/util.cc index f5b3e09c..f4f6c64e 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3499,10 +3499,6 @@ bool_ prefix(cptr s, cptr t) /* Paranoia */ if (!s || !t) { - if (alert_failure) - { - message_add("prefix() called with null argument!", TERM_RED); - } return FALSE; } -- cgit v1.2.3 From 9ca81ed64c847db6b5d2a0890e7aea3ac96d92d1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 23 Jun 2016 20:16:26 +0200 Subject: Remove unused parameter from init_town() --- src/birth.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index bd59161f..41a7cc9b 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3039,7 +3039,7 @@ static void validate_bg(void) /* * Initialize a random town */ -void init_town(int t_idx, int level) +void init_town(int t_idx) { town_type *t_ptr = &town_info[t_idx]; @@ -3157,7 +3157,7 @@ void player_birth(void) } /* Create the town */ - init_town(d_ptr->t_idx[num], d_ptr->t_level[num]); + init_town(d_ptr->t_idx[num]); num++; -- cgit v1.2.3 From a7ead32f2066fe12dd2154800f480247dc6d7c6c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Use std::vector for town_type::store --- src/birth.cc | 3 --- src/init2.cc | 11 ++++++----- src/loadsave.cc | 2 +- src/town_type.hpp | 5 +++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 41a7cc9b..dd66e11f 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3051,9 +3051,6 @@ void init_town(int t_idx) /* Generation seed for the town */ t_ptr->seed = randint(0x10000000); - - /* Total hack and not even used */ - t_ptr->numstores = 8; } /* diff --git a/src/init2.cc b/src/init2.cc index fca7473a..5a4662a0 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -682,15 +682,16 @@ static errr init_towns(void) for (std::size_t i = 1; i < max_towns; i++) { - if (i <= max_real_towns) town_info[i].flags |= (TOWN_REAL); - - /* Allocate the stores */ - town_info[i].store = new store_type[max_st_idx]; + if (i <= max_real_towns) + { + town_info[i].flags |= TOWN_REAL; + } /* Fill in each store */ for (std::size_t j = 0; j < max_st_idx; j++) { - /* Access the store */ + /* Create the store */ + town_info[i].store.emplace_back(store_type()); store_type *st_ptr = &town_info[i].store[j]; /* Know who we are */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 4c924527..8d63abf9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2351,7 +2351,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) if (i >= TOWN_RANDOM) { do_u32b(&town_info[i].seed, flag); - do_byte(&town_info[i].numstores, flag); + do_byte(&tmp8u, flag); do_byte(&town_info[i].flags, flag); /* If the town is realy used create a sock */ diff --git a/src/town_type.hpp b/src/town_type.hpp index 7758f7fd..e119968b 100644 --- a/src/town_type.hpp +++ b/src/town_type.hpp @@ -3,6 +3,8 @@ #include "h-basic.h" #include "store_type_fwd.hpp" +#include + /** * Town descriptor. */ @@ -12,8 +14,7 @@ struct town_type u32b seed = 0; /* Seed for RNG */ - store_type *store = nullptr; /* The stores [max_st_idx] */ - byte numstores = 0; + std::vector store; /* The stores [max_st_idx] */ byte flags = 0; /* Town flags */ -- cgit v1.2.3 From 8dbbe9d1fcf29c57a2afc436fcde5150131adca4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Clean up loadsave.cc --- src/loadsave.cc | 1745 +++++++++++++++++++++++++++---------------------------- 1 file changed, 865 insertions(+), 880 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 8d63abf9..d4cf63ff 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -171,36 +171,6 @@ static void do_s32b(s32b *ip, ls_flag_t flag) do_u32b((u32b *)ip, flag); } -/* - * Do object memory and similar stuff - */ -static void do_xtra(int k_idx, ls_flag_t flag) -{ - byte tmp8u = 0; - object_kind *k_ptr = &k_info[k_idx]; - - switch(flag) - { - case ls_flag_t::SAVE: - { - if (k_ptr->aware) tmp8u |= 0x01; - if (k_ptr->tried) tmp8u |= 0x02; - if (k_ptr->artifact) tmp8u |= 0x80; - - do_byte(&tmp8u, flag); - return; - } - case ls_flag_t::LOAD: - { - do_byte(&tmp8u, flag); - k_ptr->aware = ((tmp8u & 0x01) ? TRUE : FALSE); - k_ptr->tried = ((tmp8u & 0x02) ? TRUE : FALSE); - k_ptr->artifact = ((tmp8u & 0x80) ? TRUE : FALSE); - return; - } - } -} - static void save_string(const char *str) { while (*str) @@ -266,15 +236,8 @@ template void do_flag_set(flag_set *flags, ls_flag_t f } // namespace (anonymous) -/* - * Load/Save quick start data - */ static void do_quick_start(ls_flag_t flag) { - s16b tmp16s; - u32b tmp32u; - int i; - do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); do_s16b(&previous_char.pclass, flag); @@ -284,14 +247,18 @@ static void do_quick_start(ls_flag_t flag) do_s32b(&previous_char.grace, flag); do_s32b(&previous_char.au, flag); - for (i = 0; i < 6; i++) do_s16b(&(previous_char.stat[i]), flag); + for (std::size_t i = 0; i < 6; i++) + { + do_s16b(&(previous_char.stat[i]), flag); + } do_s16b(&previous_char.luck, flag); - do_s16b(&tmp16s, flag); - do_u32b(&tmp32u, flag); - do_byte((byte*)&previous_char.quick_ok, flag); + do_bool(&previous_char.quick_ok, flag); - for (i = 0; i < 4; i++) do_string(previous_char.history[i], 60, flag); + for (std::size_t i = 0; i < 4; i++) + { + do_string(previous_char.history[i], 60, flag); + } } /* @@ -325,7 +292,7 @@ static void do_subrace(ls_flag_t flag) set_subrace_description(sr_ptr, buf); } - do_byte((byte*)&sr_ptr->place, flag); + do_bool(&sr_ptr->place, flag); for (i = 0; i < 6; i++) do_s16b(&sr_ptr->r_adj[i], flag); @@ -348,10 +315,14 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->infra, flag); for (i = 0; i < 4; i++) + { do_s16b(&sr_ptr->powers[i], flag); + } for (i = 0; i < BODY_MAX; i++) + { do_byte((byte*)&sr_ptr->body_parts[i], flag); + } do_flag_set(&sr_ptr->flags, flag); @@ -388,7 +359,7 @@ static void do_spells(int i, ls_flag_t flag) do_byte(&s_ptr->dam_sides, flag); do_byte(&s_ptr->dam_dice, flag); do_byte(&s_ptr->level, flag); - do_byte((byte*)&s_ptr->untried, flag); + do_bool(&s_ptr->untried, flag); } @@ -412,86 +383,57 @@ static void note(cptr msg) } -static void skip_ver_byte(u32b version, ls_flag_t flag) -/* Reads and discards a byte if the savefile is as old as/older than version */ -{ - if ((flag == ls_flag_t::LOAD) && (vernum <= version)) - { - byte forget; - do_byte(&forget, flag); - } - return; -} - -static void do_ver_s16b(s16b *v, u32b version, s16b defval, ls_flag_t flag) -{ - if ((flag == ls_flag_t::LOAD) && (vernum < version)) - { - *v = defval; - return; - } - do_s16b(v, flag); -} - /* * Misc. other data */ static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { - int i, j; - byte tmp8u = 0; - s16b tmp16s = 0; - u32b tmp32u = 0; - s32b tmp32s = 0; - u16b tmp16b = 0; - u32b dummy32u = 0; - do_string(player_name, 32, flag); do_string(died_from, 80, flag); - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { do_string(history[i], 60, flag); } /* Handle the special levels info */ - if (flag == ls_flag_t::SAVE) { - tmp8u = max_d_idx; - tmp16s = MAX_DUNGEON_DEPTH; - } - do_byte(&tmp8u, flag); + byte tmp8u = max_d_idx; + u16b tmp16u = MAX_DUNGEON_DEPTH; - if (flag == ls_flag_t::LOAD) - { - if (tmp8u > max_d_idx) + do_byte(&tmp8u, flag); + + if (flag == ls_flag_t::LOAD) { - note(format("Too many (%d) dungeon types!", tmp8u)); + if (tmp8u > max_d_idx) + { + note(format("Too many dungeon types!", static_cast(tmp8u))); + } } - } - do_s16b(&tmp16s, flag); + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::LOAD) - { - if (tmp16s > MAX_DUNGEON_DEPTH) + if (flag == ls_flag_t::LOAD) { - note(format("Too many (%d) max level by dungeon type!", tmp16s)); + if (tmp16u > MAX_DUNGEON_DEPTH) + { + note(format("Too many (%d) max level by dungeon type!", static_cast(tmp16u))); + } } - } - /* Load the special levels history */ - for (i = 0; i < tmp8u; i++) - { - for (j = 0; j < tmp16s; j++) + /* Load the special levels history */ + for (std::size_t i = 0; i < tmp8u; i++) { - do_byte((byte*)&special_lvl[j][i], flag); + for (std::size_t j = 0; j < tmp16u; j++) + { + do_bool(&special_lvl[j][i], flag); + } } } - do_byte((byte*)&generate_special_feeling, flag); + do_bool(&generate_special_feeling, flag); /* Load the quick start data */ do_quick_start(flag); @@ -505,68 +447,81 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->pracem, flag); do_byte(&p_ptr->pclass, flag); do_byte(&p_ptr->pspec, flag); - do_u16b(&tmp16b, flag); - do_u16b(&tmp16b, flag); do_byte(&p_ptr->mimic_form, flag); do_s16b(&p_ptr->mimic_level, flag); - if (flag == ls_flag_t::SAVE) tmp8u = 0; do_byte(&p_ptr->hitdie, flag); do_u16b(&p_ptr->expfact, flag); /* Dump the stats (maximum and current) */ - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag); - for (i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_max[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cur[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_cnt[i], flag); + for (std::size_t i = 0; i < 6; ++i) do_s16b(&p_ptr->stat_los[i], flag); - /* Dump the skills */ - do_s16b(&p_ptr->skill_points, flag); - do_s16b(&p_ptr->skill_last_level, flag); - do_s16b(&p_ptr->melee_style, flag); - do_s16b(&p_ptr->use_piercing_shots, flag); + // Skills + { + do_s16b(&p_ptr->skill_points, flag); + do_s16b(&p_ptr->skill_last_level, flag); + do_s16b(&p_ptr->melee_style, flag); + do_s16b(&p_ptr->use_piercing_shots, flag); - tmp16s = MAX_SKILLS; - do_s16b(&tmp16s, flag); + u16b tmp16u = MAX_SKILLS; - if ((flag == ls_flag_t::LOAD) && (tmp16s > MAX_SKILLS)) - { - quit("Too many skills"); - } + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::SAVE) old_max_s_idx = max_s_idx; - do_u16b(&old_max_s_idx, flag); - for (i = 0; i < tmp16s; ++i) - { - if (i < old_max_s_idx) + if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_SKILLS)) { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_byte((byte*)&s_info[i].dev, flag); - do_byte((byte*)&s_info[i].hidden, flag); + quit("Too many skills"); } - else + + if (flag == ls_flag_t::SAVE) { - do_u32b(&tmp32u, flag); - do_s16b(&tmp16s, flag); - do_byte(&tmp8u, flag); - do_byte(&tmp8u, flag); + old_max_s_idx = max_s_idx; } - } - - tmp16s = max_ab_idx; - do_s16b(&tmp16s, flag); + do_u16b(&old_max_s_idx, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16s > max_ab_idx)) - { - quit("Too many abilities"); + for (std::size_t i = 0; i < tmp16u; i++) + { + if (i < old_max_s_idx) + { + do_s32b(&s_info[i].value, flag); + do_s32b(&s_info[i].mod, flag); + do_bool(&s_info[i].dev, flag); + do_bool(&s_info[i].hidden, flag); + } + else + { + // Skip extraneous entries + u32b tmp32u = 0; + s16b tmp16s = 0; + bool_ tmp8u = 0; + do_u32b(&tmp32u, flag); + do_s16b(&tmp16s, flag); + do_bool(&tmp8u, flag); + do_bool(&tmp8u, flag); + } + } } - for (i = 0; i < tmp16s; ++i) + // Abilities { - do_byte((byte*)&ab_info[i].acquired, flag); + u16b tmp16u = max_ab_idx; + + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_ab_idx)) + { + quit("Too many abilities"); + } + + for (std::size_t i = 0; i < tmp16u; ++i) + { + do_bool(&ab_info[i].acquired, flag); + } } + // Miscellaneous do_s16b(&p_ptr->luck_base, flag); do_s16b(&p_ptr->luck_max, flag); @@ -580,47 +535,56 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->town_num, flag); /* -KMW- */ /* Write arena and rewards information -KMW- */ - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->inside_quest, flag); - do_byte(&tmp8u, flag); /* Save/load spellbinder */ do_byte(&p_ptr->spellbinder_num, flag); do_byte(&p_ptr->spellbinder_trigger, flag); - for (i = 0; i < 4; i++) - do_u32b(&p_ptr->spellbinder[i], flag); - - - do_byte(&tmp8u, flag); /* tmp8u should be 0 at this point */ - - if (flag == ls_flag_t::SAVE) tmp8u = MAX_PLOTS; - do_byte(&tmp8u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) + for (std::size_t i = 0; i < 4; i++) { - quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); + do_u32b(&p_ptr->spellbinder[i], flag); } - for (i = 0; i < tmp8u; i++) + // Quests { - do_s16b(&plots[i], flag); - } + byte tmp8u; - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_RANDOM_QUEST; - } - do_byte(&tmp8u, flag); + // Number of quests + if (flag == ls_flag_t::SAVE) + { + tmp8u = MAX_PLOTS; + } + do_byte(&tmp8u, flag); + if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) + { + quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); + } - if ((flag == ls_flag_t::LOAD) && - (tmp8u > MAX_RANDOM_QUEST)) quit("Too many random quests"); - for (i = 0; i < tmp8u; i++) - { - do_byte(&random_quests[i].type, flag); - do_s16b(&random_quests[i].r_idx, flag); - do_byte((byte*)&random_quests[i].done, flag); + // Quest status + for (std::size_t i = 0; i < tmp8u; i++) + { + do_s16b(&plots[i], flag); + } + + // Number of random quests + if (flag == ls_flag_t::SAVE) + { + tmp8u = MAX_RANDOM_QUEST; + } + do_byte(&tmp8u, flag); + if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_RANDOM_QUEST)) + { + quit("Too many random quests"); + } + + // Random quest data + for (std::size_t i = 0; i < tmp8u; i++) + { + do_byte(&random_quests[i].type, flag); + do_s16b(&random_quests[i].r_idx, flag); + do_bool(&random_quests[i].done, flag); + } } do_s16b(&p_ptr->oldpx, flag); @@ -639,48 +603,48 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->csp, flag); do_u16b(&p_ptr->csp_frac, flag); - /* XXX - Here's where tank points were. - Those who run the estate of you-know-who is really stupid. - I'll never even consider reading her books now. -- neil */ - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); - /* Gods */ do_s32b(&p_ptr->grace, flag); do_s32b(&p_ptr->grace_delay, flag); - do_byte((byte*)&p_ptr->praying, flag); + do_bool(&p_ptr->praying, flag); do_s16b(&p_ptr->melkor_sacrifice, flag); do_byte(&p_ptr->pgod, flag); - /* Max Player and Dungeon Levels */ do_s16b(&p_ptr->max_plv, flag); - if (flag == ls_flag_t::SAVE) - tmp8u = max_d_idx; - do_byte(&tmp8u, flag); - for (i = 0; i < tmp8u; i++) + // Max dungeon levels { - if (flag == ls_flag_t::SAVE) - tmp16s = max_dlv[i]; - do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) - max_dlv[i] = tmp16s; + byte tmp8u = max_d_idx; + + do_byte(&tmp8u, flag); + + for (std::size_t i = 0; i < tmp8u; i++) + { + s16b tmp16s = max_dlv[i]; + + do_s16b(&tmp16s, flag); + + if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) + { + max_dlv[i] = tmp16s; + } + } } + /* Repair max player level??? */ if ((flag == ls_flag_t::LOAD) && (p_ptr->max_plv < p_ptr->lev)) + { p_ptr->max_plv = p_ptr->lev; + } - do_byte((byte*)&(p_ptr->help.enabled), flag); - for (i = 0; i < HELP_MAX; i++) + /* Help */ + do_bool(&p_ptr->help.enabled, flag); + for (std::size_t i = 0; i < HELP_MAX; i++) { do_bool(&(p_ptr->help.activated[i]), flag); } /* More info */ - tmp16s = 0; do_s16b(&p_ptr->blind, flag); do_s16b(&p_ptr->paralyzed, flag); do_s16b(&p_ptr->confused, flag); @@ -742,69 +706,55 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->tim_esp, flag); do_s16b(&p_ptr->tim_wraith, flag); do_s16b(&p_ptr->tim_ffall, flag); - do_ver_s16b(&p_ptr->tim_fly, SAVEFILE_VERSION, 0, flag); - do_s16b(&tmp16s, flag); - do_ver_s16b(&p_ptr->tim_poison, SAVEFILE_VERSION, 0, flag); - do_s16b(&tmp16s, flag); + do_s16b(&p_ptr->tim_fly, flag); + do_s16b(&p_ptr->tim_poison, flag); do_s16b(&p_ptr->tim_invisible, flag); do_s16b(&p_ptr->tim_inv_pow, flag); do_s16b(&p_ptr->tim_mimic, flag); do_s16b(&p_ptr->lightspeed, flag); do_s16b(&p_ptr->tim_lite, flag); - do_ver_s16b(&p_ptr->tim_regen, SAVEFILE_VERSION, 0, flag); - do_ver_s16b(&p_ptr->tim_regen_pow, SAVEFILE_VERSION, 0, flag); + do_s16b(&p_ptr->tim_regen, flag); + do_s16b(&p_ptr->tim_regen_pow, flag); do_s16b(&p_ptr->holy, flag); - do_s16b(&tmp16s, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->immov_cntr, flag); do_s16b(&p_ptr->strike, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->tim_reflect, flag); - do_s16b(&tmp16s, flag); do_s16b(&p_ptr->tim_deadly, flag); do_s16b(&p_ptr->prob_travel, flag); do_s16b(&p_ptr->disrupt_shield, flag); do_s16b(&p_ptr->parasite, flag); do_s16b(&p_ptr->parasite_r_idx, flag); - do_s32b(&tmp32s, flag); - do_s32b(&tmp32s, flag); do_s16b(&p_ptr->absorb_soul, flag); do_s32b(&p_ptr->inertia_controlled_spell, flag); do_s16b(&p_ptr->last_rewarded_level, flag); - do_s16b(&tmp16s, flag); /* compat */ - - if (flag == ls_flag_t::SAVE) { tmp16s = CORRUPTIONS_MAX; } - do_s16b(&tmp16s, flag); - if (tmp16s > CORRUPTIONS_MAX) { - quit("Too many corruptions"); - } - - for (i = 0; i < tmp16s; i++) + // Corruptions { - if (flag == ls_flag_t::SAVE) - tmp8u = p_ptr->corruptions[i]; + u16b tmp16u = CORRUPTIONS_MAX; - do_byte(&tmp8u, flag); + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::LOAD) - p_ptr->corruptions[i] = tmp8u; + if (tmp16u > CORRUPTIONS_MAX) + { + quit("Too many corruptions"); + } + + for (std::size_t i = 0; i < tmp16u; i++) + { + do_bool(&p_ptr->corruptions[i], flag); + } } - do_byte((byte*)&p_ptr->corrupt_anti_teleport_stopped, flag); + do_bool(&p_ptr->corrupt_anti_teleport_stopped, flag); do_byte(&p_ptr->confusing, flag); - do_byte((byte*)&p_ptr->black_breath, flag); - do_byte((byte*)&fate_flag, flag); + do_bool(&p_ptr->black_breath, flag); + do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); - do_byte(&tmp8u, flag); do_byte(&p_ptr->preserve, flag); do_byte(&p_ptr->special, flag); - do_byte((byte*)&ambush_flag, flag); + do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); - do_s16b(&tmp16s, flag); - - do_byte(&tmp8u, flag); do_s16b(&no_breeds, flag); do_s16b(&p_ptr->protgood, flag); @@ -812,36 +762,32 @@ static bool_ do_extra(ls_flag_t flag) /* Auxilliary variables */ do_u32b(&p_ptr->mimic_extra, flag); do_u32b(&p_ptr->antimagic_extra, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); do_u32b(&p_ptr->music_extra, flag); - do_u32b(&tmp32u, flag); do_u32b(&p_ptr->necro_extra, flag); do_u32b(&p_ptr->necro_extra2, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u32b(&tmp32u, flag); - do_u16b(&p_ptr->body_monster, flag); - do_byte((byte*)&p_ptr->disembodied, flag); + do_bool(&p_ptr->disembodied, flag); /* Are we in astral mode? */ - do_byte((byte*)&p_ptr->astral, flag); + do_bool(&p_ptr->astral, flag); + + // Powers + { + u16b tmp16u = POWER_MAX; + + do_u16b(&tmp16u, flag); - if (flag == ls_flag_t::SAVE) tmp16s = POWER_MAX; - do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16s > POWER_MAX)) - note(format("Too many (%u) powers!", tmp16s)); - for (i = 0; i < POWER_MAX; i++) - do_byte((byte*)&p_ptr->powers_mod[i], flag); + if ((flag == ls_flag_t::LOAD) && (tmp16u != POWER_MAX)) + { + quit("Too few/many powers!"); + } - skip_ver_byte(100, flag); + for (std::size_t i = 0; i < POWER_MAX; i++) + { + do_bool(&p_ptr->powers_mod[i], flag); + } + } /* The tactic */ do_byte((byte*)&p_ptr->tactic, flag); @@ -853,43 +799,38 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->companion_killed, flag); /* The fate */ - do_byte((byte*)&p_ptr->no_mortal, flag); + do_bool(&p_ptr->no_mortal, flag); - /* The bounties -- kept only for load-compatibility with old savefiles. */ - for (i = 0; i < 24; i++) { - tmp16s = 0; do_s16b(&tmp16s, flag); - tmp16s = 0; do_s16b(&tmp16s, flag); - } - tmp32u = 0; do_u32b(&tmp32u, flag); /* Spells */ - do_s16b(&spell_num, flag); - for (i = 0; i < MAX_SPELLS; i++) - do_spells(i, flag); - do_s16b(&rune_num, flag); - for (i = 0; i < MAX_RUNES; i++) { - do_string(rune_spells[i].name, 30, flag); - do_s16b(&rune_spells[i].type, flag); - do_s16b(&rune_spells[i].rune2, flag); - do_s16b(&rune_spells[i].mana, flag); + do_s16b(&spell_num, flag); + for (std::size_t i = 0; i < MAX_SPELLS; i++) + { + do_spells(i, flag); + } + + do_s16b(&rune_num, flag); + + for (std::size_t i = 0; i < MAX_RUNES; i++) + { + do_string(rune_spells[i].name, 30, flag); + do_s16b(&rune_spells[i].type, flag); + do_s16b(&rune_spells[i].rune2, flag); + do_s16b(&rune_spells[i].mana, flag); + } } /* Load random seeds */ - do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */ do_u32b(&seed_flavor, flag); /* For consistent object flavors. */ - do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */ /* Special stuff */ - do_u16b(&tmp16b, flag); /* Dummy */ do_u16b(&total_winner, flag); do_u16b(&has_won, flag); do_u16b(&noscore, flag); /* Write death */ - if (flag == ls_flag_t::SAVE) tmp8u = death; - do_byte(&tmp8u, flag); - if (flag == ls_flag_t::LOAD) death = tmp8u; + do_bool(&death, flag); /* Incompatible module? */ if (flag == ls_flag_t::LOAD) @@ -906,10 +847,8 @@ static bool_ do_extra(ls_flag_t flag) } } - /* Write feeling */ - if (flag == ls_flag_t::SAVE) tmp8u = feeling; - do_byte(&tmp8u, flag); - if (flag == ls_flag_t::LOAD) feeling = tmp8u; + /* Level feeling */ + do_s16b(&feeling, flag); /* Turn of last "feeling" */ do_s32b(&old_turn, flag); @@ -926,8 +865,6 @@ static bool_ do_extra(ls_flag_t flag) */ static void do_monster(monster_type *m_ptr, ls_flag_t flag) { - int i; - /* Read the monster race */ do_s16b(&m_ptr->r_idx, flag); @@ -960,10 +897,13 @@ static void do_monster(monster_type *m_ptr, ls_flag_t flag) do_s32b(&m_ptr->mflag, flag); - if (flag == ls_flag_t::LOAD) m_ptr->mflag &= PERM_MFLAG_MASK; + if (flag == ls_flag_t::LOAD) + { + m_ptr->mflag &= PERM_MFLAG_MASK; + } /* Attacks */ - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { do_byte(&m_ptr->blow[i].method, flag); do_byte(&m_ptr->blow[i].effect, flag); @@ -1265,116 +1205,20 @@ static void do_grid(ls_flag_t flag) } } -static void my_sentinel(const char *place, u16b value, ls_flag_t flag) -/* This function lets us know exactly where a savefile is - broken by reading/writing conveniently a sentinel at this - spot */ +static bool do_objects(ls_flag_t flag, bool no_companions) { if (flag == ls_flag_t::SAVE) { - do_u16b(&value, flag); - return; - } - if (flag == ls_flag_t::LOAD) - { - u16b found; - do_u16b(&found, flag); - if (found == value) /* All is good */ - return; - /* All is bad */ - note(format("Savefile broken %s", place)); - return; - } - note(format("Impossible has occurred")); /* Programmer error */ - exit(0); -} - - - -/* - * Handle dungeon - * - * The monsters/objects must be loaded in the same order - * that they were stored, since the actual indexes matter. - */ -static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) -{ - cave_type *c_ptr; - - /* Read specific */ - u16b tmp16b = 0; - - my_sentinel("Before do_dungeon", 324, flag); - - /* Header info */ - do_s16b(&dun_level, flag); - do_byte(&dungeon_type, flag); - do_s16b(&num_repro, flag); - do_s16b(&p_ptr->py, flag); - do_s16b(&p_ptr->px, flag); - do_s16b(&cur_hgt, flag); - do_s16b(&cur_wid, flag); - do_s16b(&max_panel_rows, flag); - do_s16b(&max_panel_cols, flag); - - do_flag_set(&dungeon_flags, flag); - - /* Last teleportation */ - do_s16b(&last_teleportation_y, flag); - do_s16b(&last_teleportation_y, flag); - - /* Spell effects */ - tmp16b = MAX_EFFECTS; - do_u16b(&tmp16b, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16b > MAX_EFFECTS)) - { - quit("Too many spell effects"); - } - - for (std::size_t i = 0; i < tmp16b; ++i) - { - do_s16b(&effects[i].type, flag); - do_s16b(&effects[i].dam, flag); - do_s16b(&effects[i].time, flag); - do_u32b(&effects[i].flags, flag); - do_s16b(&effects[i].cx, flag); - do_s16b(&effects[i].cy, flag); - do_s16b(&effects[i].rad, flag); - } - - /* TO prevent bugs with evolving dungeons */ - for (std::size_t i = 0; i < 100; i++) - { - do_s16b(&floor_type[i], flag); - do_s16b(&fill_type[i], flag); - } - - if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest)) - { - int xstart = 0; - int ystart = 0; - /* Init the wilderness */ - process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, - TRUE, FALSE); - - /* Init the town */ - xstart = 0; - ystart = 0; - init_flags = 0; - process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, - TRUE, FALSE); + // Compact everything before saving + compact_objects(0); + compact_monsters(0); } - do_grid(flag); - - /*** Objects ***/ + u16b n_objects = o_max; - if (flag == ls_flag_t::SAVE) compact_objects(0); - if (flag == ls_flag_t::SAVE) compact_monsters(0); if (flag == ls_flag_t::SAVE) { - tmp16b = o_max; + u16b tmp16u = n_objects; if (no_companions) { @@ -1382,87 +1226,95 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { object_type *o_ptr = &o_list[i]; - if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) tmp16b--; + if (o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) + { + tmp16u--; + } } } - /* Item count */ - do_u16b(&tmp16b, flag); - - tmp16b = o_max; + do_u16b(&tmp16u, flag); } else - /* Read item count */ - do_u16b(&tmp16b, flag); + { + do_u16b(&n_objects, flag); + } /* Verify maximum */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_o_idx)) + if ((flag == ls_flag_t::LOAD) && (n_objects > max_o_idx)) { - note(format("Too many (%d) object entries!", tmp16b)); - return (FALSE); + note("Too many object entries!"); + return false; } /* Dungeon items */ - for (int i = 1; i < tmp16b; i++) + if (flag == ls_flag_t::SAVE) { - int o_idx; - - object_type *o_ptr; - - if (flag == ls_flag_t::SAVE) + for (std::size_t i = 1; i < n_objects; i++) { - o_ptr = &o_list[i]; - /* Don't save objects held by companions when no_companions is set */ - if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) continue; + auto o_ptr = &o_list[i]; + // Skip objects held by companions when no_companions is set + if (no_companions && o_ptr->held_m_idx && (m_list[o_ptr->held_m_idx].status == MSTATUS_COMPANION)) + { + continue; + } do_item(o_ptr, ls_flag_t::SAVE); - continue; /* Saving is easy */ } - /* Until the end of the loop, this is all ls_flag_t::LOAD */ - - /* Get a new record */ - o_idx = o_pop(); - - /* Oops */ - if (i != o_idx) + } + else if (flag == ls_flag_t::LOAD) + { + for (int i = 1; i < n_objects; i++) { - note(format("Object allocation error (%d <> %d)", i, o_idx)); - return (FALSE); - } + /* Get a new record */ + int o_idx = o_pop(); + /* Oops */ + if (i != o_idx) + { + note(format("Object allocation error (%d <> %d)", i, o_idx)); + return false; + } - /* Acquire place */ - o_ptr = &o_list[o_idx]; + /* Acquire place */ + auto o_ptr = &o_list[o_idx]; - /* Read the item */ - do_item(o_ptr, ls_flag_t::LOAD); + /* Read the item */ + do_item(o_ptr, ls_flag_t::LOAD); - /* Monster */ - if (o_ptr->held_m_idx) - { /* Monster */ - monster_type *m_ptr = &m_list[o_ptr->held_m_idx]; + if (o_ptr->held_m_idx) + { + /* Monster */ + monster_type *m_ptr = &m_list[o_ptr->held_m_idx]; - /* Place the object */ - m_ptr->hold_o_idxs.push_back(o_idx); - } + /* Place the object */ + m_ptr->hold_o_idxs.push_back(o_idx); + } - /* Dungeon */ - else - { - /* Access the item location */ - c_ptr = &cave[o_ptr->iy][o_ptr->ix]; + /* Dungeon */ + else + { + /* Access the item location */ + auto c_ptr = &cave[o_ptr->iy][o_ptr->ix]; - /* Place the object */ - c_ptr->o_idxs.push_back(o_idx); + /* Place the object */ + c_ptr->o_idxs.push_back(o_idx); + } } } - /*** Monsters ***/ + return true; +} + + +static bool do_monsters(ls_flag_t flag, bool no_companions) +{ + u16b n_monsters = m_max; if (flag == ls_flag_t::SAVE) { - tmp16b = m_max; + u16b tmp16u = m_max; if (no_companions) { @@ -1470,99 +1322,187 @@ static bool_ do_dungeon(ls_flag_t flag, bool_ no_companions) { monster_type *m_ptr = &m_list[i]; - if (m_ptr->status == MSTATUS_COMPANION) tmp16b--; + if (m_ptr->status == MSTATUS_COMPANION) + { + tmp16u--; + } } } - /* Write the monster count */ - do_u16b(&tmp16b, flag); - - tmp16b = m_max; + do_u16b(&tmp16u, flag); } else - /* Read the monster count */ - do_u16b(&tmp16b, flag); + { + do_u16b(&n_monsters, flag); + } /* Validate */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx)) + if ((flag == ls_flag_t::LOAD) && (n_monsters > max_m_idx)) { - note(format("Too many (%d) monster entries!", tmp16b)); - return (FALSE); + note("Too many monster entries!"); + return false; } - /* Read the monsters */ - for (int i = 1; i < tmp16b; i++) - { - int m_idx; - monster_type *m_ptr; - monster_race *r_ptr; + /* Load/save the monsters */ - if (flag == ls_flag_t::SAVE) + if (flag == ls_flag_t::SAVE) + { + for (std::size_t i = 1; i < n_monsters; i++) { - m_ptr = &m_list[i]; + auto m_ptr = &m_list[i]; - /* Don't save companions when no_companions is set */ - if (no_companions && m_ptr->status == MSTATUS_COMPANION) continue; + // Skip companions when no_companions is set + if (no_companions && m_ptr->status == MSTATUS_COMPANION) + { + continue; + } do_monster(m_ptr, ls_flag_t::SAVE); - continue; /* Easy to save a monster */ } - /* From here on, it's all ls_flag_t::LOAD */ - /* Get a new record */ - m_idx = m_pop(); - - /* Oops */ - if (i != m_idx) + } + else if (flag == ls_flag_t::LOAD) + { + for (int i = 1; i < n_monsters; i++) { - note(format("Monster allocation error (%d <> %d)", i, m_idx)); - return (FALSE); - } + /* Get a new record */ + int m_idx = m_pop(); - /* Acquire monster */ - m_ptr = &m_list[m_idx]; + /* Oops */ + if (i != m_idx) + { + note(format("Monster allocation error (%d <> %d)", i, m_idx)); + return false; + } - /* Read the monster */ - do_monster(m_ptr, ls_flag_t::LOAD); + /* Acquire monster */ + auto m_ptr = &m_list[m_idx]; - /* Access grid */ - c_ptr = &cave[m_ptr->fy][m_ptr->fx]; + /* Read the monster */ + do_monster(m_ptr, ls_flag_t::LOAD); - /* Mark the location */ - c_ptr->m_idx = m_idx; + /* Place in grid */ + auto c_ptr = &cave[m_ptr->fy][m_ptr->fx]; + c_ptr->m_idx = m_idx; - /* Controlled ? */ - if (m_ptr->mflag & MFLAG_CONTROL) - p_ptr->control = m_idx; + /* Controlled? */ + if (m_ptr->mflag & MFLAG_CONTROL) + { + p_ptr->control = m_idx; + } - /* Access race */ - r_ptr = &r_info[m_ptr->r_idx]; + /* Count as an alive member of race */ + auto r_ptr = &r_info[m_ptr->r_idx]; + r_ptr->cur_num++; + } + } + + /* Save/load pets */ + { + u16b tmp16u = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; - /* Count XXX XXX XXX */ - r_ptr->cur_num++; + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_m_idx)) + { + note("Too many monster entries!"); + return false; + } + + for (std::size_t i = 1; i < tmp16u; i++) + { + /* Acquire monster */ + auto m_ptr = &km_list[i]; + + /* Read the monster */ + do_monster(m_ptr, flag); + } } - /* Read the kept monsters */ + return true; +} - tmp16b = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; +/* + * Handle dungeon + * + * The monsters/objects must be loaded in the same order + * that they were stored, since the actual indexes matter. + */ +static bool_ do_dungeon(ls_flag_t flag, bool no_companions) +{ + /* Header info */ + do_s16b(&dun_level, flag); + do_byte(&dungeon_type, flag); + do_s16b(&num_repro, flag); + do_s16b(&p_ptr->py, flag); + do_s16b(&p_ptr->px, flag); + do_s16b(&cur_hgt, flag); + do_s16b(&cur_wid, flag); + do_s16b(&max_panel_rows, flag); + do_s16b(&max_panel_cols, flag); - /* Read the monster count */ - do_u16b(&tmp16b, flag); + do_flag_set(&dungeon_flags, flag); - /* Hack -- verify */ - if ((flag == ls_flag_t::LOAD) && (tmp16b > max_m_idx)) + /* Last teleportation */ + do_s16b(&last_teleportation_y, flag); + do_s16b(&last_teleportation_y, flag); + + /* Spell effects */ { - note(format("Too many (%d) monster entries!", tmp16b)); - return (FALSE); + u16b n_effects = MAX_EFFECTS; + do_u16b(&n_effects, flag); + + if ((flag == ls_flag_t::LOAD) && (n_effects > MAX_EFFECTS)) + { + quit("Too many spell effects"); + } + + for (std::size_t i = 0; i < n_effects; ++i) + { + do_s16b(&effects[i].type, flag); + do_s16b(&effects[i].dam, flag); + do_s16b(&effects[i].time, flag); + do_u32b(&effects[i].flags, flag); + do_s16b(&effects[i].cx, flag); + do_s16b(&effects[i].cy, flag); + do_s16b(&effects[i].rad, flag); + } + } + + /* To prevent bugs with evolving dungeons */ + for (std::size_t i = 0; i < 100; i++) + { + do_s16b(&floor_type[i], flag); + do_s16b(&fill_type[i], flag); } - for (std::size_t i = 1; i < tmp16b; i++) + + if ((flag == ls_flag_t::LOAD) && (!dun_level && !p_ptr->inside_quest)) { - monster_type *m_ptr; + int xstart = 0; + int ystart = 0; + /* Init the wilderness */ + process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, + TRUE, FALSE); - /* Acquire monster */ - m_ptr = &km_list[i]; + /* Init the town */ + xstart = 0; + ystart = 0; + init_flags = 0; + process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, + TRUE, FALSE); + } - /* Read the monster */ - do_monster(m_ptr, flag); + do_grid(flag); + + /*** Objects ***/ + if (!do_objects(flag, no_companions)) + { + return FALSE; + } + + /*** Monsters ***/ + if (!do_monsters(flag, no_companions)) + { + return FALSE; } /*** Success ***/ @@ -1591,7 +1531,7 @@ void save_dungeon(void) fff = my_fopen(name, "wb"); /* Save the dungeon */ - do_dungeon(ls_flag_t::SAVE, TRUE); + do_dungeon(ls_flag_t::SAVE, true); my_fclose(fff); } @@ -1620,41 +1560,13 @@ bool_ file_exist(cptr buf) /* * Handle monster lore */ -static void do_lore(int r_idx, ls_flag_t flag) +static void do_lore(std::size_t r_idx, ls_flag_t flag) { - byte tmp_u8 = 0; - u32b tmp_u32 = 0; - s16b tmp_s16 = 0; monster_race *r_ptr = &r_info[r_idx]; - do_s16b(&tmp_s16, flag); - do_s16b(&tmp_s16, flag); do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&tmp_s16, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_byte(&tmp_u8, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_u32b(&tmp_u32, flag); - do_s16b(&r_ptr->max_num, flag); - do_byte((byte*)&r_ptr->on_saved, flag); + do_bool(&r_ptr->on_saved, flag); } @@ -1665,44 +1577,39 @@ static void do_lore(int r_idx, ls_flag_t flag) */ static void do_store(store_type *str, ls_flag_t flag) { - byte store_inven_max = STORE_INVEN_MAX; - - /* Some basic info */ + // Store state do_s32b(&str->store_open, flag); do_u16b(&str->owner, flag); + do_s32b(&str->last_visit, flag); - /* Could be cleaner, done this way for benefit of the for loop later on */ - byte num; - if (flag == ls_flag_t::SAVE) + // Items in store { - num = str->stock.size(); - } - do_byte(&num, flag); + byte num = str->stock.size(); - /* Last visit */ - do_s32b(&str->last_visit, flag); + do_byte(&num, flag); - /* Items */ - for (int j = 0; j < num; j++) - { - if (flag == ls_flag_t::LOAD) + if (flag == ls_flag_t::SAVE) { - object_type forge; - /* Wipe the object */ - object_wipe(&forge); - /* Read the item */ - do_item(&forge, ls_flag_t::LOAD); - /* Acquire valid items */ - if ((str->stock.size() < store_inven_max) && (str->stock.size() < str->stock_size)) + for (std::size_t i = 0; i < num; i++) { - object_type stock_obj; - object_copy(&stock_obj, &forge); - str->stock.push_back(stock_obj); + do_item(&str->stock[i], ls_flag_t::SAVE); } } - if (flag == ls_flag_t::SAVE) + else if (flag == ls_flag_t::LOAD) { - do_item(&str->stock[j], flag); + for (std::size_t i = 0; i < num; i++) + { + object_type forge; + object_wipe(&forge); + do_item(&forge, ls_flag_t::LOAD); + + if ((str->stock.size() < STORE_INVEN_MAX) && (str->stock.size() < str->stock_size)) + { + object_type stock_obj; + object_copy(&stock_obj, &forge); + str->stock.push_back(stock_obj); + } + } } } } @@ -1712,18 +1619,11 @@ static void do_store(store_type *str, ls_flag_t flag) */ static void do_randomizer(ls_flag_t flag) { - int i; - - u16b tmp16u = 0; - - /* Tmp */ - do_u16b(&tmp16u, flag); - /* Place */ do_u16b(&Rand_place, flag); /* State */ - for (i = 0; i < RAND_DEG; i++) + for (std::size_t i = 0; i < RAND_DEG; i++) { do_u32b(&Rand_state[i], flag); } @@ -1786,8 +1686,8 @@ static void do_options(ls_flag_t flag) do_u16b(&c, ls_flag_t::SAVE); } - do_byte((byte*)&autosave_l, flag); - do_byte((byte*)&autosave_t, flag); + do_bool(&autosave_l, flag); + do_bool(&autosave_t, flag); do_s16b(&autosave_freq, flag); if (flag == ls_flag_t::LOAD) @@ -1996,16 +1896,16 @@ static bool_ do_inventory(ls_flag_t flag) } if (flag == ls_flag_t::SAVE) { - u16b i; - u16b sent = 0xFFFF; - for (i = 0; i < INVEN_TOTAL; i++) + for (u16b i = 0; i < INVEN_TOTAL; i++) { object_type *o_ptr = &p_ptr->inventory[i]; if (!o_ptr->k_idx) continue; do_u16b(&i, flag); do_item(o_ptr, flag); } - do_u16b(&sent, ls_flag_t::SAVE); /* Sentinel */ + // Sentinel + u16b sent = 0xFFFF; + do_u16b(&sent, ls_flag_t::SAVE); } /* Success */ return (TRUE); @@ -2031,13 +1931,11 @@ static void do_messages(ls_flag_t flag) /* Read the messages */ if (flag == ls_flag_t::LOAD) { - byte tmp8u = 0; for (i = 0; i < num; i++) { /* Read the message */ do_string(buf, 128, ls_flag_t::LOAD); do_byte(&color, flag); - do_byte(&tmp8u, flag); /* Save the message */ message_add(buf, color); @@ -2046,13 +1944,11 @@ static void do_messages(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { byte holder; - byte zero = 0; for (i = num - 1; i >= 0; i--) { do_string((char *)message_str((s16b)i), 0, ls_flag_t::SAVE); holder = message_color((s16b)i); do_byte(&holder, flag); - do_byte(&zero, flag); } } } @@ -2082,7 +1978,7 @@ bool_ load_dungeon(char *ext) } /* Read the dungeon */ - if (!do_dungeon(ls_flag_t::LOAD, FALSE)) + if (!do_dungeon(ls_flag_t::LOAD, false)) { dun_level = old_dun; dungeon_type = old_dungeon_type; @@ -2099,23 +1995,6 @@ bool_ load_dungeon(char *ext) return (TRUE); } -void do_fate(int i, ls_flag_t flag) -{ - if ((flag == ls_flag_t::LOAD) && (i >= MAX_FATES)) i = MAX_FATES - 1; - - do_byte(&fates[i].fate, flag); - do_byte(&fates[i].level, flag); - do_byte(&fates[i].serious, flag); - do_s16b(&fates[i].o_idx, flag); - do_s16b(&fates[i].e_idx, flag); - do_s16b(&fates[i].a_idx, flag); - do_s16b(&fates[i].v_idx, flag); - do_s16b(&fates[i].r_idx, flag); - do_s16b(&fates[i].count, flag); - do_s16b(&fates[i].time, flag); - do_byte((byte*)&fates[i].know, flag); -} - /* * Load/save timers. */ @@ -2136,7 +2015,6 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { - u16b tmp16u; u16b real_max = 0; /* Note that this forbids max_towns from shrinking, but that is fine */ @@ -2154,55 +2032,391 @@ static void do_stores(ls_flag_t flag) do_u16b(&real_max, flag); for (int i = 0; i < real_max; i++) { - do_byte((byte*)&reals[i], flag); + do_byte(&reals[i], flag); } /* Read the stores */ - if (flag == ls_flag_t::SAVE) tmp16u = max_st_idx; - do_u16b(&tmp16u, flag); - assert(tmp16u <= max_st_idx); + u16b n_stores = max_st_idx; + do_u16b(&n_stores, flag); + assert(n_stores <= max_st_idx); - /* Ok now read the real towns */ for (int i = 0; i < real_max; i++) { int z = reals[i]; - /* Ultra paranoia */ - if (!town_info[z].stocked) create_stores_stock(z); + if (!town_info[z].stocked) + { + create_stores_stock(z); + } - for (int j = 0; j < tmp16u; j++) + for (int j = 0; j < n_stores; j++) { do_store(&town_info[z].store[j], flag); } } } +/* + * Monster memory + */ +static bool do_monster_lore(ls_flag_t flag) +{ + u16b tmp16u = max_r_idx; + + do_u16b(&tmp16u, flag); + + if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) + { + note("Too many monster races!"); + return false; + } + + for (std::size_t i = 0; i < tmp16u; i++) + { + do_lore(i, flag); + } + + return true; +} + + +/* + * Object memory + */ +static bool do_object_lore(ls_flag_t flag) +{ + u16b n_kinds = max_k_idx; + + do_u16b(&n_kinds, flag); + + if ((flag == ls_flag_t::LOAD) && (n_kinds > max_k_idx)) + { + note("Too many object kinds!"); + return false; + } + + for (std::size_t i = 0; i < n_kinds; i++) + { + object_kind *k_ptr = &k_info[i]; + do_bool(&k_ptr->aware, flag); + do_bool(&k_ptr->tried, flag); + do_bool(&k_ptr->artifact, flag); + } + + return true; +} + + /* * Note that this function may not be needed at all. * It was taken out of load_player_aux(). Do we need it? */ static void junkinit(void) { - int i, j; p_ptr->inside_quest = 0; p_ptr->town_num = 1; p_ptr->wilderness_x = 4; p_ptr->wilderness_y = 4; - for (i = 0; i < max_wild_x; i++) + for (std::size_t i = 0; i < max_wild_x; i++) { - for (j = 0; j < max_wild_y; j++) + for (std::size_t j = 0; j < max_wild_y; j++) { wild_map[j][i].seed = rand_int(0x10000000); } } } -static void morejunk(void) +static bool do_towns(ls_flag_t flag) +{ + u16b max_towns_ldsv = max_towns; + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns)) + { + note("Too many towns!"); + return false; + } + + if (flag == ls_flag_t::SAVE) + { + max_towns_ldsv = TOWN_RANDOM; + } + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM)) + { + note("Different random towns base!"); + return false; + } + + for (std::size_t i = 0; i < max_towns; i++) + { + auto town = &town_info[i]; + + do_bool(&town->destroyed, flag); + + if (i >= TOWN_RANDOM) + { + do_u32b(&town->seed, flag); + do_byte(&town->flags, flag); + + // Create stock if necessary + if ((town_info->flags & TOWN_REAL) && (flag == ls_flag_t::LOAD)) + { + create_stores_stock(i); + } + } + } + + if (flag == ls_flag_t::SAVE) + { + max_towns_ldsv = max_d_idx; + } + + do_u16b(&max_towns_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) + { + note("Too many dungeon types!"); + return false; + } + + // Town quest entrances + u16b max_quests_ldsv = TOWN_DUNGEON; + do_u16b(&max_quests_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON)) + { + note("Too many town per dungeons!"); + return false; + } + + for (std::size_t i = 0; i < max_towns_ldsv; i++) + { + for (std::size_t j = 0; j < max_quests_ldsv; j++) + { + do_s16b(&(d_info[i].t_idx[j]), flag); + do_s16b(&(d_info[i].t_level[j]), flag); + } + do_s16b(&(d_info[i].t_num), flag); + } + + return true; +} + +static bool do_quests(ls_flag_t flag) +{ + u16b max_quests_ldsv = MAX_Q_IDX; + + do_u16b(&max_quests_ldsv, flag); + + if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) + { + note("Invalid number of quests!"); + return false; + } + + for (std::size_t i = 0; i < MAX_Q_IDX; i++) + { + auto q = &quest[i]; + + do_s16b(&q->status, flag); + for (auto &quest_data : q->data) + { + do_s32b(&quest_data, flag); + } + + // Initialize the quest if necessary + if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) + { + q->init(i); + } + } + + return true; +} + +static bool do_wilderness(ls_flag_t flag) +{ + // Player position and "mode" wrt. wilderness + do_s32b(&p_ptr->wilderness_x, flag); + do_s32b(&p_ptr->wilderness_y, flag); + do_bool(&p_ptr->wild_mode, flag); + do_bool(&p_ptr->old_wild_mode, flag); + + // Size of the wilderness + u16b wild_x_size = max_wild_x; + u16b wild_y_size = max_wild_y; + do_u16b(&wild_x_size, flag); + do_u16b(&wild_y_size, flag); + + if (flag == ls_flag_t::LOAD) + { + if ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y)) + { + note("Wilderness is too big!"); + return false; + } + } + + // Save/load wilderness tile state + for (std::size_t i = 0; i < wild_x_size; i++) + { + for (std::size_t j = 0; j < wild_y_size; j++) + { + auto w = &wild_map[j][i]; + do_u32b(&w->seed, flag); + do_u16b(&w->entrance, flag); + do_bool(&w->known, flag); + } + } + + return true; +} + +static bool do_randarts(ls_flag_t flag) { - rp_ptr = &race_info[p_ptr->prace]; /* Raceclass */ - rmp_ptr = &race_mod_info[p_ptr->pracem]; - cp_ptr = &class_info[p_ptr->pclass]; - spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; + u16b n_randarts = MAX_RANDARTS; + + do_u16b(&n_randarts, flag); + + if ((flag == ls_flag_t::LOAD) && (n_randarts > MAX_RANDARTS)) + { + note("Too many random artifacts!"); + return false; + } + + for (std::size_t i = 0; i < n_randarts; i++) + { + random_artifact *ra_ptr = &random_artifacts[i]; + + do_string(ra_ptr->name_full, 80, flag); + do_string(ra_ptr->name_short, 80, flag); + do_byte(&ra_ptr->level, flag); + do_byte(&ra_ptr->attr, flag); + do_u32b(&ra_ptr->cost, flag); + do_byte(&ra_ptr->activation, flag); + do_byte(&ra_ptr->generated, flag); + } + + return true; +} + +static bool do_artifacts(ls_flag_t flag) +{ + u16b n_artifacts; + + if (flag == ls_flag_t::SAVE) + { + n_artifacts = max_a_idx; + } + + do_u16b(&n_artifacts, flag); + + if ((flag == ls_flag_t::LOAD) && (n_artifacts > max_a_idx)) + { + note("Too many artifacts!"); + return false; + } + + for (std::size_t i = 0; i < n_artifacts; i++) + { + do_byte(&(&a_info[i])->cur_num, flag); + } + + return true; +} + +static bool do_fates(ls_flag_t flag) +{ + u16b n_fates = MAX_FATES; + + do_u16b(&n_fates, flag); + + if ((flag == ls_flag_t::LOAD) && (n_fates > MAX_FATES)) + { + note("Too many fates!"); + return false; + } + + for (std::size_t i = 0; i < n_fates; i++) + { + auto fate = &fates[i]; + do_byte(&fate->fate, flag); + do_byte(&fate->level, flag); + do_byte(&fate->serious, flag); + do_s16b(&fate->o_idx, flag); + do_s16b(&fate->e_idx, flag); + do_s16b(&fate->a_idx, flag); + do_s16b(&fate->v_idx, flag); + do_s16b(&fate->r_idx, flag); + do_s16b(&fate->count, flag); + do_s16b(&fate->time, flag); + do_bool(&fate->know, flag); + } + + return true; +} + +static bool do_traps(ls_flag_t flag) +{ + u16b n_traps = max_t_idx; + + do_u16b(&n_traps, flag); + + if ((flag == ls_flag_t::LOAD) && (n_traps > max_t_idx)) + { + note("Too many traps!"); + return false; + } + + for (std::size_t i = 0; i < n_traps; i++) + { + do_bool(&t_info[i].ident, flag); + } + + return true; +} + +static bool do_floor_inscriptions(ls_flag_t flag) +{ + u16b n_inscriptions = MAX_INSCRIPTIONS; + do_u16b(&n_inscriptions, flag); + + if ((flag == ls_flag_t::LOAD) && (n_inscriptions > MAX_INSCRIPTIONS)) + { + note("Too many inscriptions!"); + return false; + } + + for (std::size_t i = 0; i < n_inscriptions; i++) + { + do_bool(&inscription_info[i].know, flag); + } + + return true; +} + +static bool do_player_hd(ls_flag_t flag) +{ + u16b max_level = PY_MAX_LEVEL; + + do_u16b(&max_level, flag); + + if ((flag == ls_flag_t::LOAD) && (max_level > PY_MAX_LEVEL)) + { + note("Too many hitpoint entries!"); + return false; + } + + for (std::size_t i = 0; i < max_level; i++) + { + do_s16b(&player_hp[i], flag); + } + + return true; } @@ -2211,23 +2425,14 @@ static void morejunk(void) */ static bool_ do_savefile_aux(ls_flag_t flag) { - int i, j; - - byte tmp8u; - u16b tmp16u; - /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) { - if (vernum < 100) + if (vernum != SAVEFILE_VERSION) { - note(format("Savefile version %lu too old! ", vernum)); + note("Incompatible save file version"); return FALSE; } - else - { - note(format("Loading version %lu savefile... ", vernum)); - } } if (flag == ls_flag_t::SAVE) { @@ -2238,26 +2443,15 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Handle version bytes */ if (flag == ls_flag_t::LOAD) { - u32b mt32b; - byte mtbyte; - /* Discard all this, we've already read it */ + u32b mt32b; do_u32b(&mt32b, flag); - do_byte(&mtbyte, flag); } if (flag == ls_flag_t::SAVE) { u32b saver; saver = SAVEFILE_VERSION; do_u32b(&saver, flag); - tmp8u = (byte)rand_int(256); - do_byte(&tmp8u, flag); /* 'encryption' */ - } - - /* Kept only for compatibility; always set to 0 */ - { - u32b tmp32u = 0; - do_u32b(&tmp32u, flag); } /* Time of last save */ @@ -2271,7 +2465,9 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Game module */ if (flag == ls_flag_t::SAVE) + { strcpy(loaded_game_module, game_module); + } do_string(loaded_game_module, 80, flag); /* Timers */ @@ -2281,7 +2477,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_randomizer(flag); /* Automatizer state */ - do_byte((byte*)&automatizer_enabled, flag); + do_bool(&automatizer_enabled, flag); /* Then the options */ do_options(flag); @@ -2289,283 +2485,82 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* Then the "messages" */ do_messages(flag); - /* Monster Memory */ - if (flag == ls_flag_t::SAVE) tmp16u = max_r_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) - { - note(format("Too many (%u) monster races!", tmp16u)); - return (FALSE); - } - - /* Read the available records */ - for (i = 0; i < tmp16u; i++) + if (!do_monster_lore(flag)) { - /* Read the lore */ - do_lore(i, flag); + return FALSE; } - /* Object Memory */ - if (flag == ls_flag_t::SAVE) tmp16u = max_k_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_k_idx)) + if (!do_object_lore(flag)) { - note(format("Too many (%u) object kinds!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the object memory */ - for (i = 0; i < tmp16u; i++) do_xtra(i, flag); - if (flag == ls_flag_t::LOAD) junkinit(); - + // Initialize + if (flag == ls_flag_t::LOAD) { - u16b max_towns_ldsv; - u16b max_quests_ldsv; - if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_towns; - /* Number of towns */ - do_u16b(&max_towns_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_towns)) - { - note(format("Too many (%u) towns!", max_towns_ldsv)); - return (FALSE); - } - /* Min of random towns */ - if (flag == ls_flag_t::SAVE) max_towns_ldsv = TOWN_RANDOM; - do_u16b(&max_towns_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv != TOWN_RANDOM)) - { - note(format("Different random towns base (%u)!", max_towns_ldsv)); - return (FALSE); - } - - for (i = 0; i < max_towns; i++) - { - do_byte((byte*)&town_info[i].destroyed, flag); - - if (i >= TOWN_RANDOM) - { - do_u32b(&town_info[i].seed, flag); - do_byte(&tmp8u, flag); - do_byte(&town_info[i].flags, flag); - - /* If the town is realy used create a sock */ - if ((town_info[i].flags & (TOWN_REAL)) && (flag == ls_flag_t::LOAD)) - { - create_stores_stock(i); - } - } - } - - /* Number of dungeon */ - if (flag == ls_flag_t::SAVE) max_towns_ldsv = max_d_idx; - do_u16b(&max_towns_ldsv, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) - { - note(format("Too many dungeon types (%u)!", max_towns_ldsv)); - return (FALSE); - } - - /* Number of towns per dungeon */ - if (flag == ls_flag_t::SAVE) max_quests_ldsv = TOWN_DUNGEON; - do_u16b(&max_quests_ldsv, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv > TOWN_DUNGEON)) - { - note(format("Too many town per dungeons (%u)!", max_quests_ldsv)); - return (FALSE); - } - - for (i = 0; i < max_towns_ldsv; i++) - { - for (j = 0; j < max_quests_ldsv; j++) - { - do_s16b(&(d_info[i].t_idx[j]), flag); - do_s16b(&(d_info[i].t_level[j]), flag); - } - do_s16b(&(d_info[i].t_num), flag); - } - - /* Sanity check number of quests */ - if (flag == ls_flag_t::SAVE) max_quests_ldsv = MAX_Q_IDX; - do_u16b(&max_quests_ldsv, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) - { - note(format("Invalid number of quests (%u)!", max_quests_ldsv)); - return (FALSE); - } - - for (i = 0; i < MAX_Q_IDX; i++) - { - do_s16b(&quest[i].status, flag); - for (auto &quest_data : quest[i].data) - { - do_s32b(&quest_data, flag); - } - - /* Init the hooks */ - if ((flag == ls_flag_t::LOAD) && (quest[i].init != NULL)) - { - quest[i].init(i); - } - } - - /* Position in the wilderness */ - do_s32b(&p_ptr->wilderness_x, flag); - do_s32b(&p_ptr->wilderness_y, flag); - do_byte((byte*)&p_ptr->wild_mode, flag); - do_byte((byte*)&p_ptr->old_wild_mode, flag); - - { - s32b wild_x_size, wild_y_size; - if (flag == ls_flag_t::SAVE) - { - wild_x_size = max_wild_x; - wild_y_size = max_wild_y; - } - /* Size of the wilderness */ - do_s32b(&wild_x_size, flag); - do_s32b(&wild_y_size, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && - ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y))) - { - note(format("Wilderness is too big (%u/%u)!", - wild_x_size, wild_y_size)); - return (FALSE); - } - /* Wilderness seeds */ - for (i = 0; i < wild_x_size; i++) - { - for (j = 0; j < wild_y_size; j++) - { - do_u32b(&wild_map[j][i].seed, flag); - do_u16b(&wild_map[j][i].entrance, flag); - do_byte((byte*)&wild_map[j][i].known, flag); - } - } - } + junkinit(); } - /* Load the random artifacts. */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_RANDARTS; - do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_RANDARTS)) - { - note(format("Too many (%u) random artifacts!", tmp16u)); - return (FALSE); - } - for (i = 0; i < tmp16u; i++) + if (!do_towns(flag)) { - random_artifact *ra_ptr = &random_artifacts[i]; - - do_string(ra_ptr->name_full, 80, flag); - do_string(ra_ptr->name_short, 80, flag); - do_byte(&ra_ptr->level, flag); - do_byte(&ra_ptr->attr, flag); - do_u32b(&ra_ptr->cost, flag); - do_byte(&ra_ptr->activation, flag); - do_byte(&ra_ptr->generated, flag); + return FALSE; } - /* Load the Artifacts */ - if (flag == ls_flag_t::SAVE) tmp16u = max_a_idx; - do_u16b(&tmp16u, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_a_idx)) + if (!do_quests(flag)) { - note(format("Too many (%u) artifacts!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the artifact flags */ - for (i = 0; i < tmp16u; i++) + if (!do_wilderness(flag)) { - do_byte(&(&a_info[i])->cur_num, flag); + return FALSE; } - /* Fates */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_FATES; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_FATES)) + if (!do_randarts(flag)) { - note(format("Too many (%u) fates!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the fate flags */ - for (i = 0; i < tmp16u; i++) + if (!do_artifacts(flag)) { - do_fate(i, flag); + return FALSE; } - /* Load the Traps */ - if (flag == ls_flag_t::SAVE) tmp16u = max_t_idx; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_t_idx)) + if (!do_fates(flag)) { - note(format("Too many (%u) traps!", tmp16u)); - return (FALSE); + return FALSE; } - /* fate flags */ - for (i = 0; i < tmp16u; i++) + if (!do_traps(flag)) { - do_byte((byte*)&t_info[i].ident, flag); + return FALSE; } - /* inscription knowledge */ - if (flag == ls_flag_t::SAVE) tmp16u = MAX_INSCRIPTIONS; - do_u16b(&tmp16u, flag); - - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_INSCRIPTIONS)) + if (!do_floor_inscriptions(flag)) { - note(format("Too many (%u) inscriptions!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the inscription flag */ - for (i = 0; i < tmp16u; i++) - do_byte((byte*)&inscription_info[i].know, flag); - - - /* Read the extra stuff */ if (!do_extra(flag)) + { return FALSE; + } - - /* player_hp array */ - if (flag == ls_flag_t::SAVE) tmp16u = PY_MAX_LEVEL; - do_u16b(&tmp16u, flag); - /* Incompatible save files */ - if ((flag == ls_flag_t::LOAD) && (tmp16u > PY_MAX_LEVEL)) + if (!do_player_hd(flag)) { - note(format("Too many (%u) hitpoint entries!", tmp16u)); - return (FALSE); + return FALSE; } - /* Read the player_hp array */ - for (i = 0; i < tmp16u; i++) + if (flag == ls_flag_t::LOAD) { - do_s16b(&player_hp[i], flag); + // Make sure that the auxiliary pointers for player + // class, race, etc. point to the right places. + rp_ptr = &race_info[p_ptr->prace]; + rmp_ptr = &race_mod_info[p_ptr->pracem]; + cp_ptr = &class_info[p_ptr->pclass]; + spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; } - if (flag == ls_flag_t::LOAD) morejunk(); - /* Read the pet command settings */ do_byte(&p_ptr->pet_follow_distance, flag); do_byte(&p_ptr->pet_open_doors, flag); @@ -2575,10 +2570,13 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_s16b(&p_ptr->dripping_tread, flag); /* Read the inventory */ - if (!do_inventory(flag) && (flag == ls_flag_t::LOAD)) /* do NOT reverse this ordering */ + if (!do_inventory(flag)) { - note("Unable to read inventory"); - return (FALSE); + if (flag == ls_flag_t::LOAD) + { + note("Unable to read inventory"); + return FALSE; + } } /* Stores */ @@ -2588,35 +2586,25 @@ static bool_ do_savefile_aux(ls_flag_t flag) if (!death) { /* Dead players have no dungeon */ - if (flag == ls_flag_t::LOAD) note("Restoring Dungeon..."); - if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, FALSE))) + if (flag == ls_flag_t::LOAD) + { + note("Restoring Dungeon..."); + } + + if ((flag == ls_flag_t::LOAD) && (!do_dungeon(ls_flag_t::LOAD, false))) { note("Error reading dungeon data"); - return (FALSE); + return FALSE; } - if (flag == ls_flag_t::SAVE) do_dungeon(ls_flag_t::SAVE, FALSE); - my_sentinel("Before ghost data", 435, flag); - my_sentinel("After ghost data", 320, flag); - } - { - byte foo = 0; if (flag == ls_flag_t::SAVE) { - /* - * Safety Padding. It's there - * for a good reason. Trust me on - * this. Keep this at the *END* - * of the file, and do *NOT* try to - * read it. Insert any new stuff before - * this position. - */ - do_byte(&foo, ls_flag_t::SAVE); + do_dungeon(ls_flag_t::SAVE, false); } } /* Success */ - return (TRUE); + return TRUE; } @@ -2711,14 +2699,11 @@ bool_ load_player(void) /* Process file */ if (!err) { - byte tmp8u = 0; - /* Open the file XXX XXX XXX XXX Should use Angband file interface */ fff = my_fopen(savefile, "rb"); /* Read the first four bytes */ do_u32b(&vernum, ls_flag_t::LOAD); - do_byte(&tmp8u, ls_flag_t::LOAD); // For comatibility with old savefiles my_fclose(fff); -- cgit v1.2.3 From 68d77669646e9a51bb622bdced5be948c58791e2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove unused fields in player_{class,race,race_mod} structs --- lib/edit/p_info.txt | 46 ---------------------- lib/mods/theme/edit/p_info.txt | 66 ------------------------------- src/init1.cc | 88 ------------------------------------------ src/loadsave.cc | 9 ----- src/player_class.hpp | 28 -------------- src/player_race.hpp | 9 ----- src/player_race_mod.hpp | 9 ----- 7 files changed, 255 deletions(-) diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index 04706321..fc5f2069 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -29,7 +29,6 @@ G:k:+1000:+1000:Magic-Device # C:D:1:titles # C:S:str:int:wis:dex:con:chr:mana:bonus blows # C:K:dis:dev:sav:stl:srh:fos:thn:thb -# C:X:dis:dev:sav:stl:srh:fos:thn:thb # C:P:hitdie:xp% # C:B:num:wgt:mul # C:C:(H|L):(H|L):base:pl:plus @@ -65,8 +64,6 @@ C:D:1:Baron C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:5 C:C:H:L:9000:2:40 C:P:9:0 @@ -197,8 +194,6 @@ C:D:1:Sorcerer C:D:1:Ipsissimus C:D:1:Archimage C:S:-5:3:0:1:-2:1:50:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:40:2 C:C:L:H:240000:1:5 C:P:0:30 @@ -354,8 +349,6 @@ C:D:1:Archer C:D:1:Archer C:D:1:Great Archer C:S:2:1:0:2:1:1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:35:4 C:C:H:L:9000:2:40 C:P:4:30 @@ -423,8 +416,6 @@ C:D:1:Master Thief C:D:1:Assassin C:D:1:Guildmaster C:S:2:1:-2:3:1:-1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:3 C:C:H:H:20000:2:40 C:P:6:25 @@ -518,8 +509,6 @@ C:D:1:Lorekeeper C:D:1:Loremaster C:D:1:Loremaster C:S:1:-2:1:1:0:1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:3 C:C:H:L:9000:2:40 C:P:8:40 @@ -682,8 +671,6 @@ C:D:1:Cardinal C:D:1:Inquisitor C:D:1:Pope C:S:-1:-3:3:-1:0:2:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:35:3 C:C:L:H:10000:2:40 C:P:2:20 @@ -784,8 +771,6 @@ C:D:1:Baron C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:6:30:5 C:C:H:L:9000:2:40 C:P:9:0 @@ -841,7 +826,6 @@ R:D:Humans are the second born, the Edain. R:D:They are the basic race to which all others are compared. R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 -R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 R:E:1:1:1:2:1:1 R:C:Archer @@ -854,7 +838,6 @@ R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 -R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 R:E:1:1:1:2:1:1 R:C:Archer @@ -877,7 +860,6 @@ R:D:Elves are the first born, the Eldar. R:D:More spiritual than physical beings, they are weaker than humans R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 -R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 R:E:1:1:1:2:1:1 R:R:1:0 @@ -900,7 +882,6 @@ R:N:3:Hobbit R:D:An old but quiet race related to humans. R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 -R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 R:E:1:1:1:2:1:1 R:Z:create food @@ -926,7 +907,6 @@ R:N:4:Gnome R:D:Related to dwarves, Gnomes are between Dwarves and Hobbits in size. R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 -R:K:10:12:12:3:6:13:-8:12 R:P:8:135:4:13 R:E:1:1:1:2:1:1 R:Z:blink @@ -947,7 +927,6 @@ R:N:5:Dwarf R:D:The children of Aule, a strong but small race. R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 -R:K:2:9:10:-1:7:10:15:0 R:P:11:125:5:16 R:E:1:1:1:2:1:1 R:Z:find secret passages @@ -967,7 +946,6 @@ R:k:+500:+000:Archery R:N:6:Orc R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 -R:K:-3:-3:-3:-1:0:7:12:-5 R:P:10:110:3:25 R:E:1:1:1:2:1:1 R:Z:remove fear @@ -989,7 +967,6 @@ R:N:7:Troll R:D:They can bear the light of the sun. R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 -R:K:-5:-8:-8:-2:-1:5:20:-10 R:P:12:137:3:22 R:E:1:1:1:2:1:1 R:Z:berserk @@ -1010,7 +987,6 @@ R:N:8:Dunadan R:D:The greatest of the Edain, humans in all respects but R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 -R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 R:E:1:1:1:2:1:1 R:R:1:0 @@ -1035,7 +1011,6 @@ R:D:Elves are the first born, the Eldar. R:D:High elves are the best of the Eldar, strong, fast, intellectual, though R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 -R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 R:E:1:1:1:2:1:1 R:R:1:0 @@ -1059,7 +1034,6 @@ R:N:10:Half-Ogre R:D:A crossbreed between a human and an ogre. R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 -R:K:-3:-5:-5:-2:-1:5:20:0 R:P:12:130:3:74 R:E:1:1:1:2:1:1 R:Z:set explosive rune @@ -1080,7 +1054,6 @@ R:N:11:Beorning R:D:A race of men shapeshifters. R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 -R:K:-6:-8:-6:-2:-1:5:25:5 R:P:12:150:3:75 R:E:1:1:1:2:1:1 R:Z:turn into a bear @@ -1103,7 +1076,6 @@ R:k:+500:+000:Archery R:N:12:Kobold R:D:A weaker kind of goblin, related to orcs. R:S:1:-1:0:1:0:-4:0 -R:K:-2:-3:-2:-1:1:8:10:-8 R:P:9:125:3:82 R:E:1:1:1:2:1:1 R:Z:poison dart @@ -1124,7 +1096,6 @@ R:N:13:Petty-Dwarf R:D:A nearly extinct subrace of dwarves. R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 -R:K:3:5:10:1:5:10:9:0 R:P:11:135:5:87 R:E:1:1:1:2:1:1 R:Z:detect doors and traps @@ -1146,7 +1117,6 @@ R:D:Elves are the first born, the Eldar. R:D:Dark elves are rare on Middle-earth and even though not evil R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 -R:K:5:15:20:3:8:12:-5:10 R:P:9:150:5:69 R:E:1:1:1:2:1:1 R:Z:magic missile @@ -1173,7 +1143,6 @@ R:N:15:Ent R:D:Guardian of the forests of Middle-earth, summoned by Yavanna before R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 -R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 R:E:1:1:1:2:1:1 R:Z:grow trees @@ -1209,7 +1178,6 @@ R:N:16:RohanKnight R:D:Humans from the land of Rohan, riding the great Mearas. R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 -R:K:10:5:5:-8:1:1:5:5 R:P:10:220:0:84 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers @@ -1247,7 +1215,6 @@ R:N:17:Thunderlord R:D:A thunderlord is a Great Eagle of Manwe, ridden by a Maia of Manwe. R:D:They carry the power of wind and thunder. R:S:6:2:1:1:3:8:2 -R:K:6:0:10:-16:30:10:15:5 R:P:12:400:0:89 R:E:1:1:1:2:1:1 R:Z:Thunderlord's Powers @@ -1283,7 +1250,6 @@ R:N:18:DeathMold R:D:A pure mass of evilness, DeathMolds cannot move, but they have much more R:D:power than an average race. R:S:10:0:10:0:10:-15:-5 -R:K:15:-5:15:25:0:10:25:25 R:P:15:250:10:100 R:E:1:1:1:4:0:0 R:Z:Death Mold's Powers @@ -1307,7 +1273,6 @@ R:k:+2500:+000:Archery R:N:19:Yeek R:D:The weakest of all the races, bad at everything except gaining levels quickly. R:S:-5:-5:-5:-5:-5:-5:-5 -R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 R:E:1:1:1:2:1:1 R:C:Archer @@ -1328,7 +1293,6 @@ R:N:20:Wood-Elf R:D:Elves are the first born, the Eldar. R:D:Wood elves live in the great forests of Middle-earth. R:S:-3:2:1:5:-4:1:0 -R:K:5:6:6:5:8:12:-25:40 R:P:7:130:4:5 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW @@ -1355,7 +1319,6 @@ R:N:21:Maia R:D:An old race, dating from before the creation of Arda, the Maiar were R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 -R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:91 R:E:1:1:1:2:1:1 R:G:NO_GOD @@ -1456,7 +1419,6 @@ I: S:N:0: S:D:A:A normal member of the race. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1488,7 +1450,6 @@ S:N:1:Vampire S:D:B:Vampires are powerful undead, wielding great powers. They still fear the S:D:B:sunlight and cannot easily satiate their hunger. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1514,7 +1475,6 @@ S:N:2:Spectre S:D:B:Spectres only partially exist in the mortal world and so they can S:D:B:pass through walls. They are somewhat physically weak. S:S:-5:1:1:2:-3:-6:-3:105 -S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1562,7 +1522,6 @@ S:N:3:Skeleton S:D:B:Yet an other kind of undead. Their physical 'body' is not very vulnerable S:D:B:to sharp things. S:S:0:-2:-2:0:1:-4:-3:70 -S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1606,7 +1565,6 @@ S:k:+000:+000:Archery S:N:4:Zombie S:D:B:Strong and dumb is a zombie. S:S:2:-6:-6:1:4:-5:-4:70 -S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1650,7 +1608,6 @@ S:k:+000:+000:Archery S:N:5:Barbarian S:D:A:Hardy members of their race, they are strong fighters but poor spellcasters. S:S:2:-3:-2:1:1:-3:1:50 -S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1674,7 +1631,6 @@ S:N:6:Hermit S:D:A:Through years of isolation hermits can manage to increase their mana S:D:A:reserves but at the cost of an increased physical weakness. S:S:-3:1:1:-3:-3:1:0:120 -S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 S:E:0:0:0:0:0:0 S:A:Dark-Elf @@ -1707,7 +1663,6 @@ S:k:-500:+000:Archery S:N:8:LostSoul S:D:A:In some very rare occasions souls can come back from the Halls of Mandos. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:G:ASTRAL @@ -1743,7 +1698,6 @@ S:O:70:12:25d3 S:N:9:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 8c807dcb..5c993abe 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -29,7 +29,6 @@ G:k:+1000:+1000:Magic-Device # C:D:1:titles # C:S:str:int:wis:dex:con:chr:mana:bonus blows # C:K:dis:dev:sav:stl:srh:fos:thn:thb -# C:X:dis:dev:sav:stl:srh:fos:thn:thb # C:P:hitdie:xp% # C:B:num:wgt:mul # C:C:(H|L):(H|L):base:pl:plus @@ -65,8 +64,6 @@ C:D:1:Baron C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:5 C:C:H:L:9000:2:40 C:P:9:0 @@ -222,8 +219,6 @@ C:D:1:Sorcerer C:D:1:Ipsissimus C:D:1:Archimage C:S:-5:3:0:1:-2:1:50:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:40:2 C:C:L:H:240000:1:5 C:P:0:30 @@ -417,8 +412,6 @@ C:D:1:Archer C:D:1:Archer C:D:1:Great Archer C:S:2:1:0:2:1:1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:35:4 C:C:H:L:9000:2:40 C:P:4:30 @@ -507,8 +500,6 @@ C:D:1:Master Thief C:D:1:Assassin C:D:1:Guildmaster C:S:2:1:-2:3:1:-1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:3 C:C:H:H:20000:2:40 C:P:6:25 @@ -615,8 +606,6 @@ C:D:1:Lorekeeper C:D:1:Loremaster C:D:1:Loremaster C:S:1:-2:1:1:0:1:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:30:3 C:C:H:L:9000:2:40 C:P:8:40 @@ -815,8 +804,6 @@ C:D:1:Negotiator C:D:1:Pacifist C:D:1:Peacemaker C:S:0:2:2:2:0:4:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:P:0:0 C:B:0:0:0 C:C:H:H:20000:2:40 @@ -875,8 +862,6 @@ C:D:1:Cardinal C:D:1:Inquisitor C:D:1:Pope C:S:-1:-3:3:-1:0:2:0:0 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:4:35:3 C:C:L:H:10000:2:40 C:P:2:20 @@ -1022,8 +1007,6 @@ C:D:1:Baron C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 -C:K:10:10:0:1:10:10:10:10 -C:X:0:0:0:0:0:0:0:0 C:B:6:30:5 C:C:H:L:9000:2:40 C:P:9:0 @@ -1079,7 +1062,6 @@ R:D:Humans are the second born, the Edain. R:D:They are the basic race to which all others are compared. R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 -R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:1 R:E:1:1:1:2:1:1 R:C:Archer @@ -1093,7 +1075,6 @@ R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 -R:K:2:3:3:1:6:11:-1:5 R:P:9:110:2:4 R:E:1:1:1:2:1:1 R:C:Archer @@ -1117,7 +1098,6 @@ R:D:Elves are the first born, the Eldar. R:D:More spiritual than physical beings, they are weaker than humans R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 -R:K:5:6:6:2:8:12:-5:15 R:P:8:120:3:5 R:E:1:1:1:2:1:1 R:R:1:0 @@ -1141,7 +1121,6 @@ R:N:3:Hobbit R:D:An old but quiet race related to humans. R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 -R:K:15:18:18:5:12:15:-10:20 R:P:7:110:4:10 R:E:1:1:1:2:1:0 R:Z:create food @@ -1168,7 +1147,6 @@ R:N:4:Gnome R:D:Related to dwarves, Gnomes are between Dwarves and Hobbits in size. R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 -R:K:10:12:12:3:6:13:-8:12 R:P:8:135:4:13 R:E:1:1:1:2:1:1 R:Z:blink @@ -1190,7 +1168,6 @@ R:N:5:Dwarf R:D:The children of Aule, a strong but small race. R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 -R:K:2:9:10:-1:7:10:15:0 R:P:11:125:5:16 R:E:1:1:1:2:1:1 R:Z:find secret passages @@ -1212,7 +1189,6 @@ R:k:+500:+000:Archery R:N:6:Orc R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 -R:K:-3:-3:-3:-1:0:7:12:-5 R:P:10:110:3:25 R:E:1:1:1:2:1:1 R:Z:remove fear @@ -1234,7 +1210,6 @@ R:N:7:Troll R:D:They can bear the light of the sun. R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 -R:K:-5:-8:-8:-2:-1:5:20:-10 R:P:12:137:3:22 R:E:1:1:1:2:1:1 R:Z:berserk @@ -1256,7 +1231,6 @@ R:N:8:Dunadan R:D:The greatest of the Edain, humans in all respects but R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 -R:K:4:5:5:2:3:13:15:10 R:P:10:180:0:1 R:E:1:1:1:2:1:1 R:R:1:0 @@ -1282,7 +1256,6 @@ R:D:Elves are the first born, the Eldar. R:D:High elves are the best of the Eldar, strong, fast, intellectual, though R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 -R:K:4:20:20:4:3:14:10:25 R:P:10:200:4:7 R:E:1:1:1:2:1:1 R:R:1:0 @@ -1307,7 +1280,6 @@ R:N:10:Half-Ogre R:D:A crossbreed between a human and an ogre. R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 -R:K:-3:-5:-5:-2:-1:5:20:0 R:P:12:130:3:74 R:E:1:1:1:2:1:1 R:Z:set explosive rune @@ -1329,7 +1301,6 @@ R:N:11:Beorning R:D:A race of men shapeshifters. R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 -R:K:-6:-8:-6:-2:-1:5:25:5 R:P:12:150:3:75 R:E:1:1:1:2:1:1 R:Z:turn into a bear @@ -1356,7 +1327,6 @@ R:D:Druedain are an ancient branch of the race of Men. R:D:Wiser and quicker than the Edain, but weaker and less intelligent. R:D:Not as pretty as their common human cousins, but sturdier. R:S:-2:-3:2:3:2:-2:1 -R:K:5:0:0:5:15:15:0:5 R:P:9:115:0:82 R:E:1:1:1:2:1:1 R:Z:poison dart @@ -1380,7 +1350,6 @@ R:N:13:Petty-Dwarf R:D:A nearly extinct subrace of dwarves. R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 -R:K:3:5:10:1:5:10:9:0 R:P:11:135:5:87 R:E:1:1:1:2:1:1 R:Z:detect doors and traps @@ -1403,7 +1372,6 @@ R:D:Elves are the first born, the Eldar. R:D:Dark elves are rare on Middle-earth and even though not evil R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 -R:K:5:15:20:3:8:12:-5:10 R:P:9:150:5:69 R:E:1:1:1:2:1:1 R:Z:magic missile @@ -1430,7 +1398,6 @@ R:N:15:Ent R:D:Guardian of the forests of Middle-earth, summoned by Yavanna before R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 -R:K:5:5:20:-6:5:4:15:5 R:P:14:210:5:95 R:E:1:1:1:2:1:1 R:Z:grow trees @@ -1468,7 +1435,6 @@ R:N:16:RohanKnight R:D:Humans from the land of Rohan, riding the great Mearas. R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 -R:K:10:5:5:-8:1:1:5:5 R:P:10:220:0:84 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers @@ -1509,7 +1475,6 @@ R:N:17:Eagle R:D:A Great Eagle of Manwe, his most faithful servant. R:D:They have been given many gifts from their master. R:S:6:2:1:-2:3:6:4 -R:K:6:0:10:-16:30:10:0:0 R:P:12:300:5:89 R:E:0:1:0:4:1:1 R:R:1:0 @@ -1550,7 +1515,6 @@ R:D:Very strong and smart, but unstealthy. R:D:They cannot play instruments or wield weapons. # R:S:str:int:wis:dex:con:chr:luck R:S:3:2:2:-2:2:-5:-2 -R:K:5:5:5:-10:5:5:5:-20 R:P:9:250:5:100 R:E:0:1:0:6:1:1 R:R:1:0 @@ -1572,7 +1536,6 @@ R:k:+000:+000:Sneakiness R:N:19:Yeek R:D:The weakest of all the races, bad at everything except gaining levels quickly. R:S:-5:-5:-5:-5:-5:-5:-5 -R:K:-5:-5:-10:0:-5:0:-10:-10 R:P:6:25:2:29 R:E:1:1:1:2:1:1 R:C:Archer @@ -1597,7 +1560,6 @@ R:D:Elves are the first born, the Eldar. R:D:Wood Elves live in the great forests of Middle-earth. R:D:They are more dangerous but less wise than High Elves. R:S:2:2:-3:5:0:1:0 -R:K:5:6:6:5:8:12:-5:40 R:P:7:130:4:5 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW @@ -1627,7 +1589,6 @@ R:N:21:Maia R:D:An old race, dating from before the creation of Arda, the Maiar were R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 -R:K:0:0:0:0:0:10:0:0 R:P:10:100:0:91 R:E:1:1:1:2:1:1 R:G:NO_GOD @@ -1709,7 +1670,6 @@ R:D:The humans of the Southeast, servants of the Dark. R:D:They are traditional masters of many combat skills. R:D:Fanatical warriors, they do not trust magic. R:S:2:-2:-2:-2:2:-1:-1 -R:K:0:-5:-1:0:0:10:5:5 R:P:10:140:0:105 R:E:1:1:1:2:1:1 R:C:Archer @@ -1744,7 +1704,6 @@ R:D:corrupted by Melkor to serve his ends. # They all get an inherent CHR penalty, other stats depend on subrace. R:S:0:0:0:0:0:-1:0 # Again, here everything depends on subrace -R:K:0:0:0:0:0:0:0:0 R:P:10:170:3:109 # Everything at zero here, depends on type of demon. R:E:0:0:0:0:0:0 @@ -1792,7 +1751,6 @@ I: S:N:0: S:D:A:A normal member of the race. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1824,7 +1782,6 @@ S:N:1:Vampire S:D:B:Vampires are powerful undead, wielding great powers. They still fear the S:D:B:sunlight and cannot easily satiate their hunger. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1851,7 +1808,6 @@ S:N:2:Spectre S:D:B:Spectres only partially exist in the mortal world and so they can S:D:B:pass through walls. They are somewhat physically weak. S:S:-5:1:1:2:-3:-6:-3:105 -S:K:2:8:7:2:2:7:-5:-2 S:P:-4:80:3 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1900,7 +1856,6 @@ S:N:3:Skeleton S:D:B:Yet an other kind of undead. Their physical 'body' is not very vulnerable S:D:B:to sharp things. S:S:0:-2:-2:0:1:-4:-3:70 -S:K:-5:-5:5:-1:-1:8:8:0 S:P:0:45:1 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1945,7 +1900,6 @@ S:k:+000:+000:Archery S:N:4:Zombie S:D:B:Strong and dumb is a zombie. S:S:2:-6:-6:1:4:-5:-4:70 -S:K:-2:-2:5:-1:-1:2:5:0 S:P:3:45:1 S:E:0:0:0:0:0:0 S:A:Beorning @@ -1990,7 +1944,6 @@ S:k:+000:+000:Archery S:N:5:Barbarian S:D:A:Hardy members of their race, they are strong fighters but poor spellcasters. S:S:2:-3:-2:1:1:-3:1:50 -S:K:-2:-10:2:-2:0:1:12:5 S:P:1:25:0 S:E:0:0:0:0:0:0 S:A:Beorning @@ -2016,7 +1969,6 @@ S:N:6:Hermit S:D:A:Through years of isolation hermits can manage to increase their mana S:D:A:reserves but at the cost of an increased physical weakness. S:S:-3:1:1:-3:-3:1:0:120 -S:K:5:10:5:3:4:10:-5:-5 S:P:-3:20:1 S:E:0:0:0:0:0:0 S:A:Dark-Elf @@ -2048,7 +2000,6 @@ S:k:-500:+000:Archery S:N:8:LostSoul S:D:A:In some very rare occasions souls can come back from the Halls of Mandos. S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:G:ASTRAL @@ -2074,7 +2025,6 @@ S:O:70:12:25d3 S:N:9:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:S:0:0:0:0:0:0:0:100 -S:K:0:0:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 @@ -2086,7 +2036,6 @@ S:D:B:They are especially resistant to fire and with time learn S:D:B:to resist its effects entirely. They are stronger than other S:D:B:dragons and can prevent attacks from sapping their strength. S:S:3:0:0:0:0:0:0:100 -S:K:0:0:0:0:-2:2:5:0 S:P:0:0:1 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2123,7 +2072,6 @@ S:D:B:liquid. They are especially resistant to acid and with time S:D:B:will come to resist its effects entirely. They look more S:D:B:beautiful than other dragons and are expert at protecting that. S:S:0:0:0:0:0:3:0:100 -S:K:2:0:1:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2159,7 +2107,6 @@ S:D:B:vapours. They are especially resistant to poison and resist S:D:B:poison attacks exceptionally well. They are healthier and sturdier S:D:B:than other dragons and are not as susceptible to diseases. S:S:0:0:0:0:3:0:0:100 -S:K:0:0:2:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2192,7 +2139,6 @@ S:D:B:These enormous creatures are wreathed in living lightning. S:D:B:They are especially nimble and agile, and their dexterity S:D:B:is not sapped easily. S:S:0:0:0:3:0:0:0:100 -S:K:3:0:0:2:1:0:0:0 S:P:0:0:1 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2228,7 +2174,6 @@ S:D:B:These enormous dragons look like they'd been hewed from ice. S:D:B:They are the most cunning and calculating among their kind, S:D:B:and attacks against their intelligence are unlikely to succeed. S:S:0:3:0:0:0:0:0:100 -S:K:0:2:0:0:0:0:0:0 S:P:0:0:0 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2265,7 +2210,6 @@ S:D:B:They are powerful undead beings and are thus wiser than other S:D:B:dragons. Wisdom-sapping and life-draining attacks are not S:D:B:very effective against them. S:S:0:0:3:0:0:0:0:100 -S:K:0:0:1:5:2:2:0:0 S:P:0:0:3 S:E:0:0:0:0:0:0 S:A:Dragon @@ -2303,7 +2247,6 @@ S:D:A:quick, scurrying feet, and winglike appendages on their S:D:A:slick, black backs. They are somewhat weak and sickly, S:D:A:but sly, cunning, and agile. S:S:-1:1:1:1:-1:-2:0:100 -S:K:2:0:1:2:2:20:0:0 S:P:1:20:1 S:E:1:1:1:2:1:1 S:A:Demon @@ -2335,7 +2278,6 @@ S:D:A:These birdlike demons' wings flap with blinding speed. S:D:A:They are somewhat physically weak, but may befuddle enemies S:D:A:so that they believe they'd never seen anything so beautiful. S:S:-2:0:0:0:0:+3:0:100 -S:K:0:0:1:-2:0:10:0:0 S:P:1:0:1 # R:E:weapons:torso:arms:finger:head:legs S:E:0:1:2:4:1:1 @@ -2367,7 +2309,6 @@ S:D:A:These doglike demons are one of the lowest forms of Morgoth's S:D:A:corrupted races, though their sense of smell is uncanny, and S:D:A:increases with experience. S:S:-1:0:0:0:-1:0:0:100 -S:K:2:0:2:0:5:30:0:0 S:P:0:-10:2 S:E:1:1:1:2:1:1 S:A:Demon @@ -2411,7 +2352,6 @@ S:D:A:They are clumsy and dumb, but very strong and stout, and S:D:A:resist the elements fairly well. S:S:2:-1:-2:-2:2:-1:0:100 # S:K:dis:dev:sav:stl:srh:fos:thn:thb -S:K:-1:0:0:-8:-2:-10:5:0 S:P:2:20:0 S:E:1:1:1:2:1:1 S:A:Demon @@ -2452,7 +2392,6 @@ S:D:A:As a result of their corruption, they develop a strange S:D:A:protective layer around them as they mature. S:S:-1:2:1:0:0:-3:0:100 # S:K:dis:dev:sav:stl:srh:fos:thn:thb -S:K:0:0:1:-10:2:10:0:0 S:P:2:10:0 S:E:1:1:1:2:1:1 S:A:Demon @@ -2485,7 +2424,6 @@ S:D:A:they learn more quickly and have more sophisticated magical S:D:A:powers. Their arrogant snarling, however, makes them quite S:D:A:unstealthy. S:S:1:1:1:1:1:-1:0:100 -S:K:2:0:2:-20:5:30:0:0 S:P:0:-20:2 S:E:1:1:1:2:1:1 S:A:Demon @@ -2535,7 +2473,6 @@ S:D:A:These slithering snakelike forms lack many physical S:D:A:advantages, but are no less deadly for it. Their magical S:D:A:abilities, stealth, and cunning are legendary. S:S:-3:5:5:5:-1:-6:0:200 -S:K:5:5:5:10:5:50:0:0 S:P:2:40:3 S:E:0:1:0:1:1:0 S:A:Demon @@ -2652,7 +2589,6 @@ S:D:A:Humanoid creatures with gill slits at the necks, S:D:A:they seem to flit in and out of existence. S:S:-2:1:1:3:-1:-1:2:150 # S:K:dis:dev:sav:stl:srh:fos:thn:thb -S:K:2:2:2:2:2:30:0:0 S:P:1:50:2 S:E:1:1:1:2:1:1 S:A:Demon @@ -2679,7 +2615,6 @@ S:D:A:These creatures resemble lions standing on two legs. S:D:A:Very strong and smart, they instill fear in all who S:D:A:encounter them and are afraid of nothing. S:S:2:1:1:-1:2:1:1:100 -S:K:0:0:4:-3:0:10:10:10 S:P:2:30:0 S:E:1:1:1:2:1:1 S:A:Demon @@ -2710,7 +2645,6 @@ S:D:A:They can be equally skilled in combat and S:D:A:magic; and they can temporarily assume the S:D:A:forms of true Balrogs. S:S:1:1:1:1:1:1:0:150 -S:K:1:1:1:1:1:20:15:10 S:P:3:50:2 S:E:1:1:1:2:1:1 S:A:Demon diff --git a/src/init1.cc b/src/init1.cc index 13a376d3..ed173481 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1041,28 +1041,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'K' for "sKills" */ - if ((buf[0] == 'R') && (buf[2] == 'K')) - { - int s[8]; - - /* Scan for the values */ - if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1); - - rp_ptr->r_dis = s[0]; - rp_ptr->r_dev = s[1]; - rp_ptr->r_sav = s[2]; - rp_ptr->r_stl = s[3]; - rp_ptr->r_srh = s[4]; - rp_ptr->r_fos = s[5]; - rp_ptr->r_thn = s[6]; - rp_ptr->r_thb = s[7]; - - /* Next... */ - continue; - } - /* Process 'k' for "skills" */ if ((buf[0] == 'R') && (buf[2] == 'k')) { @@ -1382,28 +1360,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'K' for "sKills" */ - if ((buf[0] == 'S') && (buf[2] == 'K')) - { - int s[8]; - - /* Scan for the values */ - if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1); - - rmp_ptr->r_dis = s[0]; - rmp_ptr->r_dev = s[1]; - rmp_ptr->r_sav = s[2]; - rmp_ptr->r_stl = s[3]; - rmp_ptr->r_srh = s[4]; - rmp_ptr->r_fos = s[5]; - rmp_ptr->r_thn = s[6]; - rmp_ptr->r_thb = s[7]; - - /* Next... */ - continue; - } - /* Process 'P' for "xtra" */ if ((buf[0] == 'S') && (buf[2] == 'P')) { @@ -1764,50 +1720,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'K' for "sKills" */ - if ((buf[0] == 'C') && (buf[2] == 'K')) - { - int s[8]; - - /* Scan for the values */ - if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1); - - c_ptr->c_dis = s[0]; - c_ptr->c_dev = s[1]; - c_ptr->c_sav = s[2]; - c_ptr->c_stl = s[3]; - c_ptr->c_srh = s[4]; - c_ptr->c_fos = s[5]; - c_ptr->c_thn = s[6]; - c_ptr->c_thb = s[7]; - - /* Next... */ - continue; - } - - /* Process 'x' for "Xtra skills" */ - if ((buf[0] == 'C') && (buf[2] == 'X')) - { - int s[8]; - - /* Scan for the values */ - if (8 != sscanf(buf + 4, "%d:%d:%d:%d:%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7])) return (1); - - c_ptr->x_dis = s[0]; - c_ptr->x_dev = s[1]; - c_ptr->x_sav = s[2]; - c_ptr->x_stl = s[3]; - c_ptr->x_srh = s[4]; - c_ptr->x_fos = s[5]; - c_ptr->x_thn = s[6]; - c_ptr->x_thb = s[7]; - - /* Next... */ - continue; - } - /* Process 'P' for "xtra" */ if ((buf[0] == 'C') && (buf[2] == 'P')) { diff --git a/src/loadsave.cc b/src/loadsave.cc index d4cf63ff..2c5085ed 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -300,15 +300,6 @@ static void do_subrace(ls_flag_t flag) do_byte((byte*)&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_s16b(&sr_ptr->r_dis, flag); - do_s16b(&sr_ptr->r_dev, flag); - do_s16b(&sr_ptr->r_sav, flag); - do_s16b(&sr_ptr->r_stl, flag); - do_s16b(&sr_ptr->r_srh, flag); - do_s16b(&sr_ptr->r_fos, flag); - do_s16b(&sr_ptr->r_thn, flag); - do_s16b(&sr_ptr->r_thb, flag); - do_byte((byte*)&sr_ptr->r_mhp, flag); do_s16b(&sr_ptr->r_exp, flag); diff --git a/src/player_class.hpp b/src/player_class.hpp index 236a3007..6e094717 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -23,39 +23,11 @@ struct player_class s16b c_adj[6] { }; /* Class stat modifier */ - s16b c_dis = 0; /* class disarming */ - s16b c_dev = 0; /* class magic devices */ - s16b c_sav = 0; /* class saving throws */ - s16b c_stl = 0; /* class stealth */ - s16b c_srh = 0; /* class searching ability */ - s16b c_fos = 0; /* class searching frequency */ - s16b c_thn = 0; /* class to hit (normal) */ - s16b c_thb = 0; /* class to hit (bows) */ - - s16b x_dis = 0; /* extra disarming */ - s16b x_dev = 0; /* extra magic devices */ - s16b x_sav = 0; /* extra saving throws */ - s16b x_stl = 0; /* extra stealth */ - s16b x_srh = 0; /* extra searching ability */ - s16b x_fos = 0; /* extra searching frequency */ - s16b x_thn = 0; /* extra to hit (normal) */ - s16b x_thb = 0; /* extra to hit (bows) */ - s16b c_mhp = 0; /* Class hit-dice adjustment */ s16b c_exp = 0; /* Class experience factor */ s16b powers[4] { }; /* Powers of the class */ - s16b spell_book = 0; /* Tval of spell books (if any) */ - s16b spell_stat = 0; /* Stat for spells (if any) */ - s16b spell_lev = 0; /* The higher it is the higher the spells level are */ - s16b spell_fail = 0; /* The higher it is the higher the spells failure are */ - s16b spell_mana = 0; /* The higher it is the higher the spells mana are */ - s16b spell_first = 0; /* Level of first spell */ - s16b spell_weight = 0; /* Weight that hurts spells */ - byte max_spell_level = 0; /* Maximun spell level */ - byte magic_max_spell = 0; /* Maximun numbner of spells one can learn by natural means */ - player_race_flag_set flags; s16b mana = 0; diff --git a/src/player_race.hpp b/src/player_race.hpp index 9af977aa..a80373bb 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -22,15 +22,6 @@ struct player_race char luck = '\0'; /* Luck */ - s16b r_dis = 0; /* disarming */ - s16b r_dev = 0; /* magic devices */ - s16b r_sav = 0; /* saving throw */ - s16b r_stl = 0; /* stealth */ - s16b r_srh = 0; /* search ability */ - s16b r_fos = 0; /* search frequency */ - s16b r_thn = 0; /* combat (normal) */ - s16b r_thb = 0; /* combat (shooting) */ - byte r_mhp = 0; /* Race hit-dice modifier */ u16b r_exp = 0; /* Race experience factor */ diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 756da347..9b0d95f6 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -22,15 +22,6 @@ struct player_race_mod char luck = '\0'; /* Luck */ s16b mana = 0; /* Mana % */ - s16b r_dis = 0; /* (+) disarming */ - s16b r_dev = 0; /* (+) magic devices */ - s16b r_sav = 0; /* (+) saving throw */ - s16b r_stl = 0; /* (+) stealth */ - s16b r_srh = 0; /* (+) search ability */ - s16b r_fos = 0; /* (+) search frequency */ - s16b r_thn = 0; /* (+) combat (normal) */ - s16b r_thb = 0; /* (+) combat (shooting) */ - char r_mhp = 0; /* (+) Race mod hit-dice modifier */ s16b r_exp = 0; /* (+) Race mod experience factor */ -- cgit v1.2.3 From a303c1a21930025c4f5ec086733f5d936d54f326 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Change meta_class_type to non-POD type --- src/init2.cc | 2 +- src/meta_class_type.hpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 5a4662a0..67c9d37f 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -555,7 +555,7 @@ namespace { race_mod_info = new player_race_mod[max_rmp_idx]; class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); - meta_class_info = make_array(max_mc_idx); + meta_class_info = new meta_class_type[max_mc_idx]; for (std::size_t i = 0; i < max_mc_idx; i++) { meta_class_info[i].classes = make_array(max_c_idx); diff --git a/src/meta_class_type.hpp b/src/meta_class_type.hpp index e74e75b3..243b0ad4 100644 --- a/src/meta_class_type.hpp +++ b/src/meta_class_type.hpp @@ -4,7 +4,7 @@ struct meta_class_type { - char name[80]; /* Name */ - byte color; - s16b *classes; /* list of classes */ + char name[80] = ""; /* Name */ + byte color = 0; + s16b *classes = nullptr; /* List of classes */ }; -- cgit v1.2.3 From f1898380237c975d07cf98bb25a882085f1e3b95 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Change meta_class_type::classes to std::vector --- src/birth.cc | 25 ++++++++++++------------- src/init1.cc | 4 +--- src/init2.cc | 4 ---- src/meta_class_type.hpp | 3 ++- 4 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index dd66e11f..fd515806 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1171,16 +1171,16 @@ static void player_outfit(void) } -int dump_classes(s16b *classes, int sel, u32b *restrictions) +static void dump_classes(std::vector const &classes, int sel, u32b *restrictions) { - int n = 0; - char buf[80]; /* Clean up */ clear_from(12); - while (classes[n] != -1) + int n_max = static_cast(classes.size()); // Warning avoidance + + for (int n = 0; n < n_max; n++) { cptr mod = ""; char p2 = ')', p1 = ' '; @@ -1226,10 +1226,8 @@ int dump_classes(s16b *classes, int sel, u32b *restrictions) else put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4)); } - n++; - } - return (n); + } } int dump_specs(int sel) @@ -1486,8 +1484,6 @@ static bool_ player_birth_aux_ask() int const RACE_ROW = 3; int const CLASS_ROW = 4; - s16b *class_types; - /*** Intro ***/ /* Clear screen */ @@ -1824,21 +1820,24 @@ static bool_ player_birth_aux_ask() { k = 0; } - class_types = meta_class_info[k].classes; + clear_from(15); + auto const &class_types = meta_class_info[k].classes; + /* Count classes */ - n = 0; - while (class_types[n] != -1) n++; + n = class_types.size(); /* Only one choice = instant choice */ if (n == 1) + { k = 0; + } else { /* Dump classes */ sel = 0; - n = dump_classes(class_types, sel, restrictions); + dump_classes(class_types, sel, restrictions); /* Get a class */ while (1) diff --git a/src/init1.cc b/src/init1.cc index ed173481..05a4f857 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2039,8 +2039,6 @@ errr init_player_info_txt(FILE *fp) /* Append chars to the name */ strcpy(mc_ptr->name, s + 2); mc_ptr->color = color_char_to_attr(s[0]); - for (powers = 0; powers < max_c_idx; powers++) - mc_ptr->classes[powers] = -1; powers = 0; /* Next... */ @@ -2066,7 +2064,7 @@ errr init_player_info_txt(FILE *fp) if (i == max_c_idx) return (6); - mc_ptr->classes[powers++] = i; + mc_ptr->classes.push_back(i); /* Next... */ continue; diff --git a/src/init2.cc b/src/init2.cc index 67c9d37f..ac69b760 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -556,10 +556,6 @@ namespace { class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); meta_class_info = new meta_class_type[max_mc_idx]; - for (std::size_t i = 0; i < max_mc_idx; i++) - { - meta_class_info[i].classes = make_array(max_c_idx); - } } static errr parse(FILE *fp) diff --git a/src/meta_class_type.hpp b/src/meta_class_type.hpp index 243b0ad4..bd47f998 100644 --- a/src/meta_class_type.hpp +++ b/src/meta_class_type.hpp @@ -1,10 +1,11 @@ #pragma once #include "h-basic.h" +#include struct meta_class_type { char name[80] = ""; /* Name */ byte color = 0; - s16b *classes = nullptr; /* List of classes */ + std::vector classes; /* List of classes */ }; -- cgit v1.2.3 From ab69f8a32062d0ae44ba7af0b4e357f6a77169ea Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Add missing 'static' for a few functions in birth.cc --- src/birth.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index fd515806..3f09c191 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1230,7 +1230,7 @@ static void dump_classes(std::vector const &classes, int sel, u32b *restri } } -int dump_specs(int sel) +static int dump_specs(int sel) { int n = 0; @@ -1289,7 +1289,7 @@ int dump_specs(int sel) return (n); } -int dump_races(int sel) +static int dump_races(int sel) { int n = 0; @@ -1346,7 +1346,7 @@ int dump_races(int sel) } -int dump_rmods(int sel, int *racem, int max) +static int dump_rmods(int sel, int *racem, int max) { int n = 0; @@ -1406,7 +1406,7 @@ int dump_rmods(int sel, int *racem, int max) return (n); } -int dump_gods(int sel, int *choice, int max) +static int dump_gods(int sel, int *choice, int max) { int i, j; char buf[80]; -- cgit v1.2.3 From 2fa1a5e82a4e13f16ea6001c11d2452bac036d20 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify skill_* fields into skill_modifier{,s} --- src/init1.cc | 120 +++++++++++++++++++------------------------- src/init2.cc | 1 + src/loadsave.cc | 24 ++++++--- src/player_class.hpp | 6 +-- src/player_race.hpp | 6 +-- src/player_race_mod.hpp | 6 +-- src/player_spec.hpp | 6 +-- src/skill_modifier.hpp | 12 +++++ src/skill_modifiers.hpp | 11 ++++ src/skill_modifiers_fwd.hpp | 3 ++ src/skills.cc | 67 ++++++------------------- src/variable.cc | 6 +-- src/variable.hpp | 6 +-- 13 files changed, 122 insertions(+), 152 deletions(-) create mode 100644 src/skill_modifier.hpp create mode 100644 src/skill_modifiers.hpp create mode 100644 src/skill_modifiers_fwd.hpp diff --git a/src/init1.cc b/src/init1.cc index 05a4f857..d86fbd4e 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -806,6 +806,37 @@ static errr grab_object_flag(object_flag_set *flags, cptr what) return (1); } +/* + * Read skill values + */ +static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf) +{ + long val, mod; + char v, m; + char name[200]; + + if (5 != sscanf(buf, "%c%ld:%c%ld:%s", &v, &val, &m, &mod, name)) + { + return 1; + } + + long i; + if ((i = find_skill(name)) == -1) + { + return 1; + } + + auto s = &skill_modifiers->modifiers[i]; + + s->basem = monster_ego_modify(v); + s->base = val; + s->modm = monster_ego_modify(m); + s->mod = mod; + + return 0; +} + + /* * Initialize the "player" arrays, by parsing an ascii "template" file */ @@ -834,15 +865,6 @@ errr init_player_info_txt(FILE *fp) /* Just before the first line */ error_line = -1; - /* Init general skills */ - for (z = 0; z < MAX_SKILLS; z++) - { - gen_skill_basem[z] = 0; - gen_skill_base[z] = 0; - gen_skill_modm[z] = 0; - gen_skill_mod[z] = 0; - } - /* Parse */ while (0 == my_fgets(fp, buf, 1024)) { @@ -888,18 +910,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'G:k' for "General skills" */ if ((buf[0] == 'G') && (buf[2] == 'k')) { - long val, mod, i; - char name[200], v, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s", - &v, &val, &m, &mod, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - gen_skill_basem[i] = monster_ego_modify(v); - gen_skill_base[i] = val; - gen_skill_modm[i] = monster_ego_modify(m); - gen_skill_mod[i] = mod; + if (read_skill_modifiers(gen_skill, buf + 4)) + { + return 1; + } /* Next... */ continue; @@ -1044,18 +1058,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'k' for "skills" */ if ((buf[0] == 'R') && (buf[2] == 'k')) { - long val, mod, i; - char name[200], v, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s", - &v, &val, &m, &mod, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - rp_ptr->skill_basem[i] = monster_ego_modify(v); - rp_ptr->skill_base[i] = val; - rp_ptr->skill_modm[i] = monster_ego_modify(m); - rp_ptr->skill_mod[i] = mod; + if (read_skill_modifiers(&rp_ptr->skill_modifiers, buf + 4)) + { + return 1; + } /* Next... */ continue; @@ -1319,18 +1325,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'k' for "skills" */ if ((buf[0] == 'S') && (buf[2] == 'k')) { - long val, mod, i; - char name[200], v, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s", - &v, &val, &m, &mod, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - rmp_ptr->skill_basem[i] = monster_ego_modify(v); - rmp_ptr->skill_base[i] = val; - rmp_ptr->skill_modm[i] = monster_ego_modify(m); - rmp_ptr->skill_mod[i] = mod; + if (read_skill_modifiers(&rmp_ptr->skill_modifiers, buf + 4)) + { + return 1; + } /* Next... */ continue; @@ -1640,18 +1638,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'k' for "skills" */ if ((buf[0] == 'C') && (buf[2] == 'k')) { - long val, mod, i; - char name[200], v, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s", - &v, &val, &m, &mod, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - c_ptr->skill_basem[i] = monster_ego_modify(v); - c_ptr->skill_base[i] = val; - c_ptr->skill_modm[i] = monster_ego_modify(m); - c_ptr->skill_mod[i] = mod; + if (read_skill_modifiers(&c_ptr->skill_modifiers, buf + 4)) + { + return 1; + } /* Next... */ continue; @@ -1916,18 +1906,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'k' for "skills" */ if (buf[4] == 'k') { - long val, mod, i; - char name[200], v, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 6, "%c%ld:%c%ld:%s", - &v, &val, &m, &mod, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - s_ptr->skill_basem[i] = monster_ego_modify(v); - s_ptr->skill_base[i] = val; - s_ptr->skill_modm[i] = monster_ego_modify(m); - s_ptr->skill_mod[i] = mod; + if (read_skill_modifiers(&s_ptr->skill_modifiers, buf + 6)) + { + return 1; + } /* Next... */ continue; diff --git a/src/init2.cc b/src/init2.cc index ac69b760..7a7f6906 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -556,6 +556,7 @@ namespace { class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); meta_class_info = new meta_class_type[max_mc_idx]; + gen_skill = new skill_modifiers; } static errr parse(FILE *fp) diff --git a/src/loadsave.cc b/src/loadsave.cc index 2c5085ed..1d3e8144 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -261,6 +261,22 @@ static void do_quick_start(ls_flag_t flag) } } +static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) +{ + do_byte((byte*) &s->basem, flag); + do_u32b( &s->base, flag); + do_byte((byte*) &s->modm, flag); + do_s16b( &s->mod, flag); +} + +static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) +{ + for (std::size_t i = 0; i < MAX_SKILLS; i++) + { + do_skill_modifier(&skill_modifiers->modifiers[i], flag); + } +} + /* * The special saved subrace */ @@ -326,13 +342,7 @@ static void do_subrace(ls_flag_t flag) do_byte(&sr_ptr->g_attr, flag); do_byte((byte*)&sr_ptr->g_char, flag); - for (i = 0; i < MAX_SKILLS; i++) - { - do_byte((byte*)&sr_ptr->skill_basem[i], flag); - do_u32b(&sr_ptr->skill_base[i], flag); - do_byte((byte*)&sr_ptr->skill_modm[i], flag); - do_s16b(&sr_ptr->skill_mod[i], flag); - } + do_skill_modifiers(&sr_ptr->skill_modifiers, flag); } diff --git a/src/player_class.hpp b/src/player_class.hpp index 6e094717..e3a124e6 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -6,6 +6,7 @@ #include "player_defs.hpp" #include "player_race_flag_set.hpp" #include "player_spec.hpp" +#include "skill_modifiers.hpp" /** * Maximum number of specialties. @@ -54,10 +55,7 @@ struct player_class std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; - char skill_basem[MAX_SKILLS] { }; - u32b skill_base[MAX_SKILLS] { }; - char skill_modm[MAX_SKILLS] { }; - s16b skill_mod[MAX_SKILLS] { }; + struct skill_modifiers skill_modifiers; u32b gods = 0; diff --git a/src/player_race.hpp b/src/player_race.hpp index a80373bb..6e2b861d 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -7,6 +7,7 @@ #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" #include "skills_defs.hpp" +#include "skill_modifiers.hpp" #include @@ -40,10 +41,7 @@ struct player_race std::array oflags; s16b opval[PY_MAX_LEVEL + 1] { }; - char skill_basem[MAX_SKILLS] { }; - u32b skill_base[MAX_SKILLS] { }; - char skill_modm[MAX_SKILLS] { }; - s16b skill_mod[MAX_SKILLS] { }; + struct skill_modifiers skill_modifiers; s16b obj_tval[5] { }; s16b obj_sval[5] { }; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 9b0d95f6..0472c4ee 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -6,6 +6,7 @@ #include "player_defs.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" +#include "skill_modifiers.hpp" #include "skills_defs.hpp" #include @@ -44,10 +45,7 @@ struct player_race_mod byte g_attr = 0; /* Overlay graphic attribute */ char g_char = '\0'; /* Overlay graphic character */ - char skill_basem[MAX_SKILLS] { }; - u32b skill_base[MAX_SKILLS] { }; - char skill_modm[MAX_SKILLS] { }; - s16b skill_mod[MAX_SKILLS] { }; + struct skill_modifiers skill_modifiers; s16b obj_tval[5] { }; s16b obj_sval[5] { }; diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 5fcec7cd..52b6f180 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -3,6 +3,7 @@ #include "h-basic.h" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" +#include "skill_modifiers.hpp" #include "skills_defs.hpp" #include @@ -15,10 +16,7 @@ struct player_spec const char *title = nullptr; /* Type of class spec */ char *desc = nullptr; /* Small desc of the class spec */ - char skill_basem[MAX_SKILLS] { }; /* Mod for value */ - u32b skill_base[MAX_SKILLS] { }; /* value */ - char skill_modm[MAX_SKILLS] { }; /* mod for mod */ - s16b skill_mod[MAX_SKILLS] { }; /* mod */ + struct skill_modifiers skill_modifiers; u32b skill_ideal[MAX_SKILLS] { }; /* Ideal skill levels at level 50 */ diff --git a/src/skill_modifier.hpp b/src/skill_modifier.hpp new file mode 100644 index 00000000..e4bf4ce9 --- /dev/null +++ b/src/skill_modifier.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "h-basic.h" + +struct skill_modifier { + + char basem = '\0'; + u32b base = 0; + char modm = '\0'; + s16b mod = 0; + +}; diff --git a/src/skill_modifiers.hpp b/src/skill_modifiers.hpp new file mode 100644 index 00000000..fe9d9a1b --- /dev/null +++ b/src/skill_modifiers.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "h-basic.h" +#include "skills_defs.hpp" +#include "skill_modifier.hpp" +#include + +struct skill_modifiers +{ + std::array modifiers; +}; diff --git a/src/skill_modifiers_fwd.hpp b/src/skill_modifiers_fwd.hpp new file mode 100644 index 00000000..18f692bd --- /dev/null +++ b/src/skill_modifiers_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct skill_modifiers; diff --git a/src/skills.cc b/src/skills.cc index 8949e9ad..bc508c54 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1177,62 +1177,25 @@ bool_ forbid_non_blessed() /* - * Gets the base value of a skill, given a race/class/... + * Augment skill value/modifier with the given skill_modifiers */ -void compute_skills(s32b *v, s32b *m, int i) +static void augment_skills(s32b *v, s32b *m, skill_modifier const &s) { - s32b value, mod; - - /***** general skills *****/ - - /* If the skill correspond to the magic school lets pump them a bit */ - value = gen_skill_base[i]; - mod = gen_skill_mod[i]; - - *v = modify_aux(*v, - value, gen_skill_basem[i]); - *m = modify_aux(*m, - mod, gen_skill_modm[i]); - - /***** race skills *****/ - - value = rp_ptr->skill_base[i]; - mod = rp_ptr->skill_mod[i]; - - *v = modify_aux(*v, - value, rp_ptr->skill_basem[i]); - *m = modify_aux(*m, - mod, rp_ptr->skill_modm[i]); - - /***** race mod skills *****/ - - value = rmp_ptr->skill_base[i]; - mod = rmp_ptr->skill_mod[i]; - - *v = modify_aux(*v, - value, rmp_ptr->skill_basem[i]); - *m = modify_aux(*m, - mod, rmp_ptr->skill_modm[i]); - - /***** class skills *****/ - - value = cp_ptr->skill_base[i]; - mod = cp_ptr->skill_mod[i]; - - *v = modify_aux(*v, - value, cp_ptr->skill_basem[i]); - *m = modify_aux(*m, - mod, cp_ptr->skill_modm[i]); - - /***** class spec skills *****/ + *v = modify_aux(*v, s.base, s.basem); + *m = modify_aux(*m, s.mod, s.modm); +} - value = spp_ptr->skill_base[i]; - mod = spp_ptr->skill_mod[i]; - *v = modify_aux(*v, - value, spp_ptr->skill_basem[i]); - *m = modify_aux(*m, - mod, spp_ptr->skill_modm[i]); +/* + * Gets the base value of a skill, given a race/class/... + */ +void compute_skills(s32b *v, s32b *m, int i) +{ + augment_skills(v, m, gen_skill->modifiers[i]); + augment_skills(v, m, rp_ptr->skill_modifiers.modifiers[i]); + augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers[i]); + augment_skills(v, m, cp_ptr->skill_modifiers.modifiers[i]); + augment_skills(v, m, spp_ptr->skill_modifiers.modifiers[i]); } /* diff --git a/src/variable.cc b/src/variable.cc index 524766ea..4ac48b50 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -13,6 +13,7 @@ #include "dungeon_flag_set.hpp" #include "player_type.hpp" #include "randart_gen_type.hpp" +#include "skill_modifiers.hpp" #include "util.hpp" @@ -938,10 +939,7 @@ effect_type effects[MAX_EFFECTS]; /* * General skills set */ -char gen_skill_basem[MAX_SKILLS]; -u32b gen_skill_base[MAX_SKILLS]; -char gen_skill_modm[MAX_SKILLS]; -s16b gen_skill_mod[MAX_SKILLS]; +skill_modifiers *gen_skill; /* * Table of "cli" macros. diff --git a/src/variable.hpp b/src/variable.hpp index 543c1bd5..3cfc7c8c 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -35,6 +35,7 @@ #include "rune_spell.hpp" #include "school_type.hpp" #include "set_type_fwd.hpp" +#include "skill_modifiers_fwd.hpp" #include "skill_type_fwd.hpp" #include "skills_defs.hpp" #include "store_action_type_fwd.hpp" @@ -284,10 +285,7 @@ extern school_type schools[SCHOOLS_MAX]; extern int project_time; extern s32b project_time_effect; extern effect_type effects[MAX_EFFECTS]; -extern char gen_skill_basem[MAX_SKILLS]; -extern u32b gen_skill_base[MAX_SKILLS]; -extern char gen_skill_modm[MAX_SKILLS]; -extern s16b gen_skill_mod[MAX_SKILLS]; +extern skill_modifiers *gen_skill; extern int max_bact; extern bool_ automatizer_enabled; extern s16b last_teleportation_y; -- cgit v1.2.3 From 804ff8c184e8ce892ed7629ba6feec9bef5aa7ff Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove unused player_spec::skill_ideal field --- src/init1.cc | 18 ------------------ src/player_spec.hpp | 3 --- 2 files changed, 21 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index d86fbd4e..e504f5ed 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1968,24 +1968,6 @@ errr init_player_info_txt(FILE *fp) /* Next... */ continue; } - - - /* Process 'K' for "desired skills" */ - if (buf[4] == 'K') - { - long val; - char name[200]; - - /* Scan for the values */ - if (2 != sscanf(buf + 6, "%ld:%s", - &val, name)) return (1); - - if ((i = find_skill(name)) == -1) return (1); - s_ptr->skill_ideal[i] = val; - - /* Next... */ - continue; - } } /* Process 'N' for "New/Number/Name" */ diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 52b6f180..328789b6 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -4,7 +4,6 @@ #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" #include "skill_modifiers.hpp" -#include "skills_defs.hpp" #include @@ -18,8 +17,6 @@ struct player_spec struct skill_modifiers skill_modifiers; - u32b skill_ideal[MAX_SKILLS] { }; /* Ideal skill levels at level 50 */ - s16b obj_tval[5] { }; s16b obj_sval[5] { }; s16b obj_pval[5] { }; -- cgit v1.2.3 From 4d07dca15f547f6233b714c8c82b43bcd5beaebc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify obj_* fields into object_proto struct --- src/birth.cc | 31 +++++++++----- src/init1.cc | 109 ++++++++++++++++-------------------------------- src/object_proto.hpp | 12 ++++++ src/player_class.hpp | 7 +--- src/player_race.hpp | 7 +--- src/player_race_mod.hpp | 7 +--- src/player_spec.hpp | 7 +--- 7 files changed, 77 insertions(+), 103 deletions(-) create mode 100644 src/object_proto.hpp diff --git a/src/birth.cc b/src/birth.cc index 3f09c191..03e651a2 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -909,25 +909,26 @@ static void player_wipe(void) /* Create an object */ -void outfit_obj(int tv, int sv, int pval, int dd, int ds) +static void outfit_obj(object_proto const *proto) { object_type forge; - object_type *q_ptr; /* Get local object */ - q_ptr = &forge; + auto q_ptr = &forge; q_ptr->pval = 0; q_ptr->pval2 = 0; /* Hack -- Give the player an object */ - object_prep(q_ptr, lookup_kind(tv, sv)); + object_prep(q_ptr, lookup_kind(proto->tval, proto->sval)); - if (pval) - q_ptr->pval = pval; + if (proto->pval) + { + q_ptr->pval = proto->pval; + } /* These objects are "storebought" */ q_ptr->ident |= IDENT_MENTAL; - q_ptr->number = damroll(dd, ds); + q_ptr->number = damroll(proto->dd, proto->ds); object_aware(q_ptr); object_known(q_ptr); @@ -1161,13 +1162,21 @@ static void player_outfit(void) /* Hack -- Give the player some useful objects */ for (i = 0; i < rp_ptr->obj_num; i++) - outfit_obj(rp_ptr->obj_tval[i], rp_ptr->obj_sval[i], rp_ptr->obj_pval[i], rp_ptr->obj_dd[i], rp_ptr->obj_ds[i]); + { + outfit_obj(&rp_ptr->obj[i]); + } for (i = 0; i < rmp_ptr->obj_num; i++) - outfit_obj(rmp_ptr->obj_tval[i], rmp_ptr->obj_sval[i], rmp_ptr->obj_pval[i], rmp_ptr->obj_dd[i], rmp_ptr->obj_ds[i]); + { + outfit_obj(&rmp_ptr->obj[i]); + } for (i = 0; i < cp_ptr->obj_num; i++) - outfit_obj(cp_ptr->obj_tval[i], cp_ptr->obj_sval[i], cp_ptr->obj_pval[i], cp_ptr->obj_dd[i], cp_ptr->obj_ds[i]); + { + outfit_obj(&cp_ptr->obj[i]); + } for (i = 0; i < cp_ptr->spec[p_ptr->pspec].obj_num; i++) - outfit_obj(cp_ptr->spec[p_ptr->pspec].obj_tval[i], cp_ptr->spec[p_ptr->pspec].obj_sval[i], cp_ptr->spec[p_ptr->pspec].obj_pval[i], cp_ptr->spec[p_ptr->pspec].obj_dd[i], cp_ptr->spec[p_ptr->pspec].obj_ds[i]); + { + outfit_obj(&cp_ptr->spec[p_ptr->pspec].obj[i]); + } } diff --git a/src/init1.cc b/src/init1.cc index e504f5ed..5b1e5709 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -837,6 +837,35 @@ static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf) } +/* + * Read prototype objects + */ +static int read_proto_object(object_proto *proto, s16b *num, cptr buf) +{ + int s0, s1, s2, s3, s4; + + if (5 != sscanf(buf, "%d:%d:%d:%dd%d", &s0, &s1, &s4, &s2, &s3)) + { + s4 = 0; + + if (4 != sscanf(buf, "%d:%d:%dd%d", &s0, &s1, &s2, &s3)) + { + return 1; + } + } + + proto->pval = s4; + proto->tval = s0; + proto->sval = s1; + proto->dd = s2; + proto->ds = s3; + + (*num)++; + + return 0; +} + + /* * Initialize the "player" arrays, by parsing an ascii "template" file */ @@ -1136,27 +1165,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'R') && (buf[2] == 'O')) { - int s[5]; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d", - &s[0], &s[1], &s[4], &s[2], &s[3])) + if (read_proto_object(&rp_ptr->obj[rp_ptr->obj_num], &rp_ptr->obj_num, buf + 4)) { - s[4] = 0; - - if (4 != sscanf(buf + 4, "%d:%d:%dd%d", - &s[0], &s[1], &s[2], &s[3])) - { - return (1); - } + return 1; } - rp_ptr->obj_pval[rp_ptr->obj_num] = s[4]; - rp_ptr->obj_tval[rp_ptr->obj_num] = s[0]; - rp_ptr->obj_sval[rp_ptr->obj_num] = s[1]; - rp_ptr->obj_dd[rp_ptr->obj_num] = s[2]; - rp_ptr->obj_ds[rp_ptr->obj_num++] = s[3]; - /* Next... */ continue; } @@ -1402,27 +1415,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'S') && (buf[2] == 'O')) { - int s[5]; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d", - &s[0], &s[1], &s[4], &s[2], &s[3])) + if (read_proto_object(&rmp_ptr->obj[rmp_ptr->obj_num], &rmp_ptr->obj_num, buf + 4)) { - s[4] = 0; - - if (4 != sscanf(buf + 4, "%d:%d:%dd%d", - &s[0], &s[1], &s[2], &s[3])) - { - return (1); - } + return 1; } - rmp_ptr->obj_pval[rmp_ptr->obj_num] = s[4]; - rmp_ptr->obj_tval[rmp_ptr->obj_num] = s[0]; - rmp_ptr->obj_sval[rmp_ptr->obj_num] = s[1]; - rmp_ptr->obj_dd[rmp_ptr->obj_num] = s[2]; - rmp_ptr->obj_ds[rmp_ptr->obj_num++] = s[3]; - /* Next... */ continue; } @@ -1560,27 +1557,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'C') && (buf[2] == 'O')) { - int s[5]; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%d:%d:%d:%dd%d", - &s[0], &s[1], &s[4], &s[2], &s[3])) + if (read_proto_object(&c_ptr->obj[c_ptr->obj_num], &c_ptr->obj_num, buf + 4)) { - s[4] = 0; - - if (4 != sscanf(buf + 4, "%d:%d:%dd%d", - &s[0], &s[1], &s[2], &s[3])) - { - return (1); - } + return 1; } - c_ptr->obj_pval[c_ptr->obj_num] = s[4]; - c_ptr->obj_tval[c_ptr->obj_num] = s[0]; - c_ptr->obj_sval[c_ptr->obj_num] = s[1]; - c_ptr->obj_dd[c_ptr->obj_num] = s[2]; - c_ptr->obj_ds[c_ptr->obj_num++] = s[3]; - /* Next... */ continue; } @@ -1861,27 +1842,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if (buf[4] == 'O') { - int s[5]; - - /* Scan for the values */ - if (5 != sscanf(buf + 6, "%d:%d:%d:%dd%d", - &s[0], &s[1], &s[4], &s[2], &s[3])) + if (read_proto_object(&s_ptr->obj[s_ptr->obj_num], &s_ptr->obj_num, buf + 6)) { - s[4] = 0; - - if (4 != sscanf(buf + 6, "%d:%d:%dd%d", - &s[0], &s[1], &s[2], &s[3])) - { - return (1); - } + return 1; } - s_ptr->obj_pval[s_ptr->obj_num] = s[4]; - s_ptr->obj_tval[s_ptr->obj_num] = s[0]; - s_ptr->obj_sval[s_ptr->obj_num] = s[1]; - s_ptr->obj_dd[s_ptr->obj_num] = s[2]; - s_ptr->obj_ds[s_ptr->obj_num++] = s[3]; - /* Next... */ continue; } diff --git a/src/object_proto.hpp b/src/object_proto.hpp new file mode 100644 index 00000000..faa0b2e8 --- /dev/null +++ b/src/object_proto.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "h-basic.h" + +struct object_proto +{ + s16b tval = 0; + s16b sval = 0; + s16b pval = 0; + s16b dd = 0; + s16b ds = 0; +}; diff --git a/src/player_class.hpp b/src/player_class.hpp index e3a124e6..32f6e711 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -3,6 +3,7 @@ #include "body.hpp" #include "h-basic.h" #include "object_flag_set.hpp" +#include "object_proto.hpp" #include "player_defs.hpp" #include "player_race_flag_set.hpp" #include "player_spec.hpp" @@ -43,11 +44,7 @@ struct player_class byte sense_heavy = 0; byte sense_heavy_magic = 0; - s16b obj_tval[5] { }; - s16b obj_sval[5] { }; - s16b obj_pval[5] { }; - s16b obj_dd[5] { }; - s16b obj_ds[5] { }; + std::array obj; s16b obj_num = 0; char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ diff --git a/src/player_race.hpp b/src/player_race.hpp index 6e2b861d..740c6a5a 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -3,6 +3,7 @@ #include "h-basic.h" #include "body.hpp" #include "object_flag_set.hpp" +#include "object_proto.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" @@ -43,11 +44,7 @@ struct player_race struct skill_modifiers skill_modifiers; - s16b obj_tval[5] { }; - s16b obj_sval[5] { }; - s16b obj_pval[5] { }; - s16b obj_dd[5] { }; - s16b obj_ds[5] { }; + std::array obj; s16b obj_num = 0; std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 0472c4ee..9f8c4917 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -3,6 +3,7 @@ #include "body.hpp" #include "h-basic.h" #include "object_flag_set.hpp" +#include "object_proto.hpp" #include "player_defs.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" @@ -47,11 +48,7 @@ struct player_race_mod struct skill_modifiers skill_modifiers; - s16b obj_tval[5] { }; - s16b obj_sval[5] { }; - s16b obj_pval[5] { }; - s16b obj_dd[5] { }; - s16b obj_ds[5] { }; + std::array obj; s16b obj_num = 0; std::array abilities; /* Abilities to be gained by level; doesnt take prereqs in account */ diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 328789b6..a02103d5 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "object_proto.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" #include "skill_modifiers.hpp" @@ -17,11 +18,7 @@ struct player_spec struct skill_modifiers skill_modifiers; - s16b obj_tval[5] { }; - s16b obj_sval[5] { }; - s16b obj_pval[5] { }; - s16b obj_dd[5] { }; - s16b obj_ds[5] { }; + std::array obj; s16b obj_num = 0; u32b gods = 0; -- cgit v1.2.3 From b7ca0a34a2a01ab496dbb829011d40b01106017d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Use std::vector<> for object_proto members --- src/birth.cc | 32 ++++++++++++++------------------ src/init1.cc | 25 ++++++++++++------------- src/player_class.hpp | 3 +-- src/player_race.hpp | 4 ++-- src/player_race_mod.hpp | 4 ++-- src/player_spec.hpp | 4 ++-- 6 files changed, 33 insertions(+), 39 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 03e651a2..be8a8a33 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -936,6 +936,15 @@ static void outfit_obj(object_proto const *proto) } +static void outfit_objs(std::vector const &protos) +{ + for (auto const &proto: protos) + { + outfit_obj(&proto); + } +} + + /* * Give the player an object. */ @@ -972,7 +981,6 @@ static void player_outfit_spellbook(cptr spell_name) */ static void player_outfit(void) { - int i; cptr class_name = spp_ptr->title; cptr subrace_name = rmp_ptr->title; @@ -1160,23 +1168,11 @@ static void player_outfit(void) (void)inven_carry(q_ptr, FALSE); } - /* Hack -- Give the player some useful objects */ - for (i = 0; i < rp_ptr->obj_num; i++) - { - outfit_obj(&rp_ptr->obj[i]); - } - for (i = 0; i < rmp_ptr->obj_num; i++) - { - outfit_obj(&rmp_ptr->obj[i]); - } - for (i = 0; i < cp_ptr->obj_num; i++) - { - outfit_obj(&cp_ptr->obj[i]); - } - for (i = 0; i < cp_ptr->spec[p_ptr->pspec].obj_num; i++) - { - outfit_obj(&cp_ptr->spec[p_ptr->pspec].obj[i]); - } + /* Outfit the player with starting items */ + outfit_objs(rp_ptr->object_protos); + outfit_objs(rmp_ptr->object_protos); + outfit_objs(cp_ptr->object_protos); + outfit_objs(cp_ptr->spec[p_ptr->pspec].object_protos); } diff --git a/src/init1.cc b/src/init1.cc index 5b1e5709..14175b2c 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -840,7 +840,7 @@ static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf) /* * Read prototype objects */ -static int read_proto_object(object_proto *proto, s16b *num, cptr buf) +static int read_proto_object(std::vector *protos, cptr buf) { int s0, s1, s2, s3, s4; @@ -854,13 +854,14 @@ static int read_proto_object(object_proto *proto, s16b *num, cptr buf) } } - proto->pval = s4; - proto->tval = s0; - proto->sval = s1; - proto->dd = s2; - proto->ds = s3; + object_proto proto; + proto.pval = s4; + proto.tval = s0; + proto.sval = s1; + proto.dd = s2; + proto.ds = s3; - (*num)++; + protos->emplace_back(proto); return 0; } @@ -1165,7 +1166,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'R') && (buf[2] == 'O')) { - if (read_proto_object(&rp_ptr->obj[rp_ptr->obj_num], &rp_ptr->obj_num, buf + 4)) + if (read_proto_object(&rp_ptr->object_protos, buf + 4)) { return 1; } @@ -1415,7 +1416,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'S') && (buf[2] == 'O')) { - if (read_proto_object(&rmp_ptr->obj[rmp_ptr->obj_num], &rmp_ptr->obj_num, buf + 4)) + if (read_proto_object(&rmp_ptr->object_protos, buf + 4)) { return 1; } @@ -1505,7 +1506,6 @@ errr init_player_info_txt(FILE *fp) for (z = 0; z < 10; z++) c_ptr->abilities[z].level = -1; cur_ab = 0; - c_ptr->obj_num = 0; tit_idx = 0; spec_idx = -1; for (z = 0; z < MAX_SPEC; z++) @@ -1557,7 +1557,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if ((buf[0] == 'C') && (buf[2] == 'O')) { - if (read_proto_object(&c_ptr->obj[c_ptr->obj_num], &c_ptr->obj_num, buf + 4)) + if (read_proto_object(&c_ptr->object_protos, buf + 4)) { return 1; } @@ -1811,7 +1811,6 @@ errr init_player_info_txt(FILE *fp) s_ptr->title = my_strdup(s); /* Initialize */ - s_ptr->obj_num = 0; cur_ab = 0; for (z = 0; z < 10; z++) s_ptr->abilities[z].level = -1; @@ -1842,7 +1841,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'O' for "Object birth" */ if (buf[4] == 'O') { - if (read_proto_object(&s_ptr->obj[s_ptr->obj_num], &s_ptr->obj_num, buf + 6)) + if (read_proto_object(&s_ptr->object_protos, buf + 6)) { return 1; } diff --git a/src/player_class.hpp b/src/player_class.hpp index 32f6e711..bfa4bfde 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -44,8 +44,7 @@ struct player_class byte sense_heavy = 0; byte sense_heavy_magic = 0; - std::array obj; - s16b obj_num = 0; + std::vector object_protos; char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ diff --git a/src/player_race.hpp b/src/player_race.hpp index 740c6a5a..203999ad 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -11,6 +11,7 @@ #include "skill_modifiers.hpp" #include +#include /** * Player racial descriptior. @@ -44,8 +45,7 @@ struct player_race struct skill_modifiers skill_modifiers; - std::array obj; - s16b obj_num = 0; + std::vector object_protos; std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ }; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 9f8c4917..bf203cc6 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -11,6 +11,7 @@ #include "skills_defs.hpp" #include +#include struct player_race_mod { @@ -48,8 +49,7 @@ struct player_race_mod struct skill_modifiers skill_modifiers; - std::array obj; - s16b obj_num = 0; + std::vector object_protos; std::array abilities; /* Abilities to be gained by level; doesnt take prereqs in account */ }; diff --git a/src/player_spec.hpp b/src/player_spec.hpp index a02103d5..3d1c4471 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -7,6 +7,7 @@ #include "skill_modifiers.hpp" #include +#include /** * Player class descriptor. @@ -18,8 +19,7 @@ struct player_spec struct skill_modifiers skill_modifiers; - std::array obj; - s16b obj_num = 0; + std::vector object_protos; u32b gods = 0; -- cgit v1.2.3 From f507d6fb86fe7cfaf4dec69afa36875a1a4aaae4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove unused player_class::sense_* members --- lib/edit/p_info.txt | 7 ------- lib/mods/theme/edit/p_info.txt | 8 -------- src/init1.cc | 20 -------------------- src/player_class.hpp | 6 ------ 4 files changed, 41 deletions(-) diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index fc5f2069..8fd03864 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -65,7 +65,6 @@ C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:0 C:B:4:30:5 -C:C:H:L:9000:2:40 C:P:9:0 C:R:30:0 C:F:RES_FEAR @@ -195,7 +194,6 @@ C:D:1:Ipsissimus C:D:1:Archimage C:S:-5:3:0:1:-2:1:50:0 C:B:4:40:2 -C:C:L:H:240000:1:5 C:P:0:30 C:E:0:0:0:0:0:0 C:k:+1000:+900:Magic @@ -350,7 +348,6 @@ C:D:1:Archer C:D:1:Great Archer C:S:2:1:0:2:1:1:0:0 C:B:4:35:4 -C:C:H:L:9000:2:40 C:P:4:30 C:E:0:0:0:0:0:0 C:k:+1000:+800:Combat @@ -417,7 +414,6 @@ C:D:1:Assassin C:D:1:Guildmaster C:S:2:1:-2:3:1:-1:0:0 C:B:4:30:3 -C:C:H:H:20000:2:40 C:P:6:25 C:O:23:4:1d1 C:G:EASE_STEAL @@ -510,7 +506,6 @@ C:D:1:Loremaster C:D:1:Loremaster C:S:1:-2:1:1:0:1:0:0 C:B:4:30:3 -C:C:H:L:9000:2:40 C:P:8:40 C:E:0:0:0:0:0:0 C:k:+1000:+700:Combat @@ -672,7 +667,6 @@ C:D:1:Inquisitor C:D:1:Pope C:S:-1:-3:3:-1:0:2:0:0 C:B:4:35:3 -C:C:L:H:10000:2:40 C:P:2:20 C:Z:detect curses C:G:GOD_FRIEND @@ -772,7 +766,6 @@ C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 C:B:6:30:5 -C:C:H:L:9000:2:40 C:P:9:0 C:R:30:0 C:F:RES_FEAR diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 5c993abe..3137b7f1 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -65,7 +65,6 @@ C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 C:B:4:30:5 -C:C:H:L:9000:2:40 C:P:9:0 C:R:30:0 C:F:RES_FEAR @@ -220,7 +219,6 @@ C:D:1:Ipsissimus C:D:1:Archimage C:S:-5:3:0:1:-2:1:50:0 C:B:4:40:2 -C:C:L:H:240000:1:5 C:P:0:30 C:E:0:0:0:0:0:0 C:k:+1000:+900:Magic @@ -413,7 +411,6 @@ C:D:1:Archer C:D:1:Great Archer C:S:2:1:0:2:1:1:0:0 C:B:4:35:4 -C:C:H:L:9000:2:40 C:P:4:30 C:E:0:0:0:0:0:0 C:k:+1000:+800:Combat @@ -501,7 +498,6 @@ C:D:1:Assassin C:D:1:Guildmaster C:S:2:1:-2:3:1:-1:0:0 C:B:4:30:3 -C:C:H:H:20000:2:40 C:P:6:25 C:O:23:4:1d1 C:G:EASE_STEAL @@ -607,7 +603,6 @@ C:D:1:Loremaster C:D:1:Loremaster C:S:1:-2:1:1:0:1:0:0 C:B:4:30:3 -C:C:H:L:9000:2:40 C:P:8:40 C:E:0:0:0:0:0:0 C:k:+1000:+700:Combat @@ -806,7 +801,6 @@ C:D:1:Peacemaker C:S:0:2:2:2:0:4:0:0 C:P:0:0 C:B:0:0:0 -C:C:H:H:20000:2:40 C:Z:detect doors and traps C:E:-1:0:0:0:0:0 C:k:=0:=0:Combat @@ -863,7 +857,6 @@ C:D:1:Inquisitor C:D:1:Pope C:S:-1:-3:3:-1:0:2:0:0 C:B:4:35:3 -C:C:L:H:10000:2:40 C:P:2:20 C:Z:detect curses C:G:GOD_FRIEND @@ -1008,7 +1001,6 @@ C:D:1:Duke C:D:1:Lord C:S:5:-2:-2:2:2:-1:0:3 C:B:6:30:5 -C:C:H:L:9000:2:40 C:P:9:0 C:R:30:0 C:F:RES_FEAR diff --git a/src/init1.cc b/src/init1.cc index 14175b2c..de19105d 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1707,26 +1707,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'C' for "sensing" */ - if ((buf[0] == 'C') && (buf[2] == 'C')) - { - long int s[3]; - char h, m; - - /* Scan for the values */ - if (5 != sscanf(buf + 4, "%c:%c:%ld:%ld:%ld", - &h, &m, &s[0], &s[1], &s[2])) return (1); - - c_ptr->sense_heavy = (h == 'H') ? TRUE : FALSE; - c_ptr->sense_heavy_magic = (m == 'H') ? TRUE : FALSE; - c_ptr->sense_base = s[0]; - c_ptr->sense_pl = s[1]; - c_ptr->sense_plus = s[2]; - - /* Next... */ - continue; - } - /* Process 'B' for "blows" */ if ((buf[0] == 'C') && (buf[2] == 'B')) { diff --git a/src/player_class.hpp b/src/player_class.hpp index bfa4bfde..53e712f9 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -38,12 +38,6 @@ struct player_class s16b blow_mul = 0; s16b extra_blows = 0; - s32b sense_base = 0; - s32b sense_pl = 0; - s32b sense_plus = 0; - byte sense_heavy = 0; - byte sense_heavy_magic = 0; - std::vector object_protos; char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ -- cgit v1.2.3 From 0a16384475488d682e33c8d55691e5d9417412ac Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify opval/oflags in player_* structs into player_level_flag --- src/corrupt.cc | 18 +++++++++--------- src/files.cc | 23 +++++++++++++---------- src/init1.cc | 12 ++++++------ src/loadsave.cc | 10 ++++++++-- src/player_class.hpp | 4 ++-- src/player_level_flag.hpp | 13 +++++++++++++ src/player_race.hpp | 4 ++-- src/player_race_mod.hpp | 4 ++-- src/xtra1.cc | 29 ++++++++++++++++++----------- 9 files changed, 73 insertions(+), 44 deletions(-) create mode 100644 src/player_level_flag.hpp diff --git a/src/corrupt.cc b/src/corrupt.cc index 64569264..8ad22ea9 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -106,15 +106,15 @@ static void player_gain_vampire() } /* Bonus/and .. not bonus :) */ - rmp_ptr->flags = rmp_ptr->flags | PR_HURT_LITE; - rmp_ptr->oflags[2] = rmp_ptr->oflags[2] - | TR_RES_POIS - | TR_RES_NETHER - | TR_RES_COLD - | TR_RES_DARK - | TR_HOLD_LIFE; - rmp_ptr->oflags[2] = rmp_ptr->oflags[2] - | TR_LITE1; + rmp_ptr->flags |= PR_HURT_LITE; + rmp_ptr->lflags[1].oflags |= + ( TR_RES_POIS + | TR_RES_NETHER + | TR_RES_COLD + | TR_RES_DARK + | TR_HOLD_LIFE + | TR_LITE1 + ); } /** diff --git a/src/files.cc b/src/files.cc index 4cd95447..ec569e73 100644 --- a/src/files.cc +++ b/src/files.cc @@ -1575,6 +1575,16 @@ static object_flag_set wield_monster_flags() } +template +static void apply_lflags(LF const &lflags, object_flag_set *f) +{ + for (int i = 1; i <= p_ptr->lev; i++) + { + (*f) |= lflags[i].oflags; + } +} + + /* * Obtain the "flags" for the player as if he was an item */ @@ -1680,20 +1690,13 @@ object_flag_set player_flags() } /* Classes */ - for (int i = 1; i <= p_ptr->lev; i++) - { - f |= cp_ptr->oflags[i]; - } + apply_lflags(cp_ptr->lflags, &f); /* Races */ if ((!p_ptr->mimic_form) && (!p_ptr->body_monster)) { - for (int i = 1; i <= p_ptr->lev; i++) - { - f |= rp_ptr->oflags[i]; - - f |= rmp_ptr->oflags[i]; - } + apply_lflags(rp_ptr->lflags, &f); + apply_lflags(rmp_ptr->lflags, &f); } else { diff --git a/src/init1.cc b/src/init1.cc index de19105d..412dde11 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1040,7 +1040,7 @@ errr init_player_info_txt(FILE *fp) &s[0], &s[1])) return (1); lev = s[0]; - rp_ptr->opval[lev] = s[1]; + rp_ptr->lflags[lev].pval = s[1]; /* Next... */ continue; @@ -1154,7 +1154,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'F' for "level Flags" (multiple lines) */ if ((buf[0] == 'R') && (buf[2] == 'F')) { - if (grab_object_flag(&rp_ptr->oflags[lev], buf + 4)) + if (grab_object_flag(&rp_ptr->lflags[lev].oflags, buf + 4)) { return (5); } @@ -1290,7 +1290,7 @@ errr init_player_info_txt(FILE *fp) &s[0], &s[1])) return (1); lev = s[0]; - rmp_ptr->opval[lev] = s[1]; + rmp_ptr->lflags[lev].pval = s[1]; /* Next... */ continue; @@ -1404,7 +1404,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_object_flag(&rmp_ptr->oflags[lev], buf + 4)) + if (0 != grab_object_flag(&rmp_ptr->lflags[lev].oflags, buf + 4)) { return (5); } @@ -1592,7 +1592,7 @@ errr init_player_info_txt(FILE *fp) &s[0], &s[1])) return (1); lev = s[0]; - c_ptr->opval[lev] = s[1]; + c_ptr->lflags[lev].pval = s[1]; /* Next... */ continue; @@ -1753,7 +1753,7 @@ errr init_player_info_txt(FILE *fp) } /* Parse this entry */ - if (0 != grab_object_flag(&c_ptr->oflags[lev], s)) + if (0 != grab_object_flag(&c_ptr->lflags[lev].oflags, s)) { return (5); } diff --git a/src/loadsave.cc b/src/loadsave.cc index 1d3e8144..07e2c4fc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -19,6 +19,7 @@ #include "object2.hpp" #include "object_kind.hpp" #include "player_class.hpp" +#include "player_level_flag.hpp" #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" @@ -277,6 +278,12 @@ static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) } } +static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) +{ + do_flag_set(&lflag->oflags, flag); + do_s16b(&lflag->pval, flag); +} + /* * The special saved subrace */ @@ -335,8 +342,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < PY_MAX_LEVEL + 1; i++) { - do_flag_set(&sr_ptr->oflags[i], flag); - do_s16b(&sr_ptr->opval[i], flag); + do_player_level_flag(&sr_ptr->lflags[i], flag); } do_byte(&sr_ptr->g_attr, flag); diff --git a/src/player_class.hpp b/src/player_class.hpp index 53e712f9..e0f88008 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -5,6 +5,7 @@ #include "object_flag_set.hpp" #include "object_proto.hpp" #include "player_defs.hpp" +#include "player_level_flag.hpp" #include "player_race_flag_set.hpp" #include "player_spec.hpp" #include "skill_modifiers.hpp" @@ -42,8 +43,7 @@ struct player_class char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - std::array oflags; - s16b opval[PY_MAX_LEVEL + 1] { }; + std::array lflags; struct skill_modifiers skill_modifiers; diff --git a/src/player_level_flag.hpp b/src/player_level_flag.hpp new file mode 100644 index 00000000..fe4c862c --- /dev/null +++ b/src/player_level_flag.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "h-basic.h" +#include "object_flag_set.hpp" +#include "player_defs.hpp" + +struct player_level_flag { + + object_flag_set oflags; + + s16b pval = 0; + +}; diff --git a/src/player_race.hpp b/src/player_race.hpp index 203999ad..844eeb75 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -5,6 +5,7 @@ #include "object_flag_set.hpp" #include "object_proto.hpp" #include "player_defs.hpp" +#include "player_level_flag.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" #include "skills_defs.hpp" @@ -40,8 +41,7 @@ struct player_race player_race_flag_set flags; - std::array oflags; - s16b opval[PY_MAX_LEVEL + 1] { }; + std::array lflags; struct skill_modifiers skill_modifiers; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index bf203cc6..40264ba3 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -5,6 +5,7 @@ #include "object_flag_set.hpp" #include "object_proto.hpp" #include "player_defs.hpp" +#include "player_level_flag.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" #include "skill_modifiers.hpp" @@ -41,8 +42,7 @@ struct player_race_mod player_race_flag_set flags; - std::array oflags; - s16b opval[PY_MAX_LEVEL + 1] { }; + std::array lflags; byte g_attr = 0; /* Overlay graphic attribute */ char g_char = '\0'; /* Overlay graphic character */ diff --git a/src/xtra1.cc b/src/xtra1.cc index a816efb1..066bd0fb 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2727,6 +2727,18 @@ void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b } +/** + * Apply player level flags + */ +template +static void apply_lflags(LF const &lflags) +{ + for (int i = 1; i <= p_ptr->lev; i++) + { + apply_flags(lflags[i].oflags, lflags[i].pval, 0, 0, 0, 0); + } +} + /** * Are barehand fighter's hands empty? @@ -2978,10 +2990,8 @@ void calc_bonuses(bool_ silent) /* The powers gived by the wielded monster */ calc_wield_monster(); - for (i = 1; i <= p_ptr->lev; i++) - { - apply_flags(cp_ptr->oflags[i], cp_ptr->opval[i], 0, 0, 0, 0); - } + /* Apply all the level-dependent class flags */ + apply_lflags(cp_ptr->lflags); if (p_ptr->melee_style == SKILL_HAND) { @@ -3022,14 +3032,11 @@ void calc_bonuses(bool_ silent) /***** Races ****/ if ((!p_ptr->mimic_form) && (!p_ptr->body_monster)) { - int i; - - for (i = 1; i <= p_ptr->lev; i++) - { - apply_flags(rp_ptr->oflags[i], rp_ptr->opval[i], 0, 0, 0, 0); - apply_flags(rmp_ptr->oflags[i], rmp_ptr->opval[i], 0, 0, 0, 0); - } + /* Apply level-dependent flags from race/sub-race */ + apply_lflags(rp_ptr->lflags); + apply_lflags(rmp_ptr->lflags); + /* Is the player's race hurt by light? */ if (race_flags_p(PR_HURT_LITE)) p_ptr->sensible_lite = TRUE; } -- cgit v1.2.3 From 10c45c9975c076476cf1bcb6a1260c1ee055a6a1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Change 'abilities' member of player_* to a std::vector<> --- src/init1.cc | 119 +++++++++++++++++++----------------------------- src/player_class.hpp | 2 +- src/player_race.hpp | 2 +- src/player_race_mod.hpp | 2 +- src/player_spec.hpp | 2 +- src/skills.cc | 46 ++++++------------- 6 files changed, 66 insertions(+), 107 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 412dde11..def2cdb1 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -867,17 +867,56 @@ static int read_proto_object(std::vector *protos, cptr buf) } +/* + * Read an ability assignment + */ +static int read_ability(std::vector *abilities, char *buf) +{ + int level = 0; + char *name = nullptr; + + // Find the ':' separator + if (!(name = strchr(buf, ':'))) + { + return 1; + } + + // Split the buffer there and advance to point at the ability name + name++; + + // Extract the level + if (1 != sscanf(buf, "%d:", &level)) + { + return 1; + } + + // Try to find the ability by name + int idx = find_ability(name); + if (idx < 0) + { + return 1; + } + + // Insert + player_race_ability_type ability; + ability.ability = idx; + ability.level = level; + abilities->emplace_back(ability); + + return 0; +} + + /* * Initialize the "player" arrays, by parsing an ascii "template" file */ errr init_player_info_txt(FILE *fp) { - int i = 0, z; + int i = 0; int powers = 0; int lev = 1; int tit_idx = 0; int spec_idx = 0; - int cur_ab = -1; char buf[1024]; char *s, *t; @@ -987,9 +1026,6 @@ errr init_player_info_txt(FILE *fp) rp_ptr->powers[0] = rp_ptr->powers[1] = rp_ptr->powers[2] = rp_ptr->powers[3] = -1; powers = 0; lev = 1; - cur_ab = 0; - for (z = 0; z < 10; z++) - rp_ptr->abilities[z].level = -1; /* Next... */ continue; @@ -1100,22 +1136,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'b' for "abilities" */ if ((buf[0] == 'R') && (buf[2] == 'b')) { - char *sec; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 4, ':'))) + if (read_ability(&rp_ptr->abilities, buf + 4)) { - return (1); + return 1; } - *sec = '\0'; - sec++; - if (!*sec) return (1); - - if ((i = find_ability(sec)) == -1) return (1); - - rp_ptr->abilities[cur_ab].ability = i; - rp_ptr->abilities[cur_ab].level = atoi(buf + 4); - cur_ab++; /* Next... */ continue; @@ -1225,9 +1249,6 @@ errr init_player_info_txt(FILE *fp) rmp_ptr->powers[0] = rmp_ptr->powers[1] = rmp_ptr->powers[2] = rmp_ptr->powers[3] = -1; powers = 0; lev = 1; - cur_ab = 0; - for (z = 0; z < 10; z++) - rmp_ptr->abilities[z].level = -1; /* Next... */ continue; @@ -1351,22 +1372,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'b' for "abilities" */ if ((buf[0] == 'S') && (buf[2] == 'b')) { - char *sec; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 4, ':'))) + if (read_ability(&rmp_ptr->abilities, buf + 4)) { return (1); } - *sec = '\0'; - sec++; - if (!*sec) return (1); - - if ((i = find_ability(sec)) == -1) return (1); - - rmp_ptr->abilities[cur_ab].ability = i; - rmp_ptr->abilities[cur_ab].level = atoi(buf + 4); - cur_ab++; /* Next... */ continue; @@ -1503,9 +1512,6 @@ errr init_player_info_txt(FILE *fp) c_ptr->powers[0] = c_ptr->powers[1] = c_ptr->powers[2] = c_ptr->powers[3] = -1; powers = 0; lev = 1; - for (z = 0; z < 10; z++) - c_ptr->abilities[z].level = -1; - cur_ab = 0; tit_idx = 0; spec_idx = -1; for (z = 0; z < MAX_SPEC; z++) @@ -1631,22 +1637,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'b' for "abilities" */ if ((buf[0] == 'C') && (buf[2] == 'b')) { - char *sec; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 4, ':'))) + if (read_ability(&c_ptr->abilities, buf + 4)) { - return (1); + return 1; } - *sec = '\0'; - sec++; - if (!*sec) return (1); - - if ((i = find_ability(sec)) == -1) return (1); - - c_ptr->abilities[cur_ab].ability = i; - c_ptr->abilities[cur_ab].level = atoi(buf + 4); - cur_ab++; /* Next... */ continue; @@ -1790,11 +1784,6 @@ errr init_player_info_txt(FILE *fp) assert(!s_ptr->title); s_ptr->title = my_strdup(s); - /* Initialize */ - cur_ab = 0; - for (z = 0; z < 10; z++) - s_ptr->abilities[z].level = -1; - /* Next... */ continue; } @@ -1862,22 +1851,10 @@ errr init_player_info_txt(FILE *fp) /* Process 'b' for "abilities" */ if (buf[4] == 'b') { - char *sec; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 6, ':'))) + if (read_ability(&s_ptr->abilities, buf + 6)) { - return (1); + return 1; } - *sec = '\0'; - sec++; - if (!*sec) return (1); - - if ((i = find_ability(sec)) == -1) return (1); - - s_ptr->abilities[cur_ab].ability = i; - s_ptr->abilities[cur_ab].level = atoi(buf + 6); - cur_ab++; /* Next... */ continue; diff --git a/src/player_class.hpp b/src/player_class.hpp index e0f88008..57282e27 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -51,6 +51,6 @@ struct player_class std::array spec; - std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; diff --git a/src/player_race.hpp b/src/player_race.hpp index 844eeb75..36c9109e 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -47,5 +47,5 @@ struct player_race std::vector object_protos; - std::array abilities; /* Abilitiers to be gained by level(doesnt take prereqs in account) */ + std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 40264ba3..da3ae0ca 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -51,6 +51,6 @@ struct player_race_mod std::vector object_protos; - std::array abilities; /* Abilities to be gained by level; doesnt take prereqs in account */ + std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; diff --git a/src/player_spec.hpp b/src/player_spec.hpp index 3d1c4471..574425f6 100644 --- a/src/player_spec.hpp +++ b/src/player_spec.hpp @@ -25,5 +25,5 @@ struct player_spec player_race_flag_set flags; - std::array abilities; /* Abilities to be gained by level(doesnt take prereqs in account) */ + std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; diff --git a/src/skills.cc b/src/skills.cc index bc508c54..70665a49 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1749,41 +1749,23 @@ void do_cmd_ability() */ void apply_level_abilities(int level) { - int i; - - for (i = 0; i < 10; i++) + auto apply = [level](std::vector const &abilities) -> void { - if (cp_ptr->abilities[i].level == level) - { - if ((level > 1) && (!ab_info[cp_ptr->abilities[i].ability].acquired)) - { - cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[cp_ptr->abilities[i].ability].name); - } - ab_info[cp_ptr->abilities[i].ability].acquired = TRUE; - } - if (spp_ptr->abilities[i].level == level) + for (auto const &a: abilities) { - if ((level > 1) && (!ab_info[spp_ptr->abilities[i].ability].acquired)) + if (a.level == level) { - cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[spp_ptr->abilities[i].ability].name); - } - ab_info[spp_ptr->abilities[i].ability].acquired = TRUE; - } - if (rp_ptr->abilities[i].level == level) - { - if ((level > 1) && (!ab_info[rp_ptr->abilities[i].ability].acquired)) - { - cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[rp_ptr->abilities[i].ability].name); - } - ab_info[rp_ptr->abilities[i].ability].acquired = TRUE; - } - if (rmp_ptr->abilities[i].level == level) - { - if ((level > 1) && (!ab_info[rmp_ptr->abilities[i].ability].acquired)) - { - cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[rmp_ptr->abilities[i].ability].name); + if ((level > 1) && (!ab_info[a.ability].acquired)) + { + cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[a.ability].name); + } + ab_info[a.ability].acquired = TRUE; } - ab_info[rmp_ptr->abilities[i].ability].acquired = TRUE; } - } + }; + + apply(cp_ptr->abilities); + apply(spp_ptr->abilities); + apply(rp_ptr->abilities); + apply(rmp_ptr->abilities); } -- cgit v1.2.3 From 1229c2ce5a196b39e0c9602c8fb037b394b18833 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Add uniform_element() to z-rand --- src/z-rand.hpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/z-rand.hpp b/src/z-rand.hpp index bbf14584..cac28167 100644 --- a/src/z-rand.hpp +++ b/src/z-rand.hpp @@ -65,3 +65,23 @@ s32b rand_range(s32b a, s32b b); * Note: rand_spread(A,D) == rand_range(A-D,A+D) */ s32b rand_spread(s32b a, s32b d); + +/** + * Choose a random element in from the given container. + * The container, C, must fulfill the Container concept + * whose iterators fulfill the RandomIterator concept. + **/ +template typename C::const_iterator uniform_element(C const &c) +{ + return c.begin() + rand_int(c.size()); +} + +/** + * Choose a random element in from the given container. + * The container, C, must fulfill the Container concept + * whose iterators fulfill the RandomIterator concept. + **/ +template typename C::iterator uniform_element(C &c) +{ + return c.begin() + rand_int(c.size()); +} -- cgit v1.2.3 From 347afc50368137901a989ac4a4fc9298056c7377 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify store_info_type::item_* info std::vector --- src/init1.cc | 34 +++++++++++++--------------------- src/store.cc | 8 ++++---- src/store_info_type.hpp | 10 +++------- src/store_item.hpp | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 32 deletions(-) create mode 100644 src/store_item.hpp diff --git a/src/init1.cc b/src/init1.cc index def2cdb1..6fef9561 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5723,7 +5723,7 @@ static errr grab_one_store_flag(store_flag_set *flags, cptr what) */ errr init_st_info_txt(FILE *fp) { - int i = 0, item_idx = 0; + int i = 0; char buf[1024]; char *s; @@ -5783,9 +5783,6 @@ errr init_st_info_txt(FILE *fp) assert(!st_ptr->name); st_ptr->name = my_strdup(s); - /* We are ready for a new set of objects */ - item_idx = 0; - /* Next... */ continue; } @@ -5808,15 +5805,11 @@ errr init_st_info_txt(FILE *fp) /* Paranoia -- require a name */ if (!*s) return (1); - /* Get the index */ - st_ptr->item_chance[item_idx] = atoi(buf + 2); - - /* Append chars to the name */ - st_ptr->item_kind[item_idx] = test_item_name(s); - - item_idx++; - st_ptr->item_num = item_idx; - assert(st_ptr->item_num <= STORE_CHOICES); + /* Add to items array */ + store_item item; + item.chance = atoi(buf + 2); + item.kind = test_item_name(s); + st_ptr->items.emplace_back(item); /* Next... */ continue; @@ -5831,14 +5824,13 @@ errr init_st_info_txt(FILE *fp) if (3 != sscanf(buf + 2, "%d:%d:%d", &rar1, &tv1, &sv1)) return (1); - /* Get the index */ - st_ptr->item_chance[item_idx] = rar1; - /* Hack -- 256 as a sval means all possible items */ - st_ptr->item_kind[item_idx] = (sv1 < 256) ? lookup_kind(tv1, sv1) : tv1 + 10000; - - item_idx++; - st_ptr->item_num = item_idx; - assert(st_ptr->item_num <= STORE_CHOICES); + /* Add to the items array */ + store_item item; + item.chance = rar1; + item.kind = (sv1 < 256) + ? lookup_kind(tv1, sv1) + : tv1 + 10000; /* An SVAL of 256 means all possible items. */ + st_ptr->items.emplace_back(item); /* Next... */ continue; diff --git a/src/store.cc b/src/store.cc index 63f9f0d1..68d3900e 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1197,7 +1197,7 @@ static bool_ kind_is_storeok(int k_idx) */ static void store_create(void) { - int i = 0, tries, level = 0, chance, item; + int i = 0, tries, level = 0; object_type forge; object_type *q_ptr = NULL; @@ -1281,9 +1281,9 @@ static void store_create(void) else { /* Hack -- Pick an item to sell */ - item = rand_int(st_info[st_ptr->st_idx].item_num); - i = st_info[st_ptr->st_idx].item_kind[item]; - chance = st_info[st_ptr->st_idx].item_chance[item]; + auto const &item = st_info[st_ptr->st_idx].items[rand_int(st_info[st_ptr->st_idx].items.size())]; + i = item.kind; + auto chance = item.chance; /* Don't allow k_info artifacts */ if ((i <= 10000) && (k_info[i].flags & TR_NORM_ART)) diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index a735fdfc..9d0ba55f 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -2,11 +2,9 @@ #include "h-basic.h" #include "store_flag_set.hpp" +#include "store_item.hpp" -/** - * Number of items to choose stock from - */ -constexpr int STORE_CHOICES = 56; +#include /** * Store descriptor. @@ -15,9 +13,7 @@ struct store_info_type { const char *name = nullptr; /* Name */ - s16b item_kind[STORE_CHOICES] = { 0 }; /* Table -- Legal item kinds */ - s16b item_chance[STORE_CHOICES] = { 0 }; - byte item_num = 0; /* Number of items */ + std::vector items; /* Table -- Legal item kinds */ s16b max_obj = 0; /* Number of items this store can hold */ diff --git a/src/store_item.hpp b/src/store_item.hpp new file mode 100644 index 00000000..62d3f2a9 --- /dev/null +++ b/src/store_item.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "h-basic.h" + +struct store_item +{ + /** + * Legal item kinds; if > 10000, designates (TVAL - 10000) and any SVAL. + * Otherwise designates an entry in k_info.txt. + */ + s16b kind = 0; + + /** + * Percentage chance of generation if the entry is chosen. + */ + s16b chance = 0; + +}; -- cgit v1.2.3 From cb9fde0cde82d4122c8bd9836309720294dee77f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Rework store_info_type::owners to std::vector<> --- src/init1.cc | 20 +++++++++++++++----- src/store.cc | 39 ++++++++++++++++++--------------------- src/store_info_type.hpp | 2 +- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 6fef9561..3dec9b6e 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5900,13 +5900,23 @@ errr init_st_info_txt(FILE *fp) /* Scan for the values */ if (4 != sscanf(buf + 2, "%d:%d:%d:%d", - &a1, &a2, &a3, &a4)) return (1); + &a1, &a2, &a3, &a4)) + { + return 1; + } + + /* Get a reference to the owners */ + auto owners = &st_ptr->owners; /* Save the values */ - st_ptr->owners[0] = a1; - st_ptr->owners[1] = a2; - st_ptr->owners[2] = a3; - st_ptr->owners[3] = a4; + owners->push_back(a1); + owners->push_back(a2); + owners->push_back(a3); + owners->push_back(a4); + + /* Sort and remove duplicates */ + std::sort(owners->begin(), owners->end()); + owners->erase(std::unique(owners->begin(), owners->end()), owners->end()); /* Next... */ continue; diff --git a/src/store.cc b/src/store.cc index 68d3900e..a7f40a6e 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1834,24 +1834,21 @@ static bool_ sell_haggle(object_type *o_ptr, s32b *price) /* * Will the owner retire? */ -static bool_ retire_owner_p(void) +static bool retire_owner_p(void) { store_info_type *sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx]; - if ((sti_ptr->owners[0] == sti_ptr->owners[1]) && - (sti_ptr->owners[0] == sti_ptr->owners[2]) && - (sti_ptr->owners[0] == sti_ptr->owners[3])) + if (sti_ptr->owners.size() > 1) { - /* there is no other owner */ - return FALSE; + return false; // No other possible owner } if (rand_int(STORE_SHUFFLE) != 0) { - return FALSE; + return false; } - return TRUE; + return true; } /* @@ -3399,7 +3396,7 @@ void store_shuffle(int which) /* Pick a new owner */ for (auto j = st_ptr->owner; j == st_ptr->owner; ) { - st_ptr->owner = st_info[st_ptr->st_idx].owners[rand_int(4)]; + st_ptr->owner = *uniform_element(st_info[st_ptr->st_idx].owners); } /* Activate the new owner */ @@ -3522,28 +3519,28 @@ void store_init(int town_num, int store_num) { cur_store_num = store_num; - /* Activate that store */ + // Activate store st_ptr = &town_info[town_num].store[store_num]; + // Pick an owner. We use 0 for st_info[] which haven't been + // initialized, i.e. where there's no entry in st_info.txt. + st_ptr->owner = st_info[st_ptr->st_idx].owners.empty() + ? 0 + : *uniform_element(st_info[st_ptr->st_idx].owners) + ; - /* Pick an owner */ - st_ptr->owner = st_info[st_ptr->st_idx].owners[rand_int(4)]; - - /* Activate the new owner */ + // Activate the new owner ot_ptr = &ow_info[st_ptr->owner]; - - /* Initialize the store */ + // Initialize the store st_ptr->store_open = 0; - /* Nothing in stock */ + // Nothing in stock st_ptr->stock.reserve(st_ptr->stock_size); st_ptr->stock.clear(); - /* - * MEGA-HACK - Last visit to store is - * BEFORE player birth to enable store restocking - */ + // MEGA-HACK - Last visit to store is BEFORE player + // birth to enable store restocking. st_ptr->last_visit = -100L * STORE_TURNS; } diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index 9d0ba55f..fad32a93 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -17,7 +17,7 @@ struct store_info_type s16b max_obj = 0; /* Number of items this store can hold */ - u16b owners[4] = { 0 }; /* List of owners(refers to ow_info) */ + std::vector owners; /* List of owners; refers to ow_info */ u16b actions[6] = { 0 }; /* Actions(refers to ba_info) */ -- cgit v1.2.3 From 1f861bb683f70856787b100219fd40ff31be12b8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Rework store_info_type::actions into a std::vector<> --- src/bldg.cc | 27 ++++++++-------------- src/bldg.hpp | 7 +++--- src/init1.cc | 18 ++++++++++----- src/store.cc | 61 +++++++++++++++++++++++++------------------------ src/store_info_type.hpp | 2 +- 5 files changed, 58 insertions(+), 57 deletions(-) diff --git a/src/bldg.cc b/src/bldg.cc index 34a4576c..04153636 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -51,7 +51,7 @@ static int building_loc = 0; /* * A helper function for is_state */ -static bool_ is_state_aux(store_type *s_ptr, int state) +static bool_ is_state_aux(store_type const *s_ptr, int state) { owner_type *ow_ptr = &ow_info[s_ptr->owner]; @@ -76,7 +76,7 @@ static bool_ is_state_aux(store_type *s_ptr, int state) /* * Test if the state accords with the player */ -bool_ is_state(store_type *s_ptr, int state) +bool_ is_state(store_type const *s_ptr, int state) { if (state == STORE_NORMAL) { @@ -110,25 +110,18 @@ static void clear_bldg(int min_row, int max_row) /* * Display a building. */ -void show_building(store_type *s_ptr) +void show_building(store_type const *s_ptr) { - char buff[20]; - - int i; - - byte action_color; - - char tmp_str[80]; - store_info_type *st_ptr = &st_info[s_ptr->st_idx]; - - for (i = 0; i < 6; i++) + for (std::size_t i = 0; i < st_ptr->actions.size(); i++) { store_action_type *ba_ptr = &ba_info[st_ptr->actions[i]]; - if (ba_ptr->letter != '.') { + byte action_color; + char buff[20]; + if (ba_ptr->action_restr == 0) { if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) || @@ -197,6 +190,8 @@ void show_building(store_type *s_ptr) } } + char tmp_str[80]; + strnfmt(tmp_str, 80, " %c", ba_ptr->letter); c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2))); @@ -1094,10 +1089,8 @@ static bool_ research_item(void) /* * Execute a building command */ -bool_ bldg_process_command(store_type *s_ptr, int i) +bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ptr) { - store_action_type *ba_ptr = &ba_info[st_info[s_ptr->st_idx].actions[i]]; - int bact = ba_ptr->action; int bcost; diff --git a/src/bldg.hpp b/src/bldg.hpp index 0daebbee..00eb6a9e 100644 --- a/src/bldg.hpp +++ b/src/bldg.hpp @@ -1,9 +1,10 @@ #pragma once #include "h-basic.h" +#include "store_action_type_fwd.hpp" #include "store_type_fwd.hpp" -extern bool_ bldg_process_command(store_type *s_ptr, int i); -extern void show_building(store_type *s_ptr); -extern bool_ is_state(store_type *s_ptr, int state); +extern bool_ bldg_process_command(store_type const *s_ptr, store_action_type const *action); +extern void show_building(store_type const *s_ptr); +extern bool_ is_state(store_type const *s_ptr, int state); extern void enter_quest(void); diff --git a/src/init1.cc b/src/init1.cc index 3dec9b6e..1d04509b 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5870,12 +5870,18 @@ errr init_st_info_txt(FILE *fp) &a1, &a2, &a3, &a4, &a5, &a6)) return (1); /* Save the values */ - st_ptr->actions[0] = a1; - st_ptr->actions[1] = a2; - st_ptr->actions[2] = a3; - st_ptr->actions[3] = a4; - st_ptr->actions[4] = a5; - st_ptr->actions[5] = a6; + st_ptr->actions.push_back(a1); + st_ptr->actions.push_back(a2); + st_ptr->actions.push_back(a3); + st_ptr->actions.push_back(a4); + st_ptr->actions.push_back(a5); + st_ptr->actions.push_back(a6); + + /* Remove zero entries since they have no effect */ + st_ptr->actions.erase( + std::remove(st_ptr->actions.begin(), st_ptr->actions.end(), 0), + st_ptr->actions.end() + ); /* Next... */ continue; diff --git a/src/store.cc b/src/store.cc index a7f40a6e..566a7ce0 100644 --- a/src/store.cc +++ b/src/store.cc @@ -2771,6 +2771,31 @@ void store_examine(void) static bool_ leave_store = FALSE; +/* + * Find building action for command. Returns nullptr if no matching + * action is found. + */ +static store_action_type *find_store_action(s16b command_cmd) +{ + for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++) + { + auto ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; + + if (ba_ptr->letter && (ba_ptr->letter == command_cmd)) + { + return ba_ptr; + } + + if (ba_ptr->letter_aux && (ba_ptr->letter_aux == command_cmd)) + { + return ba_ptr; + } + } + + return nullptr; +} + + /* * Process a command in a store * @@ -2781,39 +2806,17 @@ static bool_ leave_store = FALSE; */ static bool_ store_process_command(void) { - bool_ validcmd = FALSE; - int i; - store_action_type *ba_ptr; bool_ recreate = FALSE; /* Handle repeating the last command */ repeat_check(); - for (i = 0; i < 6; i++) - { - ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; - - if (ba_ptr->letter) - { - if (ba_ptr->letter == command_cmd) - { - validcmd = TRUE; - break; - } - } - if (ba_ptr->letter_aux) - { - if (ba_ptr->letter_aux == command_cmd) - { - validcmd = TRUE; - break; - } - } - } + store_action_type *ba_ptr = + find_store_action(command_cmd); - if (validcmd) + if (ba_ptr) { - recreate = bldg_process_command(st_ptr, i); + recreate = bldg_process_command(st_ptr, ba_ptr); } else { @@ -3193,13 +3196,11 @@ void do_cmd_store(void) display_store(); /* Mega-Hack -- Ignore keymaps on store action letters */ - for (i = 0; i < 6; i++) + for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++) { - store_action_type *ba_ptr = - &ba_info[st_info[st_ptr->st_idx].actions[i]]; + store_action_type *ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; request_command_ignore_keymaps[2*i] = ba_ptr->letter; request_command_ignore_keymaps[2*i+1] = ba_ptr->letter_aux; - } /* Do not leave */ diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index fad32a93..abb87095 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -19,7 +19,7 @@ struct store_info_type std::vector owners; /* List of owners; refers to ow_info */ - u16b actions[6] = { 0 }; /* Actions(refers to ba_info) */ + std::vector actions; /* Actions; refers to ba_info */ byte d_attr = 0; /* Default building attribute */ char d_char = '\0'; /* Default building character */ -- cgit v1.2.3 From db062ebf4ce7dfed3c91fdf9d6d2d96115435145 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Fix indentation --- src/bldg.cc | 136 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/src/bldg.cc b/src/bldg.cc index 04153636..63bb59a7 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -118,86 +118,84 @@ void show_building(store_type const *s_ptr) { store_action_type *ba_ptr = &ba_info[st_ptr->actions[i]]; - { - byte action_color; - char buff[20]; + byte action_color; + char buff[20]; - if (ba_ptr->action_restr == 0) + if (ba_ptr->action_restr == 0) + { + if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) || + (is_state(s_ptr, STORE_HATED) && (ba_ptr->costs[STORE_HATED] == 0)) || + (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0))) { - if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) || - (is_state(s_ptr, STORE_HATED) && (ba_ptr->costs[STORE_HATED] == 0)) || - (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0))) - { - action_color = TERM_WHITE; - buff[0] = '\0'; - } - else if (is_state(s_ptr, STORE_LIKED)) - { - action_color = TERM_L_GREEN; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); - } - else if (is_state(s_ptr, STORE_HATED)) - { - action_color = TERM_RED; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_HATED]); - } - else - { - action_color = TERM_YELLOW; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]); - } + action_color = TERM_WHITE; + buff[0] = '\0'; } - else if (ba_ptr->action_restr == 1) + else if (is_state(s_ptr, STORE_LIKED)) { - if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) || - (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0))) - { - action_color = TERM_WHITE; - buff[0] = '\0'; - } - else if (is_state(s_ptr, STORE_LIKED)) - { - action_color = TERM_L_GREEN; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); - } - else if (is_state(s_ptr, STORE_HATED)) - { - action_color = TERM_L_DARK; - strnfmt(buff, 20, "(closed)"); - } - else - { - action_color = TERM_YELLOW; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]); - } + action_color = TERM_L_GREEN; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); + } + else if (is_state(s_ptr, STORE_HATED)) + { + action_color = TERM_RED; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_HATED]); } else { - if (is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) - { - action_color = TERM_WHITE; - buff[0] = '\0'; - } - else if (is_state(s_ptr, STORE_LIKED)) - { - action_color = TERM_L_GREEN; - strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); - } - else - { - action_color = TERM_L_DARK; - strnfmt(buff, 20, "(closed)"); - } + action_color = TERM_YELLOW; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]); + } + } + else if (ba_ptr->action_restr == 1) + { + if ((is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) || + (is_state(s_ptr, STORE_NORMAL) && (ba_ptr->costs[STORE_NORMAL] == 0))) + { + action_color = TERM_WHITE; + buff[0] = '\0'; + } + else if (is_state(s_ptr, STORE_LIKED)) + { + action_color = TERM_L_GREEN; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); + } + else if (is_state(s_ptr, STORE_HATED)) + { + action_color = TERM_L_DARK; + strnfmt(buff, 20, "(closed)"); + } + else + { + action_color = TERM_YELLOW; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_NORMAL]); } + } + else + { + if (is_state(s_ptr, STORE_LIKED) && (ba_ptr->costs[STORE_LIKED] == 0)) + { + action_color = TERM_WHITE; + buff[0] = '\0'; + } + else if (is_state(s_ptr, STORE_LIKED)) + { + action_color = TERM_L_GREEN; + strnfmt(buff, 20, "(%dgp)", ba_ptr->costs[STORE_LIKED]); + } + else + { + action_color = TERM_L_DARK; + strnfmt(buff, 20, "(closed)"); + } + } - char tmp_str[80]; + char tmp_str[80]; - strnfmt(tmp_str, 80, " %c", ba_ptr->letter); - c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2))); + strnfmt(tmp_str, 80, " %c", ba_ptr->letter); + c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2))); - strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name, buff); - c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2))); - } + strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name, buff); + c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2))); } } -- cgit v1.2.3 From 8c538df0f6f481c4ac70bf15d9f49621d21aa821 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove unused parameters from bldg.c:fix_item() --- src/bldg.cc | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/bldg.cc b/src/bldg.cc index 63bb59a7..a1c38c9e 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -981,8 +981,7 @@ static bool_ compare_weapons(void) * sharpen arrows, repair armor, repair weapon * -KMW- */ -static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac, - int ireward, bool_ set_reward) +static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac) { int i; @@ -1216,15 +1215,13 @@ bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ case BACT_ENCHANT_WEAPON: { - paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE, - BACT_ENCHANT_WEAPON, set_reward); + paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE); break; } case BACT_ENCHANT_ARMOR: { - paid = fix_item(INVEN_BODY, INVEN_FEET, 0, TRUE, - BACT_ENCHANT_ARMOR, set_reward); + paid = fix_item(INVEN_BODY, INVEN_FEET, 0, TRUE); break; } @@ -1290,15 +1287,13 @@ bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ case BACT_ENCHANT_ARROWS: { - paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE, - BACT_ENCHANT_ARROWS, set_reward); + paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE); break; } case BACT_ENCHANT_BOW: { - paid = fix_item(INVEN_BOW, INVEN_BOW, TV_BOW, FALSE, - BACT_ENCHANT_BOW, set_reward); + paid = fix_item(INVEN_BOW, INVEN_BOW, TV_BOW, FALSE); break; } -- cgit v1.2.3 From 50c916646b647030755673a9a1dc82e192e492d4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Change player_class::spec to a std::vector<> --- src/birth.cc | 39 ++++++++++++++++++++------------------- src/init1.cc | 19 ++++--------------- src/player_class.hpp | 7 +------ 3 files changed, 25 insertions(+), 40 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index be8a8a33..8d14da00 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1235,25 +1235,23 @@ static void dump_classes(std::vector const &classes, int sel, u32b *restri } } -static int dump_specs(int sel) +static void dump_specs(int sel_) { - int n = 0; - - char buf[80]; + assert(sel_ >= 0); + std::size_t sel = sel_; - /* Clean up */ clear_from(12); - for (n = 0; n < MAX_SPEC; n++) - { - char p2 = ')', p1 = ' '; + auto specs = &class_info[p_ptr->pclass].spec; - /* Found the last one ? */ - if (!class_info[p_ptr->pclass].spec[n].title) break; + for (std::size_t n = 0; n < specs->size(); n++) + { + char p2 = ')'; + char p1 = ' '; /* Analyze */ p_ptr->pspec = n; - spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; + spp_ptr = &(*specs)[p_ptr->pspec]; if (sel == n) { @@ -1262,6 +1260,7 @@ static int dump_specs(int sel) } /* Display */ + char buf[80]; strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, spp_ptr->title); /* Print some more info */ @@ -1278,20 +1277,26 @@ static int dump_specs(int sel) print_desc(desc.c_str()); if (spp_ptr->flags & PR_EXPERIMENTAL) + { c_put_str(TERM_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); + } else + { c_put_str(TERM_L_BLUE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); + } } else { if (spp_ptr->flags & PR_EXPERIMENTAL) + { c_put_str(TERM_SLATE, buf, 18 + (n / 4), 1 + 20 * (n % 4)); + } else + { put_str(buf, 18 + (n / 4), 1 + 20 * (n % 4)); + } } } - - return (n); } static int dump_races(int sel) @@ -1911,11 +1916,7 @@ static bool_ player_birth_aux_ask() clear_from(15); /* Count choices */ - for (n = 0; n < MAX_SPEC; n++) - { - /* Found the last one ? */ - if (!class_info[p_ptr->pclass].spec[n].title) break; - } + n = class_info[p_ptr->pclass].spec.size(); /* Only one choice = auto choice */ if (n == 1) @@ -1924,7 +1925,7 @@ static bool_ player_birth_aux_ask() { /* Dump classes spec */ sel = 0; - n = dump_specs(sel); + dump_specs(sel); /* Get a class */ while (1) diff --git a/src/init1.cc b/src/init1.cc index 1d04509b..0654155e 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -916,7 +916,6 @@ errr init_player_info_txt(FILE *fp) int powers = 0; int lev = 1; int tit_idx = 0; - int spec_idx = 0; char buf[1024]; char *s, *t; @@ -1475,8 +1474,6 @@ errr init_player_info_txt(FILE *fp) /* Process 'N' for "New/Number/Name" */ if ((buf[0] == 'C') && (buf[2] == 'N')) { - int z; - /* Find the colon before the name */ s = strchr(buf + 4, ':'); @@ -1513,9 +1510,6 @@ errr init_player_info_txt(FILE *fp) powers = 0; lev = 1; tit_idx = 0; - spec_idx = -1; - for (z = 0; z < MAX_SPEC; z++) - c_ptr->spec[z].title = 0; /* Next... */ continue; @@ -1771,17 +1765,12 @@ errr init_player_info_txt(FILE *fp) /* Paranoia -- require a name */ if (!*s) return (1); - /* Get the index */ - spec_idx++; - - /* Verify information */ - if (spec_idx >= MAX_SPEC) return (2); - /* Point at the "info" */ - s_ptr = &c_ptr->spec[spec_idx]; + /* Create the spec entry */ + c_ptr->spec.emplace_back(player_spec()); - /* Copy title */ - assert(!s_ptr->title); + /* Fill in initial values */ + s_ptr = &c_ptr->spec.back(); s_ptr->title = my_strdup(s); /* Next... */ diff --git a/src/player_class.hpp b/src/player_class.hpp index 57282e27..9d9991e3 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -10,11 +10,6 @@ #include "player_spec.hpp" #include "skill_modifiers.hpp" -/** - * Maximum number of specialties. - */ -constexpr int MAX_SPEC = 20; - /** * Player descriptor and runtime data. */ @@ -49,7 +44,7 @@ struct player_class u32b gods = 0; - std::array spec; + std::vector spec; std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; -- cgit v1.2.3 From d249c64b5ea5b59b475584fa1a70208b8e4a4c64 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Remove inventory_no_move option --- src/object1.cc | 42 +++++++++++++++++++----------------------- src/options.cc | 3 --- src/options.hpp | 1 - src/tables.cc | 4 ---- 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 9e130be9..a3cb5593 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -4066,15 +4066,15 @@ static bool item_tester_okay(object_type const *o_ptr, object_filter_t const &fi -static void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filter); -static void show_inven_aux(bool_ mirror, bool_ everything, object_filter_t const &filter); +static void show_equip_aux(bool_ mirror, object_filter_t const &filter); +static void show_inven_aux(bool_ mirror, object_filter_t const &filter); /* * Choice window "shadow" of the "show_inven()" function */ void display_inven(void) { - show_inven_aux(TRUE, inventory_no_move, object_filter::True()); + show_inven_aux(TRUE, object_filter::True()); } @@ -4084,7 +4084,7 @@ void display_inven(void) */ void display_equip(void) { - show_equip_aux(TRUE, inventory_no_move, object_filter::True()); + show_equip_aux(TRUE, object_filter::True()); } @@ -4111,7 +4111,7 @@ byte get_item_letter_color(object_type const *o_ptr) * * Hack -- do not display "trailing" empty slots */ -void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filter) +void show_inven_aux(bool_ mirror, const object_filter_t &filter) { int i, j, k, l, z = 0; int row, col, len, lim; @@ -4165,16 +4165,13 @@ void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filte /* Is this item acceptable? */ if (!item_tester_okay(o_ptr, filter)) { - if ( !everything ) - continue; - out_index[k] = -i - 1; - } - else - { - /* Save the object index */ - out_index[k] = i + 1; + /* Skip to next slot */ + continue; } + /* Save the object index */ + out_index[k] = i + 1; + /* Describe the object */ object_desc(o_name, o_ptr, TRUE, 3); @@ -4273,7 +4270,7 @@ void show_inven_aux(bool_ mirror, bool_ everything, const object_filter_t &filte static void show_inven(object_filter_t const &filter) { - show_inven_aux(FALSE, FALSE, filter); + show_inven_aux(FALSE, filter); } void show_inven_full() @@ -4285,7 +4282,7 @@ void show_inven_full() static void show_equip(object_filter_t const &filter) { - show_equip_aux(FALSE, FALSE, filter); + show_equip_aux(FALSE, filter); } void show_equip_full() @@ -4298,7 +4295,7 @@ void show_equip_full() /* * Display the equipment. */ -void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filter) +void show_equip_aux(bool_ mirror, object_filter_t const &filter) { int i, j, k, l; int row, col, len, lim, idx; @@ -4407,17 +4404,16 @@ void show_equip_aux(bool_ mirror, bool_ everything, object_filter_t const &filte /* Truncate the description */ o_name[lim] = 0; + /* Is this item acceptable? */ if (!item_tester_okay(o_ptr, filter)) { - if (!everything) continue; - out_index[k] = -1; - } - else - { - /* Save the index */ - out_index[k] = idx; + /* Skip to next slot */ + continue; } + + /* Save the index */ + out_index[k] = idx; out_rindex[k] = i; /* Save the color */ diff --git a/src/options.cc b/src/options.cc index 07dd7869..e4acaab4 100644 --- a/src/options.cc +++ b/src/options.cc @@ -70,9 +70,6 @@ bool_ linear_stats; bool_ player_char_health; /* Display the player as a special symbol when in bad health ? */ bool_ option_ingame_help; /* Ingame contextual help */ bool_ auto_more; /* Auto more */ -bool_ inventory_no_move; /* In inventory option window, just erase the letters, - * rather that displaying the list without the invalid - * selections */ // // Option Set 6 - Birth options diff --git a/src/options.hpp b/src/options.hpp index 6900b9a3..80e5cca7 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -72,7 +72,6 @@ extern bool_ linear_stats; extern bool_ player_char_health; extern bool_ option_ingame_help; extern bool_ auto_more; -extern bool_ inventory_no_move; // // Option Set 6 - Birth options diff --git a/src/tables.cc b/src/tables.cc index b48a2565..509a8ce9 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -1418,10 +1418,6 @@ option_type option_info[] = { &linear_stats, TRUE, 5, 7, "linear_stats", "Stats are represented in a linear way" }, - { &inventory_no_move, FALSE, 5, 8, - "inventory_no_move", "In option windows, just omit the select char" }, - - /*** Birth Options ***/ { &preserve, TRUE, 6, 2, -- cgit v1.2.3 From a0cf3530d781da75417f59ce0344df1c373c358e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Really fix crash bug in hallucination code --- src/monster2.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monster2.cc b/src/monster2.cc index 7c05f9f6..d363d4e1 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1189,7 +1189,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { hallu_race = &r_info[randint(max_r_idx - 2)]; } - while ((hallu_race->flags & RF_UNIQUE) && (hallu_race->name == nullptr)); + while ((!hallu_race->name) || (hallu_race->flags & RF_UNIQUE)); strcpy(silly_name, hallu_race->name); } -- cgit v1.2.3 From 5e42771bae33ca475447dc34610addad8efdb74f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused variable in make_attack_spell() --- src/melee2.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index a0f43492..6d025511 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2746,9 +2746,6 @@ static bool_ make_attack_spell(int m_idx) /* Extract the "see-able-ness" */ bool_ seen = (!blind && m_ptr->ml); - /* Assume "normal" target */ - bool_ normal = TRUE; - /* Target location */ if (m_ptr->target > -1) { @@ -2787,8 +2784,7 @@ static bool_ make_attack_spell(int m_idx) /* Sometimes forbid inate attacks (breaths) */ if (rand_int(100) >= (chance * 2)) no_inate = TRUE; - /* Hack -- require projectable player */ - if (normal) + /* Require projectable player */ { /* Check range */ if (m_ptr->cdis > MAX_RANGE) return (FALSE); -- cgit v1.2.3 From ad4ca5b13b459048f876589d797fe0dccbdec259 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove dead code --- src/cmd5.cc | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/src/cmd5.cc b/src/cmd5.cc index 5850f3ce..d3d072b8 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -532,49 +532,6 @@ void fetch(int dir, int wgt, bool_ require_los) } -/* - * Handle random effects of player shrieking - */ -void shriek_effect() -{ - switch (randint(9)) - { - case 1: - case 5: - case 8: - case 9: - { - msg_print("You make a high-pitched shriek!"); - aggravate_monsters(1); - - break; - } - case 2: - case 6: - { - msg_print("Oops! You call a monster."); - summon_specific(p_ptr->py, p_ptr->px, max_dlv[dungeon_type], 0); - - break; - } - case 3: - case 7: - { - msg_print("The dungeon collapses!"); - earthquake(p_ptr->py, p_ptr->px, 5); - - break; - } - case 4: - { - msg_print("Your shriek is so horrible that you damage your health!"); - take_hit(damroll(p_ptr->lev / 5, 8), "inner hemorrhaging"); - - break; - } - } -} - /* * Return the symbiote's name or description. */ -- cgit v1.2.3 From 90ab4c37504bfa1f33246d963d40032b70ed39ac Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Theme: Remove armor restriction for Eagle/Dragon It interferes badly with Possession and it seems a little unfair that (non-Dragon/Eagle) Possessors with a Dragon body *do* get armor -- albeit usually with penalties. --- src/object1.cc | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index a3cb5593..b0760abe 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -3644,24 +3644,6 @@ static int get_slot(int slot) */ s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal) { - /* Theme has restrictions for winged races. */ - if (game_module_idx == MODULE_THEME) - { - cptr race_name = rp_ptr->title; - - if (streq(race_name, "Dragon") || - streq(race_name, "Eagle")) - { - switch (o_ptr->tval) - { - case TV_CLOAK: - case TV_HARD_ARMOR: - case TV_DRAG_ARMOR: - return -1; - } - } - } - /* Slot for equipment */ switch (o_ptr->tval) { -- cgit v1.2.3 From ef68a0c23ddb50de58ddb55f1f893095b78d7c4c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Clean up cheat option handling in loadsave.c --- src/loadsave.cc | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 07e2c4fc..8166ab65 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1670,29 +1670,14 @@ static void do_options(ls_flag_t flag) do_byte(&hitpoint_warn, flag); /*** Cheating options ***/ - if (flag == ls_flag_t::LOAD) /* There *MUST* be some nice way to unify this! */ - { - u16b c; - do_u16b(&c, ls_flag_t::LOAD); - if (c & 0x0002) wizard = TRUE; - cheat_peek = (c & 0x0100) ? TRUE : FALSE; - cheat_hear = (c & 0x0200) ? TRUE : FALSE; - cheat_room = (c & 0x0400) ? TRUE : FALSE; - cheat_xtra = (c & 0x0800) ? TRUE : FALSE; - cheat_live = (c & 0x2000) ? TRUE : FALSE; - } - if (flag == ls_flag_t::SAVE) - { - u16b c = 0; - if (wizard) c |= 0x0002; - if (cheat_peek) c |= 0x0100; - if (cheat_hear) c |= 0x0200; - if (cheat_room) c |= 0x0400; - if (cheat_xtra) c |= 0x0800; - if (cheat_live) c |= 0x2000; - do_u16b(&c, ls_flag_t::SAVE); - } - + do_bool(&wizard, flag); + do_bool(&cheat_peek, flag); + do_bool(&cheat_hear, flag); + do_bool(&cheat_room, flag); + do_bool(&cheat_xtra, flag); + do_bool(&cheat_live, flag); + + /*** Autosave options */ do_bool(&autosave_l, flag); do_bool(&autosave_t, flag); do_s16b(&autosave_freq, flag); -- cgit v1.2.3 From ceb4551cfb0e3fd1bdf8bdb868e6758634486ecb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove effectively dead sound() code --- src/cmd1.cc | 19 --------------- src/cmd2.cc | 29 ---------------------- src/cmd3.cc | 2 -- src/cmd6.cc | 27 -------------------- src/cmd7.cc | 18 -------------- src/defines.h | 77 ---------------------------------------------------------- src/dungeon.cc | 9 ------- src/melee1.cc | 42 -------------------------------- src/melee2.cc | 43 -------------------------------- src/object2.cc | 2 -- src/spells1.cc | 34 -------------------------- src/spells2.cc | 6 ----- src/store.cc | 18 -------------- src/util.cc | 10 -------- src/util.hpp | 1 - src/xtra2.cc | 7 ------ 16 files changed, 344 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index ab3f29d9..71096f7f 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -1795,7 +1795,6 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) { if (!desc) msg_format("You hit %s in the groin with your knee!", m_name); - sound(SOUND_PAIN); special_effect = MA_KNEE; } else if (!desc) msg_format(ma_ptr->desc, m_name); @@ -2142,9 +2141,6 @@ void py_attack(int y, int x, int max_blow) /* Test for hit */ if (test_hit_norm(chance, m_ptr->ac, m_ptr->ml)) { - /* Sound */ - sound(SOUND_HIT); - /* Hack -- bare hands do one damage */ k = 1; @@ -2511,9 +2507,6 @@ void py_attack(int y, int x, int max_blow) /* Player misses */ else { - /* Sound */ - sound(SOUND_MISS); - backstab = FALSE; /* Clumsy! */ /* Message */ @@ -2535,9 +2528,6 @@ void py_attack(int y, int x, int max_blow) /* Hack -- delay fear messages */ if (fear && m_ptr->ml) { - /* Sound */ - sound(SOUND_FLEE); - /* Message */ msg_format("%^s flees in terror!", m_name); } @@ -2701,9 +2691,6 @@ static bool_ easy_open_door(int y, int x) /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE); - /* Sound */ - sound(SOUND_OPENDOOR); - /* Experience */ gain_exp(1); } @@ -2730,9 +2717,6 @@ static bool_ easy_open_door(int y, int x) /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE); - - /* Sound */ - sound(SOUND_OPENDOOR); } /* Result */ @@ -3086,9 +3070,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) energy_use = 0; } } - - /* Sound */ - sound(SOUND_HITWALL); } /* diff --git a/src/cmd2.cc b/src/cmd2.cc index 059170d4..2a8d33e7 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -1072,9 +1072,6 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE); - /* Sound */ - sound(SOUND_OPENDOOR); - /* Experience */ gain_exp(1); } @@ -1104,9 +1101,6 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE); - - /* Sound */ - sound(SOUND_OPENDOOR); } /* Result */ @@ -1284,9 +1278,6 @@ static bool_ do_cmd_close_aux(int y, int x, int dir) /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MONSTERS | PU_MON_LITE); - - /* Sound */ - sound(SOUND_SHUTDOOR); } /* Result */ @@ -1500,9 +1491,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) /* Get grid */ c_ptr = &cave[y][x]; - /* Sound */ - sound(SOUND_DIG); - /* Titanium */ if (f_ptr->flags & FF_PERMANENT) { @@ -1899,7 +1887,6 @@ static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) else { msg_print("You set off a trap!"); - sound(SOUND_FAIL); chest_trap(y, x, o_idx); } @@ -2202,9 +2189,6 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) cave_set_feat(y, x, FEAT_OPEN); } - /* Sound */ - sound(SOUND_OPENDOOR); - /* Hack -- Fall through the door. Can't disarm while falling. */ move_player_aux(dir, always_pickup, 0, FALSE); @@ -3215,10 +3199,6 @@ void do_cmd_fire(void) } - /* Sound */ - sound(SOUND_SHOOT); - - /* Describe the object */ object_desc(o_name, q_ptr, FALSE, 3); @@ -3449,9 +3429,6 @@ void do_cmd_fire(void) { char m_name[80]; - /* Sound */ - sound(SOUND_FLEE); - /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0); @@ -3858,9 +3835,6 @@ void do_cmd_throw(void) { char m_name[80]; - /* Sound */ - sound(SOUND_FLEE); - /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0); @@ -4185,9 +4159,6 @@ void do_cmd_boomerang(void) { char m_name[80]; - /* Sound */ - sound(SOUND_FLEE); - /* Get the monster name (or "it") */ monster_desc(m_name, m_ptr, 0); diff --git a/src/cmd3.cc b/src/cmd3.cc index 4d9c0bcf..9a4e3fc2 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -653,7 +653,6 @@ void do_cmd_destroy(void) /* Message */ msg_format("You destroy %s.", o_name); - sound(SOUND_DESTITEM); /* Create an automatizer rule */ if (automatizer_create) @@ -1598,7 +1597,6 @@ bool_ do_cmd_sense_grid_mana() { if (flush_failure) flush(); msg_print("You failed to sense the grid's mana."); - sound(SOUND_FAIL); return FALSE; } diff --git a/src/cmd6.cc b/src/cmd6.cc index 661a950c..841c6684 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -1002,10 +1002,6 @@ void do_cmd_eat_food(void) /* Get the item */ object_type *o_ptr = get_object(item); - /* Sound */ - sound(SOUND_EAT); - - /* Take a turn */ energy_use = 100; @@ -2514,10 +2510,6 @@ void do_cmd_quaff_potion(void) object_type *o_ptr = get_object(item); - /* Sound */ - sound(SOUND_QUAFF); - - /* Take a turn */ energy_use = 100; @@ -3620,8 +3612,6 @@ void do_cmd_read_scroll(void) /* Hack -- allow certain scrolls to be "preserved" */ if (!used_up) return; - sound(SOUND_SCROLL); - /* Destroy scroll */ inc_stack_size(item, -1); } @@ -3762,7 +3752,6 @@ void do_cmd_use_staff(void) { if (flush_failure) flush(); msg_print("You failed to use the staff properly."); - sound(SOUND_FAIL); return; } @@ -3776,9 +3765,6 @@ void do_cmd_use_staff(void) } - /* Sound */ - sound(SOUND_ZAP); - /* Analyze the staff */ activate_stick(o_ptr, &obvious, &use_charge); @@ -3931,7 +3917,6 @@ void do_cmd_aim_wand(void) { if (flush_failure) flush(); msg_print("You failed to use the wand properly."); - sound(SOUND_FAIL); return; } @@ -3944,9 +3929,6 @@ void do_cmd_aim_wand(void) return; } - /* Sound */ - sound(SOUND_ZAP); - /* Analyze the wand */ activate_stick(o_ptr, &obvious, &use_charge); @@ -4223,8 +4205,6 @@ void do_cmd_zap_rod(void) /* Message */ msg_print("You failed to use the rod properly."); - sound(SOUND_FAIL); - return; } @@ -4249,9 +4229,6 @@ void do_cmd_zap_rod(void) /* Increase the timeout by the rod kind's pval. */ o_ptr->timeout -= cost; - /* Sound */ - sound(SOUND_ZAP); - /* Analyze the rod */ switch (o_ptr->pval) { @@ -4941,7 +4918,6 @@ void do_cmd_activate(void) { if (flush_failure) flush(); msg_print("You failed to activate it properly."); - sound(SOUND_FAIL); return; } @@ -4980,9 +4956,6 @@ void do_cmd_activate(void) /* Activate the item */ msg_print("You activate it..."); - /* Sound */ - sound(SOUND_ZAP); - /* New mostly unified activation code This has to be early to allow artifacts to override normal items -- neil */ diff --git a/src/cmd7.cc b/src/cmd7.cc index 42f82ea3..6aac9050 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -424,8 +424,6 @@ void do_cmd_mindcraft(void) msg_format("You failed to concentrate hard enough!"); - sound(SOUND_FAIL); - if (randint(100) < (chance / 2)) { /* Backfire */ @@ -463,8 +461,6 @@ void do_cmd_mindcraft(void) /* Successful spells */ else { - sound(SOUND_ZAP); - /* spell code */ switch (n) { @@ -953,8 +949,6 @@ void do_cmd_mimic(void) msg_format("You failed to concentrate hard enough!"); - sound(SOUND_FAIL); - if (randint(100) < (fail / 2)) { /* Backfire */ @@ -985,8 +979,6 @@ void do_cmd_mimic(void) /* Successful spells */ else { - sound(SOUND_ZAP); - /* spell code */ switch (n) { @@ -1599,8 +1591,6 @@ void do_cmd_powermage(void) msg_print("You failed to get the spell off!"); } - sound(SOUND_FAIL); - /* Let time pass */ if (is_magestaff()) energy_use = 80; else energy_use = 100; @@ -2211,7 +2201,6 @@ void do_cmd_necromancer(void) { if (flush_failure) flush(); msg_format("You failed to concentrate hard enough!"); - sound(SOUND_FAIL); if (randint(100) < (chance / 2)) { @@ -2255,8 +2244,6 @@ void do_cmd_necromancer(void) } else { - sound(SOUND_ZAP); - /* spell code */ switch (n) { @@ -2609,8 +2596,6 @@ int rune_exec(rune_spell *spell, int cost) msg_print("You failed to get the spell off!"); } - sound(SOUND_FAIL); - if (is_magestaff()) energy_use = 80; else energy_use = 100; @@ -4077,12 +4062,9 @@ void do_cmd_symbiotic(void) { if (flush_failure) flush(); msg_format("You failed to concentrate hard enough!"); - sound(SOUND_FAIL); } else { - sound(SOUND_ZAP); - /* spell code */ switch (n) { diff --git a/src/defines.h b/src/defines.h index 8c451ccb..14d7fe25 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2325,83 +2325,6 @@ -/*** Sound constants ***/ - - -#define SOUND_HIT 1 -#define SOUND_MISS 2 -#define SOUND_FLEE 3 -#define SOUND_DROP 4 -#define SOUND_KILL 5 -#define SOUND_LEVEL 6 -#define SOUND_DEATH 7 -#define SOUND_STUDY 8 -#define SOUND_TELEPORT 9 -#define SOUND_SHOOT 10 -#define SOUND_QUAFF 11 -#define SOUND_ZAP 12 -#define SOUND_WALK 13 -#define SOUND_TPOTHER 14 -#define SOUND_HITWALL 15 -#define SOUND_EAT 16 -#define SOUND_STORE1 17 -#define SOUND_STORE2 18 -#define SOUND_STORE3 19 -#define SOUND_STORE4 20 -#define SOUND_DIG 21 -#define SOUND_OPENDOOR 22 -#define SOUND_SHUTDOOR 23 -#define SOUND_TPLEVEL 24 -#define SOUND_SCROLL 25 -#define SOUND_BUY 26 -#define SOUND_SELL 27 -#define SOUND_WARN 28 -#define SOUND_ROCKET 29 /* Somebody's shooting rockets */ -#define SOUND_N_KILL 30 /* The player kills a non-living/undead monster */ -#define SOUND_U_KILL 31 /* The player kills a unique */ -#define SOUND_QUEST 32 /* The player has just completed a quest */ -#define SOUND_HEAL 33 /* The player was healed a little bit */ -#define SOUND_X_HEAL 34 /* The player was healed full health */ -#define SOUND_BITE 35 /* A monster bites you */ -#define SOUND_CLAW 36 /* A monster claws you */ -#define SOUND_M_SPELL 37 /* A monster casts a miscellaneous spell */ -#define SOUND_SUMMON 38 /* A monster casts a summoning spell */ -#define SOUND_BREATH 39 /* A monster breathes */ -#define SOUND_BALL 40 /* A monster casts a ball / bolt spell */ -#define SOUND_M_HEAL 41 /* A monster heals itself somehow */ -#define SOUND_ATK_SPELL 42 /* A monster casts a misc. offensive spell */ -#define SOUND_EVIL 43 /* Something nasty has just happened! */ -#define SOUND_TOUCH 44 /* A monster touches you */ -#define SOUND_STING 45 /* A monster stings you */ -#define SOUND_CRUSH 46 /* A monster crushes / envelopes you */ -#define SOUND_SLIME 47 /* A monster drools/spits/etc on you */ -#define SOUND_WAIL 48 /* A monster wails */ -#define SOUND_WINNER 49 /* Just won the game! */ -#define SOUND_FIRE 50 /* An item was burned */ -#define SOUND_ACID 51 /* An item was destroyed by acid */ -#define SOUND_ELEC 52 /* An item was destroyed by electricity */ -#define SOUND_COLD 53 /* An item was shattered */ -#define SOUND_ILLEGAL 54 /* Illegal command attempted */ -#define SOUND_FAIL 55 /* Fail to get a spell off / activate an item */ -#define SOUND_WAKEUP 56 /* A monster wakes up */ -#define SOUND_INVULN 57 /* Invulnerability! */ -#define SOUND_FALL 58 /* Falling through a trapdoor... */ -#define SOUND_PAIN 59 /* A monster is in pain! */ -#define SOUND_DESTITEM 60 /* An item was destroyed by misc. means */ -#define SOUND_MOAN 61 /* A monster makes a moan/beg/insult attack */ -#define SOUND_SHOW 62 /* A monster makes a "show" attack */ -#define SOUND_UNUSED 63 /* (no sound for gaze attacks) */ -#define SOUND_EXPLODE 64 /* Something (or somebody) explodes */ - -/* - * Mega-Hack -- maximum known sounds - */ -#define SOUND_MAX 65 - - - -/*** Hack ***/ - /* * Road flags diff --git a/src/dungeon.cc b/src/dungeon.cc index 417e8010..bc5ec69c 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1863,9 +1863,6 @@ static void process_world(void) { bool_ old_quick = quick_messages; - /* Sound */ - sound(SOUND_DEATH); - /* Hack -- Note death */ if (!last_words) { @@ -1914,8 +1911,6 @@ static void process_world(void) bell(); } - sound(SOUND_WARN); - /* Message */ msg_print("*** LOW DEATHPOINT WARNING! ***"); msg_print(NULL); @@ -3182,9 +3177,6 @@ static void process_world(void) p_ptr->leaving = TRUE; p_ptr->wild_mode = FALSE; } - - /* Sound */ - sound(SOUND_TPLEVEL); } } } @@ -4189,7 +4181,6 @@ static void process_command(void) if (rand_int(100) < insanity) { get_rnd_line("error.txt", error_m); - sound(SOUND_ILLEGAL); msg_print(error_m); } else diff --git a/src/melee1.cc b/src/melee1.cc index 89e0660a..09de2cd9 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -315,14 +315,12 @@ bool_ carried_make_attack_normal(int r_idx) { act = "hits you."; do_cut = do_stun = 1; - sound(SOUND_HIT); break; } case RBM_TOUCH: { act = "touches you."; - sound(SOUND_TOUCH); break; } @@ -330,7 +328,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "punches you."; do_stun = 1; - sound(SOUND_HIT); break; } @@ -338,7 +335,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "kicks you."; do_stun = 1; - sound(SOUND_HIT); break; } @@ -346,7 +342,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "claws you."; do_cut = 1; - sound(SOUND_CLAW); break; } @@ -354,14 +349,12 @@ bool_ carried_make_attack_normal(int r_idx) { act = "bites you."; do_cut = 1; - sound(SOUND_BITE); break; } case RBM_STING: { act = "stings you."; - sound(SOUND_STING); break; } @@ -375,7 +368,6 @@ bool_ carried_make_attack_normal(int r_idx) { act = "butts you."; do_stun = 1; - sound(SOUND_HIT); break; } @@ -383,42 +375,36 @@ bool_ carried_make_attack_normal(int r_idx) { act = "crushes you."; do_stun = 1; - sound(SOUND_CRUSH); break; } case RBM_ENGULF: { act = "engulfs you."; - sound(SOUND_CRUSH); break; } case RBM_CHARGE: { act = "charges you."; - sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */ break; } case RBM_CRAWL: { act = "crawls on you."; - sound(SOUND_SLIME); break; } case RBM_DROOL: { act = "drools on you."; - sound(SOUND_SLIME); break; } case RBM_SPIT: { act = "spits on you."; - sound(SOUND_SLIME); break; } @@ -437,14 +423,12 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_WAIL: { act = "wails at you."; - sound(SOUND_WAIL); break; } case RBM_SPORE: { act = "releases spores at you."; - sound(SOUND_SLIME); break; } @@ -457,21 +441,18 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_BEG: { act = "begs you for money."; - sound(SOUND_MOAN); break; } case RBM_INSULT: { act = desc_insult[rand_int(8)]; - sound(SOUND_MOAN); break; } case RBM_MOAN: { act = desc_moan[rand_int(4)]; - sound(SOUND_MOAN); break; } @@ -481,7 +462,6 @@ bool_ carried_make_attack_normal(int r_idx) act = "sings 'We are a happy family.'"; else act = "sings 'I love you, you love me.'"; - sound(SOUND_SHOW); break; } } @@ -1483,7 +1463,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "hits you."; do_cut = do_stun = 1; touched = TRUE; - sound(SOUND_HIT); break; } @@ -1491,7 +1470,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "touches you."; touched = TRUE; - sound(SOUND_TOUCH); break; } @@ -1500,7 +1478,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "punches you."; touched = TRUE; do_stun = 1; - sound(SOUND_HIT); break; } @@ -1509,7 +1486,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "kicks you."; touched = TRUE; do_stun = 1; - sound(SOUND_HIT); break; } @@ -1518,7 +1494,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "claws you."; touched = TRUE; do_cut = 1; - sound(SOUND_CLAW); break; } @@ -1527,7 +1502,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "bites you."; do_cut = 1; touched = TRUE; - sound(SOUND_BITE); break; } @@ -1535,7 +1509,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "stings you."; touched = TRUE; - sound(SOUND_STING); break; } @@ -1550,7 +1523,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "butts you."; do_stun = 1; touched = TRUE; - sound(SOUND_HIT); break; } @@ -1559,7 +1531,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "crushes you."; do_stun = 1; touched = TRUE; - sound(SOUND_CRUSH); break; } @@ -1567,7 +1538,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "engulfs you."; touched = TRUE; - sound(SOUND_CRUSH); break; } @@ -1575,7 +1545,6 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "charges you."; touched = TRUE; - sound(SOUND_BUY); /* Note! This is "charges", not "charges at". */ break; } @@ -1583,21 +1552,18 @@ bool_ make_attack_normal(int m_idx, byte divis) { act = "crawls on you."; touched = TRUE; - sound(SOUND_SLIME); break; } case RBM_DROOL: { act = "drools on you."; - sound(SOUND_SLIME); break; } case RBM_SPIT: { act = "spits on you."; - sound(SOUND_SLIME); break; } @@ -1617,14 +1583,12 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBM_WAIL: { act = "wails at you."; - sound(SOUND_WAIL); break; } case RBM_SPORE: { act = "releases spores at you."; - sound(SOUND_SLIME); break; } @@ -1637,14 +1601,12 @@ bool_ make_attack_normal(int m_idx, byte divis) case RBM_BEG: { act = "begs you for money."; - sound(SOUND_MOAN); break; } case RBM_INSULT: { act = desc_insult[rand_int(8)]; - sound(SOUND_MOAN); break; } @@ -1654,7 +1616,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = desc_moan[rand_int(3) + 4]; else act = desc_moan[rand_int(4)]; - sound(SOUND_MOAN); break; } @@ -1664,7 +1625,6 @@ bool_ make_attack_normal(int m_idx, byte divis) act = "sings 'We are a happy family.'"; else act = "sings 'I love you, you love me.'"; - sound(SOUND_SHOW); break; } } @@ -2627,7 +2587,6 @@ bool_ make_attack_normal(int m_idx, byte divis) if (explode) { - sound(SOUND_EXPLODE); if (mon_take_hit(m_idx, m_ptr->hp + 1, &fear, NULL)) { blinked = FALSE; @@ -2767,7 +2726,6 @@ bool_ make_attack_normal(int m_idx, byte divis) /* Fear */ if (m_ptr->ml && fear) { - sound (SOUND_FLEE); msg_format("%^s flees in terror!", m_name); } diff --git a/src/melee2.cc b/src/melee2.cc index 6d025511..1cebfb0b 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -98,20 +98,6 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) /* Extract monster name */ monster_desc(m_name, m_ptr, 0); - /* Make a sound */ - if ((r_ptr->flags & RF_DEMON) || - (r_ptr->flags & RF_UNDEAD) || - (r_ptr->flags & RF_STUPID) || - (r_ptr->flags & RF_NONLIVING) || - (strchr("Evg", r_ptr->d_char))) - { - sound(SOUND_N_KILL); - } - else - { - sound(SOUND_KILL); - } - /* Death by Missile/Spell attack */ if (note) { @@ -1147,7 +1133,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires an arrow at %s.", m_name, t_name); - sound(SOUND_SHOOT); monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(1, 6)); break; } @@ -1158,7 +1143,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires an arrow at %s.", m_name, t_name); - sound(SOUND_SHOOT); monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(3, 6)); break; } @@ -1170,7 +1154,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires a missile at %s.", m_name, t_name); - sound(SOUND_SHOOT); monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(5, 6)); break; } @@ -1181,7 +1164,6 @@ static bool_ monst_spell_monst(int m_idx) else if (disturb_other) disturb(1); if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires a missile at %s.", m_name, t_name); - sound(SOUND_SHOOT); monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(7, 6)); break; } @@ -1192,7 +1174,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes acid at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_ACID, ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); break; @@ -1204,7 +1185,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes lightning at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_ELEC, ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); break; @@ -1216,7 +1196,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes fire at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_FIRE, ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); break; @@ -1228,7 +1207,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes frost at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_COLD, ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); break; @@ -1240,7 +1218,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes gas at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_POIS, ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); break; @@ -1252,7 +1229,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes nether at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_NETHER, ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6)), 0); break; @@ -1264,7 +1240,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes light at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_LITE, ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); break; @@ -1276,7 +1251,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes darkness at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_DARK, ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); break; @@ -1288,7 +1262,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes confusion at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_CONFUSION, ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); break; @@ -1300,7 +1273,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes sound at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_SOUND, ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); break; @@ -1312,7 +1284,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes chaos at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_CHAOS, ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6)), 0); break; @@ -1324,7 +1295,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes disenchantment at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_DISENCHANT, ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6)), 0); break; @@ -1336,7 +1306,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes nexus at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_NEXUS, ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); break; @@ -1348,7 +1317,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes time at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_TIME, ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3)), 0); break; @@ -1360,7 +1328,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes inertia at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_INERTIA, ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); break; @@ -1372,7 +1339,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes gravity at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_GRAVITY, ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3)), 0); break; @@ -1384,7 +1350,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes shards at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_SHARDS, ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); break; @@ -1396,7 +1361,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes plasma at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_PLASMA, ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6)), 0); break; @@ -1408,7 +1372,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes force at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_FORCE, ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); break; @@ -1420,7 +1383,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes magical energy at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_MANA, ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); break; @@ -1432,7 +1394,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a ball of radiation at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_NUKE, (rlev + damroll(10, 6)), 2); break; @@ -1444,7 +1405,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes toxic waste at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_NUKE, ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); break; @@ -1456,7 +1416,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear someone mumble frighteningly."); else if (blind) monster_msg("%^s mumbles frighteningly.", m_name); else monster_msg("%^s invokes a raw Chaos upon %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_CHAOS, (rlev * 2) + damroll(10, 10), 4); break; @@ -1468,7 +1427,6 @@ static bool_ monst_spell_monst(int m_idx) if (!see_either) monster_msg("You hear breathing noise."); else if (blind) monster_msg("%^s breathes.", m_name); else monster_msg("%^s breathes disintegration at %s.", m_name, t_name); - sound(SOUND_BREATH); monst_breath_monst(m_idx, y, x, GF_DISINTEGRATE, ((m_ptr->hp / 3) > 300 ? 300 : (m_ptr->hp / 3)), 0); break; @@ -5552,7 +5510,6 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) if (explode) { - sound(SOUND_EXPLODE); mon_take_hit_mon(m_idx, m_idx, m_ptr->hp + 1, &fear, " explodes into tiny shreds."); blinked = FALSE; diff --git a/src/object2.cc b/src/object2.cc index 8e16fe48..ee001427 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -5293,8 +5293,6 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) if (chance && (by == p_ptr->py) && (bx == p_ptr->px)) { msg_print("You feel something roll beneath your feet."); - /* Sound */ - sound(SOUND_DROP); } /* XXX XXX XXX */ diff --git a/src/spells1.cc b/src/spells1.cc index daee9f03..58cf1fd7 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -220,9 +220,6 @@ void teleport_player_directed(int rad, int dir) } - /* Sound */ - sound(SOUND_TELEPORT); - /* Move player */ teleport_player_to(y, x); @@ -330,9 +327,6 @@ void teleport_away(int m_idx, int dis) if (tries > MAX_TRIES) return; } - /* Sound */ - sound(SOUND_TPOTHER); - /* Update the new location */ cave[ny][nx].m_idx = m_idx; last_teleportation_y = ny; @@ -449,9 +443,6 @@ static void teleport_to_player(int m_idx) if (attempts < 1) return; - /* Sound */ - sound(SOUND_TPOTHER); - /* Update the new location */ cave[ny][nx].m_idx = m_idx; last_teleportation_y = ny; @@ -571,9 +562,6 @@ void teleport_player(int dis) if (tries > MAX_TRIES) return; } - /* Sound */ - sound(SOUND_TELEPORT); - /* Save the old location */ oy = p_ptr->py; ox = p_ptr->px; @@ -754,9 +742,6 @@ void teleport_monster_to(int m_idx, int ny, int nx) } } - /* Sound */ - sound(SOUND_TPOTHER); - /* Save the old position */ oy = m_ptr->fy; ox = m_ptr->fx; @@ -833,9 +818,6 @@ void teleport_player_to(int ny, int nx) } } - /* Sound */ - sound(SOUND_TELEPORT); - /* Save the old location */ oy = p_ptr->py; ox = p_ptr->px; @@ -961,9 +943,6 @@ void teleport_player_level(void) /* Leaving */ p_ptr->leaving = TRUE; } - - /* Sound */ - sound(SOUND_TPLEVEL); } @@ -1343,9 +1322,6 @@ void take_hit(int damage, cptr hit_from) /* Necromancers get a special treatment */ if (((!has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD)))) { - /* Sound */ - sound(SOUND_DEATH); - /* Hack -- Note death */ if (!last_words) { @@ -1415,8 +1391,6 @@ void take_hit(int damage, cptr hit_from) bell(); } - sound(SOUND_WARN); - /* Message */ if (p_ptr->necro_extra & CLASS_UNDEAD) cmsg_print(TERM_RED, "*** LOW DEATHPOINT WARNING! ***"); @@ -1514,9 +1488,6 @@ void take_sanity_hit(int damage, cptr hit_from) /* Dead player */ if (p_ptr->csane < 0) { - /* Sound */ - sound(SOUND_DEATH); - /* Hack -- Note death */ cmsg_print(TERM_VIOLET, "You turn into an unthinking vegetable."); if (!last_words) @@ -1559,8 +1530,6 @@ void take_sanity_hit(int damage, cptr hit_from) bell(); } - sound(SOUND_WARN); - /* Message */ cmsg_print(TERM_RED, "*** LOW SANITY WARNING! ***"); msg_print(NULL); @@ -6864,9 +6833,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) /* Take note */ if ((fear || do_fear) && (m_ptr->ml)) { - /* Sound */ - sound(SOUND_FLEE); - /* Message */ msg_format("%^s flees in terror!", m_name); } diff --git a/src/spells2.cc b/src/spells2.cc index 15df2f37..da7f9ffc 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -5140,8 +5140,6 @@ void teleport_swap(int dir) } else { - sound(SOUND_TELEPORT); - cave[p_ptr->py][p_ptr->px].m_idx = c_ptr->m_idx; /* Update the old location */ @@ -5223,8 +5221,6 @@ void swap_position(int lty, int ltx) if (!c_ptr->m_idx) { - sound(SOUND_TELEPORT); - /* Keep trace of the old location */ tx = p_ptr->px; ty = p_ptr->py; @@ -5261,8 +5257,6 @@ void swap_position(int lty, int ltx) { m_ptr = &m_list[c_ptr->m_idx]; - sound(SOUND_TELEPORT); - cave[p_ptr->py][p_ptr->px].m_idx = c_ptr->m_idx; /* Update the old location */ diff --git a/src/store.cc b/src/store.cc index 566a7ce0..64b75c3e 100644 --- a/src/store.cc +++ b/src/store.cc @@ -178,9 +178,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Comment */ msg_print(comment_7a[rand_int(MAX_COMMENT_7A)]); - - /* Sound */ - sound(SOUND_STORE1); } /* Item was cheaper than we thought, and we paid more than necessary */ @@ -188,9 +185,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Comment */ msg_print(comment_7b[rand_int(MAX_COMMENT_7B)]); - - /* Sound */ - sound(SOUND_STORE2); } /* Item was a good bargain, and we got away with it */ @@ -198,9 +192,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Comment */ msg_print(comment_7c[rand_int(MAX_COMMENT_7C)]); - - /* Sound */ - sound(SOUND_STORE3); } /* Item was a great bargain, and we got away with it */ @@ -208,9 +199,6 @@ static void purchase_analyze(s32b price, s32b value, s32b guess) { /* Comment */ msg_print(comment_7d[rand_int(MAX_COMMENT_7D)]); - - /* Sound */ - sound(SOUND_STORE4); } } @@ -2227,9 +2215,6 @@ void store_purchase(void) /* Say "okay" */ say_comment_1(); - /* Make a sound */ - sound(SOUND_BUY); - /* Spend the money */ p_ptr->au -= price; @@ -2524,9 +2509,6 @@ void store_sell(void) /* Say "okay" */ say_comment_1(); - /* Make a sound */ - sound(SOUND_SELL); - /* Get some money */ p_ptr->au += price; diff --git a/src/util.cc b/src/util.cc index f4f6c64e..d9805f47 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1239,16 +1239,6 @@ void bell(void) } -/* -* Hack -- Make a (relevant?) sound -*/ -void sound(int val) -{ - /* Ignore; sound not currently supported. */ - return; -} - - /* * Helper function called only from "inkey()" diff --git a/src/util.hpp b/src/util.hpp index 06832a41..c682b2f2 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -24,7 +24,6 @@ extern errr fd_read(int fd, char *buf, huge n); extern errr fd_write(int fd, cptr buf, huge n); extern errr fd_close(int fd); extern void flush(void); -extern void sound(int num); extern void move_cursor(int row, int col); extern void text_to_ascii(char *buf, cptr str); extern void ascii_to_text(char *buf, cptr str); diff --git a/src/xtra2.cc b/src/xtra2.cc index 93a0603b..580d55a9 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2006,9 +2006,6 @@ void check_experience(void) } } - /* Sound */ - sound(SOUND_LEVEL); - /* Message */ cmsg_format(TERM_L_GREEN, "Welcome to level %d.", p_ptr->lev); @@ -3097,10 +3094,6 @@ bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note) msg_format("%^s says: %s", m_name, line_got); } - - /* Make a sound */ - sound(SOUND_KILL); - /* Death by Missile/Spell attack */ if (note) { -- cgit v1.2.3 From abfb46d19acc0c979a8af93c5add1da11d26457f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Add DRS_NONE for "learn nothing" for update_smart_learn() --- src/defines.h | 1 + src/monster2.cc | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/defines.h b/src/defines.h index 14d7fe25..b17403ef 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2158,6 +2158,7 @@ /* * Some things which induce learning */ +#define DRS_NONE 0 #define DRS_ACID 1 #define DRS_ELEC 2 #define DRS_FIRE 3 diff --git a/src/monster2.cc b/src/monster2.cc index d363d4e1..74380a25 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -3661,22 +3661,33 @@ void message_pain(int m_idx, int dam) */ void update_smart_learn(int m_idx, int what) { - monster_type *m_ptr = &m_list[m_idx]; - /* Not allowed to learn */ - if (!smart_learn) return; + if (!smart_learn) + { + return; + } + + /* Fast path for DRS_NONE */ + if (what == DRS_NONE) + { + return; + } /* Get racial flags */ + auto m_ptr = &m_list[m_idx]; auto const r_ptr = m_ptr->race(); /* Too stupid to learn anything */ - if (r_ptr->flags & RF_STUPID) return; + if (r_ptr->flags & RF_STUPID) + { + return; + } /* Not intelligent, only learn sometimes */ - if (!(r_ptr->flags & RF_SMART) && magik(50)) return; - - - /* XXX XXX XXX */ + if (!(r_ptr->flags & RF_SMART) && magik(50)) + { + return; + } /* Analyze the knowledge */ switch (what) -- cgit v1.2.3 From 993cc3d53b2f2ca85a1b035b185d7515d2da2a16 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove lots of boilerplate for monster breaths --- src/melee2.cc | 347 +++++++++++++++------------------------------------------- 1 file changed, 89 insertions(+), 258 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 1cebfb0b..c43b2aae 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -1082,6 +1082,31 @@ static bool_ monst_spell_monst(int m_idx) see_either = (see_m || see_t); see_both = (see_m && see_t); + /* Do a breath */ + auto do_breath = [&](char const *element, int gf, s32b max, int divisor) -> void { + // Interrupt + if (disturb_other) + { + disturb(1); + } + // Message + if (!see_either) + { + monster_msg("You hear breathing noise."); + } + else if (blind) + { + monster_msg("%^s breathes.", m_name); + } + else + { + monster_msg("%^s breathes %s at %s.", m_name, element, t_name); + } + // Breathe + monst_breath_monst(m_idx, y, x, gf, std::min(max, m_ptr->hp / divisor), 0); + }; + + /* Spell effect */ int count = 0; switch (thrown_spell->spell_idx) { @@ -1170,227 +1195,127 @@ static bool_ monst_spell_monst(int m_idx) case SF_BR_ACID_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes acid at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_ACID, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); + do_breath("acid", GF_ACID, 1600, 3); break; } case SF_BR_ELEC_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes lightning at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_ELEC, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); + do_breath("lightning", GF_ELEC, 1600, 3); break; } case SF_BR_FIRE_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes fire at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_FIRE, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); + do_breath("fire", GF_FIRE, 1600, 3); break; } case SF_BR_COLD_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes frost at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_COLD, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); + do_breath("frost", GF_COLD, 1600, 3); break; } case SF_BR_POIS_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes gas at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_POIS, - ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); + do_breath("gas", GF_POIS, 800, 3); break; } case SF_BR_NETH_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes nether at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_NETHER, - ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6)), 0); + do_breath("nether", GF_NETHER, 550, 6); break; } case SF_BR_LITE_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes light at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_LITE, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); + do_breath("light", GF_LITE, 400, 6); break; } case SF_BR_DARK_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes darkness at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_DARK, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); + do_breath("darkness", GF_DARK, 400, 6); break; } case SF_BR_CONF_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes confusion at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_CONFUSION, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); + do_breath("confusion", GF_CONFUSION, 400, 6); break; } case SF_BR_SOUN_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes sound at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_SOUND, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); + do_breath("sound", GF_SOUND, 400, 6); break; } case SF_BR_CHAO_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes chaos at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_CHAOS, - ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6)), 0); + do_breath("chaos", GF_CHAOS, 600, 6); break; } case SF_BR_DISE_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes disenchantment at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_DISENCHANT, - ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6)), 0); + do_breath("disenchantment", GF_DISENCHANT, 500, 6); break; } case SF_BR_NEXU_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes nexus at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_NEXUS, - ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); + do_breath("nexus", GF_NEXUS, 250, 3); break; } case SF_BR_TIME_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes time at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_TIME, - ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3)), 0); + do_breath("time", GF_TIME, 150, 3); break; } case SF_BR_INER_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes inertia at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_INERTIA, - ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); + do_breath("inertia", GF_INERTIA, 200, 6); break; } case SF_BR_GRAV_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes gravity at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_GRAVITY, - ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3)), 0); + do_breath("gravity", GF_GRAVITY, 200, 3); break; } case SF_BR_SHAR_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes shards at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_SHARDS, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); + do_breath("shards", GF_SHARDS, 400, 6); break; } case SF_BR_PLAS_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes plasma at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_PLASMA, - ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6)), 0); + do_breath("plasma", GF_PLASMA, 150, 6); break; } case SF_BR_WALL_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes force at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_FORCE, - ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); + do_breath("force", GF_FORCE, 200, 6); break; } case SF_BR_MANA_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes magical energy at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_MANA, - ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); + do_breath("magical energy", GF_MANA, 250, 3); break; } case SF_BA_NUKE_IDX: { - if (disturb_other) disturb(1); + if (disturb_other) disturb(1); if (!see_either) monster_msg("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a ball of radiation at %s.", m_name, t_name); @@ -1401,12 +1326,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BR_NUKE_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes toxic waste at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_NUKE, - ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); + do_breath("toxic waste", GF_NUKE, 800, 3); break; } @@ -1423,12 +1343,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BR_DISI_IDX: { - if (disturb_other) disturb(1); - if (!see_either) monster_msg("You hear breathing noise."); - else if (blind) monster_msg("%^s breathes.", m_name); - else monster_msg("%^s breathes disintegration at %s.", m_name, t_name); - monst_breath_monst(m_idx, y, x, GF_DISINTEGRATE, - ((m_ptr->hp / 3) > 300 ? 300 : (m_ptr->hp / 3)), 0); + do_breath("disintegration", GF_DISINTEGRATE, 300, 3); break; } @@ -2859,6 +2774,25 @@ static bool_ make_attack_spell(int m_idx) /* Hack -- Get the "died from" name */ monster_desc(ddesc, m_ptr, 0x88); + /* Do a breath */ + auto do_breath = [&](char const *element, int gf, s32b max, int divisor, int smart_learn) -> void { + // Interrupt + disturb(1); + // Message + if (blind) + { + msg_format("%^s breathes.", m_name); + } + else + { + msg_format("%^s breathes %s.", m_name, element); + } + // Breathe + breath(m_idx, gf, std::min(m_ptr->hp / divisor, max), 0); + // Update "smart" monster knowledge + update_smart_learn(m_idx, smart_learn); + }; + /* Cast the spell. */ switch (thrown_spell->spell_idx) { @@ -2941,215 +2875,121 @@ static bool_ make_attack_spell(int m_idx) case SF_BR_ACID_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes acid.", m_name); - breath(m_idx, GF_ACID, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_ACID); + do_breath("acid", GF_ACID, 1600, 3, DRS_ACID); break; } case SF_BR_ELEC_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes lightning.", m_name); - breath(m_idx, GF_ELEC, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_ELEC); + do_breath("lightning", GF_ELEC, 1600, 3, DRS_ELEC); break; } case SF_BR_FIRE_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes fire.", m_name); - breath(m_idx, GF_FIRE, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_FIRE); + do_breath("fire", GF_FIRE, 1600, 3, DRS_FIRE); break; } case SF_BR_COLD_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes frost.", m_name); - breath(m_idx, GF_COLD, - ((m_ptr->hp / 3) > 1600 ? 1600 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_COLD); + do_breath("frost", GF_COLD, 1600, 3, DRS_COLD); break; } case SF_BR_POIS_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes gas.", m_name); - breath(m_idx, GF_POIS, - ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_POIS); + do_breath("gas", GF_POIS, 800, 3, DRS_POIS); break; } case SF_BR_NETH_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes nether.", m_name); - breath(m_idx, GF_NETHER, - ((m_ptr->hp / 6) > 550 ? 550 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_NETH); + do_breath("nether", GF_NETHER, 550, 6, DRS_NETH); break; } case SF_BR_LITE_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes light.", m_name); - breath(m_idx, GF_LITE, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_LITE); + do_breath("light", GF_LITE, 400, 6, DRS_LITE); break; } case SF_BR_DARK_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes darkness.", m_name); - breath(m_idx, GF_DARK, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_DARK); + do_breath("darkness", GF_DARK, 400, 6, DRS_DARK); break; } case SF_BR_CONF_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes confusion.", m_name); - breath(m_idx, GF_CONFUSION, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_CONF); + do_breath("confusion", GF_CONFUSION, 400, 6, DRS_CONF); break; } case SF_BR_SOUN_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes sound.", m_name); - breath(m_idx, GF_SOUND, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_SOUND); + do_breath("sound", GF_SOUND, 400, 6, DRS_SOUND); break; } case SF_BR_CHAO_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes chaos.", m_name); - breath(m_idx, GF_CHAOS, - ((m_ptr->hp / 6) > 600 ? 600 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_CHAOS); + do_breath("chaos", GF_CHAOS, 600, 6, DRS_CHAOS); break; } case SF_BR_DISE_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes disenchantment.", m_name); - breath(m_idx, GF_DISENCHANT, - ((m_ptr->hp / 6) > 500 ? 500 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_DISEN); + do_breath("disenchantment", GF_DISENCHANT, 500, 6, DRS_DISEN); break; } case SF_BR_NEXU_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes nexus.", m_name); - breath(m_idx, GF_NEXUS, - ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_NEXUS); + do_breath("nexus", GF_NEXUS, 250, 3, DRS_NEXUS); break; } case SF_BR_TIME_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes time.", m_name); - breath(m_idx, GF_TIME, - ((m_ptr->hp / 3) > 150 ? 150 : (m_ptr->hp / 3)), 0); + do_breath("time", GF_TIME, 150, 3, DRS_NONE); break; } case SF_BR_INER_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes inertia.", m_name); - breath(m_idx, GF_INERTIA, - ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); + do_breath("inertia", GF_INERTIA, 200, 6, DRS_NONE); break; } case SF_BR_GRAV_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes gravity.", m_name); - breath(m_idx, GF_GRAVITY, - ((m_ptr->hp / 3) > 200 ? 200 : (m_ptr->hp / 3)), 0); + do_breath("gravity", GF_GRAVITY, 200, 3, DRS_NONE); break; } case SF_BR_SHAR_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes shards.", m_name); - breath(m_idx, GF_SHARDS, - ((m_ptr->hp / 6) > 400 ? 400 : (m_ptr->hp / 6)), 0); - update_smart_learn(m_idx, DRS_SHARD); + do_breath("shards", GF_SHARDS, 400, 6, DRS_SHARD); break; } case SF_BR_PLAS_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes plasma.", m_name); - breath(m_idx, GF_PLASMA, - ((m_ptr->hp / 6) > 150 ? 150 : (m_ptr->hp / 6)), 0); + do_breath("plasma", GF_PLASMA, 150, 6, DRS_NONE); break; } case SF_BR_WALL_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes force.", m_name); - breath(m_idx, GF_FORCE, - ((m_ptr->hp / 6) > 200 ? 200 : (m_ptr->hp / 6)), 0); + do_breath("force", GF_FORCE, 200, 6, DRS_NONE); break; } case SF_BR_MANA_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes magical energy.", m_name); - breath(m_idx, GF_MANA, - ((m_ptr->hp / 3) > 250 ? 250 : (m_ptr->hp / 3)), 0); + do_breath("magical energy", GF_MANA, 250, 3, DRS_NONE); break; } @@ -3165,12 +3005,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BR_NUKE_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes toxic waste.", m_name); - breath(m_idx, GF_NUKE, - ((m_ptr->hp / 3) > 800 ? 800 : (m_ptr->hp / 3)), 0); - update_smart_learn(m_idx, DRS_POIS); + do_breath("toxic waste", GF_NUKE, 800, 3, DRS_POIS); break; } @@ -3186,11 +3021,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BR_DISI_IDX: { - disturb(1); - if (blind) msg_format("%^s breathes.", m_name); - else msg_format("%^s breathes disintegration.", m_name); - breath(m_idx, GF_DISINTEGRATE, - ((m_ptr->hp / 3) > 300 ? 300 : (m_ptr->hp / 3)), 0); + do_breath("disintegration", GF_DISINTEGRATE, 300, 3, DRS_NONE); break; } -- cgit v1.2.3 From 0d6002ae3c1f2b4fc043bf5ff8cad1e918af7c80 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove lots of boilerplate for monster summoning --- src/melee2.cc | 728 ++++++++++++++++++++++------------------------------------ 1 file changed, 276 insertions(+), 452 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index c43b2aae..419282c6 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -1106,9 +1106,76 @@ static bool_ monst_spell_monst(int m_idx) monst_breath_monst(m_idx, y, x, gf, std::min(max, m_ptr->hp / divisor), 0); }; + /* Messages for summoning */ + struct summon_messages { + char const *singular; + char const *plural; + }; + + /* Default message for summoning when player is blinded */ + auto blind_msg_default = summon_messages { + "You hear something appear nearby.", + "You hear many things appear nearby." + }; + + /* Do a summoning spell */ + auto do_summon = [&](char const *action, int n, int friendly_type, int hostile_type, summon_messages const &blind_msg) -> void { + // Interrupt + if (disturb_other) + { + disturb(1); + } + // Message + if (blind || !see_m) + { + monster_msg("%^s mumbles.", m_name); + } + else + { + monster_msg("%^s magically %s", m_name, action); + } + // Do the actual summoning + int count = 0; + for (int k = 0; k < n; k++) + { + if (friendly) + { + count += summon_specific_friendly(y, x, rlev, friendly_type, TRUE); + } + else if (!friendly) + { + count += summon_specific(y, x, rlev, hostile_type); + } + } + // Message for blinded characters + if (blind) + { + if (count == 1) + { + monster_msg(blind_msg.singular); + } + else if (count > 1) + { + monster_msg(blind_msg.plural); + } + } + }; + + /* There's no summoning friendly uniques or Nazgul */ + auto spell_idx = thrown_spell->spell_idx; + + if (friendly) + { + if ((thrown_spell->spell_idx == SF_S_UNIQUE_IDX) && + (thrown_spell->spell_idx == SF_S_WRAITH_IDX)) + { + // Summon high undead instead + spell_idx = SF_S_HI_UNDEAD_IDX; + } + } + /* Spell effect */ - int count = 0; - switch (thrown_spell->spell_idx) + switch (spell_idx) { case SF_SHRIEK_IDX: { @@ -1125,22 +1192,6 @@ static bool_ monst_spell_monst(int m_idx) break; } - case SF_S_ANIMAL_IDX: - { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons an animal!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_ANIMAL); - } - if (blind && count) monster_msg("You hear something appear nearby."); - break; - } - case SF_ROCKET_IDX: { if (disturb_other) disturb(1); @@ -1989,22 +2040,6 @@ static bool_ monst_spell_monst(int m_idx) break; } - case SF_S_ANIMALS_IDX: - { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons some animals!", m_name); - for (int k = 0; k < 4; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_ANIMAL, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_ANIMAL); - } - if (blind && count) monster_msg("You hear many things appear nearby."); - break; - } - case SF_BLINK_IDX: { if (disturb_other) disturb(1); @@ -2104,326 +2139,189 @@ static bool_ monst_spell_monst(int m_idx) break; } + case SF_S_ANIMAL_IDX: + { + do_summon("summons an animal!", 1, SUMMON_ANIMAL, SUMMON_ANIMAL, blind_msg_default); + break; + } + + case SF_S_ANIMALS_IDX: + { + do_summon("summons some animals!", 4, SUMMON_ANIMAL, SUMMON_ANIMAL, blind_msg_default); + break; + } + case SF_S_BUG_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically codes some software bugs.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_BUG, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_BUG); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("codes some software bugs.", 6, SUMMON_BUG, SUMMON_BUG, blind_msg_default); break; } case SF_S_RNG_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically codes some RNGs.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_RNG, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_RNG); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("codes some RNGs.", 6, SUMMON_RNG, SUMMON_RNG, blind_msg_default); break; } case SF_S_THUNDERLORD_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons a Thunderlord!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_THUNDERLORD, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_THUNDERLORD); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons a Thunderlord!", 1, SUMMON_THUNDERLORD, SUMMON_THUNDERLORD, blind_msg_default); break; } case SF_S_KIN_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons %s %s.", - m_name, m_poss, - ((r_ptr->flags) & RF_UNIQUE ? - "minions" : "kin")); - summon_kin_type = r_ptr->d_char; /* Big hack */ - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_KIN, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_KIN); - } - if (blind && count) monster_msg("You hear many things appear nearby."); - - + // Describe the summons + char action[256]; + sprintf(action, + "summons %s %s.", + m_poss, + (r_ptr->flags & RF_UNIQUE ? "minions" : "kin")); + // Force the right type of "kin" + summon_kin_type = r_ptr->d_char; + // Summon + do_summon(action, 6, SUMMON_KIN, SUMMON_KIN, blind_msg_default); break; } case SF_S_HI_DEMON_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons greater demons!", m_name); - if (blind && count) monster_msg("You hear heavy steps nearby."); - if (friendly) - summon_specific_friendly(y, x, rlev, SUMMON_HI_DEMON, TRUE); - else - summon_cyber(); + do_summon("summons greater demons!", 8, SUMMON_HI_DEMON, SUMMON_HI_DEMON, blind_msg_default); break; - } + } case SF_S_MONSTER_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons help!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_NO_UNIQUES, TRUE); - else - count += summon_specific(y, x, rlev, 0); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons help!", 1, SUMMON_NO_UNIQUES, 0, blind_msg_default); break; } case SF_S_MONSTERS_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons monsters!", m_name); - for (int k = 0; k < 8; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_NO_UNIQUES, TRUE); - else - count += summon_specific(y, x, rlev, 0); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("summons monsters!", 8, SUMMON_NO_UNIQUES, 0, blind_msg_default); break; } case SF_S_ANT_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons ants.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_ANT, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_ANT); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("summons ants.", 6, SUMMON_ANT, SUMMON_ANT, blind_msg_default); break; } case SF_S_SPIDER_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons spiders.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_SPIDER, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_SPIDER); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("summons spiders.", 6, SUMMON_SPIDER, SUMMON_SPIDER, blind_msg_default); break; } case SF_S_HOUND_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons hounds.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_HOUND, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_HOUND); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("summons hounds.", 6, SUMMON_HOUND, SUMMON_HOUND, blind_msg_default); break; } case SF_S_HYDRA_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons hydras.", m_name); - for (int k = 0; k < 6; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_HYDRA, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_HYDRA); - } - if (blind && count) monster_msg("You hear many things appear nearby."); + do_summon("summons hydras.", 6, SUMMON_HYDRA, SUMMON_HYDRA, blind_msg_default); break; } case SF_S_ANGEL_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons an angel!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_ANGEL, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_ANGEL); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons an angel!", 1, SUMMON_ANGEL, SUMMON_ANGEL, blind_msg_default); break; } case SF_S_DEMON_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons a demon!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_DEMON, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_DEMON); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons a demon!", 1, SUMMON_DEMON, SUMMON_DEMON, blind_msg_default); break; } case SF_S_UNDEAD_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons an undead adversary!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_UNDEAD, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_UNDEAD); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons an undead adversary!", 1, SUMMON_UNDEAD, SUMMON_UNDEAD, blind_msg_default); break; } case SF_S_DRAGON_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons a dragon!", m_name); - for (int k = 0; k < 1; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_DRAGON, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_DRAGON); - } - if (blind && count) monster_msg("You hear something appear nearby."); + do_summon("summons a dragon!", 1, SUMMON_DRAGON, SUMMON_DRAGON, blind_msg_default); break; } case SF_S_HI_UNDEAD_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons greater undead!", m_name); - for (int k = 0; k < 8; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); - } - if (blind && count) - { - monster_msg("You hear many creepy things appear nearby."); - } + summon_messages blind_msg { + "You hear a creepy thing appear nearby.", + "You hear many creepy things appear nearby." + }; + do_summon("summons greater undead!", 8, SUMMON_HI_UNDEAD_NO_UNIQUES, SUMMON_HI_UNDEAD, blind_msg); break; } case SF_S_HI_DRAGON_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons ancient dragons!", m_name); - for (int k = 0; k < 8; k++) - { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_HI_DRAGON_NO_UNIQUES, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_HI_DRAGON); - } - if (blind && count) - { - monster_msg("You hear many powerful things appear nearby."); - } + summon_messages blind_msg { + "You hear many a powerful thing appear nearby.", + "You hear many powerful things appear nearby." + }; + do_summon("summons ancient dragons!", 8, SUMMON_HI_DRAGON_NO_UNIQUES, SUMMON_HI_DRAGON, blind_msg); break; } case SF_S_WRAITH_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons a wraith!", m_name); - - - for (int k = 0; k < 8; k++) - { - count += summon_specific(y, x, rlev, SUMMON_WRAITH); - } - - if (blind && count) - { - monster_msg("You hear immortal beings appear nearby."); - } + // No summoning Nazgul; see the remapping code above the switch. + assert(!friendly); + // Summon + summon_messages blind_msg { + "You hear an immortal being appear nearby.", + "You hear immortal beings appear nearby." + }; + do_summon("summons a wraith!", 8, 0 /* not used */, SUMMON_WRAITH, blind_msg); break; } case SF_S_UNIQUE_IDX: { - if (disturb_other) disturb(1); - if (blind || !see_m) monster_msg("%^s mumbles.", m_name); - else monster_msg("%^s magically summons special opponents!", m_name); + // No summoning uniques; see the remapping code above the switch. + assert(!friendly); + // Interrupt + if (disturb_other) + { + disturb(1); + } + // Message + if (blind || !see_m) + { + monster_msg("%^s mumbles.", m_name); + } + else + { + monster_msg("%^s magically summons special opponents!", m_name); + } + // Summon + int count = 0; for (int k = 0; k < 8; k++) { - if (!friendly) - count += summon_specific(y, x, rlev, SUMMON_UNIQUE); + count += summon_specific(y, x, rlev, SUMMON_UNIQUE); } for (int k = 0; k < 8; k++) { - if (friendly) - count += summon_specific_friendly(y, x, rlev, SUMMON_HI_UNDEAD_NO_UNIQUES, TRUE); - else - count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); + count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); } - if (blind && count) + // Message + if (blind) { - monster_msg("You hear many powerful things appear nearby."); + if (count == 1) + { + monster_msg("You hear a powerful thing appear nearby."); + } + else if (count > 1) + { + monster_msg("You hear many powerful things appear nearby."); + } } break; } @@ -2602,14 +2500,11 @@ static bool_ make_attack_spell(int m_idx) static const auto SF_INT_MASK = compute_smart_mask(); static const auto SF_INNATE_MASK = compute_innate_mask(); - int k, chance, rlev, failrate; + int chance, rlev, failrate; char m_name[80]; bool_ no_inate = FALSE; int x, y; - /* Summon count */ - int count = 0; - /* Extract the blind-ness */ bool_ blind = (p_ptr->blind ? TRUE : FALSE); @@ -2793,6 +2688,51 @@ static bool_ make_attack_spell(int m_idx) update_smart_learn(m_idx, smart_learn); }; + /* Messages for summoning */ + struct summon_messages { + char const *singular; + char const *plural; + }; + + /* Default message for summoning when player is blinded */ + summon_messages blind_msg_default { + "You hear something appear nearby.", + "You hear many things appear nearby." + }; + + /* Do a summoning spell */ + auto do_summon = [&](char const *action, int n, int type, summon_messages const &blind_msg) -> void { + // Interrupt + disturb(1); + // Message + if (blind) + { + msg_format("%^s mumbles.", m_name); + } + else + { + msg_format("%^s magically %s", m_name, action); + } + // Do the actual summoning + int count = 0; + for (int k = 0; k < n; k++) + { + count += summon_specific(y, x, rlev, type); + } + // Message for blinded characters + if (blind) + { + if (count == 1) + { + msg_print(blind_msg.singular); + } + else if (count > 1) + { + msg_print(blind_msg.plural); + } + } + }; + /* Cast the spell. */ switch (thrown_spell->spell_idx) { @@ -2809,19 +2749,6 @@ static bool_ make_attack_spell(int m_idx) break; } - case SF_S_ANIMAL_IDX: - { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons an animal!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_ANIMAL); - } - if (blind && count) msg_print("You hear something appear nearby."); - break; - } - case SF_ROCKET_IDX: { disturb(1); @@ -3657,19 +3584,6 @@ static bool_ make_attack_spell(int m_idx) break; } - case SF_S_ANIMALS_IDX: - { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons some animals!", m_name); - for (k = 0; k < 4; k++) - { - count += summon_specific(y, x, rlev, SUMMON_ANIMAL); - } - if (blind && count) msg_print("You hear something appear nearby."); - break; - } - case SF_BLINK_IDX: { disturb(1); @@ -3757,271 +3671,181 @@ static bool_ make_attack_spell(int m_idx) break; } + case SF_S_ANIMAL_IDX: + { + do_summon("summons an animal!", 1, SUMMON_ANIMAL, blind_msg_default); + break; + } + + case SF_S_ANIMALS_IDX: + { + do_summon("summons some animals!", 4, SUMMON_ANIMAL, blind_msg_default); + break; + } + case SF_S_BUG_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically codes some software bugs.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_BUG); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("codes some software bugs.", 6, SUMMON_BUG, blind_msg_default); break; } case SF_S_RNG_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically codes some RNGs.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_RNG); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("codes some RNGs.", 6, SUMMON_RNG, blind_msg_default); break; } case SF_S_THUNDERLORD_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons a Thunderlord!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_THUNDERLORD); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons a Thunderlord!", 1, SUMMON_THUNDERLORD, blind_msg_default); break; } case SF_S_KIN_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons %s %s.", - m_name, m_poss, - ((r_ptr->flags) & RF_UNIQUE ? - "minions" : "kin")); - summon_kin_type = r_ptr->d_char; /* Big hack */ - - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_KIN); - } - if (blind && count) msg_print("You hear many things appear nearby."); - + // Describe the summons + char action[256]; + sprintf(action, + "summons %s %s.", + m_poss, + (r_ptr->flags & RF_UNIQUE) ? "minions" : "kin"); + // Force the correct type of "kin" + summon_kin_type = r_ptr->d_char; + // Summon + do_summon(action, 6, SUMMON_KIN, blind_msg_default); break; } case SF_S_HI_DEMON_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons greater demons!", m_name); - if (blind && count) msg_print("You hear heavy steps nearby."); - summon_cyber(); + do_summon("summons greater demons!", 8, SUMMON_HI_DEMON, blind_msg_default); break; } case SF_S_MONSTER_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons help!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, 0); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons help!", 1, 0, blind_msg_default); break; } case SF_S_MONSTERS_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons monsters!", m_name); - for (k = 0; k < 8; k++) - { - count += summon_specific(y, x, rlev, 0); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("summons monsters!", 8, 0, blind_msg_default); break; } case SF_S_ANT_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons ants.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_ANT); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("summons ants.", 6, SUMMON_ANT, blind_msg_default); break; } case SF_S_SPIDER_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons spiders.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_SPIDER); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("summons spiders.", 6, SUMMON_SPIDER, blind_msg_default); break; } case SF_S_HOUND_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons hounds.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_HOUND); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("summons hounds.", 6, SUMMON_HOUND, blind_msg_default); break; } case SF_S_HYDRA_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons hydras.", m_name); - for (k = 0; k < 6; k++) - { - count += summon_specific(y, x, rlev, SUMMON_HYDRA); - } - if (blind && count) msg_print("You hear many things appear nearby."); + do_summon("summons hydras.", 6, SUMMON_HYDRA, blind_msg_default); break; } case SF_S_ANGEL_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons an angel!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_ANGEL); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons an angel!", 1, SUMMON_ANGEL, blind_msg_default); break; } case SF_S_DEMON_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons a demon!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_DEMON); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons a demon!", 1, SUMMON_DEMON, blind_msg_default); break; } case SF_S_UNDEAD_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons an undead adversary!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_UNDEAD); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons an undead adversary!", 1, SUMMON_UNDEAD, blind_msg_default); break; } case SF_S_DRAGON_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons a dragon!", m_name); - for (k = 0; k < 1; k++) - { - count += summon_specific(y, x, rlev, SUMMON_DRAGON); - } - if (blind && count) msg_print("You hear something appear nearby."); + do_summon("summons a dragon!", 1, SUMMON_DRAGON, blind_msg_default); break; } case SF_S_HI_UNDEAD_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons greater undead!", m_name); - for (k = 0; k < 8; k++) - { - count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); - } - if (blind && count) - { - msg_print("You hear many creepy things appear nearby."); - } + summon_messages blind_msg { + "You hear a creepy thing appear nearby.", + "You hear many creepy things appear nearby." + }; + do_summon("summons greater undead!", 8, SUMMON_HI_UNDEAD, blind_msg); break; } case SF_S_HI_DRAGON_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons ancient dragons!", m_name); - for (k = 0; k < 8; k++) - { - count += summon_specific(y, x, rlev, SUMMON_HI_DRAGON); - } - if (blind && count) - { - msg_print("You hear many powerful things appear nearby."); - } + summon_messages blind_msg { + "You hear a powerful thing appear nearby.", + "You hear many powerful things appear nearby." + }; + do_summon("summons ancient dragons!", 8, SUMMON_HI_DRAGON, blind_msg); break; } case SF_S_WRAITH_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons Wraith!", m_name); - - - for (k = 0; k < 8; k++) - { - count += summon_specific(y, x, rlev, SUMMON_WRAITH); - } - - if (blind && count) - { - msg_print("You hear immortal beings appear nearby."); - } + summon_messages blind_msg { + "You hear an immortal being appear nearby.", + "You hear immortal beings appear nearby." + }; + do_summon("summons Wraiths!", 8, SUMMON_WRAITH, blind_msg); break; } case SF_S_UNIQUE_IDX: { - disturb(1); - if (blind) msg_format("%^s mumbles.", m_name); - else msg_format("%^s magically summons special opponents!", m_name); - for (k = 0; k < 8; k++) + // Interrupt + disturb(1); + // Message + if (blind) + { + msg_format("%^s mumbles.", m_name); + } + else + { + msg_format("%^s magically summons special opponents!", m_name); + } + // Summon + int count = 0; + for (int k = 0; k < 8; k++) { count += summon_specific(y, x, rlev, SUMMON_UNIQUE); } - for (k = 0; k < 8; k++) + for (int k = 0; k < 8; k++) { count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); } - if (blind && count) + // Message + if (blind) { - msg_print("You hear many powerful things appear nearby."); + if (count == 1) + { + msg_print("You hear a powerful thing appear nearby."); + } + else if (count > 1) + { + msg_print("You hear many powerful things appear nearby."); + } } break; } -- cgit v1.2.3 From d191da218fc81d989d0ebdcfd66a4e0b00405121 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Clean up conditional in monst_spell_monst() --- src/melee2.cc | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 419282c6..59f85803 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -962,7 +962,6 @@ static bool_ monst_spell_monst(int m_idx) static const monster_spell_flag_set SF_INT_MASK = compute_smart_mask(); int y = 0, x = 0; - int i = 1; char m_name[80], t_name[80]; char m_poss[80]; char ddesc[80]; @@ -997,20 +996,14 @@ static bool_ monst_spell_monst(int m_idx) if ((rand_int(100) >= chance) && (monst_spell_monst_spell == -1)) return (FALSE); - /* Target location */ - if (m_ptr->target > -1) + /* Make sure monster actually has a target */ + if (m_ptr->target <= 0) { - if (m_ptr->target > 0) - { - i = m_ptr->target; - } - else return FALSE; + return FALSE; } - else return FALSE; - { - int t_idx = i; + int t_idx = m_ptr->target; monster_type *t_ptr = &m_list[t_idx]; auto const tr_ptr = t_ptr->race(); -- cgit v1.2.3 From 03c402d63f5bef5d880c81bf7253a1274aaacf01 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Clean up conditional in make_attack_spell() --- src/melee2.cc | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 59f85803..a31ca1f7 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2496,7 +2496,6 @@ static bool_ make_attack_spell(int m_idx) int chance, rlev, failrate; char m_name[80]; bool_ no_inate = FALSE; - int x, y; /* Extract the blind-ness */ bool_ blind = (p_ptr->blind ? TRUE : FALSE); @@ -2508,19 +2507,12 @@ static bool_ make_attack_spell(int m_idx) bool_ seen = (!blind && m_ptr->ml); /* Target location */ - if (m_ptr->target > -1) + if (m_ptr->target != 0) { - if (!m_ptr->target) - { - y = p_ptr->py; - x = p_ptr->px; - } - else - { - return (FALSE); - } + return FALSE; } - else return FALSE; + int y = p_ptr->py; + int x = p_ptr->px; /* Cannot cast spells when confused */ if (m_ptr->confused) return (FALSE); -- cgit v1.2.3 From bef0f98085526b80b316580bb5a07fcd8b1af2c5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Make summons appear around summoner instead of player --- src/melee2.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index a31ca1f7..c246343b 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -1127,17 +1127,18 @@ static bool_ monst_spell_monst(int m_idx) { monster_msg("%^s magically %s", m_name, action); } + // Do the actual summoning int count = 0; for (int k = 0; k < n; k++) { if (friendly) { - count += summon_specific_friendly(y, x, rlev, friendly_type, TRUE); + count += summon_specific_friendly(m_ptr->fy, m_ptr->fx, rlev, friendly_type, TRUE); } else if (!friendly) { - count += summon_specific(y, x, rlev, hostile_type); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, hostile_type); } } // Message for blinded characters @@ -2298,11 +2299,11 @@ static bool_ monst_spell_monst(int m_idx) int count = 0; for (int k = 0; k < 8; k++) { - count += summon_specific(y, x, rlev, SUMMON_UNIQUE); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNIQUE); } for (int k = 0; k < 8; k++) { - count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_UNDEAD); } // Message if (blind) @@ -2702,7 +2703,7 @@ static bool_ make_attack_spell(int m_idx) int count = 0; for (int k = 0; k < n; k++) { - count += summon_specific(y, x, rlev, type); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, type); } // Message for blinded characters if (blind) @@ -3814,11 +3815,11 @@ static bool_ make_attack_spell(int m_idx) int count = 0; for (int k = 0; k < 8; k++) { - count += summon_specific(y, x, rlev, SUMMON_UNIQUE); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_UNIQUE); } for (int k = 0; k < 8; k++) { - count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD); + count += summon_specific(m_ptr->fy, m_ptr->fx, rlev, SUMMON_HI_UNDEAD); } // Message if (blind) -- cgit v1.2.3 From 46f69654774b0eb51bd4706cf7fd9d11fbc8eec8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove monster_race::total_visible temporary state --- src/monster_race.hpp | 2 -- src/xtra1.cc | 37 +++++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/monster_race.hpp b/src/monster_race.hpp index 58c49e1f..eb398a3d 100644 --- a/src/monster_race.hpp +++ b/src/monster_race.hpp @@ -77,8 +77,6 @@ struct monster_race bool_ on_saved = 0; /* Is the (unique) on a saved level ? */ - byte total_visible = 0; /* Amount of this race that are visible */ - obj_theme drops; /* The drops type */ }; diff --git a/src/xtra1.cc b/src/xtra1.cc index 066bd0fb..ae37bd90 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1353,10 +1353,13 @@ static void fix_object(void) static void fix_m_list(void) { - int i, j; + // Mirror of the r_info array, index by index. We use a + // statically allocated value to avoid frequent allocations. + static auto r_total_visible = + std::vector(max_r_idx, 0); /* Scan windows */ - for (j = 0; j < 8; j++) + for (std::size_t j = 0; j < 8; j++) { term *old = Term; @@ -1389,18 +1392,17 @@ static void fix_m_list(void) } /* reset visible count */ - for (i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < max_r_idx; i++) { - monster_race *r_ptr = &r_info[i]; - - r_ptr->total_visible = 0; + r_total_visible[i] = 0; } /* Count up the number visible in each race */ - for (i = 1; i < m_max; i++) + for (std::size_t i = 1; i < static_cast(m_max); i++) { - monster_type *m_ptr = &m_list[i]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto const m_ptr = &m_list[i]; + auto const r_ptr = &r_info[m_ptr->r_idx]; + auto total_visible = &r_total_visible[m_ptr->r_idx]; /* Skip dead monsters */ if (m_ptr->hp < 0) continue; @@ -1420,7 +1422,7 @@ static void fix_m_list(void) } /* Increase for this race */ - r_ptr->total_visible++; + (*total_visible)++; /* Increase total Count */ c++; @@ -1435,15 +1437,19 @@ static void fix_m_list(void) c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0); - for (i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < max_r_idx; i++) { - monster_race *r_ptr = &r_info[i]; + auto const r_ptr = &r_info[i]; + auto const total_visible = r_total_visible[i]; /* Default Colour */ byte attr = TERM_SLATE; /* Only visible monsters */ - if (!r_ptr->total_visible) continue; + if (!total_visible) + { + continue; + } /* Uniques */ if (r_ptr->flags & RF_UNIQUE) @@ -1469,15 +1475,14 @@ static void fix_m_list(void) if (!(r_ptr->flags & RF_UNIQUE)) attr = TERM_GREEN; } - /* Dump the monster name */ - if (r_ptr->total_visible == 1) + if (total_visible == 1) { c_prt(attr, r_ptr->name, (num % (h - 1)) + 1, (num / (h - 1) * 26)); } else { - c_prt(attr, format("%s (x%d)", r_ptr->name, r_ptr->total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26); + c_prt(attr, format("%s (x%d)", r_ptr->name, total_visible), (num % (h - 1)) + 1, (num / (h - 1)) * 26); } num++; -- cgit v1.2.3 From 76b3632d13bbf57c6354bc10f67ea849f1d47279 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Rework player_race_mod::{title,desc} to std::string --- src/birth.cc | 27 ++++++++++---------- src/corrupt.cc | 10 ++------ src/dungeon.cc | 6 ++--- src/files.cc | 2 +- src/init1.cc | 15 ++++------- src/loadsave.cc | 66 ++++++++++++++++++++++++++++++++----------------- src/player_race_mod.hpp | 5 ++-- src/xtra2.cc | 34 +++---------------------- src/xtra2.hpp | 2 -- 9 files changed, 76 insertions(+), 91 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 8d14da00..27b7ee89 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -981,8 +981,9 @@ static void player_outfit_spellbook(cptr spell_name) */ static void player_outfit(void) { + // Shorthand names for convenience cptr class_name = spp_ptr->title; - cptr subrace_name = rmp_ptr->title; + auto const &subrace_name = rmp_ptr->title; /* * Get an adventurer guide describing a bit of the @@ -1048,37 +1049,37 @@ static void player_outfit(void) } /* Dragons */ - if (streq(subrace_name, "Red")) + if (subrace_name == "Red") { player_outfit_spellbook("Globe of Light"); } - if (streq(subrace_name, "Black")) + if (subrace_name == "Black") { player_outfit_spellbook("Geyser"); } - if (streq(subrace_name, "Green")) + if (subrace_name == "Green") { player_outfit_spellbook("Noxious Cloud"); } - if (streq(subrace_name, "Blue")) + if (subrace_name == "Blue") { player_outfit_spellbook("Stone Skin"); } - if (streq(subrace_name, "White")) + if (subrace_name == "White") { player_outfit_spellbook("Sense Monsters"); } - if (streq(subrace_name, "Ethereal")) + if (subrace_name == "Ethereal") { player_outfit_spellbook("Recharge"); } /* Demons */ - if (streq(subrace_name, "(Aewrog)")) + if (subrace_name == "(Aewrog)") { player_outfit_spellbook("Charm"); } - if (streq(subrace_name, "(Narrog)")) + if (subrace_name == "(Narrog)") { player_outfit_spellbook("Phase Door"); } @@ -1116,7 +1117,7 @@ static void player_outfit(void) identify_pack_fully(); } - if (streq(rmp_ptr->title, "Vampire")) + if (rmp_ptr->title == "Vampire") { player_gain_corruption(CORRUPT_VAMPIRE_TEETH); player_gain_corruption(CORRUPT_VAMPIRE_STRENGTH); @@ -1382,7 +1383,7 @@ static int dump_rmods(int sel, int *racem, int max) /* Display */ if (racem[n]) - strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rmp_ptr->title); + strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rmp_ptr->title.c_str()); else strnfmt(buf, 80, "%c%c%c Classical", p1, I2A(n), p2); @@ -1391,7 +1392,7 @@ static int dump_rmods(int sel, int *racem, int max) { std::string desc; - desc += rmp_ptr->desc; + desc += rmp_ptr->description; if (rmp_ptr->flags & PR_EXPERIMENTAL) { desc += "\nEXPERIMENTAL"; @@ -1716,7 +1717,7 @@ static bool_ player_birth_aux_ask() } else if (c == '?') { - help_subrace(race_mod_info[racem[sel]].title); + help_subrace(race_mod_info[racem[sel]].title.c_str()); } k = (islower(c) ? A2I(c) : -1); diff --git a/src/corrupt.cc b/src/corrupt.cc index 8ad22ea9..bc9f3a8b 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -90,19 +90,13 @@ static void player_gain_vampire() { player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE]; - /* Be a Vampire and be proud of it */ - cptr title = rmp_ptr->title; - if (streq(title, "Vampire")) + if (rmp_ptr->title == "Vampire") { - title = "Vampire"; rmp_ptr->place = FALSE; - set_subrace_title(rmp_ptr, title); } else { - char buf[512]; - sprintf(buf, "Vampire %s", title); - set_subrace_title(rmp_ptr, buf); + rmp_ptr->title = fmt::format("Vampire {}", rmp_ptr->title); } /* Bonus/and .. not bonus :) */ diff --git a/src/dungeon.cc b/src/dungeon.cc index bc5ec69c..824831cf 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1016,7 +1016,7 @@ static bool_ grace_delay_trigger() static void process_world_gods() { const char *race_name = rp_ptr->title; - const char *subrace_name = rmp_ptr->title; + auto const &subrace_name = rmp_ptr->title; if (p_ptr->pgod == GOD_VARDA) { @@ -1177,7 +1177,7 @@ static void process_world_gods() if (grace_delay_trigger()) { /* He loves astral beings */ - if (streq(subrace_name, "LostSoul")) + if (subrace_name == "LostSoul") { inc_piety(GOD_ALL, 1); } @@ -1189,7 +1189,7 @@ static void process_world_gods() } /* Really hates vampires and demons */ - if (streq(subrace_name, "Vampire") || + if ((subrace_name == "Vampire") || streq(race_name, "Demon")) { inc_piety(GOD_ALL, -10); diff --git a/src/files.cc b/src/files.cc index ec569e73..8d489d0c 100644 --- a/src/files.cc +++ b/src/files.cc @@ -900,7 +900,7 @@ static cptr process_pref_file_expr(char **sp, char *fp) /* Race */ else if (streq(b + 1, "RACEMOD")) { - v = rmp_ptr->title; + v = rmp_ptr->title.c_str(); // The string SHOULD be stable enough for this } /* Class */ diff --git a/src/init1.cc b/src/init1.cc index 0654155e..de92ae90 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1241,8 +1241,7 @@ errr init_player_info_txt(FILE *fp) rmp_ptr = &race_mod_info[i]; /* Copy title */ - assert(!rmp_ptr->title); - rmp_ptr->title = my_strdup(s); + rmp_ptr->title = s; /* Initialize */ rmp_ptr->powers[0] = rmp_ptr->powers[1] = rmp_ptr->powers[2] = rmp_ptr->powers[3] = -1; @@ -1270,15 +1269,11 @@ errr init_player_info_txt(FILE *fp) } /* Description */ - if (!rmp_ptr->desc) + if (!rmp_ptr->description.empty()) { - rmp_ptr->desc = my_strdup(s); - } - else - { - /* Append chars to the name */ - strappend(&rmp_ptr->desc, format("\n%s", s)); + rmp_ptr->description += '\n'; } + rmp_ptr->description += s; /* Next... */ continue; @@ -7331,7 +7326,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp) /* Race Mod */ else if (streq(b + 1, "RACEMOD")) { - v = rmp_ptr->title; + v = rmp_ptr->title.c_str(); // The string SHOULD be stable enough for this } /* Class */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 8166ab65..066e6a6e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -221,6 +221,48 @@ static void do_string(char *str, int max, ls_flag_t flag) } } +static void load_std_string(std::string &s) +{ + s.clear(); + while (true) + { + byte u8 = sf_get(); + if (u8) + { + s += u8; + } + else + { + break; + } + } +} + +static void save_std_string(std::string &s) +{ + for (std::size_t i = 0; i < s.length(); i++) + { + assert(s[i] != 0); // Sanity check; we cannot handle NULs in strings + sf_put(s[i]); + } + sf_put(0); // NUL terminator +} + +static void do_std_string(std::string &s, ls_flag_t flag) +{ + switch(flag) + { + case ls_flag_t::LOAD: + { + load_std_string(s); + break; + } + case ls_flag_t::SAVE: + save_std_string(s); + break; + } +} + /* * Load/save flag set */ @@ -291,29 +333,9 @@ static void do_subrace(ls_flag_t flag) { player_race_mod *sr_ptr = &race_mod_info[SUBRACE_SAVE]; int i; - char buf[81]; - buf[80] = '\0'; // Make sure string is always NUL terminated - - if (flag == ls_flag_t::SAVE) - { - strncpy(buf, sr_ptr->title, 80); - } - do_string(buf, 80, flag); - if (flag == ls_flag_t::LOAD) - { - set_subrace_title(sr_ptr, buf); - } - - if (flag == ls_flag_t::SAVE) - { - strncpy(buf, sr_ptr->desc, 80); - } - do_string(buf, 80, flag); - if (flag == ls_flag_t::LOAD) - { - set_subrace_description(sr_ptr, buf); - } + do_std_string(sr_ptr->title, flag); + do_std_string(sr_ptr->description, flag); do_bool(&sr_ptr->place, flag); diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index da3ae0ca..60558d24 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -12,12 +12,13 @@ #include "skills_defs.hpp" #include +#include #include struct player_race_mod { - char *title = nullptr; /* Type of race mod */ - char *desc = nullptr; /* Desc */ + std::string title; + std::string description; bool_ place = FALSE; /* TRUE = race race modifier, FALSE = Race modifier race */ diff --git a/src/xtra2.cc b/src/xtra2.cc index 580d55a9..03c04587 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5359,44 +5359,18 @@ void switch_subrace(int racem, bool_ copy_old) /* If we switch to the saved subrace, we copy over the old subrace data */ if (copy_old && (racem == SUBRACE_SAVE)) { - // Keep references to owned pointers. - auto old_title = race_mod_info[SUBRACE_SAVE].title; - auto old_desc = race_mod_info[SUBRACE_SAVE].desc; + // Keep old description + auto old_desc = race_mod_info[SUBRACE_SAVE].description; // Copy everything race_mod_info[SUBRACE_SAVE] = race_mod_info[p_ptr->pracem]; - // "Undo" copy of title and description (since they're *owned* pointers) - race_mod_info[SUBRACE_SAVE].title = old_title; - race_mod_info[SUBRACE_SAVE].desc = old_desc; - // Replace subrace title with the title currently held by player. - set_subrace_title(&race_mod_info[SUBRACE_SAVE], race_mod_info[p_ptr->pracem].title); + // Reinstate description + race_mod_info[SUBRACE_SAVE].description = old_desc; } p_ptr->pracem = racem; rmp_ptr = &race_mod_info[p_ptr->pracem]; } -void set_subrace_title(player_race_mod *rmp_ptr, cptr name) -{ - // Free old title. - free(rmp_ptr->title); - // Allocate copy of new title. - rmp_ptr->title = strdup(name); - if (!rmp_ptr->title) { - abort(); - } -} - -void set_subrace_description(player_race_mod *rmp_ptr, cptr desc) -{ - // Free old description - free(rmp_ptr->desc); - // Allocate copy of new description. - rmp_ptr->desc = strdup(desc); - if (!rmp_ptr->desc) { - abort(); - } -} - /* * Rebirth, recalc hp & exp/level */ diff --git a/src/xtra2.hpp b/src/xtra2.hpp index 10d752a2..5d9d26f5 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -8,8 +8,6 @@ #include extern void do_rebirth(void); -extern void set_subrace_title(player_race_mod *rmp_ptr, cptr name); -extern void set_subrace_description(player_race_mod *rmp_ptr, cptr desc); extern void switch_subrace(int racem, bool_ copy_old); extern void drop_from_wild(void); extern bool_ set_roots(int v, s16b ac, s16b dam); -- cgit v1.2.3 From 2ec260320655504b88f8042d4b24e3e7910846a7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Split out spellbinder fields from player_type --- src/loadsave.cc | 6 +++--- src/player_type.hpp | 5 ++--- src/spellbinder.hpp | 25 +++++++++++++++++++++++++ src/spells1.cc | 50 ++++++++++++++++++++++++++++---------------------- src/spells3.cc | 28 +++++++++++++++------------- 5 files changed, 73 insertions(+), 41 deletions(-) create mode 100644 src/spellbinder.hpp diff --git a/src/loadsave.cc b/src/loadsave.cc index 066e6a6e..ea9828d9 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -568,11 +568,11 @@ static bool_ do_extra(ls_flag_t flag) /* Save/load spellbinder */ - do_byte(&p_ptr->spellbinder_num, flag); - do_byte(&p_ptr->spellbinder_trigger, flag); + do_byte(&p_ptr->spellbinder.num, flag); + do_byte(&p_ptr->spellbinder.trigger, flag); for (std::size_t i = 0; i < 4; i++) { - do_u32b(&p_ptr->spellbinder[i], flag); + do_u32b(&p_ptr->spellbinder.spells[i], flag); } // Quests diff --git a/src/player_type.hpp b/src/player_type.hpp index 0e89605c..fdaab57a 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -6,6 +6,7 @@ #include "inventory.hpp" #include "object_type.hpp" #include "powers.hpp" +#include "spellbinder.hpp" #include @@ -338,9 +339,7 @@ struct player_type u32b maintain_sum = 0; /* Do we have partial summons */ - byte spellbinder_num = 0; /* Number of spells bound */ - u32b spellbinder[4] = { 0 }; /* Spell bounds */ - byte spellbinder_trigger = 0; /* Spellbinder trigger condition */ + struct spellbinder spellbinder; cptr mimic_name = nullptr; diff --git a/src/spellbinder.hpp b/src/spellbinder.hpp new file mode 100644 index 00000000..1f5cdd99 --- /dev/null +++ b/src/spellbinder.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "h-basic.h" + +/** + * Spellbinder state + */ +struct spellbinder { + + /** + * Number of bound spells. + */ + byte num = 0; + + /** + * Bound spells. + */ + u32b spells[4] = { 0 }; + + /** + * Trigger condition. + */ + byte trigger = 0; + +}; diff --git a/src/spells1.cc b/src/spells1.cc index 58cf1fd7..9ebec08e 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1203,16 +1203,17 @@ static u16b bolt_pict(int y, int x, int ny, int nx, int typ) */ void spellbinder_trigger() { - int i; + auto spellbinder = &p_ptr->spellbinder; cmsg_print(TERM_L_GREEN, "The spellbinder is triggered!"); - for (i = 0; i < p_ptr->spellbinder_num; i++) + for (int i = 0; i < spellbinder->num; i++) { - msg_format("Triggering spell %s.", spell_type_name(spell_at(p_ptr->spellbinder[i]))); - lua_cast_school_spell(p_ptr->spellbinder[i], TRUE); + msg_format("Triggering spell %s.", spell_type_name(spell_at(spellbinder->spells[i]))); + lua_cast_school_spell(spellbinder->spells[i], TRUE); } - p_ptr->spellbinder_num = 0; - p_ptr->spellbinder_trigger = 0; + + spellbinder->num = 0; + spellbinder->trigger = 0; } @@ -1403,23 +1404,28 @@ void take_hit(int damage, cptr hit_from) percent = p_ptr->chp * 100 / p_ptr->mhp; /* Check the spellbinder trigger */ - if (p_ptr->spellbinder_trigger == SPELLBINDER_HP75) - { - /* Trigger ?! */ - if (percent <= 75) - spellbinder_trigger(); - } - else if (p_ptr->spellbinder_trigger == SPELLBINDER_HP50) + switch (p_ptr->spellbinder.trigger) { - /* Trigger ?! */ - if (percent <= 50) - spellbinder_trigger(); - } - else if (p_ptr->spellbinder_trigger == SPELLBINDER_HP25) - { - /* Trigger ?! */ - if (percent <= 25) - spellbinder_trigger(); + case SPELLBINDER_HP75: + if (percent <= 75) + { + spellbinder_trigger(); + } + break; + + case SPELLBINDER_HP50: + if (percent <= 50) + { + spellbinder_trigger(); + } + break; + + case SPELLBINDER_HP25: + if (percent <= 25) + { + spellbinder_trigger(); + } + break; } /* Melkor acn summon to help you */ diff --git a/src/spells3.cc b/src/spells3.cc index fad11049..69267c7d 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -2324,7 +2324,9 @@ static int get_spellbinder_max() casting_result meta_spellbinder() { - if (p_ptr->spellbinder_num != 0) + auto spellbinder = &p_ptr->spellbinder; + + if (spellbinder->num != 0) { struct trigger { int idx; @@ -2339,11 +2341,11 @@ casting_result meta_spellbinder() int trigger_idx = -1; int i; - assert(p_ptr->spellbinder_trigger >= 0); + assert(spellbinder->trigger >= 0); for (trigger_idx = 0; triggers[trigger_idx].idx >= 0; trigger_idx++) { - if (triggers[trigger_idx].idx == p_ptr->spellbinder_trigger) + if (triggers[trigger_idx].idx == spellbinder->trigger) { break; } @@ -2352,9 +2354,9 @@ casting_result meta_spellbinder() msg_print("The spellbinder is already active."); msg_format("It will trigger at %s.", triggers[trigger_idx].desc); msg_print("With the spells: "); - for (i = 0; i < p_ptr->spellbinder_num; i++) + for (i = 0; i < spellbinder->num; i++) { - msg_print(spell_type_name(spell_at(p_ptr->spellbinder[i]))); + msg_print(spell_type_name(spell_at(spellbinder->spells[i]))); } /* Doesn't cost anything */ @@ -2373,28 +2375,28 @@ casting_result meta_spellbinder() switch (c) { case 'a': - p_ptr->spellbinder_trigger = SPELLBINDER_HP75; + spellbinder->trigger = SPELLBINDER_HP75; break; case 'b': - p_ptr->spellbinder_trigger = SPELLBINDER_HP50; + spellbinder->trigger = SPELLBINDER_HP50; break; case 'c': - p_ptr->spellbinder_trigger = SPELLBINDER_HP25; + spellbinder->trigger = SPELLBINDER_HP25; break; default: return NO_CAST; } - p_ptr->spellbinder_num = get_spellbinder_max(); - i = p_ptr->spellbinder_num; + spellbinder->num = get_spellbinder_max(); + i = spellbinder->num; while (i > 0) { s32b s = get_school_spell("bind", 0); if (s == -1) { - p_ptr->spellbinder_trigger = 0; - p_ptr->spellbinder_num = 0; + spellbinder->trigger = 0; + spellbinder->num = 0; return CAST_OBVIOUS; } else { if (spell_type_skill_level(spell_at(s)) > 7 + get_level_s(SPELLBINDER, 35)) @@ -2404,7 +2406,7 @@ casting_result meta_spellbinder() } } - p_ptr->spellbinder[i] = s; + spellbinder->spells[i] = s; i = i - 1; } -- cgit v1.2.3 From cbcc1ba9ddafd8c2480e1c647d4b7b5f630bb63e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor spellbinder to use std::vector<> --- src/loadsave.cc | 31 +++++++++++++++++++++++-------- src/spellbinder.hpp | 8 ++------ src/spells1.cc | 9 +++++---- src/spells3.cc | 24 ++++++++++++------------ 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index ea9828d9..292c80b6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -263,11 +263,11 @@ static void do_std_string(std::string &s, ls_flag_t flag) } } -/* - * Load/save flag set - */ namespace { +/** + * Load/save flag set + */ template void do_flag_set(flag_set *flags, ls_flag_t flag) { for (std::size_t i = 0; i < flags->size(); i++) @@ -276,6 +276,25 @@ template void do_flag_set(flag_set *flags, ls_flag_t f } } +template void do_vector(ls_flag_t flag, std::vector &v, F f) +{ + u32b n = v.size(); + + do_u32b(&n, flag); + + if (flag == ls_flag_t::LOAD) + { + v.clear(); // Make sure it's empty + v.reserve(n); + std::fill_n(std::back_inserter(v), n, T()); + } + + for (std::size_t i = 0; i < n; i++) + { + f(&v[i], flag); + } +} + } // namespace (anonymous) @@ -568,12 +587,8 @@ static bool_ do_extra(ls_flag_t flag) /* Save/load spellbinder */ - do_byte(&p_ptr->spellbinder.num, flag); do_byte(&p_ptr->spellbinder.trigger, flag); - for (std::size_t i = 0; i < 4; i++) - { - do_u32b(&p_ptr->spellbinder.spells[i], flag); - } + do_vector(flag, p_ptr->spellbinder.spell_idxs, do_u32b); // Quests { diff --git a/src/spellbinder.hpp b/src/spellbinder.hpp index 1f5cdd99..078d9eac 100644 --- a/src/spellbinder.hpp +++ b/src/spellbinder.hpp @@ -1,21 +1,17 @@ #pragma once #include "h-basic.h" +#include /** * Spellbinder state */ struct spellbinder { - /** - * Number of bound spells. - */ - byte num = 0; - /** * Bound spells. */ - u32b spells[4] = { 0 }; + std::vector spell_idxs; /** * Trigger condition. diff --git a/src/spells1.cc b/src/spells1.cc index 9ebec08e..93602d13 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1206,13 +1206,14 @@ void spellbinder_trigger() auto spellbinder = &p_ptr->spellbinder; cmsg_print(TERM_L_GREEN, "The spellbinder is triggered!"); - for (int i = 0; i < spellbinder->num; i++) + + for (auto spell_idx: spellbinder->spell_idxs) { - msg_format("Triggering spell %s.", spell_type_name(spell_at(spellbinder->spells[i]))); - lua_cast_school_spell(spellbinder->spells[i], TRUE); + msg_format("Triggering spell %s.", spell_type_name(spell_at(spell_idx))); + lua_cast_school_spell(spell_idx, TRUE); } - spellbinder->num = 0; + spellbinder->spell_idxs.clear(); spellbinder->trigger = 0; } diff --git a/src/spells3.cc b/src/spells3.cc index 69267c7d..68b3a2f0 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -2326,7 +2326,7 @@ casting_result meta_spellbinder() { auto spellbinder = &p_ptr->spellbinder; - if (spellbinder->num != 0) + if (spellbinder->spell_idxs.size() > 0) { struct trigger { int idx; @@ -2339,7 +2339,6 @@ casting_result meta_spellbinder() { -1, NULL, }, }; int trigger_idx = -1; - int i; assert(spellbinder->trigger >= 0); @@ -2354,9 +2353,9 @@ casting_result meta_spellbinder() msg_print("The spellbinder is already active."); msg_format("It will trigger at %s.", triggers[trigger_idx].desc); msg_print("With the spells: "); - for (i = 0; i < spellbinder->num; i++) + for (auto spell_idx : spellbinder->spell_idxs) { - msg_print(spell_type_name(spell_at(spellbinder->spells[i]))); + msg_print(spell_type_name(spell_at(spell_idx))); } /* Doesn't cost anything */ @@ -2365,7 +2364,6 @@ casting_result meta_spellbinder() else { char c; - int i; if (!get_com("Trigger at [a]75% hp [b]50% hp [c]25% hp?", &c)) { @@ -2388,17 +2386,19 @@ casting_result meta_spellbinder() } - spellbinder->num = get_spellbinder_max(); - i = spellbinder->num; - while (i > 0) + std::size_t n = get_spellbinder_max(); + while (n > 0) { s32b s = get_school_spell("bind", 0); + if (s == -1) { spellbinder->trigger = 0; - spellbinder->num = 0; + spellbinder->spell_idxs.clear(); return CAST_OBVIOUS; - } else { + } + else + { if (spell_type_skill_level(spell_at(s)) > 7 + get_level_s(SPELLBINDER, 35)) { msg_format("You are only allowed spells with a base level of " FMTs32b ".", (7 + get_level_s(SPELLBINDER, 35))); @@ -2406,8 +2406,8 @@ casting_result meta_spellbinder() } } - spellbinder->spells[i] = s; - i = i - 1; + spellbinder->spell_idxs.push_back(s); + n--; } p_ptr->energy = p_ptr->energy - 3100; -- cgit v1.2.3 From b06b5ca24b7a48bfa0fba6ba0032262e4e52b569 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove effectively unused player_type::oppose_* fields --- src/dungeon.cc | 18 ------------------ src/loadsave.cc | 3 --- src/player_type.hpp | 3 --- src/xtra1.cc | 20 -------------------- src/xtra2.cc | 33 --------------------------------- src/xtra2.hpp | 3 --- 6 files changed, 80 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index 824831cf..631a23e8 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -2213,30 +2213,12 @@ static void process_world(void) (void)set_oppose_pois(p_ptr->oppose_pois - 1); } - /* Oppose Light & Dark */ - if (p_ptr->oppose_ld) - { - (void)set_oppose_ld(p_ptr->oppose_ld - 1); - } - /* Oppose Chaos & Confusion */ if (p_ptr->oppose_cc) { (void)set_oppose_cc(p_ptr->oppose_cc - 1); } - /* Oppose Sound & Shards */ - if (p_ptr->oppose_ss) - { - (void)set_oppose_ss(p_ptr->oppose_ss - 1); - } - - /* Oppose Nexus */ - if (p_ptr->oppose_nex) - { - (void)set_oppose_nex(p_ptr->oppose_nex - 1); - } - /* Timed mimicry */ if (get_skill(SKILL_MIMICRY)) { diff --git a/src/loadsave.cc b/src/loadsave.cc index 292c80b6..f6a67093 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -742,10 +742,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->oppose_acid, flag); do_s16b(&p_ptr->oppose_elec, flag); do_s16b(&p_ptr->oppose_pois, flag); - do_s16b(&p_ptr->oppose_ld, flag); do_s16b(&p_ptr->oppose_cc, flag); - do_s16b(&p_ptr->oppose_ss, flag); - do_s16b(&p_ptr->oppose_nex, flag); do_s16b(&p_ptr->tim_esp, flag); do_s16b(&p_ptr->tim_wraith, flag); diff --git a/src/player_type.hpp b/src/player_type.hpp index fdaab57a..684a086e 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -128,10 +128,7 @@ struct player_type s16b oppose_fire = 0; /* Timed -- oppose heat */ s16b oppose_cold = 0; /* Timed -- oppose cold */ s16b oppose_pois = 0; /* Timed -- oppose poison */ - s16b oppose_ld = 0; /* Timed -- oppose light & dark */ s16b oppose_cc = 0; /* Timed -- oppose chaos & confusion */ - s16b oppose_ss = 0; /* Timed -- oppose sound & shards */ - s16b oppose_nex = 0; /* Timed -- oppose nexus */ s16b tim_esp = 0; /* Timed ESP */ s16b tim_wraith = 0; /* Timed wraithform */ diff --git a/src/xtra1.cc b/src/xtra1.cc index ae37bd90..c7fd9213 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -3409,13 +3409,6 @@ void calc_bonuses(bool_ silent) p_ptr->fly = TRUE; } - /* Oppose Light & Dark */ - if (p_ptr->oppose_ld) - { - p_ptr->resist_lite = TRUE; - p_ptr->resist_dark = TRUE; - } - /* Oppose Chaos & Confusion */ if (p_ptr->oppose_cc) { @@ -3423,19 +3416,6 @@ void calc_bonuses(bool_ silent) p_ptr->resist_conf = TRUE; } - /* Oppose Sound & Shards */ - if (p_ptr->oppose_ss) - { - p_ptr->resist_sound = TRUE; - p_ptr->resist_shard = TRUE; - } - - /* Oppose Nexus */ - if (p_ptr->oppose_nex) - { - p_ptr->resist_nexus = TRUE; - } - /* Temporary "fast" */ if (p_ptr->fast) { diff --git a/src/xtra2.cc b/src/xtra2.cc index 03c04587..b00a6802 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -402,17 +402,6 @@ bool_ set_strike(int v) TERM_WHITE, "You are no longer very accurate."); } -/* - * Set "p_ptr->oppose_ld" - */ -bool_ set_oppose_ld(int v) -{ - return set_simple_field( - &p_ptr->oppose_ld, v, - TERM_WHITE, "You feel protected against light's fluctuation.", - TERM_WHITE, "You are no longer protected against light's fluctuation."); -} - /* * Set "p_ptr->oppose_cc" */ @@ -424,28 +413,6 @@ bool_ set_oppose_cc(int v) TERM_WHITE, "You are no longer protected against chaos."); } -/* - * Set "p_ptr->oppose_ss" - */ -bool_ set_oppose_ss(int v) -{ - return set_simple_field( - &p_ptr->oppose_ss, v, - TERM_WHITE, "You feel protected against the ravages of sound and shards.", - TERM_WHITE, "You are no longer protected against the ravages of sound and shards."); -} - -/* - * Set "p_ptr->oppose_nex" - */ -bool_ set_oppose_nex(int v) -{ - return set_simple_field( - &p_ptr->oppose_nex, v, - TERM_WHITE, "You feel protected against the strange forces of nexus.", - TERM_WHITE, "You are no longer protected against the strange forces of nexus."); -} - /* * Set "p_ptr->tim_mimic", and "p_ptr->mimic_form", * notice observable changes diff --git a/src/xtra2.hpp b/src/xtra2.hpp index 5d9d26f5..5ab6860c 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -58,10 +58,7 @@ extern bool_ set_oppose_elec(int v); extern bool_ set_oppose_fire(int v); extern bool_ set_oppose_cold(int v); extern bool_ set_oppose_pois(int v); -extern bool_ set_oppose_ld(int v); extern bool_ set_oppose_cc(int v); -extern bool_ set_oppose_ss(int v); -extern bool_ set_oppose_nex(int v); extern bool_ set_stun(int v); extern bool_ set_cut(int v); extern bool_ set_food(int v); -- cgit v1.2.3 From 8ef7443e887958060d7a77b3750f495b592eb7b3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused player_type::special field --- src/birth.cc | 3 +-- src/loadsave.cc | 1 - src/player_type.hpp | 1 - src/variable.cc | 3 --- src/variable.hpp | 1 - 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 27b7ee89..948d1c37 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2139,9 +2139,8 @@ static bool_ player_birth_aux_ask() } } - /* Set birth options: maximize, preserve, sepcial levels and astral */ + /* Set birth options: preserve, astral */ p_ptr->preserve = preserve; - p_ptr->special = special_lvls; p_ptr->astral = (race_flags_p(PR_ASTRAL)) ? TRUE : FALSE; /* diff --git a/src/loadsave.cc b/src/loadsave.cc index f6a67093..20182298 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -793,7 +793,6 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); do_byte(&p_ptr->preserve, flag); - do_byte(&p_ptr->special, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); diff --git a/src/player_type.hpp b/src/player_type.hpp index 684a086e..11eac14d 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -48,7 +48,6 @@ struct player_type u16b expfact = 0; /* Experience factor */ byte preserve = 0; /* Preserve artifacts */ - byte special = 0; /* Special levels */ byte allow_one_death = 0; /* Blood of life */ s32b au = 0; /* Current Gold */ diff --git a/src/variable.cc b/src/variable.cc index 4ac48b50..c40ac8ba 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -881,9 +881,6 @@ s16b doppleganger; /* To allow wilderness encounters */ bool_ generate_encounter; -/* Special levels */ -bool_ special_lvls; - /* * Such an ugly hack ... */ diff --git a/src/variable.hpp b/src/variable.hpp index 3cfc7c8c..459abef1 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -269,7 +269,6 @@ extern byte dungeon_type; extern s16b *max_dlv; extern s16b doppleganger; extern bool_ generate_encounter; -extern bool_ special_lvls; extern bool_ *m_allow_special; extern bool_ *k_allow_special; extern bool_ *a_allow_special; -- cgit v1.2.3 From 7bf0a5a464c417cbe6d746a0deabd9538d66d4b1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove player_type::preserve field It redundantly duplicates the value of the 'preserve' option, and since the options are saved along with the character we don't actually need it. --- src/birth.cc | 3 +-- src/files.cc | 4 ++-- src/generate.cc | 2 +- src/loadsave.cc | 1 - src/monster2.cc | 2 +- src/object2.cc | 2 +- src/player_type.hpp | 1 - 7 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 948d1c37..e581d8f0 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2139,8 +2139,7 @@ static bool_ player_birth_aux_ask() } } - /* Set birth options: preserve, astral */ - p_ptr->preserve = preserve; + /* Is the player an "astral" being? */ p_ptr->astral = (race_flags_p(PR_ASTRAL)) ? TRUE : FALSE; /* diff --git a/src/files.cc b/src/files.cc index 8d489d0c..1f0d72d9 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2662,7 +2662,7 @@ errr file_character(cptr name, bool_ full) else fprintf(fff, "\n Joke monsters: OFF"); - if (p_ptr->preserve) + if (preserve) fprintf(fff, "\n Preserve Mode: ON"); else fprintf(fff, "\n Preserve Mode: OFF"); @@ -4017,7 +4017,7 @@ static long total_points(void) if (!comp_death) comp_death = 1; - if (p_ptr->preserve) mult -= 1; /* Penalize preserve, maximize modes */ + if (preserve) mult -= 1; /* Penalize preserve, maximize modes */ mult -= 1; /* maximize pentalty, always on */ if (auto_scum) mult -= 4; if (small_levels) mult += ((always_small_level) ? 4 : 10); diff --git a/src/generate.cc b/src/generate.cc index 3f74bc24..8c02c58a 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -8508,7 +8508,7 @@ void generate_cave(void) else feeling = 10; /* Hack -- Have a special feeling sometimes */ - if (good_item_flag && !p_ptr->preserve) feeling = 1; + if (good_item_flag && !preserve) feeling = 1; /* It takes 1000 game turns for "feelings" to recharge */ if ((turn - old_turn) < 1000) feeling = 0; diff --git a/src/loadsave.cc b/src/loadsave.cc index 20182298..d6ca168a 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -792,7 +792,6 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->black_breath, flag); do_bool(&fate_flag, flag); do_byte(&p_ptr->searching, flag); - do_byte(&p_ptr->preserve, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); diff --git a/src/monster2.cc b/src/monster2.cc index 74380a25..4051a872 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -476,7 +476,7 @@ void delete_monster_idx(int i) /* Hack -- efficiency */ o_ptr->held_m_idx = 0; - if ( p_ptr->preserve ) + if (preserve) { /* Hack -- Preserve unknown artifacts */ if (artifact_p(o_ptr) && !object_known_p(o_ptr)) diff --git a/src/object2.cc b/src/object2.cc index ee001427..6185cc27 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -387,7 +387,7 @@ void wipe_o_list(void) if (!o_ptr->k_idx) continue; /* Mega-Hack -- preserve artifacts */ - if (!character_dungeon || p_ptr->preserve) + if (!character_dungeon || preserve) { /* Hack -- Preserve unknown artifacts */ if (artifact_p(o_ptr) && !object_known_p(o_ptr)) diff --git a/src/player_type.hpp b/src/player_type.hpp index 11eac14d..3130d859 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -47,7 +47,6 @@ struct player_type byte hitdie = 0; /* Hit dice (sides) */ u16b expfact = 0; /* Experience factor */ - byte preserve = 0; /* Preserve artifacts */ byte allow_one_death = 0; /* Blood of life */ s32b au = 0; /* Current Gold */ -- cgit v1.2.3 From c3c9b09d73391ed2d0a0864dc326fc6840da0e2e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove inactive player_type::prot{good,undead} --- src/dungeon.cc | 12 ------------ src/loadsave.cc | 2 -- src/melee1.cc | 28 +--------------------------- src/player_type.hpp | 2 -- src/spells2.cc | 9 --------- src/xtra2.cc | 39 --------------------------------------- src/xtra2.hpp | 2 -- 7 files changed, 1 insertion(+), 93 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index 631a23e8..138d8c66 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -2135,18 +2135,6 @@ static void process_world(void) (void)set_protevil(p_ptr->protevil - 1); } - /* Protection from good */ - if (p_ptr->protgood) - { - (void)set_protgood(p_ptr->protgood - 1); - } - - /* Protection from undead */ - if (p_ptr->protundead) - { - (void)set_protundead(p_ptr->protundead - 1); - } - /* Invulnerability */ if (p_ptr->invuln) { diff --git a/src/loadsave.cc b/src/loadsave.cc index d6ca168a..8982d1cc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -703,7 +703,6 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->poisoned, flag); do_s16b(&p_ptr->image, flag); do_s16b(&p_ptr->protevil, flag); - do_s16b(&p_ptr->protundead, flag); do_s16b(&p_ptr->invuln, flag); do_s16b(&p_ptr->hero, flag); do_s16b(&p_ptr->shero, flag); @@ -796,7 +795,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->allow_one_death, flag); do_s16b(&no_breeds, flag); - do_s16b(&p_ptr->protgood, flag); /* Auxilliary variables */ do_u32b(&p_ptr->mimic_extra, flag); diff --git a/src/melee1.cc b/src/melee1.cc index 09de2cd9..7fdaca55 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -292,19 +292,6 @@ bool_ carried_make_attack_normal(int r_idx) continue; } - /* Hack -- Apply "protection from good" */ - if ((p_ptr->protgood > 0) && - (r_ptr->flags & RF_GOOD) && - (p_ptr->lev >= rlev) && - ((rand_int(100) + p_ptr->lev) > 50)) - { - /* Message */ - msg_format("%s is repelled.", sym_name); - - /* Hack -- Next attack */ - continue; - } - /* Assume no cut or stun */ do_cut = do_stun = 0; @@ -1194,7 +1181,7 @@ bool_ carried_make_attack_normal(int r_idx) */ void black_breath_attack(int chance) { - if (!p_ptr->protundead && randint(chance) == 1) + if (randint(chance) == 1) { msg_print("Your foe calls upon your soul!"); msg_print("You feel the Black Breath slowly draining you of life..."); @@ -1439,19 +1426,6 @@ bool_ make_attack_normal(int m_idx, byte divis) continue; } - /* Hack -- Apply "protection from good" */ - if ((p_ptr->protgood > 0) && - (r_ptr->flags & RF_GOOD) && - (p_ptr->lev >= rlev) && - ((rand_int(100) + p_ptr->lev) > 50)) - { - /* Message */ - msg_format("%^s is repelled.", m_name); - - /* Hack -- Next attack */ - continue; - } - /* Assume no cut or stun */ do_cut = do_stun = 0; diff --git a/src/player_type.hpp b/src/player_type.hpp index 3130d859..1285e018 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -107,8 +107,6 @@ struct player_type s16b stun = 0; /* Timed -- Stun */ s16b protevil = 0; /* Timed -- Protection from Evil*/ - s16b protgood = 0; /* Timed -- Protection from Good*/ - s16b protundead = 0; /* Timed -- Protection from Undead*/ s16b invuln = 0; /* Timed -- Invulnerable */ s16b hero = 0; /* Timed -- Heroism */ s16b shero = 0; /* Timed -- Super Heroism */ diff --git a/src/spells2.cc b/src/spells2.cc index da7f9ffc..45fd18eb 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -1257,10 +1257,6 @@ void self_knowledge(FILE *fff) { info[i++] = "You are protected from evil."; } - if (p_ptr->protgood) - { - info[i++] = "You are protected from good."; - } if (p_ptr->shield) { info[i++] = "You are protected by a mystic shield."; @@ -1884,11 +1880,6 @@ void report_magics(void) info2[i] = report_magics_aux(p_ptr->protevil); info[i++] = "You are protected from evil"; } - if (p_ptr->protgood) - { - info2[i] = report_magics_aux(p_ptr->protgood); - info[i++] = "You are protected from good"; - } if (p_ptr->shield) { info2[i] = report_magics_aux(p_ptr->shield); diff --git a/src/xtra2.cc b/src/xtra2.cc index b00a6802..8b444058 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -934,45 +934,6 @@ bool_ set_protevil(int v) return notice; } -/* - * Set "p_ptr->protgood", notice observable changes - */ -bool_ set_protgood(int v) -{ - bool_ notice = set_simple_field( - &p_ptr->protgood, v, - TERM_WHITE, "You feel safe from good!", - TERM_WHITE, "You no longer feel safe from good."); - - if (notice) - { - /* Handle stuff */ - handle_stuff(); - } - - /* Result */ - return notice; -} - -/* - * Set "p_ptr->protundead", notice observable changes - */ -bool_ set_protundead(int v) -{ - bool_ notice = set_simple_field( - &p_ptr->protundead, v, - TERM_WHITE, "You feel safe from undead!", - TERM_WHITE, "You no longer feel safe from undead."); - - if (notice) { - /* Handle stuff */ - handle_stuff(); - } - - /* Result */ - return notice; -} - /* * Set "p_ptr->set_shadow", notice observable changes */ diff --git a/src/xtra2.hpp b/src/xtra2.hpp index 5ab6860c..a5e07cd3 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -47,8 +47,6 @@ extern bool_ set_blessed(int v); extern bool_ set_hero(int v); extern bool_ set_shero(int v); extern bool_ set_protevil(int v); -extern bool_ set_protgood(int v); -extern bool_ set_protundead(int v); extern bool_ set_invuln(int v); extern bool_ set_tim_invis(int v); extern bool_ set_tim_infra(int v); -- cgit v1.2.3 From 6c62afae8ef0bb96866afd221d0fb7cbc2c7a9af Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused version_* variables --- src/modules.cc | 3 --- src/variable.cc | 7 ------- src/variable.hpp | 3 --- 3 files changed, 13 deletions(-) diff --git a/src/modules.cc b/src/modules.cc index 888de4aa..3480e805 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -204,9 +204,6 @@ static void activate_module(int module_idx) VERSION_MAJOR = module_ptr->meta.version.major; VERSION_MINOR = module_ptr->meta.version.minor; VERSION_PATCH = module_ptr->meta.version.patch; - version_major = VERSION_MAJOR; - version_minor = VERSION_MINOR; - version_patch = VERSION_PATCH; /* Change window name if needed */ if (strcmp(game_module, "ToME")) diff --git a/src/variable.cc b/src/variable.cc index c40ac8ba..25e01c12 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -24,13 +24,6 @@ char *macro_modifier_name[MAX_MACRO_MOD]; char *macro_trigger_name[MAX_MACRO_TRIG]; char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; -/* - * Executable version - */ -byte version_major; -byte version_minor; -byte version_patch; - /* * Savefile version */ diff --git a/src/variable.hpp b/src/variable.hpp index 459abef1..7bdfb99e 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -54,9 +54,6 @@ extern char *macro_modifier_chr; extern char *macro_modifier_name[MAX_MACRO_MOD]; extern char *macro_trigger_name[MAX_MACRO_TRIG]; extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; -extern byte version_major; -extern byte version_minor; -extern byte version_patch; extern byte sf_major; extern byte sf_minor; extern byte sf_patch; -- cgit v1.2.3 From e1273e8666e5c03c36b55a4fec80f6f76270ee10 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move sf_* variables from global variable.cc to loadsave.cc --- src/loadsave.cc | 14 ++++++++++++++ src/variable.cc | 14 -------------- src/variable.hpp | 6 ------ 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 8982d1cc..1c1bb161 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -45,6 +45,20 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ +/* + * Savefile version + */ +static byte sf_major; +static byte sf_minor; +static byte sf_patch; + +/* + * Savefile information + */ +static u32b sf_when; /* Time when savefile created */ +static u16b sf_lives; /* Number of past "lives" with this file */ +static u16b sf_saves; /* Number of "saves" during this life */ + /** * Load/save flag */ diff --git a/src/variable.cc b/src/variable.cc index 25e01c12..a0e075b3 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -24,20 +24,6 @@ char *macro_modifier_name[MAX_MACRO_MOD]; char *macro_trigger_name[MAX_MACRO_TRIG]; char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; -/* - * Savefile version - */ -byte sf_major; /* Savefile's "version_major" */ -byte sf_minor; /* Savefile's "version_minor" */ -byte sf_patch; /* Savefile's "version_patch" */ - -/* - * Savefile information - */ -u32b sf_when; /* Time when savefile created */ -u16b sf_lives; /* Number of past "lives" with this file */ -u16b sf_saves; /* Number of "saves" during this life */ - /* * Run-time aruments */ diff --git a/src/variable.hpp b/src/variable.hpp index 7bdfb99e..6b1b53ef 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -54,12 +54,6 @@ extern char *macro_modifier_chr; extern char *macro_modifier_name[MAX_MACRO_MOD]; extern char *macro_trigger_name[MAX_MACRO_TRIG]; extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; -extern byte sf_major; -extern byte sf_minor; -extern byte sf_patch; -extern u32b sf_when; -extern u16b sf_lives; -extern u16b sf_saves; extern bool_ character_dungeon; extern bool_ character_loaded; extern bool_ character_xtra; -- cgit v1.2.3 From 902611ac55dbd2c967f244b27c54d37540964c47 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move non-boolean options to options.cc too --- src/cmd4.cc | 1 + src/loadsave.cc | 1 + src/options.cc | 18 ++++++++++++++++++ src/options.hpp | 17 +++++++++++++++++ src/variable.cc | 27 --------------------------- src/variable.hpp | 10 ---------- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index b8a92ddd..0d15e0b8 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -27,6 +27,7 @@ #include "object2.hpp" #include "object_flag.hpp" #include "object_kind.hpp" +#include "options.hpp" #include "player_type.hpp" #include "skills.hpp" #include "squeltch.hpp" diff --git a/src/loadsave.cc b/src/loadsave.cc index 1c1bb161..aa2ca5a6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -18,6 +18,7 @@ #include "object1.hpp" #include "object2.hpp" #include "object_kind.hpp" +#include "options.hpp" #include "player_class.hpp" #include "player_level_flag.hpp" #include "player_race.hpp" diff --git a/src/options.cc b/src/options.cc index e4acaab4..1b0baccf 100644 --- a/src/options.cc +++ b/src/options.cc @@ -82,3 +82,21 @@ bool_ joke_monsters; bool_ point_based; bool_ preserve; bool_ no_selling; + +// +// Other options +// + +bool_ cheat_peek; /* Peek into object creation */ +bool_ cheat_hear; /* Peek into monster creation */ +bool_ cheat_room; /* Peek into dungeon creation */ +bool_ cheat_xtra; /* Peek into something else */ +bool_ cheat_live; /* Allow player to avoid death */ + +byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ + +byte delay_factor; /* Delay factor (0 to 9) */ + +s16b autosave_freq; /* Autosave frequency */ +bool_ autosave_t; /* Timed autosave */ +bool_ autosave_l; /* Autosave before entering new levels */ diff --git a/src/options.hpp b/src/options.hpp index 80e5cca7..940f9a6c 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -84,3 +84,20 @@ extern bool_ joke_monsters; extern bool_ point_based; extern bool_ preserve; extern bool_ no_selling; + +// +// Other options +// +extern bool_ cheat_peek; +extern bool_ cheat_hear; +extern bool_ cheat_room; +extern bool_ cheat_xtra; +extern bool_ cheat_live; + +extern byte hitpoint_warn; + +extern byte delay_factor; + +extern s16b autosave_freq; +extern bool_ autosave_t; +extern bool_ autosave_l; diff --git a/src/variable.cc b/src/variable.cc index a0e075b3..fd8ccd40 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -142,33 +142,6 @@ void (*text_out_hook)(byte a, cptr str) = text_out_to_screen; int text_out_indent = 0; -/* - * Software options (set via the '=' command). See "tables.c" - */ - - - - -/* Cheating options */ - -bool_ cheat_peek; /* Peek into object creation */ -bool_ cheat_hear; /* Peek into monster creation */ -bool_ cheat_room; /* Peek into dungeon creation */ -bool_ cheat_xtra; /* Peek into something else */ -bool_ cheat_live; /* Allow player to avoid death */ - - -/* Special options */ - -byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ - -byte delay_factor; /* Delay factor (0 to 9) */ - -bool_ autosave_l; /* Autosave before entering new levels */ -bool_ autosave_t; /* Timed autosave */ -s16b autosave_freq; /* Autosave frequency */ - - /* * Dungeon variables */ diff --git a/src/variable.hpp b/src/variable.hpp index 6b1b53ef..854b88c0 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -109,16 +109,6 @@ extern int artifact_bias; extern FILE *text_out_file; extern void (*text_out_hook)(byte a, cptr str); extern int text_out_indent; -extern bool_ cheat_peek; -extern bool_ cheat_hear; -extern bool_ cheat_room; -extern bool_ cheat_xtra; -extern bool_ cheat_live; -extern byte hitpoint_warn; -extern byte delay_factor; -extern s16b autosave_freq; -extern bool_ autosave_t; -extern bool_ autosave_l; extern s16b feeling; extern s16b rating; extern bool_ good_item_flag; -- cgit v1.2.3 From 6adef091b0713941e1149ecf21a5ab6feee3b06d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Introduce std::string overloads for prt() and c_prt() --- src/util.cc | 14 +++++++++----- src/util.hpp | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/util.cc b/src/util.cc index d9805f47..d899b2f2 100644 --- a/src/util.cc +++ b/src/util.cc @@ -2002,16 +2002,20 @@ void c_prt(byte attr, cptr str, int row, int col) Term_addstr( -1, attr, str); } -/* -* As above, but in "white" -*/ +void c_prt(byte attr, std::string const &s, int row, int col) +{ + c_prt(attr, s.c_str(), row, col); +} + void prt(cptr str, int row, int col) { - /* Spawn */ c_prt(TERM_WHITE, str, row, col); } - +void prt(std::string const &s, int row, int col) +{ + prt(s.c_str(), row, col); +} /* * Print some (colored) text to the screen at the current cursor position, diff --git a/src/util.hpp b/src/util.hpp index c682b2f2..583fd4aa 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -38,6 +38,8 @@ extern void screen_load(void); extern void c_put_str(byte attr, cptr str, int row, int col); extern void put_str(cptr str, int row, int col); extern void c_prt(byte attr, cptr str, int row, int col); +extern void c_prt(byte attr, std::string const &s, int row, int col); +extern void prt(std::string const &s, int row, int col); extern void text_out_to_screen(byte a, cptr str); extern void text_out_to_file(byte a, cptr str); extern void text_out(cptr str); -- cgit v1.2.3 From 6006546b4d015619b7d119d400fac819da6bc826 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Factor out 'flush_failure' option handling --- src/cmd1.cc | 2 +- src/cmd2.cc | 12 ++++++------ src/cmd3.cc | 2 +- src/cmd6.cc | 16 ++++++++-------- src/cmd7.cc | 14 +++++++------- src/powers.cc | 2 +- src/randart.cc | 2 +- src/spells2.cc | 2 +- src/spells4.cc | 5 +---- src/util.cc | 12 ++++++++++++ src/util.hpp | 1 + 11 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index 71096f7f..d0541eb3 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -2699,7 +2699,7 @@ static bool_ easy_open_door(int y, int x) else { /* Failure */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("You failed to pick the lock."); diff --git a/src/cmd2.cc b/src/cmd2.cc index 2a8d33e7..fd31b564 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -819,7 +819,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) /* We may continue repeating */ more = TRUE; - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to pick the lock."); } @@ -1080,7 +1080,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) else { /* Failure */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("You failed to pick the lock."); @@ -1879,7 +1879,7 @@ static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) { /* We may keep trying */ more = TRUE; - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to disarm the chest."); } @@ -1977,7 +1977,7 @@ static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) else if ((i > 5) && (randint(i) > 5)) { /* Failure */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_format("You failed to disarm the %s.", name); @@ -2873,7 +2873,7 @@ void do_cmd_rest(void) if (cave[p_ptr->py][p_ptr->px].feat == FEAT_BETWEEN) { /* 'R&\n' is one of our favourite macros, so we have to do this */ - if (flush_failure) flush(); + flush_on_failure(); /* Tell the player why */ msg_print(format("Resting on a %s is too dangerous!", @@ -2887,7 +2887,7 @@ void do_cmd_rest(void) if (p_ptr->necro_extra & CLASS_UNDEAD) { /* 'R&\n' is one of our favourite macros, so we have to do this */ - if (flush_failure) flush(); + flush_on_failure(); /* Tell the player why */ msg_print("Resting is impossible while undead!"); diff --git a/src/cmd3.cc b/src/cmd3.cc index 9a4e3fc2..dd837906 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -1595,7 +1595,7 @@ bool_ do_cmd_sense_grid_mana() /* Roll for usage */ if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to sense the grid's mana."); return FALSE; } diff --git a/src/cmd6.cc b/src/cmd6.cc index 841c6684..4490b5de 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -3750,7 +3750,7 @@ void do_cmd_use_staff(void) /* Roll for usage */ if (magik(chance)) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to use the staff properly."); return; } @@ -3758,7 +3758,7 @@ void do_cmd_use_staff(void) /* Notice empty staffs */ if (o_ptr->pval <= 0) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("The staff has no charges left."); o_ptr->ident |= (IDENT_EMPTY); return; @@ -3915,7 +3915,7 @@ void do_cmd_aim_wand(void) /* Roll for usage */ if (magik(chance)) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to use the wand properly."); return; } @@ -3923,7 +3923,7 @@ void do_cmd_aim_wand(void) /* The wand is already empty! */ if (o_ptr->pval <= 0) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("The wand has no charges left."); o_ptr->ident |= (IDENT_EMPTY); return; @@ -4200,7 +4200,7 @@ void do_cmd_zap_rod(void) if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) { /* Flush input if necessary */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("You failed to use the rod properly."); @@ -4218,7 +4218,7 @@ void do_cmd_zap_rod(void) if (o_ptr->timeout < cost) { /* Flush input if necessary */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("The rod does not have enough mana yet."); @@ -4668,7 +4668,7 @@ bool_ brand_bolts(void) } /* Flush */ - if (flush_failure) flush(); + flush_on_failure(); /* Fail */ msg_print("The fiery enchantment failed."); @@ -4916,7 +4916,7 @@ void do_cmd_activate(void) /* Roll for usage */ if ((chance < USE_DEVICE) || (randint(chance) < USE_DEVICE)) { - if (flush_failure) flush(); + flush_on_failure(); msg_print("You failed to activate it properly."); return; } diff --git a/src/cmd7.cc b/src/cmd7.cc index 6aac9050..aaec34b7 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -420,7 +420,7 @@ void do_cmd_mindcraft(void) /* Failed spell */ if (rand_int(100) < chance) { - if (flush_failure) flush(); + flush_on_failure(); msg_format("You failed to concentrate hard enough!"); @@ -945,7 +945,7 @@ void do_cmd_mimic(void) /* Failed spell */ if (rand_int(100) < fail) { - if (flush_failure) flush(); + flush_on_failure(); msg_format("You failed to concentrate hard enough!"); @@ -1576,7 +1576,7 @@ void do_cmd_powermage(void) char sfail[80]; /* Flush input if told so */ - if (flush_failure) flush(); + flush_on_failure(); /* Insane players can see something strange */ if (rand_int(100) < insanity) @@ -1754,7 +1754,7 @@ void brand_ammo(int brand_type, int bolts_only) } else { - if (flush_failure) flush(); + flush_on_failure(); msg_print("The enchantment failed."); } } @@ -2199,7 +2199,7 @@ void do_cmd_necromancer(void) /* Failed spell */ if (rand_int(100) < chance) { - if (flush_failure) flush(); + flush_on_failure(); msg_format("You failed to concentrate hard enough!"); if (randint(100) < (chance / 2)) @@ -2581,7 +2581,7 @@ int rune_exec(rune_spell *spell, int cost) char sfail[80]; /* Flush input if told so */ - if (flush_failure) flush(); + flush_on_failure(); /* Insane players can see something strange */ if (rand_int(100) < insanity) @@ -4060,7 +4060,7 @@ void do_cmd_symbiotic(void) /* Failed spell */ if (rand_int(100) < chance) { - if (flush_failure) flush(); + flush_on_failure(); msg_format("You failed to concentrate hard enough!"); } else diff --git a/src/powers.cc b/src/powers.cc index b58eb164..8edfb7b5 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -122,7 +122,7 @@ static bool_ power_chance(power_type *x_ptr) return (TRUE); } - if (flush_failure) flush(); + flush_on_failure(); msg_print("You've failed to concentrate hard enough."); return (FALSE); diff --git a/src/randart.cc b/src/randart.cc index 9528faee..e22f1c93 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -458,7 +458,7 @@ bool_ artifact_scroll(void) if (!okay) { /* Flush */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("The enchantment failed."); diff --git a/src/spells2.cc b/src/spells2.cc index 45fd18eb..5fd21698 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -2910,7 +2910,7 @@ bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval) if (!okay) { /* Flush */ - if (flush_failure) flush(); + flush_on_failure(); /* Message */ msg_print("The enchantment failed."); diff --git a/src/spells4.cc b/src/spells4.cc index 62586758..199aea98 100644 --- a/src/spells4.cc +++ b/src/spells4.cc @@ -512,10 +512,7 @@ void lua_cast_school_spell(s32b s, bool_ no_cost) /* failures are dangerous; we'll flush the input buffer so it isn't missed. */ - if (flush_failure) - { - flush(); - } + flush_on_failure(); msg_print("You failed to get the spell off!"); } diff --git a/src/util.cc b/src/util.cc index d899b2f2..d1bc6bbd 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1220,6 +1220,18 @@ void flush(void) } +/* + * Flush input if the 'flush_failure' option is set. + */ +void flush_on_failure() +{ + if (flush_failure) + { + flush(); + } +} + + /* * Flush the screen, make a noise */ diff --git a/src/util.hpp b/src/util.hpp index 583fd4aa..2953ca11 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -24,6 +24,7 @@ extern errr fd_read(int fd, char *buf, huge n); extern errr fd_write(int fd, cptr buf, huge n); extern errr fd_close(int fd); extern void flush(void); +extern void flush_on_failure(); extern void move_cursor(int row, int col); extern void text_to_ascii(char *buf, cptr str); extern void ascii_to_text(char *buf, cptr str); -- cgit v1.2.3 From 98ae117c0944ca54417088a55eb8f22a9e1e0733 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Factor out 'disturb_state' option handling --- src/cave.cc | 13 +++++++++++++ src/cave.hpp | 1 + src/dungeon.cc | 2 +- src/xtra2.cc | 23 +++++++++++------------ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 52855a8b..b9cc4fe7 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -4459,6 +4459,19 @@ void disturb(int stop_search) +/* + * Disturb if option 'disturb_state' is set. + */ +void disturb_on_state() +{ + if (disturb_state) + { + disturb(0); + } +} + + + /* * Return the index of the random quest on this level * (or zero) diff --git a/src/cave.hpp b/src/cave.hpp index 64f67dba..5b29054d 100644 --- a/src/cave.hpp +++ b/src/cave.hpp @@ -37,6 +37,7 @@ extern void health_track(int m_idx); extern void monster_race_track(int r_idx, int ego); extern void object_track(object_type *o_ptr); extern void disturb(int stop_search); +extern void disturb_on_state(); extern int is_quest(int level); extern int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags); extern bool cave_floor_bold(int y, int x); diff --git a/src/dungeon.cc b/src/dungeon.cc index 138d8c66..076369dd 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -2229,7 +2229,7 @@ static void process_world(void) att &= ~(CLASS_LEGS); att &= ~(CLASS_WALL); - if (disturb_state) disturb(0); + disturb_on_state(); } p_ptr->update |= (PU_BODY); diff --git a/src/xtra2.cc b/src/xtra2.cc index 8b444058..9581a7ee 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -134,7 +134,7 @@ bool_ set_parasite(int v, int r) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -187,8 +187,7 @@ static bool_ set_simple_field( return (FALSE); /* Disturb */ - if (disturb_state) - disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -460,7 +459,7 @@ bool_ set_mimic(int v, int p, int level) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Redraw title */ p_ptr->redraw |= (PR_FRAME); @@ -757,7 +756,7 @@ bool_ set_fast(int v, int p) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -1060,7 +1059,7 @@ bool_ set_tim_thunder(int v, int p1, int p2) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -1267,7 +1266,7 @@ bool_ set_tim_regen(int v, int p) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Handle stuff */ handle_stuff(); @@ -1407,7 +1406,7 @@ bool_ set_stun(int v) /* None */ case 0: msg_print("You are no longer stunned."); - if (disturb_state) disturb(0); + disturb_on_state(); break; } @@ -1422,7 +1421,7 @@ bool_ set_stun(int v) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -1615,7 +1614,7 @@ bool_ set_cut(int v) /* None */ case 0: msg_print("You are no longer bleeding."); - if (disturb_state) disturb(0); + disturb_on_state(); break; } @@ -1630,7 +1629,7 @@ bool_ set_cut(int v) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); @@ -1844,7 +1843,7 @@ bool_ set_food(int v) if (!notice) return (FALSE); /* Disturb */ - if (disturb_state) disturb(0); + disturb_on_state(); /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); -- cgit v1.2.3 From 55729f1d5e1c656fa909e9c18275107d206aedea Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Factor out 'disturb_other' option handling --- src/cave.cc | 13 +++++++ src/cave.hpp | 1 + src/melee2.cc | 108 +++++++++++++++++++++++++++------------------------------- 3 files changed, 64 insertions(+), 58 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index b9cc4fe7..22ec8d39 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -4472,6 +4472,19 @@ void disturb_on_state() +/* + * Disturb if option 'disturb_other' is set. + */ +void disturb_on_other() +{ + if (disturb_other) + { + disturb(1); + } +} + + + /* * Return the index of the random quest on this level * (or zero) diff --git a/src/cave.hpp b/src/cave.hpp index 5b29054d..66b16d82 100644 --- a/src/cave.hpp +++ b/src/cave.hpp @@ -38,6 +38,7 @@ extern void monster_race_track(int r_idx, int ego); extern void object_track(object_type *o_ptr); extern void disturb(int stop_search); extern void disturb_on_state(); +extern void disturb_on_other(); extern int is_quest(int level); extern int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags); extern bool cave_floor_bold(int y, int x); diff --git a/src/melee2.cc b/src/melee2.cc index c246343b..91dfcaf2 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -1078,10 +1078,7 @@ static bool_ monst_spell_monst(int m_idx) /* Do a breath */ auto do_breath = [&](char const *element, int gf, s32b max, int divisor) -> void { // Interrupt - if (disturb_other) - { - disturb(1); - } + disturb_on_other(); // Message if (!see_either) { @@ -1114,10 +1111,8 @@ static bool_ monst_spell_monst(int m_idx) /* Do a summoning spell */ auto do_summon = [&](char const *action, int n, int friendly_type, int hostile_type, summon_messages const &blind_msg) -> void { // Interrupt - if (disturb_other) - { - disturb(1); - } + disturb_on_other(); + // Message if (blind || !see_m) { @@ -1174,7 +1169,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_SHRIEK_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_m) monster_msg("You hear a shriek."); else monster_msg("%^s shrieks at %s.", m_name, t_name); wake_up = TRUE; @@ -1188,7 +1183,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_ROCKET_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear an explosion!"); else if (blind) monster_msg("%^s shoots something.", m_name); else monster_msg("%^s fires a rocket at %s.", m_name, t_name); @@ -1199,7 +1194,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_ARROW_1_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires an arrow at %s.", m_name, t_name); @@ -1209,7 +1204,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_ARROW_2_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires an arrow at %s.", m_name, t_name); @@ -1219,7 +1214,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_ARROW_3_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear a strange noise."); else if (blind) monster_msg("%^s makes a strange noise.", m_name); @@ -1231,7 +1226,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_ARROW_4_IDX: { if (!see_either) monster_msg("You hear a strange noise."); - else if (disturb_other) disturb(1); + else disturb_on_other(); if (blind) monster_msg("%^s makes a strange noise.", m_name); else monster_msg("%^s fires a missile at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_ARROW, damroll(7, 6)); @@ -1360,7 +1355,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_NUKE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a ball of radiation at %s.", m_name, t_name); @@ -1377,7 +1372,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_CHAO_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg("You hear someone mumble frighteningly."); else if (blind) monster_msg("%^s mumbles frighteningly.", m_name); else monster_msg("%^s invokes a raw Chaos upon %s.", m_name, t_name); @@ -1394,7 +1389,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_ACID_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts an acid ball at %s.", m_name, t_name); @@ -1404,7 +1399,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_ELEC_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1415,7 +1410,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_FIRE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1426,7 +1421,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_COLD_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1437,7 +1432,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_POIS_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1448,7 +1443,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_NETH_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1459,7 +1454,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_WATE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble."); else if (blind) monster_msg("%^s mumbles.", m_name); @@ -1471,7 +1466,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_MANA_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble powerfully."); else if (blind) monster_msg("%^s mumbles powerfully.", m_name); @@ -1482,7 +1477,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BA_DARK_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_either) monster_msg ("You hear someone mumble powerfully."); else if (blind) monster_msg("%^s mumbles powerfully.", m_name); @@ -1535,7 +1530,7 @@ static bool_ monst_spell_monst(int m_idx) { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!seen) { @@ -1573,7 +1568,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BRAIN_SMASH_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!seen) { /* */ @@ -1613,7 +1608,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_CAUSE_1_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s points at %s and curses.", m_name, t_name); if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10) @@ -1633,7 +1628,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_CAUSE_2_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s points at %s and curses horribly.", m_name, t_name); if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10) @@ -1652,7 +1647,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_CAUSE_3_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s points at %s, incanting terribly!", m_name, t_name); if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10) @@ -1671,7 +1666,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_CAUSE_4_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s points at %s, screaming the word 'DIE!'", m_name, t_name); if (t_ptr->level > randint((rlev - 10) < 1 ? 1 : (rlev - 10)) + 10) @@ -1689,7 +1684,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_ACID_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts an acid bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_ACID, @@ -1699,7 +1694,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_ELEC_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a lightning bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_ELEC, @@ -1709,7 +1704,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_FIRE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a fire bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_FIRE, @@ -1719,7 +1714,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_COLD_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a frost bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_COLD, @@ -1735,7 +1730,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_NETH_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a nether bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_NETHER, @@ -1745,7 +1740,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_WATE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a water bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_WATER, @@ -1755,7 +1750,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_MANA_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a mana bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_MANA, @@ -1765,7 +1760,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_PLAS_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a plasma bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_PLASMA, @@ -1775,7 +1770,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BO_ICEE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts an ice bolt at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_ICE, @@ -1785,7 +1780,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_MISSILE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a magic missile at %s.", m_name, t_name); monst_bolt_monst(m_idx, y, x, GF_MISSILE, @@ -1796,7 +1791,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_SCARE_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles, and you hear scary noises.", m_name); else monster_msg("%^s casts a fearful illusion at %s.", m_name, t_name); if (tr_ptr->flags & RF_NO_FEAR) @@ -1819,7 +1814,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BLIND_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s casts a spell, burning %s%s eyes.", m_name, t_name, (!strcmp(t_name, "it") ? "s" : "'s")); @@ -1844,7 +1839,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_CONF_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) monster_msg("%^s mumbles, and you hear puzzling noises.", m_name); else monster_msg("%^s creates a mesmerising illusion in front of %s.", m_name, t_name); if (tr_ptr->flags & RF_NO_CONF) @@ -1867,7 +1862,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_SLOW_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!blind && see_either) monster_msg("%^s drains power from %s%s muscles.", m_name, t_name, (!strcmp(t_name, "it") ? "s" : "'s")); if (tr_ptr->flags & RF_UNIQUE) @@ -1890,7 +1885,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_HOLD_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!blind && see_m) monster_msg("%^s stares intently at %s.", m_name, t_name); if ((tr_ptr->flags & RF_UNIQUE) || (tr_ptr->flags & RF_NO_STUN)) @@ -1912,7 +1907,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_HASTE_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (blind || !see_m) { monster_msg("%^s mumbles.", m_name); @@ -1942,7 +1937,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_HAND_DOOM_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (!see_m) monster_msg("You hear someone invoke the Hand of Doom!"); else if (!blind) monster_msg("%^s invokes the Hand of Doom on %s.", m_name, t_name); else @@ -1972,7 +1967,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_HEAL_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); /* Message */ if (blind || !see_m) @@ -2036,7 +2031,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_BLINK_IDX: { - if (disturb_other) disturb(1); + disturb_on_other(); if (see_m) monster_msg("%^s blinks away.", m_name); teleport_away(m_idx, 10); break; @@ -2047,7 +2042,7 @@ static bool_ monst_spell_monst(int m_idx) if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ else { - if (disturb_other) disturb(1); + disturb_on_other(); if (see_m) monster_msg("%^s teleports away.", m_name); teleport_away(m_idx, MAX_SIGHT * 2 + 5); break; @@ -2068,7 +2063,7 @@ static bool_ monst_spell_monst(int m_idx) else { bool_ resists_tele = FALSE; - if (disturb_other) disturb(1); + disturb_on_other(); monster_msg("%^s teleports %s away.", m_name, t_name); @@ -2110,7 +2105,7 @@ static bool_ monst_spell_monst(int m_idx) case SF_DARKNESS_IDX: { if (!direct) break; - if (disturb_other) disturb(1); + disturb_on_other(); if (blind) monster_msg("%^s mumbles.", m_name); else monster_msg("%^s gestures in shadow.", m_name); if (seen) @@ -2282,10 +2277,7 @@ static bool_ monst_spell_monst(int m_idx) // No summoning uniques; see the remapping code above the switch. assert(!friendly); // Interrupt - if (disturb_other) - { - disturb(1); - } + disturb_on_other(); // Message if (blind || !see_m) { @@ -4739,7 +4731,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) if (!effect || check_hit2(power, rlev, ac)) { /* Always disturbing */ - if (disturb_other) disturb(1); + disturb_on_other(); /* Describe the attack method */ switch (method) -- cgit v1.2.3 From 7f147b21e23662c89bd28479ea67ee7c6a94fc0c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Factor out "confirm_stairs" option handling --- src/cmd2.cc | 63 ++++++++++++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/src/cmd2.cc b/src/cmd2.cc index fd31b564..7f57bd08 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -134,6 +134,29 @@ static bool_ stair_hooks(stairs_direction direction) return (!out.allow); } +/* + * Ask for confirmation before leaving level; based + * on whether the 'confirm_stairs' option is set. + */ +static bool ask_leave() +{ + if (confirm_stairs) + { + if (get_check("Really leave the level? ")) + { + return true; // Leave + } + else + { + return false; // Don't leave + } + } + else + { + return true; // Leave + } +} + /* * Go up one level @@ -169,11 +192,7 @@ void do_cmd_go_up(void) { go_up = get_check("Leave this unique level forever? "); } - else if (confirm_stairs) - { - go_up = get_check("Really leave the level? "); - } - else + else if (ask_leave()) { go_up = TRUE; } @@ -190,11 +209,7 @@ void do_cmd_go_up(void) { go_up = get_check("Leave this unique level forever? "); } - else if (confirm_stairs) - { - go_up_many = get_check("Really leave the level? "); - } - else + else if (ask_leave()) { go_up_many = TRUE; } @@ -232,12 +247,7 @@ void do_cmd_go_up(void) prob_traveling = TRUE; - if (confirm_stairs) - { - if (get_check("Really leave the level? ")) - go_up = TRUE; - } - else + if (ask_leave()) { go_up = TRUE; } @@ -399,12 +409,7 @@ void do_cmd_go_down(void) } else { - if (confirm_stairs) - { - if (get_check("Really leave the level? ")) - go_down_many = TRUE; - } - else + if (ask_leave()) { go_down_many = TRUE; } @@ -428,12 +433,7 @@ void do_cmd_go_down(void) } else { - if (confirm_stairs) - { - if (get_check("Really leave the level? ")) - go_down = TRUE; - } - else + if (ask_leave()) { go_down = TRUE; } @@ -462,12 +462,7 @@ void do_cmd_go_down(void) prob_traveling = TRUE; - if (confirm_stairs) - { - if (get_check("Really leave the level? ")) - go_down = TRUE; - } - else + if (ask_leave()) { go_down = TRUE; } -- cgit v1.2.3 From f035201f330a3b1f50a2041ea9ad3f854f7d4e00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move all options to a struct instead of using globals --- src/birth.cc | 18 ++-- src/cave.cc | 79 +++++++------- src/cmd1.cc | 18 ++-- src/cmd2.cc | 20 ++-- src/cmd3.cc | 2 +- src/cmd4.cc | 155 ++++++++++++++------------- src/dungeon.cc | 81 ++++++++------- src/files.cc | 60 +++++------ src/generate.cc | 163 +++++++++++++++++++---------- src/help.cc | 2 +- src/init2.cc | 13 ++- src/joke.cc | 2 +- src/loadsave.cc | 30 +++--- src/melee2.cc | 49 +++++---- src/monster2.cc | 56 +++++++--- src/object1.cc | 2 +- src/object2.cc | 66 +++++++++--- src/options.cc | 108 ++----------------- src/options.hpp | 312 +++++++++++++++++++++++++++++++++++++------------------ src/q_ultrag.cc | 9 +- src/randart.cc | 5 +- src/spells1.cc | 28 +++-- src/spells2.cc | 10 +- src/store.cc | 6 +- src/tables.cc | 214 -------------------------------------- src/tables.hpp | 1 - src/util.cc | 25 +++-- src/variable.cc | 5 + src/variable.hpp | 2 + src/wild.cc | 7 +- src/xtra1.cc | 19 ++-- src/xtra2.cc | 12 ++- 32 files changed, 770 insertions(+), 809 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index e581d8f0..c4d3718e 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -820,11 +820,7 @@ static void player_wipe(void) p_ptr->food = PY_FOOD_FULL - 1; /* Clear "cheat" options */ - cheat_peek = FALSE; - cheat_hear = FALSE; - cheat_room = FALSE; - cheat_xtra = FALSE; - cheat_live = FALSE; + options->reset_cheat_options(); /* Assume no winning game */ total_winner = 0; @@ -2174,7 +2170,7 @@ static bool_ player_birth_aux_ask() /*** User enters number of quests ***/ /* Heino Vander Sanden and Jimmy De Laet */ - if (!ironman_rooms) + if (!options->ironman_rooms) { if (do_quick_start) { @@ -2467,7 +2463,7 @@ static bool_ player_birth_aux_auto() /* Initialize */ - if (autoroll) + if (options->autoroll) { int mval[6]; @@ -2530,7 +2526,7 @@ static bool_ player_birth_aux_auto() if (!askfor_aux(inp, 8)) inp[0] = '\0'; /* Weirdos stat display .. erm .. I mean, original stat display */ - if (!linear_stats) + if (!options->linear_stats) { /* Hack -- add a fake slash */ strcat(inp, "/"); @@ -2570,7 +2566,7 @@ static bool_ player_birth_aux_auto() while (TRUE) { /* Feedback */ - if (autoroll) + if (options->autoroll) { Term_clear(); @@ -2610,7 +2606,7 @@ static bool_ player_birth_aux_auto() } /* Auto-roll */ - while (autoroll) + while (options->autoroll) { bool_ accept = TRUE; @@ -2832,7 +2828,7 @@ static bool_ player_birth_aux() else { /* Point based */ - if (point_based) + if (options->point_based) { if (!player_birth_aux_point()) return FALSE; } diff --git a/src/cave.cc b/src/cave.cc index 22ec8d39..956088e0 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -940,7 +940,7 @@ static void map_info(int y, int x, byte *ap, char *cp) /**** Step 2 -- Apply special random effects ****/ - if (!avoid_other && !avoid_shimmer) + if (!options->avoid_other && !options->avoid_shimmer) { /* Special terrain effect */ if (c_ptr->effect) @@ -971,7 +971,7 @@ static void map_info(int y, int x, byte *ap, char *cp) */ /* view_special_lite: lighting effects for boring features */ - if (view_special_lite && + if (options->view_special_lite && ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) @@ -980,7 +980,7 @@ static void map_info(int y, int x, byte *ap, char *cp) if (info & (CAVE_SEEN)) { /* Only lit by "torch" light */ - if (view_yellow_lite && !(info & (CAVE_GLOW))) + if (options->view_yellow_lite && !(info & (CAVE_GLOW))) { /* Use "yellow" */ a = TERM_YELLOW; @@ -1002,7 +1002,7 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* "Out-of-sight" glowing grids -- handle "view_bright_lite" */ - else if (view_bright_lite) + else if (options->view_bright_lite) { /* Use darker colour */ a = dark_attrs[a & 0xF]; @@ -1011,7 +1011,7 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* view_granite_lite: lighting effects for walls and doors */ - else if (view_granite_lite && + else if (options->view_granite_lite && (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) @@ -1030,7 +1030,7 @@ static void map_info(int y, int x, byte *ap, char *cp) } /* Handle "view_bright_lite" */ - else if (view_bright_lite) + else if (options->view_bright_lite) { /* Use darker colour */ a = dark_attrs[a & 0xF]; @@ -1092,7 +1092,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *ap = object_attr(o_ptr); /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) + if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } @@ -1129,7 +1129,7 @@ static void map_info(int y, int x, byte *ap, char *cp) *ap = object_attr(o_ptr); /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) + if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) { *ap = get_shimmer_color(); } @@ -1148,7 +1148,7 @@ static void map_info(int y, int x, byte *ap, char *cp) a = r_ptr->x_attr; /* Ignore weird codes */ - if (avoid_other) + if (options->avoid_other) { /* Use char */ *cp = c; @@ -1237,7 +1237,7 @@ static void map_info(int y, int x, byte *ap, char *cp) monster_race *r_ptr = &r_info[p_ptr->body_monster]; /* Get the "player" attr */ - if (!avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) + if (!options->avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) { a = get_shimmer_color(); } @@ -1250,7 +1250,7 @@ static void map_info(int y, int x, byte *ap, char *cp) c = r_ptr->x_char; /* Show player health char instead? */ - if (player_char_health) + if (options->player_char_health) { int percent = p_ptr->chp * 10 / p_ptr->mhp; @@ -1279,10 +1279,13 @@ void map_info_default(int y, int x, byte *ap, char *cp) byte c; + /* Shorthand */ + auto const avoid_other = options->avoid_other; + /**** Preparation ****/ /* Access the grid */ - cave_type *c_ptr = &cave[y][x]; + auto const c_ptr = &cave[y][x]; /* Cache some frequently used values */ @@ -1304,7 +1307,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Access floor */ - feature_type *f_ptr = &f_info[feat]; + feature_type const *f_ptr = &f_info[feat]; /**** Layer 1 -- Terrain feature ****/ @@ -1405,7 +1408,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) */ /* view_special_lite: lighting effects for boring features */ - if (view_special_lite && + if (options->view_special_lite && ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) @@ -1414,7 +1417,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) if (info & (CAVE_SEEN)) { /* Only lit by "torch" light */ - if (view_yellow_lite && !(info & (CAVE_GLOW))) + if (options->view_yellow_lite && !(info & (CAVE_GLOW))) { /* Use "yellow" */ a = TERM_YELLOW; @@ -1436,7 +1439,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* "Out-of-sight" glowing grids -- handle "view_bright_lite" */ - else if (view_bright_lite) + else if (options->view_bright_lite) { /* Use darker colour */ a = dark_attrs[a & 0xF]; @@ -1445,7 +1448,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* view_granite_lite: lighting effects for walls and doors */ - else if (view_granite_lite && + else if (options->view_granite_lite && (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) @@ -1464,7 +1467,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) } /* Handle "view_bright_lite" */ - else if (view_bright_lite) + else if (options->view_bright_lite) { /* Use darker colour */ a = dark_attrs[a & 0xF]; @@ -1799,18 +1802,18 @@ void note_spot(int y, int x) /* Hack -- memorize grids */ - if (!(info & (CAVE_MARK))) + if (!(info & CAVE_MARK)) { /* Memorise some "boring" grids */ if (cave_plain_floor_grid(c_ptr)) { /* Option -- memorise certain floors */ - if ((info & (CAVE_TRDT)) || - ((info & (CAVE_GLOW)) && view_perma_grids ) || - view_torch_grids) + if ((info & CAVE_TRDT) || + ((info & CAVE_GLOW) && options->view_perma_grids) || + options->view_torch_grids) { /* Memorize */ - c_ptr->info |= (CAVE_MARK); + c_ptr->info |= CAVE_MARK; } } @@ -1818,7 +1821,7 @@ void note_spot(int y, int x) else { /* Memorize */ - c_ptr->info |= (CAVE_MARK); + c_ptr->info |= CAVE_MARK; } } } @@ -2036,9 +2039,6 @@ void display_map(int *cy, int *cx) byte tp; - bool_ old_view_special_lite; - bool_ old_view_granite_lite; - int hgt, wid, yrat, xrat, yfactor, xfactor; @@ -2063,12 +2063,12 @@ void display_map(int *cy, int *cx) /* Save lighting effects */ - old_view_special_lite = view_special_lite; - old_view_granite_lite = view_granite_lite; + auto const old_view_special_lite = options->view_special_lite; + auto const old_view_granite_lite = options->view_granite_lite; /* Disable lighting effects */ - view_special_lite = FALSE; - view_granite_lite = FALSE; + options->view_special_lite = FALSE; + options->view_granite_lite = FALSE; /* Set up initial maps */ @@ -2165,8 +2165,8 @@ void display_map(int *cy, int *cx) *cx = p_ptr->px * xfactor / xrat + COL_MAP; /* Restore lighting effects */ - view_special_lite = old_view_special_lite; - view_granite_lite = old_view_granite_lite; + options->view_special_lite = old_view_special_lite; + options->view_granite_lite = old_view_granite_lite; } @@ -3871,7 +3871,7 @@ void update_flow(void) int x, y, d; /* Hack -- disabled */ - if (!flow_by_sound) return; + if (!options->flow_by_sound) return; /* Paranoia -- make sure the array is empty */ if (temp_n) return; @@ -4057,7 +4057,7 @@ void wiz_lite(void) } /* Normally, memorize floors (see above) */ - if (view_perma_grids && !view_torch_grids) + if (options->view_perma_grids && !options->view_torch_grids) { /* Memorize the grid */ c_ptr->info |= (CAVE_MARK); @@ -4454,7 +4454,10 @@ void disturb(int stop_search) } /* Flush the input if requested */ - if (flush_disturb) flush(); + if (options->flush_disturb) + { + flush(); + } } @@ -4464,7 +4467,7 @@ void disturb(int stop_search) */ void disturb_on_state() { - if (disturb_state) + if (options->disturb_state) { disturb(0); } @@ -4477,7 +4480,7 @@ void disturb_on_state() */ void disturb_on_other() { - if (disturb_other) + if (options->disturb_other) { disturb(1); } diff --git a/src/cmd1.cc b/src/cmd1.cc index d0541eb3..c54e3dbd 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -1770,7 +1770,7 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special) { old_ptr = ma_ptr; - if (wizard && cheat_xtra) + if (wizard && options->cheat_xtra) { msg_print("Attack re-selected."); } @@ -2403,7 +2403,7 @@ void py_attack(int y, int x, int max_blow) { drain_heal = damroll(4, (drain_result / 6)); - if (cheat_xtra) + if (options->cheat_xtra) { msg_format("Draining left: %d", drain_left); } @@ -3080,7 +3080,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) new_dtrap = ((cave[y][x].info & CAVE_DETECT) != 0); /* Normal movement */ - if (oktomove && running && disturb_detect) + if (oktomove && running && options->disturb_detect) { /* * Disturb the player when about to leave the trap detected @@ -3720,7 +3720,7 @@ static bool_ run_test(void) case FEAT_BROKEN: { /* Option -- ignore */ - if (find_ignore_doors) notice = FALSE; + if (options->find_ignore_doors) notice = FALSE; /* Done */ break; @@ -3746,7 +3746,7 @@ static bool_ run_test(void) case FEAT_BETWEEN2: { /* Option -- ignore */ - if (find_ignore_stairs) notice = FALSE; + if (options->find_ignore_stairs) notice = FALSE; /* Done */ break; @@ -3925,7 +3925,7 @@ static bool_ run_test(void) } /* Two options, examining corners */ - else if (find_examine && !find_cut) + else if (options->find_examine && !options->find_cut) { /* Primary option */ find_current = option; @@ -3947,7 +3947,7 @@ static bool_ run_test(void) { /* Can not see anything ahead and in the direction we */ /* are turning, assume that it is a potential corner. */ - if (find_examine && + if (options->find_examine && see_nothing(option, row, col) && see_nothing(option2, row, col)) { @@ -3963,7 +3963,7 @@ static bool_ run_test(void) } /* This corner is seen to be enclosed; we cut the corner. */ - else if (find_cut) + else if (options->find_cut) { find_current = option2; find_prevdir = option2; @@ -4044,7 +4044,7 @@ void run_step(int dir) /* Move the player, using the "pickup" flag */ - move_player_aux(find_current, always_pickup, 1, TRUE); + move_player_aux(find_current, options->always_pickup, 1, TRUE); } diff --git a/src/cmd2.cc b/src/cmd2.cc index 7f57bd08..a67f1fda 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -140,7 +140,7 @@ static bool_ stair_hooks(stairs_direction direction) */ static bool ask_leave() { - if (confirm_stairs) + if (options->confirm_stairs) { if (get_check("Really leave the level? ")) { @@ -2102,7 +2102,7 @@ void do_cmd_disarm(void) more = FALSE; } else - more = do_cmd_disarm_aux(y, x, dir, always_pickup); + more = do_cmd_disarm_aux(y, x, dir, options->always_pickup); } } @@ -2185,7 +2185,7 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) } /* Hack -- Fall through the door. Can't disarm while falling. */ - move_player_aux(dir, always_pickup, 0, FALSE); + move_player_aux(dir, options->always_pickup, 0, FALSE); /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MON_LITE); @@ -2389,7 +2389,7 @@ void do_cmd_alter(void) else if (c_ptr->t_idx != 0) { /* Tunnel */ - more = do_cmd_disarm_aux(y, x, dir, always_pickup); + more = do_cmd_disarm_aux(y, x, dir, options->always_pickup); } /* Oops */ @@ -2713,7 +2713,7 @@ static void do_cmd_unwalk() else if (((feat >= FEAT_QUEST_ENTER) && (feat <= FEAT_QUEST_UP)) || ((feat >= FEAT_LESS) && (feat <= FEAT_MORE))) { - move_player(dir, always_pickup, TRUE); + move_player(dir, options->always_pickup, TRUE); more = FALSE; } @@ -2730,7 +2730,7 @@ static void do_cmd_unwalk() while (dir == 5); } - move_player(dir, always_pickup, TRUE); + move_player(dir, options->always_pickup, TRUE); } /* Walking semantics */ @@ -3124,7 +3124,7 @@ void do_cmd_fire(void) char o_name[80]; - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); /* Get the "bow" (if any) */ @@ -3554,7 +3554,7 @@ void do_cmd_throw(void) char o_name[80]; - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); /* Get an item */ int item; @@ -3925,7 +3925,7 @@ void do_cmd_boomerang(void) s32b special = 0; - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); /* Get the "bow" (if any) */ @@ -4367,7 +4367,7 @@ void do_cmd_immovable_special(void) if (!get_aim_dir(&dir)) return; fetch(dir, p_ptr->lev * 15, FALSE); - py_pickup_floor(always_pickup); + py_pickup_floor(options->always_pickup); did_act = TRUE; break; diff --git a/src/cmd3.cc b/src/cmd3.cc index dd837906..b6787d56 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -248,7 +248,7 @@ void do_cmd_wield(void) return; } - if ((cursed_p(o_ptr)) && (wear_confirm) + if ((cursed_p(o_ptr)) && (options->wear_confirm) && (object_known_p(o_ptr) || (o_ptr->ident & (IDENT_SENSE)))) { char dummy[512]; diff --git a/src/cmd4.cc b/src/cmd4.cc index 0d15e0b8..2b51a102 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -500,7 +500,7 @@ namespace { /** * Interact with given vector of options. */ -static void interact_with_options(std::vector const &options, char const *info, interaction_mode_t interaction_mode) +static void interact_with_options(std::vector const &options, char const *info, interaction_mode_t interaction_mode) { size_t n = options.size(); @@ -528,9 +528,9 @@ static void interact_with_options(std::vector const &options, cha /* Display the option text */ strnfmt(buf, 80, "%-48s: %s (%s)", - options[i]->o_desc, - (*options[i]->o_var ? "yes" : "no "), - options[i]->o_text); + options[i].o_desc, + (*options[i].o_var) ? "yes" : "no ", + options[i].o_text); c_prt(a, buf, i + 2, 0); } @@ -586,7 +586,7 @@ static void interact_with_options(std::vector const &options, cha { break; } - *(options[k]->o_var) = TRUE; + *(options[k].o_var) = TRUE; k = (k + 1) % n; break; } @@ -600,7 +600,7 @@ static void interact_with_options(std::vector const &options, cha break; } - *(options[k]->o_var) = FALSE; + *(options[k].o_var) = FALSE; k = (k + 1) % n; break; } @@ -619,56 +619,27 @@ static void interact_with_options(std::vector const &options, cha -/* - * Cheating options - */ -static option_type cheat_info[6] = -{ - { &cheat_peek, FALSE, 0, 0, "cheat_peek", "Peek into object creation" }, - { &cheat_hear, FALSE, 0, 1, "cheat_hear", "Peek into monster creation" }, - { &cheat_room, FALSE, 0, 2, "cheat_room", "Peek into dungeon creation" }, - { &cheat_xtra, FALSE, 0, 3, "cheat_xtra", "Peek into something else" }, - { &cheat_live, FALSE, 0, 5, "cheat_live", "Allow player to avoid death" } -}; - /* * Interact with some options for cheating */ static void do_cmd_options_cheat(cptr info) { - // Calculate number of cheat options - size_t n = std::distance(std::begin(cheat_info), std::end(cheat_info)); - - // Build the vector of options we're going to interact with - std::vector options; - options.reserve(n); - for (auto &option : cheat_info) - { - options.push_back(&option); - } - // Interact - interact_with_options(options, info, interaction_mode_t::READ_WRITE); + interact_with_options(options->cheat_options, info, interaction_mode_t::READ_WRITE); // If user toggled any of the options to TRUE, then we add those cheats // to the player's "noscore" flags. Note that it doesn't matter what the // previous value was -- we don't "unset" noscore flags anyway. - for (auto &option: options) + for (auto const &option: options->cheat_options) { - if (*option->o_var) + if (*option.o_var) { - noscore |= (option->o_page * 256 + option->o_bit); + noscore |= (option.o_page * 256 + option.o_bit); } } } -static option_type autosave_info[2] = -{ - { &autosave_l, FALSE, 0, 6, "autosave_l", "Autosave when entering new levels" }, - { &autosave_t, FALSE, 0, 7, "autosave_t", "Timed autosave" }, -}; - s16b toggle_frequency(s16b current) { if (current == 0) return (50); @@ -692,7 +663,9 @@ static void do_cmd_options_autosave(cptr info) { char ch; - int i, k = 0, n = 2; + int i, k = 0; + + int n = options->autosave_options.size(); int dir; @@ -719,15 +692,18 @@ static void do_cmd_options_autosave(cptr info) /* Color current option */ if (i == k) a = TERM_L_BLUE; + /* Get the option */ + auto const option = &options->autosave_options[i]; + /* Display the option text */ strnfmt(buf, 80, "%-48s: %s (%s)", - autosave_info[i].o_desc, - (*autosave_info[i].o_var ? "yes" : "no "), - autosave_info[i].o_text); + option->o_desc, + (*option->o_var) ? "yes" : "no ", + option->o_text); c_prt(a, buf, i + 2, 0); } - prt(format("Timed autosave frequency: every %d turns", autosave_freq), 5, 0); + prt(format("Timed autosave frequency: every %d turns", options->autosave_freq), 5, 0); /* Hilite current option */ @@ -773,8 +749,7 @@ static void do_cmd_options_autosave(cptr info) case 'Y': case '6': { - - (*autosave_info[k].o_var) = TRUE; + (*options->autosave_options[k].o_var) = TRUE; k = (k + 1) % n; break; @@ -784,7 +759,7 @@ static void do_cmd_options_autosave(cptr info) case 'N': case '4': { - (*autosave_info[k].o_var) = FALSE; + (*options->autosave_options[k].o_var) = FALSE; k = (k + 1) % n; break; @@ -793,9 +768,9 @@ static void do_cmd_options_autosave(cptr info) case 'f': case 'F': { - autosave_freq = toggle_frequency(autosave_freq); - prt(format("Timed autosave frequency: every %d turns", - autosave_freq), 5, 0); + options->autosave_freq = toggle_frequency(options->autosave_freq); + prt(fmt::format("Timed autosave frequency: every {} turns", + options->autosave_freq), 5, 0); break; } @@ -816,21 +791,22 @@ static void do_cmd_options_autosave(cptr info) void do_cmd_options_aux(int page, cptr info, bool_ read_only) { // Scrape together all the options from the relevant page. - std::vector options; - options.reserve(64); // Seems a reasonable number; anything more would be unusable anyway - for (size_t i = 0; option_info[i].o_desc; i++) - { - if (option_info[i].o_page == page) - { - options.push_back(&option_info[i]); - } - } + std::vector page_options; + page_options.reserve(options->standard_options.size()); + std::copy_if( + std::begin(options->standard_options), + std::end(options->standard_options), + std::back_inserter(page_options), + [=](option_type const &option) -> bool { + return (option.o_page == page); + } + ); // Interact with the options interaction_mode_t interaction_mode = read_only ? interaction_mode_t::READ_ONLY : interaction_mode_t::READ_WRITE; - interact_with_options(options, info, interaction_mode); + interact_with_options(page_options, info, interaction_mode); } @@ -1042,25 +1018,25 @@ static errr option_dump(cptr fname) fprintf(fff, "# Automatic option dump\n\n"); /* Dump options (skip cheat, adult, score) */ - for (i = 0; option_info[i].o_var != NULL; i++) + for (auto const &option: options->standard_options) { /* Require a real option */ - if (!option_info[i].o_text) continue; + if (!option.o_text) continue; /* No birth options */ - if (option_info[i].o_page == 6) continue; + if (option.o_page == 6) continue; /* Comment */ - fprintf(fff, "# Option '%s'\n", option_info[i].o_desc); + fprintf(fff, "# Option '%s'\n", option.o_desc); /* Dump the option */ - if ((*option_info[i].o_var)) + if (*option.o_var) { - fprintf(fff, "Y:%s\n", option_info[i].o_text); + fprintf(fff, "Y:%s\n", option.o_text); } else { - fprintf(fff, "X:%s\n", option_info[i].o_text); + fprintf(fff, "X:%s\n", option.o_text); } /* Skip a line */ @@ -1345,14 +1321,26 @@ void do_cmd_options(void) /* Get a new value */ while (1) { - int msec = delay_factor * delay_factor * delay_factor; - prt(format("Current base delay factor: %d (%d msec)", - delay_factor, msec), 22, 0); + auto const msec = options->delay_factor_ms(); + + prt(fmt::format("Current base delay factor: {:d} ({:d} msec)", + options->delay_factor, msec), 22, 0); prt("Delay Factor (0-9 or ESC to accept): ", 23, 0); + k = inkey(); - if (k == ESCAPE) break; - if (isdigit(k)) delay_factor = D2I(k); - else bell(); + if (k == ESCAPE) + { + break; + } + + if (isdigit(k)) + { + options->delay_factor = D2I(k); + } + else + { + bell(); + } } break; @@ -1368,13 +1356,24 @@ void do_cmd_options(void) /* Get a new value */ while (1) { - prt(format("Current hitpoint warning: %d0%%", - hitpoint_warn), 22, 0); + prt(fmt::format("Current hitpoint warning: {:d}0%", + options->hitpoint_warn), 22, 0); prt("Hitpoint Warning (0-9 or ESC to accept): ", 20, 0); + k = inkey(); - if (k == ESCAPE) break; - if (isdigit(k)) hitpoint_warn = D2I(k); - else bell(); + if (k == ESCAPE) + { + break; + } + + if (isdigit(k)) + { + options->hitpoint_warn = D2I(k); + } + else + { + bell(); + } } break; diff --git a/src/dungeon.cc b/src/dungeon.cc index 076369dd..b2f8aa25 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1274,7 +1274,7 @@ static void process_world(void) } /* Check the fate */ - if (fate_option && (p_ptr->lev > 10)) + if (options->fate_option && (p_ptr->lev > 10)) { /* * WAS: == 666 against randint(50000). @@ -1301,9 +1301,9 @@ static void process_world(void) } /*** Attempt timed autosave ***/ - if (autosave_t && autosave_freq) + if (options->autosave_t && options->autosave_freq) { - if ((turn % ((s32b)autosave_freq * 10)) == 0) + if ((turn % (static_cast(options->autosave_freq) * 10)) == 0) { is_autosave = TRUE; msg_print("Autosaving the game..."); @@ -1341,10 +1341,13 @@ static void process_world(void) c_ptr = &cave[y][x]; /* Assume lit */ - c_ptr->info |= (CAVE_GLOW); + c_ptr->info |= CAVE_GLOW; /* Hack -- Memorize lit grids if allowed */ - if (view_perma_grids) c_ptr->info |= (CAVE_MARK); + if (options->view_perma_grids) + { + c_ptr->info |= CAVE_MARK; + } /* Hack -- Notice spot */ note_spot(y, x); @@ -1847,7 +1850,7 @@ static void process_world(void) if (p_ptr->necro_extra & CLASS_UNDEAD) { int old_chp = p_ptr->chp; - int warning = (p_ptr->mhp * hitpoint_warn / 10); + int warning = (p_ptr->mhp * options->hitpoint_warn / 10); /* Bypass invulnerability and wraithform */ p_ptr->chp--; @@ -1861,10 +1864,10 @@ static void process_world(void) /* Dead player */ if (p_ptr->chp < 0) { - bool_ old_quick = quick_messages; + bool_ old_quick = options->quick_messages; /* Hack -- Note death */ - if (!last_words) + if (!options->last_words) { msg_print("You die."); msg_print(NULL); @@ -1891,12 +1894,12 @@ static void process_world(void) /* Note death */ death = TRUE; - quick_messages = FALSE; + options->quick_messages = FALSE; if (get_check("Make a last screenshot? ")) { do_cmd_html_dump(); } - quick_messages = old_quick; + options->quick_messages = old_quick; /* Dead */ return; @@ -2610,7 +2613,10 @@ static void process_world(void) /* The light is getting dim */ else if ((o_ptr->timeout < 100) && (o_ptr->timeout % 10 == 0)) { - if (disturb_minor) disturb(0); + if (options->disturb_minor) + { + disturb(0); + } cmsg_print(TERM_YELLOW, "Your light is growing faint."); } } @@ -3370,7 +3376,7 @@ static void process_command(void) { if (do_control_walk()) break; - do_cmd_walk(always_pickup, TRUE); + do_cmd_walk(options->always_pickup, TRUE); break; } @@ -3380,7 +3386,7 @@ static void process_command(void) { if (do_control_walk()) break; - do_cmd_walk(!always_pickup, TRUE); + do_cmd_walk(!options->always_pickup, TRUE); break; } @@ -3400,7 +3406,7 @@ static void process_command(void) case ',': { if (do_control_pickup()) break; - do_cmd_stay(always_pickup); + do_cmd_stay(options->always_pickup); break; } @@ -3408,7 +3414,7 @@ static void process_command(void) case 'g': { if (p_ptr->control) break; - do_cmd_stay(!always_pickup); + do_cmd_stay(!options->always_pickup); break; } @@ -4139,7 +4145,7 @@ static void process_command(void) case CMD_BLUNDER: { if (do_control_walk()) break; - do_cmd_walk(always_pickup, FALSE); + do_cmd_walk(options->always_pickup, FALSE); break; } /* Hack -- Unknown command */ @@ -4253,7 +4259,7 @@ static void process_player(void) } /* Handle "abort" */ - if (!avoid_abort) + if (!options->avoid_abort) { /* Check for "player abort" (semi-efficiently for resting) */ if (running || command_rep || (resting && !(resting & 0x0F))) @@ -4300,7 +4306,7 @@ static void process_player(void) move_cursor_relative(p_ptr->py, p_ptr->px); /* Refresh (optional) */ - if (fresh_before) Term_fresh(); + if (options->fresh_before) Term_fresh(); /* Hack -- Pack Overflow */ if (p_ptr->inventory[INVEN_PACK].k_idx) @@ -4443,7 +4449,7 @@ static void process_player(void) /* Shimmer monsters if needed */ - if (!avoid_other && shimmer_monsters) + if (!options->avoid_other && shimmer_monsters) { /* Clear the flag */ shimmer_monsters = FALSE; @@ -4472,7 +4478,7 @@ static void process_player(void) } /* Shimmer objects if needed and requested */ - if (!avoid_other && !avoid_shimmer && shimmer_objects) + if (!options->avoid_other && !options->avoid_shimmer && shimmer_objects) { /* Clear the flag */ shimmer_objects = FALSE; @@ -4508,7 +4514,7 @@ static void process_player(void) * fast, and that's why shimmering has been limited to small * number of monsters -- pelpel */ - if (!avoid_other && !avoid_shimmer && + if (!options->avoid_other && !options->avoid_shimmer && !resting && !running) { for (j = panel_row_min; j <= panel_row_max; j++) @@ -4685,8 +4691,8 @@ static void dungeon(void) if (!dun_level) create_down_shaft = create_up_shaft = FALSE; /* Option -- no connected stairs */ - if (!dungeon_stair) create_down_stair = create_up_stair = FALSE; - if (!dungeon_stair) create_down_shaft = create_up_shaft = FALSE; + if (!options->dungeon_stair) create_down_stair = create_up_stair = FALSE; + if (!options->dungeon_stair) create_down_shaft = create_up_shaft = FALSE; /* no connecting stairs on special levels */ if (!(dungeon_flags & DF_NO_STAIR)) create_down_stair = create_up_stair = FALSE; @@ -4893,7 +4899,7 @@ static void dungeon(void) move_cursor_relative(p_ptr->py, p_ptr->px); /* Optional fresh */ - if (fresh_after) Term_fresh(); + if (options->fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ if (!alive || death) break; @@ -4921,7 +4927,7 @@ static void dungeon(void) move_cursor_relative(p_ptr->py, p_ptr->px); /* Optional fresh */ - if (fresh_after) Term_fresh(); + if (options->fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ if (!alive || death) break; @@ -4955,7 +4961,7 @@ static void dungeon(void) move_cursor_relative(p_ptr->py, p_ptr->px); /* Optional fresh */ - if (fresh_after) Term_fresh(); + if (options->fresh_after) Term_fresh(); /* Hack -- Notice death or departure */ if (!alive || death) break; @@ -5142,26 +5148,21 @@ void play_game() } /* Extract the options */ - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option: options->standard_options) { - int os = option_info[i].o_page; - int ob = option_info[i].o_bit; + int os = option.o_page; + int ob = option.o_bit; /* Set the "default" options */ - if (option_info[i].o_var) + if (option.o_var) { - /* Set */ if (option_flag[os] & (1L << ob)) { - /* Set */ - (*option_info[i].o_var) = TRUE; + *option.o_var = TRUE; } - - /* Clear */ else { - /* Clear */ - (*option_info[i].o_var) = FALSE; + *option.o_var = FALSE; } } } @@ -5232,8 +5233,8 @@ void play_game() load_all_pref_files(); /* Set or clear "rogue_like_commands" if requested */ - if (arg_force_original) rogue_like_commands = FALSE; - if (arg_force_roguelike) rogue_like_commands = TRUE; + if (arg_force_original) options->rogue_like_commands = FALSE; + if (arg_force_roguelike) options->rogue_like_commands = TRUE; /* Initialize vault info */ if (init_v_info()) quit("Cannot initialize vaults"); @@ -5409,7 +5410,7 @@ void play_game() } /* Cheat death option */ - else if ((wizard || cheat_live) && !get_check("Die? ")) + else if ((wizard || options->cheat_live) && !get_check("Die? ")) { cheat_death = TRUE; diff --git a/src/files.cc b/src/files.cc index 1f0d72d9..4e70acde 100644 --- a/src/files.cc +++ b/src/files.cc @@ -594,14 +594,12 @@ errr process_pref_file_aux(char *buf) /* Process "X:" -- turn option off */ else if (buf[0] == 'X') { - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option: options->standard_options) { - if (option_info[i].o_var && - option_info[i].o_text && - streq(option_info[i].o_text, buf + 2)) + if (option.o_var && streq(option.o_text, buf + 2)) { - (*option_info[i].o_var) = FALSE; - return (0); + *option.o_var = FALSE; + return 0; } } } @@ -609,14 +607,12 @@ errr process_pref_file_aux(char *buf) /* Process "Y:" -- turn option on */ else if (buf[0] == 'Y') { - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option: options->standard_options) { - if (option_info[i].o_var && - option_info[i].o_text && - streq(option_info[i].o_text, buf + 2)) + if (option.o_var && streq(option.o_text, buf + 2)) { - (*option_info[i].o_var) = TRUE; - return (0); + *option.o_var = TRUE; + return 0; } } } @@ -1175,7 +1171,7 @@ static void display_player_middle(void) { color = TERM_L_BLUE; } - else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10) + else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10) { color = TERM_VIOLET; } @@ -1196,7 +1192,7 @@ static void display_player_middle(void) { color = TERM_L_GREEN; } - else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10) + else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -1216,7 +1212,7 @@ static void display_player_middle(void) { color = TERM_L_GREEN; } - else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10) + else if (p_ptr->csp > (p_ptr->msp * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -1235,7 +1231,7 @@ static void display_player_middle(void) { color = TERM_L_GREEN; } - else if (p_ptr->csane > (p_ptr->msane * hitpoint_warn) / 10) + else if (p_ptr->csane > (p_ptr->msane * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -2657,34 +2653,34 @@ errr file_character(cptr name, bool_ full) /* List the patches */ fprintf(fff, "\n\n [Miscellaneous information]\n"); - if (joke_monsters) + if (options->joke_monsters) fprintf(fff, "\n Joke monsters: ON"); else fprintf(fff, "\n Joke monsters: OFF"); - if (preserve) + if (options->preserve) fprintf(fff, "\n Preserve Mode: ON"); else fprintf(fff, "\n Preserve Mode: OFF"); - if (auto_scum) + if (options->auto_scum) fprintf(fff, "\n Autoscum: ON"); else fprintf(fff, "\n Autoscum: OFF"); - if (always_small_level) + if (options->always_small_level) fprintf(fff, "\n Small Levels: ALWAYS"); - else if (small_levels) + else if (options->small_levels) fprintf(fff, "\n Small Levels: ON"); else fprintf(fff, "\n Small Levels: OFF"); - if (empty_levels) + if (options->empty_levels) fprintf(fff, "\n Arena Levels: ON"); else fprintf(fff, "\n Arena Levels: OFF"); - if (ironman_rooms) + if (options->ironman_rooms) fprintf(fff, "\n Always unusual rooms: ON"); else fprintf(fff, "\n Always unusual rooms: OFF"); @@ -3996,7 +3992,7 @@ void do_cmd_save_game(void) */ void autosave_checkpoint() { - if (autosave_l) + if (options->autosave_l) { is_autosave = TRUE; msg_print("Autosaving the game..."); @@ -4017,12 +4013,12 @@ static long total_points(void) if (!comp_death) comp_death = 1; - if (preserve) mult -= 1; /* Penalize preserve, maximize modes */ + if (options->preserve) mult -= 1; /* Penalize preserve, maximize modes */ mult -= 1; /* maximize pentalty, always on */ - if (auto_scum) mult -= 4; - if (small_levels) mult += ((always_small_level) ? 4 : 10); - if (empty_levels) mult += 2; - if (smart_learn) mult += 4; + if (options->auto_scum) mult -= 4; + if (options->small_levels) mult += ((options->always_small_level) ? 4 : 10); + if (options->empty_levels) mult += 2; + if (options->smart_learn) mult += 4; if (mult < 2) mult = 2; /* At least 10% of the original score */ /* mult is now between 2 and 40, i.e. 10% and 200% */ @@ -5261,7 +5257,7 @@ errr get_rnd_line(const char *file_name, char *output) strcpy(output, ""); /* test hack */ - if (wizard && cheat_xtra) msg_print(file_name); + if (wizard && options->cheat_xtra) msg_print(file_name); /* Build the filename */ path_build(buf, 1024, ANGBAND_DIR_FILE, file_name); @@ -5383,7 +5379,7 @@ errr get_xtra_line(const char *file_name, monster_type *m_ptr, char *output) strcpy(output, ""); /* test and DEBUG hack */ - if (wizard && cheat_xtra) + if (wizard && options->cheat_xtra) { msg_print(file_name); } @@ -5462,7 +5458,7 @@ errr get_xtra_line(const char *file_name, monster_type *m_ptr, char *output) line = rand_int(num_entries); /* test and DEBUG hack */ - if (wizard && cheat_xtra) + if (wizard && options->cheat_xtra) { sprintf(buf, "Line number %d", line); msg_print(buf); diff --git a/src/generate.cc b/src/generate.cc index 8c02c58a..ec6d002d 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -744,7 +744,7 @@ bool_ new_player_spot(int branch) p_ptr->px = x; /* XXX XXX XXX */ - if (dungeon_stair && !(dungeon_flags & DF_NO_STAIR) && dun_level && + if (options->dungeon_stair && !(dungeon_flags & DF_NO_STAIR) && dun_level && (!is_quest(dun_level) || (old_dun_level < dun_level)) && !branch) { if (old_dun_level < dun_level) @@ -1148,7 +1148,7 @@ static void alloc_object(int set, int typ, int num) if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_format("Warning! Could not place object, type : %d!", typ); } @@ -1469,7 +1469,7 @@ static void build_streamer(int feat, int chance) if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_print("Warning! Could not place streamer!"); } @@ -1622,7 +1622,7 @@ static void destroy_level(void) cave_type *c_ptr; /* Note destroyed levels */ - if ((cheat_room) || (p_ptr->precognition)) msg_print("Destroyed Level"); + if ((options->cheat_room) || (p_ptr->precognition)) msg_print("Destroyed Level"); /* Drop a few epi-centers (usually about two) */ for (n = 0; n < randint(5); n++) @@ -1832,7 +1832,7 @@ static void vault_objects(int y, int x, int num) if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_print("Warning! Could not place vault object!"); } @@ -1883,7 +1883,7 @@ static void vault_trap_aux(int y, int x, int yd, int xd) if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_print("Warning! Could not place vault trap!"); } @@ -3067,7 +3067,7 @@ static void build_type5(int by0, int bx0) if (empty) return; /* Describe */ - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { /* Room type */ msg_format("Monster nest (%s)", name); @@ -3390,12 +3390,12 @@ static void build_type6(int by0, int bx0) } /* Message */ - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { /* Room type */ msg_format("Monster pit (%s)", name); - if (cheat_hear || p_ptr->precognition) + if (options->cheat_hear || p_ptr->precognition) { /* Contents */ for (i = 0; i < 8; i++) @@ -3761,13 +3761,16 @@ static void build_type7(int by0, int bx0) /* Try to allocate space for room. If fails, exit */ if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval)) { - if (cheat_room) msg_print("Could not allocate this vault here"); + if (options->cheat_room) + { + msg_print("Could not allocate this vault here"); + } return; } if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_print("Warning! Could not place lesser vault!"); } @@ -3776,7 +3779,10 @@ static void build_type7(int by0, int bx0) /* Message */ - if (cheat_room || p_ptr->precognition) msg_print("Lesser Vault"); + if (options->cheat_room || p_ptr->precognition) + { + msg_print("Lesser Vault"); + } /* Boost the rating */ rating += v_ptr->rat; @@ -3817,13 +3823,16 @@ static void build_type8(int by0, int bx0) /* Try to allocate space for room. If fails, exit */ if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval)) { - if (cheat_room) msg_print("Could not allocate this vault here"); + if (options->cheat_room) + { + msg_print("Could not allocate this vault here"); + } return; } if (dummy >= SAFE_MAX_ATTEMPTS) { - if (cheat_room) + if (options->cheat_room) { msg_print("Warning! Could not place greater vault!"); } @@ -3832,7 +3841,10 @@ static void build_type8(int by0, int bx0) /* Message */ - if (cheat_room || p_ptr->precognition) msg_print("Greater Vault"); + if (options->cheat_room || p_ptr->precognition) + { + msg_print("Greater Vault"); + } /* Boost the rating */ rating += v_ptr->rat; @@ -4828,7 +4840,10 @@ static void build_bubble_vault(int x0, int y0, int xsize, int ysize) int xhsize = xsize / 2; int yhsize = ysize / 2; - if (cheat_room) msg_print("Bubble Vault"); + if (options->cheat_room) + { + msg_print("Bubble Vault"); + } /* Allocate center of bubbles */ center[0].x = randint(xsize - 3) + 1; @@ -5030,7 +5045,10 @@ static void build_room_vault(int x0, int y0, int xsize, int ysize) xhsize = xsize / 2; yhsize = ysize / 2; - if (cheat_room) msg_print("Room Vault"); + if (options->cheat_room) + { + msg_print("Room Vault"); + } /* Fill area so don't get problems with arena levels */ for (x1 = 0; x1 <= xsize; x1++) @@ -5088,7 +5106,10 @@ static void build_cave_vault(int x0, int y0, int xsiz, int ysiz) xsize = xhsize * 2; ysize = yhsize * 2; - if (cheat_room) msg_print("Cave Vault"); + if (options->cheat_room) + { + msg_print("Cave Vault"); + } light = done = FALSE; room = TRUE; @@ -5255,7 +5276,10 @@ static void build_maze_vault(int x0, int y0, int xsize, int ysize) cave_type *c_ptr; - if (cheat_room) msg_print("Maze Vault"); + if (options->cheat_room) + { + msg_print("Maze Vault"); + } /* Choose lite or dark */ light = (dun_level <= randint(25)); @@ -5321,7 +5345,10 @@ static void build_mini_c_vault(int x0, int y0, int xsize, int ysize) int y1, x1, y2, x2, y, x, total; int m, n, num_vertices; - if (cheat_room) msg_print("Mini Checker Board Vault"); + if (options->cheat_room) + { + msg_print("Mini Checker Board Vault"); + } /* Pick a random room size */ dy = ysize / 2 - 1; @@ -5627,7 +5654,10 @@ static void build_castle_vault(int x0, int y0, int xsize, int ysize) y2 = y0 + dy; x2 = x0 + dx; - if (cheat_room) msg_print("Castle Vault"); + if (options->cheat_room) + { + msg_print("Castle Vault"); + } /* Generate the room */ for (y = y1 - 1; y <= y2 + 1; y++) @@ -5751,7 +5781,10 @@ static void build_target_vault(int x0, int y0, int xsize, int ysize) h3 = randint(32); h4 = randint(32) - 16; - if (cheat_room) msg_print("Target Vault"); + if (options->cheat_room) + { + msg_print("Target Vault"); + } /* Work out outer radius */ if (xsize > ysize) @@ -6527,7 +6560,7 @@ static void try_doors(int y, int x) static bool_ room_build(int y, int x, int typ) { /* Restrict level */ - if ((dun_level < roomdep[typ]) && !ironman_rooms) return (FALSE); + if ((dun_level < roomdep[typ]) && !options->ironman_rooms) return (FALSE); /* Restrict "crowded" rooms */ if (dun->crowded && ((typ == 5) || (typ == 6))) return (FALSE); @@ -6660,11 +6693,11 @@ bool_ level_generate_dungeon() /* Check for arena level */ if ((dungeon_flags & DF_EMPTY) || - (empty_levels && (rand_int(EMPTY_LEVEL) == 0))) + (options->empty_levels && (rand_int(EMPTY_LEVEL) == 0))) { empty_level = TRUE; - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { msg_print("Arena level."); } @@ -6679,7 +6712,7 @@ bool_ level_generate_dungeon() cavern = TRUE; /* Make a large fractal cave in the middle of the dungeon */ - if (cheat_room) + if (options->cheat_room) { msg_print("Cavern on level."); } @@ -6727,7 +6760,7 @@ bool_ level_generate_dungeon() x = rand_int(dun->col_rooms); /* Align dungeon rooms */ - if (dungeon_align) + if (options->dungeon_align) { /* Slide some rooms right */ if ((x % 3) == 0) x++; @@ -6750,7 +6783,7 @@ bool_ level_generate_dungeon() x = rand_int(dun->col_rooms); /* Align dungeon rooms */ - if (dungeon_align) + if (options->dungeon_align) { /* Slide some rooms right */ if ((x % 3) == 0) x++; @@ -6789,13 +6822,13 @@ bool_ level_generate_dungeon() /* Attempt an "unusual" room -- no vaults on town levels */ if (!town_level && - (ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level))) + (options->ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level))) { /* Roll for room type */ - k = (ironman_rooms ? 0 : rand_int(100)); + k = (options->ironman_rooms ? 0 : rand_int(100)); /* Attempt a very unusual room */ /* test hack */ - if (ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level)) + if (options->ironman_rooms || (rand_int(DUN_UNUSUAL) < dun_level)) { /* Type 8 -- Greater vault (10%) */ if (k < 10) @@ -6806,7 +6839,10 @@ bool_ level_generate_dungeon() } else { - if (cheat_room) msg_print("Refusing a greater vault."); + if (options->cheat_room) + { + msg_print("Refusing a greater vault."); + } } } @@ -6819,7 +6855,10 @@ bool_ level_generate_dungeon() } else { - if (cheat_room) msg_print("Refusing a lesser vault."); + if (options->cheat_room) + { + msg_print("Refusing a lesser vault."); + } } } @@ -6951,7 +6990,10 @@ bool_ level_generate_dungeon() /* Add some sand streamers */ if ((dungeon_flags & DF_SAND_VEIN) && !rand_int(4)) { - if ((cheat_room) || (p_ptr->precognition)) msg_print("Sand vein."); + if (options->cheat_room || p_ptr->precognition) + { + msg_print("Sand vein."); + } build_streamer(FEAT_SANDWALL, DUN_STR_SC); } @@ -6967,12 +7009,18 @@ bool_ level_generate_dungeon() /* Hack -- Add some rivers if requested */ if ((dungeon_flags & DF_WATER_RIVER) && !rand_int(4)) { - if (cheat_room || p_ptr->precognition) msg_print("River of water."); + if (options->cheat_room || p_ptr->precognition) + { + msg_print("River of water."); + } add_river(FEAT_DEEP_WATER, FEAT_SHAL_WATER); } if ((dungeon_flags & DF_LAVA_RIVER) && !rand_int(4)) { - if ((cheat_room) || (p_ptr->precognition)) msg_print("River of lava."); + if (options->cheat_room || p_ptr->precognition) + { + msg_print("River of lava."); + } add_river(FEAT_DEEP_LAVA, FEAT_SHAL_LAVA); } @@ -6986,7 +7034,10 @@ bool_ level_generate_dungeon() if (rand_int(3) == 0) { add_river(FEAT_DEEP_WATER, FEAT_SHAL_WATER); - if (!said && ((cheat_room) || (p_ptr->precognition))) msg_print("Rivers of water."); + if (!said && (options->cheat_room || p_ptr->precognition)) + { + msg_print("Rivers of water."); + } said = TRUE; } } @@ -7002,7 +7053,10 @@ bool_ level_generate_dungeon() if (rand_int(3) == 0) { add_river(FEAT_DEEP_LAVA, FEAT_SHAL_LAVA); - if (!said && ((cheat_room) || (p_ptr->precognition))) msg_print("Rivers of lava."); + if (!said && (options->cheat_room || p_ptr->precognition)) + { + msg_print("Rivers of lava."); + } said = TRUE; } } @@ -7661,8 +7715,11 @@ static bool_ cave_gen(void) i = (i * cur_wid) / MAX_WID; i += 1; - if (i > small_tester) i = small_tester; - else if (cheat_hear) + if (i > small_tester) + { + i = small_tester; + } + else if (options->cheat_hear) { msg_format("Reduced monsters base from %d to %d", small_tester, i); } @@ -8171,7 +8228,7 @@ static void generate_grid_mana() { xtra_magic = TRUE; - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { msg_print("Magical level"); } @@ -8394,7 +8451,7 @@ void generate_cave(void) /* Requested size level */ if (d_ptr->size_x != -1) { - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { msg_print ("A 'size' dungeon level."); } @@ -8410,7 +8467,7 @@ void generate_cave(void) panel_row_min = max_panel_rows * (SCREEN_HGT / 2); panel_col_min = max_panel_cols * (SCREEN_WID / 2); - if (cheat_room) + if (options->cheat_room) { msg_format("X:%d, Y:%d.", max_panel_cols, max_panel_rows); } @@ -8419,7 +8476,7 @@ void generate_cave(void) else if (!(dungeon_flags & DF_BIG) && (dungeon_flags & DF_SMALLEST)) { - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { msg_print ("A 'small' dungeon level."); } @@ -8435,7 +8492,7 @@ void generate_cave(void) panel_row_min = max_panel_rows * (SCREEN_HGT / 2); panel_col_min = max_panel_cols * (SCREEN_WID / 2); - if (cheat_room) + if (options->cheat_room) { msg_format("X:1, Y:1."); } @@ -8443,11 +8500,11 @@ void generate_cave(void) /* Small level */ else if (!(dungeon_flags & DF_BIG) && - (always_small_level || + (options->always_small_level || (dungeon_flags & DF_SMALL) || - (small_levels && rand_int(SMALL_LEVEL) == 0))) + (options->small_levels && rand_int(SMALL_LEVEL) == 0))) { - if (cheat_room || p_ptr->precognition) + if (options->cheat_room || p_ptr->precognition) { msg_print ("A 'small' dungeon level."); } @@ -8466,7 +8523,7 @@ void generate_cave(void) panel_row_min = max_panel_rows * (SCREEN_HGT / 2); panel_col_min = max_panel_cols * (SCREEN_WID / 2); - if (cheat_room) + if (options->cheat_room) { msg_format("X:%d, Y:%d.", max_panel_cols, max_panel_rows); } @@ -8508,7 +8565,7 @@ void generate_cave(void) else feeling = 10; /* Hack -- Have a special feeling sometimes */ - if (good_item_flag && !preserve) feeling = 1; + if (good_item_flag && !options->preserve) feeling = 1; /* It takes 1000 game turns for "feelings" to recharge */ if ((turn - old_turn) < 1000) feeling = 0; @@ -8538,7 +8595,7 @@ void generate_cave(void) } /* Mega-Hack -- "auto-scum" */ - if (auto_scum && (num < 100) && !p_ptr->inside_quest && dun_level) + if (options->auto_scum && (num < 100) && !p_ptr->inside_quest && dun_level) { /* Require "goodness" */ if ((feeling > 9) || @@ -8548,8 +8605,8 @@ void generate_cave(void) ((dun_level >= 40) && (feeling > 5))) { /* Give message to cheaters */ - if (cheat_room || cheat_hear || - cheat_peek || cheat_xtra || p_ptr->precognition) + if (options->cheat_room || options->cheat_hear || + options->cheat_peek || options->cheat_xtra || p_ptr->precognition) { /* Message */ why = "boring level"; diff --git a/src/help.cc b/src/help.cc index a0847af1..be078d59 100644 --- a/src/help.cc +++ b/src/help.cc @@ -597,7 +597,7 @@ static bool_ triggered_help_hook(void *data, void *in, void *out) { triggered_help_type *triggered_help = (triggered_help_type *) data; /* Not triggered before and trigger now? */ - if ((option_ingame_help) && + if (options->ingame_help && (!p_ptr->help.activated[triggered_help->help_index]) && triggered_help->trigger_func(in,out)) { diff --git a/src/init2.cc b/src/init2.cc index 7a7f6906..4c6f7f75 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -631,6 +631,9 @@ static void init_basic() /* Extended trigger macros */ cli_info = make_array(CLI_MAX); + + /* Options */ + options = new struct options(); } @@ -810,19 +813,19 @@ static errr init_other(void) /*** Prepare the options ***/ /* Scan the options */ - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option : options->standard_options) { - int os = option_info[i].o_page; - int ob = option_info[i].o_bit; + int os = option.o_page; + int ob = option.o_bit; /* Set the "default" options */ - if (option_info[i].o_var) + if (option.o_var) { /* Accept */ option_mask[os] |= (1L << ob); /* Set */ - if (option_info[i].o_norm) + if (option.o_norm) { /* Set */ option_flag[os] |= (1L << ob); diff --git a/src/joke.cc b/src/joke.cc index be272115..eefee404 100644 --- a/src/joke.cc +++ b/src/joke.cc @@ -24,7 +24,7 @@ static void gen_joke_place_monster(int r_idx) bool_ gen_joke_monsters(void *data, void *in, void *out) { - if (joke_monsters) + if (options->joke_monsters) { if ((dungeon_type == 20) && (dun_level == 72)) diff --git a/src/loadsave.cc b/src/loadsave.cc index aa2ca5a6..a46a8787 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1709,23 +1709,23 @@ static void do_options(ls_flag_t flag) /*** Special info */ /* Read "delay_factor" */ - do_byte(&delay_factor, flag); + do_byte(&options->delay_factor, flag); /* Read "hitpoint_warn" */ - do_byte(&hitpoint_warn, flag); + do_byte(&options->hitpoint_warn, flag); /*** Cheating options ***/ do_bool(&wizard, flag); - do_bool(&cheat_peek, flag); - do_bool(&cheat_hear, flag); - do_bool(&cheat_room, flag); - do_bool(&cheat_xtra, flag); - do_bool(&cheat_live, flag); + do_bool(&options->cheat_peek, flag); + do_bool(&options->cheat_hear, flag); + do_bool(&options->cheat_room, flag); + do_bool(&options->cheat_xtra, flag); + do_bool(&options->cheat_live, flag); /*** Autosave options */ - do_bool(&autosave_l, flag); - do_bool(&autosave_t, flag); - do_s16b(&autosave_freq, flag); + do_bool(&options->autosave_l, flag); + do_bool(&options->autosave_t, flag); + do_s16b(&options->autosave_freq, flag); if (flag == ls_flag_t::LOAD) { @@ -1807,16 +1807,16 @@ static void do_options(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { /* Analyze the options */ - for (i = 0; option_info[i].o_desc; i++) + for (auto const &option: options->standard_options) { - int os = option_info[i].o_page; - int ob = option_info[i].o_bit; + int os = option.o_page; + int ob = option.o_bit; /* Process real entries */ - if (option_info[i].o_var) + if (option.o_var) { /* Set */ - if (*option_info[i].o_var) + if (*option.o_var) { /* Set */ option_flag[os] |= (1L << ob); diff --git a/src/melee2.cc b/src/melee2.cc index 91dfcaf2..49742a59 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -302,23 +302,22 @@ static void remove_bad_spells(int m_idx, monster_spell_flag_set *spells_p) /* Too stupid to know anything? */ auto const r_ptr = m_ptr->race(); - if (r_ptr->flags & RF_STUPID) return; - + if (r_ptr->flags & RF_STUPID) + { + return; + } /* Must be cheating or learning */ - if (!smart_learn) return; - - - /* Update acquired knowledge */ - if (smart_learn) + if (!options->smart_learn) { - /* Hack -- Occasionally forget player status */ - if (m_ptr->smart && magik(1)) m_ptr->smart = 0L; - - /* Use the memorized flags */ - smart = m_ptr->smart; + return; } + /* Hack -- Occasionally forget player status */ + if (m_ptr->smart && magik(1)) m_ptr->smart = 0L; + + /* Use the memorized flags */ + smart = m_ptr->smart; /* Nothing known */ if (!smart) return; @@ -897,7 +896,7 @@ static void monster_msg(cptr fmt, ...) void monster_msg_simple(cptr s) { /* Display */ - if (disturb_other) + if (options->disturb_other) { msg_print(s); } @@ -924,7 +923,7 @@ void cmonster_msg(char a, cptr fmt, ...) va_end(vp); /* Display */ - if (disturb_other) + if (options->disturb_other) cmsg_print(a, buf); else { @@ -3933,7 +3932,10 @@ static int mon_will_run(int m_idx) static bool_ get_fear_moves_aux(int m_idx, int *yp, int *xp) { /* Monster flowing disabled */ - if (!flow_by_sound) return (FALSE); + if (!options->flow_by_sound) + { + return (FALSE); + } /* Monster location */ monster_type *m_ptr = &m_list[m_idx]; @@ -4051,7 +4053,7 @@ static bool_ find_safety(int m_idx, int *yp, int *xp) if (distance(y, x, fy, fx) != d) continue; /* Check for "availability" (if monsters can flow) */ - if (flow_by_sound) + if (options->flow_by_sound) { /* Ignore grids very far from the player */ if (cave[y][x].when < cave[p_ptr->py][p_ptr->px].when) continue; @@ -4439,7 +4441,7 @@ static bool_ get_moves(int m_idx, int *mm) else { /* Attempt to avoid the player */ - if (flow_by_sound) + if (options->flow_by_sound) { /* Adjust movement */ (void)get_fear_moves_aux(m_idx, &y, &x); @@ -5846,7 +5848,10 @@ static void process_monster(int m_idx, bool_ is_frien) msg_print("You hear a door burst open!"); /* Disturb (sometimes) */ - if (disturb_minor) disturb(0); + if (options->disturb_minor) + { + disturb(0); + } /* The door was bashed open */ did_bash_door = TRUE; @@ -6127,12 +6132,12 @@ static void process_monster(int m_idx, bool_ is_frien) } /* Possible disturb */ - if (m_ptr->ml && (disturb_move || + if (m_ptr->ml && (options->disturb_move || ((m_ptr->mflag & (MFLAG_VIEW)) && - disturb_near))) + options->disturb_near))) { /* Disturb */ - if ((is_friend(m_ptr) < 0) || disturb_pets) + if ((is_friend(m_ptr) < 0) || options->disturb_pets) disturb(0); } @@ -6485,7 +6490,7 @@ void process_monsters(void) /* Hack -- Monsters can "smell" the player from far away */ /* Note that most monsters have "aaf" of "20" or so */ - else if (flow_by_sound && + else if (options->flow_by_sound && (cave[p_ptr->py][p_ptr->px].when == cave[fy][fx].when) && (cave[fy][fx].cost < MONSTER_FLOW_DEPTH) && (cave[fy][fx].cost < r_ptr->aaf)) diff --git a/src/monster2.cc b/src/monster2.cc index 4051a872..4eb6a618 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -476,7 +476,7 @@ void delete_monster_idx(int i) /* Hack -- efficiency */ o_ptr->held_m_idx = 0; - if (preserve) + if (options->preserve) { /* Hack -- Preserve unknown artifacts */ if (artifact_p(o_ptr) && !object_known_p(o_ptr)) @@ -1018,7 +1018,7 @@ s16b get_mon_num(int level) } /* Joke monsters allowed ? or not ? */ - if (!joke_monsters && (r_ptr->flags & RF_JOKEANGBAND)) continue; + if (!options->joke_monsters && (r_ptr->flags & RF_JOKEANGBAND)) continue; /* Some dungeon types restrict the possible monsters */ if (!summon_hack && !restrict_monster_to_dungeon(r_idx) && dun_level) continue; @@ -1745,9 +1745,12 @@ void update_mon(int m_idx, bool_ full) p_ptr->window |= (PW_M_LIST); /* Disturb on appearance */ - if (disturb_move) + if (options->disturb_move) { - if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1); + if (options->disturb_pets || (is_friend(m_ptr) <= 0)) + { + disturb(1); + } } } } @@ -1771,9 +1774,12 @@ void update_mon(int m_idx, bool_ full) p_ptr->window |= (PW_M_LIST); /* Disturb on disappearance*/ - if (disturb_move) + if (options->disturb_move) { - if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1); + if (options->disturb_pets || (is_friend(m_ptr) <= 0)) + { + disturb(1); + } } } } @@ -1798,9 +1804,12 @@ void update_mon(int m_idx, bool_ full) m_ptr->mflag |= (MFLAG_VIEW); /* Disturb on appearance */ - if (disturb_near) + if (options->disturb_near) { - if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1); + if (options->disturb_pets || (is_friend(m_ptr) <= 0)) + { + disturb(1); + } } } @@ -1819,9 +1828,12 @@ void update_mon(int m_idx, bool_ full) p_ptr->window |= (PW_M_LIST); /* Disturb on disappearance */ - if (disturb_near) + if (options->disturb_near) { - if (disturb_pets || (is_friend(m_ptr) <= 0)) disturb(1); + if (options->disturb_pets || (is_friend(m_ptr) <= 0)) + { + disturb(1); + } } } } @@ -2118,7 +2130,10 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) if (r_ptr->flags & RF_UNIQUE) { /* Message for cheaters */ - if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Unique (%s).", r_ptr->name); + if (options->cheat_hear || p_ptr->precognition) + { + msg_format("Deep Unique (%s).", r_ptr->name); + } /* Boost rating by twice delta-depth */ rating += (r_ptr->level - dun_level) * 2; @@ -2128,7 +2143,10 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) else { /* Message for cheaters */ - if ((cheat_hear) || (p_ptr->precognition)) msg_format("Deep Monster (%s).", r_ptr->name); + if (options->cheat_hear || p_ptr->precognition) + { + msg_format("Deep Monster (%s).", r_ptr->name); + } /* Boost rating by delta-depth */ rating += (r_ptr->level - dun_level); @@ -2139,7 +2157,10 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) else if (r_ptr->flags & RF_UNIQUE) { /* Unique monsters induce message */ - if ((cheat_hear) || (p_ptr->precognition)) msg_format("Unique (%s).", r_ptr->name); + if (options->cheat_hear || p_ptr->precognition) + { + msg_format("Unique (%s).", r_ptr->name); + } } @@ -2823,7 +2844,7 @@ bool_ alloc_monster(int dis, bool_ slp) if (!attempts_left) { - if (cheat_xtra || cheat_hear) + if (options->cheat_xtra || options->cheat_hear) { msg_print("Warning! Could not allocate a new monster. Small level?"); } @@ -2836,7 +2857,10 @@ bool_ alloc_monster(int dis, bool_ slp) { if (alloc_horde(y, x)) { - if ((cheat_hear) || (p_ptr->precognition)) msg_print("Monster horde."); + if (options->cheat_hear || p_ptr->precognition) + { + msg_print("Monster horde."); + } return (TRUE); } } @@ -3662,7 +3686,7 @@ void message_pain(int m_idx, int dam) void update_smart_learn(int m_idx, int what) { /* Not allowed to learn */ - if (!smart_learn) + if (!options->smart_learn) { return; } diff --git a/src/object1.cc b/src/object1.cc index b0760abe..5f4db047 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -5896,7 +5896,7 @@ void py_pickup_floor(int pickup) bool_ do_pickup = TRUE; /* Hack -- query every item */ - if (carry_query_flag || (!can_carry_heavy(&o_list[floor_o_idx]))) + if (options->carry_query_flag || !can_carry_heavy(&o_list[floor_o_idx])) { char o_name[80] = ""; object_desc(o_name, o_ptr, TRUE, 3); diff --git a/src/object2.cc b/src/object2.cc index 6185cc27..469a1ae0 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -387,7 +387,7 @@ void wipe_o_list(void) if (!o_ptr->k_idx) continue; /* Mega-Hack -- preserve artifacts */ - if (!character_dungeon || preserve) + if (!character_dungeon || options->preserve) { /* Hack -- Preserve unknown artifacts */ if (artifact_p(o_ptr) && !object_known_p(o_ptr)) @@ -2687,7 +2687,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) rating += 30; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } break; } @@ -2699,7 +2702,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) rating += 5; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } dragon_resist(o_ptr); } break; @@ -2712,7 +2718,10 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) rating += 5; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } dragon_resist(o_ptr); } break; @@ -2843,7 +2852,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) rating += 25; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } break; } @@ -3011,7 +3023,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) o_ptr->pval = 1 + m_bonus(3, level); /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } break; } @@ -3023,7 +3038,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) o_ptr->to_d = 1 + m_bonus(5, level); /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } break; } @@ -3113,7 +3131,10 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) rating += 25; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } break; } @@ -3394,7 +3415,10 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) /* Rating boost */ rating += 25; /* Mention the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } } break; case TV_POTION2: @@ -3944,7 +3968,10 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea k_ptr->artifact = TRUE; - if (cheat_peek || p_ptr->precognition) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } } return; @@ -4059,7 +4086,10 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea good_item_flag = TRUE; /* Cheat -- peek at the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } /* Spell in it? No! */ if (a_ptr->flags & TR_SPELL_CONTAIN) @@ -4219,7 +4249,10 @@ try_an_other_ego: } /* Cheat -- describe the item */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(o_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(o_ptr); + } } @@ -4773,7 +4806,10 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & rating += (k_info[j_ptr->k_idx].level - dun_level); /* Cheat -- peek at items */ - if ((cheat_peek) || (p_ptr->precognition)) object_mention(j_ptr); + if (options->cheat_peek || p_ptr->precognition) + { + object_mention(j_ptr); + } } /* Success */ @@ -4930,8 +4966,10 @@ bool_ make_gold(object_type *j_ptr) j_ptr->pval = (base + (8L * randint(base)) + randint(8)); /* Multiply value by 5 if selling is disabled */ - if (no_selling) + if (options->no_selling) + { j_ptr->pval *= 5; + } /* Success */ return (TRUE); diff --git a/src/options.cc b/src/options.cc index 1b0baccf..ea2f3172 100644 --- a/src/options.cc +++ b/src/options.cc @@ -1,102 +1,10 @@ #include "options.hpp" -// -// Option Set 1 -- User Interface -// -bool_ rogue_like_commands; /* Rogue-like commands */ -bool_ quick_messages; /* Activate quick messages */ -bool_ carry_query_flag; /* Prompt before picking things up */ -bool_ use_old_target; /* Use old target by default */ -bool_ always_pickup; /* Pick things up by default */ -bool_ always_repeat; /* Repeat obvious commands */ -bool_ ring_bell; /* Ring the bell (on errors, etc) */ - -// -// Option Set 2 -- Disturbance -// -bool_ find_ignore_stairs; /* Run past stairs */ -bool_ find_ignore_doors; /* Run through open doors */ -bool_ find_cut; /* Run past known corners */ -bool_ find_examine; /* Run into potential corners */ -bool_ disturb_move; /* Disturb whenever any monster moves */ -bool_ disturb_near; /* Disturb whenever viewable monster moves */ -bool_ disturb_panel; /* Disturb whenever map panel changes */ -bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */ -bool_ disturb_state; /* Disturn whenever player state changes */ -bool_ disturb_minor; /* Disturb whenever boring things happen */ -bool_ disturb_other; /* Disturb whenever various things happen */ -bool_ last_words; /* Get last words upon dying */ -bool_ small_levels; /* Allow unusually small dungeon levels */ -bool_ empty_levels; /* Allow empty 'arena' levels */ -bool_ confirm_stairs; /* Prompt before staircases... */ -bool_ wear_confirm; /* Confirm before putting on known cursed items */ -bool_ disturb_pets; /* Pets moving nearby disturb us */ - -// -// Option Set 3 -- Game-Play -// -bool_ auto_scum; /* Auto-scum for good levels */ -bool_ view_perma_grids; /* Map remembers all perma-lit grids */ -bool_ view_torch_grids; /* Map remembers all torch-lit grids */ -bool_ dungeon_align; /* Generate dungeons with aligned rooms */ -bool_ dungeon_stair; /* Generate dungeons with connected stairs */ -bool_ flow_by_sound; /* Monsters track new player location */ -bool_ smart_learn; /* Monsters learn from their mistakes */ - -// -// Option Set 4 -- Efficiency -// -bool_ view_reduce_lite; /* Reduce lite-radius when running */ -bool_ avoid_abort; /* Avoid checking for user abort */ -bool_ avoid_shimmer; /* Avoid processing extra shimmering */ -bool_ avoid_other; /* Avoid processing special colors */ -bool_ flush_failure; /* Flush input on any failure */ -bool_ flush_disturb; /* Flush input on disturbance */ -bool_ flush_command; /* Flush input before every command */ -bool_ fresh_before; /* Flush output before normal commands */ -bool_ fresh_after; /* Flush output after normal commands */ -bool_ fresh_message; /* Flush output after all messages */ -bool_ hilite_player; /* Hilite the player with the cursor */ -bool_ view_yellow_lite; /* Use special colors for torch-lit grids */ -bool_ view_bright_lite; /* Use special colors for 'viewable' grids */ -bool_ view_granite_lite; /* Use special colors for wall grids (slow) */ -bool_ view_special_lite; /* Use special colors for floor grids (slow) */ -bool_ center_player; /* Center view on player */ - -// -// Option Set 5 - ToME options -// -bool_ linear_stats; -bool_ player_char_health; /* Display the player as a special symbol when in bad health ? */ -bool_ option_ingame_help; /* Ingame contextual help */ -bool_ auto_more; /* Auto more */ - -// -// Option Set 6 - Birth options -// -bool_ always_small_level; -bool_ autoroll; -bool_ fate_option; -bool_ ironman_rooms; -bool_ joke_monsters; -bool_ point_based; -bool_ preserve; -bool_ no_selling; - -// -// Other options -// - -bool_ cheat_peek; /* Peek into object creation */ -bool_ cheat_hear; /* Peek into monster creation */ -bool_ cheat_room; /* Peek into dungeon creation */ -bool_ cheat_xtra; /* Peek into something else */ -bool_ cheat_live; /* Allow player to avoid death */ - -byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ - -byte delay_factor; /* Delay factor (0 to 9) */ - -s16b autosave_freq; /* Autosave frequency */ -bool_ autosave_t; /* Timed autosave */ -bool_ autosave_l; /* Autosave before entering new levels */ +void options::reset_cheat_options() +{ + cheat_peek = FALSE; + cheat_hear = FALSE; + cheat_room = FALSE; + cheat_xtra = FALSE; + cheat_live = FALSE; +} diff --git a/src/options.hpp b/src/options.hpp index 940f9a6c..a1b125a0 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -1,103 +1,217 @@ #pragma once #include "h-basic.h" +#include "option_type.hpp" -// -// Option Set 1 -- User Interface. -// -extern bool_ rogue_like_commands; -extern bool_ quick_messages; -extern bool_ carry_query_flag; -extern bool_ use_old_target; -extern bool_ always_pickup; -extern bool_ always_repeat; -extern bool_ ring_bell; - -// -// Option Set 2 -- Disturbance -// -extern bool_ find_ignore_stairs; -extern bool_ find_ignore_doors; -extern bool_ find_cut; -extern bool_ find_examine; -extern bool_ disturb_move; -extern bool_ disturb_near; -extern bool_ disturb_panel; -extern bool_ disturb_detect; -extern bool_ disturb_state; -extern bool_ disturb_minor; -extern bool_ disturb_other; -extern bool_ last_words; -extern bool_ small_levels; -extern bool_ empty_levels; -extern bool_ confirm_stairs; -extern bool_ wear_confirm; -extern bool_ disturb_pets; - -// -// Option Set 3 -- Game-Play -// -extern bool_ auto_scum; -extern bool_ view_perma_grids; -extern bool_ view_torch_grids; -extern bool_ dungeon_align; -extern bool_ dungeon_stair; -extern bool_ flow_by_sound; -extern bool_ smart_learn; - -// -// Option Set 4 -- Efficiency -// -extern bool_ view_reduce_lite; -extern bool_ avoid_abort; -extern bool_ avoid_shimmer; -extern bool_ avoid_other; -extern bool_ flush_failure; -extern bool_ flush_disturb; -extern bool_ flush_command; -extern bool_ fresh_before; -extern bool_ fresh_after; -extern bool_ fresh_message; -extern bool_ hilite_player; -extern bool_ view_yellow_lite; -extern bool_ view_bright_lite; -extern bool_ view_granite_lite; -extern bool_ view_special_lite; -extern bool_ center_player; - -// -// Option Set 5 - ToME options -// -extern bool_ linear_stats; -extern bool_ player_char_health; -extern bool_ option_ingame_help; -extern bool_ auto_more; - -// -// Option Set 6 - Birth options -// -extern bool_ always_small_level; -extern bool_ autoroll; -extern bool_ fate_option; -extern bool_ ironman_rooms; -extern bool_ joke_monsters; -extern bool_ point_based; -extern bool_ preserve; -extern bool_ no_selling; - -// -// Other options -// -extern bool_ cheat_peek; -extern bool_ cheat_hear; -extern bool_ cheat_room; -extern bool_ cheat_xtra; -extern bool_ cheat_live; - -extern byte hitpoint_warn; - -extern byte delay_factor; - -extern s16b autosave_freq; -extern bool_ autosave_t; -extern bool_ autosave_l; +#include + +/** + * Game options accessible via the '=' menu. + */ +struct options { + + // + // Option Set 1 -- User Interface + // + bool_ rogue_like_commands; /* Rogue-like commands */ + bool_ quick_messages; /* Activate quick messages */ + bool_ carry_query_flag; /* Prompt before picking things up */ + bool_ use_old_target; /* Use old target by default */ + bool_ always_pickup; /* Pick things up by default */ + bool_ always_repeat; /* Repeat obvious commands */ + bool_ ring_bell; /* Ring the bell (on errors, etc) */ + + // + // Option Set 2 -- Disturbance + // + bool_ find_ignore_stairs; /* Run past stairs */ + bool_ find_ignore_doors; /* Run through open doors */ + bool_ find_cut; /* Run past known corners */ + bool_ find_examine; /* Run into potential corners */ + bool_ disturb_move; /* Disturb whenever any monster moves */ + bool_ disturb_near; /* Disturb whenever viewable monster moves */ + bool_ disturb_panel; /* Disturb whenever map panel changes */ + bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */ + bool_ disturb_state; /* Disturn whenever player state changes */ + bool_ disturb_minor; /* Disturb whenever boring things happen */ + bool_ disturb_other; /* Disturb whenever various things happen */ + bool_ last_words; /* Get last words upon dying */ + bool_ small_levels; /* Allow unusually small dungeon levels */ + bool_ empty_levels; /* Allow empty 'arena' levels */ + bool_ confirm_stairs; /* Prompt before staircases... */ + bool_ wear_confirm; /* Confirm before putting on known cursed items */ + bool_ disturb_pets; /* Pets moving nearby disturb us */ + + // + // Option Set 3 -- Game-Play + // + bool_ auto_scum; /* Auto-scum for good levels */ + bool_ view_perma_grids; /* Map remembers all perma-lit grids */ + bool_ view_torch_grids; /* Map remembers all torch-lit grids */ + bool_ dungeon_align; /* Generate dungeons with aligned rooms */ + bool_ dungeon_stair; /* Generate dungeons with connected stairs */ + bool_ flow_by_sound; /* Monsters track new player location */ + bool_ smart_learn; /* Monsters learn from their mistakes */ + + // + // Option Set 4 -- Efficiency + // + bool_ view_reduce_lite; /* Reduce lite-radius when running */ + bool_ avoid_abort; /* Avoid checking for user abort */ + bool_ avoid_shimmer; /* Avoid processing extra shimmering */ + bool_ avoid_other; /* Avoid processing special colors */ + bool_ flush_failure; /* Flush input on any failure */ + bool_ flush_disturb; /* Flush input on disturbance */ + bool_ flush_command; /* Flush input before every command */ + bool_ fresh_before; /* Flush output before normal commands */ + bool_ fresh_after; /* Flush output after normal commands */ + bool_ fresh_message; /* Flush output after all messages */ + bool_ hilite_player; /* Hilite the player with the cursor */ + bool_ view_yellow_lite; /* Use special colors for torch-lit grids */ + bool_ view_bright_lite; /* Use special colors for 'viewable' grids */ + bool_ view_granite_lite; /* Use special colors for wall grids (slow) */ + bool_ view_special_lite; /* Use special colors for floor grids (slow) */ + bool_ center_player; /* Center view on player */ + + // + // Option Set 5 - ToME options + // + bool_ linear_stats; + bool_ player_char_health; /* Display the player as a special symbol when in bad health ? */ + bool_ ingame_help; /* In-game contextual help? */ + bool_ auto_more; /* Auto more */ + + // + // Option Set 6 - Birth options + // + bool_ always_small_level; + bool_ autoroll; + bool_ fate_option; + bool_ ironman_rooms; + bool_ joke_monsters; + bool_ point_based; + bool_ preserve; + bool_ no_selling; + + // + // Other options + // + + bool_ cheat_peek; /* Peek into object creation */ + bool_ cheat_hear; /* Peek into monster creation */ + bool_ cheat_room; /* Peek into dungeon creation */ + bool_ cheat_xtra; /* Peek into something else */ + bool_ cheat_live; /* Allow player to avoid death */ + + byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ + + byte delay_factor; /* Delay factor (0 to 9) */ + + s16b autosave_freq; /* Autosave frequency */ + bool_ autosave_t; /* Timed autosave */ + bool_ autosave_l; /* Autosave before entering new levels */ + + /** + * Option groups + */ + std::vector standard_options = { + // User-Interface + { &rogue_like_commands, FALSE, 1, 0, "rogue_like_commands", "Rogue-like commands" }, + { &quick_messages , TRUE , 1, 1, "quick_messages" , "Activate quick messages" }, + { &carry_query_flag , FALSE, 1, 3, "carry_query_flag" , "Prompt before picking things up" }, + { &use_old_target , FALSE, 1, 4, "use_old_target" , "Use old target by default" }, + { &always_pickup , FALSE, 1, 5, "always_pickup" , "Pick things up by default" }, + { &always_repeat , TRUE , 1, 7, "always_repeat" , "Repeat obvious commands" }, + { &ring_bell , FALSE, 1, 18, "ring_bell" , "Audible bell (on errors, etc)" }, + // Disturbance + { &find_ignore_stairs , FALSE, 2, 0, "find_ignore_stairs" , "Run past stairs" }, + { &find_ignore_doors , TRUE , 2, 1, "find_ignore_doors" , "Run through open doors" }, + { &find_cut , FALSE, 2, 2, "find_cut" , "Run past known corners" }, + { &find_examine , TRUE , 2, 3, "find_examine" , "Run into potential corners" }, + { &disturb_move , FALSE, 2, 4, "disturb_move" , "Disturb whenever any monster moves" }, + { &disturb_near , TRUE , 2, 5, "disturb_near" , "Disturb whenever viewable monster moves" }, + { &disturb_panel , TRUE , 2, 6, "disturb_panel" , "Disturb whenever map panel changes" }, + { &disturb_detect , TRUE , 2, 21, "disturb_detect" , "Disturb whenever leaving trap-detected area" }, + { &disturb_state , TRUE , 2, 7, "disturb_state" , "Disturb whenever player state changes" }, + { &disturb_minor , TRUE , 2, 8, "disturb_minor" , "Disturb whenever boring things happen" }, + { &disturb_other , FALSE, 2, 9, "disturb_other" , "Disturb whenever random things happen" }, + { &last_words , TRUE , 2, 12, "last_words" , "Get last words when the character dies" }, + { &wear_confirm , TRUE , 2, 15, "confirm_wear" , "Confirm to wear/wield known cursed items" }, + { &confirm_stairs , FALSE, 2, 16, "confirm_stairs" , "Prompt before exiting a dungeon level" }, + { &disturb_pets , FALSE, 2, 17, "disturb_pets" , "Disturb when visible pets move" }, + // Game-Play + { &auto_scum , TRUE , 3, 1, "auto_scum" , "Auto-scum for good levels" }, + { &view_perma_grids , TRUE , 3, 6, "view_perma_grids" , "Map remembers all perma-lit grids" }, + { &view_torch_grids , FALSE, 3, 7, "view_torch_grids" , "Map remembers all torch-lit grids" }, + { &dungeon_align , TRUE , 3, 8, "dungeon_align" , "Generate dungeons with aligned rooms" }, + { &dungeon_stair , TRUE , 3, 9, "dungeon_stair" , "Generate dungeons with connected stairs" }, + { &flow_by_sound , FALSE, 3, 10, "flow_by_sound" , "Monsters chase current location (v.slow)" }, + { &smart_learn , FALSE, 3, 14, "smart_learn" , "Monsters learn from their mistakes" }, + { &small_levels , TRUE , 3, 17, "small_levels" , "Allow unusually small dungeon levels" }, + { &empty_levels , TRUE , 3, 18, "empty_levels" , "Allow empty 'arena' levels" }, + // Efficiency + { &view_reduce_lite , FALSE, 4, 0, "view_reduce_lite" , "Reduce lite-radius when running" }, + { &avoid_abort , FALSE, 4, 2, "avoid_abort" , "Avoid checking for user abort" }, + { &avoid_shimmer , FALSE, 4, 17, "avoid_shimmer" , "Avoid extra shimmering (fast)" }, + { &avoid_other , FALSE, 4, 3, "avoid_other" , "Avoid processing special colors (fast)" }, + { &flush_failure , TRUE , 4, 4, "flush_failure" , "Flush input on various failures" }, + { &flush_disturb , FALSE, 4, 5, "flush_disturb" , "Flush input whenever disturbed" }, + { &flush_command , FALSE, 4, 6, "flush_command" , "Flush input before every command" }, + { &fresh_before , TRUE , 4, 7, "fresh_before" , "Flush output before every command" }, + { &fresh_after , FALSE, 4, 8, "fresh_after" , "Flush output after every command" }, + { &fresh_message , FALSE, 4, 9, "fresh_message" , "Flush output after every message" }, + { &hilite_player , FALSE, 4, 11, "hilite_player" , "Hilite the player with the cursor" }, + { &view_yellow_lite , FALSE, 4, 12, "view_yellow_lite" , "Use special colors for torch-lit grids" }, + { &view_bright_lite , FALSE, 4, 13, "view_bright_lite" , "Use special colors for 'viewable' grids" }, + { &view_granite_lite , FALSE, 4, 14, "view_granite_lite" , "Use special colors for wall grids (slow)" }, + { &view_special_lite , FALSE, 4, 15, "view_special_lite" , "Use special colors for floor grids (slow)" }, + { ¢er_player , FALSE, 4, 16, "center_player" , "Center the view on the player (very slow)" }, + // ToME options + { &ingame_help , TRUE , 5, 1, "ingame_help" , "Ingame contextual help" }, + { &auto_more , FALSE, 5, 4, "auto_more" , "Automatically clear '-more-' prompts" }, + { &player_char_health , TRUE , 5, 6, "player_char_health" , "Player char represent his/her health" }, + { &linear_stats , TRUE , 5, 7, "linear_stats" , "Stats are represented in a linear way" }, + // Birth Options + { &preserve , TRUE , 6, 2, "preserve" , "Preserve artifacts" }, + { &autoroll , TRUE , 6, 3, "autoroll" , "Specify 'minimal' stats" }, + { &point_based , FALSE, 6, 17, "point_based" , "Generate character using a point system" }, + { &ironman_rooms , FALSE, 6, 6, "ironman_rooms" , "Always generate very unusual rooms" }, + { &joke_monsters , FALSE, 6, 14, "joke_monsters" , "Allow use of some 'joke' monsters" }, + { &always_small_level , FALSE, 6, 16, "always_small_level" , "Always make small levels" }, + { &fate_option , TRUE , 6, 18, "fate_option" , "You can receive fates, good or bad" }, + { &no_selling , FALSE, 6, 20, "no_selling" , "Items always sell for 0 gold" }, + }; + + /* + * Cheating options + */ + std::vector cheat_options = { + { &cheat_peek, FALSE, 0, 0, "cheat_peek", "Peek into object creation" }, + { &cheat_hear, FALSE, 0, 1, "cheat_hear", "Peek into monster creation" }, + { &cheat_room, FALSE, 0, 2, "cheat_room", "Peek into dungeon creation" }, + { &cheat_xtra, FALSE, 0, 3, "cheat_xtra", "Peek into something else" }, + { &cheat_live, FALSE, 0, 5, "cheat_live", "Allow player to avoid death" }, + }; + + /** + * Autosave boolean options + */ + std::vector autosave_options { + { &autosave_l, FALSE, 0, 6, "autosave_l", "Autosave when entering new levels" }, + { &autosave_t, FALSE, 0, 7, "autosave_t", "Timed autosave" } + }; + + /* + * Reset cheat options + */ + void reset_cheat_options(); + + /** + * Convert delay_factor to milliseconds + */ + int delay_factor_ms() const + { + return delay_factor * delay_factor * delay_factor; + } + +}; diff --git a/src/q_ultrag.cc b/src/q_ultrag.cc index fcee52a2..a5b56f3f 100644 --- a/src/q_ultrag.cc +++ b/src/q_ultrag.cc @@ -29,14 +29,14 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) if (cquest.status == QUEST_STATUS_UNTAKEN) { - bool_ old_quick_messages = quick_messages; - if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED) return (FALSE); /* The mirror of Galadriel */ if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) return (FALSE); - quick_messages = FALSE; + auto old_quick_messages = options->quick_messages; + options->quick_messages = FALSE; + cmsg_print(TERM_L_BLUE, "You meet Galadriel."); cmsg_print(TERM_YELLOW, "'I still cannot believe this is all over.'"); cmsg_print(TERM_YELLOW, "'Morgoth's reign of terror is over at last!'"); @@ -82,7 +82,8 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_TAKEN; cquest.init(QUEST_ULTRA_GOOD); } - quick_messages = old_quick_messages; + + options->quick_messages = old_quick_messages; return TRUE; } diff --git a/src/randart.cc b/src/randart.cc index e22f1c93..f7ea95f3 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -341,7 +341,10 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) TR_IGNORE_COLD; total_flags = flag_cost(o_ptr, o_ptr->pval); - if (cheat_peek) msg_format("%ld", total_flags); + if (options->cheat_peek) + { + msg_format("%ld", total_flags); + } if (a_cursed) curse_artifact(o_ptr); diff --git a/src/spells1.cc b/src/spells1.cc index 93602d13..7cedf83b 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1237,7 +1237,7 @@ void take_hit(int damage, cptr hit_from) char death_message[80]; - int warning = (p_ptr->mhp * hitpoint_warn / 10); + int warning = (p_ptr->mhp * options->hitpoint_warn / 10); int percent; /* Paranoia */ @@ -1325,7 +1325,7 @@ void take_hit(int damage, cptr hit_from) if (((!has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD)))) { /* Hack -- Note death */ - if (!last_words) + if (!options->last_words) { cmsg_print(TERM_RED, "You die."); msg_print(NULL); @@ -1461,8 +1461,10 @@ void take_hit(int damage, cptr hit_from) } } - if (player_char_health) + if (options->player_char_health) + { lite_spot(p_ptr->py, p_ptr->px); + } } @@ -1473,7 +1475,7 @@ void take_sanity_hit(int damage, cptr hit_from) char death_message[80]; - int warning = (p_ptr->msane * hitpoint_warn / 10); + int warning = (p_ptr->msane * options->hitpoint_warn / 10); /* Paranoia */ @@ -1497,7 +1499,7 @@ void take_sanity_hit(int damage, cptr hit_from) { /* Hack -- Note death */ cmsg_print(TERM_VIOLET, "You turn into an unthinking vegetable."); - if (!last_words) + if (!options->last_words) { cmsg_print(TERM_RED, "You die."); msg_print(NULL); @@ -8035,7 +8037,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) int y_saver, x_saver; /* For reflecting monsters */ - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); /* Assume the player sees nothing */ bool_ notice = FALSE; @@ -8190,10 +8192,16 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) /* Visual effects */ print_rel(c, a, y, x); move_cursor_relative(y, x); - if (fresh_before) Term_fresh(); + if (options->fresh_before) + { + Term_fresh(); + } sleep_for(milliseconds(msec)); lite_spot(y, x); - if (fresh_before) Term_fresh(); + if (options->fresh_before) + { + Term_fresh(); + } /* Display "beam" grids */ if (flg & (PROJECT_BEAM)) @@ -8330,7 +8338,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) move_cursor_relative(y2, x2); /* Flush each "radius" seperately */ - if (fresh_before) Term_fresh(); + if (options->fresh_before) Term_fresh(); /* Delay (efficiently) */ if (visual || drawn) @@ -8360,7 +8368,7 @@ bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg) move_cursor_relative(y2, x2); /* Flush the explosion */ - if (fresh_before) Term_fresh(); + if (options->fresh_before) Term_fresh(); } } diff --git a/src/spells2.cc b/src/spells2.cc index 5fd21698..bfd513e6 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -3938,7 +3938,7 @@ bool_ genocide_aux(bool_ player_cast, char typ) { int i; bool_ result = FALSE; - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); int dam = 0; /* Delete the monsters of that "type" */ @@ -4055,13 +4055,11 @@ bool_ mass_genocide(bool_ player_cast) { int i; bool_ result = FALSE; - int msec = delay_factor * delay_factor * delay_factor; + auto const msec = options->delay_factor_ms(); int dam = 0; - if (dungeon_flags & DF_NO_GENO) return (FALSE); - - /* Hack -- when you are fated to die, you cant cheat :) */ - if (dungeon_type == DUNGEON_DEATH) + /* Prevented? */ + if ((dungeon_flags & DF_NO_GENO) || (dungeon_type == DUNGEON_DEATH)) { msg_print("A mysterious force stops the genocide."); return FALSE; diff --git a/src/store.cc b/src/store.cc index 64b75c3e..dd7aa484 100644 --- a/src/store.cc +++ b/src/store.cc @@ -300,7 +300,7 @@ static s32b price_item(object_type *o_ptr, int greed, bool_ flip) if (st_info[st_ptr->st_idx].flags & STF_ALL_ITEM) price = price / 2; /* No selling means you get no money */ - if (no_selling) price = 0; + if (options->no_selling) price = 0; } /* Shop is selling */ @@ -454,7 +454,7 @@ static void mass_produce(object_type *o_ptr) if (o_ptr->art_name) { - if (cheat_peek && discount) + if (options->cheat_peek && discount) { msg_print("No discount on random artifacts."); } @@ -1704,7 +1704,7 @@ static bool_ prompt_yesno(cptr prompt) } /* Any other key must be in the allowed set to break the loop. */ - if ((strchr(allowed, key) != NULL) || quick_messages) { + if ((strchr(allowed, key) != NULL) || options->quick_messages) { /* Check for presence in the 'yes' set */ ret = (strchr(yes, key) != NULL); break; diff --git a/src/tables.cc b/src/tables.cc index 509a8ce9..de8215da 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -1238,220 +1238,6 @@ cptr window_flag_desc[32] = }; -/* - * Available Options - * - * Option Screen Sets: - * - * Set 1: User Interface - * Set 2: Disturbance - * Set 3: Inventory - * Set 4: Game Play - * Set 5: ToME - * Set 6: Birth - * - * Note that bits 28-31 of set 0 are currently unused. - */ -option_type option_info[] = -{ - /*** User-Interface ***/ - - { &rogue_like_commands, FALSE, 1, 0, - "rogue_like_commands", "Rogue-like commands" }, - - { &quick_messages, TRUE, 1, 1, - "quick_messages", "Activate quick messages" }, - - { &carry_query_flag, FALSE, 1, 3, - "carry_query_flag", "Prompt before picking things up" }, - - { &use_old_target, FALSE, 1, 4, - "use_old_target", "Use old target by default" }, - - { &always_pickup, FALSE, 1, 5, - "always_pickup", "Pick things up by default" }, - - { &always_repeat, TRUE, 1, 7, - "always_repeat", "Repeat obvious commands" }, - - { &ring_bell, FALSE, 1, 18, - "ring_bell", "Audible bell (on errors, etc)" }, - /* Changed to default to FALSE -- it's so extremely annoying!!! -TY */ - - /*** Disturbance ***/ - - { &find_ignore_stairs, FALSE, 2, 0, - "find_ignore_stairs", "Run past stairs" }, - - { &find_ignore_doors, TRUE, 2, 1, - "find_ignore_doors", "Run through open doors" }, - - { &find_cut, FALSE, 2, 2, - "find_cut", "Run past known corners" }, - - { &find_examine, TRUE, 2, 3, - "find_examine", "Run into potential corners" }, - - { &disturb_move, FALSE, 2, 4, - "disturb_move", "Disturb whenever any monster moves" }, - - { &disturb_near, TRUE, 2, 5, - "disturb_near", "Disturb whenever viewable monster moves" }, - - { &disturb_panel, TRUE, 2, 6, - "disturb_panel", "Disturb whenever map panel changes" }, - - { &disturb_detect, TRUE, 2, 21, - "disturb_detect", "Disturb whenever leaving trap-detected area" }, - - { &disturb_state, TRUE, 2, 7, - "disturb_state", "Disturb whenever player state changes" }, - - { &disturb_minor, TRUE, 2, 8, - "disturb_minor", "Disturb whenever boring things happen" }, - - { &disturb_other, FALSE, 2, 9, - "disturb_other", "Disturb whenever random things happen" }, - - { &last_words, TRUE, 2, 12, - "last_words", "Get last words when the character dies" }, - - { &wear_confirm, TRUE, 2, 15, - "confirm_wear", "Confirm to wear/wield known cursed items" }, - - { &confirm_stairs, FALSE, 2, 16, - "confirm_stairs", "Prompt before exiting a dungeon level" }, - - { &disturb_pets, FALSE, 2, 17, - "disturb_pets", "Disturb when visible pets move" }, - - /*** Game-Play ***/ - - { &auto_scum, TRUE, 3, 1, - "auto_scum", "Auto-scum for good levels" }, - - { &view_perma_grids, TRUE, 3, 6, - "view_perma_grids", "Map remembers all perma-lit grids" }, - - { &view_torch_grids, FALSE, 3, 7, - "view_torch_grids", "Map remembers all torch-lit grids" }, - - { &dungeon_align, TRUE, 3, 8, - "dungeon_align", "Generate dungeons with aligned rooms" }, - - { &dungeon_stair, TRUE, 3, 9, - "dungeon_stair", "Generate dungeons with connected stairs" }, - - { &flow_by_sound, FALSE, 3, 10, - "flow_by_sound", "Monsters chase current location (v.slow)" }, - - { &smart_learn, FALSE, 3, 14, - "smart_learn", "Monsters learn from their mistakes" }, - - { &small_levels, TRUE, 3, 17, - "small_levels", "Allow unusually small dungeon levels" }, - - { &empty_levels, TRUE, 3, 18, - "empty_levels", "Allow empty 'arena' levels" }, - - /*** Efficiency ***/ - - { &view_reduce_lite, FALSE, 4, 0, - "view_reduce_lite", "Reduce lite-radius when running" }, - - { &avoid_abort, FALSE, 4, 2, - "avoid_abort", "Avoid checking for user abort" }, - - { &avoid_shimmer, FALSE, 4, 17, - "avoid_shimmer", "Avoid extra shimmering (fast)" }, - - { &avoid_other, FALSE, 4, 3, - "avoid_other", "Avoid processing special colors (fast)" }, - - { &flush_failure, TRUE, 4, 4, - "flush_failure", "Flush input on various failures" }, - - { &flush_disturb, FALSE, 4, 5, - "flush_disturb", "Flush input whenever disturbed" }, - - { &flush_command, FALSE, 4, 6, - "flush_command", "Flush input before every command" }, - - { &fresh_before, TRUE, 4, 7, - "fresh_before", "Flush output before every command" }, - - { &fresh_after, FALSE, 4, 8, - "fresh_after", "Flush output after every command" }, - - { &fresh_message, FALSE, 4, 9, - "fresh_message", "Flush output after every message" }, - - { &hilite_player, FALSE, 4, 11, - "hilite_player", "Hilite the player with the cursor" }, - - { &view_yellow_lite, FALSE, 4, 12, - "view_yellow_lite", "Use special colors for torch-lit grids" }, - - { &view_bright_lite, FALSE, 4, 13, - "view_bright_lite", "Use special colors for 'viewable' grids" }, - - { &view_granite_lite, FALSE, 4, 14, - "view_granite_lite", "Use special colors for wall grids (slow)" }, - - { &view_special_lite, FALSE, 4, 15, - "view_special_lite", "Use special colors for floor grids (slow)" }, - - { ¢er_player, FALSE, 4, 16, - "center_player", "Center the view on the player (very slow)" }, - - /*** ToME options ***/ - - { &option_ingame_help, TRUE, 5, 1, - "ingame_help", "Ingame contextual help" }, - - { &auto_more, FALSE, 5, 4, - "auto_more", "Automatically clear '-more-' prompts" }, - - { &player_char_health, TRUE, 5, 6, - "player_char_health", "Player char represent his/her health" }, - - { &linear_stats, TRUE, 5, 7, - "linear_stats", "Stats are represented in a linear way" }, - - /*** Birth Options ***/ - - { &preserve, TRUE, 6, 2, - "preserve", "Preserve artifacts" }, - - { &autoroll, TRUE, 6, 3, - "autoroll", "Specify 'minimal' stats" }, - - { &point_based, FALSE, 6, 17, - "point_based", "Generate character using a point system" }, - - { &ironman_rooms, FALSE, 6, 6, - "ironman_rooms", "Always generate very unusual rooms" }, - - { &joke_monsters, FALSE, 6, 14, - "joke_monsters", "Allow use of some 'joke' monsters" }, - - { &always_small_level, FALSE, 6, 16, - "always_small_level", "Always make small levels" }, - - { &fate_option, TRUE, 6, 18, - "fate_option", "You can receive fates, good or bad" }, - - { &no_selling, FALSE, 6, 20, - "no_selling", "Items always sell for 0 gold" }, - - /*** End of Table ***/ - - { NULL, 0, 0, 0, - NULL, NULL } -}; - - - /* Names used for random artifact name generation */ cptr artifact_names_list = "adanedhel\n" diff --git a/src/tables.hpp b/src/tables.hpp index aafbb763..ab4fd00c 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -54,7 +54,6 @@ extern cptr color_names[16]; extern cptr stat_names[6]; extern cptr stat_names_reduced[6]; extern cptr window_flag_desc[32]; -extern option_type option_info[]; extern martial_arts bear_blows[MAX_BEAR]; extern martial_arts ma_blows[MAX_MA]; extern magic_power mindcraft_powers[MAX_MINDCRAFT_POWERS]; diff --git a/src/util.cc b/src/util.cc index d1bc6bbd..b393c610 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1225,7 +1225,7 @@ void flush(void) */ void flush_on_failure() { - if (flush_failure) + if (options->flush_failure) { flush(); } @@ -1241,7 +1241,7 @@ void bell(void) Term_fresh(); /* Make a bell noise (if allowed) */ - if (ring_bell) + if (options->ring_bell) { Term_bell(); } @@ -1506,7 +1506,7 @@ static char inkey_real(bool_ inkey_scan) (void)Term_get_cursor(&v); /* Show the cursor if waiting, except sometimes in "command" mode */ - if (!inkey_scan && (!inkey_flag || hilite_player || character_icky)) + if (!inkey_scan && (!inkey_flag || options->hilite_player || character_icky)) { /* Show the cursor */ (void)Term_set_cursor(1); @@ -1598,7 +1598,7 @@ static char inkey_real(bool_ inkey_scan) /* Handle "control-right-bracket" */ - if ((ch == 29) || ((!rogue_like_commands) && (ch == KTRL('D')))) + if ((ch == 29) || ((!options->rogue_like_commands) && (ch == KTRL('D')))) { /* Strip this key */ ch = 0; @@ -1691,7 +1691,7 @@ static void msg_flush(int x) while (1) { int cmd = inkey(); - if (quick_messages) break; + if (options->quick_messages) break; if ((cmd == ESCAPE) || (cmd == ' ')) break; if ((cmd == '\n') || (cmd == '\r')) break; bell(); @@ -1801,7 +1801,7 @@ void cmsg_print(byte color, cptr msg) if (character_generated) message_add(msg, color); /* Handle "auto_more" */ - if (auto_more) + if (options->auto_more) { /* Window stuff */ p_ptr->window |= (PW_MESSAGE); @@ -1883,7 +1883,7 @@ void cmsg_print(byte color, cptr msg) p += n + 1; /* Optional refresh */ - if (fresh_message) Term_fresh(); + if (options->fresh_message) Term_fresh(); } /* Hack -- for compatibility and easy sake */ @@ -2546,7 +2546,7 @@ bool_ get_check(cptr prompt) while (TRUE) { i = inkey(); - if (quick_messages) break; + if (options->quick_messages) break; if (i == ESCAPE) break; if (strchr("YyNn", i)) break; bell(); @@ -2955,7 +2955,7 @@ void request_command(int shopping) } /* Hack -- Auto-repeat certain commands */ - if (always_repeat && (command_arg <= 0)) + if (options->always_repeat && (command_arg <= 0)) { /* Hack -- auto repeat certain commands */ if (strchr("TBDoc+", command_cmd)) @@ -3265,7 +3265,10 @@ void get_count(int number, int max) command_arg = number; /* Hack -- Optional flush */ - if (flush_command) flush(); + if (options->flush_command) + { + flush(); + } /* Clear top line */ prt("", 0, 0); @@ -3626,7 +3629,7 @@ timer_type *new_timer(void (*callback)(), s32b delay) int get_keymap_mode() { - if (rogue_like_commands) + if (options->rogue_like_commands) { return KEYMAP_MODE_ROGUE; } diff --git a/src/variable.cc b/src/variable.cc index fd8ccd40..9bb78ca9 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -142,6 +142,11 @@ void (*text_out_hook)(byte a, cptr str) = text_out_to_screen; int text_out_indent = 0; +/* + * Options + */ +struct options *options = nullptr; + /* * Dungeon variables */ diff --git a/src/variable.hpp b/src/variable.hpp index 854b88c0..e16eae93 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -20,6 +20,7 @@ #include "monster_type_fwd.hpp" #include "object_kind_fwd.hpp" #include "object_type_fwd.hpp" +#include "options.hpp" #include "owner_type_fwd.hpp" #include "player_class_fwd.hpp" #include "player_defs.hpp" @@ -289,3 +290,4 @@ extern hist_type *bg; extern bool_ arg_wizard; extern bool_ arg_force_original; extern bool_ arg_force_roguelike; +extern struct options *options; diff --git a/src/wild.cc b/src/wild.cc index d928b4a3..2d751b17 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -516,10 +516,13 @@ void wilderness_gen() if (daytime) { /* Assume lit */ - c_ptr->info |= (CAVE_GLOW); + c_ptr->info |= CAVE_GLOW; /* Hack -- Memorize lit grids if allowed */ - if (view_perma_grids) c_ptr->info |= (CAVE_MARK); + if (options->view_perma_grids) + { + c_ptr->info |= CAVE_MARK; + } } else { diff --git a/src/xtra1.cc b/src/xtra1.cc index c7fd9213..072e097a 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -63,7 +63,7 @@ */ void cnv_stat(int val, char *out_val) { - if (!linear_stats) + if (!options->linear_stats) { /* Above 18 */ if (val > 18) @@ -230,7 +230,7 @@ static void prt_sane(void) { color = TERM_L_GREEN; } - else if (perc > (10 * hitpoint_warn)) + else if (perc > (10 * options->hitpoint_warn)) { color = TERM_YELLOW; } @@ -419,7 +419,10 @@ static void prt_hp(void) byte color; - if (player_char_health) lite_spot(p_ptr->py, p_ptr->px); + if (options->player_char_health) + { + lite_spot(p_ptr->py, p_ptr->px); + } if (p_ptr->necro_extra & CLASS_UNDEAD) { @@ -431,7 +434,7 @@ static void prt_hp(void) { color = TERM_L_BLUE; } - else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10) + else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10) { color = TERM_VIOLET; } @@ -451,7 +454,7 @@ static void prt_hp(void) { color = TERM_L_GREEN; } - else if (p_ptr->chp > (p_ptr->mhp * hitpoint_warn) / 10) + else if (p_ptr->chp > (p_ptr->mhp * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -490,7 +493,7 @@ static void prt_mh(void) { color = TERM_L_GREEN; } - else if (o_ptr->pval2 > (o_ptr->pval3 * hitpoint_warn) / 10) + else if (o_ptr->pval2 > (o_ptr->pval3 * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -518,7 +521,7 @@ static void prt_sp(void) { color = TERM_L_GREEN; } - else if (p_ptr->csp > (p_ptr->msp * hitpoint_warn) / 10) + else if (p_ptr->csp > (p_ptr->msp * options->hitpoint_warn) / 10) { color = TERM_YELLOW; } @@ -2013,7 +2016,7 @@ static void calc_torch(void) /* Reduce lite when running if requested */ - if (running && view_reduce_lite) + if (running && options->view_reduce_lite) { /* Reduce the lite radius if needed */ if (p_ptr->cur_lite > 1) p_ptr->cur_lite = 1; diff --git a/src/xtra2.cc b/src/xtra2.cc index 9581a7ee..ce4c7de0 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3370,7 +3370,7 @@ void verify_panel(void) if (max_pcol_min < 0) max_pcol_min = 0; /* An option: center on player */ - if (center_player) + if (options->center_player) { /* Center vertically */ prow_min = y - panel_hgt; @@ -3444,7 +3444,10 @@ void verify_panel(void) panel_col_min = pcol_min; /* Hack -- optional disturb on "panel change" */ - if (disturb_panel && !center_player) disturb(0); + if (options->disturb_panel && !options->center_player) + { + disturb(0); + } /* Recalculate the boundaries */ panel_bounds(); @@ -4733,7 +4736,10 @@ bool_ get_aim_dir(int *dp) dir = command_dir; /* Hack -- auto-target if requested */ - if (use_old_target && target_okay()) dir = 5; + if (options->use_old_target && target_okay()) + { + dir = 5; + } /* Ask until satisfied */ while (!dir) -- cgit v1.2.3 From 39eb6a171792b3bd34e0afdafa72a1a2b7d9fd78 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Add explicit braces in a few places --- src/melee2.cc | 17 ++++++++++++++--- src/object2.cc | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 49742a59..d519dd8a 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -924,7 +924,9 @@ void cmonster_msg(char a, cptr fmt, ...) /* Display */ if (options->disturb_other) + { cmsg_print(a, buf); + } else { message_add(buf, a); @@ -2038,7 +2040,10 @@ static bool_ monst_spell_monst(int m_idx) case SF_TPORT_IDX: { - if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ + if (dungeon_flags & DF_NO_TELEPORT) + { + break; /* No teleport on special levels */ + } else { disturb_on_other(); @@ -2056,9 +2061,15 @@ static bool_ monst_spell_monst(int m_idx) case SF_TELE_AWAY_IDX: { - if (dungeon_flags & DF_NO_TELEPORT) break; + if (dungeon_flags & DF_NO_TELEPORT) + { + break; + } - if (!direct) break; + if (!direct) + { + break; + } else { bool_ resists_tele = FALSE; diff --git a/src/object2.cc b/src/object2.cc index 469a1ae0..ec34db40 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -2673,7 +2673,9 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power) case TV_CLOAK: { if (o_ptr->sval == SV_ELVEN_CLOAK) + { o_ptr->pval = randint(4); /* No cursed elven cloaks...? */ + } else if (o_ptr->sval == SV_MIMIC_CLOAK) { s32b mimic = find_random_mimic_shape(level, TRUE); -- cgit v1.2.3 From f673763cfaf90c81db4af495aa06b6fc7906ddd9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Bump cppformat -> fmt-3.0.0 --- src/CMakeLists.txt | 2 +- src/cmd3.cc | 2 +- src/cmd4.cc | 2 +- src/corrupt.cc | 2 +- src/object1.cc | 2 +- src/q_bounty.cc | 2 +- src/q_fireprof.cc | 2 +- src/q_god.cc | 2 +- src/q_library.cc | 2 +- src/q_rand.cc | 2 +- src/xtra1.cc | 2 +- vendor/fmt | 1 + vendor/fmt-3.0.0/fmt/CMakeLists.txt | 91 + vendor/fmt-3.0.0/fmt/format.cc | 935 +++++++++ vendor/fmt-3.0.0/fmt/format.h | 3832 +++++++++++++++++++++++++++++++++++ vendor/fmt-3.0.0/fmt/ostream.cc | 61 + vendor/fmt-3.0.0/fmt/ostream.h | 133 ++ vendor/fmt-3.0.0/fmt/posix.cc | 256 +++ vendor/fmt-3.0.0/fmt/posix.h | 403 ++++ vendor/fmt-3.0.0/fmt/time.h | 64 + 20 files changed, 5787 insertions(+), 11 deletions(-) create mode 120000 vendor/fmt create mode 100644 vendor/fmt-3.0.0/fmt/CMakeLists.txt create mode 100644 vendor/fmt-3.0.0/fmt/format.cc create mode 100644 vendor/fmt-3.0.0/fmt/format.h create mode 100644 vendor/fmt-3.0.0/fmt/ostream.cc create mode 100644 vendor/fmt-3.0.0/fmt/ostream.h create mode 100644 vendor/fmt-3.0.0/fmt/posix.cc create mode 100644 vendor/fmt-3.0.0/fmt/posix.h create mode 100644 vendor/fmt-3.0.0/fmt/time.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e3dd63fb..0cce20be 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/bandit) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/cppformat) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/fmt) # Add subdirectories ADD_SUBDIRECTORY (squelch) diff --git a/src/cmd3.cc b/src/cmd3.cc index b6787d56..fd97c8b3 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -42,7 +42,7 @@ #include #include -#include +#include #include #include diff --git a/src/cmd4.cc b/src/cmd4.cc index 2b51a102..01452090 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/corrupt.cc b/src/corrupt.cc index bc9f3a8b..5f50802d 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -14,7 +14,7 @@ #include "z-rand.hpp" #include -#include +#include /** * Corruptions diff --git a/src/object1.cc b/src/object1.cc index 5f4db047..c4945e6b 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -59,7 +59,7 @@ #include #include #include -#include +#include #include using boost::starts_with; diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 26d3f6cd..10331c4d 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -13,7 +13,7 @@ #include "util.hpp" #include "variable.hpp" -#include +#include #define cquest (quest[QUEST_BOUNTY]) diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index fe635971..49fc0bdb 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -20,7 +20,7 @@ #include "z-rand.hpp" #include -#include +#include #define cquest (quest[QUEST_FIREPROOF]) diff --git a/src/q_god.cc b/src/q_god.cc index 24dfa6a7..4aa06789 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -24,7 +24,7 @@ #include "z-rand.hpp" #include -#include +#include #define cquest (quest[QUEST_GOD]) #define cquest_quests_given (cquest.data[0]) diff --git a/src/q_library.cc b/src/q_library.cc index 47246f60..483faba9 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -19,7 +19,7 @@ #include "z-rand.hpp" #include -#include +#include #define cquest (quest[QUEST_LIBRARY]) diff --git a/src/q_rand.cc b/src/q_rand.cc index 62511dec..af58309d 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -32,7 +32,7 @@ #include "z-rand.hpp" #include -#include +#include static int randquest_hero[] = { 20, 13, 15, 16, 9, 17, 18, 8, -1 }; diff --git a/src/xtra1.cc b/src/xtra1.cc index 072e097a..16edf4bf 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -56,7 +56,7 @@ #include "z-rand.hpp" #include -#include +#include /* * Converts stat num into a six-char (right justified) string diff --git a/vendor/fmt b/vendor/fmt new file mode 120000 index 00000000..8b04339a --- /dev/null +++ b/vendor/fmt @@ -0,0 +1 @@ +fmt-3.0.0 \ No newline at end of file diff --git a/vendor/fmt-3.0.0/fmt/CMakeLists.txt b/vendor/fmt-3.0.0/fmt/CMakeLists.txt new file mode 100644 index 00000000..c0ef02e5 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/CMakeLists.txt @@ -0,0 +1,91 @@ +# Define the fmt library, its includes and the needed defines. +# format.cc is added to FMT_HEADERS for the header-only configuration. +set(FMT_HEADERS format.h format.cc ostream.h ostream.cc time.h) +if (HAVE_OPEN) + set(FMT_HEADERS ${FMT_HEADERS} posix.h) + set(FMT_SOURCES ${FMT_SOURCES} posix.cc) +endif () + +add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} ../ChangeLog.rst) + +option(FMT_CPPFORMAT "Build cppformat library for backward compatibility." OFF) +if (FMT_CPPFORMAT) + message(WARNING "The cppformat library is deprecated, use fmt instead.") + add_library(cppformat ${FMT_SOURCES} ${FMT_HEADERS}) +endif () + +# Starting with cmake 3.1 the CXX_STANDARD property can be used instead. +target_compile_options(fmt PUBLIC ${CPP11_FLAG}) +if (FMT_PEDANTIC) + target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) +endif () + +target_include_directories(fmt INTERFACE + $ + $) + +set_target_properties(fmt PROPERTIES + VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) + +if (BUILD_SHARED_LIBS) + if (UNIX AND NOT APPLE) + # Fix rpmlint warning: + # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. + target_link_libraries(fmt -Wl,--as-needed) + endif () + target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) +endif () + +#------------------------------------------------------------------------------ +# additionally define a header only library when cmake is new enough +if (CMAKE_VERSION VERSION_GREATER 3.1.0 OR CMAKE_VERSION VERSION_EQUAL 3.1.0) + add_library(fmt-header-only INTERFACE) + + target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) + + target_include_directories(fmt-header-only INTERFACE + $ + $) +endif () + +# Install targets. +if (FMT_INSTALL) + include(CMakePackageConfigHelpers) + set(FMT_CMAKE_DIR lib/cmake/fmt CACHE STRING + "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") + set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) + set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) + set(targets_export_name fmt-targets) + + set (INSTALL_TARGETS fmt) + if (TARGET fmt-header-only) + set(INSTALL_TARGETS ${INSTALL_TARGETS} fmt-header-only) + endif () + + set(FMT_LIB_DIR lib CACHE STRING + "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.") + + # Generate the version, config and target files into the build directory. + write_basic_package_version_file( + ${version_config} + VERSION ${FMT_VERSION} + COMPATIBILITY AnyNewerVersion) + configure_package_config_file( + ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in + ${project_config} + INSTALL_DESTINATION ${FMT_CMAKE_DIR}) + export(TARGETS ${INSTALL_TARGETS} FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) + + # Install version, config and target files. + install( + FILES ${project_config} ${version_config} + DESTINATION ${FMT_CMAKE_DIR}) + install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}) + + # Install the library and headers. + install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} DESTINATION ${FMT_LIB_DIR}) + install(FILES ${FMT_HEADERS} DESTINATION include/fmt) + if (FMT_CPPFORMAT) + install(TARGETS cppformat DESTINATION ${FMT_LIB_DIR}) + endif () +endif () diff --git a/vendor/fmt-3.0.0/fmt/format.cc b/vendor/fmt-3.0.0/fmt/format.cc new file mode 100644 index 00000000..ae5d1103 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/format.cc @@ -0,0 +1,935 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "format.h" + +#include + +#include +#include +#include +#include +#include +#include // for std::ptrdiff_t + +#if defined(_WIN32) && defined(__MINGW32__) +# include +#endif + +#if FMT_USE_WINDOWS_H +# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) +# include +# else +# define NOMINMAX +# include +# undef NOMINMAX +# endif +#endif + +using fmt::internal::Arg; + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4702) // unreachable code +// Disable deprecation warning for strerror. The latter is not called but +// MSVC fails to detect it. +# pragma warning(disable: 4996) +#endif + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +static inline fmt::internal::Null<> strerror_r(int, char *, ...) { + return fmt::internal::Null<>(); +} +static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { + return fmt::internal::Null<>(); +} + +namespace fmt { +namespace { + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) +# define FMT_SWPRINTF snwprintf +#else +# define FMT_SWPRINTF swprintf +#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) + +// Checks if a value fits in int - used to avoid warnings about comparing +// signed and unsigned integers. +template +struct IntChecker { + template + static bool fits_in_int(T value) { + unsigned max = INT_MAX; + return value <= max; + } + static bool fits_in_int(bool) { return true; } +}; + +template <> +struct IntChecker { + template + static bool fits_in_int(T value) { + return value >= INT_MIN && value <= INT_MAX; + } + static bool fits_in_int(int) { return true; } +}; + +const char RESET_COLOR[] = "\x1b[0m"; + +typedef void (*FormatFunc)(Writer &, int, StringRef); + +// Portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +int safe_strerror( + int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); + + class StrError { + private: + int error_code_; + char *&buffer_; + std::size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const StrError &) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + int handle(char *message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + int handle(internal::Null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? + ERANGE : result; + } + + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(internal::Null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } + + public: + StrError(int err_code, char *&buf, std::size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { + strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. + return handle(strerror_r(error_code_, buffer_, buffer_size_)); + } + }; + return StrError(error_code, buffer, buffer_size).run(); +} + +void format_error_code(Writer &out, int error_code, + StringRef message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential + // bad_alloc. + out.clear(); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + typedef internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(error_code); + if (internal::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += internal::count_digits(abs_value); + if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) + out << message << SEP; + out << ERROR_STR << error_code; + assert(out.size() <= internal::INLINE_BUFFER_SIZE); +} + +void report_error(FormatFunc func, int error_code, + StringRef message) FMT_NOEXCEPT { + MemoryWriter full_message; + func(full_message, error_code, message); + // Use Writer::data instead of Writer::c_str to avoid potential memory + // allocation. + std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// IsZeroInt::visit(arg) returns true iff arg is a zero integer. +class IsZeroInt : public ArgVisitor { + public: + template + bool visit_any_int(T value) { return value == 0; } +}; + +// Checks if an argument is a valid printf width specifier and sets +// left alignment if it is negative. +class WidthHandler : public ArgVisitor { + private: + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); + + public: + explicit WidthHandler(FormatSpec &spec) : spec_(spec) {} + + void report_unhandled_arg() { + FMT_THROW(FormatError("width is not integer")); + } + + template + unsigned visit_any_int(T value) { + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType width = static_cast(value); + if (internal::is_negative(value)) { + spec_.align_ = ALIGN_LEFT; + width = 0 - width; + } + if (width > INT_MAX) + FMT_THROW(FormatError("number is too big")); + return static_cast(width); + } +}; + +class PrecisionHandler : public ArgVisitor { + public: + void report_unhandled_arg() { + FMT_THROW(FormatError("precision is not integer")); + } + + template + int visit_any_int(T value) { + if (!IntChecker::is_signed>::fits_in_int(value)) + FMT_THROW(FormatError("number is too big")); + return static_cast(value); + } +}; + +template +struct is_same { + enum { value = 0 }; +}; + +template +struct is_same { + enum { value = 1 }; +}; + +// An argument visitor that converts an integer argument to T for printf, +// if T is an integral type. If T is void, the argument is converted to +// corresponding signed or unsigned type depending on the type specifier: +// 'd' and 'i' - signed, other - unsigned) +template +class ArgConverter : public ArgVisitor, void> { + private: + internal::Arg &arg_; + wchar_t type_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); + + public: + ArgConverter(internal::Arg &arg, wchar_t type) + : arg_(arg), type_(type) {} + + void visit_bool(bool value) { + if (type_ != 's') + visit_any_int(value); + } + + template + void visit_any_int(U value) { + bool is_signed = type_ == 'd' || type_ == 'i'; + using internal::Arg; + typedef typename internal::Conditional< + is_same::value, U, T>::type TargetType; + if (sizeof(TargetType) <= sizeof(int)) { + // Extra casts are used to silence warnings. + if (is_signed) { + arg_.type = Arg::INT; + arg_.int_value = static_cast(static_cast(value)); + } else { + arg_.type = Arg::UINT; + typedef typename internal::MakeUnsigned::Type Unsigned; + arg_.uint_value = static_cast(static_cast(value)); + } + } else { + if (is_signed) { + arg_.type = Arg::LONG_LONG; + // glibc's printf doesn't sign extend arguments of smaller types: + // std::printf("%lld", -42); // prints "4294967254" + // but we don't have to do the same because it's a UB. + arg_.long_long_value = static_cast(value); + } else { + arg_.type = Arg::ULONG_LONG; + arg_.ulong_long_value = + static_cast::Type>(value); + } + } + } +}; + +// Converts an integer argument to char for printf. +class CharConverter : public ArgVisitor { + private: + internal::Arg &arg_; + + FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); + + public: + explicit CharConverter(internal::Arg &arg) : arg_(arg) {} + + template + void visit_any_int(T value) { + arg_.type = internal::Arg::CHAR; + arg_.int_value = static_cast(value); + } +}; +} // namespace + +namespace internal { + +template +class PrintfArgFormatter : + public ArgFormatterBase, Char> { + + void write_null_pointer() { + this->spec().type_ = 0; + this->write("(nil)"); + } + + typedef ArgFormatterBase, Char> Base; + + public: + PrintfArgFormatter(BasicWriter &w, FormatSpec &s) + : ArgFormatterBase, Char>(w, s) {} + + void visit_bool(bool value) { + FormatSpec &fmt_spec = this->spec(); + if (fmt_spec.type_ != 's') + return this->visit_any_int(value); + fmt_spec.type_ = 0; + this->write(value); + } + + void visit_char(int value) { + const FormatSpec &fmt_spec = this->spec(); + BasicWriter &w = this->writer(); + if (fmt_spec.type_ && fmt_spec.type_ != 'c') + w.write_int(value, fmt_spec); + typedef typename BasicWriter::CharPtr CharPtr; + CharPtr out = CharPtr(); + if (fmt_spec.width_ > 1) { + Char fill = ' '; + out = w.grow_buffer(fmt_spec.width_); + if (fmt_spec.align_ != ALIGN_LEFT) { + std::fill_n(out, fmt_spec.width_ - 1, fill); + out += fmt_spec.width_ - 1; + } else { + std::fill_n(out + 1, fmt_spec.width_ - 1, fill); + } + } else { + out = w.grow_buffer(1); + } + *out = static_cast(value); + } + + void visit_cstring(const char *value) { + if (value) + Base::visit_cstring(value); + else if (this->spec().type_ == 'p') + write_null_pointer(); + else + this->write("(null)"); + } + + void visit_pointer(const void *value) { + if (value) + return Base::visit_pointer(value); + this->spec().type_ = 0; + write_null_pointer(); + } + + void visit_custom(Arg::CustomValue c) { + BasicFormatter formatter(ArgList(), this->writer()); + const Char format_str[] = {'}', 0}; + const Char *format = format_str; + c.format(&formatter, c.value, &format); + } +}; +} // namespace internal +} // namespace fmt + +FMT_FUNC void fmt::SystemError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_system_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +template +int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, value) : + FMT_SNPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, width, value) : + FMT_SNPRINTF(buffer, size, format, width, precision, value); +} + +template +int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, value) : + FMT_SWPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, width, value) : + FMT_SWPRINTF(buffer, size, format, width, precision, value); +} + +template +const char fmt::internal::BasicData::DIGITS[] = + "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, \ + factor * 100, \ + factor * 1000, \ + factor * 10000, \ + factor * 100000, \ + factor * 1000000, \ + factor * 10000000, \ + factor * 100000000, \ + factor * 1000000000 + +template +const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { + 0, FMT_POWERS_OF_10(1) +}; + +template +const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { + 0, + FMT_POWERS_OF_10(1), + FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), + // Multiply several constants instead of using a single long long constant + // to avoid warnings about C++98 not supporting long long. + fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 +}; + +FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { + (void)type; + if (std::isprint(static_cast(code))) { + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '{}' for {}", code, type))); + } + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '\\x{:02x}' for {}", + static_cast(code), type))); +} + +#if FMT_USE_WINDOWS_H + +FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { + static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; + if (s.size() > INT_MAX) + FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); + int s_size = static_cast(s.size()); + int length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_.resize(length + 1); + length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_[length] = 0; +} + +FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { + if (int error_code = convert(s)) { + FMT_THROW(WindowsError(error_code, + "cannot convert string from UTF-16 to UTF-8")); + } +} + +FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { + if (s.size() > INT_MAX) + return ERROR_INVALID_PARAMETER; + int s_size = static_cast(s.size()); + int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); + if (length == 0) + return GetLastError(); + buffer_.resize(length + 1); + length = WideCharToMultiByte( + CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); + if (length == 0) + return GetLastError(); + buffer_[length] = 0; + return 0; +} + +FMT_FUNC void fmt::WindowsError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_windows_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +FMT_FUNC void fmt::internal::format_windows_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + wchar_t *system_message = &buffer[0]; + int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + system_message, static_cast(buffer.size()), 0); + if (result != 0) { + UTF16ToUTF8 utf8_message; + if (utf8_message.convert(system_message) == ERROR_SUCCESS) { + out << message << ": " << utf8_message; + return; + } + break; + } + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +#endif // FMT_USE_WINDOWS_H + +FMT_FUNC void fmt::internal::format_system_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + char *system_message = &buffer[0]; + int result = safe_strerror(error_code, system_message, buffer.size()); + if (result == 0) { + out << message << ": " << system_message; + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +template +void fmt::internal::ArgMap::init(const ArgList &args) { + if (!map_.empty()) + return; + typedef internal::NamedArg NamedArg; + const NamedArg *named_arg = 0; + bool use_values = + args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; + if (use_values) { + for (unsigned i = 0;/*nothing*/; ++i) { + internal::Arg::Type arg_type = args.type(i); + switch (arg_type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.values_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } + return; + } + for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { + internal::Arg::Type arg_type = args.type(i); + if (arg_type == internal::Arg::NAMED_ARG) { + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + } + } + for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { + switch (args.args_[i].type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } +} + +template +void fmt::internal::FixedBuffer::grow(std::size_t) { + FMT_THROW(std::runtime_error("buffer overflow")); +} + +FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( + unsigned arg_index, const char *&error) { + Arg arg = args_[arg_index]; + switch (arg.type) { + case Arg::NONE: + error = "argument index out of range"; + break; + case Arg::NAMED_ARG: + arg = *static_cast(arg.pointer); + break; + default: + /*nothing*/; + } + return arg; +} + +template +void fmt::internal::PrintfFormatter::parse_flags( + FormatSpec &spec, const Char *&s) { + for (;;) { + switch (*s++) { + case '-': + spec.align_ = ALIGN_LEFT; + break; + case '+': + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '0': + spec.fill_ = '0'; + break; + case ' ': + spec.flags_ |= SIGN_FLAG; + break; + case '#': + spec.flags_ |= HASH_FLAG; + break; + default: + --s; + return; + } + } +} + +template +Arg fmt::internal::PrintfFormatter::get_arg( + const Char *s, unsigned arg_index) { + (void)s; + const char *error = 0; + Arg arg = arg_index == UINT_MAX ? + next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); + if (error) + FMT_THROW(FormatError(!*s ? "invalid format string" : error)); + return arg; +} + +template +unsigned fmt::internal::PrintfFormatter::parse_header( + const Char *&s, FormatSpec &spec) { + unsigned arg_index = UINT_MAX; + Char c = *s; + if (c >= '0' && c <= '9') { + // Parse an argument index (if followed by '$') or a width possibly + // preceded with '0' flag(s). + unsigned value = parse_nonnegative_int(s); + if (*s == '$') { // value is an argument index + ++s; + arg_index = value; + } else { + if (c == '0') + spec.fill_ = '0'; + if (value != 0) { + // Nonzero value means that we parsed width and don't need to + // parse it or flags again, so return now. + spec.width_ = value; + return arg_index; + } + } + } + parse_flags(spec, s); + // Parse width. + if (*s >= '0' && *s <= '9') { + spec.width_ = parse_nonnegative_int(s); + } else if (*s == '*') { + ++s; + spec.width_ = WidthHandler(spec).visit(get_arg(s)); + } + return arg_index; +} + +template +void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, BasicCStringRef format_str) { + const Char *start = format_str.c_str(); + const Char *s = start; + while (*s) { + Char c = *s++; + if (c != '%') continue; + if (*s == c) { + write(writer, start, s); + start = ++s; + continue; + } + write(writer, start, s - 1); + + FormatSpec spec; + spec.align_ = ALIGN_RIGHT; + + // Parse argument index, flags and width. + unsigned arg_index = parse_header(s, spec); + + // Parse precision. + if (*s == '.') { + ++s; + if ('0' <= *s && *s <= '9') { + spec.precision_ = static_cast(parse_nonnegative_int(s)); + } else if (*s == '*') { + ++s; + spec.precision_ = PrecisionHandler().visit(get_arg(s)); + } + } + + Arg arg = get_arg(s, arg_index); + if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) + spec.flags_ &= ~to_unsigned(HASH_FLAG); + if (spec.fill_ == '0') { + if (arg.type <= Arg::LAST_NUMERIC_TYPE) + spec.align_ = ALIGN_NUMERIC; + else + spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. + } + + // Parse length and convert the argument to the required type. + switch (*s++) { + case 'h': + if (*s == 'h') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'l': + if (*s == 'l') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'j': + ArgConverter(arg, *s).visit(arg); + break; + case 'z': + ArgConverter(arg, *s).visit(arg); + break; + case 't': + ArgConverter(arg, *s).visit(arg); + break; + case 'L': + // printf produces garbage when 'L' is omitted for long double, no + // need to do the same. + break; + default: + --s; + ArgConverter(arg, *s).visit(arg); + } + + // Parse type. + if (!*s) + FMT_THROW(FormatError("invalid format string")); + spec.type_ = static_cast(*s++); + if (arg.type <= Arg::LAST_INTEGER_TYPE) { + // Normalize type. + switch (spec.type_) { + case 'i': case 'u': + spec.type_ = 'd'; + break; + case 'c': + // TODO: handle wchar_t + CharConverter(arg).visit(arg); + break; + } + } + + start = s; + + // Format argument. + internal::PrintfArgFormatter(writer, spec).visit(arg); + } + write(writer, start, s); +} + +FMT_FUNC void fmt::report_system_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_system_error, error_code, message); +} + +#if FMT_USE_WINDOWS_H +FMT_FUNC void fmt::report_windows_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_windows_error, error_code, message); +} +#endif + +FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + std::fwrite(w.data(), 1, w.size(), f); +} + +FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { + print(stdout, format_str, args); +} + +FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { + char escape[] = "\x1b[30m"; + escape[3] = static_cast('0' + c); + std::fputs(escape, stdout); + print(format, args); + std::fputs(RESET_COLOR, stdout); +} + +FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + std::size_t size = w.size(); + return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); +} + +#ifndef FMT_HEADER_ONLY + +template struct fmt::internal::BasicData; + +// Explicit instantiations for char. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, CStringRef format); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, long double value); + +// Explicit instantiations for wchar_t. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, WCStringRef format); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, long double value); + +#endif // FMT_HEADER_ONLY + +#ifdef _MSC_VER +# pragma warning(pop) +#endif diff --git a/vendor/fmt-3.0.0/fmt/format.h b/vendor/fmt-3.0.0/fmt/format.h new file mode 100644 index 00000000..5013b810 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/format.h @@ -0,0 +1,3832 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _SECURE_SCL +# define FMT_SECURE_SCL _SECURE_SCL +#else +# define FMT_SECURE_SCL 0 +#endif + +#if FMT_SECURE_SCL +# include +#endif + +#if defined(_MSC_VER) && _MSC_VER <= 1500 +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 intmax_t; +#else +#include +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# endif +#endif +#ifndef FMT_API +# define FMT_API +#endif + +#ifdef __GNUC__ +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# define FMT_GCC_EXTENSION __extension__ +# if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic push +// Disable the warning about "long long" which is sometimes reported even +// when using __extension__. +# pragma GCC diagnostic ignored "-Wlong-long" +// Disable the warning about declaration shadowing because it affects too +// many valid cases. +# pragma GCC diagnostic ignored "-Wshadow" +// Disable the warning about implicit conversions that may change the sign of +// an integer; silencing it otherwise would require many explicit casts. +# pragma GCC diagnostic ignored "-Wsign-conversion" +# endif +# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ +# define FMT_HAS_GXX_CXX11 1 +# endif +#else +# define FMT_GCC_EXTENSION +#endif + +#if defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#elif defined(__ICL) +# define FMT_ICC_VERSION __ICL +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdocumentation" +#endif + +#ifdef __GNUC_LIBSTD__ +# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#ifndef FMT_USE_VARIADIC_TEMPLATES +// Variadic templates are available in GCC since version 4.4 +// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ +// since version 2013. +# define FMT_USE_VARIADIC_TEMPLATES \ + (FMT_HAS_FEATURE(cxx_variadic_templates) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800) +#endif + +#ifndef FMT_USE_RVALUE_REFERENCES +// Don't use rvalue references when compiling with clang and an old libstdc++ +// as the latter doesn't provide std::move. +# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 +# define FMT_USE_RVALUE_REFERENCES 0 +# else +# define FMT_USE_RVALUE_REFERENCES \ + (FMT_HAS_FEATURE(cxx_rvalue_references) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600) +# endif +#endif + +#if FMT_USE_RVALUE_REFERENCES +# include // for std::move +#endif + +// Check if exceptions are disabled. +#if defined(__GNUC__) && !defined(__EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +#endif +#if defined(_MSC_VER) && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +#endif +#ifndef FMT_EXCEPTIONS +# define FMT_EXCEPTIONS 1 +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# define FMT_THROW(x) throw x +# else +# define FMT_THROW(x) assert(false) +# endif +#endif + +// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS +# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + _MSC_VER >= 1900 +# define FMT_NOEXCEPT noexcept +# else +# define FMT_NOEXCEPT throw() +# endif +# else +# define FMT_NOEXCEPT +# endif +#endif + +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#ifndef FMT_USE_DELETED_FUNCTIONS +# define FMT_USE_DELETED_FUNCTIONS 0 +#endif + +#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800 +# define FMT_DELETED_OR_UNDEFINED = delete +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + TypeName& operator=(const TypeName&) = delete +#else +# define FMT_DELETED_OR_UNDEFINED +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + TypeName& operator=(const TypeName&) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// All compilers which support UDLs also support variadic templates. This +// makes the fmt::literals implementation easier. However, an explicit check +// for variadic templates is added here just in case. +// For Intel's compiler both it and the system gcc/msc must support UDLs. +# define FMT_USE_USER_DEFINED_LITERALS \ + FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ + (FMT_HAS_FEATURE(cxx_user_literals) || \ + (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1900) && \ + (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500) +#endif + +#ifndef FMT_ASSERT +# define FMT_ASSERT(condition, message) assert((condition) && message) +#endif + + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or +// otherwise support __builtin_clz and __builtin_clzll, so +// only define FMT_BUILTIN_CLZ using the MSVC intrinsics +// if the clz and clzll builtins are not available. +#if defined(_MSC_VER) && !defined(FMT_BUILTIN_CLZLL) +# include // _BitScanReverse, _BitScanReverse64 + +namespace fmt { +namespace internal { +# pragma intrinsic(_BitScanReverse) +inline uint32_t clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) + +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) +} +} +#endif + +namespace fmt { +namespace internal { +struct DummyInt { + int data[2]; + operator int() const { return 0; } +}; +typedef std::numeric_limits FPUtil; + +// Dummy implementations of system functions such as signbit and ecvt called +// if the latter are not available. +inline DummyInt signbit(...) { return DummyInt(); } +inline DummyInt _ecvt_s(...) { return DummyInt(); } +inline DummyInt isinf(...) { return DummyInt(); } +inline DummyInt _finite(...) { return DummyInt(); } +inline DummyInt isnan(...) { return DummyInt(); } +inline DummyInt _isnan(...) { return DummyInt(); } + +// A helper function to suppress bogus "conditional expression is constant" +// warnings. +template +inline T check(T value) { return value; } +} +} // namespace fmt + +namespace std { +// Standard permits specialization of std::numeric_limits. This specialization +// is used to resolve ambiguity between isinf and std::isinf in glibc: +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 +// and the same for isnan and signbit. +template <> +class numeric_limits : + public std::numeric_limits { + public: + // Portable version of isinf. + template + static bool isinfinity(T x) { + using namespace fmt::internal; + // The resolution "priority" is: + // isinf macro > std::isinf > ::isinf > fmt::internal::isinf + if (check(sizeof(isinf(x)) == sizeof(bool) || + sizeof(isinf(x)) == sizeof(int))) { + return isinf(x) != 0; + } + return !_finite(static_cast(x)); + } + + // Portable version of isnan. + template + static bool isnotanumber(T x) { + using namespace fmt::internal; + if (check(sizeof(isnan(x)) == sizeof(bool) || + sizeof(isnan(x)) == sizeof(int))) { + return isnan(x) != 0; + } + return _isnan(static_cast(x)) != 0; + } + + // Portable version of signbit. + static bool isnegative(double x) { + using namespace fmt::internal; + if (check(sizeof(signbit(x)) == sizeof(int))) + return signbit(x) != 0; + if (x < 0) return true; + if (!isnotanumber(x)) return false; + int dec = 0, sign = 0; + char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. + _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); + return sign != 0; + } +}; +} // namespace std + +namespace fmt { + +// Fix the warning about long long on older versions of GCC +// that don't support the diagnostic pragma. +FMT_GCC_EXTENSION typedef long long LongLong; +FMT_GCC_EXTENSION typedef unsigned long long ULongLong; + +#if FMT_USE_RVALUE_REFERENCES +using std::move; +#endif + +template +class BasicWriter; + +typedef BasicWriter Writer; +typedef BasicWriter WWriter; + +template +class ArgFormatter; + +template > +class BasicFormatter; + +/** + \rst + A string reference. It can be constructed from a C string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +------------+-------------------------+ + | Type | Definition | + +============+=========================+ + | StringRef | BasicStringRef | + +------------+-------------------------+ + | WStringRef | BasicStringRef | + +------------+-------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(StringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicStringRef { + private: + const Char *data_; + std::size_t size_; + + public: + /** Constructs a string reference object from a C string and a size. */ + BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + BasicStringRef(const Char *s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicStringRef(const std::basic_string &s) + : data_(s.c_str()), size_(s.size()) {} + + /** + \rst + Converts a string reference to an ``std::string`` object. + \endrst + */ + std::basic_string to_string() const { + return std::basic_string(data_, size_); + } + + /** Returns a pointer to the string data. */ + const Char *data() const { return data_; } + + /** Returns the string size. */ + std::size_t size() const { return size_; } + + // Lexicographically compare this string reference to other. + int compare(BasicStringRef other) const { + std::size_t size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) != 0; + } + friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) >= 0; + } +}; + +typedef BasicStringRef StringRef; +typedef BasicStringRef WStringRef; + +/** + \rst + A reference to a null terminated string. It can be constructed from a C + string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +-------------+--------------------------+ + | Type | Definition | + +=============+==========================+ + | CStringRef | BasicCStringRef | + +-------------+--------------------------+ + | WCStringRef | BasicCStringRef | + +-------------+--------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(CStringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicCStringRef { + private: + const Char *data_; + + public: + /** Constructs a string reference object from a C string. */ + BasicCStringRef(const Char *s) : data_(s) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} + + /** Returns the pointer to a C string. */ + const Char *c_str() const { return data_; } +}; + +typedef BasicCStringRef CStringRef; +typedef BasicCStringRef WCStringRef; + +/** + A formatting error such as invalid format string. +*/ +class FormatError : public std::runtime_error { + public: + explicit FormatError(CStringRef message) + : std::runtime_error(message.c_str()) {} +}; + +namespace internal { + +// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. +template +struct MakeUnsigned { typedef T Type; }; + +#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ + template <> \ + struct MakeUnsigned { typedef U Type; } + +FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); +FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); +FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); +FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); + +// Casts nonnegative integer to unsigned. +template +inline typename MakeUnsigned::Type to_unsigned(Int value) { + FMT_ASSERT(value >= 0, "negative value"); + return static_cast::Type>(value); +} + +// The number of characters to store in the MemoryBuffer object itself +// to avoid dynamic memory allocation. +enum { INLINE_BUFFER_SIZE = 500 }; + +#if FMT_SECURE_SCL +// Use checked iterator to avoid warnings on MSVC. +template +inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) { + return stdext::checked_array_iterator(ptr, size); +} +#else +template +inline T *make_ptr(T *ptr, std::size_t) { return ptr; } +#endif +} // namespace internal + +/** + \rst + A buffer supporting a subset of ``std::vector``'s operations. + \endrst + */ +template +class Buffer { + private: + FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); + + protected: + T *ptr_; + std::size_t size_; + std::size_t capacity_; + + Buffer(T *ptr = 0, std::size_t capacity = 0) + : ptr_(ptr), size_(0), capacity_(capacity) {} + + /** + \rst + Increases the buffer capacity to hold at least *size* elements updating + ``ptr_`` and ``capacity_``. + \endrst + */ + virtual void grow(std::size_t size) = 0; + + public: + virtual ~Buffer() {} + + /** Returns the size of this buffer. */ + std::size_t size() const { return size_; } + + /** Returns the capacity of this buffer. */ + std::size_t capacity() const { return capacity_; } + + /** + Resizes the buffer. If T is a POD type new elements may not be initialized. + */ + void resize(std::size_t new_size) { + if (new_size > capacity_) + grow(new_size); + size_ = new_size; + } + + /** + \rst + Reserves space to store at least *capacity* elements. + \endrst + */ + void reserve(std::size_t capacity) { + if (capacity > capacity_) + grow(capacity); + } + + void clear() FMT_NOEXCEPT { size_ = 0; } + + void push_back(const T &value) { + if (size_ == capacity_) + grow(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template + void append(const U *begin, const U *end); + + T &operator[](std::size_t index) { return ptr_[index]; } + const T &operator[](std::size_t index) const { return ptr_[index]; } +}; + +template +template +void Buffer::append(const U *begin, const U *end) { + std::size_t new_size = size_ + internal::to_unsigned(end - begin); + if (new_size > capacity_) + grow(new_size); + std::uninitialized_copy(begin, end, + internal::make_ptr(ptr_, capacity_) + size_); + size_ = new_size; +} + +namespace internal { + +// A memory buffer for trivially copyable/constructible types with the first SIZE +// elements stored in the object itself. +template > +class MemoryBuffer : private Allocator, public Buffer { + private: + T data_[SIZE]; + + // Deallocate memory allocated by the buffer. + void deallocate() { + if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); + } + + protected: + void grow(std::size_t size); + + public: + explicit MemoryBuffer(const Allocator &alloc = Allocator()) + : Allocator(alloc), Buffer(data_, SIZE) {} + ~MemoryBuffer() { deallocate(); } + +#if FMT_USE_RVALUE_REFERENCES + private: + // Move data from other to this buffer. + void move(MemoryBuffer &other) { + Allocator &this_alloc = *this, &other_alloc = other; + this_alloc = std::move(other_alloc); + this->size_ = other.size_; + this->capacity_ = other.capacity_; + if (other.ptr_ == other.data_) { + this->ptr_ = data_; + std::uninitialized_copy(other.data_, other.data_ + this->size_, + make_ptr(data_, this->capacity_)); + } else { + this->ptr_ = other.ptr_; + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.ptr_ = other.data_; + } + } + + public: + MemoryBuffer(MemoryBuffer &&other) { + move(other); + } + + MemoryBuffer &operator=(MemoryBuffer &&other) { + assert(this != &other); + deallocate(); + move(other); + return *this; + } +#endif + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const { return *this; } +}; + +template +void MemoryBuffer::grow(std::size_t size) { + std::size_t new_capacity = this->capacity_ + this->capacity_ / 2; + if (size > new_capacity) + new_capacity = size; + T *new_ptr = this->allocate(new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_, + make_ptr(new_ptr, new_capacity)); + std::size_t old_capacity = this->capacity_; + T *old_ptr = this->ptr_; + this->capacity_ = new_capacity; + this->ptr_ = new_ptr; + // deallocate may throw (at least in principle), but it doesn't matter since + // the buffer already uses the new storage and will deallocate it in case + // of exception. + if (old_ptr != data_) + Allocator::deallocate(old_ptr, old_capacity); +} + +// A fixed-size buffer. +template +class FixedBuffer : public fmt::Buffer { + public: + FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} + + protected: + FMT_API void grow(std::size_t size); +}; + +template +class BasicCharTraits { + public: +#if FMT_SECURE_SCL + typedef stdext::checked_array_iterator CharPtr; +#else + typedef Char *CharPtr; +#endif + static Char cast(int value) { return static_cast(value); } +}; + +template +class CharTraits; + +template <> +class CharTraits : public BasicCharTraits { + private: + // Conversion from wchar_t to char is not allowed. + static char convert(wchar_t); + + public: + static char convert(char value) { return value; } + + // Formats a floating-point number. + template + FMT_API static int format_float(char *buffer, std::size_t size, + const char *format, unsigned width, int precision, T value); +}; + +template <> +class CharTraits : public BasicCharTraits { + public: + static wchar_t convert(char value) { return value; } + static wchar_t convert(wchar_t value) { return value; } + + template + FMT_API static int format_float(wchar_t *buffer, std::size_t size, + const wchar_t *format, unsigned width, int precision, T value); +}; + +// Checks if a number is negative - used to avoid warnings. +template +struct SignChecker { + template + static bool is_negative(T value) { return value < 0; } +}; + +template <> +struct SignChecker { + template + static bool is_negative(T) { return false; } +}; + +// Returns true if value is negative, false otherwise. +// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. +template +inline bool is_negative(T value) { + return SignChecker::is_signed>::is_negative(value); +} + +// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. +template +struct TypeSelector { typedef uint32_t Type; }; + +template <> +struct TypeSelector { typedef uint64_t Type; }; + +template +struct IntTraits { + // Smallest of uint32_t and uint64_t that is large enough to represent + // all values of T. + typedef typename + TypeSelector::digits <= 32>::Type MainType; +}; + +FMT_API void report_unknown_type(char code, const char *type); + +// Static data is placed in this class template to allow header-only +// configuration. +template +struct FMT_API BasicData { + static const uint32_t POWERS_OF_10_32[]; + static const uint64_t POWERS_OF_10_64[]; + static const char DIGITS[]; +}; + +typedef BasicData<> Data; + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline unsigned count_digits(uint64_t n) { + // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. + int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline unsigned count_digits(uint64_t n) { + unsigned count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline unsigned count_digits(uint32_t n) { + int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; +} +#endif + +// A functor that doesn't add a thousands separator. +struct NoThousandsSep { + template + void operator()(Char *) {} +}; + +// A functor that adds a thousands separator. +class ThousandsSep { + private: + fmt::StringRef sep_; + + // Index of a decimal digit with the least significant digit having index 0. + unsigned digit_index_; + + public: + explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {} + + template + void operator()(Char *&buffer) { + if (++digit_index_ % 3 != 0) + return; + buffer -= sep_.size(); + std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(), + internal::make_ptr(buffer, sep_.size())); + } +}; + +// Formats a decimal unsigned integer value writing into buffer. +// thousands_sep is a functor that is called after writing each char to +// add a thousands separator if necessary. +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits, + ThousandsSep thousands_sep) { + buffer += num_digits; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer = Data::DIGITS[index + 1]; + thousands_sep(buffer); + *--buffer = Data::DIGITS[index]; + thousands_sep(buffer); + } + if (value < 10) { + *--buffer = static_cast('0' + value); + return; + } + unsigned index = static_cast(value * 2); + *--buffer = Data::DIGITS[index + 1]; + *--buffer = Data::DIGITS[index]; +} + +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) { + return format_decimal(buffer, value, num_digits, NoThousandsSep()); +} + +#ifndef _WIN32 +# define FMT_USE_WINDOWS_H 0 +#elif !defined(FMT_USE_WINDOWS_H) +# define FMT_USE_WINDOWS_H 1 +#endif + +// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. +// All the functionality that relies on it will be disabled too. +#if FMT_USE_WINDOWS_H +// A converter from UTF-8 to UTF-16. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF8ToUTF16 { + private: + MemoryBuffer buffer_; + + public: + FMT_API explicit UTF8ToUTF16(StringRef s); + operator WStringRef() const { return WStringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const wchar_t *c_str() const { return &buffer_[0]; } + std::wstring str() const { return std::wstring(&buffer_[0], size()); } +}; + +// A converter from UTF-16 to UTF-8. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF16ToUTF8 { + private: + MemoryBuffer buffer_; + + public: + UTF16ToUTF8() {} + FMT_API explicit UTF16ToUTF8(WStringRef s); + operator StringRef() const { return StringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const char *c_str() const { return &buffer_[0]; } + std::string str() const { return std::string(&buffer_[0], size()); } + + // Performs conversion returning a system error code instead of + // throwing exception on conversion error. This method may still throw + // in case of memory allocation error. + FMT_API int convert(WStringRef s); +}; + +FMT_API void format_windows_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; +#endif + +FMT_API void format_system_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; + +// A formatting argument value. +struct Value { + template + struct StringValue { + const Char *value; + std::size_t size; + }; + + typedef void (*FormatFunc)( + void *formatter, const void *arg, void *format_str_ptr); + + struct CustomValue { + const void *value; + FormatFunc format; + }; + + union { + int int_value; + unsigned uint_value; + LongLong long_long_value; + ULongLong ulong_long_value; + double double_value; + long double long_double_value; + const void *pointer; + StringValue string; + StringValue sstring; + StringValue ustring; + StringValue wstring; + CustomValue custom; + }; + + enum Type { + NONE, NAMED_ARG, + // Integer types should go first, + INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, + // followed by floating-point types. + DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, + CSTRING, STRING, WSTRING, POINTER, CUSTOM + }; +}; + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in internal::MemoryBuffer. +struct Arg : Value { + Type type; +}; + +template +struct NamedArg; + +template +struct Null {}; + +// A helper class template to enable or disable overloads taking wide +// characters and strings in MakeValue. +template +struct WCharHelper { + typedef Null Supported; + typedef T Unsupported; +}; + +template +struct WCharHelper { + typedef T Supported; + typedef Null Unsupported; +}; + +typedef char Yes[1]; +typedef char No[2]; + +template +T &get(); + +// These are non-members to workaround an overload resolution bug in bcc32. +Yes &convert(fmt::ULongLong); +No &convert(...); + +template +struct ConvertToIntImpl { + enum { value = ENABLE_CONVERSION }; +}; + +template +struct ConvertToIntImpl2 { + enum { value = false }; +}; + +template +struct ConvertToIntImpl2 { + enum { + // Don't convert numeric types. + value = ConvertToIntImpl::is_specialized>::value + }; +}; + +template +struct ConvertToInt { + enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; + enum { value = ConvertToIntImpl2::value }; +}; + +#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ + template <> \ + struct ConvertToInt { enum { value = 0 }; } + +// Silence warnings about convering float to int. +FMT_DISABLE_CONVERSION_TO_INT(float); +FMT_DISABLE_CONVERSION_TO_INT(double); +FMT_DISABLE_CONVERSION_TO_INT(long double); + +template +struct EnableIf {}; + +template +struct EnableIf { typedef T type; }; + +template +struct Conditional { typedef T type; }; + +template +struct Conditional { typedef F type; }; + +// For bcc32 which doesn't understand ! in template arguments. +template +struct Not { enum { value = 0 }; }; + +template<> +struct Not { enum { value = 1 }; }; + +// Makes an Arg object from any type. +template +class MakeValue : public Arg { + public: + typedef typename Formatter::Char Char; + + private: + // The following two methods are private to disallow formatting of + // arbitrary pointers. If you want to output a pointer cast it to + // "void *" or "const void *". In particular, this forbids formatting + // of "[const] volatile char *" which is printed as bool by iostreams. + // Do not implement! + template + MakeValue(const T *value); + template + MakeValue(T *value); + + // The following methods are private to disallow formatting of wide + // characters and strings into narrow strings as in + // fmt::format("{}", L"test"); + // To fix this, use a wide format string: fmt::format(L"{}", L"test"). +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Unsupported); +#endif + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + + void set_string(StringRef str) { + string.value = str.data(); + string.size = str.size(); + } + + void set_string(WStringRef str) { + wstring.value = str.data(); + wstring.size = str.size(); + } + + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg( + void *formatter, const void *arg, void *format_str_ptr) { + format(*static_cast(formatter), + *static_cast(format_str_ptr), + *static_cast(arg)); + } + + public: + MakeValue() {} + +#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ + MakeValue(Type value) { field = rhs; } \ + static uint64_t type(Type) { return Arg::TYPE; } + +#define FMT_MAKE_VALUE(Type, field, TYPE) \ + FMT_MAKE_VALUE_(Type, field, TYPE, value) + + FMT_MAKE_VALUE(bool, int_value, BOOL) + FMT_MAKE_VALUE(short, int_value, INT) + FMT_MAKE_VALUE(unsigned short, uint_value, UINT) + FMT_MAKE_VALUE(int, int_value, INT) + FMT_MAKE_VALUE(unsigned, uint_value, UINT) + + MakeValue(long value) { + // To minimize the number of types we need to deal with, long is + // translated either to int or to long long depending on its size. + if (check(sizeof(long) == sizeof(int))) + int_value = static_cast(value); + else + long_long_value = value; + } + static uint64_t type(long) { + return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; + } + + MakeValue(unsigned long value) { + if (check(sizeof(unsigned long) == sizeof(unsigned))) + uint_value = static_cast(value); + else + ulong_long_value = value; + } + static uint64_t type(unsigned long) { + return sizeof(unsigned long) == sizeof(unsigned) ? + Arg::UINT : Arg::ULONG_LONG; + } + + FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) + FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) + FMT_MAKE_VALUE(float, double_value, DOUBLE) + FMT_MAKE_VALUE(double, double_value, DOUBLE) + FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) + FMT_MAKE_VALUE(signed char, int_value, INT) + FMT_MAKE_VALUE(unsigned char, uint_value, UINT) + FMT_MAKE_VALUE(char, int_value, CHAR) + +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Supported value) { + int_value = value; + } + static uint64_t type(wchar_t) { return Arg::CHAR; } +#endif + +#define FMT_MAKE_STR_VALUE(Type, TYPE) \ + MakeValue(Type value) { set_string(value); } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_VALUE(char *, string.value, CSTRING) + FMT_MAKE_VALUE(const char *, string.value, CSTRING) + FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) + FMT_MAKE_STR_VALUE(const std::string &, STRING) + FMT_MAKE_STR_VALUE(StringRef, STRING) + FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) + +#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ + MakeValue(typename WCharHelper::Supported value) { \ + set_string(value); \ + } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) + FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) + + FMT_MAKE_VALUE(void *, pointer, POINTER) + FMT_MAKE_VALUE(const void *, pointer, POINTER) + + template + MakeValue(const T &value, + typename EnableIf::value>::value, int>::type = 0) { + custom.value = &value; + custom.format = &format_custom_arg; + } + + template + MakeValue(const T &value, + typename EnableIf::value, int>::type = 0) { + int_value = value; + } + + template + static uint64_t type(const T &) { + return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; + } + + // Additional template param `Char_` is needed here because make_type always + // uses char. + template + MakeValue(const NamedArg &value) { pointer = &value; } + + template + static uint64_t type(const NamedArg &) { return Arg::NAMED_ARG; } +}; + +template +class MakeArg : public Arg { +public: + MakeArg() { + type = Arg::NONE; + } + + template + MakeArg(const T &value) + : Arg(MakeValue(value)) { + type = static_cast(MakeValue::type(value)); + } +}; + +template +struct NamedArg : Arg { + BasicStringRef name; + + template + NamedArg(BasicStringRef argname, const T &value) + : Arg(MakeArg< BasicFormatter >(value)), name(argname) {} +}; + +class RuntimeError : public std::runtime_error { + protected: + RuntimeError() : std::runtime_error("") {} +}; + +template +class PrintfArgFormatter; + +template +class ArgMap; +} // namespace internal + +/** An argument list. */ +class ArgList { + private: + // To reduce compiled code size per formatting function call, types of first + // MAX_PACKED_ARGS arguments are passed in the types_ field. + uint64_t types_; + union { + // If the number of arguments is less than MAX_PACKED_ARGS, the argument + // values are stored in values_, otherwise they are stored in args_. + // This is done to reduce compiled code size as storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const internal::Value *values_; + const internal::Arg *args_; + }; + + internal::Arg::Type type(unsigned index) const { + unsigned shift = index * 4; + uint64_t mask = 0xf; + return static_cast( + (types_ & (mask << shift)) >> shift); + } + + template + friend class internal::ArgMap; + + public: + // Maximum number of arguments with packed types. + enum { MAX_PACKED_ARGS = 16 }; + + ArgList() : types_(0) {} + + ArgList(ULongLong types, const internal::Value *values) + : types_(types), values_(values) {} + ArgList(ULongLong types, const internal::Arg *args) + : types_(types), args_(args) {} + + /** Returns the argument at specified index. */ + internal::Arg operator[](unsigned index) const { + using internal::Arg; + Arg arg; + bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; + if (index < MAX_PACKED_ARGS) { + Arg::Type arg_type = type(index); + internal::Value &val = arg; + if (arg_type != Arg::NONE) + val = use_values ? values_[index] : args_[index]; + arg.type = arg_type; + return arg; + } + if (use_values) { + // The index is greater than the number of arguments that can be stored + // in values, so return a "none" argument. + arg.type = Arg::NONE; + return arg; + } + for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) { + if (args_[i].type == Arg::NONE) + return args_[i]; + } + return args_[index]; + } +}; + +#define FMT_DISPATCH(call) static_cast(this)->call + +/** + \rst + An argument visitor based on the `curiously recurring template pattern + `_. + + To use `~fmt::ArgVisitor` define a subclass that implements some or all of the + visit methods with the same signatures as the methods in `~fmt::ArgVisitor`, + for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. Then calling + `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::ArgVisitor` will be called. + + **Example**:: + + class MyArgVisitor : public fmt::ArgVisitor { + public: + void visit_int(int value) { fmt::print("{}", value); } + void visit_double(double value) { fmt::print("{}", value ); } + }; + \endrst + */ +template +class ArgVisitor { + private: + typedef internal::Arg Arg; + + public: + void report_unhandled_arg() {} + + Result visit_unhandled_arg() { + FMT_DISPATCH(report_unhandled_arg()); + return Result(); + } + + /** Visits an ``int`` argument. **/ + Result visit_int(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``long long`` argument. **/ + Result visit_long_long(LongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned`` argument. **/ + Result visit_uint(unsigned value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned long long`` argument. **/ + Result visit_ulong_long(ULongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``bool`` argument. **/ + Result visit_bool(bool value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``char`` or ``wchar_t`` argument. **/ + Result visit_char(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an argument of any integral type. **/ + template + Result visit_any_int(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a ``double`` argument. **/ + Result visit_double(double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``long double`` argument. **/ + Result visit_long_double(long double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``double`` or ``long double`` argument. **/ + template + Result visit_any_double(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a null-terminated C string (``const char *``) argument. **/ + Result visit_cstring(const char *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a string argument. **/ + Result visit_string(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a wide string argument. **/ + Result visit_wstring(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a pointer argument. **/ + Result visit_pointer(const void *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits an argument of a custom (user-defined) type. **/ + Result visit_custom(Arg::CustomValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be + called. + \endrst + */ + Result visit(const Arg &arg) { + switch (arg.type) { + default: + FMT_ASSERT(false, "invalid argument type"); + return Result(); + case Arg::INT: + return FMT_DISPATCH(visit_int(arg.int_value)); + case Arg::UINT: + return FMT_DISPATCH(visit_uint(arg.uint_value)); + case Arg::LONG_LONG: + return FMT_DISPATCH(visit_long_long(arg.long_long_value)); + case Arg::ULONG_LONG: + return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); + case Arg::BOOL: + return FMT_DISPATCH(visit_bool(arg.int_value != 0)); + case Arg::CHAR: + return FMT_DISPATCH(visit_char(arg.int_value)); + case Arg::DOUBLE: + return FMT_DISPATCH(visit_double(arg.double_value)); + case Arg::LONG_DOUBLE: + return FMT_DISPATCH(visit_long_double(arg.long_double_value)); + case Arg::CSTRING: + return FMT_DISPATCH(visit_cstring(arg.string.value)); + case Arg::STRING: + return FMT_DISPATCH(visit_string(arg.string)); + case Arg::WSTRING: + return FMT_DISPATCH(visit_wstring(arg.wstring)); + case Arg::POINTER: + return FMT_DISPATCH(visit_pointer(arg.pointer)); + case Arg::CUSTOM: + return FMT_DISPATCH(visit_custom(arg.custom)); + } + } +}; + +enum Alignment { + ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC +}; + +// Flags. +enum { + SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, + CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. +}; + +// An empty format specifier. +struct EmptySpec {}; + +// A type specifier. +template +struct TypeSpec : EmptySpec { + Alignment align() const { return ALIGN_DEFAULT; } + unsigned width() const { return 0; } + int precision() const { return -1; } + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } + char fill() const { return ' '; } +}; + +// A width specifier. +struct WidthSpec { + unsigned width_; + // Fill is always wchar_t and cast to char if necessary to avoid having + // two specialization of WidthSpec and its subclasses. + wchar_t fill_; + + WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} + + unsigned width() const { return width_; } + wchar_t fill() const { return fill_; } +}; + +// An alignment specifier. +struct AlignSpec : WidthSpec { + Alignment align_; + + AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) + : WidthSpec(width, fill), align_(align) {} + + Alignment align() const { return align_; } + + int precision() const { return -1; } +}; + +// An alignment and type specifier. +template +struct AlignTypeSpec : AlignSpec { + AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} + + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } +}; + +// A full format specifier. +struct FormatSpec : AlignSpec { + unsigned flags_; + int precision_; + char type_; + + FormatSpec( + unsigned width = 0, char type = 0, wchar_t fill = ' ') + : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} + + bool flag(unsigned f) const { return (flags_ & f) != 0; } + int precision() const { return precision_; } + char type() const { return type_; } +}; + +// An integer format specifier. +template , typename Char = char> +class IntFormatSpec : public SpecT { + private: + T value_; + + public: + IntFormatSpec(T val, const SpecT &spec = SpecT()) + : SpecT(spec), value_(val) {} + + T value() const { return value_; } +}; + +// A string format specifier. +template +class StrFormatSpec : public AlignSpec { + private: + const Char *str_; + + public: + template + StrFormatSpec(const Char *str, unsigned width, FillChar fill) + : AlignSpec(width, fill), str_(str) { + internal::CharTraits::convert(FillChar()); + } + + const Char *str() const { return str_; } +}; + +/** + Returns an integer format specifier to format the value in base 2. + */ +IntFormatSpec > bin(int value); + +/** + Returns an integer format specifier to format the value in base 8. + */ +IntFormatSpec > oct(int value); + +/** + Returns an integer format specifier to format the value in base 16 using + lower-case letters for the digits above 9. + */ +IntFormatSpec > hex(int value); + +/** + Returns an integer formatter format specifier to format in base 16 using + upper-case letters for the digits above 9. + */ +IntFormatSpec > hexu(int value); + +/** + \rst + Returns an integer format specifier to pad the formatted argument with the + fill character to the specified width using the default (right) numeric + alignment. + + **Example**:: + + MemoryWriter out; + out << pad(hex(0xcafe), 8, '0'); + // out.str() == "0000cafe" + + \endrst + */ +template +IntFormatSpec, Char> pad( + int value, unsigned width, Char fill = ' '); + +#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ +inline IntFormatSpec > bin(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'b'>()); \ +} \ + \ +inline IntFormatSpec > oct(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'o'>()); \ +} \ + \ +inline IntFormatSpec > hex(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'x'>()); \ +} \ + \ +inline IntFormatSpec > hexu(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'X'>()); \ +} \ + \ +template \ +inline IntFormatSpec > pad( \ + IntFormatSpec > f, unsigned width) { \ + return IntFormatSpec >( \ + f.value(), AlignTypeSpec(width, ' ')); \ +} \ + \ +/* For compatibility with older compilers we provide two overloads for pad, */ \ +/* one that takes a fill character and one that doesn't. In the future this */ \ +/* can be replaced with one overload making the template argument Char */ \ +/* default to char (C++11). */ \ +template \ +inline IntFormatSpec, Char> pad( \ + IntFormatSpec, Char> f, \ + unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + f.value(), AlignTypeSpec(width, fill)); \ +} \ + \ +inline IntFormatSpec > pad( \ + TYPE value, unsigned width) { \ + return IntFormatSpec >( \ + value, AlignTypeSpec<0>(width, ' ')); \ +} \ + \ +template \ +inline IntFormatSpec, Char> pad( \ + TYPE value, unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + value, AlignTypeSpec<0>(width, fill)); \ +} + +FMT_DEFINE_INT_FORMATTERS(int) +FMT_DEFINE_INT_FORMATTERS(long) +FMT_DEFINE_INT_FORMATTERS(unsigned) +FMT_DEFINE_INT_FORMATTERS(unsigned long) +FMT_DEFINE_INT_FORMATTERS(LongLong) +FMT_DEFINE_INT_FORMATTERS(ULongLong) + +/** + \rst + Returns a string formatter that pads the formatted argument with the fill + character to the specified width using the default (left) string alignment. + + **Example**:: + + std::string s = str(MemoryWriter() << pad("abc", 8)); + // s == "abc " + + \endrst + */ +template +inline StrFormatSpec pad( + const Char *str, unsigned width, Char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +inline StrFormatSpec pad( + const wchar_t *str, unsigned width, char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +namespace internal { + +template +class ArgMap { + private: + typedef std::vector< + std::pair, internal::Arg> > MapType; + typedef typename MapType::value_type Pair; + + MapType map_; + + public: + FMT_API void init(const ArgList &args); + + const internal::Arg* find(const fmt::BasicStringRef &name) const { + // The list is unsorted, so just return the first matching name. + for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); + it != end; ++it) { + if (it->first == name) + return &it->second; + } + return 0; + } +}; + +template +class ArgFormatterBase : public ArgVisitor { + private: + BasicWriter &writer_; + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase); + + void write_pointer(const void *p) { + spec_.flags_ = HASH_FLAG; + spec_.type_ = 'x'; + writer_.write_int(reinterpret_cast(p), spec_); + } + + protected: + BasicWriter &writer() { return writer_; } + FormatSpec &spec() { return spec_; } + + void write(bool value) { + const char *str_value = value ? "true" : "false"; + Arg::StringValue str = { str_value, std::strlen(str_value) }; + writer_.write_str(str, spec_); + } + + void write(const char *value) { + Arg::StringValue str = {value, value != 0 ? std::strlen(value) : 0}; + writer_.write_str(str, spec_); + } + + public: + ArgFormatterBase(BasicWriter &w, FormatSpec &s) + : writer_(w), spec_(s) {} + + template + void visit_any_int(T value) { writer_.write_int(value, spec_); } + + template + void visit_any_double(T value) { writer_.write_double(value, spec_); } + + void visit_bool(bool value) { + if (spec_.type_) + return visit_any_int(value); + write(value); + } + + void visit_char(int value) { + if (spec_.type_ && spec_.type_ != 'c') { + spec_.flags_ |= CHAR_FLAG; + writer_.write_int(value, spec_); + return; + } + if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) + FMT_THROW(FormatError("invalid format specifier for char")); + typedef typename BasicWriter::CharPtr CharPtr; + Char fill = internal::CharTraits::cast(spec_.fill()); + CharPtr out = CharPtr(); + const unsigned CHAR_WIDTH = 1; + if (spec_.width_ > CHAR_WIDTH) { + out = writer_.grow_buffer(spec_.width_); + if (spec_.align_ == ALIGN_RIGHT) { + std::uninitialized_fill_n(out, spec_.width_ - CHAR_WIDTH, fill); + out += spec_.width_ - CHAR_WIDTH; + } else if (spec_.align_ == ALIGN_CENTER) { + out = writer_.fill_padding(out, spec_.width_, + internal::check(CHAR_WIDTH), fill); + } else { + std::uninitialized_fill_n(out + CHAR_WIDTH, + spec_.width_ - CHAR_WIDTH, fill); + } + } else { + out = writer_.grow_buffer(CHAR_WIDTH); + } + *out = internal::CharTraits::cast(value); + } + + void visit_cstring(const char *value) { + if (spec_.type_ == 'p') + return write_pointer(value); + write(value); + } + + void visit_string(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + using ArgVisitor::visit_wstring; + + void visit_wstring(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + void visit_pointer(const void *value) { + if (spec_.type_ && spec_.type_ != 'p') + report_unknown_type(spec_.type_, "pointer"); + write_pointer(value); + } +}; + +class FormatterBase { + private: + ArgList args_; + int next_arg_index_; + + // Returns the argument with specified index. + FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); + + protected: + const ArgList &args() const { return args_; } + + explicit FormatterBase(const ArgList &args) { + args_ = args; + next_arg_index_ = 0; + } + + // Returns the next argument. + Arg next_arg(const char *&error) { + if (next_arg_index_ >= 0) + return do_get_arg(internal::to_unsigned(next_arg_index_++), error); + error = "cannot switch from manual to automatic argument indexing"; + return Arg(); + } + + // Checks if manual indexing is used and returns the argument with + // specified index. + Arg get_arg(unsigned arg_index, const char *&error) { + return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); + } + + bool check_no_auto_index(const char *&error) { + if (next_arg_index_ > 0) { + error = "cannot switch from automatic to manual argument indexing"; + return false; + } + next_arg_index_ = -1; + return true; + } + + template + void write(BasicWriter &w, const Char *start, const Char *end) { + if (start != end) + w << BasicStringRef(start, internal::to_unsigned(end - start)); + } +}; + +// A printf formatter. +template +class PrintfFormatter : private FormatterBase { + private: + void parse_flags(FormatSpec &spec, const Char *&s); + + // Returns the argument with specified index or, if arg_index is equal + // to the maximum unsigned value, the next argument. + Arg get_arg(const Char *s, + unsigned arg_index = (std::numeric_limits::max)()); + + // Parses argument index, flags and width and returns the argument index. + unsigned parse_header(const Char *&s, FormatSpec &spec); + + public: + explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} + FMT_API void format(BasicWriter &writer, + BasicCStringRef format_str); +}; +} // namespace internal + +/** + \rst + An argument formatter based on the `curiously recurring template pattern + `_. + + To use `~fmt::BasicArgFormatter` define a subclass that implements some or + all of the visit methods with the same signatures as the methods in + `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. When a formatting + function processes an argument, it will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::BasicArgFormatter` or its superclass + will be called. + \endrst + */ +template +class BasicArgFormatter : public internal::ArgFormatterBase { + private: + BasicFormatter &formatter_; + const Char *format_; + + public: + /** + \rst + Constructs an argument formatter object. + *formatter* is a reference to the main formatter object, *spec* contains + format specifier information for standard argument types, and *fmt* points + to the part of the format string being parsed for custom argument types. + \endrst + */ + BasicArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : internal::ArgFormatterBase(formatter.writer(), spec), + formatter_(formatter), format_(fmt) {} + + /** Formats argument of a custom (user-defined) type. */ + void visit_custom(internal::Arg::CustomValue c) { + c.format(&formatter_, c.value, &format_); + } +}; + +/** The default argument formatter. */ +template +class ArgFormatter : public BasicArgFormatter, Char> { + public: + /** Constructs an argument formatter object. */ + ArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : BasicArgFormatter, Char>(formatter, spec, fmt) {} +}; + +/** This template formats data and writes the output to a writer. */ +template +class BasicFormatter : private internal::FormatterBase { + public: + /** The character type for the output. */ + typedef CharType Char; + + private: + BasicWriter &writer_; + internal::ArgMap map_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); + + using internal::FormatterBase::get_arg; + + // Checks if manual indexing is used and returns the argument with + // specified name. + internal::Arg get_arg(BasicStringRef arg_name, const char *&error); + + // Parses argument index and returns corresponding argument. + internal::Arg parse_arg_index(const Char *&s); + + // Parses argument name and returns corresponding argument. + internal::Arg parse_arg_name(const Char *&s); + + public: + /** + \rst + Constructs a ``BasicFormatter`` object. References to the arguments and + the writer are stored in the formatter object so make sure they have + appropriate lifetimes. + \endrst + */ + BasicFormatter(const ArgList &args, BasicWriter &w) + : internal::FormatterBase(args), writer_(w) {} + + /** Returns a reference to the writer associated with this formatter. */ + BasicWriter &writer() { return writer_; } + + /** Formats stored arguments and writes the output to the writer. */ + void format(BasicCStringRef format_str); + + // Formats a single argument and advances format_str, a format string pointer. + const Char *format(const Char *&format_str, const internal::Arg &arg); +}; + +// Generates a comma-separated list with results of applying f to +// numbers 0..n-1. +# define FMT_GEN(n, f) FMT_GEN##n(f) +# define FMT_GEN1(f) f(0) +# define FMT_GEN2(f) FMT_GEN1(f), f(1) +# define FMT_GEN3(f) FMT_GEN2(f), f(2) +# define FMT_GEN4(f) FMT_GEN3(f), f(3) +# define FMT_GEN5(f) FMT_GEN4(f), f(4) +# define FMT_GEN6(f) FMT_GEN5(f), f(5) +# define FMT_GEN7(f) FMT_GEN6(f), f(6) +# define FMT_GEN8(f) FMT_GEN7(f), f(7) +# define FMT_GEN9(f) FMT_GEN8(f), f(8) +# define FMT_GEN10(f) FMT_GEN9(f), f(9) +# define FMT_GEN11(f) FMT_GEN10(f), f(10) +# define FMT_GEN12(f) FMT_GEN11(f), f(11) +# define FMT_GEN13(f) FMT_GEN12(f), f(12) +# define FMT_GEN14(f) FMT_GEN13(f), f(13) +# define FMT_GEN15(f) FMT_GEN14(f), f(14) + +namespace internal { +inline uint64_t make_type() { return 0; } + +template +inline uint64_t make_type(const T &arg) { + return MakeValue< BasicFormatter >::type(arg); +} + +template +struct ArgArray; + +template +struct ArgArray { + typedef Value Type[N > 0 ? N : 1]; + + template + static Value make(const T &value) { +#ifdef __clang__ + Value result = MakeValue(value); + // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: + // https://github.com/fmtlib/fmt/issues/276 + (void)result.custom.format; + return result; +#else + return MakeValue(value); +#endif + } +}; + +template +struct ArgArray { + typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE + + template + static Arg make(const T &value) { return MakeArg(value); } +}; + +#if FMT_USE_VARIADIC_TEMPLATES +template +inline uint64_t make_type(const Arg &first, const Args & ... tail) { + return make_type(first) | (make_type(tail...) << 4); +} + +#else + +struct ArgType { + uint64_t type; + + ArgType() : type(0) {} + + template + ArgType(const T &arg) : type(make_type(arg)) {} +}; + +# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() + +inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { + return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | + (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | + (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | + (t12.type << 48) | (t13.type << 52) | (t14.type << 56); +} +#endif +} // namespace internal + +# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n +# define FMT_MAKE_ARG_TYPE(n) T##n +# define FMT_MAKE_ARG(n) const T##n &v##n +# define FMT_ASSIGN_char(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_ASSIGN_wchar_t(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) + +#if FMT_USE_VARIADIC_TEMPLATES +// Defines a variadic function returning void. +# define FMT_VARIADIC_VOID(func, arg_type) \ + template \ + void func(arg_type arg0, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +// Defines a variadic constructor. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +#else + +# define FMT_MAKE_REF(n) \ + fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_MAKE_REF2(n) v##n + +// Defines a wrapper for a function taking one argument of type arg_type +// and n additional arguments of arbitrary types. +# define FMT_WRAP1(func, arg_type, n) \ + template \ + inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic function returning void on a pre-C++11 compiler. +# define FMT_VARIADIC_VOID(func, arg_type) \ + inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ + FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ + FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ + FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ + FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ + FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) + +# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg0, arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic constructor on a pre-C++11 compiler. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) +#endif + +// Generates a comma-separated list with results of applying f to pairs +// (argument, index). +#define FMT_FOR_EACH1(f, x0) f(x0, 0) +#define FMT_FOR_EACH2(f, x0, x1) \ + FMT_FOR_EACH1(f, x0), f(x1, 1) +#define FMT_FOR_EACH3(f, x0, x1, x2) \ + FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) +#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ + FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) +#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ + FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) +#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ + FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) +#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ + FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) +#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ + FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) +#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ + FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) +#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) + +/** + An error returned by an operating system or a language runtime, + for example a file opening error. +*/ +class SystemError : public internal::RuntimeError { + private: + void init(int err_code, CStringRef format_str, ArgList args); + + protected: + int error_code_; + + typedef char Char; // For FMT_VARIADIC_CTOR. + + SystemError() {} + + public: + /** + \rst + Constructs a :class:`fmt::SystemError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is + the system message corresponding to the error code. + *error_code* is a system error code as given by ``errno``. + If *error_code* is not a valid error code such as -1, the system message + may look like "Unknown error -1" and is platform-dependent. + + **Example**:: + + // This throws a SystemError with the description + // cannot open file 'madeup': No such file or directory + // or similar (system message may vary). + const char *filename = "madeup"; + std::FILE *file = std::fopen(filename, "r"); + if (!file) + throw fmt::SystemError(errno, "cannot open file '{}'", filename); + \endrst + */ + SystemError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) + + int error_code() const { return error_code_; } +}; + +/** + \rst + This template provides operations for formatting and writing data into + a character stream. The output is stored in a buffer provided by a subclass + such as :class:`fmt::BasicMemoryWriter`. + + You can use one of the following typedefs for common character types: + + +---------+----------------------+ + | Type | Definition | + +=========+======================+ + | Writer | BasicWriter | + +---------+----------------------+ + | WWriter | BasicWriter | + +---------+----------------------+ + + \endrst + */ +template +class BasicWriter { + private: + // Output buffer. + Buffer &buffer_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); + + typedef typename internal::CharTraits::CharPtr CharPtr; + +#if FMT_SECURE_SCL + // Returns pointer value. + static Char *get(CharPtr p) { return p.base(); } +#else + static Char *get(Char *p) { return p; } +#endif + + // Fills the padding around the content and returns the pointer to the + // content area. + static CharPtr fill_padding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); + + // Grows the buffer by n characters and returns a pointer to the newly + // allocated area. + CharPtr grow_buffer(std::size_t n) { + std::size_t size = buffer_.size(); + buffer_.resize(size + n); + return internal::make_ptr(&buffer_[size], n); + } + + // Writes an unsigned decimal integer. + template + Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) { + unsigned num_digits = internal::count_digits(value); + Char *ptr = get(grow_buffer(prefix_size + num_digits)); + internal::format_decimal(ptr + prefix_size, value, num_digits); + return ptr; + } + + // Writes a decimal integer. + template + void write_decimal(Int value) { + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) { + abs_value = 0 - abs_value; + *write_unsigned_decimal(abs_value, 1) = '-'; + } else { + write_unsigned_decimal(abs_value, 0); + } + } + + // Prepare a buffer for integer formatting. + CharPtr prepare_int_buffer(unsigned num_digits, + const EmptySpec &, const char *prefix, unsigned prefix_size) { + unsigned size = prefix_size + num_digits; + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + + template + CharPtr prepare_int_buffer(unsigned num_digits, + const Spec &spec, const char *prefix, unsigned prefix_size); + + // Formats an integer. + template + void write_int(T value, Spec spec); + + // Formats a floating-point number (double or long double). + template + void write_double(T value, const FormatSpec &spec); + + // Writes a formatted string. + template + CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec); + + template + void write_str(const internal::Arg::StringValue &str, + const FormatSpec &spec); + + // This following methods are private to disallow writing wide characters + // and strings to a char stream. If you want to print a wide string as a + // pointer as std::ostream does, cast it to const void*. + // Do not implement! + void operator<<(typename internal::WCharHelper::Unsupported); + void operator<<( + typename internal::WCharHelper::Unsupported); + + // Appends floating-point length specifier to the format string. + // The second argument is only used for overload resolution. + void append_float_length(Char *&format_ptr, long double) { + *format_ptr++ = 'L'; + } + + template + void append_float_length(Char *&, T) {} + + template + friend class internal::ArgFormatterBase; + + friend class internal::PrintfArgFormatter; + + protected: + /** + Constructs a ``BasicWriter`` object. + */ + explicit BasicWriter(Buffer &b) : buffer_(b) {} + + public: + /** + \rst + Destroys a ``BasicWriter`` object. + \endrst + */ + virtual ~BasicWriter() {} + + /** + Returns the total number of characters written. + */ + std::size_t size() const { return buffer_.size(); } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const Char *c_str() const { + std::size_t size = buffer_.size(); + buffer_.reserve(size + 1); + buffer_[size] = '\0'; + return &buffer_[0]; + } + + /** + \rst + Returns the content of the output buffer as an `std::string`. + \endrst + */ + std::basic_string str() const { + return std::basic_string(&buffer_[0], buffer_.size()); + } + + /** + \rst + Writes formatted data. + + *args* is an argument list representing arbitrary arguments. + + **Example**:: + + MemoryWriter out; + out.write("Current point:\n"); + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + Current point: + (-3.140000, +3.140000) + + The output can be accessed using :func:`data()`, :func:`c_str` or + :func:`str` methods. + + See also :ref:`syntax`. + \endrst + */ + void write(BasicCStringRef format, ArgList args) { + BasicFormatter(args, *this).format(format); + } + FMT_VARIADIC_VOID(write, BasicCStringRef) + + BasicWriter &operator<<(int value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(long value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned long value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(LongLong value) { + write_decimal(value); + return *this; + } + + /** + \rst + Formats *value* and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(ULongLong value) { + return *this << IntFormatSpec(value); + } + + BasicWriter &operator<<(double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + \rst + Formats *value* using the general format for floating-point numbers + (``'g'``) and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(long double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + Writes a character to the stream. + */ + BasicWriter &operator<<(char value) { + buffer_.push_back(value); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + buffer_.push_back(value); + return *this; + } + + /** + \rst + Writes *value* to the stream. + \endrst + */ + BasicWriter &operator<<(fmt::BasicStringRef value) { + const Char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + const char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + template + BasicWriter &operator<<(IntFormatSpec spec) { + internal::CharTraits::convert(FillChar()); + write_int(spec.value(), spec); + return *this; + } + + template + BasicWriter &operator<<(const StrFormatSpec &spec) { + const StrChar *s = spec.str(); + write_str(s, std::char_traits::length(s), spec); + return *this; + } + + void clear() FMT_NOEXCEPT { buffer_.clear(); } + + Buffer &buffer() FMT_NOEXCEPT { return buffer_; } +}; + +template +template +typename BasicWriter::CharPtr BasicWriter::write_str( + const StrChar *s, std::size_t size, const AlignSpec &spec) { + CharPtr out = CharPtr(); + if (spec.width() > size) { + out = grow_buffer(spec.width()); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.align() == ALIGN_RIGHT) { + std::uninitialized_fill_n(out, spec.width() - size, fill); + out += spec.width() - size; + } else if (spec.align() == ALIGN_CENTER) { + out = fill_padding(out, spec.width(), size, fill); + } else { + std::uninitialized_fill_n(out + size, spec.width() - size, fill); + } + } else { + out = grow_buffer(size); + } + std::uninitialized_copy(s, s + size, out); + return out; +} + +template +template +void BasicWriter::write_str( + const internal::Arg::StringValue &s, const FormatSpec &spec) { + // Check if StrChar is convertible to Char. + internal::CharTraits::convert(StrChar()); + if (spec.type_ && spec.type_ != 's') + internal::report_unknown_type(spec.type_, "string"); + const StrChar *str_value = s.value; + std::size_t str_size = s.size; + if (str_size == 0) { + if (!str_value) { + FMT_THROW(FormatError("string pointer is null")); + return; + } + } + std::size_t precision = static_cast(spec.precision_); + if (spec.precision_ >= 0 && precision < str_size) + str_size = precision; + write_str(str_value, str_size, spec); +} + +template +typename BasicWriter::CharPtr + BasicWriter::fill_padding( + CharPtr buffer, unsigned total_size, + std::size_t content_size, wchar_t fill) { + std::size_t padding = total_size - content_size; + std::size_t left_padding = padding / 2; + Char fill_char = internal::CharTraits::cast(fill); + std::uninitialized_fill_n(buffer, left_padding, fill_char); + buffer += left_padding; + CharPtr content = buffer; + std::uninitialized_fill_n(buffer + content_size, + padding - left_padding, fill_char); + return content; +} + +template +template +typename BasicWriter::CharPtr + BasicWriter::prepare_int_buffer( + unsigned num_digits, const Spec &spec, + const char *prefix, unsigned prefix_size) { + unsigned width = spec.width(); + Alignment align = spec.align(); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.precision() > static_cast(num_digits)) { + // Octal prefix '0' is counted as a digit, so ignore it if precision + // is specified. + if (prefix_size > 0 && prefix[prefix_size - 1] == '0') + --prefix_size; + unsigned number_size = + prefix_size + internal::to_unsigned(spec.precision()); + AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); + if (number_size >= width) + return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); + buffer_.reserve(width); + unsigned fill_size = width - number_size; + if (align != ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + CharPtr result = prepare_int_buffer( + num_digits, subspec, prefix, prefix_size); + if (align == ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + return result; + } + unsigned size = prefix_size + num_digits; + if (width <= size) { + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + CharPtr p = grow_buffer(width); + CharPtr end = p + width; + if (align == ALIGN_LEFT) { + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + std::uninitialized_fill(p, end, fill); + } else if (align == ALIGN_CENTER) { + p = fill_padding(p, width, size, fill); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + } else { + if (align == ALIGN_NUMERIC) { + if (prefix_size != 0) { + p = std::uninitialized_copy(prefix, prefix + prefix_size, p); + size -= prefix_size; + } + } else { + std::uninitialized_copy(prefix, prefix + prefix_size, end - size); + } + std::uninitialized_fill(p, end - size, fill); + p = end; + } + return p - 1; +} + +template +template +void BasicWriter::write_int(T value, Spec spec) { + unsigned prefix_size = 0; + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType abs_value = static_cast(value); + char prefix[4] = ""; + if (internal::is_negative(value)) { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } else if (spec.flag(SIGN_FLAG)) { + prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; + ++prefix_size; + } + switch (spec.type()) { + case 0: case 'd': { + unsigned num_digits = internal::count_digits(abs_value); + CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0); + break; + } + case 'x': case 'X': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 4) != 0); + Char *p = get(prepare_int_buffer( + num_digits, spec, prefix, prefix_size)); + n = abs_value; + const char *digits = spec.type() == 'x' ? + "0123456789abcdef" : "0123456789ABCDEF"; + do { + *p-- = digits[n & 0xf]; + } while ((n >>= 4) != 0); + break; + } + case 'b': case 'B': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 1) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 1)); + } while ((n >>= 1) != 0); + break; + } + case 'o': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + prefix[prefix_size++] = '0'; + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 3) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 7)); + } while ((n >>= 3) != 0); + break; + } + case 'n': { + unsigned num_digits = internal::count_digits(abs_value); + fmt::StringRef sep = std::localeconv()->thousands_sep; + unsigned size = static_cast( + num_digits + sep.size() * (num_digits - 1) / 3); + CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep)); + break; + } + default: + internal::report_unknown_type( + spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); + break; + } +} + +template +template +void BasicWriter::write_double(T value, const FormatSpec &spec) { + // Check type. + char type = spec.type(); + bool upper = false; + switch (type) { + case 0: + type = 'g'; + break; + case 'e': case 'f': case 'g': case 'a': + break; + case 'F': +#ifdef _MSC_VER + // MSVC's printf doesn't support 'F'. + type = 'f'; +#endif + // Fall through. + case 'E': case 'G': case 'A': + upper = true; + break; + default: + internal::report_unknown_type(type, "double"); + break; + } + + char sign = 0; + // Use isnegative instead of value < 0 because the latter is always + // false for NaN. + if (internal::FPUtil::isnegative(static_cast(value))) { + sign = '-'; + value = -value; + } else if (spec.flag(SIGN_FLAG)) { + sign = spec.flag(PLUS_FLAG) ? '+' : ' '; + } + + if (internal::FPUtil::isnotanumber(value)) { + // Format NaN ourselves because sprintf's output is not consistent + // across platforms. + std::size_t nan_size = 4; + const char *nan = upper ? " NAN" : " nan"; + if (!sign) { + --nan_size; + ++nan; + } + CharPtr out = write_str(nan, nan_size, spec); + if (sign) + *out = sign; + return; + } + + if (internal::FPUtil::isinfinity(value)) { + // Format infinity ourselves because sprintf's output is not consistent + // across platforms. + std::size_t inf_size = 4; + const char *inf = upper ? " INF" : " inf"; + if (!sign) { + --inf_size; + ++inf; + } + CharPtr out = write_str(inf, inf_size, spec); + if (sign) + *out = sign; + return; + } + + std::size_t offset = buffer_.size(); + unsigned width = spec.width(); + if (sign) { + buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u)); + if (width > 0) + --width; + ++offset; + } + + // Build format string. + enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg + Char format[MAX_FORMAT_SIZE]; + Char *format_ptr = format; + *format_ptr++ = '%'; + unsigned width_for_sprintf = width; + if (spec.flag(HASH_FLAG)) + *format_ptr++ = '#'; + if (spec.align() == ALIGN_CENTER) { + width_for_sprintf = 0; + } else { + if (spec.align() == ALIGN_LEFT) + *format_ptr++ = '-'; + if (width != 0) + *format_ptr++ = '*'; + } + if (spec.precision() >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + + append_float_length(format_ptr, value); + *format_ptr++ = type; + *format_ptr = '\0'; + + // Format using snprintf. + Char fill = internal::CharTraits::cast(spec.fill()); + unsigned n = 0; + Char *start = 0; + for (;;) { + std::size_t buffer_size = buffer_.capacity() - offset; +#ifdef _MSC_VER + // MSVC's vsnprintf_s doesn't work with zero size, so reserve + // space for at least one extra character to make the size non-zero. + // Note that the buffer's capacity will increase by more than 1. + if (buffer_size == 0) { + buffer_.reserve(offset + 1); + buffer_size = buffer_.capacity() - offset; + } +#endif + start = &buffer_[offset]; + int result = internal::CharTraits::format_float( + start, buffer_size, format, width_for_sprintf, spec.precision(), value); + if (result >= 0) { + n = internal::to_unsigned(result); + if (offset + n < buffer_.capacity()) + break; // The buffer is large enough - continue with formatting. + buffer_.reserve(offset + n + 1); + } else { + // If result is negative we ask to increase the capacity by at least 1, + // but as std::vector, the buffer grows exponentially. + buffer_.reserve(buffer_.capacity() + 1); + } + } + if (sign) { + if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || + *start != ' ') { + *(start - 1) = sign; + sign = 0; + } else { + *(start - 1) = fill; + } + ++n; + } + if (spec.align() == ALIGN_CENTER && spec.width() > n) { + width = spec.width(); + CharPtr p = grow_buffer(width); + std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); + fill_padding(p, spec.width(), n, fill); + return; + } + if (spec.fill() != ' ' || sign) { + while (*start == ' ') + *start++ = fill; + if (sign) + *(start - 1) = sign; + } + grow_buffer(n); +} + +/** + \rst + This class template provides operations for formatting and writing data + into a character stream. The output is stored in a memory buffer that grows + dynamically. + + You can use one of the following typedefs for common character types + and the standard allocator: + + +---------------+-----------------------------------------------------+ + | Type | Definition | + +===============+=====================================================+ + | MemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + | WMemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + + **Example**:: + + MemoryWriter out; + out << "The answer is " << 42 << "\n"; + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42 + (-3.140000, +3.140000) + + The output can be converted to an ``std::string`` with ``out.str()`` or + accessed as a C string with ``out.c_str()``. + \endrst + */ +template > +class BasicMemoryWriter : public BasicWriter { + private: + internal::MemoryBuffer buffer_; + + public: + explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) + : BasicWriter(buffer_), buffer_(alloc) {} + +#if FMT_USE_RVALUE_REFERENCES + /** + \rst + Constructs a :class:`fmt::BasicMemoryWriter` object moving the content + of the other object to it. + \endrst + */ + BasicMemoryWriter(BasicMemoryWriter &&other) + : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) { + } + + /** + \rst + Moves the content of the other ``BasicMemoryWriter`` object to this one. + \endrst + */ + BasicMemoryWriter &operator=(BasicMemoryWriter &&other) { + buffer_ = std::move(other.buffer_); + return *this; + } +#endif +}; + +typedef BasicMemoryWriter MemoryWriter; +typedef BasicMemoryWriter WMemoryWriter; + +/** + \rst + This class template provides operations for formatting and writing data + into a fixed-size array. For writing into a dynamically growing buffer + use :class:`fmt::BasicMemoryWriter`. + + Any write method will throw ``std::runtime_error`` if the output doesn't fit + into the array. + + You can use one of the following typedefs for common character types: + + +--------------+---------------------------+ + | Type | Definition | + +==============+===========================+ + | ArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + | WArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + \endrst + */ +template +class BasicArrayWriter : public BasicWriter { + private: + internal::FixedBuffer buffer_; + + public: + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + given size. + \endrst + */ + BasicArrayWriter(Char *array, std::size_t size) + : BasicWriter(buffer_), buffer_(array, size) {} + + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + size known at compile time. + \endrst + */ + template + explicit BasicArrayWriter(Char (&array)[SIZE]) + : BasicWriter(buffer_), buffer_(array, SIZE) {} +}; + +typedef BasicArrayWriter ArrayWriter; +typedef BasicArrayWriter WArrayWriter; + +// Reports a system error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_system_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#if FMT_USE_WINDOWS_H + +/** A Windows error. */ +class WindowsError : public SystemError { + private: + FMT_API void init(int error_code, CStringRef format_str, ArgList args); + + public: + /** + \rst + Constructs a :class:`fmt::WindowsError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is the + system message corresponding to the error code. + *error_code* is a Windows error code as given by ``GetLastError``. + If *error_code* is not a valid error code such as -1, the system message + will look like "error -1". + + **Example**:: + + // This throws a WindowsError with the description + // cannot open file 'madeup': The system cannot find the file specified. + // or similar (system message may vary). + const char *filename = "madeup"; + LPOFSTRUCT of = LPOFSTRUCT(); + HFILE file = OpenFile(filename, &of, OF_READ); + if (file == HFILE_ERROR) { + throw fmt::WindowsError(GetLastError(), + "cannot open file '{}'", filename); + } + \endrst + */ + WindowsError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) +}; + +// Reports a Windows error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_windows_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#endif + +enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; + +/** + Formats a string and prints it to stdout using ANSI escape sequences + to specify color (experimental). + Example: + print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); + */ +FMT_API void print_colored(Color c, CStringRef format, ArgList args); + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = format("The answer is {}", 42); + \endrst +*/ +inline std::string format(CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +inline std::wstring format(WCStringRef format_str, ArgList args) { + WMemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + print(stderr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +FMT_API void print(CStringRef format_str, ArgList args); + +template +void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { + internal::PrintfFormatter(args).format(w, format); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = fmt::sprintf("The answer is %d", 42); + \endrst +*/ +inline std::string sprintf(CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + return w.str(); +} + +inline std::wstring sprintf(WCStringRef format, ArgList args) { + WMemoryWriter w; + printf(w, format, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + fmt::fprintf(stderr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + fmt::printf("Elapsed time: %.2f seconds", 1.23); + \endrst + */ +inline int printf(CStringRef format, ArgList args) { + return fprintf(stdout, format, args); +} + +/** + Fast integer formatter. + */ +class FormatInt { + private: + // Buffer should be large enough to hold all digits (digits10 + 1), + // a sign and a null character. + enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; + mutable char buffer_[BUFFER_SIZE]; + char *str_; + + // Formats value in reverse and returns the number of digits. + char *format_decimal(ULongLong value) { + char *buffer_end = buffer_ + BUFFER_SIZE - 1; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + } + if (value < 10) { + *--buffer_end = static_cast('0' + value); + return buffer_end; + } + unsigned index = static_cast(value * 2); + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + return buffer_end; + } + + void FormatSigned(LongLong value) { + ULongLong abs_value = static_cast(value); + bool negative = value < 0; + if (negative) + abs_value = 0 - abs_value; + str_ = format_decimal(abs_value); + if (negative) + *--str_ = '-'; + } + + public: + explicit FormatInt(int value) { FormatSigned(value); } + explicit FormatInt(long value) { FormatSigned(value); } + explicit FormatInt(LongLong value) { FormatSigned(value); } + explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} + explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} + explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} + + /** Returns the number of characters written to the output buffer. */ + std::size_t size() const { + return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); + } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const char *data() const { return str_; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const char *c_str() const { + buffer_[BUFFER_SIZE - 1] = '\0'; + return str_; + } + + /** + \rst + Returns the content of the output buffer as an ``std::string``. + \endrst + */ + std::string str() const { return std::string(str_, size()); } +}; + +// Formats a decimal integer value writing into buffer and returns +// a pointer to the end of the formatted string. This function doesn't +// write a terminating null character. +template +inline void format_decimal(char *&buffer, T value) { + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) { + *buffer++ = '-'; + abs_value = 0 - abs_value; + } + if (abs_value < 100) { + if (abs_value < 10) { + *buffer++ = static_cast('0' + abs_value); + return; + } + unsigned index = static_cast(abs_value * 2); + *buffer++ = internal::Data::DIGITS[index]; + *buffer++ = internal::Data::DIGITS[index + 1]; + return; + } + unsigned num_digits = internal::count_digits(abs_value); + internal::format_decimal(buffer, abs_value, num_digits); + buffer += num_digits; +} + +/** + \rst + Returns a named argument for formatting functions. + + **Example**:: + + print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); + + \endrst + */ +template +inline internal::NamedArg arg(StringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +template +inline internal::NamedArg arg(WStringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +// The following two functions are deleted intentionally to disable +// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. +template +void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +template +void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +} + +#if FMT_GCC_VERSION +// Use the system_header pragma to suppress warnings about variadic macros +// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't +// work. It is used at the end because we want to suppress as little warnings +// as possible. +# pragma GCC system_header +#endif + +// This is used to work around VC++ bugs in handling variadic macros. +#define FMT_EXPAND(args) args + +// Returns the number of arguments. +// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. +#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) +#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) +#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define FMT_CONCAT(a, b) a##b +#define FMT_FOR_EACH_(N, f, ...) \ + FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) +#define FMT_FOR_EACH(f, ...) \ + FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) + +#define FMT_ADD_ARG_NAME(type, index) type arg##index +#define FMT_GET_ARG_NAME(type, index) arg##index + +#if FMT_USE_VARIADIC_TEMPLATES +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + template \ + ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ + fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } +#else +// Defines a wrapper for a function taking __VA_ARGS__ arguments +// and n additional arguments of arbitrary types. +# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ + template \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + FMT_GEN(n, FMT_MAKE_ARG)) { \ + fmt::internal::ArgArray::Type arr; \ + FMT_GEN(n, FMT_ASSIGN_##Char); \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ + } + +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ + } \ + FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) +#endif // FMT_USE_VARIADIC_TEMPLATES + +/** + \rst + Defines a variadic function with the specified return type, function name + and argument types passed as variable arguments to this macro. + + **Example**:: + + void print_error(const char *file, int line, const char *format, + fmt::ArgList args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args); + } + FMT_VARIADIC(void, print_error, const char *, int, const char *) + + ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that + don't implement variadic templates. You don't have to use this macro if + you don't need legacy compiler support and can use variadic templates + directly:: + + template + void print_error(const char *file, int line, const char *format, + const Args & ... args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args...); + } + \endrst + */ +#define FMT_VARIADIC(ReturnType, func, ...) \ + FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_VARIADIC_W(ReturnType, func, ...) \ + FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) + +#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) + +/** + \rst + Convenient macro to capture the arguments' names and values into several + ``fmt::arg(name, value)``. + + **Example**:: + + int x = 1, y = 2; + print("point: ({x}, {y})", FMT_CAPTURE(x, y)); + // same as: + // print("point: ({x}, {y})", arg("x", x), arg("y", y)); + + \endrst + */ +#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) + +#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) + +namespace fmt { +FMT_VARIADIC(std::string, format, CStringRef) +FMT_VARIADIC_W(std::wstring, format, WCStringRef) +FMT_VARIADIC(void, print, CStringRef) +FMT_VARIADIC(void, print, std::FILE *, CStringRef) + +FMT_VARIADIC(void, print_colored, Color, CStringRef) +FMT_VARIADIC(std::string, sprintf, CStringRef) +FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) +FMT_VARIADIC(int, printf, CStringRef) +FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) + +namespace internal { +template +inline bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +// Parses an unsigned integer advancing s to the end of the parsed input. +// This function assumes that the first character of s is a digit. +template +unsigned parse_nonnegative_int(const Char *&s) { + assert('0' <= *s && *s <= '9'); + unsigned value = 0; + do { + unsigned new_value = value * 10 + (*s++ - '0'); + // Check if value wrapped around. + if (new_value < value) { + value = (std::numeric_limits::max)(); + break; + } + value = new_value; + } while ('0' <= *s && *s <= '9'); + // Convert to unsigned to prevent a warning. + unsigned max_int = (std::numeric_limits::max)(); + if (value > max_int) + FMT_THROW(FormatError("number is too big")); + return value; +} + +inline void require_numeric_argument(const Arg &arg, char spec) { + if (arg.type > Arg::LAST_NUMERIC_TYPE) { + std::string message = + fmt::format("format specifier '{}' requires numeric argument", spec); + FMT_THROW(fmt::FormatError(message)); + } +} + +template +void check_sign(const Char *&s, const Arg &arg) { + char sign = static_cast(*s); + require_numeric_argument(arg, sign); + if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) { + FMT_THROW(FormatError(fmt::format( + "format specifier '{}' requires signed argument", sign))); + } + ++s; +} +} // namespace internal + +template +inline internal::Arg BasicFormatter::get_arg( + BasicStringRef arg_name, const char *&error) { + if (check_no_auto_index(error)) { + map_.init(args()); + const internal::Arg *arg = map_.find(arg_name); + if (arg) + return *arg; + error = "argument not found"; + } + return internal::Arg(); +} + +template +inline internal::Arg BasicFormatter::parse_arg_index(const Char *&s) { + const char *error = 0; + internal::Arg arg = *s < '0' || *s > '9' ? + next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error); + if (error) { + FMT_THROW(FormatError( + *s != '}' && *s != ':' ? "invalid format string" : error)); + } + return arg; +} + +template +inline internal::Arg BasicFormatter::parse_arg_name(const Char *&s) { + assert(internal::is_name_start(*s)); + const Char *start = s; + Char c; + do { + c = *++s; + } while (internal::is_name_start(c) || ('0' <= c && c <= '9')); + const char *error = 0; + internal::Arg arg = get_arg(BasicStringRef(start, s - start), error); + if (error) + FMT_THROW(FormatError(error)); + return arg; +} + +template +const Char *BasicFormatter::format( + const Char *&format_str, const internal::Arg &arg) { + using internal::Arg; + const Char *s = format_str; + FormatSpec spec; + if (*s == ':') { + if (arg.type == Arg::CUSTOM) { + arg.custom.format(this, arg.custom.value, &s); + return s; + } + ++s; + // Parse fill and alignment. + if (Char c = *s) { + const Char *p = s + 1; + spec.align_ = ALIGN_DEFAULT; + do { + switch (*p) { + case '<': + spec.align_ = ALIGN_LEFT; + break; + case '>': + spec.align_ = ALIGN_RIGHT; + break; + case '=': + spec.align_ = ALIGN_NUMERIC; + break; + case '^': + spec.align_ = ALIGN_CENTER; + break; + } + if (spec.align_ != ALIGN_DEFAULT) { + if (p != s) { + if (c == '}') break; + if (c == '{') + FMT_THROW(FormatError("invalid fill character '{'")); + s += 2; + spec.fill_ = c; + } else ++s; + if (spec.align_ == ALIGN_NUMERIC) + require_numeric_argument(arg, '='); + break; + } + } while (--p >= s); + } + + // Parse sign. + switch (*s) { + case '+': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '-': + check_sign(s, arg); + spec.flags_ |= MINUS_FLAG; + break; + case ' ': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG; + break; + } + + if (*s == '#') { + require_numeric_argument(arg, '#'); + spec.flags_ |= HASH_FLAG; + ++s; + } + + // Parse zero flag. + if (*s == '0') { + require_numeric_argument(arg, '0'); + spec.align_ = ALIGN_NUMERIC; + spec.fill_ = '0'; + ++s; + } + + // Parse width. + if ('0' <= *s && *s <= '9') { + spec.width_ = internal::parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg width_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (width_arg.type) { + case Arg::INT: + if (width_arg.int_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.int_value; + break; + case Arg::UINT: + value = width_arg.uint_value; + break; + case Arg::LONG_LONG: + if (width_arg.long_long_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = width_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("width is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.width_ = static_cast(value); + } + + // Parse precision. + if (*s == '.') { + ++s; + spec.precision_ = 0; + if ('0' <= *s && *s <= '9') { + spec.precision_ = internal::parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg precision_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (precision_arg.type) { + case Arg::INT: + if (precision_arg.int_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.int_value; + break; + case Arg::UINT: + value = precision_arg.uint_value; + break; + case Arg::LONG_LONG: + if (precision_arg.long_long_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = precision_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("precision is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.precision_ = static_cast(value); + } else { + FMT_THROW(FormatError("missing precision specifier")); + } + if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) { + FMT_THROW(FormatError( + fmt::format("precision not allowed in {} format specifier", + arg.type == Arg::POINTER ? "pointer" : "integer"))); + } + } + + // Parse type. + if (*s != '}' && *s) + spec.type_ = static_cast(*s++); + } + + if (*s++ != '}') + FMT_THROW(FormatError("missing '}' in format string")); + + // Format argument. + ArgFormatter(*this, spec, s - 1).visit(arg); + return s; +} + +template +void BasicFormatter::format(BasicCStringRef format_str) { + const Char *s = format_str.c_str(); + const Char *start = s; + while (*s) { + Char c = *s++; + if (c != '{' && c != '}') continue; + if (*s == c) { + write(writer_, start, s); + start = ++s; + continue; + } + if (c == '}') + FMT_THROW(FormatError("unmatched '}' in format string")); + write(writer_, start, s - 1); + internal::Arg arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + start = s = format(s, arg); + } + write(writer_, start, s); +} +} // namespace fmt + +#if FMT_USE_USER_DEFINED_LITERALS +namespace fmt { +namespace internal { + +template +struct UdlFormat { + const Char *str; + + template + auto operator()(Args && ... args) const + -> decltype(format(str, std::forward(args)...)) { + return format(str, std::forward(args)...); + } +}; + +template +struct UdlArg { + const Char *str; + + template + NamedArg operator=(T &&value) const { + return {str, std::forward(value)}; + } +}; + +} // namespace internal + +inline namespace literals { + +/** + \rst + C++11 literal equivalent of :func:`fmt::format`. + + **Example**:: + + using namespace fmt::literals; + std::string message = "The answer is {}"_format(42); + \endrst + */ +inline internal::UdlFormat +operator"" _format(const char *s, std::size_t) { return {s}; } +inline internal::UdlFormat +operator"" _format(const wchar_t *s, std::size_t) { return {s}; } + +/** + \rst + C++11 literal equivalent of :func:`fmt::arg`. + + **Example**:: + + using namespace fmt::literals; + print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); + \endrst + */ +inline internal::UdlArg +operator"" _a(const char *s, std::size_t) { return {s}; } +inline internal::UdlArg +operator"" _a(const wchar_t *s, std::size_t) { return {s}; } + +} // inline namespace literals +} // namespace fmt +#endif // FMT_USE_USER_DEFINED_LITERALS + +// Restore warnings. +#if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic pop +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic pop +#endif + +#ifdef FMT_HEADER_ONLY +# define FMT_FUNC inline +# include "format.cc" +#else +# define FMT_FUNC +#endif + +#endif // FMT_FORMAT_H_ diff --git a/vendor/fmt-3.0.0/fmt/ostream.cc b/vendor/fmt-3.0.0/fmt/ostream.cc new file mode 100644 index 00000000..0ba30347 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/ostream.cc @@ -0,0 +1,61 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ostream.h" + +namespace fmt { + +namespace { +// Write the content of w to os. +void write(std::ostream &os, Writer &w) { + const char *data = w.data(); + typedef internal::MakeUnsigned::Type UnsignedStreamSize; + UnsignedStreamSize size = w.size(); + UnsignedStreamSize max_size = + internal::to_unsigned((std::numeric_limits::max)()); + do { + UnsignedStreamSize n = size <= max_size ? size : max_size; + os.write(data, static_cast(n)); + data += n; + size -= n; + } while (size != 0); +} +} + +FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + write(os, w); +} + +FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + write(os, w); + return static_cast(w.size()); +} +} // namespace fmt diff --git a/vendor/fmt-3.0.0/fmt/ostream.h b/vendor/fmt-3.0.0/fmt/ostream.h new file mode 100644 index 00000000..458d31de --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/ostream.h @@ -0,0 +1,133 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_OSTREAM_H_ +#define FMT_OSTREAM_H_ + +#include "format.h" +#include + +namespace fmt { + +namespace internal { + +template +class FormatBuf : public std::basic_streambuf { + private: + typedef typename std::basic_streambuf::int_type int_type; + typedef typename std::basic_streambuf::traits_type traits_type; + + Buffer &buffer_; + Char *start_; + + public: + FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { + this->setp(start_, start_ + buffer_.capacity()); + } + + int_type overflow(int_type ch = traits_type::eof()) { + if (!traits_type::eq_int_type(ch, traits_type::eof())) { + size_t buf_size = size(); + buffer_.resize(buf_size); + buffer_.reserve(buf_size * 2); + + start_ = &buffer_[0]; + start_[buf_size] = traits_type::to_char_type(ch); + this->setp(start_+ buf_size + 1, start_ + buf_size * 2); + } + return ch; + } + + size_t size() const { + return to_unsigned(this->pptr() - start_); + } +}; + +Yes &convert(std::ostream &); + +struct DummyStream : std::ostream { + DummyStream(); // Suppress a bogus warning in MSVC. + // Hide all operator<< overloads from std::ostream. + void operator<<(Null<>); +}; + +No &operator<<(std::ostream &, int); + +template +struct ConvertToIntImpl { + // Convert to int only if T doesn't have an overloaded operator<<. + enum { + value = sizeof(convert(get() << get())) == sizeof(No) + }; +}; +} // namespace internal + +// Formats a value. +template +void format(BasicFormatter &f, + const Char *&format_str, const T &value) { + internal::MemoryBuffer buffer; + + internal::FormatBuf format_buf(buffer); + std::basic_ostream output(&format_buf); + output << value; + + BasicStringRef str(&buffer[0], format_buf.size()); + typedef internal::MakeArg< BasicFormatter > MakeArg; + format_str = f.format(format_str, MakeArg(str)); +} + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + print(cerr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(void, print, std::ostream &, CStringRef) + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + fprintf(cerr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) +} // namespace fmt + +#ifdef FMT_HEADER_ONLY +# include "ostream.cc" +#endif + +#endif // FMT_OSTREAM_H_ diff --git a/vendor/fmt-3.0.0/fmt/posix.cc b/vendor/fmt-3.0.0/fmt/posix.cc new file mode 100644 index 00000000..1ec746a4 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/posix.cc @@ -0,0 +1,256 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2014 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Disable bogus MSVC warnings. +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +#include "posix.h" + +#include +#include +#include + +#ifndef _WIN32 +# include +#else +# include +# include + +# define O_CREAT _O_CREAT +# define O_TRUNC _O_TRUNC + +# ifndef S_IRUSR +# define S_IRUSR _S_IREAD +# endif + +# ifndef S_IWUSR +# define S_IWUSR _S_IWRITE +# endif + +# ifdef __MINGW32__ +# define _SH_DENYNO 0x40 +# endif + +#endif // _WIN32 + +#ifdef fileno +# undef fileno +#endif + +namespace { +#ifdef _WIN32 +// Return type of read and write functions. +typedef int RWResult; + +// On Windows the count argument to read and write is unsigned, so convert +// it from size_t preventing integer overflow. +inline unsigned convert_rwcount(std::size_t count) { + return count <= UINT_MAX ? static_cast(count) : UINT_MAX; +} +#else +// Return type of read and write functions. +typedef ssize_t RWResult; + +inline std::size_t convert_rwcount(std::size_t count) { return count; } +#endif +} + +fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT { + if (file_ && FMT_SYSTEM(fclose(file_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +fmt::BufferedFile::BufferedFile( + fmt::CStringRef filename, fmt::CStringRef mode) { + FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0); + if (!file_) + throw SystemError(errno, "cannot open file {}", filename); +} + +void fmt::BufferedFile::close() { + if (!file_) + return; + int result = FMT_SYSTEM(fclose(file_)); + file_ = 0; + if (result != 0) + throw SystemError(errno, "cannot close file"); +} + +// A macro used to prevent expansion of fileno on broken versions of MinGW. +#define FMT_ARGS + +int fmt::BufferedFile::fileno() const { + int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_)); + if (fd == -1) + throw SystemError(errno, "cannot get file descriptor"); + return fd; +} + +fmt::File::File(fmt::CStringRef path, int oflag) { + int mode = S_IRUSR | S_IWUSR; +#if defined(_WIN32) && !defined(__MINGW32__) + fd_ = -1; + FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode)); +#else + FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode))); +#endif + if (fd_ == -1) + throw SystemError(errno, "cannot open file {}", path); +} + +fmt::File::~File() FMT_NOEXCEPT { + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +void fmt::File::close() { + if (fd_ == -1) + return; + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + int result = FMT_POSIX_CALL(close(fd_)); + fd_ = -1; + if (result != 0) + throw SystemError(errno, "cannot close file"); +} + +fmt::LongLong fmt::File::size() const { +#ifdef _WIN32 + // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT + // is less than 0x0500 as is the case with some default MinGW builds. + // Both functions support large file sizes. + DWORD size_upper = 0; + HANDLE handle = reinterpret_cast(_get_osfhandle(fd_)); + DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper)); + if (size_lower == INVALID_FILE_SIZE) { + DWORD error = GetLastError(); + if (error != NO_ERROR) + throw WindowsError(GetLastError(), "cannot get file size"); + } + fmt::ULongLong long_size = size_upper; + return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower; +#else + typedef struct stat Stat; + Stat file_stat = Stat(); + if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1) + throw SystemError(errno, "cannot get file attributes"); + FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size), + "return type of File::size is not large enough"); + return file_stat.st_size; +#endif +} + +std::size_t fmt::File::read(void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + throw SystemError(errno, "cannot read from file"); + return internal::to_unsigned(result); +} + +std::size_t fmt::File::write(const void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + throw SystemError(errno, "cannot write to file"); + return internal::to_unsigned(result); +} + +fmt::File fmt::File::dup(int fd) { + // Don't retry as dup doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html + int new_fd = FMT_POSIX_CALL(dup(fd)); + if (new_fd == -1) + throw SystemError(errno, "cannot duplicate file descriptor {}", fd); + return File(new_fd); +} + +void fmt::File::dup2(int fd) { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) { + throw SystemError(errno, + "cannot duplicate file descriptor {} to {}", fd_, fd); + } +} + +void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) + ec = ErrorCode(errno); +} + +void fmt::File::pipe(File &read_end, File &write_end) { + // Close the descriptors first to make sure that assignments don't throw + // and there are no leaks. + read_end.close(); + write_end.close(); + int fds[2] = {}; +#ifdef _WIN32 + // Make the default pipe capacity same as on Linux 2.6.11+. + enum { DEFAULT_CAPACITY = 65536 }; + int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY)); +#else + // Don't retry as the pipe function doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html + int result = FMT_POSIX_CALL(pipe(fds)); +#endif + if (result != 0) + throw SystemError(errno, "cannot create pipe"); + // The following assignments don't throw because read_fd and write_fd + // are closed. + read_end = File(fds[0]); + write_end = File(fds[1]); +} + +fmt::BufferedFile fmt::File::fdopen(const char *mode) { + // Don't retry as fdopen doesn't return EINTR. + FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode)); + if (!f) + throw SystemError(errno, "cannot associate stream with file descriptor"); + BufferedFile file(f); + fd_ = -1; + return file; +} + +long fmt::getpagesize() { +#ifdef _WIN32 + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +#else + long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE)); + if (size < 0) + throw SystemError(errno, "cannot get memory page size"); + return size; +#endif +} diff --git a/vendor/fmt-3.0.0/fmt/posix.h b/vendor/fmt-3.0.0/fmt/posix.h new file mode 100644 index 00000000..ab6d12e8 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/posix.h @@ -0,0 +1,403 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2014 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_POSIX_H_ +#define FMT_POSIX_H_ + +#ifdef __MINGW32__ +// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/. +# undef __STRICT_ANSI__ +#endif + +#include +#include // for O_RDONLY +#include // for locale_t +#include +#include // for strtod_l + +#include + +#ifdef __APPLE__ +# include // for LC_NUMERIC_MASK on OS X +#endif + +#include "format.h" + +#ifndef FMT_POSIX +# if defined(_WIN32) && !defined(__MINGW32__) +// Fix warnings about deprecated symbols. +# define FMT_POSIX(call) _##call +# else +# define FMT_POSIX(call) call +# endif +#endif + +// Calls to system functions are wrapped in FMT_SYSTEM for testability. +#ifdef FMT_SYSTEM +# define FMT_POSIX_CALL(call) FMT_SYSTEM(call) +#else +# define FMT_SYSTEM(call) call +# ifdef _WIN32 +// Fix warnings about deprecated symbols. +# define FMT_POSIX_CALL(call) ::_##call +# else +# define FMT_POSIX_CALL(call) ::call +# endif +#endif + +#if FMT_GCC_VERSION >= 407 +# define FMT_UNUSED __attribute__((unused)) +#else +# define FMT_UNUSED +#endif + +#ifndef FMT_USE_STATIC_ASSERT +# define FMT_USE_STATIC_ASSERT 0 +#endif + +#if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600 +# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message) +#else +# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b) +# define FMT_STATIC_ASSERT(cond, message) \ + typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED +#endif + +// Retries the expression while it evaluates to error_result and errno +// equals to EINTR. +#ifndef _WIN32 +# define FMT_RETRY_VAL(result, expression, error_result) \ + do { \ + result = (expression); \ + } while (result == error_result && errno == EINTR) +#else +# define FMT_RETRY_VAL(result, expression, error_result) result = (expression) +#endif + +#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1) + +namespace fmt { + +// An error code. +class ErrorCode { + private: + int value_; + + public: + explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {} + + int get() const FMT_NOEXCEPT { return value_; } +}; + +// A buffered file. +class BufferedFile { + private: + FILE *file_; + + friend class File; + + explicit BufferedFile(FILE *f) : file_(f) {} + + public: + // Constructs a BufferedFile object which doesn't represent any file. + BufferedFile() FMT_NOEXCEPT : file_(0) {} + + // Destroys the object closing the file it represents if any. + ~BufferedFile() FMT_NOEXCEPT; + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + + private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy { + FILE *file; + }; + +public: + // A "move constructor" for moving from a temporary. + BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {} + + // A "move constructor" for moving from an lvalue. + BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) { + f.file_ = 0; + } + + // A "move assignment operator" for moving from a temporary. + BufferedFile &operator=(Proxy p) { + close(); + file_ = p.file; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + BufferedFile &operator=(BufferedFile &other) { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // BufferedFile file = BufferedFile(...); + operator Proxy() FMT_NOEXCEPT { + Proxy p = {file_}; + file_ = 0; + return p; + } + +#else + private: + FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile); + + public: + BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) { + other.file_ = 0; + } + + BufferedFile& operator=(BufferedFile &&other) { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } +#endif + + // Opens a file. + BufferedFile(CStringRef filename, CStringRef mode); + + // Closes the file. + void close(); + + // Returns the pointer to a FILE object representing this file. + FILE *get() const FMT_NOEXCEPT { return file_; } + + // We place parentheses around fileno to workaround a bug in some versions + // of MinGW that define fileno as a macro. + int (fileno)() const; + + void print(CStringRef format_str, const ArgList &args) { + fmt::print(file_, format_str, args); + } + FMT_VARIADIC(void, print, CStringRef) +}; + +// A file. Closed file is represented by a File object with descriptor -1. +// Methods that are not declared with FMT_NOEXCEPT may throw +// fmt::SystemError in case of failure. Note that some errors such as +// closing the file multiple times will cause a crash on Windows rather +// than an exception. You can get standard behavior by overriding the +// invalid parameter handler with _set_invalid_parameter_handler. +class File { + private: + int fd_; // File descriptor. + + // Constructs a File object with a given descriptor. + explicit File(int fd) : fd_(fd) {} + + public: + // Possible values for the oflag argument to the constructor. + enum { + RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only. + WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only. + RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing. + }; + + // Constructs a File object which doesn't represent any file. + File() FMT_NOEXCEPT : fd_(-1) {} + + // Opens a file and constructs a File object representing this file. + File(CStringRef path, int oflag); + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + + private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy { + int fd; + }; + + public: + // A "move constructor" for moving from a temporary. + File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {} + + // A "move constructor" for moving from an lvalue. + File(File &other) FMT_NOEXCEPT : fd_(other.fd_) { + other.fd_ = -1; + } + + // A "move assignment operator" for moving from a temporary. + File &operator=(Proxy p) { + close(); + fd_ = p.fd; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + File &operator=(File &other) { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // File file = File(...); + operator Proxy() FMT_NOEXCEPT { + Proxy p = {fd_}; + fd_ = -1; + return p; + } + +#else + private: + FMT_DISALLOW_COPY_AND_ASSIGN(File); + + public: + File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) { + other.fd_ = -1; + } + + File& operator=(File &&other) { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } +#endif + + // Destroys the object closing the file it represents if any. + ~File() FMT_NOEXCEPT; + + // Returns the file descriptor. + int descriptor() const FMT_NOEXCEPT { return fd_; } + + // Closes the file. + void close(); + + // Returns the file size. The size has signed type for consistency with + // stat::st_size. + LongLong size() const; + + // Attempts to read count bytes from the file into the specified buffer. + std::size_t read(void *buffer, std::size_t count); + + // Attempts to write count bytes from the specified buffer to the file. + std::size_t write(const void *buffer, std::size_t count); + + // Duplicates a file descriptor with the dup function and returns + // the duplicate as a file object. + static File dup(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; + + // Creates a pipe setting up read_end and write_end file objects for reading + // and writing respectively. + static void pipe(File &read_end, File &write_end); + + // Creates a BufferedFile object associated with this file and detaches + // this File object from the file. + BufferedFile fdopen(const char *mode); +}; + +// Returns the memory page size. +long getpagesize(); + +#if defined(LC_NUMERIC_MASK) || defined(_MSC_VER) +# define FMT_LOCALE +#endif + +#ifdef FMT_LOCALE +// A "C" numeric locale. +class Locale { + private: +# ifdef _MSC_VER + typedef _locale_t locale_t; + + enum { LC_NUMERIC_MASK = LC_NUMERIC }; + + static locale_t newlocale(int category_mask, const char *locale, locale_t) { + return _create_locale(category_mask, locale); + } + + static void freelocale(locale_t locale) { + _free_locale(locale); + } + + static double strtod_l(const char *nptr, char **endptr, _locale_t locale) { + return _strtod_l(nptr, endptr, locale); + } +# endif + + locale_t locale_; + + FMT_DISALLOW_COPY_AND_ASSIGN(Locale); + + public: + typedef locale_t Type; + + Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) { + if (!locale_) + throw fmt::SystemError(errno, "cannot create locale"); + } + ~Locale() { freelocale(locale_); } + + Type get() const { return locale_; } + + // Converts string to floating-point number and advances str past the end + // of the parsed input. + double strtod(const char *&str) const { + char *end = 0; + double result = strtod_l(str, &end, locale_); + str = end; + return result; + } +}; +#endif // FMT_LOCALE +} // namespace fmt + +#if !FMT_USE_RVALUE_REFERENCES +namespace std { +// For compatibility with C++98. +inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; } +inline fmt::File &move(fmt::File &f) { return f; } +} +#endif + +#endif // FMT_POSIX_H_ diff --git a/vendor/fmt-3.0.0/fmt/time.h b/vendor/fmt-3.0.0/fmt/time.h new file mode 100644 index 00000000..863382c0 --- /dev/null +++ b/vendor/fmt-3.0.0/fmt/time.h @@ -0,0 +1,64 @@ +/* + Formatting library for C++ - time formatting + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_TIME_H_ +#define FMT_TIME_H_ + +#include "fmt/format.h" +#include + +namespace fmt { +template +void format(BasicFormatter &f, + const char *&format_str, const std::tm &tm) { + if (*format_str == ':') + ++format_str; + const char *end = format_str; + while (*end && *end != '}') + ++end; + if (*end != '}') + FMT_THROW(FormatError("missing '}' in format string")); + internal::MemoryBuffer format; + format.append(format_str, end + 1); + format[format.size() - 1] = '\0'; + Buffer &buffer = f.writer().buffer(); + std::size_t start = buffer.size(); + for (;;) { + std::size_t size = buffer.capacity() - start; + std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm); + if (count != 0) { + buffer.resize(start + count); + break; + } + const std::size_t MIN_GROWTH = 10; + buffer.reserve(buffer.capacity() + size > MIN_GROWTH ? size : MIN_GROWTH); + } + format_str = end + 1; +} +} + +#endif // FMT_TIME_H_ -- cgit v1.2.3 From 59df18cd52b37fb69097a7ce9ad7d1e7efa734de Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove option_{flag,mask} arrays --- src/dungeon.cc | 20 ---- src/init2.cc | 31 ------ src/loadsave.cc | 120 +++++++++++------------ src/option_type.hpp | 8 +- src/options.hpp | 270 ++++++++++++++++++++++++++-------------------------- src/variable.hpp | 2 - 6 files changed, 196 insertions(+), 255 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index b2f8aa25..eeec226b 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -5147,26 +5147,6 @@ void play_game() Rand_state_init(seed); } - /* Extract the options */ - for (auto const &option: options->standard_options) - { - int os = option.o_page; - int ob = option.o_bit; - - /* Set the "default" options */ - if (option.o_var) - { - if (option_flag[os] & (1L << ob)) - { - *option.o_var = TRUE; - } - else - { - *option.o_var = FALSE; - } - } - } - /* Roll new character */ if (new_game) { diff --git a/src/init2.cc b/src/init2.cc index 4c6f7f75..0fb1a5a8 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -809,37 +809,6 @@ static errr init_other(void) (void)quark_add("uncursed"); (void)quark_add("on sale"); - - /*** Prepare the options ***/ - - /* Scan the options */ - for (auto const &option : options->standard_options) - { - int os = option.o_page; - int ob = option.o_bit; - - /* Set the "default" options */ - if (option.o_var) - { - /* Accept */ - option_mask[os] |= (1L << ob); - - /* Set */ - if (option.o_norm) - { - /* Set */ - option_flag[os] |= (1L << ob); - } - - /* Clear */ - else - { - /* Clear */ - option_flag[os] &= ~(1L << ob); - } - } - } - /* Analyze the windows */ for (n = 0; n < 8; n++) { diff --git a/src/loadsave.cc b/src/loadsave.cc index a46a8787..b3b04b9c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -68,6 +68,19 @@ enum class ls_flag_t { SAVE = 7 }; +/** + * Structure for loading/saving option values + */ +namespace { + +struct option_value { + std::string name; + bool_ value; +}; + +} // namespace (anonymous) + + /* * Basic byte-level reading from savefile. This provides a single point * of interface to the pseudoencryption that ToME (and Angband) @@ -278,6 +291,13 @@ static void do_std_string(std::string &s, ls_flag_t flag) } } +static void do_option_value(option_value *option_value, ls_flag_t flag) +{ + do_std_string(option_value->name, flag); + do_bool(&option_value->value, flag); +} + + namespace { /** @@ -1727,45 +1747,58 @@ static void do_options(ls_flag_t flag) do_bool(&options->autosave_t, flag); do_s16b(&options->autosave_freq, flag); - if (flag == ls_flag_t::LOAD) + // Standard options { - /* Read the option flags */ - for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag); + std::vector option_values; - /* Read the option masks */ - for (n = 0; n < 8; n++) do_u32b(&mask[n], flag); + // If we're saving we need to map to a vector of key-value pairs. + if (flag == ls_flag_t::SAVE) + { + for (auto const &option: options->standard_options) + { + option_values.emplace_back( + option_value { + option.o_text, + *option.o_var + } + ); + } + } - /* Analyze the options */ - for (n = 0; n < 8; n++) + // Read/write the option values + do_vector(flag, option_values, do_option_value); + + // If we're loading we need to set options based of the key-value pairs. + if (flag == ls_flag_t::LOAD) { - /* Analyze the options */ - for (i = 0; i < 32; i++) + // Go through all the options that were loaded. + for (auto const &option_value: option_values) { - /* Process valid flags */ - if (mask[n] & (1L << i)) + // We need to search through all the options + // that are actually in the game; we'll ignore + // saved options that are now gone. + const option_type *found_option; + for (auto const &option: options->standard_options) { - /* Process valid flags */ - if (option_mask[n] & (1L << i)) + if (option_value.name == option.o_text) { - /* Set */ - if (oflag[n] & (1L << i)) - { - /* Set */ - option_flag[n] |= (1L << i); - } - - /* Clear */ - else - { - /* Clear */ - option_flag[n] &= ~(1L << i); - } + found_option = &option; + break; } } + + // If we found the option, we'll set the value. + if (found_option) + { + *(*found_option).o_var = option_value.value; + } } } + } + if (flag == ls_flag_t::LOAD) + { /*** Window Options ***/ /* Read the window flags */ @@ -1804,42 +1837,9 @@ static void do_options(ls_flag_t flag) } } } + if (flag == ls_flag_t::SAVE) { - /* Analyze the options */ - for (auto const &option: options->standard_options) - { - int os = option.o_page; - int ob = option.o_bit; - - /* Process real entries */ - if (option.o_var) - { - /* Set */ - if (*option.o_var) - { - /* Set */ - option_flag[os] |= (1L << ob); - } - - /* Clear */ - else - { - /* Clear */ - option_flag[os] &= ~(1L << ob); - } - } - } - - - /*** Normal options ***/ - - /* Dump the flags */ - for (i = 0; i < 8; i++) do_u32b(&option_flag[i], flag); - - /* Dump the masks */ - for (i = 0; i < 8; i++) do_u32b(&option_mask[i], flag); - /*** Window options ***/ /* Dump the flags */ diff --git a/src/option_type.hpp b/src/option_type.hpp index 58834b79..4d8a7a51 100644 --- a/src/option_type.hpp +++ b/src/option_type.hpp @@ -8,16 +8,10 @@ struct option_type { /** - * Address of actual option variable. NULL signals the - * end of the table. + * Address of actual option variable. */ bool_ *o_var; - /** - * Default value. - */ - byte o_norm; - /** * Option page number. */ diff --git a/src/options.hpp b/src/options.hpp index a1b125a0..421a11f3 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -13,192 +13,192 @@ struct options { // // Option Set 1 -- User Interface // - bool_ rogue_like_commands; /* Rogue-like commands */ - bool_ quick_messages; /* Activate quick messages */ - bool_ carry_query_flag; /* Prompt before picking things up */ - bool_ use_old_target; /* Use old target by default */ - bool_ always_pickup; /* Pick things up by default */ - bool_ always_repeat; /* Repeat obvious commands */ - bool_ ring_bell; /* Ring the bell (on errors, etc) */ + bool_ rogue_like_commands = FALSE; /* Rogue-like commands */ + bool_ quick_messages = TRUE; /* Activate quick messages */ + bool_ carry_query_flag = FALSE; /* Prompt before picking things up */ + bool_ use_old_target = FALSE; /* Use old target by default */ + bool_ always_pickup = FALSE; /* Pick things up by default */ + bool_ always_repeat = TRUE; /* Repeat obvious commands */ + bool_ ring_bell = FALSE; /* Ring the bell (on errors, etc) */ // // Option Set 2 -- Disturbance // - bool_ find_ignore_stairs; /* Run past stairs */ - bool_ find_ignore_doors; /* Run through open doors */ - bool_ find_cut; /* Run past known corners */ - bool_ find_examine; /* Run into potential corners */ - bool_ disturb_move; /* Disturb whenever any monster moves */ - bool_ disturb_near; /* Disturb whenever viewable monster moves */ - bool_ disturb_panel; /* Disturb whenever map panel changes */ - bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */ - bool_ disturb_state; /* Disturn whenever player state changes */ - bool_ disturb_minor; /* Disturb whenever boring things happen */ - bool_ disturb_other; /* Disturb whenever various things happen */ - bool_ last_words; /* Get last words upon dying */ - bool_ small_levels; /* Allow unusually small dungeon levels */ - bool_ empty_levels; /* Allow empty 'arena' levels */ - bool_ confirm_stairs; /* Prompt before staircases... */ - bool_ wear_confirm; /* Confirm before putting on known cursed items */ - bool_ disturb_pets; /* Pets moving nearby disturb us */ + bool_ find_ignore_stairs = FALSE; /* Run past stairs */ + bool_ find_ignore_doors = TRUE; /* Run through open doors */ + bool_ find_cut = FALSE; /* Run past known corners */ + bool_ find_examine = TRUE; /* Run into potential corners */ + bool_ disturb_move = FALSE; /* Disturb whenever any monster moves */ + bool_ disturb_near = TRUE; /* Disturb whenever viewable monster moves */ + bool_ disturb_panel = TRUE; /* Disturb whenever map panel changes */ + bool_ disturb_detect = TRUE; /* Disturb whenever leaving trap-detected area */ + bool_ disturb_state = TRUE; /* Disturn whenever player state changes */ + bool_ disturb_minor = TRUE; /* Disturb whenever boring things happen */ + bool_ disturb_other = FALSE; /* Disturb whenever various things happen */ + bool_ last_words = TRUE; /* Get last words upon dying */ + bool_ wear_confirm = TRUE; /* Confirm before putting on known cursed items */ + bool_ confirm_stairs = FALSE; /* Prompt before staircases... */ + bool_ disturb_pets = FALSE; /* Pets moving nearby disturb us */ // // Option Set 3 -- Game-Play // - bool_ auto_scum; /* Auto-scum for good levels */ - bool_ view_perma_grids; /* Map remembers all perma-lit grids */ - bool_ view_torch_grids; /* Map remembers all torch-lit grids */ - bool_ dungeon_align; /* Generate dungeons with aligned rooms */ - bool_ dungeon_stair; /* Generate dungeons with connected stairs */ - bool_ flow_by_sound; /* Monsters track new player location */ - bool_ smart_learn; /* Monsters learn from their mistakes */ + bool_ auto_scum = TRUE; /* Auto-scum for good levels */ + bool_ view_perma_grids = TRUE; /* Map remembers all perma-lit grids */ + bool_ view_torch_grids = FALSE; /* Map remembers all torch-lit grids */ + bool_ dungeon_align = TRUE; /* Generate dungeons with aligned rooms */ + bool_ dungeon_stair = TRUE; /* Generate dungeons with connected stairs */ + bool_ flow_by_sound = FALSE; /* Monsters track new player location */ + bool_ smart_learn = FALSE; /* Monsters learn from their mistakes */ + bool_ small_levels = TRUE; /* Allow unusually small dungeon levels */ + bool_ empty_levels = TRUE; /* Allow empty 'arena' levels */ // // Option Set 4 -- Efficiency // - bool_ view_reduce_lite; /* Reduce lite-radius when running */ - bool_ avoid_abort; /* Avoid checking for user abort */ - bool_ avoid_shimmer; /* Avoid processing extra shimmering */ - bool_ avoid_other; /* Avoid processing special colors */ - bool_ flush_failure; /* Flush input on any failure */ - bool_ flush_disturb; /* Flush input on disturbance */ - bool_ flush_command; /* Flush input before every command */ - bool_ fresh_before; /* Flush output before normal commands */ - bool_ fresh_after; /* Flush output after normal commands */ - bool_ fresh_message; /* Flush output after all messages */ - bool_ hilite_player; /* Hilite the player with the cursor */ - bool_ view_yellow_lite; /* Use special colors for torch-lit grids */ - bool_ view_bright_lite; /* Use special colors for 'viewable' grids */ - bool_ view_granite_lite; /* Use special colors for wall grids (slow) */ - bool_ view_special_lite; /* Use special colors for floor grids (slow) */ - bool_ center_player; /* Center view on player */ + bool_ view_reduce_lite = FALSE; /* Reduce lite-radius when running */ + bool_ avoid_abort = FALSE; /* Avoid checking for user abort */ + bool_ avoid_shimmer = FALSE; /* Avoid processing extra shimmering */ + bool_ avoid_other = FALSE; /* Avoid processing special colors */ + bool_ flush_failure = TRUE; /* Flush input on any failure */ + bool_ flush_disturb = FALSE; /* Flush input on disturbance */ + bool_ flush_command = FALSE; /* Flush input before every command */ + bool_ fresh_before = TRUE; /* Flush output before normal commands */ + bool_ fresh_after = FALSE; /* Flush output after normal commands */ + bool_ fresh_message = FALSE; /* Flush output after all messages */ + bool_ hilite_player = FALSE; /* Hilite the player with the cursor */ + bool_ view_yellow_lite = FALSE; /* Use special colors for torch-lit grids */ + bool_ view_bright_lite = FALSE; /* Use special colors for 'viewable' grids */ + bool_ view_granite_lite = FALSE; /* Use special colors for wall grids (slow) */ + bool_ view_special_lite = FALSE; /* Use special colors for floor grids (slow) */ + bool_ center_player = FALSE; /* Center view on player */ // // Option Set 5 - ToME options // - bool_ linear_stats; - bool_ player_char_health; /* Display the player as a special symbol when in bad health ? */ - bool_ ingame_help; /* In-game contextual help? */ - bool_ auto_more; /* Auto more */ + bool_ ingame_help = TRUE; /* In-game contextual help? */ + bool_ auto_more = FALSE; /* Auto more */ + bool_ player_char_health = TRUE; /* Display the player as a special symbol when in bad health ? */ + bool_ linear_stats = TRUE; // // Option Set 6 - Birth options // - bool_ always_small_level; - bool_ autoroll; - bool_ fate_option; - bool_ ironman_rooms; - bool_ joke_monsters; - bool_ point_based; - bool_ preserve; - bool_ no_selling; + bool_ preserve = TRUE; /* Preserve artifacts */ + bool_ autoroll = TRUE; /* Specify 'minimal' stats to roll */ + bool_ point_based = FALSE; /* Generate character using a point system */ + bool_ ironman_rooms = FALSE; /* Always generate very unusual rooms */ + bool_ joke_monsters = FALSE; /* Allow 'joke' monsters */ + bool_ always_small_level = FALSE; /* Force small levels */ + bool_ fate_option = TRUE; /* Player can receive fates */ + bool_ no_selling = FALSE; /* Player cannot sell items */ // // Other options // - bool_ cheat_peek; /* Peek into object creation */ - bool_ cheat_hear; /* Peek into monster creation */ - bool_ cheat_room; /* Peek into dungeon creation */ - bool_ cheat_xtra; /* Peek into something else */ - bool_ cheat_live; /* Allow player to avoid death */ + bool_ cheat_peek = FALSE; /* Peek into object creation */ + bool_ cheat_hear = FALSE; /* Peek into monster creation */ + bool_ cheat_room = FALSE; /* Peek into dungeon creation */ + bool_ cheat_xtra = FALSE; /* Peek into something else */ + bool_ cheat_live = FALSE; /* Allow player to avoid death */ - byte hitpoint_warn; /* Hitpoint warning (0 to 9) */ + byte hitpoint_warn = 0; /* Hitpoint warning (0 to 9) */ - byte delay_factor; /* Delay factor (0 to 9) */ + byte delay_factor = 0; /* Delay factor (0 to 9) */ - s16b autosave_freq; /* Autosave frequency */ - bool_ autosave_t; /* Timed autosave */ - bool_ autosave_l; /* Autosave before entering new levels */ + s16b autosave_freq = 100; /* Autosave frequency */ + bool_ autosave_t = FALSE; /* Timed autosave */ + bool_ autosave_l = FALSE; /* Autosave before entering new levels */ /** * Option groups */ std::vector standard_options = { // User-Interface - { &rogue_like_commands, FALSE, 1, 0, "rogue_like_commands", "Rogue-like commands" }, - { &quick_messages , TRUE , 1, 1, "quick_messages" , "Activate quick messages" }, - { &carry_query_flag , FALSE, 1, 3, "carry_query_flag" , "Prompt before picking things up" }, - { &use_old_target , FALSE, 1, 4, "use_old_target" , "Use old target by default" }, - { &always_pickup , FALSE, 1, 5, "always_pickup" , "Pick things up by default" }, - { &always_repeat , TRUE , 1, 7, "always_repeat" , "Repeat obvious commands" }, - { &ring_bell , FALSE, 1, 18, "ring_bell" , "Audible bell (on errors, etc)" }, + { &rogue_like_commands, 1, 0, "rogue_like_commands", "Rogue-like commands" }, + { &quick_messages , 1, 1, "quick_messages" , "Activate quick messages" }, + { &carry_query_flag , 1, 3, "carry_query_flag" , "Prompt before picking things up" }, + { &use_old_target , 1, 4, "use_old_target" , "Use old target by default" }, + { &always_pickup , 1, 5, "always_pickup" , "Pick things up by default" }, + { &always_repeat , 1, 7, "always_repeat" , "Repeat obvious commands" }, + { &ring_bell , 1, 18, "ring_bell" , "Audible bell (on errors, etc)" }, // Disturbance - { &find_ignore_stairs , FALSE, 2, 0, "find_ignore_stairs" , "Run past stairs" }, - { &find_ignore_doors , TRUE , 2, 1, "find_ignore_doors" , "Run through open doors" }, - { &find_cut , FALSE, 2, 2, "find_cut" , "Run past known corners" }, - { &find_examine , TRUE , 2, 3, "find_examine" , "Run into potential corners" }, - { &disturb_move , FALSE, 2, 4, "disturb_move" , "Disturb whenever any monster moves" }, - { &disturb_near , TRUE , 2, 5, "disturb_near" , "Disturb whenever viewable monster moves" }, - { &disturb_panel , TRUE , 2, 6, "disturb_panel" , "Disturb whenever map panel changes" }, - { &disturb_detect , TRUE , 2, 21, "disturb_detect" , "Disturb whenever leaving trap-detected area" }, - { &disturb_state , TRUE , 2, 7, "disturb_state" , "Disturb whenever player state changes" }, - { &disturb_minor , TRUE , 2, 8, "disturb_minor" , "Disturb whenever boring things happen" }, - { &disturb_other , FALSE, 2, 9, "disturb_other" , "Disturb whenever random things happen" }, - { &last_words , TRUE , 2, 12, "last_words" , "Get last words when the character dies" }, - { &wear_confirm , TRUE , 2, 15, "confirm_wear" , "Confirm to wear/wield known cursed items" }, - { &confirm_stairs , FALSE, 2, 16, "confirm_stairs" , "Prompt before exiting a dungeon level" }, - { &disturb_pets , FALSE, 2, 17, "disturb_pets" , "Disturb when visible pets move" }, + { &find_ignore_stairs , 2, 0, "find_ignore_stairs" , "Run past stairs" }, + { &find_ignore_doors , 2, 1, "find_ignore_doors" , "Run through open doors" }, + { &find_cut , 2, 2, "find_cut" , "Run past known corners" }, + { &find_examine , 2, 3, "find_examine" , "Run into potential corners" }, + { &disturb_move , 2, 4, "disturb_move" , "Disturb whenever any monster moves" }, + { &disturb_near , 2, 5, "disturb_near" , "Disturb whenever viewable monster moves" }, + { &disturb_panel , 2, 6, "disturb_panel" , "Disturb whenever map panel changes" }, + { &disturb_detect , 2, 21, "disturb_detect" , "Disturb whenever leaving trap-detected area" }, + { &disturb_state , 2, 7, "disturb_state" , "Disturb whenever player state changes" }, + { &disturb_minor , 2, 8, "disturb_minor" , "Disturb whenever boring things happen" }, + { &disturb_other , 2, 9, "disturb_other" , "Disturb whenever random things happen" }, + { &last_words , 2, 12, "last_words" , "Get last words when the character dies" }, + { &wear_confirm , 2, 15, "confirm_wear" , "Confirm to wear/wield known cursed items" }, + { &confirm_stairs , 2, 16, "confirm_stairs" , "Prompt before exiting a dungeon level" }, + { &disturb_pets , 2, 17, "disturb_pets" , "Disturb when visible pets move" }, // Game-Play - { &auto_scum , TRUE , 3, 1, "auto_scum" , "Auto-scum for good levels" }, - { &view_perma_grids , TRUE , 3, 6, "view_perma_grids" , "Map remembers all perma-lit grids" }, - { &view_torch_grids , FALSE, 3, 7, "view_torch_grids" , "Map remembers all torch-lit grids" }, - { &dungeon_align , TRUE , 3, 8, "dungeon_align" , "Generate dungeons with aligned rooms" }, - { &dungeon_stair , TRUE , 3, 9, "dungeon_stair" , "Generate dungeons with connected stairs" }, - { &flow_by_sound , FALSE, 3, 10, "flow_by_sound" , "Monsters chase current location (v.slow)" }, - { &smart_learn , FALSE, 3, 14, "smart_learn" , "Monsters learn from their mistakes" }, - { &small_levels , TRUE , 3, 17, "small_levels" , "Allow unusually small dungeon levels" }, - { &empty_levels , TRUE , 3, 18, "empty_levels" , "Allow empty 'arena' levels" }, + { &auto_scum , 3, 1, "auto_scum" , "Auto-scum for good levels" }, + { &view_perma_grids , 3, 6, "view_perma_grids" , "Map remembers all perma-lit grids" }, + { &view_torch_grids , 3, 7, "view_torch_grids" , "Map remembers all torch-lit grids" }, + { &dungeon_align , 3, 8, "dungeon_align" , "Generate dungeons with aligned rooms" }, + { &dungeon_stair , 3, 9, "dungeon_stair" , "Generate dungeons with connected stairs" }, + { &flow_by_sound , 3, 10, "flow_by_sound" , "Monsters chase current location (v.slow)" }, + { &smart_learn , 3, 14, "smart_learn" , "Monsters learn from their mistakes" }, + { &small_levels , 3, 17, "small_levels" , "Allow unusually small dungeon levels" }, + { &empty_levels , 3, 18, "empty_levels" , "Allow empty 'arena' levels" }, // Efficiency - { &view_reduce_lite , FALSE, 4, 0, "view_reduce_lite" , "Reduce lite-radius when running" }, - { &avoid_abort , FALSE, 4, 2, "avoid_abort" , "Avoid checking for user abort" }, - { &avoid_shimmer , FALSE, 4, 17, "avoid_shimmer" , "Avoid extra shimmering (fast)" }, - { &avoid_other , FALSE, 4, 3, "avoid_other" , "Avoid processing special colors (fast)" }, - { &flush_failure , TRUE , 4, 4, "flush_failure" , "Flush input on various failures" }, - { &flush_disturb , FALSE, 4, 5, "flush_disturb" , "Flush input whenever disturbed" }, - { &flush_command , FALSE, 4, 6, "flush_command" , "Flush input before every command" }, - { &fresh_before , TRUE , 4, 7, "fresh_before" , "Flush output before every command" }, - { &fresh_after , FALSE, 4, 8, "fresh_after" , "Flush output after every command" }, - { &fresh_message , FALSE, 4, 9, "fresh_message" , "Flush output after every message" }, - { &hilite_player , FALSE, 4, 11, "hilite_player" , "Hilite the player with the cursor" }, - { &view_yellow_lite , FALSE, 4, 12, "view_yellow_lite" , "Use special colors for torch-lit grids" }, - { &view_bright_lite , FALSE, 4, 13, "view_bright_lite" , "Use special colors for 'viewable' grids" }, - { &view_granite_lite , FALSE, 4, 14, "view_granite_lite" , "Use special colors for wall grids (slow)" }, - { &view_special_lite , FALSE, 4, 15, "view_special_lite" , "Use special colors for floor grids (slow)" }, - { ¢er_player , FALSE, 4, 16, "center_player" , "Center the view on the player (very slow)" }, + { &view_reduce_lite , 4, 0, "view_reduce_lite" , "Reduce lite-radius when running" }, + { &avoid_abort , 4, 2, "avoid_abort" , "Avoid checking for user abort" }, + { &avoid_shimmer , 4, 17, "avoid_shimmer" , "Avoid extra shimmering (fast)" }, + { &avoid_other , 4, 3, "avoid_other" , "Avoid processing special colors (fast)" }, + { &flush_failure , 4, 4, "flush_failure" , "Flush input on various failures" }, + { &flush_disturb , 4, 5, "flush_disturb" , "Flush input whenever disturbed" }, + { &flush_command , 4, 6, "flush_command" , "Flush input before every command" }, + { &fresh_before , 4, 7, "fresh_before" , "Flush output before every command" }, + { &fresh_after , 4, 8, "fresh_after" , "Flush output after every command" }, + { &fresh_message , 4, 9, "fresh_message" , "Flush output after every message" }, + { &hilite_player , 4, 11, "hilite_player" , "Hilite the player with the cursor" }, + { &view_yellow_lite , 4, 12, "view_yellow_lite" , "Use special colors for torch-lit grids" }, + { &view_bright_lite , 4, 13, "view_bright_lite" , "Use special colors for 'viewable' grids" }, + { &view_granite_lite , 4, 14, "view_granite_lite" , "Use special colors for wall grids (slow)" }, + { &view_special_lite , 4, 15, "view_special_lite" , "Use special colors for floor grids (slow)" }, + { ¢er_player , 4, 16, "center_player" , "Center the view on the player (very slow)" }, // ToME options - { &ingame_help , TRUE , 5, 1, "ingame_help" , "Ingame contextual help" }, - { &auto_more , FALSE, 5, 4, "auto_more" , "Automatically clear '-more-' prompts" }, - { &player_char_health , TRUE , 5, 6, "player_char_health" , "Player char represent his/her health" }, - { &linear_stats , TRUE , 5, 7, "linear_stats" , "Stats are represented in a linear way" }, + { &ingame_help , 5, 1, "ingame_help" , "Ingame contextual help" }, + { &auto_more , 5, 4, "auto_more" , "Automatically clear '-more-' prompts" }, + { &player_char_health , 5, 6, "player_char_health" , "Player char represent his/her health" }, + { &linear_stats , 5, 7, "linear_stats" , "Stats are represented in a linear way" }, // Birth Options - { &preserve , TRUE , 6, 2, "preserve" , "Preserve artifacts" }, - { &autoroll , TRUE , 6, 3, "autoroll" , "Specify 'minimal' stats" }, - { &point_based , FALSE, 6, 17, "point_based" , "Generate character using a point system" }, - { &ironman_rooms , FALSE, 6, 6, "ironman_rooms" , "Always generate very unusual rooms" }, - { &joke_monsters , FALSE, 6, 14, "joke_monsters" , "Allow use of some 'joke' monsters" }, - { &always_small_level , FALSE, 6, 16, "always_small_level" , "Always make small levels" }, - { &fate_option , TRUE , 6, 18, "fate_option" , "You can receive fates, good or bad" }, - { &no_selling , FALSE, 6, 20, "no_selling" , "Items always sell for 0 gold" }, + { &preserve , 6, 2, "preserve" , "Preserve artifacts" }, + { &autoroll , 6, 3, "autoroll" , "Specify 'minimal' stats" }, + { &point_based , 6, 17, "point_based" , "Generate character using a point system" }, + { &ironman_rooms , 6, 6, "ironman_rooms" , "Always generate very unusual rooms" }, + { &joke_monsters , 6, 14, "joke_monsters" , "Allow use of some 'joke' monsters" }, + { &always_small_level , 6, 16, "always_small_level" , "Always make small levels" }, + { &fate_option , 6, 18, "fate_option" , "You can receive fates, good or bad" }, + { &no_selling , 6, 20, "no_selling" , "Items always sell for 0 gold" }, }; /* * Cheating options */ std::vector cheat_options = { - { &cheat_peek, FALSE, 0, 0, "cheat_peek", "Peek into object creation" }, - { &cheat_hear, FALSE, 0, 1, "cheat_hear", "Peek into monster creation" }, - { &cheat_room, FALSE, 0, 2, "cheat_room", "Peek into dungeon creation" }, - { &cheat_xtra, FALSE, 0, 3, "cheat_xtra", "Peek into something else" }, - { &cheat_live, FALSE, 0, 5, "cheat_live", "Allow player to avoid death" }, + { &cheat_peek, 0, 0, "cheat_peek", "Peek into object creation" }, + { &cheat_hear, 0, 1, "cheat_hear", "Peek into monster creation" }, + { &cheat_room, 0, 2, "cheat_room", "Peek into dungeon creation" }, + { &cheat_xtra, 0, 3, "cheat_xtra", "Peek into something else" }, + { &cheat_live, 0, 5, "cheat_live", "Allow player to avoid death" }, }; /** * Autosave boolean options */ std::vector autosave_options { - { &autosave_l, FALSE, 0, 6, "autosave_l", "Autosave when entering new levels" }, - { &autosave_t, FALSE, 0, 7, "autosave_t", "Timed autosave" } + { &autosave_l, 0, 6, "autosave_l", "Autosave when entering new levels" }, + { &autosave_t, 0, 7, "autosave_t", "Timed autosave" } }; /* diff --git a/src/variable.hpp b/src/variable.hpp index e16eae93..b69751a4 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -144,8 +144,6 @@ extern char **macro__pat; extern char **macro__act; extern bool_ *macro__cmd; extern char *macro__buf; -extern u32b option_flag[8]; -extern u32b option_mask[8]; extern u32b window_flag[ANGBAND_TERM_MAX]; extern u32b window_mask[ANGBAND_TERM_MAX]; extern cave_type **cave; -- cgit v1.2.3 From 0e54dbeb4e7a6c3d2b534b1a64f7044b3ddb7bfc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove dead code --- src/object2.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/object2.cc b/src/object2.cc index ec34db40..c474fe18 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -1984,15 +1984,11 @@ static void finalize_randart(object_type* o_ptr, int lev) { int r; int i = 0; - int foo = lev + randnor(0, 5); bool_ flag = TRUE; /* Paranoia */ if (o_ptr->tval != TV_RANDART) return; - if (foo < 1) foo = 1; - if (foo > 100) foo = 100; - while (flag) { r = rand_int(MAX_RANDARTS); -- cgit v1.2.3 From 36969a9058806e71078efcb04a91cc263612d42e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Change loadsave:do_std_string() to handle NUL properly --- src/loadsave.cc | 51 ++++++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index b3b04b9c..1843c414 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -249,45 +249,30 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void load_std_string(std::string &s) +static void do_std_string(std::string &s, ls_flag_t flag) { - s.clear(); - while (true) + // Length prefix. + u32b saved_size = s.size(); + do_u32b(&saved_size, flag); + // Convert to size_t + std::size_t n = saved_size; + // Load/save goes a little differently since we cannot + // assume anything about 's' when loading. + if (flag == ls_flag_t::LOAD) { - byte u8 = sf_get(); - if (u8) - { - s += u8; - } - else + s.clear(); + s.reserve(n); + for (std::size_t i = 0; i < n; i++) { - break; + s += sf_get(); } } -} - -static void save_std_string(std::string &s) -{ - for (std::size_t i = 0; i < s.length(); i++) - { - assert(s[i] != 0); // Sanity check; we cannot handle NULs in strings - sf_put(s[i]); - } - sf_put(0); // NUL terminator -} - -static void do_std_string(std::string &s, ls_flag_t flag) -{ - switch(flag) - { - case ls_flag_t::LOAD: + else { - load_std_string(s); - break; - } - case ls_flag_t::SAVE: - save_std_string(s); - break; + for (std::size_t i = 0; i < n; i++) + { + sf_put(s[i]); + } } } -- cgit v1.2.3 From 6d11bb4a2d5bc8ab7c1491639f1083532b1b8fd1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Replace RNG with PCG random number generator --- src/CMakeLists.txt | 2 + src/birth.cc | 4 +- src/dungeon.cc | 27 +- src/generate.cc | 3 +- src/loadsave.cc | 78 +- src/object1.cc | 9 +- src/seed.cc | 53 + src/seed.hpp | 51 + src/seed_fwd.hpp | 3 + src/spells2.cc | 12 +- src/town_type.hpp | 3 +- src/variable.cc | 6 +- src/variable.hpp | 3 +- src/wild.cc | 17 +- src/wilderness_map.hpp | 3 +- src/z-rand.cc | 294 ++--- src/z-rand.hpp | 32 +- vendor/pcg-cpp | 1 + vendor/pcg-cpp-0.98/.gitignore | 33 + vendor/pcg-cpp-0.98/include/pcg_extras.hpp | 637 ++++++++++ vendor/pcg-cpp-0.98/include/pcg_random.hpp | 1751 +++++++++++++++++++++++++++ vendor/pcg-cpp-0.98/include/pcg_uint128.hpp | 750 ++++++++++++ 22 files changed, 3487 insertions(+), 285 deletions(-) create mode 100644 src/seed.cc create mode 100644 src/seed.hpp create mode 100644 src/seed_fwd.hpp create mode 120000 vendor/pcg-cpp create mode 100644 vendor/pcg-cpp-0.98/.gitignore create mode 100644 vendor/pcg-cpp-0.98/include/pcg_extras.hpp create mode 100644 vendor/pcg-cpp-0.98/include/pcg_random.hpp create mode 100644 vendor/pcg-cpp-0.98/include/pcg_uint128.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0cce20be..7b4d025b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/bandit) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/fmt) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/pcg-cpp/include) # Add subdirectories ADD_SUBDIRECTORY (squelch) @@ -105,6 +106,7 @@ SET(SRCS_COMMON variable.cc wild.cc wizard2.cc + seed.cc xtra1.cc xtra2.cc z-form.c diff --git a/src/birth.cc b/src/birth.cc index c4d3718e..1fc5d515 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3050,7 +3050,7 @@ void init_town(int t_idx) t_ptr->flags &= ~(TOWN_KNOWN); /* Generation seed for the town */ - t_ptr->seed = randint(0x10000000); + t_ptr->seed = seed_t::system(); } /* @@ -3189,7 +3189,7 @@ void player_birth(void) { for (j = 0; j < max_wild_y; j++) { - wild_map[j][i].seed = rand_int(0x10000000); + wild_map[j][i].seed = seed_t::system(); wild_map[j][i].entrance = 0; wild_map[j][i].known = FALSE; } diff --git a/src/dungeon.cc b/src/dungeon.cc index eeec226b..b02b2a87 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -5125,27 +5125,8 @@ void play_game() process_player_name(FALSE); } - /* Init the RNG */ - if (Rand_quick) - { - u32b seed; - - /* Basic seed */ - seed = (time(NULL)); - -#ifdef SET_UID - - /* Mutate the seed on Unix machines */ - seed = ((seed >> 3) * (getpid() << 1)); - -#endif - - /* Use the complex RNG */ - Rand_quick = FALSE; - - /* Seed the "complex" RNG */ - Rand_state_init(seed); - } + /* Force "complex" RNG */ + set_complex_rng(); /* Roll new character */ if (new_game) @@ -5156,8 +5137,8 @@ void play_game() /* The dungeon is not ready */ character_dungeon = FALSE; - /* Hack -- seed for flavors */ - seed_flavor = rand_int(0x10000000); + /* Set the seed for flavors */ + seed_flavor() = seed_t::system(); /* Roll up a new character */ player_birth(); diff --git a/src/generate.cc b/src/generate.cc index ec6d002d..573a58f6 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -8299,8 +8299,7 @@ void generate_cave(void) /* Seed the RNG if appropriate */ if (town_level) { - Rand_quick = TRUE; - Rand_value = town_info[town_level].seed; + set_quick_rng(town_info[town_level].seed); } process_hooks_new(HOOK_GEN_LEVEL_BEGIN, NULL, NULL); diff --git a/src/loadsave.cc b/src/loadsave.cc index 1843c414..8bea40f4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -315,9 +315,37 @@ template void do_vector(ls_flag_t flag, std::vector & } } +static void do_bytes(ls_flag_t flag, std::uint8_t *buf, std::size_t n) +{ + for (std::size_t i = 0; i < n; i++) + { + do_byte(&buf[i], flag); + } +}; + +static void do_seed(seed_t *seed, ls_flag_t flag) +{ + uint8_t buf[seed_t::n_bytes]; + + if (flag == ls_flag_t::SAVE) + { + seed->to_bytes(buf); + } + + do_bytes(flag, buf, sizeof(buf)); + + if (flag == ls_flag_t::LOAD) + { + *seed = seed_t::from_bytes(buf); + } +} + } // namespace (anonymous) +/* + * Load/Save quick start data + */ static void do_quick_start(ls_flag_t flag) { do_s16b(&previous_char.race, flag); @@ -878,8 +906,8 @@ static bool_ do_extra(ls_flag_t flag) } } - /* Load random seeds */ - do_u32b(&seed_flavor, flag); /* For consistent object flavors. */ + /* Random seed for object flavors. */ + do_seed(&seed_flavor(), flag); /* Special stuff */ do_u16b(&total_winner, flag); @@ -1676,19 +1704,24 @@ static void do_store(store_type *str, ls_flag_t flag) */ static void do_randomizer(ls_flag_t flag) { - /* Place */ - do_u16b(&Rand_place, flag); + std::string state; + + if (flag == ls_flag_t::SAVE) + { + state = get_complex_rng_state(); + } - /* State */ - for (std::size_t i = 0; i < RAND_DEG; i++) + do_std_string(state, flag); + + if (flag == ls_flag_t::LOAD) { - do_u32b(&Rand_state[i], flag); + set_complex_rng_state(state); } /* Accept */ if (flag == ls_flag_t::LOAD) { - Rand_quick = FALSE; + set_complex_rng(); } } @@ -2129,25 +2162,6 @@ static bool do_object_lore(ls_flag_t flag) } -/* - * Note that this function may not be needed at all. - * It was taken out of load_player_aux(). Do we need it? - */ -static void junkinit(void) -{ - p_ptr->inside_quest = 0; - p_ptr->town_num = 1; - p_ptr->wilderness_x = 4; - p_ptr->wilderness_y = 4; - for (std::size_t i = 0; i < max_wild_x; i++) - { - for (std::size_t j = 0; j < max_wild_y; j++) - { - wild_map[j][i].seed = rand_int(0x10000000); - } - } -} - static bool do_towns(ls_flag_t flag) { u16b max_towns_ldsv = max_towns; @@ -2181,7 +2195,7 @@ static bool do_towns(ls_flag_t flag) if (i >= TOWN_RANDOM) { - do_u32b(&town->seed, flag); + do_seed(&town->seed, flag); do_byte(&town->flags, flag); // Create stock if necessary @@ -2289,7 +2303,7 @@ static bool do_wilderness(ls_flag_t flag) for (std::size_t j = 0; j < wild_y_size; j++) { auto w = &wild_map[j][i]; - do_u32b(&w->seed, flag); + do_seed(&w->seed, flag); do_u16b(&w->entrance, flag); do_bool(&w->known, flag); } @@ -2517,12 +2531,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } - // Initialize - if (flag == ls_flag_t::LOAD) - { - junkinit(); - } - if (!do_towns(flag)) { return FALSE; diff --git a/src/object1.cc b/src/object1.cc index c4945e6b..3f5d123f 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -507,12 +507,8 @@ static void shuffle_flavors(cptr adj[], byte col[]) */ void flavor_init(void) { - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; - /* Hack -- Induce consistant flavors */ - Rand_value = seed_flavor; - + set_quick_rng(seed_flavor()); /* Efficiency -- Rods/Wands share initial array */ for (std::size_t i = 0; i < MAX_METALS; i++) @@ -599,9 +595,8 @@ void flavor_init(void) scroll_col[i] = TERM_WHITE; } - /* Hack -- Use the "complex" RNG */ - Rand_quick = FALSE; + set_complex_rng(); /* Analyze every object */ for (std::size_t i = 1; i < max_k_idx; i++) diff --git a/src/seed.cc b/src/seed.cc new file mode 100644 index 00000000..0550c769 --- /dev/null +++ b/src/seed.cc @@ -0,0 +1,53 @@ +#include "seed.hpp" + +#include + +seed_t seed_t::system() +{ + seed_t seed; + // Use system's random device for seeding. + std::random_device random_device; + std::uniform_int_distribution distribution; + // Extract the number of bytes we need. + for (std::size_t i = 0; i < n_bytes; i++) + { + seed.m_data[i] = distribution(random_device); + } + // Done + return seed; +} + +seed_t seed_t::from_bytes(std::uint8_t bytes[n_bytes]) +{ + seed_t seed; + // Copy + for (std::size_t i = 0; i < n_bytes; i++) + { + seed.m_data[i] = bytes[i]; + } + // Done + return seed; +} + +void seed_t::to_bytes(std::uint8_t bytes[n_bytes]) const +{ + // Copy + for (std::size_t i = 0; i < n_bytes; i++) + { + bytes[i] = m_data[i]; + } +} +void seed_t::to_uint32(std::uint32_t seed_seq_data[n_uint32]) const +{ + for (std::size_t i = 0; i < n_uint32; i++) + { + // Position in the byte-oriented data. + std::size_t p = 4 * i; + // Pack m_data[p + 0], ..., m_data[p + 3] into a single uint32_t + seed_seq_data[i] = 0; + seed_seq_data[i] |= (uint32_t(m_data[p + 0]) << (0 * 8)); + seed_seq_data[i] |= (uint32_t(m_data[p + 1]) << (1 * 8)); + seed_seq_data[i] |= (uint32_t(m_data[p + 2]) << (2 * 8)); + seed_seq_data[i] |= (uint32_t(m_data[p + 3]) << (3 * 8)); + } +} diff --git a/src/seed.hpp b/src/seed.hpp new file mode 100644 index 00000000..91ec7eba --- /dev/null +++ b/src/seed.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include +#include + +class seed_t { + +public: + // Number of seed bytes. + static constexpr std::size_t n_bytes = 64; + + // Sanity check; we're relying on converting to uint32_t elsewhere, + // so let's just keep it as easy as possible. + static_assert(n_bytes % 4 == 0, "n_bytes must be multiple of 4"); + + // Number of uint32_t's required to store the seed. + static constexpr std::size_t n_uint32 = n_bytes / 4; + +private: + std::array m_data; + + // Default constructor is private. Use the static + // factory functions instead. + seed_t() + { + // Factory functions do explicit initialization. + }; + +public: + + /** + * Create a seed from system entropy. + */ + static seed_t system(); + + /** + * Create a seed from the given bytes. + */ + static seed_t from_bytes(std::uint8_t bytes[n_bytes]); + + /** + * Convert seed to bytes. + */ + void to_bytes(std::uint8_t bytes[n_bytes]) const; + + /** + * Convert seed to uint32_t's suitable for seed_seq. + */ + void to_uint32(std::uint32_t seed_seq_data[n_uint32]) const; + +}; diff --git a/src/seed_fwd.hpp b/src/seed_fwd.hpp new file mode 100644 index 00000000..291a6063 --- /dev/null +++ b/src/seed_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +class seed_t; diff --git a/src/spells2.cc b/src/spells2.cc index bfd513e6..0cdf08ed 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -78,8 +78,8 @@ void grow_things(s16b type, int rad) for (a = 0; a < rad * rad + 11; a++) { - i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; - j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; + i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; + j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue; if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue; @@ -100,8 +100,8 @@ void grow_trees(int rad) for (a = 0; a < rad * rad + 11; a++) { - i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; - j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; + i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; + j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue; if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue; @@ -122,8 +122,8 @@ void grow_grass(int rad) for (a = 0; a < rad * rad + 11; a++) { - i = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; - j = (Rand_mod((rad * 2) + 1)-rad + Rand_mod((rad * 2) + 1)-rad) / 2; + i = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; + j = (rand_int((rad * 2) + 1)-rad + rand_int((rad * 2) + 1)-rad) / 2; if (!in_bounds(p_ptr->py + j, p_ptr->px + i)) continue; if (distance(p_ptr->py, p_ptr->px, p_ptr->py + j, p_ptr->px + i) > rad) continue; diff --git a/src/town_type.hpp b/src/town_type.hpp index e119968b..0b903138 100644 --- a/src/town_type.hpp +++ b/src/town_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "seed.hpp" #include "store_type_fwd.hpp" #include @@ -12,7 +13,7 @@ struct town_type { cptr name = nullptr; - u32b seed = 0; /* Seed for RNG */ + seed_t seed = seed_t::system(); /* Seed for RNG */ std::vector store; /* The stores [max_st_idx] */ diff --git a/src/variable.cc b/src/variable.cc index 9bb78ca9..00fd340d 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -42,7 +42,11 @@ bool_ character_loaded; /* The character was loaded from a savefile */ bool_ character_icky; /* The game is in an icky full screen mode */ bool_ character_xtra; /* The game is in an icky startup mode */ -u32b seed_flavor; /* Hack -- consistent object colors */ +seed_t &seed_flavor() +{ + static seed_t *instance = new seed_t(seed_t::system()); + return *instance; +} s16b command_cmd; /* Current "Angband Command" */ diff --git a/src/variable.hpp b/src/variable.hpp index b69751a4..9d737930 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -48,6 +48,7 @@ #include "vault_type_fwd.hpp" #include "wilderness_map_fwd.hpp" #include "wilderness_type_info_fwd.hpp" +#include "seed.hpp" extern int max_macrotrigger; extern char *macro_template; @@ -58,7 +59,7 @@ extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; extern bool_ character_dungeon; extern bool_ character_loaded; extern bool_ character_xtra; -extern u32b seed_flavor; +extern seed_t &seed_flavor(); extern s16b command_cmd; extern s16b command_arg; extern s16b command_rep; diff --git a/src/wild.cc b/src/wild.cc index 2d751b17..cbd899f7 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -186,11 +186,8 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) terrain[2][1] = wild_map[yp][x].feat; terrain[2][2] = wild_map[yp][xp].feat; - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; - /* Hack -- Induce consistant town layout */ - Rand_value = wild_map[y][x].seed; + set_quick_rng(wild_map[y][x].seed); /* Create level background */ for (y1 = 0; y1 < MAX_HGT; y1++) @@ -217,9 +214,6 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) plasma_recursive(1, 1, MAX_WID - 2, MAX_HGT - 2, MAX_WILD_TERRAIN - 1, roughness); } - /* Use the complex RNG */ - Rand_quick = FALSE; - for (y1 = 1; y1 < MAX_HGT - 1; y1++) { for (x1 = 1; x1 < MAX_WID - 1; x1++) @@ -229,6 +223,8 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) } } + /* Change back to "complex" RNG */ + set_complex_rng(); } /* Should we create a town ? */ @@ -297,11 +293,8 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) } } - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; - /* Hack -- Induce consistant town layout */ - Rand_value = wild_map[y][x].seed; + set_quick_rng(wild_map[y][x].seed); entrance = wf_info[wild_map[y][x].feat].entrance; if (!entrance) entrance = wild_map[y][x].entrance; @@ -320,7 +313,7 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) } /* Use the complex RNG */ - Rand_quick = FALSE; + set_complex_rng(); /* MEGA HACK -- set at least one floor grid */ for (y1 = 1; y1 < cur_hgt - 1; y1++) diff --git a/src/wilderness_map.hpp b/src/wilderness_map.hpp index e1d795f5..3db36101 100644 --- a/src/wilderness_map.hpp +++ b/src/wilderness_map.hpp @@ -1,6 +1,7 @@ #pragma once #include "h-basic.h" +#include "seed.hpp" /** * A structure describing a wilderness map @@ -8,7 +9,7 @@ struct wilderness_map { int feat = 0; /* Wilderness feature */ - u32b seed = 0; /* Seed for the RNG */ + seed_t seed = seed_t::system(); /* Seed for the RNG when building tile */ u16b entrance = 0; /* Entrance for dungeons */ bool_ known = FALSE; /* Is it seen by the player ? */ }; diff --git a/src/z-rand.cc b/src/z-rand.cc index e2960a55..0f507cb6 100644 --- a/src/z-rand.cc +++ b/src/z-rand.cc @@ -4,214 +4,113 @@ #include "z-rand.hpp" - - - -/* - * Angband 2.7.9 introduced a new (optimized) random number generator, - * based loosely on the old "random.c" from Berkeley but with some major - * optimizations and algorithm changes. See below for more details. - * - * Code by myself (benh@phial.com) and Randy (randy@stat.tamu.edu). - * - * This code provides (1) a "decent" RNG, based on the "BSD-degree-63-RNG" - * used in Angband 2.7.8, but rather optimized, and (2) a "simple" RNG, - * based on the simple "LCRNG" currently used in Angband, but "corrected" - * to give slightly better values. Both of these are available in two - * flavors, first, the simple "mod" flavor, which is fast, but slightly - * biased at high values, and second, the simple "div" flavor, which is - * less fast (and potentially non-terminating) but which is not biased - * and is much less subject to low-bit-non-randomness problems. - * - * You can select your favorite flavor by proper definition of the - * "rand_int()" macro in the "defines.h" file. - * - * Note that, in Angband 2.8.0, the "state" table will be saved in the - * savefile, so a special "initialization" phase will be necessary. - * - * Note the use of the "simple" RNG, first you activate it via - * "Rand_quick = TRUE" and "Rand_value = seed" and then it is used - * automatically used instead of the "complex" RNG, and when you are - * done, you de-activate it via "Rand_quick = FALSE" or choose a new - * seed via "Rand_value = seed". - */ - - -/* - * Random Number Generator -- Linear Congruent RNG - */ -#define LCRNG(X) ((X) * 1103515245 + 12345) - - - -/* - * Use the "simple" LCRNG - */ -bool_ Rand_quick = TRUE; - - -/* - * Current "value" of the "simple" RNG +#include +#include +#include +#include +#include + +#include "pcg_random.hpp" +#include "seed.hpp" + +/** + * Choice of RNG; we use the "statistically most powerful" (per the + * documentation) RNG. The "insecure" bit just means that the RNG + * is definitely known to *not* be cryptographically secure. */ -u32b Rand_value; +using rng_t = pcg64_once_insecure; - -/* - * Current "index" for the "complex" RNG - */ -u16b Rand_place; - -/* - * Current "state" table for the "complex" RNG +/** + * Reseed the given RNG. */ -u32b Rand_state[RAND_DEG]; - - +static void reseed_rng(rng_t *rng, seed_t const &seed) +{ + assert(rng != nullptr); + // Create a seed_seq from the seed data. + std::uint32_t data[seed_t::n_uint32]; + std::seed_seq seed_seq( + std::begin(data), + std::end(data) + ); + // Seed the RNG. + rng->seed(seed_seq); +} -/* - * Initialize the "complex" RNG using a new seed +/** + * Allocate a new RNG and initialize with the given seed. */ -void Rand_state_init(u32b seed) +static rng_t *new_seeded_rng(seed_t const &seed) { - int i, j; - - /* Seed the table */ - Rand_state[0] = seed; - - /* Propagate the seed */ - for (i = 1; i < RAND_DEG; i++) Rand_state[i] = LCRNG(Rand_state[i - 1]); - - /* Cycle the table ten times per degree */ - for (i = 0; i < RAND_DEG * 10; i++) - { - /* Acquire the next index */ - j = Rand_place + 1; - if (j == RAND_DEG) j = 0; - - /* Update the table, extract an entry */ - Rand_state[j] += Rand_state[Rand_place]; - - /* Advance the index */ - Rand_place = j; - } + rng_t *rng = new rng_t; + reseed_rng(rng, seed); + return rng; } - -/* - * Extract a "random" number from 0 to m-1, via "modulus" - * - * Note that "m" should probably be less than 500000, or the - * results may be rather biased towards low values. +/** + * The "quick" RNG is used for fixed-seed applications. */ -s32b Rand_mod(s32b m) +static rng_t *quick_rng() { - int j; - u32b r; - - /* Hack -- simple case */ - if (m <= 1) return (0); - - /* Use the "simple" RNG */ - if (Rand_quick) - { - /* Cycle the generator */ - r = (Rand_value = LCRNG(Rand_value)); - - /* Mutate a 28-bit "random" number */ - r = (r >> 4) % m; - } - - /* Use the "complex" RNG */ - else - { - /* Acquire the next index */ - j = Rand_place + 1; - if (j == RAND_DEG) j = 0; - - /* Update the table, extract an entry */ - r = (Rand_state[j] += Rand_state[Rand_place]); - - /* Advance the index */ - Rand_place = j; - - /* Extract a "random" number */ - r = (r >> 4) % m; - } - - /* Use the value */ - return (r); + // Note that the "quick_rng" will always be seeded explicitly + // whenever it's used, so we don't need to do any seeding here. + static rng_t *instance = new rng_t(); + return instance; } - -/* - * Extract a "random" number from 0 to m-1, via "division" - * - * This method selects "random" 28-bit numbers, and then uses - * division to drop those numbers into "m" different partitions, - * plus a small non-partition to reduce bias, taking as the final - * value the first "good" partition that a number falls into. - * - * This method has no bias, and is much less affected by patterns - * in the "low" bits of the underlying RNG's. +/** + * The "complex" RNG is used when we really want non-deterministic + * random numbers. */ -static s32b Rand_div(s32b m) +static rng_t *complex_rng() { - u32b r, n; + static rng_t *instance = new_seeded_rng(seed_t::system()); + return instance; +} - /* Hack -- simple case */ - if (m <= 1) return (0); - /* Partition size */ - n = (0x10000000 / m); +/** + * Current RNG. + */ +static rng_t *current_rng = nullptr; - /* Use a simple RNG */ - if (Rand_quick) +/** + * Get the current RNG. + */ +static rng_t *get_current_rng() +{ + // Do we need to initialize? + if (current_rng == nullptr) { - /* Wait for it */ - while (1) - { - /* Cycle the generator */ - r = (Rand_value = LCRNG(Rand_value)); - - /* Mutate a 28-bit "random" number */ - r = ((r >> 4) & 0x0FFFFFFF) / n; - - /* Done */ - if (r < (u32b)m) break; - } + // We start with the complex RNG. + current_rng = complex_rng(); } - /* Use a complex RNG */ - else - { - /* Wait for it */ - while (1) - { - int j; - - /* Acquire the next index */ - j = Rand_place + 1; - if (j == RAND_DEG) j = 0; - - /* Update the table, extract an entry */ - r = (Rand_state[j] += Rand_state[Rand_place]); - - /* Hack -- extract a 28-bit "random" number */ - r = ((r >> 4) & 0x0FFFFFFF) / n; - - /* Advance the index */ - Rand_place = j; + return current_rng; +} - /* Done */ - if (r < (u32b)m) break; - } - } +void set_quick_rng(seed_t const &seed) +{ + reseed_rng(quick_rng(), seed); + current_rng = quick_rng(); +} - /* Use the value */ - return (r); +void set_complex_rng() +{ + current_rng = complex_rng(); } +std::string get_complex_rng_state() +{ + std::stringstream s; + s << *complex_rng(); + return s.str(); +} +void set_complex_rng_state(std::string const &state) +{ + std::stringstream s(state); + s >> *complex_rng(); +} /* @@ -357,20 +256,41 @@ bool magik(s32b p) { s32b rand_int(s32b m) { - return Rand_div(m); + /* Degenerate case */ + if (m < 1) + { + return 0; + } + /* Normal case */ + std::uniform_int_distribution distribution(0, m - 1); + return distribution(*get_current_rng()); } s32b randint(s32b m) { - return rand_int(m) + 1; + /* Degenerate case */ + if (m < 2) + { + return 1; + } + /* Normal case */ + std::uniform_int_distribution distribution(1, m); + return distribution(*get_current_rng()); } s32b rand_range(s32b a, s32b b) { - return a + rand_int(1 + b - a); + /* Degenerate case */ + if (b < a) + { + return a; + } + /* Normal case */ + std::uniform_int_distribution distribution(a, b); + return distribution(*get_current_rng()); } s32b rand_spread(s32b a, s32b d) { - return a + rand_int(1 + d + d) - d; + return rand_range(a-d, a+d); } diff --git a/src/z-rand.hpp b/src/z-rand.hpp index cac28167..235b9503 100644 --- a/src/z-rand.hpp +++ b/src/z-rand.hpp @@ -1,8 +1,9 @@ #pragma once #include "h-basic.h" +#include "seed_fwd.hpp" - +#include /**** Available constants ****/ @@ -19,17 +20,34 @@ /**** Available Variables ****/ -extern bool_ Rand_quick; -extern u32b Rand_value; -extern u16b Rand_place; -extern u32b Rand_state[RAND_DEG]; +/** + * Change to "quick" RNG, using the given seed. + */ +void set_quick_rng(seed_t const &seed); + + +/** + * Change to "complex" RNG which uses the "non-deterministic" seed. + */ +void set_complex_rng(); + + +/** + * Get a copy of the state of the "complex" RNG. + */ +std::string get_complex_rng_state(); +/** + * Set the state of the "complex" RNG. The given array must have + * been previously obtained via the get_complex_rng_state() function. + */ +void set_complex_rng_state(std::string const &state); + /**** Available Functions ****/ -void Rand_state_init(u32b seed); -s32b Rand_mod(s32b m); +void Rand_state_init(); s16b randnor(int mean, int stand); s32b damroll(s16b num, s16b sides); s32b maxroll(s16b num, s16b sides); diff --git a/vendor/pcg-cpp b/vendor/pcg-cpp new file mode 120000 index 00000000..13a0799b --- /dev/null +++ b/vendor/pcg-cpp @@ -0,0 +1 @@ +pcg-cpp-0.98 \ No newline at end of file diff --git a/vendor/pcg-cpp-0.98/.gitignore b/vendor/pcg-cpp-0.98/.gitignore new file mode 100644 index 00000000..9f598fd5 --- /dev/null +++ b/vendor/pcg-cpp-0.98/.gitignore @@ -0,0 +1,33 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Debug Information +*.dSYM + +# Executables +*.exe +*.out +*.app + +# Actual Project Executables diff --git a/vendor/pcg-cpp-0.98/include/pcg_extras.hpp b/vendor/pcg-cpp-0.98/include/pcg_extras.hpp new file mode 100644 index 00000000..ec3e5694 --- /dev/null +++ b/vendor/pcg-cpp-0.98/include/pcg_extras.hpp @@ -0,0 +1,637 @@ +/* + * PCG Random Number Generation for C++ + * + * Copyright 2014 Melissa O'Neill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * For additional information about the PCG random number generation scheme, + * including its license and other licensing options, visit + * + * http://www.pcg-random.org + */ + +/* + * This file provides support code that is useful for random-number generation + * but not specific to the PCG generation scheme, including: + * - 128-bit int support for platforms where it isn't available natively + * - bit twiddling operations + * - I/O of 128-bit and 8-bit integers + * - Handling the evilness of SeedSeq + * - Support for efficiently producing random numbers less than a given + * bound + */ + +#ifndef PCG_EXTRAS_HPP_INCLUDED +#define PCG_EXTRAS_HPP_INCLUDED 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ + #include +#endif + +/* + * Abstractions for compiler-specific directives + */ + +#ifdef __GNUC__ + #define PCG_NOINLINE __attribute__((noinline)) +#else + #define PCG_NOINLINE +#endif + +/* + * Some members of the PCG library use 128-bit math. When compiling on 64-bit + * platforms, both GCC and Clang provide 128-bit integer types that are ideal + * for the job. + * + * On 32-bit platforms (or with other compilers), we fall back to a C++ + * class that provides 128-bit unsigned integers instead. It may seem + * like we're reinventing the wheel here, because libraries already exist + * that support large integers, but most existing libraries provide a very + * generic multiprecision code, but here we're operating at a fixed size. + * Also, most other libraries are fairly heavyweight. So we use a direct + * implementation. Sadly, it's much slower than hand-coded assembly or + * direct CPU support. + * + */ +#if __SIZEOF_INT128__ + namespace pcg_extras { + typedef __uint128_t pcg128_t; + } + #define PCG_128BIT_CONSTANT(high,low) \ + ((pcg128_t(high) << 64) + low) +#else + #include "pcg_uint128.hpp" + namespace pcg_extras { + typedef pcg_extras::uint_x4 pcg128_t; + } + #define PCG_128BIT_CONSTANT(high,low) \ + pcg128_t(high,low) + #define PCG_EMULATED_128BIT_MATH 1 +#endif + + +namespace pcg_extras { + +/* + * We often need to represent a "number of bits". When used normally, these + * numbers are never greater than 128, so an unsigned char is plenty. + * If you're using a nonstandard generator of a larger size, you can set + * PCG_BITCOUNT_T to have it define it as a larger size. (Some compilers + * might produce faster code if you set it to an unsigned int.) + */ + +#ifndef PCG_BITCOUNT_T + typedef uint8_t bitcount_t; +#else + typedef PCG_BITCOUNT_T bitcount_t; +#endif + +/* + * C++ requires us to be able to serialize RNG state by printing or reading + * it from a stream. Because we use 128-bit ints, we also need to be able + * ot print them, so here is code to do so. + * + * This code provides enough functionality to print 128-bit ints in decimal + * and zero-padded in hex. It's not a full-featured implementation. + */ + +template +std::basic_ostream& +operator<<(std::basic_ostream& out, pcg128_t value) +{ + auto desired_base = out.flags() & out.basefield; + bool want_hex = desired_base == out.hex; + + if (want_hex) { + uint64_t highpart = uint64_t(value >> 64); + uint64_t lowpart = uint64_t(value); + auto desired_width = out.width(); + if (desired_width > 16) { + out.width(desired_width - 16); + } + if (highpart != 0 || desired_width > 16) + out << highpart; + CharT oldfill; + if (highpart != 0) { + out.width(16); + oldfill = out.fill('0'); + } + auto oldflags = out.setf(decltype(desired_base){}, out.showbase); + out << lowpart; + out.setf(oldflags); + if (highpart != 0) { + out.fill(oldfill); + } + return out; + } + constexpr size_t MAX_CHARS_128BIT = 40; + + char buffer[MAX_CHARS_128BIT]; + char* pos = buffer+sizeof(buffer); + *(--pos) = '\0'; + constexpr auto BASE = pcg128_t(10ULL); + do { + auto div = value / BASE; + auto mod = uint32_t(value - (div * BASE)); + *(--pos) = '0' + mod; + value = div; + } while(value != pcg128_t(0ULL)); + return out << pos; +} + +template +std::basic_istream& +operator>>(std::basic_istream& in, pcg128_t& value) +{ + typename std::basic_istream::sentry s(in); + + if (!s) + return in; + + constexpr auto BASE = pcg128_t(10ULL); + pcg128_t current(0ULL); + bool did_nothing = true; + bool overflow = false; + for(;;) { + CharT wide_ch = in.get(); + if (!in.good()) + break; + auto ch = in.narrow(wide_ch, '\0'); + if (ch < '0' || ch > '9') { + in.unget(); + break; + } + did_nothing = false; + pcg128_t digit(uint32_t(ch - '0')); + pcg128_t timesbase = current*BASE; + overflow = overflow || timesbase < current; + current = timesbase + digit; + overflow = overflow || current < digit; + } + + if (did_nothing || overflow) { + in.setstate(std::ios::failbit); + if (overflow) + current = ~pcg128_t(0ULL); + } + + value = current; + + return in; +} + +/* + * Likewise, if people use tiny rngs, we'll be serializing uint8_t. + * If we just used the provided IO operators, they'd read/write chars, + * not ints, so we need to define our own. We *can* redefine this operator + * here because we're in our own namespace. + */ + +template +std::basic_ostream& +operator<<(std::basic_ostream&out, uint8_t value) +{ + return out << uint32_t(value); +} + +template +std::basic_istream& +operator>>(std::basic_istream& in, uint8_t target) +{ + uint32_t value = 0xdecea5edU; + in >> value; + if (!in && value == 0xdecea5edU) + return in; + if (value > uint8_t(~0)) { + in.setstate(std::ios::failbit); + value = ~0U; + } + target = uint8_t(value); + return in; +} + +/* Unfortunately, the above functions don't get found in preference to the + * built in ones, so we create some more specific overloads that will. + * Ugh. + */ + +inline std::ostream& operator<<(std::ostream& out, uint8_t value) +{ + return pcg_extras::operator<< (out, value); +} + +inline std::istream& operator>>(std::istream& in, uint8_t& value) +{ + return pcg_extras::operator>> (in, value); +} + + + +/* + * Useful bitwise operations. + */ + +/* + * XorShifts are invertable, but they are someting of a pain to invert. + * This function backs them out. It's used by the whacky "inside out" + * generator defined later. + */ + +template +inline itype unxorshift(itype x, bitcount_t bits, bitcount_t shift) +{ + if (2*shift >= bits) { + return x ^ (x >> shift); + } + itype lowmask1 = (itype(1U) << (bits - shift*2)) - 1; + itype highmask1 = ~lowmask1; + itype top1 = x; + itype bottom1 = x & lowmask1; + top1 ^= top1 >> shift; + top1 &= highmask1; + x = top1 | bottom1; + itype lowmask2 = (itype(1U) << (bits - shift)) - 1; + itype bottom2 = x & lowmask2; + bottom2 = unxorshift(bottom2, bits - shift, shift); + bottom2 &= lowmask1; + return top1 | bottom2; +} + +/* + * Rotate left and right. + * + * In ideal world, compilers would spot idiomatic rotate code and convert it + * to a rotate instruction. Of course, opinions vary on what the correct + * idiom is and how to spot it. For clang, sometimes it generates better + * (but still crappy) code if you define PCG_USE_ZEROCHECK_ROTATE_IDIOM. + */ + +template +inline itype rotl(itype value, bitcount_t rot) +{ + constexpr bitcount_t bits = sizeof(itype) * 8; + constexpr bitcount_t mask = bits - 1; +#if PCG_USE_ZEROCHECK_ROTATE_IDIOM + return rot ? (value << rot) | (value >> (bits - rot)) : value; +#else + return (value << rot) | (value >> ((- rot) & mask)); +#endif +} + +template +inline itype rotr(itype value, bitcount_t rot) +{ + constexpr bitcount_t bits = sizeof(itype) * 8; + constexpr bitcount_t mask = bits - 1; +#if PCG_USE_ZEROCHECK_ROTATE_IDIOM + return rot ? (value >> rot) | (value << (bits - rot)) : value; +#else + return (value >> rot) | (value << ((- rot) & mask)); +#endif +} + +/* Unfortunately, both Clang and GCC sometimes perform poorly when it comes + * to properly recognizing idiomatic rotate code, so for we also provide + * assembler directives (enabled with PCG_USE_INLINE_ASM). Boo, hiss. + * (I hope that these compilers get better so that this code can die.) + * + * These overloads will be preferred over the general template code above. + */ +#if PCG_USE_INLINE_ASM && __GNUC__ && (__x86_64__ || __i386__) + +inline uint8_t rotr(uint8_t value, bitcount_t rot) +{ + asm ("rorb %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); + return value; +} + +inline uint16_t rotr(uint16_t value, bitcount_t rot) +{ + asm ("rorw %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); + return value; +} + +inline uint32_t rotr(uint32_t value, bitcount_t rot) +{ + asm ("rorl %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); + return value; +} + +#if __x86_64__ +inline uint64_t rotr(uint64_t value, bitcount_t rot) +{ + asm ("rorq %%cl, %0" : "=r" (value) : "0" (value), "c" (rot)); + return value; +} +#endif // __x86_64__ + +#endif // PCG_USE_INLINE_ASM + + +/* + * The C++ SeedSeq concept (modelled by seed_seq) can fill an array of + * 32-bit integers with seed data, but sometimes we want to produce + * larger or smaller integers. + * + * The following code handles this annoyance. + * + * uneven_copy will copy an array of 32-bit ints to an array of larger or + * smaller ints (actually, the code is general it only needing forward + * iterators). The copy is identical to the one that would be performed if + * we just did memcpy on a standard little-endian machine, but works + * regardless of the endian of the machine (or the weirdness of the ints + * involved). + * + * generate_to initializes an array of integers using a SeedSeq + * object. It is given the size as a static constant at compile time and + * tries to avoid memory allocation. If we're filling in 32-bit constants + * we just do it directly. If we need a separate buffer and it's small, + * we allocate it on the stack. Otherwise, we fall back to heap allocation. + * Ugh. + * + * generate_one produces a single value of some integral type using a + * SeedSeq object. + */ + + /* uneven_copy helper, case where destination ints are less than 32 bit. */ + +template +SrcIter uneven_copy_impl( + SrcIter src_first, DestIter dest_first, DestIter dest_last, + std::true_type) +{ + typedef typename std::iterator_traits::value_type src_t; + typedef typename std::iterator_traits::value_type dest_t; + + constexpr bitcount_t SRC_SIZE = sizeof(src_t); + constexpr bitcount_t DEST_SIZE = sizeof(dest_t); + constexpr bitcount_t DEST_BITS = DEST_SIZE * 8; + constexpr bitcount_t SCALE = SRC_SIZE / DEST_SIZE; + + size_t count = 0; + src_t value; + + while (dest_first != dest_last) { + if ((count++ % SCALE) == 0) + value = *src_first++; // Get more bits + else + value >>= DEST_BITS; // Move down bits + + *dest_first++ = dest_t(value); // Truncates, ignores high bits. + } + return src_first; +} + + /* uneven_copy helper, case where destination ints are more than 32 bit. */ + +template +SrcIter uneven_copy_impl( + SrcIter src_first, DestIter dest_first, DestIter dest_last, + std::false_type) +{ + typedef typename std::iterator_traits::value_type src_t; + typedef typename std::iterator_traits::value_type dest_t; + + constexpr auto SRC_SIZE = sizeof(src_t); + constexpr auto SRC_BITS = SRC_SIZE * 8; + constexpr auto DEST_SIZE = sizeof(dest_t); + constexpr auto SCALE = (DEST_SIZE+SRC_SIZE-1) / SRC_SIZE; + + while (dest_first != dest_last) { + dest_t value(0UL); + unsigned int shift = 0; + + for (size_t i = 0; i < SCALE; ++i) { + value |= dest_t(*src_first++) << shift; + shift += SRC_BITS; + } + + *dest_first++ = value; + } + return src_first; +} + +/* uneven_copy, call the right code for larger vs. smaller */ + +template +inline SrcIter uneven_copy(SrcIter src_first, + DestIter dest_first, DestIter dest_last) +{ + typedef typename std::iterator_traits::value_type src_t; + typedef typename std::iterator_traits::value_type dest_t; + + constexpr bool DEST_IS_SMALLER = sizeof(dest_t) < sizeof(src_t); + + return uneven_copy_impl(src_first, dest_first, dest_last, + std::integral_constant{}); +} + +/* generate_to, fill in a fixed-size array of integral type using a SeedSeq + * (actually works for any random-access iterator) + */ + +template +inline void generate_to_impl(SeedSeq&& generator, DestIter dest, + std::true_type) +{ + generator.generate(dest, dest+size); +} + +template +void generate_to_impl(SeedSeq&& generator, DestIter dest, + std::false_type) +{ + typedef typename std::iterator_traits::value_type dest_t; + constexpr auto DEST_SIZE = sizeof(dest_t); + constexpr auto GEN_SIZE = sizeof(uint32_t); + + constexpr bool GEN_IS_SMALLER = GEN_SIZE < DEST_SIZE; + constexpr size_t FROM_ELEMS = + GEN_IS_SMALLER + ? size * ((DEST_SIZE+GEN_SIZE-1) / GEN_SIZE) + : (size + (GEN_SIZE / DEST_SIZE) - 1) + / ((GEN_SIZE / DEST_SIZE) + GEN_IS_SMALLER); + // this odd code ^^^^^^^^^^^^^^^^^ is work-around for + // a bug: http://llvm.org/bugs/show_bug.cgi?id=21287 + + if (FROM_ELEMS <= 1024) { + uint32_t buffer[FROM_ELEMS]; + generator.generate(buffer, buffer+FROM_ELEMS); + uneven_copy(buffer, dest, dest+size); + } else { + uint32_t* buffer = (uint32_t*) malloc(GEN_SIZE * FROM_ELEMS); + generator.generate(buffer, buffer+FROM_ELEMS); + uneven_copy(buffer, dest, dest+size); + free(buffer); + } +} + +template +inline void generate_to(SeedSeq&& generator, DestIter dest) +{ + typedef typename std::iterator_traits::value_type dest_t; + constexpr bool IS_32BIT = sizeof(dest_t) == sizeof(uint32_t); + + generate_to_impl(std::forward(generator), dest, + std::integral_constant{}); +} + +/* generate_one, produce a value of integral type using a SeedSeq + * (optionally, we can have it produce more than one and pick which one + * we want) + */ + +template +inline UInt generate_one(SeedSeq&& generator) +{ + UInt result[N]; + generate_to(std::forward(generator), result); + return result[i]; +} + +template +auto bounded_rand(RngType& rng, typename RngType::result_type upper_bound) + -> typename RngType::result_type +{ + typedef typename RngType::result_type rtype; + rtype threshold = (RngType::max() - RngType::min() + rtype(1) - upper_bound) + % upper_bound; + for (;;) { + rtype r = rng() - RngType::min(); + if (r >= threshold) + return r % upper_bound; + } +} + +template +void shuffle(Iter from, Iter to, RandType&& rng) +{ + typedef typename std::iterator_traits::difference_type delta_t; + auto count = to - from; + while (count > 1) { + delta_t chosen(bounded_rand(rng, count)); + --count; + --to; + using std::swap; + swap(*(from+chosen), *to); + } +} + +/* + * Although std::seed_seq is useful, it isn't everything. Often we want to + * initialize a random-number generator some other way, such as from a random + * device. + * + * Technically, it does not meet the requirements of a SeedSequence because + * it lacks some of the rarely-used member functions (some of which would + * be impossible to provide). However the C++ standard is quite specific + * that actual engines only called the generate method, so it ought not to be + * a problem in practice. + */ + +template +class seed_seq_from { +private: + RngType rng_; + + typedef uint_least32_t result_type; + +public: + template + seed_seq_from(Args&&... args) : + rng_(std::forward(args)...) + { + // Nothing (else) to do... + } + + template + void generate(Iter start, Iter finish) + { + for (auto i = start; i != finish; ++i) + *i = result_type(rng_()); + } + + constexpr size_t size() const + { + return (sizeof(typename RngType::result_type) > sizeof(result_type) + && RngType::max() > ~size_t(0UL)) + ? ~size_t(0UL) + : size_t(RngType::max()); + } +}; + +/* + * Sometimes you might want a distinct seed based on when the program + * was compiled. That way, a particular instance of the program will + * behave the same way, but when recompiled it'll produce a different + * value. + */ + +template +struct static_arbitrary_seed { +private: + static constexpr IntType fnv(IntType hash, const char* pos) { + return *pos == '\0' + ? hash + : fnv((hash * IntType(16777619U)) ^ *pos, (pos+1)); + } + +public: + static constexpr IntType value = fnv(IntType(2166136261U ^ sizeof(IntType)), + __DATE__ __TIME__ __FILE__); +}; + +// Sometimes, when debugging or testing, it's handy to be able print the name +// of a (in human-readable form). This code allows the idiom: +// +// cout << printable_typename() +// +// to print out my_foo_type_t (or its concrete type if it is a synonym) + +template +struct printable_typename {}; + +template +std::ostream& operator<<(std::ostream& out, printable_typename) { + const char *implementation_typename = typeid(T).name(); +#ifdef __GNUC__ + int status; + const char* pretty_name = + abi::__cxa_demangle(implementation_typename, NULL, NULL, &status); + if (status == 0) + out << pretty_name; + free((void*) pretty_name); + if (status == 0) + return out; +#endif + out << implementation_typename; + return out; +} + +} // namespace pcg_extras + +#endif // PCG_EXTRAS_HPP_INCLUDED diff --git a/vendor/pcg-cpp-0.98/include/pcg_random.hpp b/vendor/pcg-cpp-0.98/include/pcg_random.hpp new file mode 100644 index 00000000..3f04d854 --- /dev/null +++ b/vendor/pcg-cpp-0.98/include/pcg_random.hpp @@ -0,0 +1,1751 @@ +/* + * PCG Random Number Generation for C++ + * + * Copyright 2014 Melissa O'Neill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * For additional information about the PCG random number generation scheme, + * including its license and other licensing options, visit + * + * http://www.pcg-random.org + */ + +/* + * This code provides the reference implementation of the PCG family of + * random number generators. The code is complex because it implements + * + * - several members of the PCG family, specifically members corresponding + * to the output functions: + * - XSH RR (good for 64-bit state, 32-bit output) + * - XSH RS (good for 64-bit state, 32-bit output) + * - XSL RR (good for 128-bit state, 64-bit output) + * - RXS M XS (statistically most powerful generator) + * - XSL RR RR (good for 128-bit state, 128-bit output) + * - and RXS, RXS M, XSH, XSL (mostly for testing) + * - at potentially *arbitrary* bit sizes + * - with four different techniques for random streams (MCG, one-stream + * LCG, settable-stream LCG, unique-stream LCG) + * - and the extended generation schemes allowing arbitrary periods + * - with all features of C++11 random number generation (and more), + * some of which are somewhat painful, including + * - initializing with a SeedSequence which writes 32-bit values + * to memory, even though the state of the generator may not + * use 32-bit values (it might use smaller or larger integers) + * - I/O for RNGs and a prescribed format, which needs to handle + * the issue that 8-bit and 128-bit integers don't have working + * I/O routines (e.g., normally 8-bit = char, not integer) + * - equality and inequality for RNGs + * - and a number of convenience typedefs to mask all the complexity + * + * The code employes a fairly heavy level of abstraction, and has to deal + * with various C++ minutia. If you're looking to learn about how the PCG + * scheme works, you're probably best of starting with one of the other + * codebases (see www.pcg-random.org). But if you're curious about the + * constants for the various output functions used in those other, simpler, + * codebases, this code shows how they are calculated. + * + * On the positive side, at least there are convenience typedefs so that you + * can say + * + * pcg32 myRNG; + * + * rather than: + * + * pcg_detail::engine< + * uint32_t, // Output Type + * uint64_t, // State Type + * pcg_detail::xsh_rr_mixin, true, // Output Func + * pcg_detail::specific_stream, // Stream Kind + * pcg_detail::default_multiplier // LCG Mult + * > myRNG; + * + */ + +#ifndef PCG_RAND_HPP_INCLUDED +#define PCG_RAND_HPP_INCLUDED 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * The pcg_extras namespace contains some support code that is likley to + * be useful for a variety of RNGs, including: + * - 128-bit int support for platforms where it isn't available natively + * - bit twiddling operations + * - I/O of 128-bit and 8-bit integers + * - Handling the evilness of SeedSeq + * - Support for efficiently producing random numbers less than a given + * bound + */ + +#include "pcg_extras.hpp" + +namespace pcg_detail { + +using namespace pcg_extras; + +/* + * The LCG generators need some constants to function. This code lets you + * look up the constant by *type*. For example + * + * default_multiplier::multiplier() + * + * gives you the default multipler for 32-bit integers. We use the name + * of the constant and not a generic word like value to allow these classes + * to be used as mixins. + */ + +template +struct default_multiplier { + // Not defined for an arbitrary type +}; + +template +struct default_increment { + // Not defined for an arbitrary type +}; + +#define PCG_DEFINE_CONSTANT(type, what, kind, constant) \ + template <> \ + struct what ## _ ## kind { \ + static constexpr type kind() { \ + return constant; \ + } \ + }; + +PCG_DEFINE_CONSTANT(uint8_t, default, multiplier, 141U) +PCG_DEFINE_CONSTANT(uint8_t, default, increment, 77U) + +PCG_DEFINE_CONSTANT(uint16_t, default, multiplier, 12829U) +PCG_DEFINE_CONSTANT(uint16_t, default, increment, 47989U) + +PCG_DEFINE_CONSTANT(uint32_t, default, multiplier, 747796405U) +PCG_DEFINE_CONSTANT(uint32_t, default, increment, 2891336453U) + +PCG_DEFINE_CONSTANT(uint64_t, default, multiplier, 6364136223846793005ULL) +PCG_DEFINE_CONSTANT(uint64_t, default, increment, 1442695040888963407ULL) + +PCG_DEFINE_CONSTANT(pcg128_t, default, multiplier, + PCG_128BIT_CONSTANT(2549297995355413924ULL,4865540595714422341ULL)) +PCG_DEFINE_CONSTANT(pcg128_t, default, increment, + PCG_128BIT_CONSTANT(6364136223846793005ULL,1442695040888963407ULL)) + + +/* + * Each PCG generator is available in four variants, based on how it applies + * the additive constant for its underlying LCG; the variations are: + * + * single stream - all instances use the same fixed constant, thus + * the RNG always somewhere in same sequence + * mcg - adds zero, resulting in a single stream and reduced + * period + * specific stream - the constant can be changed at any time, selecting + * a different random sequence + * unique stream - the constant is based on the memory addresss of the + * object, thus every RNG has its own unique sequence + * + * This variation is provided though mixin classes which define a function + * value called increment() that returns the nesessary additive constant. + */ + + + +/* + * unique stream + */ + + +template +class unique_stream { +protected: + static constexpr bool is_mcg = false; + + // Is never called, but is provided for symmetry with specific_stream + void set_stream(...) + { + abort(); + } + +public: + typedef itype state_type; + + constexpr itype increment() const { + return itype(reinterpret_cast(this) | 1); + } + + constexpr itype stream() const + { + return increment() >> 1; + } + + static constexpr bool can_specify_stream = false; + + static constexpr size_t streams_pow2() + { + return (sizeof(itype) < sizeof(size_t) ? sizeof(itype) + : sizeof(size_t))*8 - 1u; + } + +protected: + constexpr unique_stream() = default; +}; + + +/* + * no stream (mcg) + */ + +template +class no_stream { +protected: + static constexpr bool is_mcg = true; + + // Is never called, but is provided for symmetry with specific_stream + void set_stream(...) + { + abort(); + } + +public: + typedef itype state_type; + + static constexpr itype increment() { + return 0; + } + + static constexpr bool can_specify_stream = false; + + static constexpr size_t streams_pow2() + { + return 0u; + } + +protected: + constexpr no_stream() = default; +}; + + +/* + * single stream/sequence (oneseq) + */ + +template +class oneseq_stream : public default_increment { +protected: + static constexpr bool is_mcg = false; + + // Is never called, but is provided for symmetry with specific_stream + void set_stream(...) + { + abort(); + } + +public: + typedef itype state_type; + + static constexpr itype stream() + { + return default_increment::increment() >> 1; + } + + static constexpr bool can_specify_stream = false; + + static constexpr size_t streams_pow2() + { + return 0u; + } + +protected: + constexpr oneseq_stream() = default; +}; + + +/* + * specific stream + */ + +template +class specific_stream { +protected: + static constexpr bool is_mcg = false; + + itype inc_ = default_increment::increment(); + +public: + typedef itype state_type; + typedef itype stream_state; + + constexpr itype increment() const { + return inc_; + } + + itype stream() + { + return inc_ >> 1; + } + + void set_stream(itype specific_seq) + { + inc_ = (specific_seq << 1) | 1; + } + + static constexpr bool can_specify_stream = true; + + static constexpr size_t streams_pow2() + { + return (sizeof(itype)*8) - 1u; + } + +protected: + specific_stream() = default; + + specific_stream(itype specific_seq) + : inc_((specific_seq << 1) | itype(1U)) + { + // Nothing (else) to do. + } +}; + + +/* + * This is where it all comes together. This function joins together three + * mixin classes which define + * - the LCG additive constant (the stream) + * - the LCG multiplier + * - the output function + * in addition, we specify the type of the LCG state, and the result type, + * and whether to use the pre-advance version of the state for the output + * (increasing instruction-level parallelism) or the post-advance version + * (reducing register pressure). + * + * Given the high level of parameterization, the code has to use some + * template-metaprogramming tricks to handle some of the suble variations + * involved. + */ + +template , + typename multiplier_mixin = default_multiplier > +class engine : protected output_mixin, + public stream_mixin, + protected multiplier_mixin { +protected: + itype state_; + + struct can_specify_stream_tag {}; + struct no_specifiable_stream_tag {}; + + using stream_mixin::increment; + using multiplier_mixin::multiplier; + +public: + typedef xtype result_type; + typedef itype state_type; + + static constexpr size_t period_pow2() + { + return sizeof(state_type)*8 - 2*stream_mixin::is_mcg; + } + + // It would be nice to use std::numeric_limits for these, but + // we can't be sure that it'd be defined for the 128-bit types. + + static constexpr result_type min() + { + return result_type(0UL); + } + + static constexpr result_type max() + { + return ~result_type(0UL); + } + +protected: + itype bump(itype state) + { + return state * multiplier() + increment(); + } + + itype base_generate() + { + return state_ = bump(state_); + } + + itype base_generate0() + { + itype old_state = state_; + state_ = bump(state_); + return old_state; + } + +public: + result_type operator()() + { + if (output_previous) + return this->output(base_generate0()); + else + return this->output(base_generate()); + } + + result_type operator()(result_type upper_bound) + { + return bounded_rand(*this, upper_bound); + } + +protected: + static itype advance(itype state, itype delta, + itype cur_mult, itype cur_plus); + + static itype distance(itype cur_state, itype newstate, itype cur_mult, + itype cur_plus, itype mask = ~itype(0U)); + + itype distance(itype newstate, itype mask = ~itype(0U)) const + { + return distance(state_, newstate, multiplier(), increment(), mask); + } + +public: + void advance(itype delta) + { + state_ = advance(state_, delta, this->multiplier(), this->increment()); + } + + void backstep(itype delta) + { + advance(-delta); + } + + void discard(itype delta) + { + advance(delta); + } + + bool wrapped() + { + if (stream_mixin::is_mcg) { + // For MCGs, the low order two bits never change. In this + // implementation, we keep them fixed at 3 to make this test + // easier. + return state_ == 3; + } else { + return state_ == 0; + } + } + + engine(itype state = itype(0xcafef00dd15ea5e5ULL)) + : state_(this->is_mcg ? state|state_type(3U) + : bump(state + this->increment())) + { + // Nothing else to do. + } + + // This function may or may not exist. It thus has to be a template + // to use SFINAE; users don't have to worry about its template-ness. + + template + engine(itype state, typename sm::stream_state stream_seed) + : stream_mixin(stream_seed), + state_(this->is_mcg ? state|state_type(3U) + : bump(state + this->increment())) + { + // Nothing else to do. + } + + template + engine(SeedSeq&& seedSeq, typename std::enable_if< + !stream_mixin::can_specify_stream + && !std::is_convertible::value + && !std::is_convertible::value, + no_specifiable_stream_tag>::type = {}) + : engine(generate_one(std::forward(seedSeq))) + { + // Nothing else to do. + } + + template + engine(SeedSeq&& seedSeq, typename std::enable_if< + stream_mixin::can_specify_stream + && !std::is_convertible::value + && !std::is_convertible::value, + can_specify_stream_tag>::type = {}) + : engine(generate_one(seedSeq), + generate_one(seedSeq)) + { + // Nothing else to do. + } + + + template + void seed(Args&&... args) + { + new (this) engine(std::forward(args)...); + } + + template + friend bool operator==(const engine&, + const engine&); + + template + friend itype1 operator-(const engine&, + const engine&); + + template + friend std::basic_ostream& + operator<<(std::basic_ostream& out, + const engine&); + + template + friend std::basic_istream& + operator>>(std::basic_istream& in, + engine& rng); +}; + +template +std::basic_ostream& +operator<<(std::basic_ostream& out, + const engine& rng) +{ + auto orig_flags = out.flags(std::ios_base::dec | std::ios_base::left); + auto space = out.widen(' '); + auto orig_fill = out.fill(); + + out << rng.multiplier() << space + << rng.increment() << space + << rng.state_; + + out.flags(orig_flags); + out.fill(orig_fill); + return out; +} + + +template +std::basic_istream& +operator>>(std::basic_istream& in, + engine& rng) +{ + auto orig_flags = in.flags(std::ios_base::dec | std::ios_base::skipws); + + itype multiplier, increment, state; + in >> multiplier >> increment >> state; + + if (!in.fail()) { + bool good = true; + if (multiplier != rng.multiplier()) { + good = false; + } else if (rng.can_specify_stream) { + rng.set_stream(increment >> 1); + } else if (increment != rng.increment()) { + good = false; + } + if (good) { + rng.state_ = state; + } else { + in.clear(std::ios::failbit); + } + } + + in.flags(orig_flags); + return in; +} + + +template +itype engine::advance( + itype state, itype delta, itype cur_mult, itype cur_plus) +{ + // The method used here is based on Brown, "Random Number Generation + // with Arbitrary Stride,", Transactions of the American Nuclear + // Society (Nov. 1994). The algorithm is very similar to fast + // exponentiation. + // + // Even though delta is an unsigned integer, we can pass a + // signed integer to go backwards, it just goes "the long way round". + + constexpr itype ZERO = 0u; // itype may be a non-trivial types, so + constexpr itype ONE = 1u; // we define some ugly constants. + itype acc_mult = 1; + itype acc_plus = 0; + while (delta > ZERO) { + if (delta & ONE) { + acc_mult *= cur_mult; + acc_plus = acc_plus*cur_mult + cur_plus; + } + cur_plus = (cur_mult+ONE)*cur_plus; + cur_mult *= cur_mult; + delta >>= 1; + } + return acc_mult * state + acc_plus; +} + +template +itype engine::distance( + itype cur_state, itype newstate, itype cur_mult, itype cur_plus, itype mask) +{ + constexpr itype ONE = 1u; // itype could be weird, so use constant + itype the_bit = stream_mixin::is_mcg ? itype(4u) : itype(1u); + itype distance = 0u; + while ((cur_state & mask) != (newstate & mask)) { + if ((cur_state & the_bit) != (newstate & the_bit)) { + cur_state = cur_state * cur_mult + cur_plus; + distance |= the_bit; + } + assert((cur_state & the_bit) == (newstate & the_bit)); + the_bit <<= 1; + cur_plus = (cur_mult+ONE)*cur_plus; + cur_mult *= cur_mult; + } + return stream_mixin::is_mcg ? distance >> 2 : distance; +} + +template +itype operator-(const engine& lhs, + const engine& rhs) +{ + if (lhs.multiplier() != rhs.multiplier() + || lhs.increment() != rhs.increment()) + throw std::logic_error("incomparable generators"); + return rhs.distance(lhs.state_); +} + + +template +bool operator==(const engine& lhs, + const engine& rhs) +{ + return (lhs.multiplier() == rhs.multiplier()) + && (lhs.increment() == rhs.increment()) + && (lhs.state_ == rhs.state_); +} + +template +inline bool operator!=(const engine& lhs, + const engine& rhs) +{ + return !operator==(lhs,rhs); +} + + +template class output_mixin, + bool output_previous = (sizeof(itype) <= 8)> +using oneseq_base = engine, output_previous, + oneseq_stream >; + +template class output_mixin, + bool output_previous = (sizeof(itype) <= 8)> +using unique_base = engine, output_previous, + unique_stream >; + +template class output_mixin, + bool output_previous = (sizeof(itype) <= 8)> +using setseq_base = engine, output_previous, + specific_stream >; + +template class output_mixin, + bool output_previous = (sizeof(itype) <= 8)> +using mcg_base = engine, output_previous, + no_stream >; + +/* + * OUTPUT FUNCTIONS. + * + * These are the core of the PCG generation scheme. They specify how to + * turn the base LCG's internal state into the output value of the final + * generator. + * + * They're implemented as mixin classes. + * + * All of the classes have code that is written to allow it to be applied + * at *arbitrary* bit sizes, although in practice they'll only be used at + * standard sizes supported by C++. + */ + +/* + * XSH RS -- high xorshift, followed by a random shift + * + * Fast. A good performer. + */ + +template +struct xsh_rs_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t sparebits = bits - xtypebits; + constexpr bitcount_t opbits = + sparebits-5 >= 64 ? 5 + : sparebits-4 >= 32 ? 4 + : sparebits-3 >= 16 ? 3 + : sparebits-2 >= 4 ? 2 + : sparebits-1 >= 1 ? 1 + : 0; + constexpr bitcount_t mask = (1 << opbits) - 1; + constexpr bitcount_t maxrandshift = mask; + constexpr bitcount_t topspare = opbits; + constexpr bitcount_t bottomspare = sparebits - topspare; + constexpr bitcount_t xshift = topspare + (xtypebits+maxrandshift)/2; + bitcount_t rshift = + opbits ? bitcount_t(internal >> (bits - opbits)) & mask : 0; + internal ^= internal >> xshift; + xtype result = xtype(internal >> (bottomspare - maxrandshift + rshift)); + return result; + } +}; + +/* + * XSH RR -- high xorshift, followed by a random rotate + * + * Fast. A good performer. Slightly better statistically than XSH RS. + */ + +template +struct xsh_rr_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype)*8); + constexpr bitcount_t sparebits = bits - xtypebits; + constexpr bitcount_t wantedopbits = + xtypebits >= 128 ? 7 + : xtypebits >= 64 ? 6 + : xtypebits >= 32 ? 5 + : xtypebits >= 16 ? 4 + : 3; + constexpr bitcount_t opbits = + sparebits >= wantedopbits ? wantedopbits + : sparebits; + constexpr bitcount_t amplifier = wantedopbits - opbits; + constexpr bitcount_t mask = (1 << opbits) - 1; + constexpr bitcount_t topspare = opbits; + constexpr bitcount_t bottomspare = sparebits - topspare; + constexpr bitcount_t xshift = (topspare + xtypebits)/2; + bitcount_t rot = opbits ? bitcount_t(internal >> (bits - opbits)) & mask + : 0; + bitcount_t amprot = (rot << amplifier) & mask; + internal ^= internal >> xshift; + xtype result = xtype(internal >> bottomspare); + result = rotr(result, amprot); + return result; + } +}; + +/* + * RXS -- random xorshift + */ + +template +struct rxs_mixin { +static xtype output_rxs(itype internal) + { + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype)*8); + constexpr bitcount_t shift = bits - xtypebits; + constexpr bitcount_t extrashift = (xtypebits - shift)/2; + bitcount_t rshift = shift > 64+8 ? (internal >> (bits - 6)) & 63 + : shift > 32+4 ? (internal >> (bits - 5)) & 31 + : shift > 16+2 ? (internal >> (bits - 4)) & 15 + : shift > 8+1 ? (internal >> (bits - 3)) & 7 + : shift > 4+1 ? (internal >> (bits - 2)) & 3 + : shift > 2+1 ? (internal >> (bits - 1)) & 1 + : 0; + internal ^= internal >> (shift + extrashift - rshift); + xtype result = internal >> rshift; + return result; + } +}; + +/* + * RXS M XS -- random xorshift, mcg multiply, fixed xorshift + * + * The most statistically powerful generator, but all those steps + * make it slower than some of the others. We give it the rottenest jobs. + * + * Because it's usually used in contexts where the state type and the + * result type are the same, it is a permutation and is thus invertable. + * We thus provide a function to invert it. This function is used to + * for the "inside out" generator used by the extended generator. + */ + +/* Defined type-based concepts for the multiplication step. They're actually + * all derived by truncating the 128-bit, which was computed to be a good + * "universal" constant. + */ + +template +struct mcg_multiplier { + // Not defined for an arbitrary type +}; + +template +struct mcg_unmultiplier { + // Not defined for an arbitrary type +}; + +PCG_DEFINE_CONSTANT(uint8_t, mcg, multiplier, 217U) +PCG_DEFINE_CONSTANT(uint8_t, mcg, unmultiplier, 105U) + +PCG_DEFINE_CONSTANT(uint16_t, mcg, multiplier, 62169U) +PCG_DEFINE_CONSTANT(uint16_t, mcg, unmultiplier, 28009U) + +PCG_DEFINE_CONSTANT(uint32_t, mcg, multiplier, 277803737U) +PCG_DEFINE_CONSTANT(uint32_t, mcg, unmultiplier, 2897767785U) + +PCG_DEFINE_CONSTANT(uint64_t, mcg, multiplier, 12605985483714917081ULL) +PCG_DEFINE_CONSTANT(uint64_t, mcg, unmultiplier, 15009553638781119849ULL) + +PCG_DEFINE_CONSTANT(pcg128_t, mcg, multiplier, + PCG_128BIT_CONSTANT(17766728186571221404ULL, 12605985483714917081ULL)) +PCG_DEFINE_CONSTANT(pcg128_t, mcg, unmultiplier, + PCG_128BIT_CONSTANT(14422606686972528997ULL, 15009553638781119849ULL)) + + +template +struct rxs_m_xs_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t opbits = xtypebits >= 128 ? 6 + : xtypebits >= 64 ? 5 + : xtypebits >= 32 ? 4 + : xtypebits >= 16 ? 3 + : 2; + constexpr bitcount_t shift = bits - xtypebits; + constexpr bitcount_t mask = (1 << opbits) - 1; + bitcount_t rshift = + opbits ? bitcount_t(internal >> (bits - opbits)) & mask : 0; + internal ^= internal >> (opbits + rshift); + internal *= mcg_multiplier::multiplier(); + xtype result = internal >> shift; + result ^= result >> ((2U*xtypebits+2U)/3U); + return result; + } + + static itype unoutput(itype internal) + { + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t opbits = bits >= 128 ? 6 + : bits >= 64 ? 5 + : bits >= 32 ? 4 + : bits >= 16 ? 3 + : 2; + constexpr bitcount_t mask = (1 << opbits) - 1; + + internal = unxorshift(internal, bits, (2U*bits+2U)/3U); + + internal *= mcg_unmultiplier::unmultiplier(); + + bitcount_t rshift = opbits ? (internal >> (bits - opbits)) & mask : 0; + internal = unxorshift(internal, bits, opbits + rshift); + + return internal; + } +}; + + +/* + * RXS M -- random xorshift, mcg multiply + */ + +template +struct rxs_m_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t opbits = xtypebits >= 128 ? 6 + : xtypebits >= 64 ? 5 + : xtypebits >= 32 ? 4 + : xtypebits >= 16 ? 3 + : 2; + constexpr bitcount_t shift = bits - xtypebits; + constexpr bitcount_t mask = (1 << opbits) - 1; + bitcount_t rshift = opbits ? (internal >> (bits - opbits)) & mask : 0; + internal ^= internal >> (opbits + rshift); + internal *= mcg_multiplier::multiplier(); + xtype result = internal >> shift; + return result; + } +}; + +/* + * XSL RR -- fixed xorshift (to low bits), random rotate + * + * Useful for 128-bit types that are split across two CPU registers. + */ + +template +struct xsl_rr_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t sparebits = bits - xtypebits; + constexpr bitcount_t wantedopbits = xtypebits >= 128 ? 7 + : xtypebits >= 64 ? 6 + : xtypebits >= 32 ? 5 + : xtypebits >= 16 ? 4 + : 3; + constexpr bitcount_t opbits = sparebits >= wantedopbits ? wantedopbits + : sparebits; + constexpr bitcount_t amplifier = wantedopbits - opbits; + constexpr bitcount_t mask = (1 << opbits) - 1; + constexpr bitcount_t topspare = sparebits; + constexpr bitcount_t bottomspare = sparebits - topspare; + constexpr bitcount_t xshift = (topspare + xtypebits) / 2; + + bitcount_t rot = + opbits ? bitcount_t(internal >> (bits - opbits)) & mask : 0; + bitcount_t amprot = (rot << amplifier) & mask; + internal ^= internal >> xshift; + xtype result = xtype(internal >> bottomspare); + result = rotr(result, amprot); + return result; + } +}; + + +/* + * XSL RR RR -- fixed xorshift (to low bits), random rotate (both parts) + * + * Useful for 128-bit types that are split across two CPU registers. + * If you really want an invertable 128-bit RNG, I guess this is the one. + */ + +template struct halfsize_trait {}; +template <> struct halfsize_trait { typedef uint64_t type; }; +template <> struct halfsize_trait { typedef uint32_t type; }; +template <> struct halfsize_trait { typedef uint16_t type; }; +template <> struct halfsize_trait { typedef uint8_t type; }; + +template +struct xsl_rr_rr_mixin { + typedef typename halfsize_trait::type htype; + + static itype output(itype internal) + { + constexpr bitcount_t htypebits = bitcount_t(sizeof(htype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t sparebits = bits - htypebits; + constexpr bitcount_t wantedopbits = htypebits >= 128 ? 7 + : htypebits >= 64 ? 6 + : htypebits >= 32 ? 5 + : htypebits >= 16 ? 4 + : 3; + constexpr bitcount_t opbits = sparebits >= wantedopbits ? wantedopbits + : sparebits; + constexpr bitcount_t amplifier = wantedopbits - opbits; + constexpr bitcount_t mask = (1 << opbits) - 1; + constexpr bitcount_t topspare = sparebits; + constexpr bitcount_t xshift = (topspare + htypebits) / 2; + + bitcount_t rot = + opbits ? bitcount_t(internal >> (bits - opbits)) & mask : 0; + bitcount_t amprot = (rot << amplifier) & mask; + internal ^= internal >> xshift; + htype lowbits = htype(internal); + lowbits = rotr(lowbits, amprot); + htype highbits = htype(internal >> topspare); + bitcount_t rot2 = lowbits & mask; + bitcount_t amprot2 = (rot2 << amplifier) & mask; + highbits = rotr(highbits, amprot2); + return (itype(highbits) << topspare) ^ itype(lowbits); + } +}; + + +/* + * XSH -- fixed xorshift (to high bits) + * + * You shouldn't use this at 64-bits or less. + */ + +template +struct xsh_mixin { + static xtype output(itype internal) + { + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t sparebits = bits - xtypebits; + constexpr bitcount_t topspare = 0; + constexpr bitcount_t bottomspare = sparebits - topspare; + constexpr bitcount_t xshift = (topspare + xtypebits) / 2; + + internal ^= internal >> xshift; + xtype result = internal >> bottomspare; + return result; + } +}; + +/* + * XSL -- fixed xorshift (to low bits) + * + * You shouldn't use this at 64-bits or less. + */ + +template +struct xsl_mixin { + inline xtype output(itype internal) + { + constexpr bitcount_t xtypebits = bitcount_t(sizeof(xtype) * 8); + constexpr bitcount_t bits = bitcount_t(sizeof(itype) * 8); + constexpr bitcount_t sparebits = bits - xtypebits; + constexpr bitcount_t topspare = sparebits; + constexpr bitcount_t bottomspare = sparebits - topspare; + constexpr bitcount_t xshift = (topspare + xtypebits) / 2; + + internal ^= internal >> xshift; + xtype result = internal >> bottomspare; + return result; + } +}; + +/* ---- End of Output Functions ---- */ + + +template +struct inside_out : private baseclass { + inside_out() = delete; + + typedef typename baseclass::result_type result_type; + typedef typename baseclass::state_type state_type; + static_assert(sizeof(result_type) == sizeof(state_type), + "Require a RNG whose output function is a permutation"); + + static bool external_step(result_type& randval, size_t i) + { + state_type state = baseclass::unoutput(randval); + state = state * baseclass::multiplier() + baseclass::increment() + + state_type(i*2); + result_type result = baseclass::output(state); + randval = result; + state_type zero = + baseclass::is_mcg ? state & state_type(3U) : state_type(0U); + return result == zero; + } + + static bool external_advance(result_type& randval, size_t i, + result_type delta, bool forwards = true) + { + state_type state = baseclass::unoutput(randval); + state_type mult = baseclass::multiplier(); + state_type inc = baseclass::increment() + state_type(i*2); + state_type zero = + baseclass::is_mcg ? state & state_type(3U) : state_type(0U); + state_type dist_to_zero = baseclass::distance(state, zero, mult, inc); + bool crosses_zero = + forwards ? dist_to_zero <= delta + : (-dist_to_zero) <= delta; + if (!forwards) + delta = -delta; + state = baseclass::advance(state, delta, mult, inc); + randval = baseclass::output(state); + return crosses_zero; + } +}; + + +template +class extended : public baseclass { +public: + typedef typename baseclass::state_type state_type; + typedef typename baseclass::result_type result_type; + typedef inside_out insideout; + +private: + static constexpr bitcount_t rtypebits = sizeof(result_type)*8; + static constexpr bitcount_t stypebits = sizeof(state_type)*8; + + static constexpr bitcount_t tick_limit_pow2 = 64U; + + static constexpr size_t table_size = 1UL << table_pow2; + static constexpr size_t table_shift = stypebits - table_pow2; + static constexpr state_type table_mask = + (state_type(1U) << table_pow2) - state_type(1U); + + static constexpr bool may_tick = + (advance_pow2 < stypebits) && (advance_pow2 < tick_limit_pow2); + static constexpr size_t tick_shift = stypebits - advance_pow2; + static constexpr state_type tick_mask = + may_tick ? state_type( + (uint64_t(1) << (advance_pow2*may_tick)) - 1) + // ^-- stupidity to appease GCC warnings + : ~state_type(0U); + + static constexpr bool may_tock = stypebits < tick_limit_pow2; + + result_type data_[table_size]; + + PCG_NOINLINE void advance_table(); + + PCG_NOINLINE void advance_table(state_type delta, bool isForwards = true); + + result_type& get_extended_value() + { + state_type state = this->state_; + if (kdd && baseclass::is_mcg) { + // The low order bits of an MCG are constant, so drop them. + state >>= 2; + } + size_t index = kdd ? state & table_mask + : state >> table_shift; + + if (may_tick) { + bool tick = kdd ? (state & tick_mask) == state_type(0u) + : (state >> tick_shift) == state_type(0u); + if (tick) + advance_table(); + } + if (may_tock) { + bool tock = state == state_type(0u); + if (tock) + advance_table(); + } + return data_[index]; + } + +public: + static constexpr size_t period_pow2() + { + return baseclass::period_pow2() + table_size*extvalclass::period_pow2(); + } + + __attribute__((always_inline)) result_type operator()() + { + result_type rhs = get_extended_value(); + result_type lhs = this->baseclass::operator()(); + return lhs ^ rhs; + } + + result_type operator()(result_type upper_bound) + { + return bounded_rand(*this, upper_bound); + } + + void set(result_type wanted) + { + result_type& rhs = get_extended_value(); + result_type lhs = this->baseclass::operator()(); + rhs = lhs ^ wanted; + } + + void advance(state_type distance, bool forwards = true); + + void backstep(state_type distance) + { + advance(distance, false); + } + + extended(const result_type* data) + : baseclass() + { + datainit(data); + } + + extended(const result_type* data, state_type seed) + : baseclass(seed) + { + datainit(data); + } + + // This function may or may not exist. It thus has to be a template + // to use SFINAE; users don't have to worry about its template-ness. + + template + extended(const result_type* data, state_type seed, + typename bc::stream_state stream_seed) + : baseclass(seed, stream_seed) + { + datainit(data); + } + + extended() + : baseclass() + { + selfinit(); + } + + extended(state_type seed) + : baseclass(seed) + { + selfinit(); + } + + // This function may or may not exist. It thus has to be a template + // to use SFINAE; users don't have to worry about its template-ness. + + template + extended(state_type seed, typename bc::stream_state stream_seed) + : baseclass(seed, stream_seed) + { + selfinit(); + } + +private: + void selfinit(); + void datainit(const result_type* data); + +public: + + template::value + && !std::is_convertible::value>::type> + extended(SeedSeq&& seedSeq) + : baseclass(seedSeq) + { + generate_to(seedSeq, data_); + } + + template + void seed(Args&&... args) + { + new (this) extended(std::forward(args)...); + } + + template + friend bool operator==(const extended&, + const extended&); + + template + friend std::basic_ostream& + operator<<(std::basic_ostream& out, + const extended&); + + template + friend std::basic_istream& + operator>>(std::basic_istream& in, + extended&); + +}; + + +template +void extended::datainit( + const result_type* data) +{ + for (size_t i = 0; i < table_size; ++i) + data_[i] = data[i]; +} + +template +void extended::selfinit() +{ + // We need to fill the extended table with something, and we have + // very little provided data, so we use the base generator to + // produce values. Although not ideal (use a seed sequence, folks!), + // unexpected correlations are mitigated by + // - using XOR differences rather than the number directly + // - the way the table is accessed, its values *won't* be accessed + // in the same order the were written. + // - any strange correlations would only be apparent if we + // were to backstep the generator so that the base generator + // was generating the same values again + result_type xdiff = baseclass::operator()() - baseclass::operator()(); + for (size_t i = 0; i < table_size; ++i) { + data_[i] = baseclass::operator()() ^ xdiff; + } +} + +template +bool operator==(const extended& lhs, + const extended& rhs) +{ + auto& base_lhs = static_cast(lhs); + auto& base_rhs = static_cast(rhs); + return base_lhs == base_rhs + && !memcmp((void*) lhs.data_, (void*) rhs.data_, sizeof(lhs.data_)); +} + +template +inline bool operator!=(const extended& lhs, + const extended& rhs) +{ + return lhs != rhs; +} + +template +std::basic_ostream& +operator<<(std::basic_ostream& out, + const extended& rng) +{ + auto orig_flags = out.flags(std::ios_base::dec | std::ios_base::left); + auto space = out.widen(' '); + auto orig_fill = out.fill(); + + out << rng.multiplier() << space + << rng.increment() << space + << rng.state_; + + for (const auto& datum : rng.data_) + out << space << datum; + + out.flags(orig_flags); + out.fill(orig_fill); + return out; +} + +template +std::basic_istream& +operator>>(std::basic_istream& in, + extended& rng) +{ + extended new_rng; + auto& base_rng = static_cast(new_rng); + in >> base_rng; + + if (in.fail()) + return in; + + auto orig_flags = in.flags(std::ios_base::dec | std::ios_base::skipws); + + for (auto& datum : new_rng.data_) { + in >> datum; + if (in.fail()) + goto bail; + } + + rng = new_rng; + +bail: + in.flags(orig_flags); + return in; +} + + + +template +void +extended::advance_table() +{ + bool carry = false; + for (size_t i = 0; i < table_size; ++i) { + if (carry) { + carry = insideout::external_step(data_[i],i+1); + } + bool carry2 = insideout::external_step(data_[i],i+1); + carry = carry || carry2; + } +} + +template +void +extended::advance_table( + state_type delta, bool isForwards) +{ + typedef typename baseclass::state_type base_state_t; + typedef typename extvalclass::state_type ext_state_t; + constexpr bitcount_t basebits = sizeof(base_state_t)*8; + constexpr bitcount_t extbits = sizeof(ext_state_t)*8; + static_assert(basebits <= extbits || advance_pow2 > 0, + "Current implementation might overflow its carry"); + + base_state_t carry = 0; + for (size_t i = 0; i < table_size; ++i) { + base_state_t total_delta = carry + delta; + ext_state_t trunc_delta = ext_state_t(total_delta); + if (basebits > extbits) { + carry = total_delta >> extbits; + } else { + carry = 0; + } + carry += + insideout::external_advance(data_[i],i+1, trunc_delta, isForwards); + } +} + +template +void extended::advance( + state_type distance, bool forwards) +{ + static_assert(kdd, + "Efficient advance is too hard for non-kdd extension. " + "For a weak advance, cast to base class"); + state_type zero = + baseclass::is_mcg ? this->state_ & state_type(3U) : state_type(0U); + if (may_tick) { + state_type ticks = distance >> (advance_pow2*may_tick); + // ^-- stupidity to appease GCC + // warnings + state_type adv_mask = + baseclass::is_mcg ? tick_mask << 2 : tick_mask; + state_type next_advance_distance = this->distance(zero, adv_mask); + if (!forwards) + next_advance_distance = (-next_advance_distance) & tick_mask; + if (next_advance_distance < (distance & tick_mask)) { + ++ticks; + } + if (ticks) + advance_table(ticks, forwards); + } + if (forwards) { + if (may_tock && this->distance(zero) <= distance) + advance_table(); + baseclass::advance(distance); + } else { + if (may_tock && -(this->distance(zero)) <= distance) + advance_table(state_type(1U), false); + baseclass::advance(-distance); + } +} + +} // namespace pcg_detail + +namespace pcg_engines { + +using namespace pcg_detail; + +/* Predefined types for XSH RS */ + +typedef oneseq_base oneseq_xsh_rs_16_8; +typedef oneseq_base oneseq_xsh_rs_32_16; +typedef oneseq_base oneseq_xsh_rs_64_32; +typedef oneseq_base oneseq_xsh_rs_128_64; + +typedef unique_base unique_xsh_rs_16_8; +typedef unique_base unique_xsh_rs_32_16; +typedef unique_base unique_xsh_rs_64_32; +typedef unique_base unique_xsh_rs_128_64; + +typedef setseq_base setseq_xsh_rs_16_8; +typedef setseq_base setseq_xsh_rs_32_16; +typedef setseq_base setseq_xsh_rs_64_32; +typedef setseq_base setseq_xsh_rs_128_64; + +typedef mcg_base mcg_xsh_rs_16_8; +typedef mcg_base mcg_xsh_rs_32_16; +typedef mcg_base mcg_xsh_rs_64_32; +typedef mcg_base mcg_xsh_rs_128_64; + +/* Predefined types for XSH RR */ + +typedef oneseq_base oneseq_xsh_rr_16_8; +typedef oneseq_base oneseq_xsh_rr_32_16; +typedef oneseq_base oneseq_xsh_rr_64_32; +typedef oneseq_base oneseq_xsh_rr_128_64; + +typedef unique_base unique_xsh_rr_16_8; +typedef unique_base unique_xsh_rr_32_16; +typedef unique_base unique_xsh_rr_64_32; +typedef unique_base unique_xsh_rr_128_64; + +typedef setseq_base setseq_xsh_rr_16_8; +typedef setseq_base setseq_xsh_rr_32_16; +typedef setseq_base setseq_xsh_rr_64_32; +typedef setseq_base setseq_xsh_rr_128_64; + +typedef mcg_base mcg_xsh_rr_16_8; +typedef mcg_base mcg_xsh_rr_32_16; +typedef mcg_base mcg_xsh_rr_64_32; +typedef mcg_base mcg_xsh_rr_128_64; + + +/* Predefined types for RXS M XS */ + +typedef oneseq_base oneseq_rxs_m_xs_8_8; +typedef oneseq_base oneseq_rxs_m_xs_16_16; +typedef oneseq_base oneseq_rxs_m_xs_32_32; +typedef oneseq_base oneseq_rxs_m_xs_64_64; +typedef oneseq_base oneseq_rxs_m_xs_128_128; + +typedef unique_base unique_rxs_m_xs_8_8; +typedef unique_base unique_rxs_m_xs_16_16; +typedef unique_base unique_rxs_m_xs_32_32; +typedef unique_base unique_rxs_m_xs_64_64; +typedef unique_base unique_rxs_m_xs_128_128; + +typedef setseq_base setseq_rxs_m_xs_8_8; +typedef setseq_base setseq_rxs_m_xs_16_16; +typedef setseq_base setseq_rxs_m_xs_32_32; +typedef setseq_base setseq_rxs_m_xs_64_64; +typedef setseq_base setseq_rxs_m_xs_128_128; + + // MCG versions don't make sense here, so aren't defined. + +/* Predefined types for XSL RR (only defined for "large" types) */ + +typedef oneseq_base oneseq_xsl_rr_64_32; +typedef oneseq_base oneseq_xsl_rr_128_64; + +typedef unique_base unique_xsl_rr_64_32; +typedef unique_base unique_xsl_rr_128_64; + +typedef setseq_base setseq_xsl_rr_64_32; +typedef setseq_base setseq_xsl_rr_128_64; + +typedef mcg_base mcg_xsl_rr_64_32; +typedef mcg_base mcg_xsl_rr_128_64; + + +/* Predefined types for XSL RR RR (only defined for "large" types) */ + +typedef oneseq_base + oneseq_xsl_rr_rr_64_64; +typedef oneseq_base + oneseq_xsl_rr_rr_128_128; + +typedef unique_base + unique_xsl_rr_rr_64_64; +typedef unique_base + unique_xsl_rr_rr_128_128; + +typedef setseq_base + setseq_xsl_rr_rr_64_64; +typedef setseq_base + setseq_xsl_rr_rr_128_128; + + // MCG versions don't make sense here, so aren't defined. + +/* Extended generators */ + +template +using ext_std8 = extended; + +template +using ext_std16 = extended; + +template +using ext_std32 = extended; + +template +using ext_std64 = extended; + + +template +using ext_oneseq_rxs_m_xs_32_32 = + ext_std32; + +template +using ext_mcg_xsh_rs_64_32 = + ext_std32; + +template +using ext_oneseq_xsh_rs_64_32 = + ext_std32; + +template +using ext_setseq_xsh_rr_64_32 = + ext_std32; + +template +using ext_mcg_xsl_rr_128_64 = + ext_std64; + +template +using ext_oneseq_xsl_rr_128_64 = + ext_std64; + +template +using ext_setseq_xsl_rr_128_64 = + ext_std64; + +} // namespace pcg_engines + +typedef pcg_engines::setseq_xsh_rr_64_32 pcg32; +typedef pcg_engines::oneseq_xsh_rr_64_32 pcg32_oneseq; +typedef pcg_engines::unique_xsh_rr_64_32 pcg32_unique; +typedef pcg_engines::mcg_xsh_rs_64_32 pcg32_fast; + +typedef pcg_engines::setseq_xsl_rr_128_64 pcg64; +typedef pcg_engines::oneseq_xsl_rr_128_64 pcg64_oneseq; +typedef pcg_engines::unique_xsl_rr_128_64 pcg64_unique; +typedef pcg_engines::mcg_xsl_rr_128_64 pcg64_fast; + +typedef pcg_engines::setseq_rxs_m_xs_8_8 pcg8_once_insecure; +typedef pcg_engines::setseq_rxs_m_xs_16_16 pcg16_once_insecure; +typedef pcg_engines::setseq_rxs_m_xs_32_32 pcg32_once_insecure; +typedef pcg_engines::setseq_rxs_m_xs_64_64 pcg64_once_insecure; +typedef pcg_engines::setseq_xsl_rr_rr_128_128 pcg128_once_insecure; + +typedef pcg_engines::oneseq_rxs_m_xs_8_8 pcg8_oneseq_once_insecure; +typedef pcg_engines::oneseq_rxs_m_xs_16_16 pcg16_oneseq_once_insecure; +typedef pcg_engines::oneseq_rxs_m_xs_32_32 pcg32_oneseq_once_insecure; +typedef pcg_engines::oneseq_rxs_m_xs_64_64 pcg64_oneseq_once_insecure; +typedef pcg_engines::oneseq_xsl_rr_rr_128_128 pcg128_oneseq_once_insecure; + + +// These two extended RNGs provide two-dimensionally equidistributed +// 32-bit generators. pcg32_k2_fast occupies the same space as pcg64, +// and can be called twice to generate 64 bits, but does not required +// 128-bit math; on 32-bit systems, it's faster than pcg64 as well. + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<6,16,true> pcg32_k2; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<6,32,true> pcg32_k2_fast; + +// These eight extended RNGs have about as much state as arc4random +// +// - the k variants are k-dimensionally equidistributed +// - the c variants offer better crypographic security +// +// (just how good the cryptographic security is is an open question) + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<6,16,true> pcg32_k64; +typedef pcg_engines::ext_mcg_xsh_rs_64_32<6,32,true> pcg32_k64_oneseq; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<6,32,true> pcg32_k64_fast; + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<6,16,false> pcg32_c64; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<6,32,false> pcg32_c64_oneseq; +typedef pcg_engines::ext_mcg_xsh_rs_64_32<6,32,false> pcg32_c64_fast; + +typedef pcg_engines::ext_setseq_xsl_rr_128_64<5,16,true> pcg64_k32; +typedef pcg_engines::ext_oneseq_xsl_rr_128_64<5,128,true> pcg64_k32_oneseq; +typedef pcg_engines::ext_mcg_xsl_rr_128_64<5,128,true> pcg64_k32_fast; + +typedef pcg_engines::ext_setseq_xsl_rr_128_64<5,16,false> pcg64_c32; +typedef pcg_engines::ext_oneseq_xsl_rr_128_64<5,128,false> pcg64_c32_oneseq; +typedef pcg_engines::ext_mcg_xsl_rr_128_64<5,128,false> pcg64_c32_fast; + +// These eight extended RNGs have more state than the Mersenne twister +// +// - the k variants are k-dimensionally equidistributed +// - the c variants offer better crypographic security +// +// (just how good the cryptographic security is is an open question) + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<10,16,true> pcg32_k1024; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<10,32,true> pcg32_k1024_fast; + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<10,16,false> pcg32_c1024; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<10,32,false> pcg32_c1024_fast; + +typedef pcg_engines::ext_setseq_xsl_rr_128_64<10,16,true> pcg64_k1024; +typedef pcg_engines::ext_oneseq_xsl_rr_128_64<10,128,true> pcg64_k1024_fast; + +typedef pcg_engines::ext_setseq_xsl_rr_128_64<10,16,false> pcg64_c1024; +typedef pcg_engines::ext_oneseq_xsl_rr_128_64<10,128,false> pcg64_c1024_fast; + +// These generators have an insanely huge period (2^524352), and is suitable +// for silly party tricks, such as dumping out 64 KB ZIP files at an arbitrary +// point in the future. [Actually, over the full period of the generator, it +// will produce every 64 KB ZIP file 2^64 times!] + +typedef pcg_engines::ext_setseq_xsh_rr_64_32<14,16,true> pcg32_k16384; +typedef pcg_engines::ext_oneseq_xsh_rs_64_32<14,32,true> pcg32_k16384_fast; + +#endif // PCG_RAND_HPP_INCLUDED diff --git a/vendor/pcg-cpp-0.98/include/pcg_uint128.hpp b/vendor/pcg-cpp-0.98/include/pcg_uint128.hpp new file mode 100644 index 00000000..99b20e78 --- /dev/null +++ b/vendor/pcg-cpp-0.98/include/pcg_uint128.hpp @@ -0,0 +1,750 @@ +/* + * PCG Random Number Generation for C++ + * + * Copyright 2014 Melissa O'Neill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * For additional information about the PCG random number generation scheme, + * including its license and other licensing options, visit + * + * http://www.pcg-random.org + */ + +/* + * This code provides a a C++ class that can provide 128-bit (or higher) + * integers. To produce 2K-bit integers, it uses two K-bit integers, + * placed in a union that allowes the code to also see them as four K/2 bit + * integers (and access them either directly name, or by index). + * + * It may seem like we're reinventing the wheel here, because several + * libraries already exist that support large integers, but most existing + * libraries provide a very generic multiprecision code, but here we're + * operating at a fixed size. Also, most other libraries are fairly + * heavyweight. So we use a direct implementation. Sadly, it's much slower + * than hand-coded assembly or direct CPU support. + */ + +#ifndef PCG_UINT128_HPP_INCLUDED +#define PCG_UINT128_HPP_INCLUDED 1 + +#include +#include +#include +#include +#include +#include +#include + +/* + * We want to lay the type out the same way that a native type would be laid + * out, which means we must know the machine's endian, at compile time. + * This ugliness attempts to do so. + */ + +#ifndef PCG_LITTLE_ENDIAN + #if defined(__BYTE_ORDER__) + #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + #define PCG_LITTLE_ENDIAN 1 + #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + #define PCG_LITTLE_ENDIAN 0 + #else + #error __BYTE_ORDER__ does not match a standard endian, pick a side + #endif + #elif __LITTLE_ENDIAN__ || _LITTLE_ENDIAN + #define PCG_LITTLE_ENDIAN 1 + #elif __BIG_ENDIAN__ || _BIG_ENDIAN + #define PCG_LITTLE_ENDIAN 0 + #elif __x86_64 || __x86_64__ || __i386 || __i386__ + #define PCG_LITTLE_ENDIAN 1 + #elif __powerpc__ || __POWERPC__ || __ppc__ || __PPC__ \ + || __m68k__ || __mc68000__ + #define PCG_LITTLE_ENDIAN 0 + #else + #error Unable to determine target endianness + #endif +#endif + +namespace pcg_extras { + +// Recent versions of GCC have intrinsics we can use to quickly calculate +// the number of leading and trailing zeros in a number. If possible, we +// use them, otherwise we fall back to old-fashioned bit twiddling to figure +// them out. + +#ifndef PCG_BITCOUNT_T + typedef uint8_t bitcount_t; +#else + typedef PCG_BITCOUNT_T bitcount_t; +#endif + +/* + * Provide some useful helper functions + * * flog2 floor(log2(x)) + * * trailingzeros number of trailing zero bits + */ + +#ifdef __GNUC__ // Any GNU-compatible compiler supporting C++11 has + // some useful intrinsics we can use. + +inline bitcount_t flog2(uint32_t v) +{ + return 31 - __builtin_clz(v); +} + +inline bitcount_t trailingzeros(uint32_t v) +{ + return __builtin_ctz(v); +} + +inline bitcount_t flog2(uint64_t v) +{ +#if UINT64_MAX == ULONG_MAX + return 63 - __builtin_clzl(v); +#elif UINT64_MAX == ULLONG_MAX + return 63 - __builtin_clzll(v); +#else + #error Cannot find a function for uint64_t +#endif +} + +inline bitcount_t trailingzeros(uint64_t v) +{ +#if UINT64_MAX == ULONG_MAX + return __builtin_ctzl(v); +#elif UINT64_MAX == ULLONG_MAX + return __builtin_ctzll(v); +#else + #error Cannot find a function for uint64_t +#endif +} + +#else // Otherwise, we fall back to bit twiddling + // implementations + +inline bitcount_t flog2(uint32_t v) +{ + // Based on code by Eric Cole and Mark Dickinson, which appears at + // https://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn + + static const uint8_t multiplyDeBruijnBitPos[32] = { + 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 + }; + + v |= v >> 1; // first round down to one less than a power of 2 + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + + return multiplyDeBruijnBitPos[(uint32_t)(v * 0x07C4ACDDU) >> 27]; +} + +inline bitcount_t trailingzeros(uint32_t v) +{ + static const uint8_t multiplyDeBruijnBitPos[32] = { + 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 + }; + + return multiplyDeBruijnBitPos[((uint32_t)((v & -v) * 0x077CB531U)) >> 27]; +} + +inline bitcount_t flog2(uint64_t v) +{ + uint32_t high = v >> 32; + uint32_t low = uint32_t(v); + + return high ? 32+flog2(high) : flog2(low); +} + +inline bitcount_t trailingzeros(uint64_t v) +{ + uint32_t high = v >> 32; + uint32_t low = uint32_t(v); + + return low ? trailingzeros(low) : trailingzeros(high)+32; +} + +#endif + +template +inline bitcount_t clog2(UInt v) +{ + return flog2(v) + ((v & (-v)) != v); +} + +template +inline UInt addwithcarry(UInt x, UInt y, bool carryin, bool* carryout) +{ + UInt half_result = y + carryin; + UInt result = x + half_result; + *carryout = (half_result < y) || (result < x); + return result; +} + +template +inline UInt subwithcarry(UInt x, UInt y, bool carryin, bool* carryout) +{ + UInt half_result = y + carryin; + UInt result = x - half_result; + *carryout = (half_result < y) || (result > x); + return result; +} + + +template +class uint_x4 { +// private: +public: + union { +#if PCG_LITTLE_ENDIAN + struct { + UInt v0, v1, v2, v3; + } w; + struct { + UIntX2 v01, v23; + } d; +#else + struct { + UInt v3, v2, v1, v0; + } w; + struct { + UIntX2 v23, v01; + } d; +#endif + // For the array access versions, the code that uses the array + // must handle endian itself. Yuck. + UInt wa[4]; + UIntX2 da[2]; + }; + +public: + uint_x4() = default; + + constexpr uint_x4(UInt v3, UInt v2, UInt v1, UInt v0) +#if PCG_LITTLE_ENDIAN + : w{v0, v1, v2, v3} +#else + : w{v3, v2, v1, v0} +#endif + { + // Nothing (else) to do + } + + constexpr uint_x4(UIntX2 v23, UIntX2 v01) +#if PCG_LITTLE_ENDIAN + : d{v01,v23} +#else + : d{v23,v01} +#endif + { + // Nothing (else) to do + } + + template::value + && sizeof(Integral) <= sizeof(UIntX2)) + >::type* = nullptr> + constexpr uint_x4(Integral v01) +#if PCG_LITTLE_ENDIAN + : d{UIntX2(v01),0UL} +#else + : d{0UL,UIntX2(v01)} +#endif + { + // Nothing (else) to do + } + + explicit constexpr operator uint64_t() const + { + return d.v01; + } + + explicit constexpr operator uint32_t() const + { + return w.v0; + } + + explicit constexpr operator int() const + { + return w.v0; + } + + explicit constexpr operator uint16_t() const + { + return w.v0; + } + + explicit constexpr operator uint8_t() const + { + return w.v0; + } + + typedef typename std::conditional::value, + unsigned long long, + unsigned long>::type + uint_missing_t; + + explicit constexpr operator uint_missing_t() const + { + return d.v01; + } + + explicit constexpr operator bool() const + { + return d.v01 || d.v23; + } + + template + friend uint_x4 operator*(const uint_x4&, const uint_x4&); + + template + friend std::pair< uint_x4,uint_x4 > + divmod(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator+(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator-(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator<<(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator>>(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator&(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator|(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator^(const uint_x4&, const uint_x4&); + + template + friend bool operator==(const uint_x4&, const uint_x4&); + + template + friend bool operator!=(const uint_x4&, const uint_x4&); + + template + friend bool operator<(const uint_x4&, const uint_x4&); + + template + friend bool operator<=(const uint_x4&, const uint_x4&); + + template + friend bool operator>(const uint_x4&, const uint_x4&); + + template + friend bool operator>=(const uint_x4&, const uint_x4&); + + template + friend uint_x4 operator~(const uint_x4&); + + template + friend uint_x4 operator-(const uint_x4&); + + template + friend bitcount_t flog2(const uint_x4&); + + template + friend bitcount_t trailingzeros(const uint_x4&); + + uint_x4& operator*=(const uint_x4& rhs) + { + uint_x4 result = *this * rhs; + return *this = result; + } + + uint_x4& operator/=(const uint_x4& rhs) + { + uint_x4 result = *this / rhs; + return *this = result; + } + + uint_x4& operator%=(const uint_x4& rhs) + { + uint_x4 result = *this % rhs; + return *this = result; + } + + uint_x4& operator+=(const uint_x4& rhs) + { + uint_x4 result = *this + rhs; + return *this = result; + } + + uint_x4& operator-=(const uint_x4& rhs) + { + uint_x4 result = *this - rhs; + return *this = result; + } + + uint_x4& operator&=(const uint_x4& rhs) + { + uint_x4 result = *this & rhs; + return *this = result; + } + + uint_x4& operator|=(const uint_x4& rhs) + { + uint_x4 result = *this | rhs; + return *this = result; + } + + uint_x4& operator^=(const uint_x4& rhs) + { + uint_x4 result = *this ^ rhs; + return *this = result; + } + + uint_x4& operator>>=(bitcount_t shift) + { + uint_x4 result = *this >> shift; + return *this = result; + } + + uint_x4& operator<<=(bitcount_t shift) + { + uint_x4 result = *this << shift; + return *this = result; + } + +}; + +template +bitcount_t flog2(const uint_x4& v) +{ +#if PCG_LITTLE_ENDIAN + for (uint8_t i = 4; i !=0; /* dec in loop */) { + --i; +#else + for (uint8_t i = 0; i < 4; ++i) { +#endif + if (v.wa[i] == 0) + continue; + return flog2(v.wa[i]) + (sizeof(U)*CHAR_BIT)*i; + } + abort(); +} + +template +bitcount_t trailingzeros(const uint_x4& v) +{ +#if PCG_LITTLE_ENDIAN + for (uint8_t i = 0; i < 4; ++i) { +#else + for (uint8_t i = 4; i !=0; /* dec in loop */) { + --i; +#endif + if (v.wa[i] != 0) + return trailingzeros(v.wa[i]) + (sizeof(U)*CHAR_BIT)*i; + } + return (sizeof(U)*CHAR_BIT)*4; +} + +template +std::pair< uint_x4, uint_x4 > + divmod(const uint_x4& orig_dividend, + const uint_x4& divisor) +{ + // If the dividend is less than the divisor, the answer is always zero. + // This takes care of boundary cases like 0/x (which would otherwise be + // problematic because we can't take the log of zero. (The boundary case + // of division by zero is undefined.) + if (orig_dividend < divisor) + return { uint_x4(0UL), orig_dividend }; + + auto dividend = orig_dividend; + + auto log2_divisor = flog2(divisor); + auto log2_dividend = flog2(dividend); + // assert(log2_dividend >= log2_divisor); + bitcount_t logdiff = log2_dividend - log2_divisor; + + constexpr uint_x4 ONE(1UL); + if (logdiff == 0) + return { ONE, dividend - divisor }; + + // Now we change the log difference to + // floor(log2(divisor)) - ceil(log2(dividend)) + // to ensure that we *underestimate* the result. + logdiff -= 1; + + uint_x4 quotient(0UL); + + auto qfactor = ONE << logdiff; + auto factor = divisor << logdiff; + + do { + dividend -= factor; + quotient += qfactor; + while (dividend < factor) { + factor >>= 1; + qfactor >>= 1; + } + } while (dividend >= divisor); + + return { quotient, dividend }; +} + +template +uint_x4 operator/(const uint_x4& dividend, + const uint_x4& divisor) +{ + return divmod(dividend, divisor).first; +} + +template +uint_x4 operator%(const uint_x4& dividend, + const uint_x4& divisor) +{ + return divmod(dividend, divisor).second; +} + + +template +uint_x4 operator*(const uint_x4& a, + const uint_x4& b) +{ + uint_x4 r = {0U, 0U, 0U, 0U}; + bool carryin = false; + bool carryout; + UIntX2 a0b0 = UIntX2(a.w.v0) * UIntX2(b.w.v0); + r.w.v0 = UInt(a0b0); + r.w.v1 = UInt(a0b0 >> 32); + + UIntX2 a1b0 = UIntX2(a.w.v1) * UIntX2(b.w.v0); + r.w.v2 = UInt(a1b0 >> 32); + r.w.v1 = addwithcarry(r.w.v1, UInt(a1b0), carryin, &carryout); + carryin = carryout; + r.w.v2 = addwithcarry(r.w.v2, UInt(0U), carryin, &carryout); + carryin = carryout; + r.w.v3 = addwithcarry(r.w.v3, UInt(0U), carryin, &carryout); + + UIntX2 a0b1 = UIntX2(a.w.v0) * UIntX2(b.w.v1); + carryin = false; + r.w.v2 = addwithcarry(r.w.v2, UInt(a0b1 >> 32), carryin, &carryout); + carryin = carryout; + r.w.v3 = addwithcarry(r.w.v3, UInt(0U), carryin, &carryout); + + carryin = false; + r.w.v1 = addwithcarry(r.w.v1, UInt(a0b1), carryin, &carryout); + carryin = carryout; + r.w.v2 = addwithcarry(r.w.v2, UInt(0U), carryin, &carryout); + carryin = carryout; + r.w.v3 = addwithcarry(r.w.v3, UInt(0U), carryin, &carryout); + + UIntX2 a1b1 = UIntX2(a.w.v1) * UIntX2(b.w.v1); + carryin = false; + r.w.v2 = addwithcarry(r.w.v2, UInt(a1b1), carryin, &carryout); + carryin = carryout; + r.w.v3 = addwithcarry(r.w.v3, UInt(a1b1 >> 32), carryin, &carryout); + + r.d.v23 += a.d.v01 * b.d.v23 + a.d.v23 * b.d.v01; + + return r; +} + + +template +uint_x4 operator+(const uint_x4& a, + const uint_x4& b) +{ + uint_x4 r = {0U, 0U, 0U, 0U}; + + bool carryin = false; + bool carryout; + r.w.v0 = addwithcarry(a.w.v0, b.w.v0, carryin, &carryout); + carryin = carryout; + r.w.v1 = addwithcarry(a.w.v1, b.w.v1, carryin, &carryout); + carryin = carryout; + r.w.v2 = addwithcarry(a.w.v2, b.w.v2, carryin, &carryout); + carryin = carryout; + r.w.v3 = addwithcarry(a.w.v3, b.w.v3, carryin, &carryout); + + return r; +} + +template +uint_x4 operator-(const uint_x4& a, + const uint_x4& b) +{ + uint_x4 r = {0U, 0U, 0U, 0U}; + + bool carryin = false; + bool carryout; + r.w.v0 = subwithcarry(a.w.v0, b.w.v0, carryin, &carryout); + carryin = carryout; + r.w.v1 = subwithcarry(a.w.v1, b.w.v1, carryin, &carryout); + carryin = carryout; + r.w.v2 = subwithcarry(a.w.v2, b.w.v2, carryin, &carryout); + carryin = carryout; + r.w.v3 = subwithcarry(a.w.v3, b.w.v3, carryin, &carryout); + + return r; +} + + +template +uint_x4 operator&(const uint_x4& a, + const uint_x4& b) +{ + return uint_x4(a.d.v23 & b.d.v23, a.d.v01 & b.d.v01); +} + +template +uint_x4 operator|(const uint_x4& a, + const uint_x4& b) +{ + return uint_x4(a.d.v23 | b.d.v23, a.d.v01 | b.d.v01); +} + +template +uint_x4 operator^(const uint_x4& a, + const uint_x4& b) +{ + return uint_x4(a.d.v23 ^ b.d.v23, a.d.v01 ^ b.d.v01); +} + +template +uint_x4 operator~(const uint_x4& v) +{ + return uint_x4(~v.d.v23, ~v.d.v01); +} + +template +uint_x4 operator-(const uint_x4& v) +{ + return uint_x4(0UL,0UL) - v; +} + +template +bool operator==(const uint_x4& a, const uint_x4& b) +{ + return (a.d.v01 == b.d.v01) && (a.d.v23 == b.d.v23); +} + +template +bool operator!=(const uint_x4& a, const uint_x4& b) +{ + return !operator==(a,b); +} + + +template +bool operator<(const uint_x4& a, const uint_x4& b) +{ + return (a.d.v23 < b.d.v23) + || ((a.d.v23 == b.d.v23) && (a.d.v01 < b.d.v01)); +} + +template +bool operator>(const uint_x4& a, const uint_x4& b) +{ + return operator<(b,a); +} + +template +bool operator<=(const uint_x4& a, const uint_x4& b) +{ + return !(operator<(b,a)); +} + +template +bool operator>=(const uint_x4& a, const uint_x4& b) +{ + return !(operator<(a,b)); +} + + + +template +uint_x4 operator<<(const uint_x4& v, + const bitcount_t shift) +{ + uint_x4 r = {0U, 0U, 0U, 0U}; + const bitcount_t bits = sizeof(UInt) * CHAR_BIT; + const bitcount_t bitmask = bits - 1; + const bitcount_t shiftdiv = shift / bits; + const bitcount_t shiftmod = shift & bitmask; + + if (shiftmod) { + UInt carryover = 0; +#if PCG_LITTLE_ENDIAN + for (uint8_t out = shiftdiv, in = 0; out < 4; ++out, ++in) { +#else + for (uint8_t out = 4-shiftdiv, in = 4; out != 0; /* dec in loop */) { + --out, --in; +#endif + r.wa[out] = (v.wa[in] << shiftmod) | carryover; + carryover = (v.wa[in] >> (bits - shiftmod)); + } + } else { +#if PCG_LITTLE_ENDIAN + for (uint8_t out = shiftdiv, in = 0; out < 4; ++out, ++in) { +#else + for (uint8_t out = 4-shiftdiv, in = 4; out != 0; /* dec in loop */) { + --out, --in; +#endif + r.wa[out] = v.wa[in]; + } + } + + return r; +} + +template +uint_x4 operator>>(const uint_x4& v, + const bitcount_t shift) +{ + uint_x4 r = {0U, 0U, 0U, 0U}; + const bitcount_t bits = sizeof(UInt) * CHAR_BIT; + const bitcount_t bitmask = bits - 1; + const bitcount_t shiftdiv = shift / bits; + const bitcount_t shiftmod = shift & bitmask; + + if (shiftmod) { + UInt carryover = 0; +#if PCG_LITTLE_ENDIAN + for (uint8_t out = 4-shiftdiv, in = 4; out != 0; /* dec in loop */) { + --out, --in; +#else + for (uint8_t out = shiftdiv, in = 0; out < 4; ++out, ++in) { +#endif + r.wa[out] = (v.wa[in] >> shiftmod) | carryover; + carryover = (v.wa[in] << (bits - shiftmod)); + } + } else { +#if PCG_LITTLE_ENDIAN + for (uint8_t out = 4-shiftdiv, in = 4; out != 0; /* dec in loop */) { + --out, --in; +#else + for (uint8_t out = shiftdiv, in = 0; out < 4; ++out, ++in) { +#endif + r.wa[out] = v.wa[in]; + } + } + + return r; +} + +} // namespace pcg_extras + +#endif // PCG_UINT128_HPP_INCLUDED -- cgit v1.2.3 From 6e8536619890fbf36b6a890a92627d87b8b92842 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Replace randnor() with C++-based implementation --- src/z-rand.cc | 152 +++++++++++++++++++++------------------------------------- 1 file changed, 55 insertions(+), 97 deletions(-) diff --git a/src/z-rand.cc b/src/z-rand.cc index 0f507cb6..a35eb08b 100644 --- a/src/z-rand.cc +++ b/src/z-rand.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include "pcg_random.hpp" #include "seed.hpp" @@ -113,119 +114,76 @@ void set_complex_rng_state(std::string const &state) } -/* - * The number of entries in the "randnor_table" - */ -#define RANDNOR_NUM 256 - -/* - * The standard deviation of the "randnor_table" - */ -#define RANDNOR_STD 64 /* - * The normal distribution table for the "randnor()" function (below) + * Stochastic rounding */ -static s16b randnor_table[RANDNOR_NUM] = +static double round_stochastic(double x) { - 206, 613, 1022, 1430, 1838, 2245, 2652, 3058, - 3463, 3867, 4271, 4673, 5075, 5475, 5874, 6271, - 6667, 7061, 7454, 7845, 8234, 8621, 9006, 9389, - 9770, 10148, 10524, 10898, 11269, 11638, 12004, 12367, - 12727, 13085, 13440, 13792, 14140, 14486, 14828, 15168, - 15504, 15836, 16166, 16492, 16814, 17133, 17449, 17761, - 18069, 18374, 18675, 18972, 19266, 19556, 19842, 20124, - 20403, 20678, 20949, 21216, 21479, 21738, 21994, 22245, - - 22493, 22737, 22977, 23213, 23446, 23674, 23899, 24120, - 24336, 24550, 24759, 24965, 25166, 25365, 25559, 25750, - 25937, 26120, 26300, 26476, 26649, 26818, 26983, 27146, - 27304, 27460, 27612, 27760, 27906, 28048, 28187, 28323, - 28455, 28585, 28711, 28835, 28955, 29073, 29188, 29299, - 29409, 29515, 29619, 29720, 29818, 29914, 30007, 30098, - 30186, 30272, 30356, 30437, 30516, 30593, 30668, 30740, - 30810, 30879, 30945, 31010, 31072, 31133, 31192, 31249, - - 31304, 31358, 31410, 31460, 31509, 31556, 31601, 31646, - 31688, 31730, 31770, 31808, 31846, 31882, 31917, 31950, - 31983, 32014, 32044, 32074, 32102, 32129, 32155, 32180, - 32205, 32228, 32251, 32273, 32294, 32314, 32333, 32352, - 32370, 32387, 32404, 32420, 32435, 32450, 32464, 32477, - 32490, 32503, 32515, 32526, 32537, 32548, 32558, 32568, - 32577, 32586, 32595, 32603, 32611, 32618, 32625, 32632, - 32639, 32645, 32651, 32657, 32662, 32667, 32672, 32677, - - 32682, 32686, 32690, 32694, 32698, 32702, 32705, 32708, - 32711, 32714, 32717, 32720, 32722, 32725, 32727, 32729, - 32731, 32733, 32735, 32737, 32739, 32740, 32742, 32743, - 32745, 32746, 32747, 32748, 32749, 32750, 32751, 32752, - 32753, 32754, 32755, 32756, 32757, 32757, 32758, 32758, - 32759, 32760, 32760, 32761, 32761, 32761, 32762, 32762, - 32763, 32763, 32763, 32764, 32764, 32764, 32764, 32765, - 32765, 32765, 32765, 32766, 32766, 32766, 32766, 32767, -}; + double n; + double f = std::modf(x, &n); + + // Round up? + if (f > 0.5) + { + return n + 1; + } + + // Round down? + if (f < 0.5) + { + return n - 1; + } + // Tie breaker is random; hence 'stochastic'. + std::uniform_int_distribution distribution(0, 1); + if (distribution(*get_current_rng()) == 0) + { + return n - 1; + } + else + { + return n + 1; + } +} /* * Generate a random integer number of NORMAL distribution - * - * The table above is used to generate a psuedo-normal distribution, - * in a manner which is much faster than calling a transcendental - * function to calculate a true normal distribution. - * - * Basically, entry 64*N in the table above represents the number of - * times out of 32767 that a random variable with normal distribution - * will fall within N standard deviations of the mean. That is, about - * 68 percent of the time for N=1 and 95 percent of the time for N=2. - * - * The table above contains a "faked" final entry which allows us to - * pretend that all values in a normal distribution are strictly less - * than four standard deviations away from the mean. This results in - * "conservative" distribution of approximately 1/32768 values. - * - * Note that the binary search takes up to 16 quick iterations. */ s16b randnor(int mean, int stand) { - s16b tmp; - s16b offset; - - s16b low = 0; - s16b high = RANDNOR_NUM; + // Get our own return type; we need it for limits and casting. + using retval_t = std::result_of::type; - /* Paranoia */ - if (stand < 1) return (mean); - - /* Roll for probability */ - tmp = (s16b)rand_int(32768); - - /* Binary Search */ - while (low < high) + // Degenerate case + if (stand < 1) { - int mid = (low + high) >> 1; - - /* Move right if forced */ - if (randnor_table[mid] < tmp) - { - low = mid + 1; - } - - /* Move left otherwise */ - else - { - high = mid; - } + return 0; } - /* Convert the index into an offset */ - offset = (long)stand * (long)low / RANDNOR_STD; - - /* One half should be negative */ - if (rand_int(100) < 50) return (mean - offset); - - /* One half should be positive */ - return (mean + offset); + // Sample from normal distribution + std::normal_distribution distribution(mean, stand); + double x = distribution(*get_current_rng()); + + // Stochastic rounding to avoid rounding bias + double rounded_x = round_stochastic(x); + + // Enforce limits of retval_t. Given that we're talking about a normal + // distribution, we're usually very unlikely to actually hit these (given + // reasonable values for 'mean' and 'stand' parameters), but in (very) rare + // cases it's needed to avoid undefined behavior due to the conversion + // we're going to do. This does introduce some (very minor) bias, but + // it's really unavoidable since retval_t cannot represent all possible + // values. We also assuming that a double can accurately represent all + // values in the range of retval_t. + double clipped_x = std::min( + static_cast(std::numeric_limits::max()), + std::max(static_cast(std::numeric_limits::min()), + rounded_x)); + + // Done: We just need to convert to retval_t. + return static_cast(clipped_x); } -- cgit v1.2.3 From e569b328d76c7437018eb11efcc0aa10bbd91de6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Use 'bool' in random_quest struct --- src/loadsave.cc | 18 ++++++++++++++++++ src/q_rand.cc | 6 +++--- src/random_quest.hpp | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 8bea40f4..73429be4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -145,6 +145,24 @@ static void do_bool(bool_ *f, ls_flag_t flag) } } +static void do_bool(bool *x, ls_flag_t flag) +{ + switch (flag) + { + case ls_flag_t::LOAD: + { + *x = (sf_get() != 0); + return; + } + case ls_flag_t::SAVE: + { + byte val = (*x) ? 1 : 0; + sf_put(val); + return; + } + } +} + static void do_u16b(u16b *v, ls_flag_t flag) { switch (flag) diff --git a/src/q_rand.cc b/src/q_rand.cc index af58309d..e48fec98 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -182,7 +182,7 @@ void initialize_random_quests(int n) r_ptr->max_num = -1; } - q_ptr->done = FALSE; + q_ptr->done = false; if (wizard) { @@ -314,7 +314,7 @@ static void princess_death(s32b m_idx, s32b r_idx) do_get_new_obj(y, x); - random_quests[dun_level].done = TRUE; + random_quests[dun_level].done = true; break; } @@ -323,7 +323,7 @@ static void princess_death(s32b m_idx, s32b r_idx) static void hero_death(s32b m_idx, s32b r_idx) { - random_quests[dun_level].done = TRUE; + random_quests[dun_level].done = true; cmsg_print(TERM_YELLOW, "The adventurer steps out of the shadows and picks up his sword:"); cmsg_print(TERM_YELLOW, "'Ah! My sword! My trusty sword! Thanks."); diff --git a/src/random_quest.hpp b/src/random_quest.hpp index 11ebe797..9e3c6e10 100644 --- a/src/random_quest.hpp +++ b/src/random_quest.hpp @@ -6,5 +6,5 @@ struct random_quest { byte type; /* Type/number of monsters to kill(0 = no quest) */ s16b r_idx; /* Monsters to crush */ - bool_ done; /* Done ? */ + bool done; /* Done? */ }; -- cgit v1.2.3 From d52879d4ed58423e1e9ccc7f5dc34d237a295527 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Use 'bool' in random_spell struct --- src/cmd7.cc | 2 +- src/random_spell.hpp | 2 +- src/spells1.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd7.cc b/src/cmd7.cc index aaec34b7..2d9ae191 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1608,7 +1608,7 @@ void do_cmd_powermage(void) p_ptr->csp -= s_ptr->mana; - s_ptr->untried = FALSE; + s_ptr->untried = false; proj_flags = s_ptr->proj_flags; /* Hack -- Spell needs a target */ diff --git a/src/random_spell.hpp b/src/random_spell.hpp index 01b5ba5e..2c814c9f 100644 --- a/src/random_spell.hpp +++ b/src/random_spell.hpp @@ -17,5 +17,5 @@ struct random_spell byte dam_sides; byte dam_dice; byte level; /* Level needed */ - bool_ untried; /* Is the spell was tried? */ + bool untried; /* Is the spell was tried? */ }; diff --git a/src/spells1.cc b/src/spells1.cc index 7cedf83b..1fe14c5a 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -8953,7 +8953,7 @@ void generate_spell(int plev) rspell->level = plev; rspell->mana = mana; - rspell->untried = TRUE; + rspell->untried = true; /* Spells are always maximally destructive. */ rspell->proj_flags = PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID; -- cgit v1.2.3 From 5a3f511fd036dd73152786e83f32c32f274f2398 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Use 'bool' in struct help_info --- src/help.cc | 6 ++---- src/help_info.hpp | 4 ++-- src/loadsave.cc | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/help.cc b/src/help.cc index be078d59..f8d75e79 100644 --- a/src/help.cc +++ b/src/help.cc @@ -601,13 +601,11 @@ static bool_ triggered_help_hook(void *data, void *in, void *out) (!p_ptr->help.activated[triggered_help->help_index]) && triggered_help->trigger_func(in,out)) { - int i; - /* Triggered */ - p_ptr->help.activated[triggered_help->help_index] = TRUE; + p_ptr->help.activated[triggered_help->help_index] = true; /* Show the description */ - for (i = 0; (i < DESC_MAX) && (triggered_help->desc[i] != NULL); i++) + for (std::size_t i = 0; (i < DESC_MAX) && (triggered_help->desc[i] != NULL); i++) { cmsg_print(TERM_YELLOW, triggered_help->desc[i]); } diff --git a/src/help_info.hpp b/src/help_info.hpp index 0960af77..1b4a3757 100644 --- a/src/help_info.hpp +++ b/src/help_info.hpp @@ -12,6 +12,6 @@ constexpr int HELP_MAX = 64; */ struct help_info { - bool_ enabled = FALSE; /* ingame help enabled */ - bool_ activated[HELP_MAX] = { FALSE }; /* help item #i activated? */ + bool enabled = false; /* ingame help enabled */ + bool activated[HELP_MAX] = { false }; /* help item #i activated? */ }; diff --git a/src/loadsave.cc b/src/loadsave.cc index 73429be4..2e3ac33f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -751,7 +751,7 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->help.enabled, flag); for (std::size_t i = 0; i < HELP_MAX; i++) { - do_bool(&(p_ptr->help.activated[i]), flag); + do_bool(&p_ptr->help.activated[i], flag); } /* More info */ -- cgit v1.2.3 From cc857c940cfe1bfe8d78674dbce53e5b71acaf41 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move ability_type::acquired to p_ptr struct This is justified by the fact that the 'acquired' flag is actually a player-centered bit of information and must be loaded/saved. Everything else in ability_type is defined by the *.txt files. --- src/CMakeLists.txt | 1 + src/ability_type.hpp | 2 -- src/birth.cc | 5 ++--- src/cmd1.cc | 4 ++-- src/cmd4.cc | 2 +- src/cmd6.cc | 2 +- src/dungeon.cc | 4 ++-- src/init1.cc | 1 - src/loadsave.cc | 17 +-------------- src/lua_bind.cc | 2 +- src/player_type.cc | 28 ++++++++++++++++++++++++ src/player_type.hpp | 20 +++++++++++++++++- src/skills.cc | 55 ++++++++++++++++++++++++++++-------------------- src/skills.hpp | 1 - src/spells1.cc | 2 +- src/spells2.cc | 2 +- src/squelch/condition.cc | 2 +- src/xtra1.cc | 4 ++-- 18 files changed, 95 insertions(+), 59 deletions(-) create mode 100644 src/player_type.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7b4d025b..8ac5e097 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -57,6 +57,7 @@ SET(SRCS_COMMON object_filter.cc object_flag_meta.cc options.cc + player_type.cc powers.cc q_betwen.cc q_bounty.cc diff --git a/src/ability_type.hpp b/src/ability_type.hpp index ea8a921d..3a2a51ee 100644 --- a/src/ability_type.hpp +++ b/src/ability_type.hpp @@ -16,8 +16,6 @@ struct ability_type s16b cost; /* Skill points cost */ - bool_ acquired; /* Do the player actualylg ot it ? */ - /* Prereqs */ s16b skills[10]; /* List of prereq skills(10 max) */ s16b skill_levels[10]; /* List of prereq skills(10 max) */ diff --git a/src/birth.cc b/src/birth.cc index 1fc5d515..f426fca9 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1142,7 +1142,7 @@ static void player_outfit(void) } /* Rogues have a better knowledge of traps */ - if (has_ability(AB_TRAPPING)) + if (p_ptr->has_ability(AB_TRAPPING)) { t_info[TRAP_OF_DAGGER_I].known = randint(50) + 50; t_info[TRAP_OF_POISON_NEEDLE].known = randint(50) + 50; @@ -3083,8 +3083,7 @@ void player_birth(void) recalc_skills(FALSE); /* grab level 1 abilities */ - for (i = 0; i < max_ab_idx; i++) - ab_info[i].acquired = FALSE; + p_ptr->abilities.clear(); apply_level_abilities(1); /* Complete the god */ diff --git a/src/cmd1.cc b/src/cmd1.cc index c54e3dbd..f8e064c2 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -2369,7 +2369,7 @@ void py_attack(int y, int x, int max_blow) /* Hack -- High-level warriors can spread their attacks out * among weaker foes. */ - if ((has_ability(AB_SPREAD_BLOWS)) && (num < num_blow) && + if ((p_ptr->has_ability(AB_SPREAD_BLOWS)) && (num < num_blow) && (energy_use)) { energy_use = energy_use * num / num_blow; @@ -2587,7 +2587,7 @@ bool_ player_can_enter(byte feature) { if (p_ptr->fly || pass_wall || - (has_ability(AB_TREE_WALK)) || + p_ptr->has_ability(AB_TREE_WALK) || (p_ptr->mimic_form == resolve_mimic_name("Ent")) || ((p_ptr->grace >= 9000) && praying_to(GOD_YAVANNA))) return (TRUE); diff --git a/src/cmd4.cc b/src/cmd4.cc index 01452090..724d5a1f 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3457,7 +3457,7 @@ static void do_cmd_knowledge_pets(void) // Calculate upkeep int show_upkeep = 0; - int upkeep_divider = has_ability(AB_PERFECT_CASTING) ? 15 : 20; + int upkeep_divider = p_ptr->has_ability(AB_PERFECT_CASTING) ? 15 : 20; if (t_friends > 1 + (p_ptr->lev / (upkeep_divider))) { diff --git a/src/cmd6.cc b/src/cmd6.cc index 4490b5de..1663b5c1 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -5318,7 +5318,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("The stone reveals hidden mysteries..."); if (!ident_spell()) break; - if (has_ability(AB_PERFECT_CASTING)) + if (p_ptr->has_ability(AB_PERFECT_CASTING)) { /* Sufficient mana */ if (20 <= p_ptr->csp) diff --git a/src/dungeon.cc b/src/dungeon.cc index b02b2a87..00bee6f4 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1489,7 +1489,7 @@ static void process_world(void) int feature = cave[p_ptr->py][p_ptr->px].feat; /* Player can walk through or fly over trees */ - if ((has_ability(AB_TREE_WALK) || p_ptr->fly) && (feature == FEAT_TREES)) + if ((p_ptr->has_ability(AB_TREE_WALK) || p_ptr->fly) && (feature == FEAT_TREES)) { /* Do nothing */ } @@ -1673,7 +1673,7 @@ static void process_world(void) { int upkeep_divider = 20; - if (has_ability(AB_PERFECT_CASTING)) + if (p_ptr->has_ability(AB_PERFECT_CASTING)) upkeep_divider = 15; if (total_friends > 1 + (p_ptr->lev / (upkeep_divider))) diff --git a/src/init1.cc b/src/init1.cc index de92ae90..3f803fbe 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3419,7 +3419,6 @@ errr init_ab_info_txt(FILE *fp) /* Init */ ab_ptr->action_mkey = 0; - ab_ptr->acquired = FALSE; for (z = 0; z < 10; z++) { ab_ptr->skills[z] = -1; diff --git a/src/loadsave.cc b/src/loadsave.cc index 2e3ac33f..e6f4cefa 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1,7 +1,6 @@ #include "loadsave.hpp" #include "loadsave.h" -#include "ability_type.hpp" #include "artifact_type.hpp" #include "birth.hpp" #include "cave_type.hpp" @@ -619,21 +618,7 @@ static bool_ do_extra(ls_flag_t flag) } // Abilities - { - u16b tmp16u = max_ab_idx; - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_ab_idx)) - { - quit("Too many abilities"); - } - - for (std::size_t i = 0; i < tmp16u; ++i) - { - do_bool(&ab_info[i].acquired, flag); - } - } + do_vector(flag, p_ptr->abilities, do_u16b); // Miscellaneous do_s16b(&p_ptr->luck_base, flag); diff --git a/src/lua_bind.cc b/src/lua_bind.cc index 151ba3b8..1612fb29 100644 --- a/src/lua_bind.cc +++ b/src/lua_bind.cc @@ -146,7 +146,7 @@ static s32b spell_chance_school(s32b s) minfail = adj_mag_fail[stat_ind]; /* Must have Perfect Casting to get below 5% */ - if (!(has_ability(AB_PERFECT_CASTING))) + if (!(p_ptr->has_ability(AB_PERFECT_CASTING))) { if (minfail < 5) minfail = 5; } diff --git a/src/player_type.cc b/src/player_type.cc new file mode 100644 index 00000000..0cc66de7 --- /dev/null +++ b/src/player_type.cc @@ -0,0 +1,28 @@ +#include "player_type.hpp" + +#include + +bool player_type::has_ability(u16b ability_idx) const +{ + return std::find( + abilities.begin(), + abilities.end(), + ability_idx) != abilities.end(); +} + +void player_type::gain_ability(u16b ability_idx) +{ + // Duplicates don't really matter, so let's just + // accept whatever value we get without checking + // anything. + abilities.push_back(ability_idx); +} + +void player_type::lose_ability(u16b ability_idx) +{ + abilities.erase( + std::remove( + abilities.begin(), + abilities.end(), + ability_idx)); +} diff --git a/src/player_type.hpp b/src/player_type.hpp index 1285e018..8f3c06dc 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -378,6 +378,9 @@ struct player_type bool_ powers[POWER_MAX] = { FALSE }; /* Actual powers */ bool_ powers_mod[POWER_MAX] = { FALSE }; /* Intrinsinc powers */ + /* Acquired abilities; indexes into ab_info[] */ + std::vector abilities; + /* Skills */ s16b skill_points = 0; s16b skill_last_level = 0; /* Prevents gaining skills by losing level and regaining them */ @@ -400,5 +403,20 @@ struct player_type bool_ did_nothing = FALSE; /* True if the last action wasnt a real action */ bool_ leaving = FALSE; /* True if player is leaving */ -}; + /** + * Does the player have the given ability? + */ + bool has_ability(u16b ability_idx) const; + + /** + * Gain the given ability. + */ + void gain_ability(u16b ability_idx); + + /** + * Lose the given ability. + */ + void lose_ability(u16b ability_idx); + +}; diff --git a/src/skills.cc b/src/skills.cc index 70665a49..fc5b068c 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -839,7 +839,7 @@ static int do_cmd_activate_skill_aux() for (size_t i = 0; i < max_ab_idx; i++) { - if (ab_info[i].action_mkey && ab_info[i].acquired) + if (ab_info[i].action_mkey && p_ptr->has_ability(i)) { bool_ next = FALSE; @@ -970,7 +970,7 @@ void do_cmd_activate_skill() } for (j = 0; j < max_ab_idx; j++) { - if (ab_info[j].acquired && (ab_info[j].action_mkey == x_idx)) + if (p_ptr->has_ability(j) && (ab_info[j].action_mkey == x_idx)) break; } @@ -1436,21 +1436,13 @@ s16b find_ability(cptr name) return ( -1); } -/* - * Do the player have the ability - */ -bool_ has_ability(int ab) -{ - return ab_info[ab].acquired; -} - /* Do we meet the requirements */ static bool_ can_learn_ability(int ab) { ability_type *ab_ptr = &ab_info[ab]; int i; - if (ab_ptr->acquired) + if (p_ptr->has_ability(ab)) return FALSE; if (p_ptr->skill_points < ab_info[ab].cost) @@ -1468,15 +1460,19 @@ static bool_ can_learn_ability(int ab) /* Must have ability */ if (ab_ptr->need_abilities[i] > -1) { - if (!ab_info[ab_ptr->need_abilities[i]].acquired) + if (!p_ptr->has_ability(ab_ptr->need_abilities[i])) + { return FALSE; + } } /* Must not have ability */ if (ab_ptr->forbid_abilities[i] > -1) { - if (ab_info[ab_ptr->forbid_abilities[i]].acquired) + if (p_ptr->has_ability(ab_ptr->forbid_abilities[i])) + { return FALSE; + } } } @@ -1509,12 +1505,12 @@ static void gain_ability(int ab) flush(); /* Ask we can commit the change */ - if (msg_box("Learn this ability(this is permanent)? (y/n)", hgt / 2, wid / 2) != 'y') + if (msg_box("Learn this ability (this is permanent)? (y/n)", hgt / 2, wid / 2) != 'y') { return; } - ab_info[ab].acquired = TRUE; + p_ptr->gain_ability(ab); p_ptr->skill_points -= ab_info[ab].cost; } @@ -1534,7 +1530,7 @@ void dump_abilities(FILE *fff) std::vector table; for (i = 0; i < max_ab_idx; i++) { - if (ab_info[i].name && has_ability(i)) + if (ab_info[i].name && p_ptr->has_ability(i)) { table.push_back(i); } @@ -1592,12 +1588,18 @@ static void print_abilities(const std::vector &table, int sel, int start) i = table[j]; - if (ab_info[i].acquired) + if (p_ptr->has_ability(i)) + { color = TERM_L_BLUE; + } else if (can_learn_ability(i)) + { color = TERM_WHITE; + } else + { color = TERM_L_DARK; + } if (j == sel) @@ -1610,7 +1612,7 @@ static void print_abilities(const std::vector &table, int sel, int start) c_prt(color, format("%c.%c%s", deb, end, ab_info[i].name), j + 7 - start, 0); - if (!ab_info[i].acquired) + if (!p_ptr->has_ability(i)) { c_prt(color, format("%d", ab_info[i].cost), j + 7 - start, 60); } @@ -1702,10 +1704,16 @@ void do_cmd_ability() /* gain ability */ if (dir == 6) gain_ability(table[sel]); - /* XXX XXX XXX Wizard mode commands outside of wizard2.c */ + /* Wizard mode allows any ability */ + if (wizard && (c == '+')) + { + p_ptr->gain_ability(table[sel]); + } - if (wizard && (c == '+')) ab_info[table[sel]].acquired = TRUE; - if (wizard && (c == '-')) ab_info[table[sel]].acquired = FALSE; + if (wizard && (c == '-')) + { + p_ptr->lose_ability(table[sel]); + } /* Contextual help */ if (c == '?') @@ -1755,11 +1763,12 @@ void apply_level_abilities(int level) { if (a.level == level) { - if ((level > 1) && (!ab_info[a.ability].acquired)) + if ((level > 1) && (!p_ptr->has_ability(a.ability))) { cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[a.ability].name); } - ab_info[a.ability].acquired = TRUE; + + p_ptr->gain_ability(a.ability); } } }; diff --git a/src/skills.hpp b/src/skills.hpp index 6c1880a6..4cd63358 100644 --- a/src/skills.hpp +++ b/src/skills.hpp @@ -22,6 +22,5 @@ extern void init_skill(s32b value, s32b mod, int i); extern s16b find_ability(cptr name); extern void dump_abilities(FILE *fff); extern void do_cmd_ability(void); -extern bool_ has_ability(int ab); extern void apply_level_abilities(int level); extern void recalc_skills(bool_ init); diff --git a/src/spells1.cc b/src/spells1.cc index 1fe14c5a..0054a1d6 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1322,7 +1322,7 @@ void take_hit(int damage, cptr hit_from) if (p_ptr->chp < 0) { /* Necromancers get a special treatment */ - if (((!has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD)))) + if (((!p_ptr->has_ability(AB_UNDEAD_FORM)) || ((p_ptr->necro_extra & CLASS_UNDEAD)))) { /* Hack -- Note death */ if (!options->last_words) diff --git a/src/spells2.cc b/src/spells2.cc index 0cdf08ed..bc5b8642 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -3623,7 +3623,7 @@ bool_ recharge(int power) /*** Determine Seriousness of Failure ***/ /* Mages recharge objects more safely. */ - if (has_ability(AB_PERFECT_CASTING)) + if (p_ptr->has_ability(AB_PERFECT_CASTING)) { /* 10% chance to blow up one rod, otherwise draining. */ if (o_ptr->tval == TV_ROD_MAIN) diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index c3b8c3f5..41806feb 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -891,7 +891,7 @@ void SymbolCondition::to_json(json_t *j) const bool AbilityCondition::is_match(object_type *) const { - return has_ability(m_ability_idx); + return p_ptr->has_ability(m_ability_idx); } std::shared_ptr AbilityCondition::from_json(json_t *j) diff --git a/src/xtra1.cc b/src/xtra1.cc index 16edf4bf..280cc61a 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2246,8 +2246,8 @@ void calc_body_bonus() static int get_extra_blows_ability() { /* Count bonus abilities */ int num = 0; - if (has_ability(AB_MAX_BLOW1)) num++; - if (has_ability(AB_MAX_BLOW2)) num++; + if (p_ptr->has_ability(AB_MAX_BLOW1)) num++; + if (p_ptr->has_ability(AB_MAX_BLOW2)) num++; return num; } -- cgit v1.2.3 From daf23851092099647a3830aa1c0cf12962f55b8e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Move 'player_*' shared fields to new 'player_shared' struct --- src/birth.cc | 8 ++++---- src/cmd5.cc | 4 ++-- src/corrupt.cc | 31 +++++++++++-------------------- src/init1.cc | 33 ++++++++++++++++++--------------- src/loadsave.cc | 23 ++++++++++++++++++----- src/player_class.hpp | 8 ++------ src/player_race.hpp | 10 +++------- src/player_race_mod.hpp | 9 ++------- src/player_shared.hpp | 16 ++++++++++++++++ src/xtra1.cc | 34 +++++++++++++++++----------------- src/xtra2.cc | 4 ++-- 11 files changed, 95 insertions(+), 85 deletions(-) create mode 100644 src/player_shared.hpp diff --git a/src/birth.cc b/src/birth.cc index f426fca9..f358bd58 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -421,7 +421,7 @@ static void get_stats(void) p_ptr->stat_max[i] = j; /* Obtain a "bonus" for "race" and "class" */ - bonus = rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i]; + bonus = rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i]; /* Start fully healed */ p_ptr->stat_cur[i] = p_ptr->stat_max[i]; @@ -452,13 +452,13 @@ static void get_extra(void) p_ptr->max_plv = p_ptr->lev = 1; /* Experience factor */ - p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp; + p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp; /* Initialize quest */ p_ptr->inside_quest = 0; /* Hitdice */ - p_ptr->hitdie = rp_ptr->r_mhp + rmp_ptr->r_mhp + cp_ptr->c_mhp; + p_ptr->hitdie = rp_ptr->ps.mhp + rmp_ptr->ps.mhp + cp_ptr->ps.mhp; /* Initial hitpoints */ p_ptr->mhp = p_ptr->hitdie; @@ -2487,7 +2487,7 @@ static bool_ player_birth_aux_auto() stat_match[i] = 0; /* Race/Class bonus */ - j = rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i]; + j = rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i]; /* Obtain the "maximal" stat */ m = adjust_stat(17, j, TRUE); diff --git a/src/cmd5.cc b/src/cmd5.cc index d3d072b8..f4885609 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -359,7 +359,7 @@ void do_poly_self(void) while (1) { new_race = rand_int(max_rp_idx); - expfact = race_info[new_race].r_exp; + expfact = race_info[new_race].ps.exp; if ((new_race != p_ptr->prace) && (expfact <= goalexpfact)) break; } @@ -380,7 +380,7 @@ void do_poly_self(void) rp_ptr = &race_info[p_ptr->prace]; /* Experience factor */ - p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp; + p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp; /* Level up if necessary */ check_experience(); diff --git a/src/corrupt.cc b/src/corrupt.cc index 5f50802d..18b23ad4 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -41,16 +41,7 @@ struct corruption_type static void subrace_add_power(player_race_mod *rmp_ptr, int power) { - int i; - - for (i=0; i<4; i++) - { - if (rmp_ptr->powers[i] == -1) - { - rmp_ptr->powers[i] = power; - return; - } - } + rmp_ptr->ps.powers.push_back(power); } static void player_gain_vampire_teeth() @@ -70,16 +61,16 @@ static void player_gain_vampire_teeth() static void player_gain_vampire_strength() { player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE]; - /* Apply the bonuses/penalities */ - rmp_ptr->r_mhp = rmp_ptr->r_mhp + 1; - rmp_ptr->r_exp = rmp_ptr->r_exp + 100; - - rmp_ptr->r_adj[A_STR] = rmp_ptr->r_adj[A_STR] + 3; - rmp_ptr->r_adj[A_INT] = rmp_ptr->r_adj[A_INT] + 2; - rmp_ptr->r_adj[A_WIS] = rmp_ptr->r_adj[A_WIS] - 3; - rmp_ptr->r_adj[A_DEX] = rmp_ptr->r_adj[A_DEX] - 2; - rmp_ptr->r_adj[A_CON] = rmp_ptr->r_adj[A_CON] + 1; - rmp_ptr->r_adj[A_CHR] = rmp_ptr->r_adj[A_CHR] - 4; + + rmp_ptr->ps.mhp += +1; + rmp_ptr->ps.exp += +100; + + rmp_ptr->ps.adj[A_STR] += +3; + rmp_ptr->ps.adj[A_INT] += +2; + rmp_ptr->ps.adj[A_WIS] += -3; + rmp_ptr->ps.adj[A_DEX] += -2; + rmp_ptr->ps.adj[A_CON] += +1; + rmp_ptr->ps.adj[A_CHR] += -4; /* be reborn! */ do_rebirth(); diff --git a/src/init1.cc b/src/init1.cc index 3f803fbe..028e6b14 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -1022,7 +1022,6 @@ errr init_player_info_txt(FILE *fp) rp_ptr->title = my_strdup(s); /* Initialize */ - rp_ptr->powers[0] = rp_ptr->powers[1] = rp_ptr->powers[2] = rp_ptr->powers[3] = -1; powers = 0; lev = 1; @@ -1092,7 +1091,9 @@ errr init_player_info_txt(FILE *fp) rp_ptr->luck = s[6]; for (z = 0; z < 6; z++) - rp_ptr->r_adj[z] = s[z]; + { + rp_ptr->ps.adj[z] = s[z]; + } /* Next... */ continue; @@ -1114,7 +1115,7 @@ errr init_player_info_txt(FILE *fp) if (i == POWER_MAX) return (6); - rp_ptr->powers[powers++] = i; + rp_ptr->ps.powers.push_back(i); /* Next... */ continue; @@ -1153,8 +1154,8 @@ errr init_player_info_txt(FILE *fp) if (4 != sscanf(buf + 4, "%d:%d:%d:%d", &s[0], &s[1], &s[2], &s[3])) return (1); - rp_ptr->r_mhp = s[0]; - rp_ptr->r_exp = s[1]; + rp_ptr->ps.mhp = s[0]; + rp_ptr->ps.exp = s[1]; rp_ptr->infra = s[2]; rp_ptr->chart = s[3]; @@ -1244,7 +1245,6 @@ errr init_player_info_txt(FILE *fp) rmp_ptr->title = s; /* Initialize */ - rmp_ptr->powers[0] = rmp_ptr->powers[1] = rmp_ptr->powers[2] = rmp_ptr->powers[3] = -1; powers = 0; lev = 1; @@ -1323,7 +1323,9 @@ errr init_player_info_txt(FILE *fp) rmp_ptr->mana = s[7]; rmp_ptr->luck = s[6]; for (z = 0; z < 6; z++) - rmp_ptr->r_adj[z] = s[z]; + { + rmp_ptr->ps.adj[z] = s[z]; + } /* Next... */ continue; @@ -1345,7 +1347,7 @@ errr init_player_info_txt(FILE *fp) if (i == POWER_MAX) return (6); - rmp_ptr->powers[powers++] = i; + rmp_ptr->ps.powers.push_back(i); /* Next... */ continue; @@ -1384,8 +1386,8 @@ errr init_player_info_txt(FILE *fp) if (3 != sscanf(buf + 4, "%d:%d:%d", &s[0], &s[1], &s[2])) return (1); - rmp_ptr->r_mhp = s[0]; - rmp_ptr->r_exp = s[1]; + rmp_ptr->ps.mhp = s[0]; + rmp_ptr->ps.exp = s[1]; rmp_ptr->infra = s[2]; /* Next... */ @@ -1501,7 +1503,6 @@ errr init_player_info_txt(FILE *fp) c_ptr->title = my_strdup(s); /* Initialize */ - c_ptr->powers[0] = c_ptr->powers[1] = c_ptr->powers[2] = c_ptr->powers[3] = -1; powers = 0; lev = 1; tit_idx = 0; @@ -1605,7 +1606,9 @@ errr init_player_info_txt(FILE *fp) c_ptr->mana = s[6]; c_ptr->extra_blows = s[7]; for (z = 0; z < 6; z++) - c_ptr->c_adj[z] = s[z]; + { + c_ptr->ps.adj[z] = s[z]; + } /* Next... */ continue; @@ -1668,7 +1671,7 @@ errr init_player_info_txt(FILE *fp) if (i == POWER_MAX) return (6); - c_ptr->powers[powers++] = i; + c_ptr->ps.powers.push_back(i); /* Next... */ continue; @@ -1683,8 +1686,8 @@ errr init_player_info_txt(FILE *fp) if (2 != sscanf(buf + 4, "%d:%d", &s[0], &s[1])) return (1); - c_ptr->c_mhp = s[0]; - c_ptr->c_exp = s[1]; + c_ptr->ps.mhp = s[0]; + c_ptr->ps.exp = s[1]; /* Next... */ continue; diff --git a/src/loadsave.cc b/src/loadsave.cc index e6f4cefa..350fad65 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -424,19 +424,32 @@ static void do_subrace(ls_flag_t flag) do_bool(&sr_ptr->place, flag); for (i = 0; i < 6; i++) - do_s16b(&sr_ptr->r_adj[i], flag); + { + do_s16b(&sr_ptr->ps.adj[i], flag); + } do_byte((byte*)&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_byte((byte*)&sr_ptr->r_mhp, flag); - do_s16b(&sr_ptr->r_exp, flag); + do_byte((byte*)&sr_ptr->ps.mhp, flag); + do_s16b(&sr_ptr->ps.exp, flag); do_byte((byte*)&sr_ptr->infra, flag); - for (i = 0; i < 4; i++) { - do_s16b(&sr_ptr->powers[i], flag); + u16b n = sr_ptr->ps.powers.size(); + + do_u16b(&n, flag); + + for (std::size_t i = 0; i < n; i++) + { + if (flag == ls_flag_t::LOAD) + { + sr_ptr->ps.powers.push_back(0); + } + + do_s16b(&sr_ptr->ps.powers[i], flag); + } } for (i = 0; i < BODY_MAX; i++) diff --git a/src/player_class.hpp b/src/player_class.hpp index 9d9991e3..61d35b5b 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -7,6 +7,7 @@ #include "player_defs.hpp" #include "player_level_flag.hpp" #include "player_race_flag_set.hpp" +#include "player_shared.hpp" #include "player_spec.hpp" #include "skill_modifiers.hpp" @@ -19,12 +20,7 @@ struct player_class char *desc = nullptr; /* Small desc of the class */ const char *titles[PY_MAX_LEVEL / 5] { }; /* Titles */ - s16b c_adj[6] { }; /* Class stat modifier */ - - s16b c_mhp = 0; /* Class hit-dice adjustment */ - s16b c_exp = 0; /* Class experience factor */ - - s16b powers[4] { }; /* Powers of the class */ + player_shared ps; player_race_flag_set flags; diff --git a/src/player_race.hpp b/src/player_race.hpp index 36c9109e..560ba34f 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -8,12 +8,13 @@ #include "player_level_flag.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" -#include "skills_defs.hpp" +#include "player_shared.hpp" #include "skill_modifiers.hpp" #include #include + /** * Player racial descriptior. */ @@ -22,19 +23,14 @@ struct player_race const char *title = nullptr; /* Type of race */ char *desc = nullptr; - s16b r_adj[6] { }; /* Racial stat bonuses */ - char luck = '\0'; /* Luck */ - byte r_mhp = 0; /* Race hit-dice modifier */ - u16b r_exp = 0; /* Race experience factor */ + player_shared ps; byte infra = 0; /* Infra-vision range */ u32b choice[2] { }; /* Legal class choices */ - s16b powers[4] { }; /* Powers of the race */ - byte body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ s16b chart = 0; /* Chart history */ diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp index 60558d24..8eb984b7 100644 --- a/src/player_race_mod.hpp +++ b/src/player_race_mod.hpp @@ -8,6 +8,7 @@ #include "player_level_flag.hpp" #include "player_race_ability_type.hpp" #include "player_race_flag_set.hpp" +#include "player_shared.hpp" #include "skill_modifiers.hpp" #include "skills_defs.hpp" @@ -22,13 +23,10 @@ struct player_race_mod bool_ place = FALSE; /* TRUE = race race modifier, FALSE = Race modifier race */ - s16b r_adj[6] { }; /* (+) Racial stat bonuses */ - char luck = '\0'; /* Luck */ s16b mana = 0; /* Mana % */ - char r_mhp = 0; /* (+) Race mod hit-dice modifier */ - s16b r_exp = 0; /* (+) Race mod experience factor */ + player_shared ps; char infra = '\0'; /* (+) Infra-vision range */ @@ -37,8 +35,6 @@ struct player_race_mod u32b pclass[2] { }; /* Classes allowed */ u32b mclass[2] { }; /* Classes restricted */ - s16b powers[4] { }; /* Powers of the subrace */ - char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ player_race_flag_set flags; @@ -54,4 +50,3 @@ struct player_race_mod std::vector abilities; /* Abilities to be gained by level; ignores prereqs */ }; - diff --git a/src/player_shared.hpp b/src/player_shared.hpp new file mode 100644 index 00000000..1ae7b9a7 --- /dev/null +++ b/src/player_shared.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "h-basic.h" +#include "skills_defs.hpp" +#include +#include + +struct player_shared +{ + std::array adj { }; /* Stat modifiers */ + + s16b mhp = 0; /* Hit-dice adjustment */ + s16b exp = 0; /* Experience factor */ + + std::vector powers; /* Powers */ +}; diff --git a/src/xtra1.cc b/src/xtra1.cc index 280cc61a..fbbd7922 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1533,6 +1533,15 @@ static void calc_powers_corruption() /* Ugly hack */ bool_ calc_powers_silent = FALSE; +/* Add in powers */ +static void add_powers(std::vector const &powers) +{ + for (auto const &p: powers) + { + p_ptr->powers[p] = TRUE; + } +} + /* Calc the player powers */ static void calc_powers(void) { @@ -1563,32 +1572,23 @@ static void calc_powers(void) if (!o_ptr->k_idx) continue; p = object_power(o_ptr); - if (p != -1) p_ptr->powers[p] = TRUE; + if (p != -1) + { + p_ptr->powers[p] = TRUE; + } } if ((!p_ptr->tim_mimic) && (!p_ptr->body_monster)) { - /* Add in racial and subracial powers */ - for (i = 0; i < 4; i++) - { - p = rp_ptr->powers[i]; - if (p != -1) p_ptr->powers[p] = TRUE; - - p = rmp_ptr->powers[i]; - if (p != -1) p_ptr->powers[p] = TRUE; - } + add_powers(rp_ptr->ps.powers); + add_powers(rmp_ptr->ps.powers); } else if (p_ptr->mimic_form) { calc_mimic_power(); } - /* Add in class powers */ - for (i = 0; i < 4; i++) - { - p = cp_ptr->powers[i]; - if (p != -1) p_ptr->powers[p] = TRUE; - } + add_powers(cp_ptr->ps.powers); if (p_ptr->disembodied) { @@ -3056,7 +3056,7 @@ void calc_bonuses(bool_ silent) for (i = 0; i < 6; i++) { /* Modify the stats for "race" */ - p_ptr->stat_add[i] += (rp_ptr->r_adj[i] + rmp_ptr->r_adj[i] + cp_ptr->c_adj[i]); + p_ptr->stat_add[i] += (rp_ptr->ps.adj[i] + rmp_ptr->ps.adj[i] + cp_ptr->ps.adj[i]); } diff --git a/src/xtra2.cc b/src/xtra2.cc index ce4c7de0..fe214950 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5310,10 +5310,10 @@ void switch_subrace(int racem, bool_ copy_old) void do_rebirth() { /* Experience factor */ - p_ptr->expfact = rp_ptr->r_exp + rmp_ptr->r_exp + cp_ptr->c_exp; + p_ptr->expfact = rp_ptr->ps.exp + rmp_ptr->ps.exp + cp_ptr->ps.exp; /* Hitdice */ - p_ptr->hitdie = rp_ptr->r_mhp + rmp_ptr->r_mhp + cp_ptr->c_mhp; + p_ptr->hitdie = rp_ptr->ps.mhp + rmp_ptr->ps.mhp + cp_ptr->ps.mhp; /* Recalc HP */ do_cmd_rerate(); -- cgit v1.2.3 From fdeb84f9ae4927938d3c0a541129e17338f39e15 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Add do_char() in loadsave.cc to avoid casts --- src/loadsave.cc | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 350fad65..84061354 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -134,6 +134,11 @@ static void do_byte(byte *v, ls_flag_t flag) } } +static void do_char(char *c, ls_flag_t flag) +{ + do_byte((byte *) c, flag); +} + static void do_bool(bool_ *f, ls_flag_t flag) { byte b = *f; @@ -390,10 +395,10 @@ static void do_quick_start(ls_flag_t flag) static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) { - do_byte((byte*) &s->basem, flag); - do_u32b( &s->base, flag); - do_byte((byte*) &s->modm, flag); - do_s16b( &s->mod, flag); + do_char(&s->basem, flag); + do_u32b(&s->base, flag); + do_char(&s->modm, flag); + do_s16b(&s->mod, flag); } static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) @@ -428,13 +433,13 @@ static void do_subrace(ls_flag_t flag) do_s16b(&sr_ptr->ps.adj[i], flag); } - do_byte((byte*)&sr_ptr->luck, flag); + do_char(&sr_ptr->luck, flag); do_s16b(&sr_ptr->mana, flag); - do_byte((byte*)&sr_ptr->ps.mhp, flag); + do_s16b(&sr_ptr->ps.mhp, flag); do_s16b(&sr_ptr->ps.exp, flag); - do_byte((byte*)&sr_ptr->infra, flag); + do_char(&sr_ptr->infra, flag); { u16b n = sr_ptr->ps.powers.size(); @@ -454,7 +459,7 @@ static void do_subrace(ls_flag_t flag) for (i = 0; i < BODY_MAX; i++) { - do_byte((byte*)&sr_ptr->body_parts[i], flag); + do_char(&sr_ptr->body_parts[i], flag); } do_flag_set(&sr_ptr->flags, flag); @@ -465,7 +470,7 @@ static void do_subrace(ls_flag_t flag) } do_byte(&sr_ptr->g_attr, flag); - do_byte((byte*)&sr_ptr->g_char, flag); + do_char(&sr_ptr->g_char, flag); do_skill_modifiers(&sr_ptr->skill_modifiers, flag); } @@ -891,10 +896,10 @@ static bool_ do_extra(ls_flag_t flag) } /* The tactic */ - do_byte((byte*)&p_ptr->tactic, flag); + do_char(&p_ptr->tactic, flag); /* The movement */ - do_byte((byte*)&p_ptr->movement, flag); + do_char(&p_ptr->movement, flag); /* The comapnions killed */ do_s16b(&p_ptr->companion_killed, flag); -- cgit v1.2.3 From 639976ed95b8031cfde1f64e85b5efdeba417164 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Un-overload do_bool() in loadsave It turns out this causes issues with inference around templated functions, so it's best to avoid it for now. --- src/loadsave.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 84061354..f71a0e63 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -149,7 +149,7 @@ static void do_bool(bool_ *f, ls_flag_t flag) } } -static void do_bool(bool *x, ls_flag_t flag) +static void do_std_bool(bool *x, ls_flag_t flag) { switch (flag) { @@ -490,7 +490,7 @@ static void do_spells(int i, ls_flag_t flag) do_byte(&s_ptr->dam_sides, flag); do_byte(&s_ptr->dam_dice, flag); do_byte(&s_ptr->level, flag); - do_bool(&s_ptr->untried, flag); + do_std_bool(&s_ptr->untried, flag); } @@ -696,7 +696,7 @@ static bool_ do_extra(ls_flag_t flag) { do_byte(&random_quests[i].type, flag); do_s16b(&random_quests[i].r_idx, flag); - do_bool(&random_quests[i].done, flag); + do_std_bool(&random_quests[i].done, flag); } } @@ -751,10 +751,10 @@ static bool_ do_extra(ls_flag_t flag) } /* Help */ - do_bool(&p_ptr->help.enabled, flag); + do_std_bool(&p_ptr->help.enabled, flag); for (std::size_t i = 0; i < HELP_MAX; i++) { - do_bool(&p_ptr->help.activated[i], flag); + do_std_bool(&p_ptr->help.activated[i], flag); } /* More info */ -- cgit v1.2.3 From d9d9d8c5e96eadbefb2c8506a387fc282c2fe8b5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused "quest_idx" parameter from quest_type::init() --- src/birth.cc | 2 +- src/bldg.cc | 2 +- src/loadsave.cc | 2 +- src/q_betwen.cc | 2 +- src/q_betwen.hpp | 2 +- src/q_bounty.cc | 2 +- src/q_bounty.hpp | 2 +- src/q_dragons.cc | 2 +- src/q_dragons.hpp | 2 +- src/q_eol.cc | 4 ++-- src/q_eol.hpp | 2 +- src/q_evil.cc | 2 +- src/q_evil.hpp | 2 +- src/q_fireprof.cc | 2 +- src/q_fireprof.hpp | 2 +- src/q_god.cc | 2 +- src/q_god.hpp | 2 +- src/q_haunted.cc | 2 +- src/q_haunted.hpp | 2 +- src/q_hobbit.cc | 4 ++-- src/q_hobbit.hpp | 2 +- src/q_invas.cc | 4 ++-- src/q_invas.hpp | 2 +- src/q_library.cc | 2 +- src/q_library.hpp | 2 +- src/q_main.cc | 12 ++++++------ src/q_main.hpp | 6 +++--- src/q_narsil.cc | 2 +- src/q_narsil.hpp | 2 +- src/q_nazgul.cc | 2 +- src/q_nazgul.hpp | 2 +- src/q_nirna.cc | 2 +- src/q_nirna.hpp | 2 +- src/q_one.cc | 8 ++++---- src/q_one.hpp | 2 +- src/q_poison.cc | 2 +- src/q_poison.hpp | 2 +- src/q_rand.cc | 2 +- src/q_rand.hpp | 2 +- src/q_shroom.cc | 4 ++-- src/q_shroom.hpp | 2 +- src/q_spider.cc | 4 ++-- src/q_spider.hpp | 2 +- src/q_thief.cc | 4 ++-- src/q_thief.hpp | 2 +- src/q_thrain.cc | 4 ++-- src/q_thrain.hpp | 2 +- src/q_troll.cc | 4 ++-- src/q_troll.hpp | 2 +- src/q_ultrae.cc | 4 ++-- src/q_ultrae.hpp | 2 +- src/q_ultrag.cc | 4 ++-- src/q_ultrag.hpp | 2 +- src/q_wight.cc | 4 ++-- src/q_wight.hpp | 2 +- src/q_wolves.cc | 2 +- src/q_wolves.hpp | 2 +- src/quest.cc | 7 +++---- src/quest_type.hpp | 4 ++-- src/wizard2.cc | 2 +- 60 files changed, 84 insertions(+), 85 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index f358bd58..a49db966 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2256,7 +2256,7 @@ static bool_ player_birth_aux_ask() plots[PLOT_OTHER] = QUEST_NULL; } - quest_random_init_hook(QUEST_RANDOM); + quest_random_init_hook(); /* Ok */ return (TRUE); diff --git a/src/bldg.cc b/src/bldg.cc index a1c38c9e..ae64efaf 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -738,7 +738,7 @@ static bool_ castle_quest(int y, int x) get_questinfo(plots[plot]); /* Add the hooks */ - quest[plots[plot]].init(plots[plot]); + quest[plots[plot]].init(); return (TRUE); } diff --git a/src/loadsave.cc b/src/loadsave.cc index f71a0e63..c31aeccc 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2288,7 +2288,7 @@ static bool do_quests(ls_flag_t flag) // Initialize the quest if necessary if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) { - q->init(i); + q->init(); } } diff --git a/src/q_betwen.cc b/src/q_betwen.cc index 541be9f9..ac4b665e 100644 --- a/src/q_betwen.cc +++ b/src/q_betwen.cc @@ -198,7 +198,7 @@ static bool_ quest_between_forbid_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_between_init_hook(int q) +bool_ quest_between_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_betwen.hpp b/src/q_betwen.hpp index d2fc08f0..1171d138 100644 --- a/src/q_betwen.hpp +++ b/src/q_betwen.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_between_init_hook(int q_idx); +bool_ quest_between_init_hook(); diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 10331c4d..28cf71c5 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -78,7 +78,7 @@ static bool bounty_item_tester_hook(object_type const *o_ptr) return ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval2 == bounty_quest_monster)); } -bool_ quest_bounty_init_hook(int dummy) +bool_ quest_bounty_init_hook() { return FALSE; } diff --git a/src/q_bounty.hpp b/src/q_bounty.hpp index 450ca8bd..960a391b 100644 --- a/src/q_bounty.hpp +++ b/src/q_bounty.hpp @@ -4,7 +4,7 @@ #include -extern bool_ quest_bounty_init_hook(int q_idx); +extern bool_ quest_bounty_init_hook(); extern bool_ quest_bounty_drop_item(); extern bool_ quest_bounty_get_item(); extern std::string quest_bounty_describe(); diff --git a/src/q_dragons.cc b/src/q_dragons.cc index 8dc990d2..2c3faa69 100644 --- a/src/q_dragons.cc +++ b/src/q_dragons.cc @@ -152,7 +152,7 @@ static bool_ quest_dragons_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_dragons_init_hook(int q_idx) +bool_ quest_dragons_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_dragons.hpp b/src/q_dragons.hpp index f0aa50f2..af1bef20 100644 --- a/src/q_dragons.hpp +++ b/src/q_dragons.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_dragons_init_hook(int q_idx); +bool_ quest_dragons_init_hook(); diff --git a/src/q_eol.cc b/src/q_eol.cc index f27ce9df..1c141624 100644 --- a/src/q_eol.cc +++ b/src/q_eol.cc @@ -134,7 +134,7 @@ static bool_ quest_eol_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NIRNAETH; - quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot)); + quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_eol_finish_hook); process_hooks_restart = TRUE; @@ -212,7 +212,7 @@ static bool_ quest_eol_stair_hook(void *, void *in_, void *) return FALSE; } -bool_ quest_eol_init_hook(int q) +bool_ quest_eol_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_eol.hpp b/src/q_eol.hpp index ab7f1274..6043b3ba 100644 --- a/src/q_eol.hpp +++ b/src/q_eol.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_eol_init_hook(int q_idx); +bool_ quest_eol_init_hook(); diff --git a/src/q_evil.cc b/src/q_evil.cc index d27e8986..cadaa171 100644 --- a/src/q_evil.cc +++ b/src/q_evil.cc @@ -121,7 +121,7 @@ static bool_ quest_evil_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_evil_init_hook(int q_idx) +bool_ quest_evil_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_evil.hpp b/src/q_evil.hpp index 06fb17e1..5346afe4 100644 --- a/src/q_evil.hpp +++ b/src/q_evil.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_evil_init_hook(int q_idx); +bool_ quest_evil_init_hook(); diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 49fc0bdb..eb762fc4 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -559,7 +559,7 @@ static bool_ fireproof_gen_hook(void *, void *, void *) } } -bool_ quest_fireproof_init_hook(int q) +bool_ quest_fireproof_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && diff --git a/src/q_fireprof.hpp b/src/q_fireprof.hpp index 48175ce9..7c897954 100644 --- a/src/q_fireprof.hpp +++ b/src/q_fireprof.hpp @@ -5,5 +5,5 @@ #include extern void quest_fireproof_building(bool_ *paid, bool_ *recreate); -extern bool_ quest_fireproof_init_hook(int q); +extern bool_ quest_fireproof_init_hook(); extern std::string quest_fireproof_describe(); diff --git a/src/q_god.cc b/src/q_god.cc index 4aa06789..67371f46 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -1189,7 +1189,7 @@ static bool_ quest_god_birth_objects_hook(void *, void *, void *) return FALSE; } -bool_ quest_god_init_hook(int q) +bool_ quest_god_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && diff --git a/src/q_god.hpp b/src/q_god.hpp index d5a993fa..9feef832 100644 --- a/src/q_god.hpp +++ b/src/q_god.hpp @@ -5,4 +5,4 @@ #include std::string quest_god_describe(); -bool_ quest_god_init_hook(int q); +bool_ quest_god_init_hook(); diff --git a/src/q_haunted.cc b/src/q_haunted.cc index b72eb1ca..902778fc 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -150,7 +150,7 @@ static bool_ quest_haunted_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_haunted_init_hook(int q_idx) +bool_ quest_haunted_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_haunted.hpp b/src/q_haunted.hpp index 4f51bce3..9df36239 100644 --- a/src/q_haunted.hpp +++ b/src/q_haunted.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_haunted_init_hook(int q_idx); +bool_ quest_haunted_init_hook(); diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc index 5a71711e..c32510ec 100644 --- a/src/q_hobbit.cc +++ b/src/q_hobbit.cc @@ -151,7 +151,7 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *) msg_print("maze and never been seen again! Could you find him for me?"); cquest.status = QUEST_STATUS_TAKEN; - quest[QUEST_HOBBIT].init(QUEST_HOBBIT); + quest[QUEST_HOBBIT].init(); } else if (cquest.status == QUEST_STATUS_COMPLETED) { @@ -198,7 +198,7 @@ static bool_ quest_hobbit_dump_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_hobbit_init_hook(int q_idx) +bool_ quest_hobbit_init_hook() { /* Get a level to place the hobbit */ if (!cquest.data[0]) diff --git a/src/q_hobbit.hpp b/src/q_hobbit.hpp index b1878748..283ba0dd 100644 --- a/src/q_hobbit.hpp +++ b/src/q_hobbit.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_hobbit_init_hook(int q_idx); +bool_ quest_hobbit_init_hook(); diff --git a/src/q_invas.cc b/src/q_invas.cc index 64483d28..f1cf43da 100644 --- a/src/q_invas.cc +++ b/src/q_invas.cc @@ -120,7 +120,7 @@ static bool_ quest_invasion_turn_hook(void *, void *, void *) cquest.status = QUEST_STATUS_TAKEN; - quest_invasion_init_hook(QUEST_INVASION); + quest_invasion_init_hook(); del_hook_new(HOOK_END_TURN, quest_invasion_turn_hook); process_hooks_restart = TRUE; @@ -207,7 +207,7 @@ static bool_ quest_invasion_stair_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_invasion_init_hook(int q_idx) +bool_ quest_invasion_init_hook() { add_hook_new(HOOK_END_TURN, quest_invasion_turn_hook, "invasion_turn", NULL); add_hook_new(HOOK_CHAR_DUMP, quest_invasion_dump_hook, "invasion_dump", NULL); diff --git a/src/q_invas.hpp b/src/q_invas.hpp index 87b8fc77..9993ac2b 100644 --- a/src/q_invas.hpp +++ b/src/q_invas.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_invasion_init_hook(int q_idx); +bool_ quest_invasion_init_hook(); diff --git a/src/q_library.cc b/src/q_library.cc index 483faba9..e47eee4f 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -501,7 +501,7 @@ std::string quest_library_describe() return w.str(); } -bool_ quest_library_init_hook(int q) +bool_ quest_library_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && diff --git a/src/q_library.hpp b/src/q_library.hpp index 4c085472..467fac5e 100644 --- a/src/q_library.hpp +++ b/src/q_library.hpp @@ -4,7 +4,7 @@ #include -bool_ quest_library_init_hook(int q); +bool_ quest_library_init_hook(); std::string quest_library_describe(); void quest_library_building(bool_ *paid, bool_ *recreate); void initialize_bookable_spells(); diff --git a/src/q_main.cc b/src/q_main.cc index 4cbf63ef..81b6ac85 100644 --- a/src/q_main.cc +++ b/src/q_main.cc @@ -93,7 +93,7 @@ static bool_ quest_morgoth_hook(void *, void *, void *) *(quest[QUEST_MORGOTH].plot) = QUEST_ULTRA_GOOD; else *(quest[QUEST_MORGOTH].plot) = QUEST_ULTRA_EVIL; - quest[*(quest[QUEST_MORGOTH].plot)].init(*(quest[QUEST_MORGOTH].plot)); + quest[*(quest[QUEST_MORGOTH].plot)].init(); } return (FALSE); } @@ -113,7 +113,7 @@ static bool_ quest_morgoth_dump_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_morgoth_init_hook(int q_idx) +bool_ quest_morgoth_init_hook() { if ((quest[QUEST_MORGOTH].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED)) { @@ -140,7 +140,7 @@ static bool_ quest_sauron_hook(void *, void *, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_sauron_hook); add_hook_new(HOOK_MONSTER_DEATH, quest_morgoth_hook, "morgort_death", NULL); *(quest[QUEST_SAURON].plot) = QUEST_MORGOTH; - quest_morgoth_init_hook(QUEST_MORGOTH); + quest_morgoth_init_hook(); process_hooks_restart = TRUE; } @@ -167,7 +167,7 @@ static bool_ quest_sauron_resurect_hook(void *, void *in_, void *) return FALSE; } -bool_ quest_sauron_init_hook(int q_idx) +bool_ quest_sauron_init_hook() { if ((quest[QUEST_SAURON].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_SAURON].status < QUEST_STATUS_FINISHED)) { @@ -192,7 +192,7 @@ static bool_ quest_necro_hook(void *, void *, void *) quest[QUEST_NECRO].status = QUEST_STATUS_FINISHED; *(quest[QUEST_NECRO].plot) = QUEST_ONE; - quest[*(quest[QUEST_NECRO].plot)].init(*(quest[QUEST_NECRO].plot)); + quest[*(quest[QUEST_NECRO].plot)].init(); del_hook_new(HOOK_MONSTER_DEATH, quest_necro_hook); process_hooks_restart = TRUE; @@ -200,7 +200,7 @@ static bool_ quest_necro_hook(void *, void *, void *) return (FALSE); } -bool_ quest_necro_init_hook(int q_idx) +bool_ quest_necro_init_hook() { if ((quest[QUEST_NECRO].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_main.hpp b/src/q_main.hpp index a88530fc..f677586e 100644 --- a/src/q_main.hpp +++ b/src/q_main.hpp @@ -2,6 +2,6 @@ #include "h-basic.h" -bool_ quest_necro_init_hook(int q_idx); -bool_ quest_sauron_init_hook(int q_idx); -bool_ quest_morgoth_init_hook(int q_idx); +bool_ quest_necro_init_hook(); +bool_ quest_sauron_init_hook(); +bool_ quest_morgoth_init_hook(); diff --git a/src/q_narsil.cc b/src/q_narsil.cc index a6c0eed3..4f358451 100644 --- a/src/q_narsil.cc +++ b/src/q_narsil.cc @@ -107,7 +107,7 @@ static bool_ quest_narsil_identify_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_narsil_init_hook(int q_idx) +bool_ quest_narsil_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_narsil.hpp b/src/q_narsil.hpp index b83e63cf..7dd6cd15 100644 --- a/src/q_narsil.hpp +++ b/src/q_narsil.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_narsil_init_hook(int q_idx); +bool_ quest_narsil_init_hook(); diff --git a/src/q_nazgul.cc b/src/q_nazgul.cc index 15a6a843..119c39d9 100644 --- a/src/q_nazgul.cc +++ b/src/q_nazgul.cc @@ -131,7 +131,7 @@ static bool_ quest_nazgul_death_hook(void *, void *in_, void *) return (FALSE); } -bool_ quest_nazgul_init_hook(int q_idx) +bool_ quest_nazgul_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_nazgul.hpp b/src/q_nazgul.hpp index 32e3237c..7efcd5a6 100644 --- a/src/q_nazgul.hpp +++ b/src/q_nazgul.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_nazgul_init_hook(int q_idx); +bool_ quest_nazgul_init_hook(); diff --git a/src/q_nirna.cc b/src/q_nirna.cc index a92ba6e4..7609bd06 100644 --- a/src/q_nirna.cc +++ b/src/q_nirna.cc @@ -112,7 +112,7 @@ static bool_ quest_nirnaeth_stair_hook(void *, void *, void *) return (FALSE); } -bool_ quest_nirnaeth_init_hook(int q_idx) +bool_ quest_nirnaeth_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_nirna.hpp b/src/q_nirna.hpp index 24a8759f..0076dcd2 100644 --- a/src/q_nirna.hpp +++ b/src/q_nirna.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_nirnaeth_init_hook(int q_idx); +bool_ quest_nirnaeth_init_hook(); diff --git a/src/q_one.cc b/src/q_one.cc index 3741e009..0c2753a0 100644 --- a/src/q_one.cc +++ b/src/q_one.cc @@ -82,7 +82,7 @@ static bool_ quest_one_move_hook(void *, void *in_, void *) /* Continue the plot */ cquest.status = QUEST_STATUS_TAKEN; - cquest.init(QUEST_ONE); + cquest.init(); return TRUE; } @@ -114,7 +114,7 @@ static bool_ quest_one_drop_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_FINISHED; *(quest[QUEST_ONE].plot) = QUEST_SAURON; quest[*(quest[QUEST_ONE].plot)].status = QUEST_STATUS_TAKEN; - quest[*(quest[QUEST_ONE].plot)].init(*(quest[QUEST_ONE].plot)); + quest[*(quest[QUEST_ONE].plot)].init(); return TRUE; } @@ -166,7 +166,7 @@ static bool_ quest_one_wield_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_FAILED_DONE; *(quest[QUEST_ONE].plot) = QUEST_SAURON; quest[*(quest[QUEST_ONE].plot)].status = QUEST_STATUS_TAKEN; - quest[*(quest[QUEST_ONE].plot)].init(*(quest[QUEST_ONE].plot)); + quest[*(quest[QUEST_ONE].plot)].init(); /* Ok lets reset the lives counter */ p_ptr->lives = 0; @@ -357,7 +357,7 @@ static bool_ quest_one_gen_hook(void *, void *, void *) return (FALSE); } -bool_ quest_one_init_hook(int q_idx) +bool_ quest_one_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_one.hpp b/src/q_one.hpp index a85a5733..0ad4e851 100644 --- a/src/q_one.hpp +++ b/src/q_one.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_one_init_hook(int q_idx); +bool_ quest_one_init_hook(); diff --git a/src/q_poison.cc b/src/q_poison.cc index b1205dca..45e7ede8 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -240,7 +240,7 @@ static bool_ quest_poison_drop_hook(void *, void *in_, void *) return FALSE; } -bool_ quest_poison_init_hook(int q_idx) +bool_ quest_poison_init_hook() { /* Get a place to place the poison */ if (!cquest.data[1]) diff --git a/src/q_poison.hpp b/src/q_poison.hpp index f8d97ace..0c054e0c 100644 --- a/src/q_poison.hpp +++ b/src/q_poison.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_poison_init_hook(int q_idx); +bool_ quest_poison_init_hook(); diff --git a/src/q_rand.cc b/src/q_rand.cc index e48fec98..1fed570e 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -646,7 +646,7 @@ std::string quest_random_describe() return w.str(); } -bool_ quest_random_init_hook(int q_idx) +bool_ quest_random_init_hook() { add_hook_new(HOOK_MONSTER_DEATH, quest_random_death_hook, "rand_death", NULL); add_hook_new(HOOK_NEW_LEVEL, quest_random_turn_hook, "rand_new_lvl", NULL); diff --git a/src/q_rand.hpp b/src/q_rand.hpp index 0aa9ccc8..02961c8c 100644 --- a/src/q_rand.hpp +++ b/src/q_rand.hpp @@ -6,5 +6,5 @@ void initialize_random_quests(int n); bool_ is_randhero(int level); -bool_ quest_random_init_hook(int q_idx); +bool_ quest_random_init_hook(); std::string quest_random_describe(); diff --git a/src/q_shroom.cc b/src/q_shroom.cc index 89b576d8..4fd1e066 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -270,7 +270,7 @@ static bool_ quest_shroom_chat_hook(void *, void *in_, void *) msg_print("to the west of Bree? Please try to not harm my dogs. They are so lovely..."); cquest.status = QUEST_STATUS_TAKEN; - quest[QUEST_SHROOM].init(QUEST_SHROOM); + quest[QUEST_SHROOM].init(); } else { @@ -280,7 +280,7 @@ static bool_ quest_shroom_chat_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_shroom_init_hook(int q_idx) +bool_ quest_shroom_init_hook() { /* Get a number of 'shrooms */ if (!cquest.data[1]) diff --git a/src/q_shroom.hpp b/src/q_shroom.hpp index 6124775b..f729e29e 100644 --- a/src/q_shroom.hpp +++ b/src/q_shroom.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_shroom_init_hook(int q_idx); +bool_ quest_shroom_init_hook(); diff --git a/src/q_spider.cc b/src/q_spider.cc index 07531b96..9fcf37c3 100644 --- a/src/q_spider.cc +++ b/src/q_spider.cc @@ -107,7 +107,7 @@ static bool_ quest_spider_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_POISON; - quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot)); + quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_spider_finish_hook); process_hooks_restart = TRUE; @@ -115,7 +115,7 @@ static bool_ quest_spider_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_spider_init_hook(int q_idx) +bool_ quest_spider_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_spider.hpp b/src/q_spider.hpp index e17cb523..d76cccf1 100644 --- a/src/q_spider.hpp +++ b/src/q_spider.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_spider_init_hook(int q_idx); +bool_ quest_spider_init_hook(); diff --git a/src/q_thief.cc b/src/q_thief.cc index 35ecdfbb..a1ec76c6 100644 --- a/src/q_thief.cc +++ b/src/q_thief.cc @@ -160,7 +160,7 @@ static bool_ quest_thieves_finish_hook(void *, void *in_, void *) else *(quest[q_idx].plot) = QUEST_WIGHT; } - quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot)); + quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_thieves_finish_hook); process_hooks_restart = TRUE; @@ -181,7 +181,7 @@ static bool_ quest_thieves_feeling_hook(void *, void *, void *) return TRUE; } -bool_ quest_thieves_init_hook(int q_idx) +bool_ quest_thieves_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_thief.hpp b/src/q_thief.hpp index 48e5dc8d..1ff74fac 100644 --- a/src/q_thief.hpp +++ b/src/q_thief.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_thieves_init_hook(int q_idx); +bool_ quest_thieves_init_hook(); diff --git a/src/q_thrain.cc b/src/q_thrain.cc index 05def27a..0f490bf0 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -194,7 +194,7 @@ static bool_ quest_thrain_feeling_hook(void *, void *, void *) cmsg_format(TERM_YELLOW, "You hear someone shouting under the torture."); cquest.status = QUEST_STATUS_TAKEN; - cquest.init(QUEST_THRAIN); + cquest.init(); return (FALSE); } @@ -235,7 +235,7 @@ static bool_ quest_thrain_turn_hook(void *, void *, void *) return (FALSE); } -bool_ quest_thrain_init_hook(int q) +bool_ quest_thrain_init_hook() { if (!cquest.data[0]) { diff --git a/src/q_thrain.hpp b/src/q_thrain.hpp index 830da016..ab69102f 100644 --- a/src/q_thrain.hpp +++ b/src/q_thrain.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -extern bool_ quest_thrain_init_hook(int q_idx); +extern bool_ quest_thrain_init_hook(); diff --git a/src/q_troll.cc b/src/q_troll.cc index fce3ad49..626897f0 100644 --- a/src/q_troll.cc +++ b/src/q_troll.cc @@ -125,7 +125,7 @@ static bool_ quest_troll_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NAZGUL; - quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot)); + quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_troll_finish_hook); process_hooks_restart = TRUE; @@ -182,7 +182,7 @@ static bool_ quest_troll_death_hook(void *, void *in_, void *) return FALSE; } -bool_ quest_troll_init_hook(int q_idx) +bool_ quest_troll_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_troll.hpp b/src/q_troll.hpp index 140fe0b2..4564ace2 100644 --- a/src/q_troll.hpp +++ b/src/q_troll.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_troll_init_hook(int q_idx); +bool_ quest_troll_init_hook(); diff --git a/src/q_ultrae.cc b/src/q_ultrae.cc index d42b9c6f..de0d5f16 100644 --- a/src/q_ultrae.cc +++ b/src/q_ultrae.cc @@ -2,7 +2,7 @@ #define cquest (quest[QUEST_ULTRA_EVIL]) -bool_ quest_ultra_evil_init_hook(int q) +bool_ quest_ultra_evil_init_hook() { - return (FALSE); + return FALSE; } diff --git a/src/q_ultrae.hpp b/src/q_ultrae.hpp index 5b08127b..42584387 100644 --- a/src/q_ultrae.hpp +++ b/src/q_ultrae.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_ultra_evil_init_hook(int q_idx); +bool_ quest_ultra_evil_init_hook(); diff --git a/src/q_ultrag.cc b/src/q_ultrag.cc index a5b56f3f..9e250146 100644 --- a/src/q_ultrag.cc +++ b/src/q_ultrag.cc @@ -80,7 +80,7 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) /* Continue the plot */ cquest.status = QUEST_STATUS_TAKEN; - cquest.init(QUEST_ULTRA_GOOD); + cquest.init(); } options->quick_messages = old_quick_messages; @@ -275,7 +275,7 @@ static bool_ quest_ultra_good_dump_hook(void *, void *in_, void *) } -bool_ quest_ultra_good_init_hook(int q) +bool_ quest_ultra_good_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_ultrag.hpp b/src/q_ultrag.hpp index 0064b878..32c4a1ae 100644 --- a/src/q_ultrag.hpp +++ b/src/q_ultrag.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_ultra_good_init_hook(int q_idx); +bool_ quest_ultra_good_init_hook(); diff --git a/src/q_wight.cc b/src/q_wight.cc index 7d459dee..9583365b 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -167,7 +167,7 @@ static bool_ quest_wight_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NAZGUL; - quest[*(quest[q_idx].plot)].init(*(quest[q_idx].plot)); + quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_wight_finish_hook); process_hooks_restart = TRUE; @@ -175,7 +175,7 @@ static bool_ quest_wight_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_wight_init_hook(int q_idx) +bool_ quest_wight_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_wight.hpp b/src/q_wight.hpp index 1252e4fa..d3c0a912 100644 --- a/src/q_wight.hpp +++ b/src/q_wight.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_wight_init_hook(int q_idx); +bool_ quest_wight_init_hook(); diff --git a/src/q_wolves.cc b/src/q_wolves.cc index 46a66935..3d83f414 100644 --- a/src/q_wolves.cc +++ b/src/q_wolves.cc @@ -134,7 +134,7 @@ static bool_ quest_wolves_finish_hook(void *, void *in_, void *) return TRUE; } -bool_ quest_wolves_init_hook(int q_idx) +bool_ quest_wolves_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { diff --git a/src/q_wolves.hpp b/src/q_wolves.hpp index 59a83c56..27d9b0f3 100644 --- a/src/q_wolves.hpp +++ b/src/q_wolves.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_wolves_init_hook(int q_idx); +bool_ quest_wolves_init_hook(); diff --git a/src/quest.cc b/src/quest.cc index a1aee67f..181b46d2 100644 --- a/src/quest.cc +++ b/src/quest.cc @@ -6,12 +6,11 @@ void init_hooks_quests() { - for (std::size_t i = 0; i < MAX_Q_IDX; i++) + for (auto const &q: quest) { - if (quest[i].init != NULL) + if (q.init) { - quest[i].init(i); + q.init(); } } } - diff --git a/src/quest_type.hpp b/src/quest_type.hpp index 19d9cc87..267ba4d2 100644 --- a/src/quest_type.hpp +++ b/src/quest_type.hpp @@ -21,9 +21,9 @@ struct quest_type s16b *plot; /* Which plot does it belongs to? */ - bool_ (*init)(int q); /* Function that takes care of generating hardcoded quests */ + bool_ (*init)(); /* Function that takes care of generating hardcoded quests */ - s32b data[9]; /* Various datas used by the quests */ + s32b data[9]; /* Various datas used by the quests */ std::string (*gen_desc)(); /* Function for generating description. */ }; diff --git a/src/wizard2.cc b/src/wizard2.cc index a4f697bd..295bf5ca 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -1680,7 +1680,7 @@ void do_cmd_debug() { quest[command_arg].status = QUEST_STATUS_TAKEN; *(quest[command_arg].plot) = command_arg; - quest[command_arg].init(command_arg); + quest[command_arg].init(); break; } break; -- cgit v1.2.3 From 4f1abfbf1a70f4dcc4e360a68b71b27e867d561d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Split "inscription known" game state from inscription definitions --- src/birth.cc | 4 ++-- src/cmd1.cc | 5 +++-- src/cmd6.cc | 3 ++- src/inscription_info_type.hpp | 1 - src/loadsave.cc | 2 +- src/player_type.hpp | 4 ++++ src/tables.cc | 10 +--------- 7 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index a49db966..086f932f 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -868,9 +868,9 @@ static void player_wipe(void) } /* Wipe the known inscription list */ - for (i = 0; i < MAX_INSCRIPTIONS; i++) + for (auto &inscription_known: p_ptr->inscriptions) { - inscription_info[i].know = FALSE; + inscription_known = false; } /* Wipe the known traps list */ diff --git a/src/cmd1.cc b/src/cmd1.cc index f8e064c2..642c9df8 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -4746,13 +4746,14 @@ void do_cmd_engrave() { if (!strcmp(inscription_info[i].text, buf)) { - if (inscription_info[i].know) + if (p_ptr->inscriptions[i]) { - /* Save the inscription */ cave[p_ptr->py][p_ptr->px].inscription = i; } else + { msg_print("You can't use this inscription for now."); + } } } diff --git a/src/cmd6.cc b/src/cmd6.cc index 1663b5c1..9c71584b 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -3582,9 +3582,10 @@ void do_cmd_read_scroll(void) /* Load screen */ screen_load(); + /* Inscriptions become known upon reading */ if (o_ptr->sval >= 100) { - inscription_info[o_ptr->sval - 100].know = TRUE; + p_ptr->inscriptions[o_ptr->sval - 100] = TRUE; } used_up = FALSE; diff --git a/src/inscription_info_type.hpp b/src/inscription_info_type.hpp index 6dbb67f1..4e1e4c32 100644 --- a/src/inscription_info_type.hpp +++ b/src/inscription_info_type.hpp @@ -9,6 +9,5 @@ struct inscription_info_type { char text[40]; /* The inscription itself */ byte when; /* When it is executed */ - bool_ know; /* Is the inscription know ? */ byte mana; /* Grid mana needed */ }; diff --git a/src/loadsave.cc b/src/loadsave.cc index c31aeccc..5fb4bada 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2450,7 +2450,7 @@ static bool do_floor_inscriptions(ls_flag_t flag) for (std::size_t i = 0; i < n_inscriptions; i++) { - do_bool(&inscription_info[i].know, flag); + do_std_bool(&p_ptr->inscriptions[i], flag); } return true; diff --git a/src/player_type.hpp b/src/player_type.hpp index 8f3c06dc..20fa81a4 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -1,6 +1,7 @@ #pragma once #include "corrupt.hpp" +#include "defines.h" #include "h-basic.h" #include "help_info.hpp" #include "inventory.hpp" @@ -381,6 +382,9 @@ struct player_type /* Acquired abilities; indexes into ab_info[] */ std::vector abilities; + /* Known inscriptions; true if known, false otherwise. */ + std::array inscriptions; + /* Skills */ s16b skill_points = 0; s16b skill_last_level = 0; /* Prevents gaining skills by losing level and regaining them */ diff --git a/src/tables.cc b/src/tables.cc index de8215da..7f7a7b8e 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2353,52 +2353,44 @@ move_info_type move_info[9] = */ inscription_info_type inscription_info[MAX_INSCRIPTIONS] = { - { /* Nothing */ + { /* Padding; 0 index is used to signify "no inscription" */ "", 0, - TRUE, 0, }, { /* Light up the room(Adunaic) */ "ure nimir", /* sun shine */ INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK, - FALSE, 30, }, { /* Darkness in room(Adunaic) */ "lomi gimli", /* night stars */ INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK, - FALSE, 10, }, { /* Storm(Adunaic) */ "dulgi bawiba", /* black winds */ INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK, - FALSE, 40, }, { /* Protection(Sindarin) */ "pedo mellon a minno", /* say friend and enter */ INSCRIP_EXEC_MONST_WALK, - FALSE, 8, }, { /* Dwarves summoning(Khuzdul) */ "Baruk Khazad! Khazad aimenu!", /* Axes of the Dwarves, the Dwarves are upon you! */ INSCRIP_EXEC_ENGRAVE, - FALSE, 100, }, { /* Open Chasm(Nandorin) */ "dunna hrassa", /* black precipice */ INSCRIP_EXEC_MONST_WALK, - FALSE, 50, }, { /* Blast of Black Fire(Orcish) */ "burz ghash ronk", /* black fire pool */ INSCRIP_EXEC_ENGRAVE | INSCRIP_EXEC_WALK | INSCRIP_EXEC_MONST_WALK, - FALSE, 60, }, }; -- cgit v1.2.3 From 549bfa1189a69c979c8d521caa8ea2460d801715 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove unused fields in skill_type --- src/skill_type.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/skill_type.hpp b/src/skill_type.hpp index 95ce3516..644ba716 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -16,9 +16,6 @@ struct skill_type s16b action_mkey = 0; /* Action do to */ - s32b i_value = 0; /* Current value */ - s32b i_mod = 0; /* Modifier, i.e. how much value 1 skill point gives */ - s32b value = 0; /* Current value */ s32b mod = 0; /* Modifier, i.e. how much value 1 skill point gives */ -- cgit v1.2.3 From 86fba667d4aaf01b0efc47e26b8e482f13349038 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Fix lost sword quest skill prompt --- src/skills.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skills.cc b/src/skills.cc index fc5b068c..155672f6 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1347,7 +1347,7 @@ void do_get_new_skill() { char last = 'a' + (LOST_SWORD_NSKILLS-1); char buf[80]; - sprintf(buf, "Choose a skill to learn(a-%c to choose, ESC to cancel)?", last); + sprintf(buf, "Choose a skill to learn (a-%c to choose, ESC to cancel)?", last); res = ask_menu(buf, items); /* Ok ? lets learn ! */ -- cgit v1.2.3 From 1e045ed09258e6c7fff63ef829759c6c8f06f441 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Separate skill values from skill descriptions --- src/birth.cc | 11 ++++-- src/init1.cc | 27 +++++--------- src/init2.cc | 1 + src/skill_descriptor.hpp | 30 ++++++++++++++++ src/skill_descriptor_fwd.hpp | 3 ++ src/skill_type.hpp | 42 +++++++++++----------- src/skills.cc | 83 ++++++++++++++++++++++---------------------- src/squelch/condition.cc | 4 +-- src/variable.cc | 5 +++ src/variable.hpp | 2 ++ src/xtra1.cc | 4 ++- 11 files changed, 127 insertions(+), 85 deletions(-) create mode 100644 src/skill_descriptor.hpp create mode 100644 src/skill_descriptor_fwd.hpp diff --git a/src/birth.cc b/src/birth.cc index 086f932f..2ed3fc79 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2782,7 +2782,10 @@ static bool_ player_birth_aux() if (!player_birth_aux_ask()) return (FALSE); for (i = 1; i < max_s_idx; i++) + { s_info[i].dev = FALSE; + } + for (i = 1; i < max_s_idx; i++) { s32b value = 0, mod = 0; @@ -2794,14 +2797,18 @@ static bool_ player_birth_aux() /* Develop only revelant branches */ if (s_info[i].value || s_info[i].mod) { - int z = s_info[i].father; + int z = s_descriptors[i].father; while (z != -1) { + // Mark as developed s_info[z].dev = TRUE; - z = s_info[z].father; + // Next node up the tree + z = s_descriptors[z].father; if (z == 0) + { break; + } } } } diff --git a/src/init1.cc b/src/init1.cc index 028e6b14..5395ed70 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3085,12 +3085,12 @@ errr init_set_info_txt(FILE *fp) */ errr init_s_info_txt(FILE *fp) { - int i, z, order = 1; + int i, order = 1; char buf[1024]; char *s; /* Current entry */ - skill_type *s_ptr = NULL; + skill_descriptor *s_ptr = NULL; /* Just before the first record */ @@ -3131,8 +3131,8 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if (s2 == -1) return (1); - s_info[s2].father = s1; - s_info[s2].order = order++; + s_descriptors[s2].father = s1; + s_descriptors[s2].order = order++; /* Next... */ continue; @@ -3157,8 +3157,8 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if ((s1 == -1) || (s2 == -1)) return (1); - s_info[s1].action[s2] = SKILL_EXCLUSIVE; - s_info[s2].action[s1] = SKILL_EXCLUSIVE; + s_descriptors[s1].action[s2] = SKILL_EXCLUSIVE; + s_descriptors[s2].action[s1] = SKILL_EXCLUSIVE; /* Next... */ continue; @@ -3191,7 +3191,7 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if ((s1 == -1) || (s2 == -1)) return (1); - s_info[s1].action[s2] = -atoi(cval); + s_descriptors[s1].action[s2] = -atoi(cval); /* Next... */ continue; @@ -3223,7 +3223,7 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if ((s1 == -1) || (s2 == -1)) return (1); - s_info[s1].action[s2] = atoi(cval); + s_descriptors[s1].action[s2] = atoi(cval); /* Next... */ continue; @@ -3254,21 +3254,12 @@ errr init_s_info_txt(FILE *fp) error_idx = i; /* Point at the "info" */ - s_ptr = &s_info[i]; + s_ptr = &s_descriptors[i]; /* Copy name */ assert(!s_ptr->name); s_ptr->name = my_strdup(s); - /* Init */ - s_ptr->action_mkey = 0; - s_ptr->dev = FALSE; - s_ptr->random_gain_chance = 100; - for (z = 0; z < max_s_idx; z++) - { - s_ptr->action[z] = 0; - } - /* Next... */ continue; } diff --git a/src/init2.cc b/src/init2.cc index 0fb1a5a8..ad96df86 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -344,6 +344,7 @@ namespace { static void allocate() { s_info = new skill_type[max_s_idx]; + s_descriptors = new skill_descriptor[max_s_idx]; } static errr parse(FILE *fp) diff --git a/src/skill_descriptor.hpp b/src/skill_descriptor.hpp new file mode 100644 index 00000000..687597da --- /dev/null +++ b/src/skill_descriptor.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "skill_descriptor_fwd.hpp" + +#include "h-basic.h" +#include "skill_flag_set.hpp" +#include "skills_defs.hpp" + +/** + * Skill descriptor. + */ +struct skill_descriptor { + + const char *name = nullptr; /* Name */ + char *desc = nullptr; /* Description */ + + const char *action_desc = nullptr; /* Action Description */ + + s16b action_mkey = 0; /* Action do to */ + + s16b action[MAX_SKILLS] = { 0 }; /* List of actions against other skills */ + + s16b father = 0; /* Father in the skill tree */ + s16b order = 0; /* Order in the tree */ + + byte random_gain_chance = 100; /* Chance to gain from Lost Sword quest; if applicable */ + + skill_flag_set flags; /* Skill flags */ + +}; diff --git a/src/skill_descriptor_fwd.hpp b/src/skill_descriptor_fwd.hpp new file mode 100644 index 00000000..136f337b --- /dev/null +++ b/src/skill_descriptor_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct skill_descriptor; diff --git a/src/skill_type.hpp b/src/skill_type.hpp index 644ba716..e93303e6 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -3,30 +3,30 @@ #include "h-basic.h" #include "skill_flag_set.hpp" #include "skills_defs.hpp" +#include "skill_descriptor.hpp" /** - * Skill descriptors and runtime data. + * Skill runtime data. */ struct skill_type { - const char *name = nullptr; /* Name */ - char *desc = nullptr; /* Description */ - - const char *action_desc = nullptr; /* Action Description */ - - s16b action_mkey = 0; /* Action do to */ - - s32b value = 0; /* Current value */ - s32b mod = 0; /* Modifier, i.e. how much value 1 skill point gives */ - - s16b action[MAX_SKILLS] = { 0 }; /* List of actions against other skills */ - - s16b father = 0; /* Father in the skill tree */ - bool_ dev = FALSE; /* Is the branch developped ? */ - s16b order = 0; /* Order in the tree */ - bool_ hidden = FALSE; /* Inactive */ - - byte random_gain_chance = 0; /* Chance to gain from Lost Sword quest; if applicable */ - - skill_flag_set flags; /* Skill flags */ + /** + * Current value. + */ + s32b value = 0; + + /** + * Current modifier, i.e. how much value 1 skill point gives. + */ + s32b mod = 0; + + /** + * Is the branch developed? + */ + bool_ dev = FALSE; + + /** + * Is the skill hidden? + */ + bool_ hidden = FALSE; }; diff --git a/src/skills.cc b/src/skills.cc index 155672f6..a46bf7ed 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -122,20 +122,19 @@ static void decrease_skill(int i, s16b *invest) */ s16b find_skill(cptr name) { - u16b i; - /* Scan skill list */ - for (i = 1; i < max_s_idx; i++) + for (int i = 1; i < max_s_idx; i++) { - if (s_info[i].name && streq(s_info[i].name, name)) + if (s_descriptors[i].name && streq(s_descriptors[i].name, name)) { return (i); } } /* No match found */ - return ( -1); + return -1; } + s16b find_skill_i(cptr name) { u16b i; @@ -144,7 +143,7 @@ s16b find_skill_i(cptr name) for (i = 1; i < max_s_idx; i++) { /* The name matches */ - if (s_info[i].name && iequals(s_info[i].name, name)) + if (s_descriptors[i].name && iequals(s_descriptors[i].name, name)) { return (i); } @@ -191,7 +190,7 @@ static int get_idx(int i) { for (int j = 1; j < max_s_idx; j++) { - if (s_info[j].order == i) + if (s_descriptors[j].order == i) return (j); } return (0); @@ -207,7 +206,7 @@ static bool_ is_known(int s_idx) for (i = 0; i < max_s_idx; i++) { /* It is our child, if we don't know it we continue to search, if we know it it is enough*/ - if (s_info[i].father == s_idx) + if (s_descriptors[i].father == s_idx) { if (is_known(i)) return TRUE; @@ -223,7 +222,7 @@ static void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int l for (int j = 1; j < max_s_idx; j++) { int i = get_idx(j); - if (s_info[i].father != father) continue; + if (s_descriptors[i].father != father) continue; if (s_info[i].hidden) continue; if (!is_known(i)) continue; @@ -240,16 +239,17 @@ static void init_table(int table[MAX_SKILLS][2], int *max, bool_ full) init_table_aux(table, max, -1, 0, full); } -static bool_ has_child(int sel) +static bool has_child(int sel) { - int i; - - for (i = 1; i < max_s_idx; i++) + for (int i = 1; i < max_s_idx; i++) { - if ((s_info[i].father == sel) && (is_known(i))) - return (TRUE); + if ((s_descriptors[i].father == sel) && is_known(i)) + { + return true; + } } - return (FALSE); + + return false; } @@ -283,11 +283,11 @@ void dump_skills(FILE *fff) if (!has_child(i)) { - strcat(buf, format(" . %s", s_info[i].name)); + strcat(buf, format(" . %s", s_descriptors[i].name)); } else { - strcat(buf, format(" - %s", s_info[i].name)); + strcat(buf, format(" - %s", s_descriptors[i].name)); } fprintf(fff, "%-49s%s%06.3f [%05.3f]", @@ -317,7 +317,7 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start) display_message(0, 1, strlen(keys), TERM_WHITE, keys); c_prt((p_ptr->skill_points) ? TERM_L_BLUE : TERM_L_RED, format("Skill points left: %d", p_ptr->skill_points), 2, 0); - print_desc_aux(s_info[table[sel][0]].desc, 3, 0); + print_desc_aux(s_descriptors[table[sel][0]].desc, 3, 0); for (j = start; j < start + (hgt - 7); j++) { @@ -343,17 +343,17 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start) } if (!has_child(i)) { - c_prt(color, format("%c.%c%s", deb, end, s_info[i].name), + c_prt(color, format("%c.%c%s", deb, end, s_descriptors[i].name), j + 7 - start, table[j][1] * 4); } else if (s_info[i].dev) { - c_prt(color, format("%c-%c%s", deb, end, s_info[i].name), + c_prt(color, format("%c-%c%s", deb, end, s_descriptors[i].name), j + 7 - start, table[j][1] * 4); } else { - c_prt(color, format("%c+%c%s", deb, end, s_info[i].name), + c_prt(color, format("%c+%c%s", deb, end, s_descriptors[i].name), j + 7 - start, table[j][1] * 4); } c_prt(color, @@ -444,7 +444,7 @@ static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s if (j == i) continue; /* Exclusive skills */ - if ((s_info[i].action[j] == SKILL_EXCLUSIVE) && invest[i]) + if ((s_descriptors[i].action[j] == SKILL_EXCLUSIVE) && invest[i]) { /* Turn it off */ p_ptr->skill_points += invest[j]; @@ -453,10 +453,10 @@ static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s } /* Non-exclusive skills */ - else if (s_info[i].action[j]) + else if (s_descriptors[i].action[j]) { /* Increase / decrease with a % */ - s32b val = s_info[j].value + (invest[i] * s_info[j].mod * s_info[i].action[j] / 100); + s32b val = s_info[j].value + (invest[i] * s_info[j].mod * s_descriptors[i].action[j] / 100); /* It cannot exceed SKILL_MAX */ if (val > SKILL_MAX) val = SKILL_MAX; @@ -581,7 +581,7 @@ void do_cmd_skill() /* Contextual help */ if (c == '?') { - help_skill(s_info[table[sel][0]].name); + help_skill(s_descriptors[table[sel][0]].name); } /* Handle boundaries and scrolling */ @@ -817,14 +817,14 @@ static int do_cmd_activate_skill_aux() for (size_t i = 1; i < max_s_idx; i++) { - if (s_info[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN))) + if (s_descriptors[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN))) { bool_ next = FALSE; /* Already got it ? */ for (size_t j = 0; j < p.size(); j++) { - if (s_info[i].action_mkey == std::get<1>(p[j])) + if (s_descriptors[i].action_mkey == std::get<1>(p[j])) { next = TRUE; break; @@ -832,8 +832,8 @@ static int do_cmd_activate_skill_aux() } if (next) continue; - p.push_back(std::make_tuple(s_info[i].action_desc, - s_info[i].action_mkey)); + p.push_back(std::make_tuple(s_descriptors[i].action_desc, + s_descriptors[i].action_mkey)); } } @@ -965,7 +965,7 @@ void do_cmd_activate_skill() /* Check validity */ for (i = 1; i < max_s_idx; i++) { - if (s_info[i].value && (s_info[i].action_mkey == x_idx)) + if (s_info[i].value && (s_descriptors[i].action_mkey == x_idx)) break; } for (j = 0; j < max_ab_idx; j++) @@ -1205,7 +1205,7 @@ void init_skill(s32b value, s32b mod, int i) { s_info[i].value = value; s_info[i].mod = mod; - s_info[i].hidden = (s_info[i].flags & SKF_HIDDEN) + s_info[i].hidden = (s_descriptors[i].flags & SKF_HIDDEN) ? TRUE : FALSE ; @@ -1283,7 +1283,8 @@ void do_get_new_skill() max_a = 0; for (i = 0; i < max_s_idx; i++) { - if (s_info[i].flags & SKF_RANDOM_GAIN) { + if (s_descriptors[i].flags & SKF_RANDOM_GAIN) + { available_skills[max_a] = i; max_a++; } @@ -1292,7 +1293,7 @@ void do_get_new_skill() /* Perform the selection */ std::vector weights; for (i = 0; i < max_a; i++) { - weights.push_back(s_info[available_skills[i]].random_gain_chance); + weights.push_back(s_descriptors[available_skills[i]].random_gain_chance); } std::vector indexes = wrs(weights); @@ -1336,7 +1337,7 @@ void do_get_new_skill() skl[i] = s_idx; items.push_back(format("%-40s: +%02ld.%03ld value, +%01d.%03d modifier", - s_ptr->name, + s_descriptors[s_idx].name, val[i] / SKILL_STEP, val[i] % SKILL_STEP, mod[i] / SKILL_STEP, @@ -1353,14 +1354,13 @@ void do_get_new_skill() /* Ok ? lets learn ! */ if (res > -1) { - skill_type *s_ptr; bool_ oppose = FALSE; int oppose_skill = -1; /* Check we don't oppose an existing skill */ for (i = 0; i < max_s_idx; i++) { - if ((s_info[i].action[skl[res]] == SKILL_EXCLUSIVE) && + if ((s_descriptors[i].action[skl[res]] == SKILL_EXCLUSIVE) && (s_info[i].value != 0)) { oppose = TRUE; @@ -1383,24 +1383,25 @@ void do_get_new_skill() /* Prepare prompt */ msg = format("This skill is mutually exclusive with " "at least %s, continue?", - s_info[oppose_skill].name); + s_descriptors[oppose_skill].name); /* The player rejected the choice */ if (!get_check(msg)) continue; } - s_ptr = &s_info[skl[res]]; + auto const s_desc = &s_descriptors[skl[res]]; + auto const s_ptr = &s_info[skl[res]]; s_ptr->value += val[res]; s_ptr->mod += mod[res]; if (mod[res]) { msg_format("You can now learn the %s skill.", - s_ptr->name); + s_desc->name); } else { msg_format("Your knowledge of the %s skill increases.", - s_ptr->name); + s_desc->name); } break; } diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 41806feb..1b58b752 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -773,7 +773,7 @@ std::shared_ptr SkillCondition::from_json(json_t *j) void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const { p->write(ecol, "Your skill in "); - p->write(bcol, s_info[m_skill_idx].name); + p->write(bcol, s_descriptors[m_skill_idx].name); p->write(ecol, " is from "); p->write(TERM_WHITE, format("%d", (int) m_min)); p->write(ecol, " to "); @@ -784,7 +784,7 @@ void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t void SkillCondition::to_json(json_t *j) const { json_object_set_new(j, "name", - json_string(s_info[m_skill_idx].name)); + json_string(s_descriptors[m_skill_idx].name)); json_object_set_new(j, "min", json_integer(m_min)); json_object_set_new(j, "max", diff --git a/src/variable.cc b/src/variable.cc index 00fd340d..827ee1af 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -510,6 +510,11 @@ ability_type *ab_info; */ skill_type *s_info; +/** + * Skill descriptors. + */ +skill_descriptor *s_descriptors; + /* * Player race arrays */ diff --git a/src/variable.hpp b/src/variable.hpp index 9d737930..52dbc455 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -36,6 +36,7 @@ #include "rune_spell.hpp" #include "school_type.hpp" #include "set_type_fwd.hpp" +#include "skill_descriptor_fwd.hpp" #include "skill_modifiers_fwd.hpp" #include "skill_type_fwd.hpp" #include "skills_defs.hpp" @@ -174,6 +175,7 @@ extern char player_name[32]; extern char player_base[32]; extern ability_type *ab_info; extern skill_type *s_info; +extern skill_descriptor *s_descriptors; extern vault_type *v_info; extern feature_type *f_info; extern object_kind *k_info; diff --git a/src/xtra1.cc b/src/xtra1.cc index fbbd7922..c97d3663 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2972,8 +2972,10 @@ void calc_bonuses(bool_ silent) /* Hide the skills that should auto hide */ for (i = 0; i < max_s_idx; i++) { - if (s_info[i].flags & SKF_AUTO_HIDE) + if (s_descriptors[i].flags & SKF_AUTO_HIDE) + { s_info[i].hidden = TRUE; + } } /* Base Luck */ -- cgit v1.2.3 From 7d8641b99e82d62ddb8753d7b50d6b9fcab91c41 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Don't try to handle added skills on load --- src/dungeon.cc | 14 -------------- src/loadsave.cc | 32 ++++++-------------------------- src/variable.cc | 1 - src/variable.hpp | 1 - 4 files changed, 6 insertions(+), 42 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index 00bee6f4..bdb31fa1 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -5103,20 +5103,6 @@ void play_game() /* The dungeon is not ready */ character_dungeon = FALSE; } - else - { - int i; - - /* Init new skills to their defaults */ - for (i = old_max_s_idx; i < max_s_idx; i++) - { - s32b value = 0, mod = 0; - - compute_skills(&value, &mod, i); - - init_skill(value, mod, i); - } - } /* Process old character */ if (!new_game) diff --git a/src/loadsave.cc b/src/loadsave.cc index 5fb4bada..562a403b 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -601,37 +601,17 @@ static bool_ do_extra(ls_flag_t flag) do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > MAX_SKILLS)) + if ((flag == ls_flag_t::LOAD) && (tmp16u != MAX_SKILLS)) { - quit("Too many skills"); + quit("Too few/many skills"); } - if (flag == ls_flag_t::SAVE) - { - old_max_s_idx = max_s_idx; - } - do_u16b(&old_max_s_idx, flag); - for (std::size_t i = 0; i < tmp16u; i++) { - if (i < old_max_s_idx) - { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_bool(&s_info[i].dev, flag); - do_bool(&s_info[i].hidden, flag); - } - else - { - // Skip extraneous entries - u32b tmp32u = 0; - s16b tmp16s = 0; - bool_ tmp8u = 0; - do_u32b(&tmp32u, flag); - do_s16b(&tmp16s, flag); - do_bool(&tmp8u, flag); - do_bool(&tmp8u, flag); - } + do_s32b(&s_info[i].value, flag); + do_s32b(&s_info[i].mod, flag); + do_bool(&s_info[i].dev, flag); + do_bool(&s_info[i].hidden, flag); } } diff --git a/src/variable.cc b/src/variable.cc index 827ee1af..51ec1333 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -683,7 +683,6 @@ wilderness_map **wild_map; /* * Maximum number of skills in s_info.txt */ -u16b old_max_s_idx = 0; u16b max_s_idx; /* diff --git a/src/variable.hpp b/src/variable.hpp index 52dbc455..3385bebd 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -210,7 +210,6 @@ extern bool_ (*get_obj_num_hook)(int k_idx); extern u16b max_wild_x; extern u16b max_wild_y; extern wilderness_map **wild_map; -extern u16b old_max_s_idx; extern u16b max_ab_idx; extern u16b max_s_idx; extern u16b max_r_idx; -- cgit v1.2.3 From 0cd5370d552babada63b59003e7629c180d4eeaa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Change skill_type struct to use 'bool' --- src/birth.cc | 4 ++-- src/gods.cc | 7 +++++-- src/loadsave.cc | 4 ++-- src/mimic.cc | 2 +- src/q_bounty.cc | 11 +++++++---- src/skill_type.hpp | 4 ++-- src/skills.cc | 14 +++++++++----- src/xtra1.cc | 4 ++-- src/xtra2.cc | 2 +- 9 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 2ed3fc79..4c75dcc0 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2783,7 +2783,7 @@ static bool_ player_birth_aux() for (i = 1; i < max_s_idx; i++) { - s_info[i].dev = FALSE; + s_info[i].dev = false; } for (i = 1; i < max_s_idx; i++) @@ -2802,7 +2802,7 @@ static bool_ player_birth_aux() while (z != -1) { // Mark as developed - s_info[z].dev = TRUE; + s_info[z].dev = true; // Next node up the tree z = s_descriptors[z].father; if (z == 0) diff --git a/src/gods.cc b/src/gods.cc index 1163e9b6..f10209dc 100644 --- a/src/gods.cc +++ b/src/gods.cc @@ -97,8 +97,11 @@ void follow_god(int god, bool_ silent) /* Melkor offer Udun magic */ if (p_ptr->pgod == GOD_MELKOR) { - s_info[SKILL_UDUN].hidden = FALSE; - if (!silent) msg_print("You feel the dark powers of Melkor in you. You can now use the Udun skill."); + s_info[SKILL_UDUN].hidden = false; + if (!silent) + { + msg_print("You feel the dark powers of Melkor in you. You can now use the Udun skill."); + } } } } diff --git a/src/loadsave.cc b/src/loadsave.cc index 562a403b..b8544f01 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -610,8 +610,8 @@ static bool_ do_extra(ls_flag_t flag) { do_s32b(&s_info[i].value, flag); do_s32b(&s_info[i].mod, flag); - do_bool(&s_info[i].dev, flag); - do_bool(&s_info[i].hidden, flag); + do_std_bool(&s_info[i].dev, flag); + do_std_bool(&s_info[i].hidden, flag); } } diff --git a/src/mimic.cc b/src/mimic.cc index c540c732..463c389d 100644 --- a/src/mimic.cc +++ b/src/mimic.cc @@ -336,7 +336,7 @@ static s32b bear_calc() } /* activate the skill */ - s_info[SKILL_BEAR].hidden = FALSE; + s_info[SKILL_BEAR].hidden = false; return 0; } diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 28cf71c5..56f2669a 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -136,16 +136,19 @@ bool_ quest_bounty_get_item() skill_type *lore = &s_info[SKILL_LORE]; skill_type *preservation = &s_info[SKILL_PRESERVATION]; - if (lore->mod == 0) { + if (lore->mod == 0) + { lore->mod = 900; - lore->dev = TRUE; + lore->dev = true; } + lore->value += lore->mod; - if (preservation->mod == 0) { + if (preservation->mod == 0) + { preservation->value = 800; preservation->mod = 800; - preservation->dev = TRUE; + preservation->dev = true; msg_print("I see you don't know the corpse preservation skill, I shall teach you it too."); } diff --git a/src/skill_type.hpp b/src/skill_type.hpp index e93303e6..c26d8649 100644 --- a/src/skill_type.hpp +++ b/src/skill_type.hpp @@ -23,10 +23,10 @@ struct skill_type /** * Is the branch developed? */ - bool_ dev = FALSE; + bool dev = false; /** * Is the skill hidden? */ - bool_ hidden = FALSE; + bool hidden = false; }; diff --git a/src/skills.cc b/src/skills.cc index a46bf7ed..df252683 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -229,7 +229,11 @@ static void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int l table[*idx][0] = i; table[*idx][1] = lev; (*idx)++; - if (s_info[i].dev || full) init_table_aux(table, idx, i, lev + 1, full); + + if (s_info[i].dev || full) + { + init_table_aux(table, idx, i, lev + 1, full); + } } } @@ -528,8 +532,8 @@ void do_cmd_skill() /* Expand / collapse list of skills */ else if (c == '\r') { - if (s_info[table[sel][0]].dev) s_info[table[sel][0]].dev = FALSE; - else s_info[table[sel][0]].dev = TRUE; + s_info[table[sel][0]].dev = !s_info[table[sel][0]].dev; + init_table(table, &max, FALSE); } @@ -1206,8 +1210,8 @@ void init_skill(s32b value, s32b mod, int i) s_info[i].value = value; s_info[i].mod = mod; s_info[i].hidden = (s_descriptors[i].flags & SKF_HIDDEN) - ? TRUE - : FALSE + ? true + : false ; } diff --git a/src/xtra1.cc b/src/xtra1.cc index c97d3663..e2ae994b 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2548,7 +2548,7 @@ static void calc_corruptions() { s_info[SKILL_DAEMON].mod = 1500; } - s_info[SKILL_DAEMON].hidden = FALSE; + s_info[SKILL_DAEMON].hidden = false; } if (player_has_corruption(CORRUPT_RANDOM_TELEPORT)) @@ -2974,7 +2974,7 @@ void calc_bonuses(bool_ silent) { if (s_descriptors[i].flags & SKF_AUTO_HIDE) { - s_info[i].hidden = TRUE; + s_info[i].hidden = true; } } diff --git a/src/xtra2.cc b/src/xtra2.cc index fe214950..fdcbfdfa 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -444,7 +444,7 @@ bool_ set_mimic(int v, int p, int level) notice = TRUE; if (p == resolve_mimic_name("Bear")) { - s_info[SKILL_BEAR].hidden = TRUE; + s_info[SKILL_BEAR].hidden = true; select_default_melee(); } p = 0; -- cgit v1.2.3 From b15461dbcedf27f28a843f700ce0473d57364230 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove redundant checks "around" artifact_p() Turns out artifact_p() already performs the necessary checks. --- src/cave.cc | 5 ++++- src/cmd2.cc | 3 +-- src/cmd3.cc | 2 +- src/cmd6.cc | 6 +++--- src/melee1.cc | 2 +- src/melee2.cc | 3 +-- src/object1.cc | 6 +++--- src/object2.cc | 6 +++--- src/spells1.cc | 6 +++--- src/spells2.cc | 6 +++--- src/wizard2.cc | 2 +- 11 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 956088e0..e460ddc8 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -384,7 +384,10 @@ bool_ cave_valid_bold(int y, int x) object_type *o_ptr = &o_list[o_idx]; /* Forbid artifact grids */ - if ((o_ptr->art_name) || artifact_p(o_ptr)) return (FALSE); + if (artifact_p(o_ptr)) + { + return (FALSE); + } } /* Accept */ diff --git a/src/cmd2.cc b/src/cmd2.cc index a67f1fda..b0c9e38e 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -4166,8 +4166,7 @@ void do_cmd_boomerang(void) j = (hit_body ? breakage_chance(o_ptr) : 0); /* Break the boomerang */ - if (!(o_ptr->art_name || artifact_p(o_ptr)) && - (rand_int(100) < j)) + if ((!artifact_p(o_ptr)) && (rand_int(100) < j)) { msg_print(format("Your %s is destroyed.", o_name)); inc_stack_size_ex(INVEN_BOW, -1, OPTIMIZE, NO_DESCRIBE); diff --git a/src/cmd3.cc b/src/cmd3.cc index fd97c8b3..b6f8de28 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -623,7 +623,7 @@ void do_cmd_destroy(void) /* Artifacts cannot be destroyed */ - if (artifact_p(o_ptr) || o_ptr->art_name) + if (artifact_p(o_ptr)) { byte feel = SENSE_SPECIAL; diff --git a/src/cmd6.cc b/src/cmd6.cc index 9c71584b..4bcade91 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -2739,7 +2739,7 @@ bool_ curse_armor(void) object_desc(o_name, o_ptr, FALSE, 3); /* Attempt a saving throw for artifacts */ - if (((o_ptr->art_name) || artifact_p(o_ptr)) && (rand_int(100) < 50)) + if (artifact_p(o_ptr) && (rand_int(100) < 50)) { /* Cool */ msg_format("A terrible black aura tries to surround your armour, " @@ -2801,7 +2801,7 @@ bool_ curse_weapon(void) object_desc(o_name, o_ptr, FALSE, 3); /* Attempt a saving throw */ - if ((artifact_p(o_ptr) || o_ptr->art_name) && (rand_int(100) < 50)) + if (artifact_p(o_ptr) && (rand_int(100) < 50)) { /* Cool */ msg_format("A terrible black aura tries to surround your weapon, " @@ -4644,7 +4644,7 @@ bool_ brand_bolts(void) if (o_ptr->tval != TV_BOLT) continue; /* Skip artifacts and ego-items */ - if (o_ptr->art_name || artifact_p(o_ptr) || ego_item_p(o_ptr)) continue; + if (artifact_p(o_ptr) || ego_item_p(o_ptr)) continue; /* Skip cursed/broken items */ if (cursed_p(o_ptr)) continue; diff --git a/src/melee1.cc b/src/melee1.cc index 7fdaca55..ecc44356 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -1867,7 +1867,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (!o_ptr->k_idx) continue; /* Skip artifacts */ - if (artifact_p(o_ptr) || o_ptr->art_name) continue; + if (artifact_p(o_ptr)) continue; /* Get a description */ object_desc(o_name, o_ptr, FALSE, 3); diff --git a/src/melee2.cc b/src/melee2.cc index d519dd8a..130b74ee 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -6211,8 +6211,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (flags & TR_SLAY_EVIL) flg |= RF_EVIL; /* The object cannot be picked up by the monster */ - if (artifact_p(o_ptr) || (r_ptr->flags & flg) || - (o_ptr->art_name)) + if (artifact_p(o_ptr) || (r_ptr->flags & flg)) { /* Only give a message for "take_item" */ if (r_ptr->flags & RF_TAKE_ITEM) diff --git a/src/object1.cc b/src/object1.cc index 3f5d123f..c93d1ff1 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1469,7 +1469,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) {} /* Hack -- The only one of its kind */ - else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) + else if (known && artifact_p(o_ptr)) { t += "The "; } @@ -1571,7 +1571,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Hack -- The only one of its kind */ - else if (known && (artifact_p(o_ptr) || o_ptr->art_name)) + else if (known && artifact_p(o_ptr)) { t += "The "; } @@ -3463,7 +3463,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait /* Copying how others seem to do it. -- neil */ if (o_ptr->tval == TV_RING || o_ptr->tval == TV_AMULET || - !trim_down || (ego_item_p(o_ptr)) || (artifact_p(o_ptr))) + !trim_down || ego_item_p(o_ptr) || artifact_p(o_ptr)) { /* Where did we found it ? */ if (o_ptr->found == OBJ_FOUND_MONSTER) diff --git a/src/object2.cc b/src/object2.cc index c474fe18..89378fb2 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -311,7 +311,7 @@ void compact_objects(int size) chance = chance - cur_lev / 2; /* Artifacts */ - if ( artifact_p(o_ptr) || o_ptr->art_name ) + if (artifact_p(o_ptr)) { /* Artifacts are "immune if the level is lower */ /* than 300 + artifact level */ @@ -5082,7 +5082,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* Handle normal "breakage" */ - if (!(j_ptr->art_name || artifact_p(j_ptr)) && (rand_int(100) < chance)) + if ((!artifact_p(j_ptr)) && (rand_int(100) < chance)) { /* Message */ msg_format("The %s disappear%s.", @@ -5187,7 +5187,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* Handle lack of space */ - if (!flag && !(artifact_p(j_ptr) || j_ptr->art_name)) + if (!flag && (!artifact_p(j_ptr))) { /* Message */ msg_format("The %s disappear%s.", diff --git a/src/spells1.cc b/src/spells1.cc index 0054a1d6..3dc6c97f 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1797,7 +1797,7 @@ static int inven_damage(inven_func typ, int perc) if (!o_ptr->k_idx) continue; /* Hack -- for now, skip artifacts */ - if (artifact_p(o_ptr) || o_ptr->art_name) continue; + if (artifact_p(o_ptr)) continue; /* Give this item slot a shot at death */ if ((*typ)(o_ptr)) @@ -2313,7 +2313,7 @@ bool_ apply_disenchant(int mode) /* Artifacts have 71% chance to resist */ - if ((artifact_p(o_ptr) || o_ptr->art_name) && (rand_int(100) < 71)) + if (artifact_p(o_ptr) && (rand_int(100) < 71)) { /* Message */ msg_format("Your %s (%c) resist%s disenchantment!", @@ -3853,7 +3853,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) if (o_ptr->number > 1) plural = TRUE; /* Check for artifact */ - if ((artifact_p(o_ptr) || o_ptr->art_name)) is_art = TRUE; + if (artifact_p(o_ptr)) is_art = TRUE; /* Analyze the type */ switch (typ) diff --git a/src/spells2.cc b/src/spells2.cc index bc5b8642..2b776c4f 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -728,7 +728,7 @@ bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a sh } /* Artifacts cannot be destroyed */ - if (artifact_p(o_ptr) || o_ptr->art_name) + if (artifact_p(o_ptr)) { byte feel = SENSE_SPECIAL; @@ -2695,7 +2695,7 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) { int i, chance, prob; bool_ res = FALSE; - bool_ a = (artifact_p(o_ptr) || o_ptr->art_name); + auto const a = artifact_p(o_ptr); /* Extract the flags */ @@ -3252,7 +3252,7 @@ static void note_found_object(object_type *o_ptr) char note[150]; char item_name[80]; - if (artifact_p(o_ptr) || o_ptr->name1) + if (artifact_p(o_ptr)) { object_desc(item_name, o_ptr, FALSE, 0); diff --git a/src/wizard2.cc b/src/wizard2.cc index 295bf5ca..266fc353 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -723,7 +723,7 @@ static void wiz_reroll_item(object_type *o_ptr) /* Hack -- leave artifacts alone */ - if (artifact_p(o_ptr) || o_ptr->art_name) return; + if (artifact_p(o_ptr)) return; /* Get local object */ -- cgit v1.2.3 From 013e27d39ee8ee513208d2855c7e3f6252f0c0bf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor object_type 'inscription' field to std::string We don't really need quarks for this since we're not nearly as memory-constrained these days. --- src/cmd1.cc | 20 ++++++-------- src/cmd3.cc | 17 ++++-------- src/cmd5.cc | 39 ++++++++++++++------------ src/cmd5.hpp | 4 ++- src/cmd7.cc | 32 ++++++++-------------- src/dungeon.cc | 21 ++++++-------- src/loadsave.cc | 20 +++----------- src/melee1.cc | 8 +++--- src/melee2.cc | 14 +++------- src/object1.cc | 71 +++++++++++++++++++----------------------------- src/object2.cc | 10 +++++-- src/object_type.hpp | 5 +++- src/q_fireprof.cc | 8 ++---- src/q_god.cc | 2 +- src/q_poison.cc | 3 +- src/spells1.cc | 6 ++-- src/squelch/condition.cc | 6 +--- src/squelch/rule.cc | 6 ++-- src/store.cc | 10 +++---- src/util.cc | 9 +++--- 20 files changed, 134 insertions(+), 177 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index 642c9df8..36b164b5 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -622,16 +622,12 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { monster_type *t_ptr = &m_list[m_idx]; - monster_race *r_ptr; - int ap_cnt; int ac, rlev, pt; char t_name[80]; - cptr sym_name = symbiote_name(TRUE); - char temp[80]; bool_ blinked = FALSE, touched = FALSE; @@ -640,14 +636,12 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, byte x_saver = t_ptr->fx; - object_type *o_ptr; - - /* Get the carried monster */ - o_ptr = &p_ptr->inventory[INVEN_CARRY]; + auto o_ptr = &p_ptr->inventory[INVEN_CARRY]; if (!o_ptr->k_idx) return; - r_ptr = &r_info[o_ptr->pval]; + /* Get monster race of the symbiote */ + monster_race *r_ptr = &r_info[o_ptr->pval]; /* Not allowed to attack */ if (r_ptr->flags & RF_NEVER_BLOW) return; @@ -877,7 +871,9 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, { strnfmt(temp, sizeof(temp), act, t_name); if (t_ptr->ml) - msg_format("%s %s", sym_name, temp); + { + msg_format("%s %s", symbiote_name(true).c_str(), temp); + } } @@ -1092,7 +1088,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, disturb(1); /* Message */ - msg_format("%s misses %s.", sym_name, t_name); + msg_format("%s misses %s.", symbiote_name(true).c_str(), t_name); break; } } @@ -1102,7 +1098,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, /* Blink away */ if (blinked) { - msg_format("You and %s flee laughing!", symbiote_name(FALSE)); + msg_format("You and %s flee laughing!", symbiote_name(false).c_str()); teleport_player(MAX_SIGHT * 2 + 5); } diff --git a/src/cmd3.cc b/src/cmd3.cc index b6f8de28..c333a599 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -732,7 +732,7 @@ void do_cmd_uninscribe(void) object_type *o_ptr = get_object(item); /* Nothing to remove */ - if (!o_ptr->note) + if (o_ptr->inscription.empty()) { msg_print("That item had no inscription to remove."); return; @@ -742,7 +742,7 @@ void do_cmd_uninscribe(void) msg_print("Inscription removed."); /* Remove the incription */ - o_ptr->note = 0; + o_ptr->inscription.clear(); /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); @@ -778,22 +778,15 @@ void do_cmd_inscribe(void) msg_format("Inscribing %s.", o_name); msg_print(NULL); - /* Start with nothing */ + /* Start with old inscription */ char out_val[80]; - strcpy(out_val, ""); - - /* Use old inscription */ - if (o_ptr->note) - { - /* Start with the old inscription */ - strcpy(out_val, quark_str(o_ptr->note)); - } + strcpy(out_val, o_ptr->inscription.c_str()); /* Get a new inscription (possibly empty) */ if (get_string("Inscription: ", out_val, sizeof(out_val))) { /* Save the inscription */ - o_ptr->note = quark_add(out_val); + o_ptr->inscription = out_val; /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); diff --git a/src/cmd5.cc b/src/cmd5.cc index f4885609..6e54c76e 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -535,43 +535,48 @@ void fetch(int dir, int wgt, bool_ require_los) /* * Return the symbiote's name or description. */ -cptr symbiote_name(bool_ capitalize) +std::string symbiote_name(bool capitalize) { object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY]; - static char buf[80]; - /* Make sure there actually is a symbiote there... */ + std::string buf; + buf.reserve(32); + + // Fallback; shouldn't ever be necessary if (!o_ptr->k_idx) { - strcpy(buf, "A non-existent symbiote"); + buf += "A non-existent symbiote"; } else { monster_race *r_ptr = &r_info[o_ptr->pval]; - cptr s = NULL; + std::size_t i = 0; if (r_ptr->flags & RF_UNIQUE) { - /* Unique monster; no preceding "your", and ignore our name. */ - strncpy(buf, r_ptr->name, sizeof(buf)); + // Unique monster; no preceding "your" and ignore name + buf += r_ptr->name; } - else if (o_ptr->note && - (s = strstr(quark_str(o_ptr->note), "#named ")) != NULL) + else if ((i = o_ptr->inscription.find("#named ")) != std::string::npos) { - /* We've named it. */ - strncpy(buf, s + 7, sizeof(buf)); + // We've named it; extract the name */ + buf += o_ptr->inscription.substr(i); } else { - /* No special cases, just return "Your ". */ - strcpy(buf, "your "); - strncpy(buf + 5, r_ptr->name, sizeof(buf) - 5); + // No special cases; just return "Your ". + buf += "your "; + buf += r_ptr->name; } } - /* Just in case... */ - buf[sizeof(buf) - 1] = '\0'; - if (capitalize) buf[0] = toupper(buf[0]); + // Capitalize? + if (capitalize) + { + buf[0] = toupper(buf[0]); + } + + // Done return buf; } diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 7a0cd27a..89bbab8c 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -4,6 +4,8 @@ #include "object_type_fwd.hpp" #include "monster_race_fwd.hpp" #include "monster_power_fwd.hpp" + +#include #include extern bool_ is_magestaff(void); @@ -11,7 +13,7 @@ extern void do_cmd_browse_aux(object_type *o_ptr); extern void do_cmd_browse(void); extern void fetch(int dir, int wgt, bool_ require_los); extern void do_poly_self(void); -extern cptr symbiote_name(bool_ capitalize); +extern std::string symbiote_name(bool capitalize); extern int use_symbiotic_power(int r_idx, bool great); extern void use_monster_power(int r_idx, bool great); extern bool_ is_ok_spell(s32b spell_idx, s32b pval); diff --git a/src/cmd7.cc b/src/cmd7.cc index 2d9ae191..49de2611 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -3237,13 +3237,6 @@ void do_cmd_rune_add_mem() */ void do_cmd_rune_carve() { - rune_spell s_ptr; - - int item, i; - - char out_val[80]; - - /* Not when confused */ if (p_ptr->confused) { @@ -3263,9 +3256,14 @@ void do_cmd_rune_carve() return; } - if (!get_runespell(&s_ptr)) return; + rune_spell s_ptr; + if (!get_runespell(&s_ptr)) + { + return; + } /* Get an item */ + int item; if (!get_item(&item, "Use which runestone? ", "You have no runestone to use.", @@ -3282,21 +3280,15 @@ void do_cmd_rune_carve() o_ptr->pval2 = s_ptr.rune2; o_ptr->pval3 = s_ptr.mana; - /* Start with nothing */ - strcpy(out_val, ""); - - /* Use old inscription */ - if (o_ptr->note) - { - /* Start with the old inscription */ - strcpy(out_val, quark_str(o_ptr->note)); - } + /* Start with old inscription */ + char out_val[80]; + strcpy(out_val, o_ptr->inscription.c_str()); /* Get a new inscription (possibly empty) */ if (get_string("Name this runestone: ", out_val, 80)) { /* Save the inscription */ - o_ptr->note = quark_add(out_val); + o_ptr->inscription = out_val; /* Combine the pack */ p_ptr->notice |= (PN_COMBINE); @@ -3306,7 +3298,7 @@ void do_cmd_rune_carve() } /* Delete the runes */ - for (i = 0; i < INVEN_WIELD; i++) + for (int i = 0; i < INVEN_WIELD; i++) { o_ptr = &p_ptr->inventory[i]; @@ -4259,7 +4251,7 @@ void do_cmd_symbiotic(void) o_ptr->pval2 += hp; if (o_ptr->pval2 > o_ptr->pval3) o_ptr->pval2 = o_ptr->pval3; - msg_format("%s is healed.", symbiote_name(TRUE)); + msg_format("%s is healed.", symbiote_name(true).c_str()); /* Display the monster hitpoints */ p_ptr->redraw |= (PR_FRAME); diff --git a/src/dungeon.cc b/src/dungeon.cc index bdb31fa1..2e42e871 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -610,16 +610,14 @@ static bool_ pattern_effect(void) */ static void recharged_notice(object_type *o_ptr) { - char o_name[80]; - - cptr s; - - /* No inscription */ - if (!o_ptr->note) return; + if (o_ptr->inscription.empty()) + { + return; + } /* Find a '!' */ - s = strchr(quark_str(o_ptr->note), '!'); + auto s = strchr(o_ptr->inscription.c_str(), '!'); /* Process notification request. */ while (s) @@ -628,6 +626,7 @@ static void recharged_notice(object_type *o_ptr) if (s[1] == '!') { /* Describe (briefly) */ + char o_name[80]; object_desc(o_name, o_ptr, FALSE, 0); /* Notify the player */ @@ -1295,7 +1294,7 @@ static void process_world(void) if ((randint(1000) < r_ptr->level - ((p_ptr->lev * 2) + get_skill(SKILL_SYMBIOTIC)))) { msg_format("%s breaks free from hypnosis!", - symbiote_name(TRUE)); + symbiote_name(true).c_str()); carried_make_attack_normal(o_ptr->pval); } } @@ -2773,11 +2772,9 @@ static void process_world(void) } else { - if (p_ptr->wild_mode || - (o_ptr->note && strchr(quark_str(o_ptr->note), '.'))) + if (p_ptr->wild_mode || strchr(o_ptr->inscription.c_str(), '.')) { - /* Do nothing */ - /* msg_print("Teleport aborted.") */; + /* Suppress teleportation */ } else if (get_check("Teleport? ")) { diff --git a/src/loadsave.cc b/src/loadsave.cc index b8544f01..6da23406 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1138,16 +1138,13 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) do_s16b(&o_ptr->found_aux3, flag); do_s16b(&o_ptr->found_aux4, flag); + // Inscription + do_std_string(o_ptr->inscription, flag); + + /* Artifact name */ if (flag == ls_flag_t::LOAD) { char buf[128]; - /* Inscription */ - load_string(buf, 128); - if (buf[0]) - { - o_ptr->note = quark_add(buf); - } - /* Artifact name */ load_string(buf, 128); if (buf[0]) { @@ -1156,15 +1153,6 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) } if (flag == ls_flag_t::SAVE) { - /* Save the inscription (if any) */ - if (o_ptr->note) - { - save_string(quark_str(o_ptr->note)); - } - else - { - save_string(""); - } if (o_ptr->art_name) { save_string(quark_str(o_ptr->art_name)); diff --git a/src/melee1.cc b/src/melee1.cc index ecc44356..5a61a424 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -231,7 +231,7 @@ bool_ carried_make_attack_normal(int r_idx) int do_cut, do_stun; char ddesc[80] = "your symbiote"; - cptr sym_name = symbiote_name(TRUE); + auto sym_name = symbiote_name(true); bool_ alive = TRUE; @@ -286,7 +286,7 @@ bool_ carried_make_attack_normal(int r_idx) ((rand_int(100) + p_ptr->lev) > 50)) { /* Message */ - msg_format("%s is repelled.", sym_name); + msg_format("%s is repelled.", sym_name.c_str()); /* Hack -- Next attack */ continue; @@ -454,7 +454,7 @@ bool_ carried_make_attack_normal(int r_idx) } /* Message */ - if (act) msg_format("%s %s", sym_name, act); + if (act) msg_format("%s %s", sym_name.c_str(), act); /* Roll out the damage */ @@ -1165,7 +1165,7 @@ bool_ carried_make_attack_normal(int r_idx) disturb(1); /* Message */ - msg_format("%s misses you.", sym_name); + msg_format("%s misses you.", sym_name.c_str()); break; } diff --git a/src/melee2.cc b/src/melee2.cc index 130b74ee..562bca57 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2381,12 +2381,9 @@ void curse_equipment(int chance, int heavy_chance) if (changed) { msg_print("There is a malignant black aura surrounding you..."); - if (o_ptr->note) + if (o_ptr->inscription == "uncursed") { - if (streq(quark_str(o_ptr->note), "uncursed")) - { - o_ptr->note = 0; - } + o_ptr->inscription.clear(); } } } @@ -2438,12 +2435,9 @@ void curse_equipment_dg(int chance, int heavy_chance) if (changed) { msg_print("There is a malignant black aura surrounding you..."); - if (o_ptr->note) + if (o_ptr->inscription == "uncursed") { - if (streq(quark_str(o_ptr->note), "uncursed")) - { - o_ptr->note = 0; - } + o_ptr->inscription.clear(); } } } diff --git a/src/object1.cc b/src/object1.cc index c93d1ff1..a7c1edf1 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1526,16 +1526,10 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Dagger inscribed {@w0%Smelly} will be named * Smelly Dagger {@w0} */ - if (o_ptr->note) + if (auto str = strchr(o_ptr->inscription.c_str(), '%')) { - cptr str = strchr(quark_str(o_ptr->note), '%'); - - /* Add the false name */ - if (str) - { - t += &str[1]; - t += ' '; - } + t += &str[1]; + t += ' '; } } @@ -1680,16 +1674,10 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* -TM- Hack -- Add false-artifact names */ /* Dagger inscribed {@w0#of Smell} will be named * Dagger of Smell {@w0} */ - if (o_ptr->note) + if (auto str = strchr(o_ptr->inscription.c_str(), '#')) { - cptr str = strchr(quark_str(o_ptr->note), '#'); - - /* Add the false name */ - if (str) - { - t += ' '; - t += &str[1]; - } + t += ' '; + t += &str[1]; } /* Is it a new random artifact ? */ @@ -2061,17 +2049,13 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) inscrip.push_back("cursed"); } - /* Use the standard inscription if available */ - if (o_ptr->note) + /* Use the standard inscription if available; + Chop at '#' or '%' if present. The suffix of the + '%' or '#' is handled elsewhere in this function. + */ + if (auto const pos = o_ptr->inscription.find_first_of("%#") != std::string::npos) { - // Chop at '#' or '%' if present. The suffix of the - // '%' or '#' is handled elsewhere in this function. - std::string note = quark_str(o_ptr->note); - auto const pos = note.find_first_of("%#"); - if (pos > 0) - { - inscrip.push_back(note.substr(0, pos)); - } + inscrip.push_back(o_ptr->inscription.substr(0, pos)); } /* Mega-Hack -- note empty wands/staffs */ @@ -4570,18 +4554,17 @@ bool_ verify(cptr prompt, int item) */ static bool_ get_item_allow(int item) { - cptr s; - - object_type *o_ptr; - /* Get object */ - o_ptr = get_object(item); + auto o_ptr = get_object(item); /* No inscription */ - if (!o_ptr->note) return (TRUE); + if (o_ptr->inscription.empty()) + { + return TRUE; + } /* Find a '!' */ - s = strchr(quark_str(o_ptr->note), '!'); + auto s = strchr(o_ptr->inscription.c_str(), '!'); /* Process preventions */ while (s) @@ -4631,23 +4614,25 @@ static bool get_item_okay(int i, object_filter_t const &filter) */ static int get_tag(int *cp, char tag) { - int i; - cptr s; - - /* Check every object */ - for (i = 0; i < INVEN_TOTAL; ++i) + for (int i = 0; i < INVEN_TOTAL; ++i) { object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ - if (!o_ptr->k_idx) continue; + if (!o_ptr->k_idx) + { + continue; + } /* Skip empty inscriptions */ - if (!o_ptr->note) continue; + if (o_ptr->inscription.empty()) + { + continue; + } /* Find a '@' */ - s = strchr(quark_str(o_ptr->note), '@'); + auto s = strchr(o_ptr->inscription.c_str(), '@'); /* Process all tags */ while (s) diff --git a/src/object2.cc b/src/object2.cc index 89378fb2..b4226f76 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -1734,7 +1734,10 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) if ((o_ptr->ident & (IDENT_CURSED)) != (j_ptr->ident & (IDENT_CURSED))) return (0); /* Hack -- require semi-matching "inscriptions" */ - if (o_ptr->note && j_ptr->note && (o_ptr->note != j_ptr->note)) return (0); + if ((!o_ptr->inscription.empty()) && (!j_ptr->inscription.empty()) && (o_ptr->inscription != j_ptr->inscription)) + { + return (0); + } /* Maximal "stacking" limit */ if (total >= MAX_STACK_SIZE) return (0); @@ -1770,7 +1773,10 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) if (j_ptr->ident & (IDENT_MENTAL)) o_ptr->ident |= (IDENT_MENTAL); /* Hack -- blend "inscriptions" */ - if (j_ptr->note) o_ptr->note = j_ptr->note; + if (!j_ptr->inscription.empty()) + { + o_ptr->inscription = j_ptr->inscription; + } /* Hack -- could average discounts XXX XXX XXX */ /* Hack -- save largest discount XXX XXX XXX */ diff --git a/src/object_type.hpp b/src/object_type.hpp index 48d18cf1..aec713b0 100644 --- a/src/object_type.hpp +++ b/src/object_type.hpp @@ -3,6 +3,8 @@ #include "h-basic.h" #include "object_flag_set.hpp" +#include + /** * Object information for a specific object. * @@ -75,7 +77,8 @@ struct object_type byte marked = 0; /* Object is marked */ - u16b note = 0; /* Inscription index */ + std::string inscription; /* Inscription index */ + u16b art_name = 0; /* Artifact name (random artifacts) */ object_flag_set art_flags; /* Flags */ diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index eb762fc4..033aec05 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -498,18 +498,16 @@ static bool_ fireproof_gen_hook(void *, void *, void *) /* create essence */ { - int x, y; object_type forge; - object_prep(&forge, lookup_kind(settings->tval, fireproof_get_sval())); /* mark item */ forge.pval2 = fireproof_get_sval(); - forge.note = quark_add("quest"); + forge.inscription = "quest"; /* roll for co-ordinates in top half of map */ - y = randint(3) + 2; - x = randint(45) + 2; + int const y = randint(3) + 2; + int const x = randint(45) + 2; /* drop it */ drop_near(&forge, -1, y, x); diff --git a/src/q_god.cc b/src/q_god.cc index 67371f46..c2dd3760 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -389,7 +389,7 @@ static void quest_god_generate_relic() object_prep(&relic, lookup_kind(TV_JUNK, get_relic_num())); /* inscribe it to prevent automatizer 'accidents' */ - relic.note = quark_add("quest"); + relic.inscription = "quest"; /* If no safe co-ords were found, put it in the players backpack */ if (tries == 0) diff --git a/src/q_poison.cc b/src/q_poison.cc index 45e7ede8..70eebcb9 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -178,7 +178,8 @@ static bool_ quest_poison_quest_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - q_ptr->note = quark_add("quest"); + q_ptr->inscription = "quest"; + (void)inven_carry(q_ptr, FALSE); del_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook); diff --git a/src/spells1.cc b/src/spells1.cc index 3dc6c97f..3f09e592 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1281,13 +1281,13 @@ void take_hit(int damage, cptr hit_from) /* Hurt the wielded monster if any */ if ((o_ptr->k_idx) && (magik(5 + get_skill(SKILL_SYMBIOTIC))) && (!carried_monster_hit)) { - cptr sym_name = symbiote_name(TRUE); + auto sym_name = symbiote_name(true); if (o_ptr->pval2 - damage <= 0) { cmsg_format(TERM_L_RED, "%s dies from protecting you, you feel very sad...", - sym_name); + sym_name.c_str()); inc_stack_size_ex(INVEN_CARRY, -1, OPTIMIZE, NO_DESCRIBE); damage -= o_ptr->pval2; o_ptr->pval2 = 0; @@ -1295,7 +1295,7 @@ void take_hit(int damage, cptr hit_from) } else { - msg_format("%s takes the damage instead of you.", sym_name); + msg_format("%s takes the damage instead of you.", sym_name.c_str()); o_ptr->pval2 -= damage; monster_take = TRUE; } diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 1b58b752..bb598158 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -627,12 +627,8 @@ void ClassCondition::to_json(json_t *j) const bool InscriptionCondition::is_match(object_type *o_ptr) const { - if (o_ptr->note == 0) - { - return false; - } return boost::algorithm::icontains( - quark_str(o_ptr->note), + o_ptr->inscription, m_inscription); } diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc index 2bdef61b..0f952ebb 100644 --- a/src/squelch/rule.cc +++ b/src/squelch/rule.cc @@ -238,7 +238,7 @@ bool DestroyRule::do_apply_rule(object_type *o_ptr, int item_idx) const } // Never destroy inscribed items - if (o_ptr->note) + if (!o_ptr->inscription.empty()) { return false; } @@ -317,14 +317,14 @@ void InscribeRule::do_write_tree(TreePrinter *p) const bool InscribeRule::do_apply_rule(object_type *o_ptr, int) const { // Already inscribed? - if (o_ptr->note != 0) + if (!o_ptr->inscription.empty()) { return false; } // Inscribe msg_format("", m_inscription.c_str()); - o_ptr->note = quark_add(m_inscription.c_str()); + o_ptr->inscription = m_inscription; return true; } diff --git a/src/store.cc b/src/store.cc index dd7aa484..71d6b2d0 100644 --- a/src/store.cc +++ b/src/store.cc @@ -957,7 +957,7 @@ static int store_carry(object_type *o_ptr) o_ptr->ident |= IDENT_MENTAL; /* Erase the inscription */ - o_ptr->note = 0; + o_ptr->inscription.clear(); /* Check each existing item (try to combine) */ for (slot = 0; slot < st_ptr->stock.size(); slot++) @@ -1979,7 +1979,7 @@ void store_stole(void) msg_format("You steal %s.", o_name); /* Erase the inscription */ - j_ptr->note = 0; + j_ptr->inscription.clear(); /* Give it to the player */ int const item_new = inven_carry(j_ptr, FALSE); @@ -2236,7 +2236,7 @@ void store_purchase(void) msg_format("You bought %s for " FMTs32b " gold.", o_name, price); /* Erase the inscription */ - j_ptr->note = 0; + j_ptr->inscription.clear(); /* Hack -- If a rod or wand, allocate total maximum * timeouts or charges between those picked up and @@ -2481,7 +2481,7 @@ void store_sell(void) /* Remove any inscription for stores */ if ((cur_store_num != 7) && !museum) { - q_ptr->note = 0; + q_ptr->inscription.clear(); } /* Is there room in the store (or the home?) */ @@ -3400,7 +3400,7 @@ void store_shuffle(int which) o_ptr->discount = 50; /* Mega-Hack -- Note that the item is "on sale" */ - o_ptr->note = quark_add("on sale"); + o_ptr->inscription = "on sale"; } } diff --git a/src/util.cc b/src/util.cc index b393c610..70cc3f4f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -2968,18 +2968,19 @@ void request_command(int shopping) /* Hack -- Scan equipment */ for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) { - cptr s; - object_type *o_ptr = &p_ptr->inventory[i]; /* Skip non-objects */ if (!o_ptr->k_idx) continue; /* No inscription */ - if (!o_ptr->note) continue; + if (o_ptr->inscription.empty()) + { + continue; + } /* Obtain the inscription */ - s = quark_str(o_ptr->note); + auto s = o_ptr->inscription.c_str(); /* Find a '^' */ s = strchr(s, '^'); -- cgit v1.2.3 From 8bbf783ead4517465445272f9144cf06bdac9be7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Refactor object_type 'artifact name' field to std::string We don't really need quarks for this since we're not nearly as memory-constrained these days. --- src/cmd1.cc | 24 +++++++----------------- src/cmd6.cc | 2 +- src/loadsave.cc | 34 +++++++++------------------------- src/melee2.cc | 4 ++-- src/object1.cc | 16 ++++++++-------- src/object2.cc | 9 ++++++--- src/object_type.hpp | 2 +- src/q_library.cc | 2 +- src/q_thrain.cc | 6 ++++-- src/q_wight.cc | 2 +- src/randart.cc | 2 +- src/squelch/condition.cc | 1 - src/store.cc | 7 ++++--- src/xtra2.cc | 10 ++++++---- 14 files changed, 51 insertions(+), 70 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index 36b164b5..f1dfaac9 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -2046,21 +2046,16 @@ void py_attack(int y, int x, int max_blow) !(p_ptr->stun || p_ptr->confused || p_ptr->image || !(m_ptr->ml))) { - if (!(p_ptr->inventory[INVEN_WIELD].art_name)) + // Only 'Stormbringer' can hit friendlies unless player forces attack. + if (p_ptr->inventory[INVEN_WIELD].artifact_name == "'Stormbringer'") { - msg_format("You stop to avoid hitting %s.", m_name); - return; + msg_format("Your black blade greedily attacks %s!", m_name); } - - if (! - (streq - (quark_str(p_ptr->inventory[INVEN_WIELD].art_name), "'Stormbringer'"))) + else { msg_format("You stop to avoid hitting %s.", m_name); return; } - - msg_format("Your black blade greedily attacks %s!", m_name); } /* Break goi/manashield */ @@ -2740,8 +2735,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) char m_name[80]; - bool_ stormbringer = FALSE; - bool_ old_dtrap, new_dtrap; bool_ oktomove = TRUE; @@ -2910,12 +2903,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) m_ptr = &m_list[c_ptr->m_idx]; auto const mr_ptr = m_ptr->race(); - if (p_ptr->inventory[INVEN_WIELD].art_name) - { - if (streq(quark_str(p_ptr->inventory[INVEN_WIELD].art_name), "'Stormbringer'")) - stormbringer = TRUE; - } - /* Hack -- attack monsters */ if (c_ptr->m_idx && (m_ptr->ml || player_can_enter(c_ptr->feat))) { @@ -2936,6 +2923,9 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Track a new monster */ if (m_ptr->ml) health_track(c_ptr->m_idx); + /* Is it Stormbringer? */ + bool stormbringer = p_ptr->inventory[INVEN_WIELD].artifact_name == "'Stormbringer'"; + /* displace? */ if (stormbringer && (randint(1000) > 666)) { diff --git a/src/cmd6.cc b/src/cmd6.cc index 4bcade91..393261bf 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -5077,7 +5077,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) spell = a_info[o_ptr->name1].activate; /* Random Artifacts */ - if (!spell && o_ptr->art_name) + if (!spell && (!o_ptr->artifact_name.empty())) spell = o_ptr->xtra2; /* Ego Items */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 6da23406..3f4ba47f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1141,31 +1141,15 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) // Inscription do_std_string(o_ptr->inscription, flag); - /* Artifact name */ - if (flag == ls_flag_t::LOAD) - { - char buf[128]; - load_string(buf, 128); - if (buf[0]) - { - o_ptr->art_name = quark_add(buf); - } - } - if (flag == ls_flag_t::SAVE) - { - if (o_ptr->art_name) - { - save_string(quark_str(o_ptr->art_name)); - } - else - { - save_string(""); - } - } + // Artifact name + do_std_string(o_ptr->artifact_name, flag); + + /* Stick any more shared code before this. The rest + of this function is reserved for ls_flag_t::LOAD's + cleanup functions */ + + if (flag == ls_flag_t::SAVE) return; - if (flag == ls_flag_t::SAVE) return ; /* Stick any more shared code before this. The rest - of this function is reserved for ls_flag_t::LOAD's - cleanup functions */ /*********** END OF ls_flag_t::SAVE ***************/ /* Obtain the "kind" template */ @@ -1248,7 +1232,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) o_ptr->ds = old_ds; } - if (o_ptr->art_name) /* A random artifact */ + if (!o_ptr->artifact_name.empty()) /* A random artifact */ { o_ptr->dd = old_dd; o_ptr->ds = old_ds; diff --git a/src/melee2.cc b/src/melee2.cc index 562bca57..41756550 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2362,7 +2362,7 @@ void curse_equipment(int chance, int heavy_chance) } if ((randint(100) <= heavy_chance) && - (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) + (o_ptr->name1 || o_ptr->name2 || (!o_ptr->artifact_name.empty()))) { if (!(flags & TR_HEAVY_CURSE)) changed = TRUE; @@ -2414,7 +2414,7 @@ void curse_equipment_dg(int chance, int heavy_chance) } if ((randint(100) <= heavy_chance) && - (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name)) + (o_ptr->name1 || o_ptr->name2 || (!o_ptr->artifact_name.empty()))) { if (!(flags & TR_HEAVY_CURSE)) changed = TRUE; diff --git a/src/object1.cc b/src/object1.cc index a7c1edf1..b4e1141d 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -717,7 +717,7 @@ void reset_visuals(void) static void object_flags_xtra(object_type const *o_ptr, object_flag_set *f) { // Artifacts don't get *ego* extra powers. - if (o_ptr->art_name) + if (!o_ptr->artifact_name.empty()) { return; } @@ -1126,7 +1126,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) else basenm = aware ? "& # Amulet~" : "& # Amulet~"; - if (known && !o_ptr->art_name && artifact_p(o_ptr)) + if (known && o_ptr->artifact_name.empty() && artifact_p(o_ptr)) { basenm = k_ptr->name; } @@ -1149,7 +1149,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Hack -- The One Ring */ if (!aware && (o_ptr->sval == SV_RING_POWER)) modstr = "Plain Gold"; - if (known && !o_ptr->art_name && artifact_p(o_ptr)) + if (known && o_ptr->artifact_name.empty() && artifact_p(o_ptr)) { basenm = k_ptr->name; } @@ -1681,10 +1681,10 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Is it a new random artifact ? */ - if (o_ptr->art_name) + if (!o_ptr->artifact_name.empty()) { t += ' '; - t += quark_str(o_ptr->art_name); + t += o_ptr->artifact_name; } @@ -1848,7 +1848,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) else if (o_ptr->to_h) { t += fmt::format(" ({:+d}", o_ptr->to_h); - if (!(flags & TR_HIDE_TYPE) || o_ptr->art_name) + if (!(flags & TR_HIDE_TYPE) || (!o_ptr->artifact_name.empty())) { t += " to accuracy"; } @@ -1859,7 +1859,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) else if (o_ptr->to_d) { t += fmt::format(" ({:+d}", o_ptr->to_d); - if (!(flags & TR_HIDE_TYPE) || o_ptr->art_name) + if (!(flags & TR_HIDE_TYPE) || (!o_ptr->artifact_name.empty())) { t += " to damage"; } @@ -6291,7 +6291,7 @@ bool artifact_p(object_type const *o_ptr) return (o_ptr->tval == TV_RANDART) || (o_ptr->name1 ? true : false) || - (o_ptr->art_name ? true : false) || + (!o_ptr->artifact_name.empty()) || ((k_info[o_ptr->k_idx].flags & TR_NORM_ART) ? true : false); } diff --git a/src/object2.cc b/src/object2.cc index b4226f76..f96426fb 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -963,7 +963,7 @@ s32b flag_cost(object_type const *o_ptr, int plusses) /* Also, give some extra for activatable powers... */ - if ((o_ptr->art_name) && (o_ptr->art_flags & TR_ACTIVATE)) + if ((!o_ptr->artifact_name.empty()) && (o_ptr->art_flags & TR_ACTIVATE)) { int type = o_ptr->xtra2; @@ -2036,7 +2036,7 @@ static void object_mention(object_type *o_ptr) } /* Random Artifact */ - else if (o_ptr->art_name) + else if (!o_ptr->artifact_name.empty()) { msg_print("Random artifact"); } @@ -4177,7 +4177,10 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea } } - if (o_ptr->art_name) rating += 40; + if (!o_ptr->artifact_name.empty()) + { + rating += 40; + } /* Hack -- analyze ego-items */ else if (o_ptr->name2) diff --git a/src/object_type.hpp b/src/object_type.hpp index aec713b0..3a34d181 100644 --- a/src/object_type.hpp +++ b/src/object_type.hpp @@ -79,7 +79,7 @@ struct object_type std::string inscription; /* Inscription index */ - u16b art_name = 0; /* Artifact name (random artifacts) */ + std::string artifact_name; /* Artifact name */ object_flag_set art_flags; /* Flags */ object_flag_set art_oflags; /* Obvious flags */ diff --git a/src/q_library.cc b/src/q_library.cc index e47eee4f..c379b6d1 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -457,7 +457,7 @@ void quest_library_building(bool_ *paid, bool_ *recreate) object_type forge; object_type *q_ptr = &forge; object_prep(q_ptr, lookup_kind(TV_BOOK, 61)); - q_ptr->art_name = quark_add(player_name); + q_ptr->artifact_name = player_name; q_ptr->found = OBJ_FOUND_REWARD; object_aware(q_ptr); object_known(q_ptr); diff --git a/src/q_thrain.cc b/src/q_thrain.cc index 0f490bf0..7cd64bbf 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -80,18 +80,20 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *) int x = m_ptr->fx; int y = m_ptr->fy; int i, j; - object_type forge, *q_ptr; delete_monster_idx(r); /* Wipe the glass walls and create a stair */ for (i = x - 1; i <= x + 1; i++) + { for (j = y - 1; j <= y + 1; j++) { if (in_bounds(j, i)) cave_set_feat(j, i, FEAT_FLOOR); } + } /* Get local object */ + object_type forge, *q_ptr; q_ptr = &forge; /* Wipe the object */ @@ -100,7 +102,7 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *) q_ptr->number = 1; q_ptr->found = OBJ_FOUND_REWARD; create_artifact(q_ptr, FALSE, TRUE); - q_ptr->art_name = quark_add("of Thrain"); + q_ptr->artifact_name = "of Thrain"; /* Drop it in the dungeon */ drop_near(q_ptr, -1, y, x); diff --git a/src/q_wight.cc b/src/q_wight.cc index 9583365b..531bec29 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -75,7 +75,7 @@ static bool_ quest_wight_gen_hook(void *, void *, void *) /* Name the rags */ - q_ptr->art_name = quark_add("of the Wight"); + q_ptr->artifact_name = "of the Wight"; q_ptr->art_flags |= TR_INT | diff --git a/src/randart.cc b/src/randart.cc index f7ea95f3..1ccba225 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -379,7 +379,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) } /* Save the inscription */ - o_ptr->art_name = quark_add(new_name); + o_ptr->artifact_name = new_name; o_ptr->name2 = o_ptr->name2b = 0; /* Window stuff */ diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index bb598158..9e93016e 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -16,7 +16,6 @@ #include "../player_type.hpp" #include "../skills.hpp" #include "../skill_type.hpp" -#include "../quark.hpp" #include "../util.hpp" #include "../variable.hpp" diff --git a/src/store.cc b/src/store.cc index 71d6b2d0..a518677b 100644 --- a/src/store.cc +++ b/src/store.cc @@ -452,7 +452,7 @@ static void mass_produce(object_type *o_ptr) } - if (o_ptr->art_name) + if (!o_ptr->artifact_name.empty()) { if (options->cheat_peek && discount) { @@ -510,7 +510,8 @@ static bool_ store_object_similar(object_type const *o_ptr, object_type *j_ptr) if (o_ptr->name2b != j_ptr->name2b) return (0); /* Random artifacts don't stack !*/ - if (o_ptr->art_name || j_ptr->art_name) return (0); + if (!o_ptr->artifact_name.empty()) return 0; + if (!j_ptr->artifact_name.empty()) return 0; /* Hack -- Identical art_flags! */ if (o_ptr->art_flags != j_ptr->art_flags) @@ -3396,7 +3397,7 @@ void store_shuffle(int which) auto o_ptr = &o_ref; /* Hack -- Sell all old items for "half price" */ - if (!(o_ptr->art_name)) + if (o_ptr->artifact_name.empty()) o_ptr->discount = 50; /* Mega-Hack -- Note that the item is "on sale" */ diff --git a/src/xtra2.cc b/src/xtra2.cc index fdcbfdfa..4334b999 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -62,10 +62,12 @@ #include "xtra1.hpp" #include "z-rand.hpp" -#include +#include #include +#include +#include + -#include using boost::algorithm::iequals; @@ -2492,7 +2494,7 @@ void monster_death(int m_idx) /* Mega-Hack -- Name the sword */ - q_ptr->art_name = quark_add("'Stormbringer'"); + q_ptr->artifact_name = "'Stormbringer'"; q_ptr->to_h = 16; q_ptr->to_d = 16; q_ptr->ds = 6; @@ -2688,7 +2690,7 @@ void monster_death(int m_idx) create_artifact(q_ptr, TRUE, FALSE); /* Save the inscription */ - q_ptr->art_name = quark_add(format("of %s", r_ptr->name)); + q_ptr->artifact_name = fmt::format("of {}", r_ptr->name); q_ptr->found = OBJ_FOUND_MONSTER; q_ptr->found_aux1 = m_ptr->r_idx; -- cgit v1.2.3 From 288c3d3f725eabfee06507966a0ba63bf587c3da Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove quark.{cc,hpp} --- src/CMakeLists.txt | 1 - src/cmd1.cc | 1 - src/cmd3.cc | 1 - src/cmd5.cc | 1 - src/cmd7.cc | 1 - src/dungeon.cc | 1 - src/init2.cc | 22 ------------ src/loadsave.cc | 1 - src/melee2.cc | 1 - src/object1.cc | 1 - src/powers.cc | 1 - src/q_fireprof.cc | 1 - src/q_god.cc | 1 - src/q_library.cc | 1 - src/q_poison.cc | 1 - src/q_thrain.cc | 1 - src/q_wight.cc | 1 - src/quark.cc | 96 ----------------------------------------------------- src/quark.hpp | 12 ------- src/randart.cc | 1 - src/squelch/rule.cc | 1 - src/store.cc | 1 - src/util.cc | 1 - src/xtra2.cc | 1 - 24 files changed, 151 deletions(-) delete mode 100644 src/quark.cc delete mode 100644 src/quark.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8ac5e097..8991318d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -87,7 +87,6 @@ SET(SRCS_COMMON q_ultrag.cc q_wight.cc q_wolves.cc - quark.cc quest.cc randart.cc range.cc diff --git a/src/cmd1.cc b/src/cmd1.cc index f1dfaac9..c0283512 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -35,7 +35,6 @@ #include "options.hpp" #include "player_race_flag.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "skills.hpp" #include "spells1.hpp" #include "spells2.hpp" diff --git a/src/cmd3.cc b/src/cmd3.cc index c333a599..66991c70 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -26,7 +26,6 @@ #include "object_type.hpp" #include "options.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "squeltch.hpp" #include "store.hpp" #include "store_type.hpp" diff --git a/src/cmd5.cc b/src/cmd5.cc index 6e54c76e..2fd9801e 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -39,7 +39,6 @@ #include "util.h" #include "variable.h" #include "variable.hpp" -#include "quark.hpp" #include "wizard2.hpp" #include "xtra1.hpp" #include "xtra2.hpp" diff --git a/src/cmd7.cc b/src/cmd7.cc index 49de2611..4c485c2f 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -28,7 +28,6 @@ #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "skills.hpp" #include "spells1.hpp" #include "spells2.hpp" diff --git a/src/dungeon.cc b/src/dungeon.cc index 2e42e871..16b6bcc0 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -58,7 +58,6 @@ #include "player_type.hpp" #include "powers.hpp" #include "quest.hpp" -#include "quark.hpp" #include "skills.hpp" #include "spell_type.hpp" #include "spells1.hpp" diff --git a/src/init2.cc b/src/init2.cc index ad96df86..8fc4bb07 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -33,7 +33,6 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "q_library.hpp" -#include "quark.hpp" #include "randart.hpp" #include "randart_part_type.hpp" #include "set_type.hpp" @@ -649,9 +648,6 @@ static errr init_misc(void) /*** Prepare the various "bizarre" arrays ***/ - /* Initialize quark subsystem */ - quark_init(); - /* Initialize messages subsystem */ message_init(); @@ -792,24 +788,6 @@ static errr init_other(void) cave[i] = new cave_type[MAX_WID]; } - /*** Pre-allocate the basic "auto-inscriptions" ***/ - - /* The "basic" feelings */ - (void)quark_add("cursed"); - (void)quark_add("broken"); - (void)quark_add("average"); - (void)quark_add("good"); - - /* The "extra" feelings */ - (void)quark_add("excellent"); - (void)quark_add("worthless"); - (void)quark_add("special"); - (void)quark_add("terrible"); - - /* Some extra strings */ - (void)quark_add("uncursed"); - (void)quark_add("on sale"); - /* Analyze the windows */ for (n = 0; n < 8; n++) { diff --git a/src/loadsave.cc b/src/loadsave.cc index 3f4ba47f..b66aeb01 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -23,7 +23,6 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "hooks.hpp" #include "skill_type.hpp" #include "store_type.hpp" diff --git a/src/melee2.cc b/src/melee2.cc index 41756550..773cdad1 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -38,7 +38,6 @@ #include "object_flag.hpp" #include "options.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "skills.hpp" #include "spells1.hpp" #include "spells2.hpp" diff --git a/src/object1.cc b/src/object1.cc index b4e1141d..c311ee34 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -38,7 +38,6 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "set_type.hpp" #include "skills.hpp" #include "spell_type.hpp" diff --git a/src/powers.cc b/src/powers.cc index 8edfb7b5..0c01a0e6 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -29,7 +29,6 @@ #include "object_kind.hpp" #include "options.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "spells1.hpp" #include "spells2.hpp" #include "stats.hpp" diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 033aec05..207f306f 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -12,7 +12,6 @@ #include "object_flag.hpp" #include "object_type.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "tables.hpp" #include "traps.hpp" #include "util.hpp" diff --git a/src/q_god.cc b/src/q_god.cc index c2dd3760..c5120da0 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -14,7 +14,6 @@ #include "monster_spell_flag.hpp" #include "object2.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "skill_type.hpp" #include "tables.hpp" #include "util.hpp" diff --git a/src/q_library.cc b/src/q_library.cc index c379b6d1..96c93980 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -8,7 +8,6 @@ #include "monster_type.hpp" #include "object2.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "spells3.hpp" #include "spells4.hpp" #include "tables.hpp" diff --git a/src/q_poison.cc b/src/q_poison.cc index 70eebcb9..54df78f9 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -15,7 +15,6 @@ #include "monster_type.hpp" #include "object2.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "tables.hpp" #include "util.hpp" #include "variable.hpp" diff --git a/src/q_thrain.cc b/src/q_thrain.cc index 7cd64bbf..b7eb0756 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -11,7 +11,6 @@ #include "init1.hpp" #include "lua_bind.hpp" #include "object_type.hpp" -#include "quark.hpp" #include "randart.hpp" #include "messages.hpp" #include "monster2.hpp" diff --git a/src/q_wight.cc b/src/q_wight.cc index 531bec29..01272aea 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -11,7 +11,6 @@ #include "object2.hpp" #include "object_flag.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "tables.hpp" #include "util.hpp" #include "variable.hpp" diff --git a/src/quark.cc b/src/quark.cc deleted file mode 100644 index 45072ded..00000000 --- a/src/quark.cc +++ /dev/null @@ -1,96 +0,0 @@ -#include "quark.hpp" - -#include "z-util.h" - -#include - -/* - * The number of quarks - */ -static s16b quark__num = 0; - - -/* - * The pointers to the quarks [QUARK_MAX] - */ -static cptr *quark__str = NULL; - - -/* - * Initialize the quark subsystem - */ -void quark_init() -{ - quark__num = 0; - quark__str = new cptr[QUARK_MAX]; - - for (int i = 0; i < QUARK_MAX; i++) { - quark__str[i] = nullptr; - } -} - - -/* -* We use a global array for all inscriptions to reduce the memory -* spent maintaining inscriptions. Of course, it is still possible -* to run out of inscription memory, especially if too many different -* inscriptions are used, but hopefully this will be rare. -* -* We use dynamic string allocation because otherwise it is necessary -* to pre-guess the amount of quark activity. We limit the total -* number of quarks, but this is much easier to "expand" as needed. -* -* Any two items with the same inscription will have the same "quark" -* index, which should greatly reduce the need for inscription space. -* -* Note that "quark zero" is NULL and should not be "dereferenced". -*/ - -/* -* Add a new "quark" to the set of quarks. -*/ -s16b quark_add(cptr str) -{ - assert(str != nullptr); - - int i; - - /* Look for an existing quark */ - for (i = 1; i < quark__num; i++) - { - /* Check for equality */ - if (streq(quark__str[i], str)) return (i); - } - - /* Paranoia -- Require room */ - if (quark__num == QUARK_MAX) return (0); - - /* New maximal quark */ - quark__num = i + 1; - - /* Add a new quark */ - quark__str[i] = strdup(str); - - /* Return the index */ - return (i); -} - - -/* -* This function looks up a quark -*/ -cptr quark_str(s16b i) -{ - cptr q; - - /* Verify */ - if ((i < 0) || (i >= quark__num)) i = 0; - - /* Access the quark */ - q = quark__str[i]; - - /* Return the quark */ - return (q); -} - - diff --git a/src/quark.hpp b/src/quark.hpp deleted file mode 100644 index 0fce3932..00000000 --- a/src/quark.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "h-basic.h" - -/** - * Maximum number of quarks. - */ -constexpr int QUARK_MAX = 768; - -void quark_init(); -cptr quark_str(s16b num); -s16b quark_add(cptr str); diff --git a/src/randart.cc b/src/randart.cc index 1ccba225..7a6b2398 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -14,7 +14,6 @@ #include "object_type.hpp" #include "options.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "randart_gen_type.hpp" #include "randart_part_type.hpp" #include "spells2.hpp" diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc index 0f952ebb..223cf6d3 100644 --- a/src/squelch/rule.cc +++ b/src/squelch/rule.cc @@ -10,7 +10,6 @@ #include "../object2.hpp" #include "../object_flag.hpp" #include "../object_type.hpp" -#include "../quark.hpp" #include "../tables.hpp" #include "../util.hpp" #include "../variable.hpp" diff --git a/src/store.cc b/src/store.cc index a518677b..eb8f703c 100644 --- a/src/store.cc +++ b/src/store.cc @@ -24,7 +24,6 @@ #include "options.hpp" #include "owner_type.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "spell_type.hpp" #include "skills.hpp" #include "spells5.hpp" diff --git a/src/util.cc b/src/util.cc index 70cc3f4f..3c358052 100644 --- a/src/util.cc +++ b/src/util.cc @@ -17,7 +17,6 @@ #include "player_race.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" -#include "quark.hpp" #include "tables.h" #include "tables.hpp" #include "timer_type.hpp" diff --git a/src/xtra2.cc b/src/xtra2.cc index 4334b999..501d9693 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -42,7 +42,6 @@ #include "player_race_mod.hpp" #include "player_type.hpp" #include "point.hpp" -#include "quark.hpp" #include "randart.hpp" #include "skill_type.hpp" #include "skills.hpp" -- cgit v1.2.3 From 4fb8fb773d93efe1cdc812d1046c530c20098455 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:14 +0200 Subject: Remove dead code Fixes a few compiler warnings. --- src/bldg.cc | 4 ---- src/cmd5.cc | 1 - src/gods.cc | 1 - src/init1.cc | 5 ----- 4 files changed, 11 deletions(-) diff --git a/src/bldg.cc b/src/bldg.cc index ae64efaf..d465dbbe 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -1094,8 +1094,6 @@ bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ bool_ paid = FALSE; - bool_ set_reward = FALSE; - bool_ recreate = FALSE; @@ -1129,8 +1127,6 @@ bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ return FALSE; } - if (!bcost) set_reward = TRUE; - switch (bact) { case BACT_RESEARCH_ITEM: diff --git a/src/cmd5.cc b/src/cmd5.cc index 2fd9801e..e2c2e1b8 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -809,7 +809,6 @@ static std::tuple choose_monster_power(monster_race const *r_ptr, bool */ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_spell_idx) { - assert(monster_spell_idx >= 0); assert(monster_spell_idx < monster_spell_flag_set::nbits); /* Shorthand */ diff --git a/src/gods.cc b/src/gods.cc index f10209dc..7da62d7a 100644 --- a/src/gods.cc +++ b/src/gods.cc @@ -162,7 +162,6 @@ int wisdom_scale(int max) */ deity_type *god_at(byte god_idx) { - assert(god_idx >= 0); assert(god_idx < MAX_GODS); if (god_idx == 0) diff --git a/src/init1.cc b/src/init1.cc index 5395ed70..9fac93c9 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -913,7 +913,6 @@ static int read_ability(std::vector *abilities, char * errr init_player_info_txt(FILE *fp) { int i = 0; - int powers = 0; int lev = 1; int tit_idx = 0; char buf[1024]; @@ -1022,7 +1021,6 @@ errr init_player_info_txt(FILE *fp) rp_ptr->title = my_strdup(s); /* Initialize */ - powers = 0; lev = 1; /* Next... */ @@ -1245,7 +1243,6 @@ errr init_player_info_txt(FILE *fp) rmp_ptr->title = s; /* Initialize */ - powers = 0; lev = 1; /* Next... */ @@ -1503,7 +1500,6 @@ errr init_player_info_txt(FILE *fp) c_ptr->title = my_strdup(s); /* Initialize */ - powers = 0; lev = 1; tit_idx = 0; @@ -1911,7 +1907,6 @@ errr init_player_info_txt(FILE *fp) /* Append chars to the name */ strcpy(mc_ptr->name, s + 2); mc_ptr->color = color_char_to_attr(s[0]); - powers = 0; /* Next... */ continue; -- cgit v1.2.3 From c74773d0515b0aab305ec684caf827d5bfc6a172 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Add missing 'static' --- src/birth.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/birth.cc b/src/birth.cc index 4c75dcc0..0a80cf89 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3046,7 +3046,7 @@ static void validate_bg(void) /* * Initialize a random town */ -void init_town(int t_idx) +static void init_town(int t_idx) { town_type *t_ptr = &town_info[t_idx]; -- cgit v1.2.3 From 446e8bb30e8171988781722fff69b49e2b2d2e20 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Split loadsave:do_std_string --- src/loadsave.cc | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index b66aeb01..cf257849 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -270,30 +270,48 @@ static void do_string(char *str, int max, ls_flag_t flag) } } -static void do_std_string(std::string &s, ls_flag_t flag) +static void save_std_string(std::string const *s) +{ + // Length prefix. + u32b saved_size = s->size(); + do_u32b(&saved_size, ls_flag_t::SAVE); + // Save each character + for (auto c: *s) + { + sf_put(c); + } +} + +static std::string load_std_string() { // Length prefix. - u32b saved_size = s.size(); - do_u32b(&saved_size, flag); + u32b saved_size; + do_u32b(&saved_size, ls_flag_t::LOAD); // Convert to size_t std::size_t n = saved_size; - // Load/save goes a little differently since we cannot - // assume anything about 's' when loading. - if (flag == ls_flag_t::LOAD) + // Make sure we reserve space rather than resizing as we go. + std::string s; + s.reserve(n); + // Read each character + for (std::size_t i = 0; i < n; i++) { - s.clear(); - s.reserve(n); - for (std::size_t i = 0; i < n; i++) - { - s += sf_get(); - } + s += sf_get(); } - else + // Done + return s; +} + + +static void do_std_string(std::string &s, ls_flag_t flag) +{ + switch (flag) { - for (std::size_t i = 0; i < n; i++) - { - sf_put(s[i]); - } + case ls_flag_t::LOAD: + s = load_std_string(); + break; + case ls_flag_t::SAVE: + save_std_string(&s); + break; } } -- cgit v1.2.3 From 656d238d855e3d7640f10c6b0c1dc84380f50e94 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Use do_vector() for "powers" in loadsave.cc --- src/loadsave.cc | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index cf257849..c8b3e533 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -458,21 +458,7 @@ static void do_subrace(ls_flag_t flag) do_char(&sr_ptr->infra, flag); - { - u16b n = sr_ptr->ps.powers.size(); - - do_u16b(&n, flag); - - for (std::size_t i = 0; i < n; i++) - { - if (flag == ls_flag_t::LOAD) - { - sr_ptr->ps.powers.push_back(0); - } - - do_s16b(&sr_ptr->ps.powers[i], flag); - } - } + do_vector(flag, sr_ptr->ps.powers, do_s16b); for (i = 0; i < BODY_MAX; i++) { -- cgit v1.2.3 From 0a48c0f1af4b35338d2360f6efa4c467ec60b60d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Refactor messages.cc to use boost::circular_buffer We might as well delegate the massive implementation complexity and get rid of a ton of legacy code. --- src/CMakeLists.txt | 1 + src/cmd4.cc | 54 ++++---- src/init2.cc | 3 - src/loadsave.cc | 43 +++---- src/message.cc | 15 +++ src/message.hpp | 31 +++++ src/messages.cc | 370 +++++------------------------------------------------ src/messages.hpp | 25 +++- src/util.cc | 17 +++ src/util.hpp | 1 + src/xtra1.cc | 5 +- 11 files changed, 172 insertions(+), 393 deletions(-) create mode 100644 src/message.cc create mode 100644 src/message.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8991318d..7d64a66f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -43,6 +43,7 @@ SET(SRCS_COMMON lua_bind.cc melee1.cc melee2.cc + message.cc messages.cc mimic.cc modules.cc diff --git a/src/cmd4.cc b/src/cmd4.cc index 724d5a1f..12d47324 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -255,10 +255,12 @@ void do_cmd_change_name(void) */ void do_cmd_message_one(void) { - cptr msg = format("> %s", message_str(0)); + auto message = message_at(0); + + cptr msg = format("> %s", message.text_with_count().c_str()); /* Recall one message XXX XXX XXX */ - display_message(0, 0, strlen(msg), message_color(0), msg); + display_message(0, 0, strlen(msg), message.color, msg); } @@ -286,15 +288,8 @@ void do_cmd_messages(void) u32b q; int wid, hgt; - char shower[80]; - char finder[80]; - - /* Wipe finder */ - strcpy(finder, ""); - - /* Wipe shower */ - strcpy(shower, ""); - + /* String to highlight */ + std::string shower; /* Total messages */ n = message_num(); @@ -323,30 +318,30 @@ void do_cmd_messages(void) /* Dump up to 20 (or more in bigscreen) lines of messages */ for (j = 0; (j < (hgt - 4)) && (i + j < n); j++) { - cptr msg = message_str(i + j); - byte color = message_color(i + j); + auto message = message_at(i + j); + auto text = message.text_with_count(); + auto color = message.color; /* Apply horizontal scroll */ - msg = (strlen(msg) >= q) ? (msg + q) : ""; + text = (text.size() >= q) ? text.substr(q) : ""; /* Dump the messages, bottom to top */ - display_message(0, (hgt - 3) - j, strlen(msg), color, msg); + display_message(0, (hgt - 3) - j, text.size(), color, text.c_str()); /* Hilite "shower" */ if (shower[0]) { - cptr str = msg; - + std::size_t pos = 0; /* Display matches */ - while ((str = strstr(str, shower)) != NULL) + while ((pos = text.find(shower, pos)) != std::string::npos) { - int len = strlen(shower); + std::size_t len = shower.size(); /* Display the match */ - Term_putstr(str - msg, (hgt - 3) - j, len, TERM_YELLOW, shower); + Term_putstr(pos, (hgt - 3) - j, len, TERM_YELLOW, shower.c_str()); /* Advance */ - str += len; + pos += len; } } } @@ -394,7 +389,10 @@ void do_cmd_messages(void) prt("Show: ", hgt - 1, 0); /* Get a "shower" string, or continue */ - if (!askfor_aux(shower, 80)) continue; + if (!askfor_aux(&shower, 80)) + { + continue; + } /* Okay */ continue; @@ -409,18 +407,22 @@ void do_cmd_messages(void) prt("Find: ", hgt - 1, 0); /* Get a "finder" string, or continue */ - if (!askfor_aux(finder, 80)) continue; + auto finder = shower; + if (!askfor_aux(&finder, 80)) + { + continue; + } /* Show it */ - strcpy(shower, finder); + shower = finder; /* Scan messages */ for (z = i + 1; z < n; z++) { - cptr msg = message_str(z); + auto message = message_at(z); /* Search for it */ - if (strstr(msg, finder)) + if (message.text_with_count().find(finder) != std::string::npos) { /* New location */ i = z; diff --git a/src/init2.cc b/src/init2.cc index 8fc4bb07..77866648 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -648,9 +648,6 @@ static errr init_misc(void) /*** Prepare the various "bizarre" arrays ***/ - /* Initialize messages subsystem */ - message_init(); - /* Initialise the values */ process_dungeon_file("misc.txt", &ystart, &xstart, 0, 0, TRUE, FALSE); diff --git a/src/loadsave.cc b/src/loadsave.cc index c8b3e533..ce7dfdf8 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1943,43 +1943,38 @@ static bool_ do_inventory(ls_flag_t flag) } +static void do_message(message &msg, ls_flag_t flag) +{ + do_std_string(msg.text, flag); + do_u32b(&msg.count, flag); + do_byte(&msg.color, flag); +} + /* * Read the saved messages */ static void do_messages(ls_flag_t flag) { - int i; - char buf[128]; - byte color; - - s16b num; - - /* Total */ - if (flag == ls_flag_t::SAVE) num = message_num(); + /* Save/load number of messages */ + s16b num = message_num(); do_s16b(&num, flag); /* Read the messages */ - if (flag == ls_flag_t::LOAD) + for (int i = 0; i < num; i++) { - for (i = 0; i < num; i++) - { - /* Read the message */ - do_string(buf, 128, ls_flag_t::LOAD); - do_byte(&color, flag); + message message; - /* Save the message */ - message_add(buf, color); + if (flag == ls_flag_t::SAVE) + { + message = message_at(i); } - } - if (flag == ls_flag_t::SAVE) - { - byte holder; - for (i = num - 1; i >= 0; i--) + + do_message(message, flag); + + if (flag == ls_flag_t::LOAD) { - do_string((char *)message_str((s16b)i), 0, ls_flag_t::SAVE); - holder = message_color((s16b)i); - do_byte(&holder, flag); + message_add(message); } } } diff --git a/src/message.cc b/src/message.cc new file mode 100644 index 00000000..a0f46f22 --- /dev/null +++ b/src/message.cc @@ -0,0 +1,15 @@ +#include "message.hpp" + +#include + +std::string message::text_with_count() const +{ + if (count > 1) + { + return fmt::format("{} <{}x>", text, count); + } + else + { + return text; + } +} diff --git a/src/message.hpp b/src/message.hpp new file mode 100644 index 00000000..7b47a9db --- /dev/null +++ b/src/message.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "h-basic.h" + +#include + +/** + * Message + */ +struct message { + /** + * Message color. + */ + byte color = 0; + + /** + * Repetation count for this message. + */ + u32b count = 0; + + /** + * Message text. + */ + std::string text; + + /** + * Get message text with count + */ + std::string text_with_count() const; + +}; diff --git a/src/messages.cc b/src/messages.cc index a4ce949d..c2f8d079 100644 --- a/src/messages.cc +++ b/src/messages.cc @@ -1,10 +1,8 @@ #include "messages.hpp" -#include "tome/make_array.hpp" - -#include "z-term.h" -#include "z-form.h" -#include "z-util.h" +#include +#include +#include /* * OPTION: Maximum number of messages to remember (see "io.c") @@ -12,357 +10,57 @@ */ #define MESSAGE_MAX 2048 -/* - * OPTION: Maximum space for the message text buffer (see "io.c") - * Default: assume that each of the 2048 messages is repeated an - * average of three times, and has an average length of 48 - */ -#define MESSAGE_BUF 32768 - - - - -/* - * The next "free" index to use - */ -static u16b message__next; - -/* - * The index of the oldest message (none yet) - */ -static u16b message__last; - -/* - * The next "free" offset +/** + * Circular buffer for the messages */ -static u16b message__head; - -/* - * The offset to the oldest used char (none yet) - */ -static u16b message__tail; - -/* - * The array of offsets, by index [MESSAGE_MAX] - */ -static u16b *message__ptr; - -/* - * The array of colors, by index [MESSAGE_MAX] - */ -static byte *message__color; - -/* - * The array of message counts, by index [MESSAGE_MAX] - */ -static u16b *message__count; - -/* - * The array of chars, by offset [MESSAGE_BUF] - */ -static char *message__buf; - - -/* -* Second try for the "message" handling routines. -* -* Each call to "message_add(s)" will add a new "most recent" message -* to the "message recall list", using the contents of the string "s". -* -* The messages will be stored in such a way as to maximize "efficiency", -* that is, we attempt to maximize the number of sequential messages that -* can be retrieved, given a limited amount of storage space. -* -* We keep a buffer of chars to hold the "text" of the messages, not -* necessarily in "order", and an array of offsets into that buffer, -* representing the actual messages. This is made more complicated -* by the fact that both the array of indexes, and the buffer itself, -* are both treated as "circular arrays" for efficiency purposes, but -* the strings may not be "broken" across the ends of the array. -* -* The "message_add()" function is rather "complex", because it must be -* extremely efficient, both in space and time, for use with the Borg. -*/ - -void message_init() +static boost::circular_buffer *buffer() { - /* Message variables */ - message__ptr = make_array(MESSAGE_MAX); - message__color = make_array(MESSAGE_MAX); - message__count = make_array(MESSAGE_MAX); - message__buf = make_array(MESSAGE_BUF); - - /* Hack -- No messages yet */ - message__tail = MESSAGE_BUF; + static auto *instance = new boost::circular_buffer(MESSAGE_MAX); + return instance; } -/* -* How many messages are "available"? -*/ s16b message_num(void) { - int last, next, n; - - /* Extract the indexes */ - last = message__last; - next = message__next; - - /* Handle "wrap" */ - if (next < last) next += MESSAGE_MAX; - - /* Extract the space */ - n = (next - last); - - /* Return the result */ - return (n); -} - - - -/* -* Recall the "text" of a saved message -*/ -cptr message_str(int age) -{ - static char buf[1024]; - s16b x; - s16b o; - cptr s; - - /* Forgotten messages have no text */ - if ((age < 0) || (age >= message_num())) return (""); - - /* Acquire the "logical" index */ - x = (message__next + MESSAGE_MAX - (age + 1)) % MESSAGE_MAX; - - /* Get the "offset" for the message */ - o = message__ptr[x]; - - /* Access the message text */ - s = &message__buf[o]; - - /* Hack -- Handle repeated messages */ - if (message__count[x] > 1) - { - strnfmt(buf, 1024, "%s <%dx>", s, message__count[x]); - s = buf; - } - - /* Return the message text */ - return (s); + return buffer()->size(); } -/* -* Recall the color of a saved message -*/ -byte message_color(int age) +message const &message_at(int age) { - s16b x; - byte color = TERM_WHITE; + assert(age >= 0); + assert(age < message_num()); - /* Forgotten messages have no text */ - if ((age < 0) || (age >= message_num())) return (TERM_WHITE); + // Age indexes backward through history and is zero-based, so... + std::size_t i = buffer()->size() - 1 - age; - /* Acquire the "logical" index */ - x = (message__next + MESSAGE_MAX - (age + 1)) % MESSAGE_MAX; - - /* Get the "offset" for the message */ - color = message__color[x]; - - /* Return the message text */ - return (color); + // Get the message + return buffer()->at(i); } - -/* -* Add a new message, with great efficiency -*/ void message_add(cptr str, byte color) { - int i, k, x, n; - cptr s; - - - /*** Step 1 -- Analyze the message ***/ - - /* Hack -- Ignore "non-messages" */ - if (!str) return; + assert(str != nullptr); - /* Message length */ - n = strlen(str); + // Shorthand to avoid syntactic clutter + auto buf = buffer(); - /* Important Hack -- Ignore "long" messages */ - if (n >= MESSAGE_BUF / 4) return; - - - /*** Step 2 -- Handle repeated messages ***/ - - /* Acquire the "logical" last index */ - x = (message__next + MESSAGE_MAX - 1) % MESSAGE_MAX; - - /* Get the last message text */ - s = &message__buf[message__ptr[x]]; - - /* Last message repeated? */ - if (streq(str, s)) + // If the message is the same as the last message, + // we just increment the counter instead of adding + // the message. + if ((!buf->empty()) && (buf->back().text == str)) { - /* Increase the message count */ - message__count[x]++; - - /* Success */ - return; - } - - - /*** Step 3 -- Attempt to optimize ***/ - - /* Limit number of messages to check */ - k = message_num() / 4; - - /* Limit number of messages to check */ - if (k > MESSAGE_MAX / 32) k = MESSAGE_MAX / 32; - - /* Check the last few messages (if any to count) */ - for (i = message__next; k; k--) - { - u16b q; - - cptr old; - - /* Back up and wrap if needed */ - if (i-- == 0) i = MESSAGE_MAX - 1; - - /* Stop before oldest message */ - if (i == message__last) break; - - /* Extract "distance" from "head" */ - q = (message__head + MESSAGE_BUF - message__ptr[i]) % MESSAGE_BUF; - - /* Do not optimize over large distance */ - if (q > MESSAGE_BUF / 2) continue; - - /* Access the old string */ - old = &message__buf[message__ptr[i]]; - - /* Compare */ - if (!streq(old, str)) continue; - - /* Get the next message index, advance */ - x = message__next++; - - /* Handle wrap */ - if (message__next == MESSAGE_MAX) message__next = 0; - - /* Kill last message if needed */ - if (message__next == message__last) message__last++; - - /* Handle wrap */ - if (message__last == MESSAGE_MAX) message__last = 0; - - /* Assign the starting address */ - message__ptr[x] = message__ptr[i]; - message__color[x] = color; - message__count[x] = 1; - - /* Success */ + buf->back().count += 1; return; } + // Push onto the end of the buffer. + message message; + message.color = color; + message.count = 1; + message.text = str; + buf->push_back(message); +} - /*** Step 4 -- Ensure space before end of buffer ***/ - - /* Kill messages and Wrap if needed */ - if (message__head + n + 1 >= MESSAGE_BUF) - { - /* Kill all "dead" messages */ - for (i = message__last; TRUE; i++) - { - /* Wrap if needed */ - if (i == MESSAGE_MAX) i = 0; - - /* Stop before the new message */ - if (i == message__next) break; - - /* Kill "dead" messages */ - if (message__ptr[i] >= message__head) - { - /* Track oldest message */ - message__last = i + 1; - } - } - - /* Wrap "tail" if needed */ - if (message__tail >= message__head) message__tail = 0; - - /* Start over */ - message__head = 0; - } - - - /*** Step 5 -- Ensure space before next message ***/ - - /* Kill messages if needed */ - if (message__head + n + 1 > message__tail) - { - /* Grab new "tail" */ - message__tail = message__head + n + 1; - - /* Advance tail while possible past first "nul" */ - while (message__buf[message__tail - 1]) message__tail++; - - /* Kill all "dead" messages */ - for (i = message__last; TRUE; i++) - { - /* Wrap if needed */ - if (i == MESSAGE_MAX) i = 0; - - /* Stop before the new message */ - if (i == message__next) break; - - /* Kill "dead" messages */ - if ((message__ptr[i] >= message__head) && - (message__ptr[i] < message__tail)) - { - /* Track oldest message */ - message__last = i + 1; - } - } - } - - - /*** Step 6 -- Grab a new message index ***/ - - /* Get the next message index, advance */ - x = message__next++; - - /* Handle wrap */ - if (message__next == MESSAGE_MAX) message__next = 0; - - /* Kill last message if needed */ - if (message__next == message__last) message__last++; - - /* Handle wrap */ - if (message__last == MESSAGE_MAX) message__last = 0; - - - - /*** Step 7 -- Insert the message text ***/ - - /* Assign the starting address */ - message__ptr[x] = message__head; - message__color[x] = color; - message__count[x] = 1; - - /* Append the new part of the message */ - for (i = 0; i < n; i++) - { - /* Copy the message */ - message__buf[message__head + i] = str[i]; - } - - /* Terminate */ - message__buf[message__head + i] = '\0'; - - /* Advance the "head" pointer */ - message__head += n + 1; +void message_add(message const &message) +{ + buffer()->push_back(message); } diff --git a/src/messages.hpp b/src/messages.hpp index 22943ab9..99edd0e2 100644 --- a/src/messages.hpp +++ b/src/messages.hpp @@ -1,9 +1,28 @@ #pragma once #include "h-basic.h" +#include "message.hpp" -void message_init(); +/** + * Get the current number of messages. + */ s16b message_num(); -cptr message_str(int age); -byte message_color(int age); + +/** + * Get message of given age. Age must be + * in the half-open interval [0, message_num). + * + * The reference is only valid as long as + * no messages are added. + */ +message const &message_at(int age); + +/** + * Add a message. + */ void message_add(cptr msg, byte color); + +/** + * Add a message. + */ +void message_add(message const &); diff --git a/src/util.cc b/src/util.cc index 3c358052..6dfbca65 100644 --- a/src/util.cc +++ b/src/util.cc @@ -2352,6 +2352,23 @@ static int complete_command(char *buf, int clen, int mlen) } +extern bool askfor_aux(std::string *buf, std::size_t max_len) +{ + // Buffer + char cstr[1024]; + // Sanity + assert(max_len < sizeof(cstr)); + // Copy into temporary buffer + cstr[buf->size()] = '\0'; + buf->copy(cstr, std::string::npos); + // Delegate + bool result = askfor_aux(cstr, max_len); + // Copy back + (*buf) = cstr; + // Done + return result; +} + /* * Get some input at the cursor location. * Assume the buffer is initialized to a default string. diff --git a/src/util.hpp b/src/util.hpp index 2953ca11..eafe4f31 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -47,6 +47,7 @@ extern void text_out(cptr str); extern void text_out_c(byte a, cptr str); extern void clear_from(int row); extern int ask_menu(cptr ask, const std::vector &items); +extern bool askfor_aux(std::string *buf, std::size_t max_len); extern bool_ askfor_aux(char *buf, int len); extern bool_ askfor_aux_with_completion(char *buf, int len); extern bool_ get_string(cptr prompt, char *buf, int len); diff --git a/src/xtra1.cc b/src/xtra1.cc index e2ae994b..6005deee 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1224,8 +1224,11 @@ void fix_message(void) /* Dump messages */ for (i = 0; i < h; i++) { + auto message = message_at(i); + auto text_with_count = message.text_with_count(); + /* Dump the message on the appropriate line */ - display_message(0, (h - 1) - i, strlen(message_str((s16b)i)), message_color((s16b)i), message_str((s16b)i)); + display_message(0, (h - 1) - i, text_with_count.size(), message.color, text_with_count.c_str()); /* Cursor */ Term_locate(&x, &y); -- cgit v1.2.3 From 68c4fe1d6494fb6c92d117db170ea39831c16b00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Clean up do_stores() in loadsave.cc a little --- src/loadsave.cc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index ce7dfdf8..9b963cfd 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2041,35 +2041,33 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { - u16b real_max = 0; + // Indexes for "real" towns. + std::vector reals; + reals.reserve(max_towns); - /* Note that this forbids max_towns from shrinking, but that is fine */ - std::unique_ptr reals(new byte[max_towns]); - - /* Find the real towns */ + // Fill in the "real" towns if necessary. if (flag == ls_flag_t::SAVE) { for (int i = 1; i < max_towns; i++) { - if (!(town_info[i].flags & (TOWN_REAL))) continue; - reals[real_max++] = i; + if (!(town_info[i].flags & TOWN_REAL)) + { + continue; + } + reals.emplace_back(i); } } - do_u16b(&real_max, flag); - for (int i = 0; i < real_max; i++) - { - do_byte(&reals[i], flag); - } + + // Load/save + do_vector(flag, reals, do_byte); /* Read the stores */ u16b n_stores = max_st_idx; do_u16b(&n_stores, flag); assert(n_stores <= max_st_idx); - for (int i = 0; i < real_max; i++) + for (auto const z: reals) { - int z = reals[i]; - if (!town_info[z].stocked) { create_stores_stock(z); -- cgit v1.2.3 From be49084ba59b89c14f8b9f9e1274b013428d7205 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Clean up process_dungeon_file_aux() a little bit --- src/init1.cc | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 9fac93c9..c0835da0 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6837,29 +6837,32 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst /* Layout of the wilderness */ if (buf[2] == 'D') { - int x; - char i; - /* Acquire the text */ char *s = buf + 4; int y = *yval; - for (x = 0; x < max_wild_x; x++) + for (int x = 0; x < max_wild_x; x++) { - if (1 != sscanf(s + x, "%c", &i)) return (1); - wild_map[y][x].feat = wildc2i[(int)i]; + char i; + if (1 != sscanf(s + x, "%c", &i)) + { + return (1); + } + + auto const wi = wildc2i[(int)i]; + + wild_map[y][x].feat = wi; /* * If this is a town/dungeon entrance, note * its coordinates. (Have to check for * duplicate Morias...) */ - if (wf_info[wildc2i[(int)i]].entrance && - wf_info[wildc2i[(int)i]].wild_x == 0) + if (wf_info[wi].entrance && wf_info[wi].wild_x == 0) { - wf_info[wildc2i[(int)i]].wild_x = x; - wf_info[wildc2i[(int)i]].wild_y = y; + wf_info[wi].wild_x = x; + wf_info[wi].wild_y = y; } } -- cgit v1.2.3 From eea082ffd1a3ecf73b7c464cc28da5ef74d3a30f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Add grid<> template class for representing 2D grids --- src/CMakeLists.txt | 1 + src/grid.hpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/grid.cc | 52 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 src/grid.hpp create mode 100644 tests/grid.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7d64a66f..bf970c59 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -122,6 +122,7 @@ SET(SRCS_TESTS ../tests/harness.cc ../tests/lua_get_level.cc ../tests/flag_set.cc + ../tests/grid.cc ) ADD_LIBRARY(game diff --git a/src/grid.hpp b/src/grid.hpp new file mode 100644 index 00000000..4708811d --- /dev/null +++ b/src/grid.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include + +/** + * 2D grid of T's. + */ +template +struct grid { + +private: + boost::multi_array impl; + +public: + /** + * Get reference to tile. + */ + T &operator ()(std::size_t x, std::size_t y) + { + return impl[y][x]; + } + + /** + * Get const reference to tile. + */ + T const &operator ()(std::size_t x, std::size_t y) const + { + return impl[y][x]; + } + + /** + * Resize grid. There is no guarantee whether + * existing elements will be preserved or not. + */ + void resize(std::size_t width, std::size_t height) + { + impl.resize(boost::extents[height][width]); + } + + /** + * Get current width. + */ + std::size_t width() const + { + return impl.shape()[1]; + } + + /** + * Get current height. + */ + std::size_t height() const + { + return impl.shape()[0]; + } + + /** + * Set width. Same caveats apply as for resize(). + */ + void width(std::size_t width) + { + resize(width, height()); + } + + /** + * Set height. Same caveats apply as for resize(). + */ + void height(std::size_t height) + { + resize(width(), height); + } + +}; diff --git a/tests/grid.cc b/tests/grid.cc new file mode 100644 index 00000000..ff618088 --- /dev/null +++ b/tests/grid.cc @@ -0,0 +1,52 @@ +#include "grid.hpp" +#include +using namespace bandit; + +go_bandit([]() { + describe("grid<>", []() { + + auto w0 = size_t { 123 }; + auto h0 = size_t { 42 }; + + it("width(...) properly sets returned width", [&](){ + // Setup + grid g; + // Exercise + g.width(w0); + // Verify + AssertThat(g.width(), Equals(w0)); + }); + + it("height(...) properly sets returned height", [&](){ + // Setup + grid g; + // Exercise + g.height(h0); + // Verify + AssertThat(g.height(), Equals(h0)); + }); + + it("resize(w, h) properly sets returned width and height", [&](){ + // Setup + grid g; + // Exercise + g.resize(w0, h0); + // Verify + AssertThat(g.width(), Equals(w0)); + AssertThat(g.height(), Equals(h0)); + }); + + it("operator () can access ((w-1), (h-1)) element", [&](){ + // Class with 'magic' default value + struct X { int magic = 1001; }; + // Setup + grid g; + g.resize(w0 + 1, h0 + 1); + // Exercise + auto x = g(w0, h0); + // Verify + AssertThat(x.magic, Equals(1001)); + }); + + }); +}); -- cgit v1.2.3 From dc261d2c9732554d9f510e11711ac84d028e5ac1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Use grid<> for wilderness grid --- src/birth.cc | 12 +++--- src/cmd2.cc | 3 +- src/defines.h | 2 +- src/dungeon.cc | 10 +++-- src/files.cc | 6 ++- src/init1.cc | 14 ++++--- src/init2.cc | 12 ++---- src/loadsave.cc | 14 ++++--- src/monster1.cc | 3 +- src/q_god.cc | 16 ++++---- src/variable.cc | 8 +--- src/variable.hpp | 5 +-- src/wild.cc | 109 +++++++++++++++++++++++++++++++------------------------ src/wizard2.cc | 31 ++++++++++------ src/xtra1.cc | 6 ++- src/xtra2.cc | 7 ++-- 16 files changed, 142 insertions(+), 116 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 0a80cf89..53974938 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3191,13 +3191,15 @@ void player_birth(void) } /* Init wilderness seeds */ - for (i = 0; i < max_wild_x; i++) + auto &wilderness = *wilderness_ptr; + for (std::size_t y = 0; y < wilderness.height(); y++) { - for (j = 0; j < max_wild_y; j++) + for (std::size_t x = 0; x < wilderness.width(); x++) { - wild_map[j][i].seed = seed_t::system(); - wild_map[j][i].entrance = 0; - wild_map[j][i].known = FALSE; + auto &w = wilderness(x, y); + w.seed = seed_t::system(); + w.entrance = 0; + w.known = FALSE; } } } diff --git a/src/cmd2.cc b/src/cmd2.cc index b0c9e38e..947d2816 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -2549,8 +2549,9 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm) energy_use *= (p_ptr->wild_mode) ? ((MAX_HGT + MAX_WID) / 2) : 1; /* Hack again -- Is there a special encounter ??? */ + auto const &wilderness = *wilderness_ptr; if (p_ptr->wild_mode && - magik(wf_info[wild_map[p_ptr->py][p_ptr->px].feat].level - (p_ptr->lev * 2))) + magik(wf_info[wilderness(p_ptr->px, p_ptr->py).feat].level - (p_ptr->lev * 2))) { /* Go into large wilderness view */ p_ptr->wilderness_x = p_ptr->px; diff --git a/src/defines.h b/src/defines.h index b17403ef..19f2f8c3 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2463,7 +2463,7 @@ */ #define level_or_feat(DTYPE, DLEVEL) \ ((DTYPE) == DUNGEON_WILDERNESS ? \ - wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat : \ + (*wilderness_ptr)(p_ptr->wilderness_x, p_ptr->wilderness_y).feat : \ (DLEVEL) ) diff --git a/src/dungeon.cc b/src/dungeon.cc index 16b6bcc0..c6ec2889 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -3524,8 +3524,9 @@ static void process_command(void) /* Special cases */ else { - if ((wf_info[wild_map[p_ptr->py][p_ptr->px].feat].entrance >= 1000) || - (wild_map[p_ptr->py][p_ptr->px].entrance > 1000)) + auto const &wilderness = *wilderness_ptr; + auto const &tile = wilderness(p_ptr->px, p_ptr->py); + if ((wf_info[tile.feat].entrance >= 1000) || (tile.entrance > 1000)) { p_ptr->wilderness_x = p_ptr->px; p_ptr->wilderness_y = p_ptr->py; @@ -4295,7 +4296,10 @@ static void process_player(void) /* Hack -- mark current wilderness location as known */ if (!p_ptr->wild_mode && dun_level == 0) - wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].known = TRUE; + { + auto &wilderness = *wilderness_ptr; + wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).known = TRUE; + } /* Place the cursor on the player */ diff --git a/src/files.cc b/src/files.cc index 4e70acde..d055b32c 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2321,11 +2321,13 @@ void display_player(int mode) */ cptr describe_player_location() { + auto const &wilderness = *wilderness_ptr; + int i; static char desc[80]; int pwx = (p_ptr->wild_mode ? p_ptr->px : p_ptr->wilderness_x); int pwy = (p_ptr->wild_mode ? p_ptr->py : p_ptr->wilderness_y); - int feat = wild_map[pwy][pwx].feat; + int feat = wilderness(pwx, pwy).feat; if (dungeon_type != DUNGEON_WILDERNESS && dun_level > 0) { @@ -2362,7 +2364,7 @@ cptr describe_player_location() if (!wf_info[i].entrance) continue; /* Skip if we haven't seen it */ - if (!wild_map[wy][wx].known) continue; + if (!wilderness(wx, wy).known) continue; dist = distance(wy, wx, pwy, pwx); if (dist < l_dist || l_dist < 0) diff --git a/src/init1.cc b/src/init1.cc index c0835da0..3fb33179 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6363,6 +6363,8 @@ static dungeon_grid letter[255]; */ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax, bool_ full) { + auto &wilderness = *wilderness_ptr; + int i; char *zz[33]; @@ -6842,7 +6844,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst int y = *yval; - for (int x = 0; x < max_wild_x; x++) + for (std::size_t x = 0; x < wilderness.width(); x++) { char i; if (1 != sscanf(s + x, "%c", &i)) @@ -6852,7 +6854,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst auto const wi = wildc2i[(int)i]; - wild_map[y][x].feat = wi; + wilderness(x, y).feat = wi; /* * If this is a town/dungeon entrance, note @@ -6914,7 +6916,9 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst { if (tokenize(buf + 4, 3, zz, ':', '/') == 3) { - wild_map[atoi(zz[1])][atoi(zz[2])].entrance = 1000 + atoi(zz[0]); + int y = atoi(zz[1]); + int x = atoi(zz[2]); + wilderness(x, y).entrance = 1000 + atoi(zz[0]); } else { @@ -7104,13 +7108,13 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { - max_wild_x = atoi(zz[1]); + wilderness.width(atoi(zz[1])); } /* Maximum wilderness y size */ else if (zz[0][0] == 'Y') { - max_wild_y = atoi(zz[1]); + wilderness.height(atoi(zz[1])); } /* Maximum d_idx */ diff --git a/src/init2.cc b/src/init2.cc index 77866648..fa07bb02 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -723,15 +723,6 @@ void create_stores_stock(int t) */ static errr init_wilderness(void) { - /* Allocate the wilderness (two-dimension array) */ - wild_map = make_array(max_wild_y); - - /* Init the other pointers */ - for (std::size_t i = 0; i < max_wild_y; i++) - { - wild_map[i] = new wilderness_map[max_wild_x]; - } - /* No encounter right now */ generate_encounter = FALSE; @@ -1266,6 +1257,9 @@ void init_angband(void) (void)fd_close(fd); + /* Allocate the wilderness */ + wilderness_ptr = new grid(); + /*** Initialise some arrays ***/ /* Initialise misc. values */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 9b963cfd..9eb0b185 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2245,6 +2245,8 @@ static bool do_quests(ls_flag_t flag) static bool do_wilderness(ls_flag_t flag) { + auto &wilderness = *wilderness_ptr; + // Player position and "mode" wrt. wilderness do_s32b(&p_ptr->wilderness_x, flag); do_s32b(&p_ptr->wilderness_y, flag); @@ -2252,14 +2254,14 @@ static bool do_wilderness(ls_flag_t flag) do_bool(&p_ptr->old_wild_mode, flag); // Size of the wilderness - u16b wild_x_size = max_wild_x; - u16b wild_y_size = max_wild_y; + u16b wild_x_size = wilderness.width(); + u16b wild_y_size = wilderness.height(); do_u16b(&wild_x_size, flag); do_u16b(&wild_y_size, flag); if (flag == ls_flag_t::LOAD) { - if ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y)) + if ((wild_x_size > wilderness.width()) || (wild_y_size > wilderness.height())) { note("Wilderness is too big!"); return false; @@ -2267,11 +2269,11 @@ static bool do_wilderness(ls_flag_t flag) } // Save/load wilderness tile state - for (std::size_t i = 0; i < wild_x_size; i++) + for (std::size_t x = 0; x < wild_x_size; x++) { - for (std::size_t j = 0; j < wild_y_size; j++) + for (std::size_t y = 0; y < wild_y_size; y++) { - auto w = &wild_map[j][i]; + auto w = &wilderness(x, y); do_seed(&w->seed, flag); do_u16b(&w->entrance, flag); do_bool(&w->known, flag); diff --git a/src/monster1.cc b/src/monster1.cc index 9c838af9..ae54448c 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -1535,7 +1535,8 @@ void set_mon_num_hook(void) { if (!dun_level) { - switch (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].terrain_idx) + auto const &wilderness = *wilderness_ptr; + switch (wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat].terrain_idx) { case TERRAIN_TOWN: get_mon_num_hook = monster_town; diff --git a/src/q_god.cc b/src/q_god.cc index c5120da0..fc8a89f0 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -292,12 +292,14 @@ std::string quest_god_describe() static void quest_god_place_rand_dung() { + auto &wilderness = *wilderness_ptr; + int x = -1, y = -1, tries; /* erase old dungeon */ if (cquest_quests_given > 0) { - wild_map[cquest_dung_y][cquest_dung_x].entrance = 0; + wilderness(cquest_dung_x, cquest_dung_y).entrance = 0; /* erase old recall level */ max_dlv[DUNGEON_GOD] = 0; @@ -307,19 +309,17 @@ static void quest_god_place_rand_dung() tries = 1000; while (tries > 0) { - wilderness_map *w_ptr = NULL; - wilderness_type_info *wf_ptr = NULL; tries = tries - 1; /* get grid coordinates, within a range which prevents * dungeon being generated at the very edge of the * wilderness (would crash the game). */ - x = rand_range(1, max_wild_x-2); - y = rand_range(1, max_wild_y-2); + x = rand_range(1, wilderness.width()-2); + y = rand_range(1, wilderness.height()-2); /* Is there a town/dungeon/potentially impassable feature there, ? */ - w_ptr = &wild_map[y][x]; - wf_ptr = &wf_info[w_ptr->feat]; + wilderness_map const *w_ptr = &wilderness(x, y); + wilderness_type_info const *wf_ptr = &wf_info[w_ptr->feat]; if ((w_ptr->entrance != 0) || (wf_ptr->entrance != 0) || @@ -350,7 +350,7 @@ static void quest_god_place_rand_dung() } /* create god dungeon in that place */ - wild_map[y][x].entrance = 1000 + DUNGEON_GOD; + wilderness(x, y).entrance = 1000 + DUNGEON_GOD; /* set quest variables */ cquest_dung_x = x; diff --git a/src/variable.cc b/src/variable.cc index 51ec1333..e9557c6a 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -668,16 +668,10 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum size of the wilderness map - */ -u16b max_wild_x; -u16b max_wild_y; - /* * Wilderness map */ -wilderness_map **wild_map; +grid *wilderness_ptr; /* diff --git a/src/variable.hpp b/src/variable.hpp index 3385bebd..e305d6bd 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -13,6 +13,7 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "feature_type_fwd.hpp" +#include "grid.hpp" #include "hist_type_fwd.hpp" #include "meta_class_type_fwd.hpp" #include "monster_ego_fwd.hpp" @@ -207,9 +208,7 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_wild_x; -extern u16b max_wild_y; -extern wilderness_map **wild_map; +extern grid *wilderness_ptr; extern u16b max_ab_idx; extern u16b max_s_idx; extern u16b max_r_idx; diff --git a/src/wild.cc b/src/wild.cc index cbd899f7..55a03087 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -30,6 +30,7 @@ #include "wilderness_type_info.hpp" #include "z-rand.hpp" +#include #include @@ -154,13 +155,17 @@ static void plasma_recursive(int x1, int y1, int x2, int y2, */ static int generate_area(int y, int x, bool_ border, bool_ corner) { + auto const &wilderness = *wilderness_ptr; int road, entrance; int x1, y1; int hack_floor = 0; /* Number of the town (if any) */ - p_ptr->town_num = wf_info[wild_map[y][x].feat].entrance; - if (!p_ptr->town_num) p_ptr->town_num = wild_map[y][x].entrance; + p_ptr->town_num = wf_info[wilderness(x, y).feat].entrance; + if (!p_ptr->town_num) + { + p_ptr->town_num = wilderness(x, y).entrance; + } { int roughness = 1; /* The roughness of the level. */ @@ -172,22 +177,23 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) if (!p_ptr->oldpy) p_ptr->oldpy = MAX_HGT / 2; /* Initialize the terrain array */ - ym = ((y - 1) < 0) ? 0 : (y - 1); - xm = ((x - 1) < 0) ? 0 : (x - 1); - yp = ((y + 1) >= max_wild_y) ? (max_wild_y - 1) : (y + 1); - xp = ((x + 1) >= max_wild_x) ? (max_wild_x - 1) : (x + 1); - terrain[0][0] = wild_map[ym][xm].feat; - terrain[0][1] = wild_map[ym][x].feat; - terrain[0][2] = wild_map[ym][xp].feat; - terrain[1][0] = wild_map[y][xm].feat; - terrain[1][1] = wild_map[y][x].feat; - terrain[1][2] = wild_map[y][xp].feat; - terrain[2][0] = wild_map[yp][xm].feat; - terrain[2][1] = wild_map[yp][x].feat; - terrain[2][2] = wild_map[yp][xp].feat; + ym = std::max(y - 1, 0); + xm = std::max(x - 1, 0); + yp = std::min(y + 1, static_cast(wilderness.height()) - 1); + xp = std::min(x + 1, static_cast(wilderness.width()) - 1); + + terrain[0][0] = wilderness(xm, ym).feat; + terrain[0][1] = wilderness(x , ym).feat; + terrain[0][2] = wilderness(xp, ym).feat; + terrain[1][0] = wilderness(xm, y ).feat; + terrain[1][1] = wilderness(x , y ).feat; + terrain[1][2] = wilderness(xp, y ).feat; + terrain[2][0] = wilderness(xm, yp).feat; + terrain[2][1] = wilderness(x , yp).feat; + terrain[2][2] = wilderness(xp, yp).feat; /* Hack -- Induce consistant town layout */ - set_quick_rng(wild_map[y][x].seed); + set_quick_rng(wilderness(x, y).seed); /* Create level background */ for (y1 = 0; y1 < MAX_HGT; y1++) @@ -250,7 +256,7 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) * Place roads in the wilderness * ToDo: make the road a bit more interresting */ - road = wf_info[wild_map[y][x].feat].road; + road = wf_info[wilderness(x, y).feat].road; if (road & ROAD_NORTH) { @@ -294,10 +300,10 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) } /* Hack -- Induce consistant town layout */ - set_quick_rng(wild_map[y][x].seed); + set_quick_rng(wilderness(x, y).seed); - entrance = wf_info[wild_map[y][x].feat].entrance; - if (!entrance) entrance = wild_map[y][x].entrance; + entrance = wf_info[wilderness(x, y).feat].entrance; + if (!entrance) entrance = wilderness(x, y).entrance; /* Create the dungeon if requested on the map */ if (entrance >= 1000) @@ -332,11 +338,10 @@ static int generate_area(int y, int x, bool_ border, bool_ corner) hack_floor = 1; } - /* Set the monster generation level to the wilderness level */ - monster_level = wf_info[wild_map[y][x].feat].level; - - /* Set the object generation level to the wilderness level */ - object_level = wf_info[wild_map[y][x].feat].level; + /* Set the monster/object generation level to the wilderness level */ + auto const &wf = wf_info[wilderness(x, y).feat]; + monster_level = wf.level; + object_level = wf.level; return hack_floor; } @@ -570,14 +575,14 @@ void wilderness_gen() */ void wilderness_gen_small() { - int i, j, entrance; + auto const &wilderness = *wilderness_ptr; int xstart = 0; int ystart = 0; /* To prevent stupid things */ - for (i = 0; i < MAX_WID; i++) + for (int i = 0; i < MAX_WID; i++) { - for (j = 0; j < MAX_HGT; j++) + for (int j = 0; j < MAX_HGT; j++) { cave_set_feat(j, i, FEAT_EKKAIA); } @@ -587,31 +592,35 @@ void wilderness_gen_small() process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE); /* Fill the map */ - for (i = 0; i < max_wild_x; i++) + for (std::size_t x = 0; x < wilderness.width(); x++) { - for (j = 0; j < max_wild_y; j++) + for (std::size_t y = 0; y < wilderness.height(); y++) { - entrance = wf_info[wild_map[j][i].feat].entrance; - if (!entrance) entrance = wild_map[j][i].entrance; + auto const &wm = wilderness(x, y); + + int entrance = wf_info[wm.feat].entrance; + if (!entrance) entrance = wm.entrance; - if (wild_map[j][i].entrance) + if (wm.entrance) { - cave_set_feat(j, i, FEAT_MORE); + cave_set_feat(y, x, FEAT_MORE); } else { - cave_set_feat(j, i, wf_info[wild_map[j][i].feat].feat); + cave_set_feat(y, x, wf_info[wm.feat].feat); } - if ((cave[j][i].feat == FEAT_MORE) && (entrance >= 1000)) + auto &cv = cave[y][x]; + + if ((cv.feat == FEAT_MORE) && (entrance >= 1000)) { - cave[j][i].special = entrance - 1000; + cv.special = entrance - 1000; } /* Show it if we know it */ - if (wild_map[j][i].known) + if (wm.known) { - cave[j][i].info |= (CAVE_GLOW | CAVE_MARK); + cv.info |= (CAVE_GLOW | CAVE_MARK); } } } @@ -621,7 +630,7 @@ void wilderness_gen_small() p_ptr->py = p_ptr->wilderness_y; /* Set rewarded quests to finished */ - for (i = 0; i < MAX_Q_IDX; i++) + for (int i = 0; i < MAX_Q_IDX; i++) { if (quest[i].status == QUEST_STATUS_REWARDED) { @@ -636,26 +645,30 @@ void wilderness_gen_small() /* Show a small radius of wilderness around the player */ void reveal_wilderness_around_player(int y, int x, int h, int w) { - int i, j; + auto &wilderness = *wilderness_ptr; /* Circle or square ? */ if (h == 0) { - for (i = x - w; i < x + w; i++) + for (int i = x - w; i < x + w; i++) { - for (j = y - w; j < y + w; j++) + for (int j = y - w; j < y + w; j++) { /* Bound checking */ if (!in_bounds(j, i)) continue; /* Severe bound checking */ - if ((i < 0) || (i >= max_wild_x) || (j < 0) || (j >= max_wild_y)) continue; + if ((i < 0) || (static_cast(i) >= wilderness.width()) || + (j < 0) || (static_cast(j) >= wilderness.height())) + { + continue; + } /* We want a radius, not a "squarus" :) */ if (distance(y, x, j, i) >= w) continue; /* New we know here */ - wild_map[j][i].known = TRUE; + wilderness(i, j).known = TRUE; /* Only if we are in overview */ if (p_ptr->wild_mode) @@ -670,15 +683,15 @@ void reveal_wilderness_around_player(int y, int x, int h, int w) } else { - for (i = x; i < x + w; i++) + for (int i = x; i < x + w; i++) { - for (j = y; j < y + h; j++) + for (int j = y; j < y + h; j++) { /* Bound checking */ if (!in_bounds(j, i)) continue; /* New we know here */ - wild_map[j][i].known = TRUE; + wilderness(i, j).known = TRUE; /* Only if we are in overview */ if (p_ptr->wild_mode) diff --git a/src/wizard2.cc b/src/wizard2.cc index 266fc353..786ca796 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -80,26 +80,33 @@ static void wiz_align_monster(int status) */ static void teleport_player_town(int town) { - int x = 0, y = 0; - autosave_checkpoint(); /* Change town */ dun_level = 0; p_ptr->town_num = town; - for (x = 0; x < max_wild_x; x++) - for (y = 0; y < max_wild_y; y++) - if (p_ptr->town_num == wf_info[wild_map[y][x].feat].entrance) goto finteletown; -finteletown: - p_ptr->wilderness_y = y; - p_ptr->wilderness_x = x; + auto const &wilderness = *wilderness_ptr; + for (std::size_t y = 0; y < wilderness.height(); y++) + { + for (std::size_t x = 0; x < wilderness.width(); x++) + { + if (p_ptr->town_num == wf_info[wilderness(x, y).feat].entrance) + { + p_ptr->wilderness_y = y; + p_ptr->wilderness_x = x; - leaving_quest = p_ptr->inside_quest; - p_ptr->inside_quest = 0; + leaving_quest = p_ptr->inside_quest; + p_ptr->inside_quest = 0; - /* Leaving */ - p_ptr->leaving = TRUE; + /* Leaving */ + p_ptr->leaving = TRUE; + + // Done + return; + } + } + } } diff --git a/src/xtra1.cc b/src/xtra1.cc index 6005deee..6891c801 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -559,9 +559,11 @@ static void prt_depth(int row, int col) } else if (!dun_level) { - if (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name) + auto const &wilderness = *wilderness_ptr; + auto const &wf = wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat]; + if (wf.name) { - strcpy(depths, wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].name); + strcpy(depths, wf.name); } else { diff --git a/src/xtra2.cc b/src/xtra2.cc index 501d9693..5e53d945 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -4237,10 +4237,11 @@ static int target_set_aux(int y, int x, int mode, cptr info) if (p_ptr->wild_mode && (feat == FEAT_TOWN)) { + auto const &wilderness = *wilderness_ptr; + auto const &wf = wf_info[wilderness(x, y).feat]; + s3 = ""; - name = format("%s(%s)", - wf_info[wild_map[y][x].feat].name, - wf_info[wild_map[y][x].feat].text); + name = format("%s(%s)", wf.name, wf.text); } if ((feat == FEAT_FOUNTAIN) && (c_ptr->info & CAVE_IDNT)) -- cgit v1.2.3 From 5eec61dd05577623c1d5b9eed3a22d1352dcd990 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Introduce Game struct Motivation: SIOF is such a huge chore to work around at this point that it's probably best to just start the looong task of getting rid of the globals. Currently we allocate a single global Game instance which we leak. The idea here is to start moving global game state into the single global Game singleton and eventually allocating the Game variable on the stack such that everything works out nicely wrt. freeing allocated memory and such. Once all the game state has been moved into Game we can start plumbing all the functions, classes, &c such that we don't have to reference game state via the "game" global. --- src/CMakeLists.txt | 1 + src/game.cc | 3 +++ src/game.hpp | 15 +++++++++++++++ src/game_fwd.hpp | 4 ++++ src/init2.cc | 2 ++ 5 files changed, 25 insertions(+) create mode 100644 src/game.cc create mode 100644 src/game.hpp create mode 100644 src/game_fwd.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bf970c59..5f06bcec 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ SET(SRCS_COMMON dice.cc dungeon.cc files.cc + game.cc gen_evol.cc gen_maze.cc generate.cc diff --git a/src/game.cc b/src/game.cc new file mode 100644 index 00000000..284c9ccc --- /dev/null +++ b/src/game.cc @@ -0,0 +1,3 @@ +#include "game.hpp" + +Game *game; diff --git a/src/game.hpp b/src/game.hpp new file mode 100644 index 00000000..e0ebb9ea --- /dev/null +++ b/src/game.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "game_fwd.hpp" + +/** + * All structures for the game itself. + */ +struct Game { + +}; + +/** + * Game instance + */ +extern Game *game; diff --git a/src/game_fwd.hpp b/src/game_fwd.hpp new file mode 100644 index 00000000..840e5f3b --- /dev/null +++ b/src/game_fwd.hpp @@ -0,0 +1,4 @@ +#pragma once + +struct Game; +extern Game *game; diff --git a/src/init2.cc b/src/init2.cc index fa07bb02..7cb3a5cd 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -1256,6 +1256,8 @@ void init_angband(void) /* Close it */ (void)fd_close(fd); + // Initialize game structure + game = new Game(); /* Allocate the wilderness */ wilderness_ptr = new grid(); -- cgit v1.2.3 From 05cdb1a997cba7748f0089cffa0a5885ca0b2c43 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Move wilderness structure into Game --- src/birth.cc | 3 ++- src/cmd2.cc | 3 ++- src/defines.h | 2 +- src/dungeon.cc | 5 +++-- src/files.cc | 3 ++- src/game.hpp | 7 +++++++ src/generate.cc | 1 + src/init1.cc | 3 ++- src/init2.cc | 4 +--- src/loadsave.cc | 3 ++- src/monster1.cc | 3 ++- src/monster2.cc | 1 + src/object2.cc | 1 + src/q_god.cc | 3 ++- src/variable.cc | 6 ------ src/variable.hpp | 3 --- src/wild.cc | 7 ++++--- src/wizard2.cc | 3 ++- src/xtra1.cc | 3 ++- src/xtra2.cc | 3 ++- 20 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 53974938..06c2115e 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -16,6 +16,7 @@ #include "dungeon_info_type.hpp" #include "files.h" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "help.hpp" #include "hist_type.hpp" @@ -3191,7 +3192,7 @@ void player_birth(void) } /* Init wilderness seeds */ - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; for (std::size_t y = 0; y < wilderness.height(); y++) { for (std::size_t x = 0; x < wilderness.width(); x++) diff --git a/src/cmd2.cc b/src/cmd2.cc index 947d2816..eccf37f0 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -17,6 +17,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hook_chat_in.hpp" #include "hook_enter_dungeon_in.hpp" @@ -2549,7 +2550,7 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm) energy_use *= (p_ptr->wild_mode) ? ((MAX_HGT + MAX_WID) / 2) : 1; /* Hack again -- Is there a special encounter ??? */ - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; if (p_ptr->wild_mode && magik(wf_info[wilderness(p_ptr->px, p_ptr->py).feat].level - (p_ptr->lev * 2))) { diff --git a/src/defines.h b/src/defines.h index 19f2f8c3..082fb291 100644 --- a/src/defines.h +++ b/src/defines.h @@ -2463,7 +2463,7 @@ */ #define level_or_feat(DTYPE, DLEVEL) \ ((DTYPE) == DUNGEON_WILDERNESS ? \ - (*wilderness_ptr)(p_ptr->wilderness_x, p_ptr->wilderness_y).feat : \ + (game->wilderness)(p_ptr->wilderness_x, p_ptr->wilderness_y).feat : \ (DLEVEL) ) diff --git a/src/dungeon.cc b/src/dungeon.cc index c6ec2889..92f5862e 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -26,6 +26,7 @@ #include "feature_type.hpp" #include "files.h" #include "files.hpp" +#include "game.hpp" #include "generate.hpp" #include "gen_evol.hpp" #include "gods.hpp" @@ -3524,7 +3525,7 @@ static void process_command(void) /* Special cases */ else { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; auto const &tile = wilderness(p_ptr->px, p_ptr->py); if ((wf_info[tile.feat].entrance >= 1000) || (tile.entrance > 1000)) { @@ -4297,7 +4298,7 @@ static void process_player(void) /* Hack -- mark current wilderness location as known */ if (!p_ptr->wild_mode && dun_level == 0) { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).known = TRUE; } diff --git a/src/files.cc b/src/files.cc index d055b32c..91795af3 100644 --- a/src/files.cc +++ b/src/files.cc @@ -15,6 +15,7 @@ #include "cmd3.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hiscore.hpp" #include "hook_chardump_in.hpp" #include "hooks.hpp" @@ -2321,7 +2322,7 @@ void display_player(int mode) */ cptr describe_player_location() { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; int i; static char desc[80]; diff --git a/src/game.hpp b/src/game.hpp index e0ebb9ea..03db8a45 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -1,12 +1,19 @@ #pragma once #include "game_fwd.hpp" +#include "grid.hpp" +#include "wilderness_map.hpp" /** * All structures for the game itself. */ struct Game { + /* + * Wilderness map + */ + grid wilderness; + }; /** diff --git a/src/generate.cc b/src/generate.cc index 573a58f6..752b0f53 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -15,6 +15,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_build_room1_in.hpp" #include "hooks.hpp" #include "init1.hpp" diff --git a/src/init1.cc b/src/init1.cc index 3fb33179..fa99031f 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -11,6 +11,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hist_type.hpp" #include "init2.hpp" @@ -6363,7 +6364,7 @@ static dungeon_grid letter[255]; */ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax, bool_ full) { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; int i; diff --git a/src/init2.cc b/src/init2.cc index 7cb3a5cd..57f3255c 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -11,6 +11,7 @@ #include "ego_item_type.hpp" #include "files.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "generate.hpp" #include "gen_evol.hpp" #include "gen_maze.hpp" @@ -1259,9 +1260,6 @@ void init_angband(void) // Initialize game structure game = new Game(); - /* Allocate the wilderness */ - wilderness_ptr = new grid(); - /*** Initialise some arrays ***/ /* Initialise misc. values */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 9eb0b185..22708203 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -6,6 +6,7 @@ #include "cave_type.hpp" #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" +#include "game.hpp" #include "init1.hpp" #include "init2.hpp" #include "levels.hpp" @@ -2245,7 +2246,7 @@ static bool do_quests(ls_flag_t flag) static bool do_wilderness(ls_flag_t flag) { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; // Player position and "mode" wrt. wilderness do_s32b(&p_ptr->wilderness_x, flag); diff --git a/src/monster1.cc b/src/monster1.cc index ae54448c..6d913367 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -9,6 +9,7 @@ #include "monster1.hpp" #include "cave_type.hpp" +#include "game.hpp" #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" @@ -1535,7 +1536,7 @@ void set_mon_num_hook(void) { if (!dun_level) { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; switch (wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat].terrain_idx) { case TERRAIN_TOWN: diff --git a/src/monster2.cc b/src/monster2.cc index 4eb6a618..3ca14275 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -14,6 +14,7 @@ #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hook_new_monster_in.hpp" #include "hook_new_monster_end_in.hpp" #include "hooks.hpp" diff --git a/src/object2.cc b/src/object2.cc index f96426fb..98487e46 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -19,6 +19,7 @@ #include "ego_item_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hooks.hpp" #include "mimic.hpp" #include "monster2.hpp" diff --git a/src/q_god.cc b/src/q_god.cc index fc8a89f0..f5e182cc 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -5,6 +5,7 @@ #include "dungeon_info_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_chardump_in.hpp" #include "hook_get_in.hpp" #include "hook_enter_dungeon_in.hpp" @@ -292,7 +293,7 @@ std::string quest_god_describe() static void quest_god_place_rand_dung() { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; int x = -1, y = -1, tries; diff --git a/src/variable.cc b/src/variable.cc index e9557c6a..91cb2a08 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -668,12 +668,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Wilderness map - */ -grid *wilderness_ptr; - - /* * Maximum number of skills in s_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index e305d6bd..1a789747 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -13,7 +13,6 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "feature_type_fwd.hpp" -#include "grid.hpp" #include "hist_type_fwd.hpp" #include "meta_class_type_fwd.hpp" #include "monster_ego_fwd.hpp" @@ -48,7 +47,6 @@ #include "trap_type_fwd.hpp" #include "tval_desc.hpp" #include "vault_type_fwd.hpp" -#include "wilderness_map_fwd.hpp" #include "wilderness_type_info_fwd.hpp" #include "seed.hpp" @@ -208,7 +206,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern grid *wilderness_ptr; extern u16b max_ab_idx; extern u16b max_s_idx; extern u16b max_r_idx; diff --git a/src/wild.cc b/src/wild.cc index 55a03087..78a29f56 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -12,6 +12,7 @@ #include "cave_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_wild_gen_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -155,7 +156,7 @@ static void plasma_recursive(int x1, int y1, int x2, int y2, */ static int generate_area(int y, int x, bool_ border, bool_ corner) { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; int road, entrance; int x1, y1; int hack_floor = 0; @@ -575,7 +576,7 @@ void wilderness_gen() */ void wilderness_gen_small() { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; int xstart = 0; int ystart = 0; @@ -645,7 +646,7 @@ void wilderness_gen_small() /* Show a small radius of wilderness around the player */ void reveal_wilderness_around_player(int y, int x, int h, int w) { - auto &wilderness = *wilderness_ptr; + auto &wilderness = game->wilderness; /* Circle or square ? */ if (h == 0) diff --git a/src/wizard2.cc b/src/wizard2.cc index 786ca796..359d5c5a 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -15,6 +15,7 @@ #include "corrupt.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -86,7 +87,7 @@ static void teleport_player_town(int town) dun_level = 0; p_ptr->town_num = town; - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; for (std::size_t y = 0; y < wilderness.height(); y++) { for (std::size_t x = 0; x < wilderness.width(); x++) diff --git a/src/xtra1.cc b/src/xtra1.cc index 6891c801..c8fdb2e0 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -16,6 +16,7 @@ #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hook_calculate_hp_in.hpp" #include "hook_calculate_hp_out.hpp" @@ -559,7 +560,7 @@ static void prt_depth(int row, int col) } else if (!dun_level) { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; auto const &wf = wf_info[wilderness(p_ptr->wilderness_x, p_ptr->wilderness_y).feat]; if (wf.name) { diff --git a/src/xtra2.cc b/src/xtra2.cc index 5e53d945..b5ad738a 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -17,6 +17,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hook_player_level_in.hpp" #include "hook_monster_death_in.hpp" @@ -4237,7 +4238,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) if (p_ptr->wild_mode && (feat == FEAT_TOWN)) { - auto const &wilderness = *wilderness_ptr; + auto const &wilderness = game->wilderness; auto const &wf = wf_info[wilderness(x, y).feat]; s3 = ""; -- cgit v1.2.3 From 8bf363159104aa0c87d8021e731022c41df8037f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Remove init_wilderness() --- src/init2.cc | 15 --------------- src/variable.cc | 2 +- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 57f3255c..9d2a9d84 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -719,17 +719,6 @@ void create_stores_stock(int t) t_ptr->stocked = TRUE; } -/* - * Initialise wilderness map array - */ -static errr init_wilderness(void) -{ - /* No encounter right now */ - generate_encounter = FALSE; - - return 0; -} - /* * Initialise some other arrays */ @@ -1348,10 +1337,6 @@ void init_angband(void) note("[Initialising arrays... (wilderness features)]"); if (init_x_info()) quit("Cannot initialise wilderness features"); - /* Initialise wilderness map array */ - note("[Initialising arrays... (wilderness map)]"); - if (init_wilderness()) quit("Cannot initialise wilderness map"); - /* Initialise town array */ note("[Initialising arrays... (towns)]"); if (init_towns()) quit("Cannot initialise towns"); diff --git a/src/variable.cc b/src/variable.cc index 91cb2a08..553c1dd2 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -832,7 +832,7 @@ s16b *max_dlv; s16b doppleganger; /* To allow wilderness encounters */ -bool_ generate_encounter; +bool_ generate_encounter = FALSE; /* * Such an ugly hack ... -- cgit v1.2.3 From b85a1f777946af3ba763942ee78a7a4bce2afdb0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Move player_hp[] into Game --- src/birth.cc | 80 +++++++++++++++++++++++++++++++++----------------------- src/birth.hpp | 2 ++ src/game.hpp | 11 +++++++- src/loadsave.cc | 2 ++ src/variable.cc | 8 ------ src/variable.hpp | 1 - src/wizard2.cc | 31 +++++----------------- src/xtra1.cc | 8 +++--- 8 files changed, 71 insertions(+), 72 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 06c2115e..25b1beff 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -59,6 +59,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include /* @@ -442,13 +443,53 @@ static void get_stats(void) /* - * Roll for some info that the auto-roller ignores + * Roll for player HP */ -static void get_extra(void) +void roll_player_hp() { - int i, j, min_value, max_value; + auto &player_hp = game->player_hp; + + // Minimum hitpoints at highest level + int const min_value = + (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8 + PY_MAX_LEVEL; + + // Maximum hitpoints at highest level + int const max_value = + (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8 + PY_MAX_LEVEL; + + // Pre-calculate level 1 hitdice; first roll is always maximal + player_hp[0] = p_ptr->hitdie; + + // Roll out the hitpoints + while (true) + { + // Roll the hitpoint values + std::generate( + player_hp.begin() + 1, + player_hp.end(), + []() { return randint(p_ptr->hitdie); }); + // Sum along + std::partial_sum( + player_hp.begin(), + player_hp.end(), + player_hp.begin()); + // Require "valid" hitpoints at highest level + if (player_hp.back() < min_value) continue; + if (player_hp.back() > max_value) continue; + + // Acceptable + break; + } +} + + +/* + * Roll for some info that the auto-roller ignores + */ +static void get_extra(void) +{ /* Level one */ p_ptr->max_plv = p_ptr->lev = 1; @@ -464,37 +505,10 @@ static void get_extra(void) /* Initial hitpoints */ p_ptr->mhp = p_ptr->hitdie; - /* Minimum hitpoints at highest level */ - min_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 3) / 8; - min_value += PY_MAX_LEVEL; - - /* Maximum hitpoints at highest level */ - max_value = (PY_MAX_LEVEL * (p_ptr->hitdie - 1) * 5) / 8; - max_value += PY_MAX_LEVEL; - - /* Pre-calculate level 1 hitdice */ - player_hp[0] = p_ptr->hitdie; - - /* Roll out the hitpoints */ - while (TRUE) - { - /* Roll the hitpoint values */ - for (i = 1; i < PY_MAX_LEVEL; i++) - { - j = randint(p_ptr->hitdie); - player_hp[i] = player_hp[i - 1] + j; - } - - /* XXX Could also require acceptable "mid-level" hitpoints */ - - /* Require "valid" hitpoints at highest level */ - if (player_hp[PY_MAX_LEVEL - 1] < min_value) continue; - if (player_hp[PY_MAX_LEVEL - 1] > max_value) continue; - - /* Acceptable */ - break; - } + /* Roll for HP */ + roll_player_hp(); + /* Set tactics and movement */ p_ptr->tactic = 4; p_ptr->movement = 4; } diff --git a/src/birth.hpp b/src/birth.hpp index af361499..7c171610 100644 --- a/src/birth.hpp +++ b/src/birth.hpp @@ -7,3 +7,5 @@ extern void save_savefile_names(void); extern bool_ begin_screen(void); extern void player_birth(void); extern bool_ no_begin_screen; + +void roll_player_hp(); diff --git a/src/game.hpp b/src/game.hpp index 03db8a45..b4894fd6 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -2,6 +2,8 @@ #include "game_fwd.hpp" #include "grid.hpp" +#include "h-basic.h" +#include "player_defs.hpp" #include "wilderness_map.hpp" /** @@ -9,11 +11,18 @@ */ struct Game { - /* + /** * Wilderness map */ grid wilderness; + /** + * Player's un-adjusted HP at every level. + * Stored to avoid shenanigans with draininging levels + * and restoring them back, &c. + */ + std::array player_hp { }; + }; /** diff --git a/src/loadsave.cc b/src/loadsave.cc index 22708203..bbcc8784 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2409,6 +2409,8 @@ static bool do_floor_inscriptions(ls_flag_t flag) static bool do_player_hd(ls_flag_t flag) { + auto &player_hp = game->player_hp; + u16b max_level = PY_MAX_LEVEL; do_u16b(&max_level, flag); diff --git a/src/variable.cc b/src/variable.cc index 553c1dd2..941bc9a0 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -437,14 +437,6 @@ player_class *cp_ptr; player_spec *spp_ptr; -/* - * Calculated base hp values for player at each level, - * store them so that drain life + restore life does not - * affect hit points. Also prevents shameless use of backup - * savefiles for hitpoint acquirement. - */ -s16b player_hp[PY_MAX_LEVEL]; - /* * The vault generation arrays */ diff --git a/src/variable.hpp b/src/variable.hpp index 1a789747..20dcbaea 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -169,7 +169,6 @@ extern player_race *rp_ptr; extern player_race_mod *rmp_ptr; extern player_class *cp_ptr; extern player_spec *spp_ptr; -extern s16b player_hp[PY_MAX_LEVEL]; extern char player_name[32]; extern char player_base[32]; extern ability_type *ab_info; diff --git a/src/wizard2.cc b/src/wizard2.cc index 359d5c5a..dd0d50e8 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -9,6 +9,7 @@ #include "wizard2.hpp" #include "artifact_type.hpp" +#include "birth.hpp" #include "cave.hpp" #include "cave_type.hpp" #include "cmd4.hpp" @@ -116,32 +117,14 @@ static void teleport_player_town(int town) */ void do_cmd_rerate(void) { - int min_value, max_value, i, percent; + auto &player_hp = game->player_hp; - min_value = (PY_MAX_LEVEL * 3 * (p_ptr->hitdie - 1)) / 8; - min_value += PY_MAX_LEVEL; + // Force HP re-roll + roll_player_hp(); - max_value = (PY_MAX_LEVEL * 5 * (p_ptr->hitdie - 1)) / 8; - max_value += PY_MAX_LEVEL; - - player_hp[0] = p_ptr->hitdie; - - /* Rerate */ - while (1) - { - /* Collect values */ - for (i = 1; i < PY_MAX_LEVEL; i++) - { - player_hp[i] = randint(p_ptr->hitdie); - player_hp[i] += player_hp[i - 1]; - } - - /* Legal values */ - if ((player_hp[PY_MAX_LEVEL - 1] >= min_value) && - (player_hp[PY_MAX_LEVEL - 1] <= max_value)) break; - } - - percent = (int)(((long)player_hp[PY_MAX_LEVEL - 1] * 200L) / + // Calculate life rating + int percent = static_cast( + (static_cast(player_hp[PY_MAX_LEVEL - 1]) * 200L) / (p_ptr->hitdie + ((PY_MAX_LEVEL - 1) * p_ptr->hitdie))); /* Update and redraw hitpoints */ diff --git a/src/xtra1.cc b/src/xtra1.cc index c8fdb2e0..b4f2adf6 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1841,15 +1841,13 @@ static void calc_mana(void) */ void calc_hitpoints(void) { - int bonus, mhp; + auto const &player_hp = game->player_hp; /* Un-inflate "half-hitpoint bonus per level" value */ - bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128); + int const bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128); /* Calculate hitpoints */ - assert(p_ptr->lev - 1 >= 0); - assert(p_ptr->lev - 1 < PY_MAX_LEVEL); - mhp = player_hp[p_ptr->lev - 1] + (bonus * p_ptr->lev / 2); + int mhp = player_hp[p_ptr->lev - 1] + (bonus * p_ptr->lev / 2); /* Always have at least one hitpoint per level */ if (mhp < p_ptr->lev + 1) mhp = p_ptr->lev + 1; -- cgit v1.2.3 From 3d617a0320d126715173681cb10ce7f6b80daff9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:15 +0200 Subject: Move tvals[] to tables.cc --- src/tables.cc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tables.hpp | 1 + src/variable.cc | 53 ----------------------------------------------------- src/variable.hpp | 2 -- 4 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/tables.cc b/src/tables.cc index 7f7a7b8e..54be6b45 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -3770,6 +3770,60 @@ monster_power monster_powers[] = { SF_S_WRAITH_IDX, "Summon Wraith", 90, TRUE }, }; + +/* + * A list of tvals and their textual names + */ +tval_desc tvals[] = +{ + { TV_SWORD, "Sword" }, + { TV_POLEARM, "Polearm" }, + { TV_HAFTED, "Hafted Weapon" }, + { TV_AXE, "Axe" }, + { TV_BOW, "Bow" }, + { TV_BOOMERANG, "Boomerang" }, + { TV_ARROW, "Arrows" }, + { TV_BOLT, "Bolts" }, + { TV_SHOT, "Shots" }, + { TV_SHIELD, "Shield" }, + { TV_CROWN, "Crown" }, + { TV_HELM, "Helm" }, + { TV_GLOVES, "Gloves" }, + { TV_BOOTS, "Boots" }, + { TV_CLOAK, "Cloak" }, + { TV_DRAG_ARMOR, "Dragon Scale Mail" }, + { TV_HARD_ARMOR, "Hard Armor" }, + { TV_SOFT_ARMOR, "Soft Armor" }, + { TV_RING, "Ring" }, + { TV_AMULET, "Amulet" }, + { TV_LITE, "Lite" }, + { TV_POTION, "Potion" }, + { TV_POTION2, "Potion" }, + { TV_SCROLL, "Scroll" }, + { TV_WAND, "Wand" }, + { TV_STAFF, "Staff" }, + { TV_ROD_MAIN, "Rod" }, + { TV_ROD, "Rod Tip" }, + { TV_BOOK, "Schools Spellbook", }, + { TV_SYMBIOTIC_BOOK, "Symbiotic Spellbook", }, + { TV_DRUID_BOOK, "Elemental Stone" }, + { TV_MUSIC_BOOK, "Music Book" }, + { TV_DAEMON_BOOK, "Daemon Book" }, + { TV_SPIKE, "Spikes" }, + { TV_DIGGING, "Digger" }, + { TV_CHEST, "Chest" }, + { TV_FOOD, "Food" }, + { TV_FLASK, "Flask" }, + { TV_MSTAFF, "Mage Staff" }, + { TV_PARCHMENT, "Parchment" }, + { TV_INSTRUMENT, "Musical Instrument" }, + { TV_RUNE1, "Rune 1" }, + { TV_RUNE2, "Rune 2" }, + { TV_JUNK, "Junk" }, + { TV_TRAPKIT, "Trapping Kit" }, + { 0, NULL } +}; + /* Tval descriptions */ tval_desc tval_descs[] = { diff --git a/src/tables.hpp b/src/tables.hpp index ab4fd00c..6b9d59b2 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -69,6 +69,7 @@ extern std::vector const &flags_groups(); extern power_type powers_type[POWER_MAX]; extern cptr artifact_names_list; extern monster_power monster_powers[MONSTER_POWERS_MAX]; +extern tval_desc tvals[]; extern tval_desc tval_descs[]; extern between_exit between_exits[MAX_BETWEEN_EXITS]; extern int month_day[9]; diff --git a/src/variable.cc b/src/variable.cc index 941bc9a0..ccb8556d 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -948,56 +948,3 @@ const char *get_version_string() } return version_str; } - -/* - * A list of tvals and their textual names - */ -tval_desc tvals[] = -{ - { TV_SWORD, "Sword" }, - { TV_POLEARM, "Polearm" }, - { TV_HAFTED, "Hafted Weapon" }, - { TV_AXE, "Axe" }, - { TV_BOW, "Bow" }, - { TV_BOOMERANG, "Boomerang" }, - { TV_ARROW, "Arrows" }, - { TV_BOLT, "Bolts" }, - { TV_SHOT, "Shots" }, - { TV_SHIELD, "Shield" }, - { TV_CROWN, "Crown" }, - { TV_HELM, "Helm" }, - { TV_GLOVES, "Gloves" }, - { TV_BOOTS, "Boots" }, - { TV_CLOAK, "Cloak" }, - { TV_DRAG_ARMOR, "Dragon Scale Mail" }, - { TV_HARD_ARMOR, "Hard Armor" }, - { TV_SOFT_ARMOR, "Soft Armor" }, - { TV_RING, "Ring" }, - { TV_AMULET, "Amulet" }, - { TV_LITE, "Lite" }, - { TV_POTION, "Potion" }, - { TV_POTION2, "Potion" }, - { TV_SCROLL, "Scroll" }, - { TV_WAND, "Wand" }, - { TV_STAFF, "Staff" }, - { TV_ROD_MAIN, "Rod" }, - { TV_ROD, "Rod Tip" }, - { TV_BOOK, "Schools Spellbook", }, - { TV_SYMBIOTIC_BOOK, "Symbiotic Spellbook", }, - { TV_DRUID_BOOK, "Elemental Stone" }, - { TV_MUSIC_BOOK, "Music Book" }, - { TV_DAEMON_BOOK, "Daemon Book" }, - { TV_SPIKE, "Spikes" }, - { TV_DIGGING, "Digger" }, - { TV_CHEST, "Chest" }, - { TV_FOOD, "Food" }, - { TV_FLASK, "Flask" }, - { TV_MSTAFF, "Mage Staff" }, - { TV_PARCHMENT, "Parchment" }, - { TV_INSTRUMENT, "Musical Instrument" }, - { TV_RUNE1, "Rune 1" }, - { TV_RUNE2, "Rune 2" }, - { TV_JUNK, "Junk" }, - { TV_TRAPKIT, "Trapping Kit" }, - { 0, NULL } -}; diff --git a/src/variable.hpp b/src/variable.hpp index 20dcbaea..877ad3ce 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -45,7 +45,6 @@ #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" #include "trap_type_fwd.hpp" -#include "tval_desc.hpp" #include "vault_type_fwd.hpp" #include "wilderness_type_info_fwd.hpp" #include "seed.hpp" @@ -280,7 +279,6 @@ extern s32b DUNGEON_ASTRAL_WILD_Y; extern deity_type deity_info[MAX_GODS]; extern timer_type *gl_timers; extern const char *get_version_string(); -extern tval_desc tvals[]; extern hist_type *bg; extern bool_ arg_wizard; extern bool_ arg_force_original; -- cgit v1.2.3 From 9224ae637c06dc1a470ee90a19628c004f1ff35b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:07 +0200 Subject: Add a few more compiler warning flags --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c805161..6b804357 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ INCLUDE(FindPkgConfig) # # Basic common compiler flags. # -SET(COMMON_COMPILER_FLAGS "-pipe -Wall -Wno-unused-value -fsanitize=undefined -fsanitize=address") +SET(COMMON_COMPILER_FLAGS "-pipe -Wall -Wextra -Wno-unused-value -Wno-unused-parameter -fsanitize=undefined -fsanitize=address") # # GCC/G++ flags -- cgit v1.2.3 From 35daca530fecc0b74dea0820941a273950c59bf2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:07 +0200 Subject: Fix for 'invisible' inscriptions in object lists --- src/object1.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/object1.cc b/src/object1.cc index c311ee34..c812462f 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2070,11 +2070,17 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } /* Note the discount, if any */ - if ((o_ptr->discount) && inscrip.empty()) + if ((o_ptr->discount) && o_ptr->inscription.empty()) { inscrip.push_back(fmt::format("{:d}% off", o_ptr->discount)); } + /* Append the user's inscription */ + if (!o_ptr->inscription.empty()) + { + inscrip.push_back(o_ptr->inscription); + } + /* Append the inscription, if any */ if (!inscrip.empty()) { -- cgit v1.2.3 From faf6923e1c35b8f69905548467874a76a4c740bd Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove max_plev --- src/files.cc | 2 +- src/module_type.hpp | 3 --- src/modules.cc | 2 -- src/tables.cc | 4 ---- src/variable.cc | 1 - src/variable.hpp | 1 - src/xtra1.cc | 2 +- src/xtra2.cc | 4 ++-- 8 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/files.cc b/src/files.cc index 91795af3..12c05345 100644 --- a/src/files.cc +++ b/src/files.cc @@ -1151,7 +1151,7 @@ static void display_player_middle(void) prt_lnum("Max Exp ", p_ptr->max_exp, 11, 28, TERM_L_GREEN); - if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->lev >= max_plev)) + if (p_ptr->lev >= PY_MAX_LEVEL) { put_str("Exp to Adv.", 12, 28); c_put_str(TERM_L_GREEN, " *****", 12, 28 + 11); diff --git a/src/module_type.hpp b/src/module_type.hpp index 96938856..1b75d84c 100644 --- a/src/module_type.hpp +++ b/src/module_type.hpp @@ -42,9 +42,6 @@ struct module_type s32b jewelry_chance; } randarts; - /* Max player level. */ - int max_plev; - /* Skills */ struct { /* Skill points per level */ diff --git a/src/modules.cc b/src/modules.cc index 3480e805..4d60c960 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -195,8 +195,6 @@ static void activate_module(int module_idx) game_module_idx = module_idx; /* Do misc inits */ - max_plev = module_ptr->max_plev; - RANDART_WEAPON = module_ptr->randarts.weapon_chance; RANDART_ARMOR = module_ptr->randarts.armor_chance; RANDART_JEWEL = module_ptr->randarts.jewelry_chance; diff --git a/src/tables.cc b/src/tables.cc index 54be6b45..8853b938 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -4238,8 +4238,6 @@ module_type modules[MAX_MODULES] = }, /* Randarts: */ { 30, 20, 20 }, - /* Max player level: */ - 50, /* Skills: */ { 6, 4, }, /* Intro function */ @@ -4260,8 +4258,6 @@ module_type modules[MAX_MODULES] = }, /* Randarts: */ { 30, 30, 30 }, - /* Max player level: */ - 50, /* Skill overage: */ { 6, 5, }, /* Intro function */ diff --git a/src/variable.cc b/src/variable.cc index ccb8556d..4f967ca7 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -918,7 +918,6 @@ s32b VERSION_PATCH; /* * Some module info */ -s32b max_plev = 50; s32b DUNGEON_BASE = 4; s32b DUNGEON_DEATH = 28; s32b DUNGEON_ASTRAL = 8; diff --git a/src/variable.hpp b/src/variable.hpp index 877ad3ce..975ab39a 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -270,7 +270,6 @@ extern s32b game_module_idx; extern s32b VERSION_MAJOR; extern s32b VERSION_MINOR; extern s32b VERSION_PATCH; -extern s32b max_plev; extern s32b DUNGEON_BASE; extern s32b DUNGEON_DEATH; extern s32b DUNGEON_ASTRAL; diff --git a/src/xtra1.cc b/src/xtra1.cc index b4f2adf6..037a1f46 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -362,7 +362,7 @@ static void prt_exp(void) { char out_val[32]; - if ((p_ptr->lev >= PY_MAX_LEVEL) || (p_ptr->lev >= max_plev)) + if (p_ptr->lev >= PY_MAX_LEVEL) { (void)sprintf(out_val, "********"); } diff --git a/src/xtra2.cc b/src/xtra2.cc index b5ad738a..5ed06491 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -1916,8 +1916,8 @@ void check_experience(void) /* Gain levels while possible */ - while ((p_ptr->lev < PY_MAX_LEVEL) && (p_ptr->lev < max_plev) && - (p_ptr->exp >= (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L))) + while ((p_ptr->lev < PY_MAX_LEVEL) && + (p_ptr->exp >= (player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L))) { /* Gain a level */ p_ptr->lev++; -- cgit v1.2.3 From 44465e6fdbeab3b90b0bef9d33adac3514b48ffc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove unused max_bact --- src/variable.cc | 5 ----- src/variable.hpp | 1 - 2 files changed, 6 deletions(-) diff --git a/src/variable.cc b/src/variable.cc index 4f967ca7..3813614e 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -889,11 +889,6 @@ skill_modifiers *gen_skill; cli_comm *cli_info; int cli_total = 0; -/* - * max_bact, only used so that lua scripts can add new bacts without worrying about the numbers - */ -int max_bact = 127; - /* * Automatizer enabled status */ diff --git a/src/variable.hpp b/src/variable.hpp index 975ab39a..b8fb91ea 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -261,7 +261,6 @@ extern int project_time; extern s32b project_time_effect; extern effect_type effects[MAX_EFFECTS]; extern skill_modifiers *gen_skill; -extern int max_bact; extern bool_ automatizer_enabled; extern s16b last_teleportation_y; extern s16b last_teleportation_x; -- cgit v1.2.3 From a82be561ad77d615f619ed16614c3c09fdc9ba2f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move random_spells into player_type # Conflicts: # src/loadsave.cc --- src/birth.cc | 3 -- src/cmd7.cc | 44 ++++++++-------- src/loadsave.cc | 12 ++--- src/player_type.hpp | 6 +++ src/random_spell.hpp | 22 ++++---- src/skills.cc | 9 ++-- src/spells1.cc | 139 ++++++++++++++++++++++++--------------------------- src/variable.cc | 6 --- src/variable.hpp | 3 -- 9 files changed, 110 insertions(+), 134 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 25b1beff..9081ec06 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -845,9 +845,6 @@ static void player_wipe(void) noscore = 0; wizard = 0; - /* Assume no innate spells */ - spell_num = 0; - /* Clear the fate */ for (i = 0; i < MAX_FATES; i++) { diff --git a/src/cmd7.cc b/src/cmd7.cc index 4c485c2f..ff98d28d 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -16,6 +16,7 @@ #include "dungeon_flag.hpp" #include "ego_item_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "mimic.hpp" #include "monster2.hpp" @@ -1222,7 +1223,7 @@ void do_cmd_pray(void) /* * Return percentage chance of spell failure. */ -int spell_chance_random(random_spell* rspell) +int spell_chance_random(random_spell const *rspell) { int chance, minfail; @@ -1257,18 +1258,16 @@ int spell_chance_random(random_spell* rspell) */ static void print_spell_batch(int batch, int max) { - char buff[80]; - - random_spell* rspell; - - int i; - + auto const &random_spells = p_ptr->random_spells; prt(format(" %-30s Lev Fail Mana Damage ", "Name"), 1, 20); + int i; for (i = 0; i < max; i++) { - rspell = &random_spells[batch * 10 + i]; + auto rspell = &random_spells[batch * 10 + i]; + + char buff[80]; if (rspell->untried) { @@ -1295,18 +1294,14 @@ static void print_spell_batch(int batch, int max) /* * List ten random spells and ask to pick one. */ -static random_spell* select_spell_from_batch(int batch) +static random_spell* select_spell_from_batch(std::size_t batch) { - char tmp[160]; + auto &random_spells = p_ptr->random_spells; + char tmp[160]; char out_val[30]; - char which; - - int mut_max = 10; - - random_spell* ret; - + random_spell* ret = nullptr; /* Enter "icky" mode */ character_icky = TRUE; @@ -1314,10 +1309,9 @@ static random_spell* select_spell_from_batch(int batch) /* Save the screen */ Term_save(); - if (spell_num < (batch + 1) * 10) - { - mut_max = spell_num - batch * 10; - } + int const mut_max = (random_spells.size() < (batch + 1) * 10) + ? random_spells.size() - batch * 10 + : 10; strnfmt(tmp, 160, "(a-%c, A-%c to browse, / to rename, - to comment) Select a power: ", I2A(mut_max - 1), I2A(mut_max - 1) - 'a' + 'A'); @@ -1447,12 +1441,11 @@ static random_spell* select_spell_from_batch(int batch) */ static random_spell* select_spell() { - char tmp[160]; + auto const &random_spells = p_ptr->random_spells; + char tmp[160]; char which; - int batch_max = (spell_num - 1) / 10; - random_spell *ret; @@ -1464,12 +1457,15 @@ static random_spell* select_spell() } /* No spells available */ - if (spell_num == 0) + if (random_spells.empty()) { msg_print("There are no spells you can cast."); return NULL; } + /* How many spells in the last batch? */ + int batch_max = (random_spells.size() - 1) / 10; + /* Enter "icky" mode */ character_icky = TRUE; diff --git a/src/loadsave.cc b/src/loadsave.cc index bbcc8784..06e53d02 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -480,10 +480,8 @@ static void do_subrace(ls_flag_t flag) } -/* Load/Save the random spells info */ -static void do_spells(int i, ls_flag_t flag) +static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) { - random_spell *s_ptr = &random_spells[i]; do_string(s_ptr->name, 30, flag); do_string(s_ptr->desc, 30, flag); do_s16b(&s_ptr->mana, flag); @@ -891,15 +889,11 @@ static bool_ do_extra(ls_flag_t flag) /* The fate */ do_bool(&p_ptr->no_mortal, flag); + /* Random spells */ + do_vector(flag, p_ptr->random_spells, do_random_spell); /* Spells */ { - do_s16b(&spell_num, flag); - for (std::size_t i = 0; i < MAX_SPELLS; i++) - { - do_spells(i, flag); - } - do_s16b(&rune_num, flag); for (std::size_t i = 0; i < MAX_RUNES; i++) diff --git a/src/player_type.hpp b/src/player_type.hpp index 20fa81a4..c9c7538b 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -7,6 +7,7 @@ #include "inventory.hpp" #include "object_type.hpp" #include "powers.hpp" +#include "random_spell.hpp" #include "spellbinder.hpp" #include @@ -408,6 +409,11 @@ struct player_type bool_ did_nothing = FALSE; /* True if the last action wasnt a real action */ bool_ leaving = FALSE; /* True if player is leaving */ + /** + * Random spells. + */ + std::vector random_spells; + /** * Does the player have the given ability? */ diff --git a/src/random_spell.hpp b/src/random_spell.hpp index 2c814c9f..2ed71096 100644 --- a/src/random_spell.hpp +++ b/src/random_spell.hpp @@ -7,15 +7,15 @@ */ struct random_spell { - char desc[30]; /* Desc of the spell */ - char name[30]; /* Name of the spell */ - s16b mana; /* Mana cost */ - s16b fail; /* Failure rate */ - u32b proj_flags; /* Project function flags */ - byte GF; /* Type of the projection */ - byte radius; - byte dam_sides; - byte dam_dice; - byte level; /* Level needed */ - bool untried; /* Is the spell was tried? */ + char desc[30] = { }; /* Desc of the spell */ + char name[30] = { }; /* Name of the spell */ + s16b mana = 0; /* Mana cost */ + s16b fail = 0; /* Failure rate */ + u32b proj_flags = 0; /* Project function flags */ + byte GF = 0; /* Type of the projection */ + byte radius = 0; + byte dam_sides = 0; + byte dam_dice = 0; + byte level = 0; /* Level needed */ + bool untried = true; /* Is the spell was tried? */ }; diff --git a/src/skills.cc b/src/skills.cc index df252683..b97e80a8 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -385,16 +385,19 @@ void recalc_skills(bool_ init) } else { + auto const &random_spells = p_ptr->random_spells; + int thaum_gain = 0; - /* Gain thaum spells */ - while (thaum_level < get_skill_scale(SKILL_THAUMATURGY, 100)) + /* Gain thaum spells while there's more to be gained */ + while ((thaum_level < get_skill_scale(SKILL_THAUMATURGY, 100)) && + (random_spells.size() < MAX_SPELLS)) { - if (spell_num == MAX_SPELLS) break; thaum_level++; generate_spell((thaum_level + 1) / 2); thaum_gain++; } + if (thaum_gain) { if (thaum_gain == 1) diff --git a/src/spells1.cc b/src/spells1.cc index 3f09e592..eb3664cc 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -8923,136 +8923,125 @@ static void name_spell(random_spell* s_ptr) void generate_spell(int plev) { - random_spell* rspell; - int dice, sides, chance, mana, power; - bool_ destruc_gen = FALSE; - bool_ simple_gen = TRUE; - bool_ ball_desc = FALSE; + auto &random_spells = p_ptr->random_spells; - if (spell_num == MAX_SPELLS) return; + assert(random_spells.size() < MAX_SPELLS); - rspell = &random_spells[spell_num]; + bool destruc_gen = false; + bool simple_gen = true; + bool ball_desc = false; - power = rand_int(5); + // Calculate power, dice, etc. + int const power = rand_int(5); + int const dice = std::max(1, (plev / 2) + power); + int const sides = std::max(5, plev + power); + int const mana = std::max(1, plev + (plev * power) / 15); - dice = plev / 2; - sides = plev; - mana = plev; + // Create spell + random_spell rspell; + rspell.level = plev; + rspell.mana = mana; + rspell.untried = true; - /* Make the spell more or less powerful. */ - dice += power; - sides += power; - mana += (plev * power) / 15; + // Spells are always maximally destructive + rspell.proj_flags = PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID; - /* Stay within reasonable bounds. */ - if (dice < 1) dice = 1; + // Roll the dice as to the "type" of spell + int chance = randint(100); - if (sides < 5) sides = 5; - - if (mana < 1) mana = 1; - - rspell->level = plev; - rspell->mana = mana; - rspell->untried = true; - - /* Spells are always maximally destructive. */ - rspell->proj_flags = PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID; - - chance = randint(100); - - /* Hack -- Always start with Magic Missile or derivative at lev. 1 */ + // We always start with Magic Missile or derivative at level 1 if (plev == 1 || chance < 25) { - rspell->proj_flags |= PROJECT_STOP; - /* Swap dice and sides for better damage */ - rspell->dam_dice = sides; - rspell->dam_sides = dice; - rspell->radius = 0; + // Swap dice and sides for better damage + rspell.proj_flags |= PROJECT_STOP; + rspell.dam_dice = sides; + rspell.dam_sides = dice; + rspell.radius = 0; } else if (chance < 50) { - rspell->proj_flags |= PROJECT_BEAM; - rspell->dam_dice = dice; - rspell->dam_sides = sides; - rspell->radius = 0; + rspell.proj_flags |= PROJECT_BEAM; + rspell.dam_dice = dice; + rspell.dam_sides = sides; + rspell.radius = 0; } else if (chance < 76) { - rspell->proj_flags |= PROJECT_STOP; - rspell->radius = dice / 3; - rspell->dam_dice = dice; - rspell->dam_sides = sides; - ball_desc = TRUE; + rspell.proj_flags |= PROJECT_STOP; + rspell.radius = dice / 3; + rspell.dam_dice = dice; + rspell.dam_sides = sides; + ball_desc = true; } else if (chance < 83) { - rspell->proj_flags |= PROJECT_BLAST; - rspell->radius = sides / 3; - rspell->dam_dice = dice; - rspell->dam_sides = sides; + rspell.proj_flags |= PROJECT_BLAST; + rspell.radius = sides / 3; + rspell.dam_dice = dice; + rspell.dam_sides = sides; - destruc_gen = TRUE; - simple_gen = FALSE; + destruc_gen = true; + simple_gen = false; } else if (chance < 90) { - rspell->proj_flags |= PROJECT_METEOR_SHOWER; - /* Area effect spells do way less damage "per shot" */ - rspell->dam_dice = dice / 5; - rspell->dam_sides = sides / 5; - rspell->radius = sides / 3; - if (rspell->radius < 4) rspell->radius = 4; + // Area effect spells do way less damage "per shot" + rspell.proj_flags |= PROJECT_METEOR_SHOWER; + rspell.dam_dice = dice / 5; + rspell.dam_sides = sides / 5; + rspell.radius = std::max(4, sides / 3); - destruc_gen = TRUE; + destruc_gen = true; } else { - rspell->proj_flags |= PROJECT_VIEWABLE; - /* View spells do less damage */ - rspell->dam_dice = dice; - rspell->dam_sides = sides / 2; + // View spells do less damage + rspell.proj_flags |= PROJECT_VIEWABLE; + rspell.dam_dice = dice; + rspell.dam_sides = sides / 2; } - /* Both a destructive and a simple spell requested -- - * pick one or the other. */ + // Both a destructive and a simple spell requested; pick one or the other if (destruc_gen && simple_gen) { if (magik(25)) { - simple_gen = FALSE; + simple_gen = false; } else { - destruc_gen = FALSE; + destruc_gen = false; } } - /* Pick a simple spell */ + // Choose the appropriate GF if (simple_gen) { - rspell->GF = attack_types[rand_int(25)]; + rspell.GF = attack_types[rand_int(25)]; } - /* Pick a destructive spell */ else { - rspell->GF = destructive_attack_types[rand_int(10)]; + rspell.GF = destructive_attack_types[rand_int(10)]; } - /* Give the spell a name. */ - name_spell(rspell); + // Give the spell a name + name_spell(&rspell); + + // Give the spell a description if (ball_desc) { /* 30 character limit on the string! */ - sprintf(rspell->desc, "Dam: %d, Rad: %d, Pow: %d", + sprintf(rspell.desc, "Dam: %d, Rad: %d, Pow: %d", sides, dice, power); } else { - sprintf(rspell->desc, "Damage: %dd%d, Power: %d", + sprintf(rspell.desc, "Damage: %dd%d, Power: %d", dice, sides, power); } - spell_num++; + // Add + random_spells.emplace_back(rspell); } /* diff --git a/src/variable.cc b/src/variable.cc index 3813614e..84fcdfba 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -789,12 +789,6 @@ s32b RANDART_WEAPON; s32b RANDART_ARMOR; s32b RANDART_JEWEL; -/* - * Random spells. - */ -random_spell random_spells[MAX_SPELLS]; -s16b spell_num; - /* * Runecrafter's selfmade spells. */ diff --git a/src/variable.hpp b/src/variable.hpp index b8fb91ea..ef480af9 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -32,7 +32,6 @@ #include "randart_part_type_fwd.hpp" #include "random_artifact.hpp" #include "random_quest.hpp" -#include "random_spell.hpp" #include "rune_spell.hpp" #include "school_type.hpp" #include "set_type_fwd.hpp" @@ -236,8 +235,6 @@ extern random_artifact random_artifacts[MAX_RANDARTS]; extern s32b RANDART_WEAPON; extern s32b RANDART_ARMOR; extern s32b RANDART_JEWEL; -extern random_spell random_spells[MAX_SPELLS]; -extern s16b spell_num; extern rune_spell rune_spells[MAX_RUNES]; extern s16b rune_num; extern fate fates[MAX_FATES]; -- cgit v1.2.3 From 7c495e924e9c2c979b772071e92ca30b6d712bef Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: pcg_random: Add missing '&' sigil --- vendor/pcg-cpp-0.98/include/pcg_extras.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/pcg-cpp-0.98/include/pcg_extras.hpp b/vendor/pcg-cpp-0.98/include/pcg_extras.hpp index ec3e5694..9b2e4e27 100644 --- a/vendor/pcg-cpp-0.98/include/pcg_extras.hpp +++ b/vendor/pcg-cpp-0.98/include/pcg_extras.hpp @@ -220,7 +220,7 @@ operator<<(std::basic_ostream&out, uint8_t value) template std::basic_istream& -operator>>(std::basic_istream& in, uint8_t target) +operator>>(std::basic_istream& in, uint8_t &target) { uint32_t value = 0xdecea5edU; in >> value; -- cgit v1.2.3 From 0e91eb9e205508daf5de1234e7ac3e59fa809982 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move rune_spells into player_type --- src/birth.cc | 10 ---- src/cmd7.cc | 132 +++++++++++++++++++++------------------------------- src/loadsave.cc | 22 ++++----- src/player_type.hpp | 6 +++ src/rune_spell.hpp | 8 ++-- src/variable.cc | 6 --- src/variable.hpp | 3 -- 7 files changed, 72 insertions(+), 115 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 9081ec06..bb2f0816 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -762,16 +762,6 @@ static void player_wipe(void) } } - /* Wipe the rune spells */ - rune_num = 0; - for (i = 0; i < MAX_RUNES; i++) - { - strcpy(rune_spells[i].name, ""); - rune_spells[i].type = 0; - rune_spells[i].rune2 = 0; - rune_spells[i].mana = 0; - } - /* No items */ inven_cnt = 0; equip_cnt = 0; diff --git a/src/cmd7.cc b/src/cmd7.cc index ff98d28d..3f039f32 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -2849,30 +2849,23 @@ void do_cmd_rune(void) /* * Print a batch of runespells. */ -static void print_runespell_batch(int batch, int max) +static void print_runespell_batch(std::size_t batch, int max) { - char buff[80]; - - rune_spell* spell; - - int i; - - s32b power, powerdiv; - - int p, dp; - - prt(format(" %-30s Fail Mana Power", "Name"), 1, 20); + int i; for (i = 0; i < max; i++) { - spell = &rune_spells[batch * 10 + i]; + auto spell = &p_ptr->rune_spells[batch * 10 + i]; - power = spell->mana; + int power = spell->mana; + s32b powerdiv; rune_calc_power(&power, &powerdiv); - p = power; - dp = powerdiv; + int const p = power; + int const dp = powerdiv; + + char buff[80]; strnfmt(buff, 80, " %c) %-30s %4d%% %4d %dd%d ", I2A(i), spell->name, spell_chance_rune(spell), spell->mana, dp, p); @@ -2887,38 +2880,30 @@ static void print_runespell_batch(int batch, int max) * List ten random spells and ask to pick one. */ -static rune_spell* select_runespell_from_batch(int batch, int *s_idx) +static rune_spell* select_runespell_from_batch(std::size_t batch, int *s_idx) { - char tmp[160]; - - char out_val[30]; - - char which; - - int mut_max = 10; - - rune_spell* ret; - + auto &rune_spells = p_ptr->rune_spells; character_icky = TRUE; - if (rune_num < (batch + 1) * 10) - { - mut_max = rune_num - batch * 10; - } - - strnfmt(tmp, 160, "(a-%c, * to list, / to rename, - to comment) Select a power: ", - I2A(mut_max - 1)); + int const mut_max = (rune_spells.size() < (batch + 1) * 10) + ? rune_spells.size() - batch * 10 + : 10; + char tmp[160]; + strnfmt(tmp, 160, "(a-%c, / to rename, - to comment) Select a power: ", + I2A(mut_max - 1)); prt(tmp, 0, 0); + rune_spell *ret = nullptr; + while (1) { Term_save(); print_runespell_batch(batch, mut_max); - which = inkey(); + char which = inkey(); Term_load(); @@ -2945,6 +2930,7 @@ static rune_spell* select_runespell_from_batch(int batch, int *s_idx) if (isalpha(which) && (A2I(which) <= mut_max)) { + char out_val[30] = { '\0' }; strcpy(out_val, rune_spells[batch*10 + A2I(which)].name); if (get_string("Name this power: ", out_val, 29)) { @@ -2983,27 +2969,28 @@ static rune_spell* select_runespell_from_batch(int batch, int *s_idx) /* * Pick a random spell from a menu */ - -rune_spell* select_runespell(int *s_idx) +static rune_spell* select_runespell(int *s_idx) { - char tmp[160]; + auto const &rune_spells = p_ptr->rune_spells; char which; - int batch_max = (rune_num - 1) / 10; - - if (rune_num == 0) + if (rune_spells.empty()) { msg_print("There are no runespells you can cast."); return (NULL); } + std::size_t batch_max = (rune_spells.size() - 1) / 10; + character_icky = TRUE; Term_save(); - strnfmt(tmp, 160, "(a-%c) Select batch of powers: ", I2A(batch_max)); - - prt(tmp, 0, 0); + { + char tmp[160]; + strnfmt(tmp, 160, "(a-%c) Select batch of powers: ", I2A(batch_max)); + prt(tmp, 0, 0); + } while (1) { @@ -3025,7 +3012,7 @@ rune_spell* select_runespell(int *s_idx) else { which = tolower(which); - if (isalpha(which) && (A2I(which) <= batch_max)) + if (isalpha(which) && (static_cast(A2I(which)) <= batch_max)) { Term_load(); character_icky = FALSE; @@ -3044,13 +3031,8 @@ rune_spell* select_runespell(int *s_idx) * Cast a memorized runespell * Note that the only limits are antimagic & conf, NOT blind */ -void do_cmd_rune_cast() +static void do_cmd_rune_cast() { - rune_spell *s_ptr; - - int s_idx; - - /* Require some mana */ if (p_ptr->csp <= 0) { @@ -3079,6 +3061,8 @@ void do_cmd_rune_cast() return; } + int s_idx; + rune_spell *s_ptr; s_ptr = select_runespell(&s_idx); if (s_ptr == NULL) return; @@ -3188,35 +3172,34 @@ void do_cmd_runestone() */ void do_cmd_rune_add_mem() { - rune_spell s_ptr; - - rune_spell *ds_ptr = &rune_spells[rune_num]; - + auto &rune_spells = p_ptr->rune_spells; - /* Not when confused */ if (p_ptr->confused) { msg_print("You are too confused!"); return; } - - if (rune_num >= MAX_RUNES) + if (rune_spells.size() >= MAX_RUNES) { msg_print("You have already learned the maximum number of runespells!"); return; } + rune_spell s_ptr; if (!get_runespell(&s_ptr)) return; - ds_ptr->type = s_ptr.type; - ds_ptr->rune2 = s_ptr.rune2; - ds_ptr->mana = s_ptr.mana; - strcpy(ds_ptr->name, "Unnamed Runespell"); + // Create the new rune spell + rune_spell ds; + ds.type = s_ptr.type; + ds.rune2 = s_ptr.rune2; + ds.mana = s_ptr.mana; + strcpy(ds.name, "Unnamed Runespell"); - get_string("Name this runespell: ", ds_ptr->name, 29); + get_string("Name this runespell: ", ds.name, 29); - rune_num++; + // Add to list + rune_spells.emplace_back(ds); /* Take a turn */ energy_use = 100; @@ -3325,33 +3308,22 @@ void do_cmd_rune_carve() */ void do_cmd_rune_del() { - rune_spell *s_ptr; - - int s_idx; - - int i; - + auto &rune_spells = p_ptr->rune_spells; - /* Not when confused */ if (p_ptr->confused) { msg_print("You are too confused!"); return; } + rune_spell *s_ptr; + int s_idx; s_ptr = select_runespell(&s_idx); if (s_ptr == NULL) return; - /* Delete and move */ - for (i = s_idx + 1; i < rune_num; i++) - { - rune_spells[i - 1].type = rune_spells[i].type; - rune_spells[i - 1].rune2 = rune_spells[i].rune2; - rune_spells[i - 1].mana = rune_spells[i].mana; - strcpy(rune_spells[i - 1].name, rune_spells[i].name); - } - rune_num--; + /* Delete */ + rune_spells.erase(rune_spells.begin() + s_idx); /* Take a turn */ energy_use = 100; diff --git a/src/loadsave.cc b/src/loadsave.cc index 06e53d02..8c2a79c4 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -495,6 +495,14 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } +static void do_rune_spell(rune_spell *s_ptr, ls_flag_t flag) +{ + do_string(s_ptr->name, 30, flag); + do_s16b(&s_ptr->type, flag); + do_s16b(&s_ptr->rune2, flag); + do_s16b(&s_ptr->mana, flag); +} + /* * Show information on the screen, one line at a time. @@ -892,18 +900,8 @@ static bool_ do_extra(ls_flag_t flag) /* Random spells */ do_vector(flag, p_ptr->random_spells, do_random_spell); - /* Spells */ - { - do_s16b(&rune_num, flag); - - for (std::size_t i = 0; i < MAX_RUNES; i++) - { - do_string(rune_spells[i].name, 30, flag); - do_s16b(&rune_spells[i].type, flag); - do_s16b(&rune_spells[i].rune2, flag); - do_s16b(&rune_spells[i].mana, flag); - } - } + /* Rune spells */ + do_vector(flag, p_ptr->rune_spells, do_rune_spell); /* Random seed for object flavors. */ do_seed(&seed_flavor(), flag); diff --git a/src/player_type.hpp b/src/player_type.hpp index c9c7538b..0e7aa93f 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -8,6 +8,7 @@ #include "object_type.hpp" #include "powers.hpp" #include "random_spell.hpp" +#include "rune_spell.hpp" #include "spellbinder.hpp" #include @@ -414,6 +415,11 @@ struct player_type */ std::vector random_spells; + /** + * Runecrafter's selfmade spells. + */ + std::vector rune_spells; + /** * Does the player have the given ability? */ diff --git a/src/rune_spell.hpp b/src/rune_spell.hpp index d04a8dc4..e1e8d190 100644 --- a/src/rune_spell.hpp +++ b/src/rune_spell.hpp @@ -7,9 +7,9 @@ */ struct rune_spell { - char name[30]; /* name */ + char name[30] { '\0' }; /* name */ - s16b type; /* Type of the spell(GF) */ - s16b rune2; /* Modifiers */ - s16b mana; /* Mana involved */ + s16b type = 0; /* Type of the spell(GF) */ + s16b rune2 = 0; /* Modifiers */ + s16b mana = 0; /* Mana involved */ }; diff --git a/src/variable.cc b/src/variable.cc index 84fcdfba..f3defc5d 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -789,12 +789,6 @@ s32b RANDART_WEAPON; s32b RANDART_ARMOR; s32b RANDART_JEWEL; -/* - * Runecrafter's selfmade spells. - */ -rune_spell rune_spells[MAX_RUNES]; -s16b rune_num; - /* * Fate. */ diff --git a/src/variable.hpp b/src/variable.hpp index ef480af9..b04f3140 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -32,7 +32,6 @@ #include "randart_part_type_fwd.hpp" #include "random_artifact.hpp" #include "random_quest.hpp" -#include "rune_spell.hpp" #include "school_type.hpp" #include "set_type_fwd.hpp" #include "skill_descriptor_fwd.hpp" @@ -235,8 +234,6 @@ extern random_artifact random_artifacts[MAX_RANDARTS]; extern s32b RANDART_WEAPON; extern s32b RANDART_ARMOR; extern s32b RANDART_JEWEL; -extern rune_spell rune_spells[MAX_RUNES]; -extern s16b rune_num; extern fate fates[MAX_FATES]; extern byte dungeon_type; extern s16b *max_dlv; -- cgit v1.2.3 From 0f36ab53cbac06b61d1b4b6509590759ed8c6703 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Introduce jsoncons as replacement for jansson --- src/CMakeLists.txt | 1 + vendor/jsoncons | 1 + vendor/jsoncons-0.99.2/jsoncons/json.hpp | 3574 ++++++++++++++++++++ .../jsoncons-0.99.2/jsoncons/json_deserializer.hpp | 267 ++ .../jsoncons/json_error_category.hpp | 111 + vendor/jsoncons-0.99.2/jsoncons/json_filter.hpp | 324 ++ .../jsoncons/json_input_handler.hpp | 282 ++ .../jsoncons/json_output_handler.hpp | 262 ++ vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp | 1587 +++++++++ .../jsoncons-0.99.2/jsoncons/json_parser.hpp.orig | 2157 ++++++++++++ vendor/jsoncons-0.99.2/jsoncons/json_reader.hpp | 176 + .../jsoncons-0.99.2/jsoncons/json_serializer.hpp | 435 +++ .../jsoncons-0.99.2/jsoncons/json_structures.hpp | 860 +++++ .../jsoncons-0.99.2/jsoncons/json_type_traits.hpp | 594 ++++ vendor/jsoncons-0.99.2/jsoncons/jsoncons.hpp | 347 ++ .../jsoncons-0.99.2/jsoncons/jsoncons_config.hpp | 123 + vendor/jsoncons-0.99.2/jsoncons/jsoncons_io.hpp | 358 ++ vendor/jsoncons-0.99.2/jsoncons/output_format.hpp | 330 ++ vendor/jsoncons-0.99.2/jsoncons/ovectorstream.hpp | 227 ++ .../jsoncons/parse_error_handler.hpp | 172 + .../jsoncons_ext/boost/type_extensions.hpp | 59 + .../jsoncons_ext/csv/csv_error_category.hpp | 55 + .../jsoncons_ext/csv/csv_parameters.hpp | 341 ++ .../jsoncons_ext/csv/csv_parser.hpp | 903 +++++ .../jsoncons_ext/csv/csv_reader.hpp | 175 + .../jsoncons_ext/csv/csv_serializer.hpp | 445 +++ .../jsoncons_ext/jsonpath/json_query.hpp | 921 +++++ .../jsonpath/jsonpath_error_category.hpp | 75 + .../jsoncons_ext/jsonpath/jsonpath_filter.hpp | 1495 ++++++++ 29 files changed, 16657 insertions(+) create mode 120000 vendor/jsoncons create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_deserializer.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_error_category.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_filter.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_input_handler.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_output_handler.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_reader.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_serializer.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_structures.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/json_type_traits.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/jsoncons.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/jsoncons_config.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/jsoncons_io.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/output_format.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/ovectorstream.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons/parse_error_handler.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/boost/type_extensions.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_error_category.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parameters.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parser.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_reader.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_serializer.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/json_query.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_error_category.hpp create mode 100644 vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_filter.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5f06bcec..035c42d1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,6 +3,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/bandit) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/fmt) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/pcg-cpp/include) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/jsoncons) # Add subdirectories ADD_SUBDIRECTORY (squelch) diff --git a/vendor/jsoncons b/vendor/jsoncons new file mode 120000 index 00000000..0f3415d8 --- /dev/null +++ b/vendor/jsoncons @@ -0,0 +1 @@ +jsoncons-0.99.2 \ No newline at end of file diff --git a/vendor/jsoncons-0.99.2/jsoncons/json.hpp b/vendor/jsoncons-0.99.2/jsoncons/json.hpp new file mode 100644 index 00000000..b9058b59 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json.hpp @@ -0,0 +1,3574 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_HPP +#define JSONCONS_JSON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/json_structures.hpp" +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_output_handler.hpp" +#include "jsoncons/output_format.hpp" +#include "jsoncons/json_serializer.hpp" +#include "jsoncons/json_deserializer.hpp" +#include "jsoncons/json_reader.hpp" +#include "jsoncons/json_type_traits.hpp" + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" +#endif + +namespace jsoncons { + +template +T* create_impl(const Alloc& allocator, Args&& ... args) +{ + typename std::allocator_traits:: template rebind_alloc alloc(allocator); + T* storage = alloc.allocate(1); + try + { + std::allocator_traits:: template rebind_traits::construct(alloc, storage, std::forward(args)...); + } + catch (...) + { + alloc.deallocate(storage,1); + throw; + } + return storage; +} + +template +void destroy_impl(const Alloc& allocator, T* p) +{ + typename std::allocator_traits:: template rebind_alloc alloc(allocator); + std::allocator_traits:: template rebind_traits::destroy(alloc, p); + alloc.deallocate(p,1); +} + +template +class serializable_any +{ +public: + typedef Alloc allocator_type; + + serializable_any(const Alloc& allocator = Alloc()) + : impl_(nullptr) + { + (void)allocator; + } + serializable_any(const serializable_any& val) + : allocator_(std::allocator_traits::select_on_container_copy_construction(val.get_allocator())) + { + impl_ = val.impl_ != nullptr ? val.impl_->clone(allocator_) : nullptr; + } + serializable_any(const serializable_any& val, const Alloc& allocator) + { + (void)allocator; + impl_ = val.impl_ != nullptr ? val.impl_->clone(Alloc()) : nullptr; + } + + serializable_any(serializable_any&& val) + : impl_(std::move(val.impl_)) + { + val.impl_ = nullptr; + } + serializable_any(serializable_any&& val, const Alloc& allocator) + : impl_(std::move(val.impl_)) + { + (void)allocator; + val.impl_ = nullptr; + } + ~serializable_any() + { + if (impl_ != nullptr) + { + destroy_impl(allocator_,impl_); + } + } + + template + explicit serializable_any(T val) + { + impl_ = create_impl::value_type>>(allocator_,val); + } + + Alloc get_allocator() const + { + return allocator_; + } + + template + typename type_wrapper::reference cast() + { + if (typeid(*impl_) != typeid(any_handle_impl::value_type>)) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad serializable_any cast"); + } + return static_cast::value_type>&>(*impl_).value_; + } + + template + typename type_wrapper::const_reference cast() const + { + if (typeid(*impl_) != typeid(any_handle_impl::value_type>)) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad serializable_any cast"); + } + return static_cast::value_type>&>(*impl_).value_; + } + + serializable_any& operator=(serializable_any rhs) + { + std::swap(impl_,rhs.impl_); + return *this; + } + + void to_stream(basic_json_output_handler& os) const + { + impl_->to_stream(os); + } + + class any_handle + { + public: + virtual ~any_handle() + { + } + + virtual any_handle* clone(const Alloc& allocator) const = 0; + + virtual void to_stream(basic_json_output_handler& os) const = 0; + }; + + template + class any_handle_impl : public any_handle + { + public: + any_handle_impl(T value, const Alloc& allocator = Alloc()) + : value_(value) + { + (void)allocator; + } + + virtual any_handle* clone(const Alloc& allocator) const + { + return create_impl>(allocator, value_); + } + + virtual void to_stream(basic_json_output_handler& os) const + { + serialize(os,value_); + } + + T value_; + }; + + Alloc allocator_; + any_handle* impl_; +}; + +template inline +void serialize(basic_json_output_handler& os, const T&) +{ + os.value(null_type()); +} + +template +class basic_parse_error_handler; + +enum class value_types : uint8_t +{ + // Simple types + empty_object_t, + small_string_t, + double_t, + integer_t, + uinteger_t, + bool_t, + null_t, + // Non simple types + string_t, + object_t, + array_t, + any_t +}; + +inline +bool is_simple(value_types type) +{ + return type < value_types::string_t; +} + +template > +class basic_json +{ +public: + + typedef Alloc allocator_type; + + typedef CharT char_type; + typedef typename std::char_traits char_traits_type; + + typedef typename std::allocator_traits:: template rebind_alloc string_allocator; + typedef std::basic_string string_type; + typedef basic_json value_type; + typedef name_value_pair member_type; + + typedef typename std::allocator_traits:: template rebind_alloc> array_allocator; + + typedef typename std::allocator_traits:: template rebind_alloc object_allocator; + + typedef json_array,array_allocator> array; + typedef json_object,object_allocator> object; + typedef serializable_any any; + + typedef jsoncons::null_type null_type; + + typedef typename object::iterator object_iterator; + typedef typename object::const_iterator const_object_iterator; + typedef typename array::iterator array_iterator; + typedef typename array::const_iterator const_array_iterator; + + template + class range + { + IteratorT first_; + IteratorT last_; + public: + range(const IteratorT& first, const IteratorT& last) + : first_(first), last_(last) + { + } + + public: + friend class basic_json; + + IteratorT begin() + { + return first_; + } + IteratorT end() + { + return last_; + } + }; + + typedef range object_range; + typedef range const_object_range; + typedef range array_range; + typedef range const_array_range; + + struct variant + { + struct string_data : public string_allocator + { + const char_type* c_str() const { return p_; } + const char_type* data() const { return p_; } + size_t length() const { return length_; } + string_allocator get_allocator() const + { + return *this; + } + + bool operator==(const string_data& rhs) const + { + return length() == rhs.length() ? std::char_traits::compare(data(), rhs.data(), length()) == 0 : false; + } + + string_data(const string_allocator& allocator) + : string_allocator(allocator), p_(nullptr), length_(0) + { + } + + char_type* p_; + size_t length_; + private: + string_data(const string_data&); + string_data& operator=(const string_data&); + }; + + struct string_dataA + { + string_data data; + char_type c[1]; + }; + typedef typename std::aligned_storage::type storage_type; + + static size_t aligned_size(size_t n) + { + return sizeof(storage_type) + n; + } + + string_data* create_string_data(const char_type* s, size_t length, const string_allocator& allocator) + { + size_t mem_size = aligned_size(length*sizeof(char_type)); + + typename std::allocator_traits:: template rebind_alloc alloc(allocator); + + char* storage = alloc.allocate(mem_size); + string_data* ps = new(storage)string_data(allocator); + auto psa = reinterpret_cast(storage); + + ps->p_ = new(&psa->c)char_type[length + 1]; + memcpy(ps->p_, s, length*sizeof(char_type)); + ps->p_[length] = 0; + ps->length_ = length; + return ps; + } + + void destroy_string_data(const string_allocator& allocator, string_data* p) + { + size_t mem_size = aligned_size(p->length_*sizeof(char_type)); + typename std::allocator_traits:: template rebind_alloc alloc(allocator); + alloc.deallocate(reinterpret_cast(p),mem_size); + } + + static const size_t small_string_capacity = (sizeof(int64_t)/sizeof(char_type)) - 1; + + variant() + : type_(value_types::empty_object_t) + { + } + + variant(const Alloc& a) + : type_(value_types::object_t) + { + value_.object_val_ = create_impl(a, object_allocator(a)); + } + + variant(std::initializer_list init, + const Alloc& a) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(a, std::move(init), array_allocator(a)); + } + + explicit variant(variant&& var) + : type_(value_types::null_t) + { + swap(var); + } + + explicit variant(variant&& var, const Alloc& a) + : type_(value_types::null_t) + { + swap(var); + } + + explicit variant(const variant& var) + { + init_variant(var); + } + explicit variant(const variant& var, const Alloc& a) + : type_(var.type_) + { + init_variant(var); + } + + variant(const object & val) + : type_(value_types::object_t) + { + value_.object_val_ = create_impl(val.get_allocator(), val) ; + } + + variant(const object & val, const Alloc& a) + : type_(value_types::object_t) + { + value_.object_val_ = create_impl(a, val, object_allocator(a)) ; + } + + variant(object&& val) + : type_(value_types::object_t) + { + value_.object_val_ = create_impl(val.get_allocator(), std::move(val)); + } + + variant(object&& val, const Alloc& a) + : type_(value_types::object_t) + { + value_.object_val_ = create_impl(a, std::move(val), object_allocator(a)); + } + + variant(const array& val) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(val.get_allocator(), val); + } + + variant(const array& val, const Alloc& a) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(a, val, array_allocator(a)); + } + + variant(array&& val) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(val.get_allocator(), std::move(val)); + } + + variant(array&& val, const Alloc& a) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(a, std::move(val), array_allocator(a)); + } + + explicit variant(const any& val, const Alloc& a) + : type_(value_types::any_t) + { + value_.any_val_ = create_impl(a, val); + } + + explicit variant(null_type) + : type_(value_types::null_t) + { + } + + explicit variant(bool val) + : type_(value_types::bool_t) + { + value_.bool_val_ = val; + } + + explicit variant(double val, uint8_t precision) + : type_(value_types::double_t), length_or_precision_(precision) + { + value_.double_val_ = val; + } + + explicit variant(int64_t val) + : type_(value_types::integer_t) + { + value_.integer_val_ = val; + } + + explicit variant(uint64_t val) + : type_(value_types::uinteger_t) + { + value_.uinteger_val_ = val; + } + + explicit variant(const string_type& s, const Alloc& a) + { + if (s.length() > variant::small_string_capacity) + { + type_ = value_types::string_t; + //value_.string_val_ = create_impl(a, s, string_allocator(a)); + value_.string_val_ = create_string_data(s.data(), s.length(), string_allocator(a)); + } + else + { + type_ = value_types::small_string_t; + length_or_precision_ = static_cast(s.length()); + std::memcpy(value_.small_string_val_,s.data(),s.length()*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + } + } + + explicit variant(const char_type* s, const Alloc& a) + { + size_t length = std::char_traits::length(s); + if (length > variant::small_string_capacity) + { + type_ = value_types::string_t; + //value_.string_val_ = create_impl(a, s, string_allocator(a)); + value_.string_val_ = create_string_data(s, length, string_allocator(a)); + } + else + { + type_ = value_types::small_string_t; + length_or_precision_ = static_cast(length); + std::memcpy(value_.small_string_val_,s,length*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + } + } + + explicit variant(const char_type* s, size_t length, const Alloc& a) + { + if (length > variant::small_string_capacity) + { + type_ = value_types::string_t; + //value_.string_val_ = create_impl(a, s, length, string_allocator(a)); + value_.string_val_ = create_string_data(s, length, string_allocator(a)); + } + else + { + type_ = value_types::small_string_t; + length_or_precision_ = static_cast(length); + std::memcpy(value_.small_string_val_,s,length*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + } + } + + template + variant(InputIterator first, InputIterator last, const Alloc& a) + : type_(value_types::array_t) + { + value_.array_val_ = create_impl(a, first, last, array_allocator(a)); + } + + void init_variant(const variant& var) + { + type_ = var.type_; + switch (type_) + { + case value_types::null_t: + case value_types::empty_object_t: + break; + case value_types::double_t: + length_or_precision_ = 0; + value_.double_val_ = var.value_.double_val_; + break; + case value_types::integer_t: + value_.integer_val_ = var.value_.integer_val_; + break; + case value_types::uinteger_t: + value_.uinteger_val_ = var.value_.uinteger_val_; + break; + case value_types::bool_t: + value_.bool_val_ = var.value_.bool_val_; + break; + case value_types::small_string_t: + length_or_precision_ = var.length_or_precision_; + std::memcpy(value_.small_string_val_,var.value_.small_string_val_,var.length_or_precision_*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + break; + case value_types::string_t: + //value_.string_val_ = create_impl(var.value_.string_val_->get_allocator(), *(var.value_.string_val_), string_allocator(var.value_.string_val_->get_allocator())); + value_.string_val_ = create_string_data(var.value_.string_val_->data(), var.value_.string_val_->length(), string_allocator(var.value_.string_val_->get_allocator())); + break; + case value_types::array_t: + value_.array_val_ = create_impl(var.value_.array_val_->get_allocator(), *(var.value_.array_val_), array_allocator(var.value_.array_val_->get_allocator())); + break; + case value_types::object_t: + value_.object_val_ = create_impl(var.value_.object_val_->get_allocator(), *(var.value_.object_val_), object_allocator(var.value_.object_val_->get_allocator())); + break; + case value_types::any_t: + value_.any_val_ = create_impl(var.value_.any_val_->get_allocator(), *(var.value_.any_val_)); + break; + default: + break; + } + } + + ~variant() + { + destroy_variant(); + } + + void destroy_variant() + { + switch (type_) + { + case value_types::string_t: + //destroy_impl(value_.string_val_->get_allocator(), value_.string_val_); + destroy_string_data(value_.string_val_->get_allocator(), value_.string_val_); + break; + case value_types::array_t: + destroy_impl(value_.array_val_->get_allocator(), value_.array_val_); + break; + case value_types::object_t: + destroy_impl(value_.object_val_->get_allocator(), value_.object_val_); + break; + case value_types::any_t: + destroy_impl(value_.any_val_->get_allocator(), value_.any_val_); + break; + default: + break; + } + } + + variant& operator=(const variant& val) + { + if (this != &val) + { + if (is_simple(type_)) + { + if (is_simple(val.type_)) + { + type_ = val.type_; + length_or_precision_ = val.length_or_precision_; + value_ = val.value_; + } + else + { + init_variant(val); + } + } + else + { + destroy_variant(); + init_variant(val); + } + } + return *this; + } + + variant& operator=(variant&& val) + { + if (this != &val) + { + val.swap(*this); + } + return *this; + } + + void assign(const object & val) + { + destroy_variant(); + type_ = value_types::object_t; + value_.object_val_ = create_impl(val.get_allocator(), val, object_allocator(val.get_allocator())); + } + + void assign(object && val) + { + switch (type_) + { + case value_types::object_t: + value_.object_val_->swap(val); + break; + default: + destroy_variant(); + type_ = value_types::object_t; + value_.object_val_ = create_impl(val.get_allocator(), std::move(val), object_allocator(val.get_allocator())); + break; + } + } + + void assign(const array& val) + { + destroy_variant(); + type_ = value_types::array_t; + value_.array_val_ = create_impl(val.get_allocator(), val, array_allocator(val.get_allocator())) ; + } + + void assign(array&& val) + { + switch (type_) + { + case value_types::array_t: + value_.array_val_->swap(val); + break; + default: + destroy_variant(); + type_ = value_types::array_t; + value_.array_val_ = create_impl(val.get_allocator(), std::move(val), array_allocator(val.get_allocator())); + break; + } + } + + void assign(const string_type& s) + { + destroy_variant(); + if (s.length() > variant::small_string_capacity) + { + type_ = value_types::string_t; + //value_.string_val_ = create_impl(s.get_allocator(), s, string_allocator(s.get_allocator())); + value_.string_val_ = create_string_data(s.data(), s.length(), string_allocator(s.get_allocator())); + } + else + { + type_ = value_types::small_string_t; + length_or_precision_ = static_cast(s.length()); + std::memcpy(value_.small_string_val_,s.data(),s.length()*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + } + } + + void assign_string(const char_type* s, size_t length, const Alloc& allocator = Alloc()) + { + destroy_variant(); + if (length > variant::small_string_capacity) + { + type_ = value_types::string_t; + //value_.string_val_ = create_impl(allocator, s, length, string_allocator(allocator)); + value_.string_val_ = create_string_data(s, length, string_allocator(allocator)); + } + else + { + type_ = value_types::small_string_t; + length_or_precision_ = static_cast(length); + std::memcpy(value_.small_string_val_,s,length*sizeof(char_type)); + value_.small_string_val_[length_or_precision_] = 0; + } + } + + void assign(int64_t val) + { + destroy_variant(); + type_ = value_types::integer_t; + value_.integer_val_ = val; + } + + void assign(uint64_t val) + { + destroy_variant(); + type_ = value_types::uinteger_t; + value_.uinteger_val_ = val; + } + + void assign(double val, uint8_t precision = 0) + { + destroy_variant(); + type_ = value_types::double_t; + length_or_precision_ = precision; + value_.double_val_ = val; + } + + void assign(bool val) + { + destroy_variant(); + type_ = value_types::bool_t; + value_.bool_val_ = val; + } + + void assign(null_type) + { + destroy_variant(); + type_ = value_types::null_t; + } + + void assign(const any& rhs) + { + destroy_variant(); + type_ = value_types::any_t; + value_.any_val_ = create_impl(rhs.get_allocator(), rhs); + } + + bool operator!=(const variant& rhs) const + { + return !(*this == rhs); + } + + bool operator==(const variant& rhs) const + { + if (is_number() & rhs.is_number()) + { + switch (type_) + { + case value_types::integer_t: + switch (rhs.type_) + { + case value_types::integer_t: + return value_.integer_val_ == rhs.value_.integer_val_; + case value_types::uinteger_t: + return value_.integer_val_ == rhs.value_.uinteger_val_; + case value_types::double_t: + return value_.integer_val_ == rhs.value_.double_val_; + default: + break; + } + break; + case value_types::uinteger_t: + switch (rhs.type_) + { + case value_types::integer_t: + return value_.uinteger_val_ == rhs.value_.integer_val_; + case value_types::uinteger_t: + return value_.uinteger_val_ == rhs.value_.uinteger_val_; + case value_types::double_t: + return value_.uinteger_val_ == rhs.value_.double_val_; + default: + break; + } + break; + case value_types::double_t: + switch (rhs.type_) + { + case value_types::integer_t: + return value_.double_val_ == rhs.value_.integer_val_; + case value_types::uinteger_t: + return value_.double_val_ == rhs.value_.uinteger_val_; + case value_types::double_t: + return value_.double_val_ == rhs.value_.double_val_; + default: + break; + } + break; + default: + break; + } + } + + switch (type_) + { + case value_types::bool_t: + return type_ == rhs.type_ && value_.bool_val_ == rhs.value_.bool_val_; + case value_types::null_t: + return type_ == rhs.type_; + case value_types::empty_object_t: + return type_ == rhs.type_ || (rhs.type_ == value_types::object_t && rhs.empty()); + case value_types::small_string_t: + return type_ == rhs.type_ && length_or_precision_ == rhs.length_or_precision_ ? std::char_traits::compare(value_.small_string_val_,rhs.value_.small_string_val_,length_or_precision_) == 0 : false; + case value_types::string_t: + return type_ == rhs.type_ && *(value_.string_val_) == *(rhs.value_.string_val_); + case value_types::array_t: + return type_ == rhs.type_ && *(value_.array_val_) == *(rhs.value_.array_val_); + break; + case value_types::object_t: + return (type_ == rhs.type_ && *(value_.object_val_) == *(rhs.value_.object_val_)) || (rhs.type_ == value_types::empty_object_t && empty()); + break; + case value_types::any_t: + return type_ == rhs.type_; + default: + // throw + break; + } + return false; + } + + bool is_null() const JSONCONS_NOEXCEPT + { + return type_ == value_types::null_t; + } + + bool is_bool() const JSONCONS_NOEXCEPT + { + return type_ == value_types::bool_t; + } + + bool empty() const JSONCONS_NOEXCEPT + { + switch (type_) + { + case value_types::small_string_t: + return length_or_precision_ == 0; + case value_types::string_t: + return value_.string_val_->length() == 0; + case value_types::array_t: + return value_.array_val_->size() == 0; + case value_types::empty_object_t: + return true; + case value_types::object_t: + return value_.object_val_->size() == 0; + default: + return false; + } + } + + bool is_string() const JSONCONS_NOEXCEPT + { + return (type_ == value_types::string_t) | (type_ == value_types::small_string_t); + } + + bool is_number() const JSONCONS_NOEXCEPT + { + return type_ == value_types::double_t || type_ == value_types::integer_t || type_ == value_types::uinteger_t; + } + + void swap(variant& rhs) + { + using std::swap; + if (this == &rhs) + { + // same object, do nothing + } + else + { + swap(type_, rhs.type_); + swap(length_or_precision_, rhs.length_or_precision_); + swap(value_, rhs.value_); + } + } + + value_types type_; + uint8_t length_or_precision_; + union + { + double double_val_; + int64_t integer_val_; + uint64_t uinteger_val_; + bool bool_val_; + object* object_val_; + array* array_val_; + any* any_val_; + string_data* string_val_; + char_type small_string_val_[sizeof(int64_t)/sizeof(char_type)]; + } value_; + }; + + template + class json_proxy + { + private: + typedef json_proxy proxy_type; + + ParentT& parent_; + const string_type& name_; + + json_proxy() = delete; + json_proxy& operator = (const json_proxy& other) = delete; + + json_proxy(ParentT& parent, const string_type& name) + : parent_(parent), name_(name) + { + } + + basic_json& evaluate() + { + return parent_.evaluate(name_); + } + + const basic_json& evaluate() const + { + return parent_.evaluate(name_); + } + + basic_json& evaluate_with_default() + { + basic_json& val = parent_.evaluate_with_default(); + auto it = val.find(name_.data(),name_.length()); + if (it == val.members().end()) + { + it = val.set(val.members().begin(),name_,object(val.object_value().get_allocator())); + } + return it->value(); + } + + basic_json& evaluate(size_t index) + { + return parent_.evaluate(name_).at(index); + } + + const basic_json& evaluate(size_t index) const + { + return parent_.evaluate(name_).at(index); + } + + basic_json& evaluate(const string_type& index) + { + return parent_.evaluate(name_).at(index); + } + + const basic_json& evaluate(const string_type& index) const + { + return parent_.evaluate(name_).at(index); + } + public: + + friend class basic_json; + + object_range members() + { + return evaluate().members(); + } + + const_object_range members() const + { + return evaluate().members(); + } + + array_range elements() + { + return evaluate().elements(); + } + + const_array_range elements() const + { + return evaluate().elements(); + } + + size_t size() const JSONCONS_NOEXCEPT + { + return evaluate().size(); + } + + value_types type() const + { + return evaluate().type(); + } + + size_t count(const string_type& name) const + { + return evaluate().count(name); + } + + bool is_null() const JSONCONS_NOEXCEPT + { + return evaluate().is_null(); + } + + bool empty() const + { + return evaluate().empty(); + } + + size_t capacity() const + { + return evaluate().capacity(); + } + + void reserve(size_t n) + { + evaluate().reserve(n); + } + + void resize(size_t n) + { + evaluate().resize(n); + } + + template + void resize(size_t n, T val) + { + evaluate().resize(n,val); + } + + template + bool is() const + { + return evaluate().template is(); + } + + bool is_string() const JSONCONS_NOEXCEPT + { + return evaluate().is_string(); + } + + bool is_number() const JSONCONS_NOEXCEPT + { + return evaluate().is_number(); + } + bool is_bool() const JSONCONS_NOEXCEPT + { + return evaluate().is_bool(); + } + + bool is_object() const JSONCONS_NOEXCEPT + { + return evaluate().is_object(); + } + + bool is_array() const JSONCONS_NOEXCEPT + { + return evaluate().is_array(); + } + + bool is_any() const JSONCONS_NOEXCEPT + { + return evaluate().is_any(); + } + + bool is_integer() const JSONCONS_NOEXCEPT + { + return evaluate().is_integer(); + } + + bool is_uinteger() const JSONCONS_NOEXCEPT + { + return evaluate().is_uinteger(); + } + + bool is_double() const JSONCONS_NOEXCEPT + { + return evaluate().is_double(); + } + + string_type as_string() const JSONCONS_NOEXCEPT + { + return evaluate().as_string(); + } + + string_type as_string(const string_allocator& allocator) const JSONCONS_NOEXCEPT + { + return evaluate().as_string(allocator); + } + + string_type as_string(const basic_output_format& format) const + { + return evaluate().as_string(format); + } + + string_type as_string(const basic_output_format& format, + const string_allocator& allocator) const + { + return evaluate().as_string(format,allocator); + } + + template + T as() const + { + return evaluate().template as(); + } + + template + typename std::enable_if::value>::type as(const string_allocator& allocator) const + { + return evaluate().template as(allocator); + } + + any& any_value() + { + return evaluate().any_value(); + } + + const any& any_value() const + { + return evaluate().any_value(); + } + + bool as_bool() const JSONCONS_NOEXCEPT + { + return evaluate().as_bool(); + } + + template + std::vector as_vector() const + { + return evaluate().template as_vector(); + } + + double as_double() const + { + return evaluate().as_double(); + } + + int64_t as_integer() const + { + return evaluate().as_integer(); + } + + unsigned long long as_ulonglong() const + { + return evaluate().as_ulonglong(); + } + + uint64_t as_uinteger() const + { + return evaluate().as_uinteger(); + } + + template + const T& any_cast() const + { + return evaluate().template any_cast(); + } + // Returns a const reference to the custom data associated with name + + template + T& any_cast() + { + return evaluate().template any_cast(); + } + // Returns a reference to the custom data associated with name + + operator basic_json&() + { + return evaluate(); + } + + operator const basic_json&() const + { + return evaluate(); + } + + template + json_proxy& operator=(T val) + { + parent_.evaluate_with_default().set(name_, val); + return *this; + } + + json_proxy& operator=(const basic_json& val) + { + parent_.evaluate_with_default().set(name_, val); + return *this; + } + + json_proxy& operator=(basic_json&& val) + { + parent_.evaluate_with_default().set(name_, std::move(val)); + return *this; + } + + bool operator==(const basic_json& val) const + { + return evaluate() == val; + } + + bool operator!=(const basic_json& val) const + { + return evaluate() != val; + } + + basic_json& operator[](size_t i) + { + return evaluate_with_default().at(i); + } + + const basic_json& operator[](size_t i) const + { + return evaluate().at(i); + } + + json_proxy operator[](const string_type& name) + { + return json_proxy(*this,name); + } + + const json_proxy operator[](const string_type& name) const + { + return json_proxy(*this,name); + } + + basic_json& at(const string_type& name) + { + return evaluate().at(name); + } + + const basic_json& at(const string_type& name) const + { + return evaluate().at(name); + } + + const basic_json& at(size_t index) + { + return evaluate().at(index); + } + + const basic_json& at(size_t index) const + { + return evaluate().at(index); + } + + object_iterator find(const string_type& name) + { + return evaluate().find(name); + } + + const_object_iterator find(const string_type& name) const + { + return evaluate().find(name); + } + + object_iterator find(const char_type* name) + { + return evaluate().find(name); + } + + const_object_iterator find(const char_type* name) const + { + return evaluate().find(name); + } + + object_iterator find(const char_type* name, size_t length) + { + return evaluate().find(name,length); + } + + const_object_iterator find(const char_type* name, size_t length) const + { + return evaluate().find(name,length); + } + + template + basic_json get(const string_type& name, T&& default_val) const + { + return evaluate().get(name,std::forward(default_val)); + } + + void shrink_to_fit() + { + evaluate_with_default().shrink_to_fit(); + } + + void clear() + { + evaluate().clear(); + } + // Remove all elements from an array or object + + void erase(object_iterator first, object_iterator last) + { + evaluate().erase(first, last); + } + // Remove a range of elements from an object + + void erase(array_iterator first, array_iterator last) + { + evaluate().erase(first, last); + } + + void erase(const string_type& name) + { + evaluate().erase(name); + } + + // Remove a member from an object + + void set(const string_type& name, const basic_json& value) + { + evaluate().set(name,value); + } + + void set(string_type&& name, const basic_json& value) + + { + evaluate().set(std::move(name),value); + } + + void set(const string_type& name, basic_json&& value) + + { + evaluate().set(name,std::move(value)); + } + + void set(string_type&& name, basic_json&& value) + + { + evaluate().set(std::move(name),std::move(value)); + } + + object_iterator set(object_iterator hint, const string_type& name, const basic_json& value) + { + return evaluate().set(hint, name,value); + } + + object_iterator set(object_iterator hint, string_type&& name, const basic_json& value) + + { + return evaluate().set(hint, std::move(name),value); + } + + object_iterator set(object_iterator hint, const string_type& name, basic_json&& value) + + { + return evaluate().set(hint, name,std::move(value)); + } + + object_iterator set(object_iterator hint, string_type&& name, basic_json&& value) + + { + return evaluate().set(hint, std::move(name),std::move(value)); + } + + void add(basic_json&& value) + { + evaluate_with_default().add(std::move(value)); + } + + void add(const basic_json& value) + { + evaluate_with_default().add(value); + } + + array_iterator add(const_array_iterator pos, const basic_json& value) + { + return evaluate_with_default().add(pos, value); + } + + array_iterator add(const_array_iterator pos, basic_json&& value) + { + return evaluate_with_default().add(pos, std::move(value)); + } + + string_type to_string(const string_allocator& allocator = string_allocator()) const JSONCONS_NOEXCEPT + { + return evaluate().to_string(allocator); + } + + string_type to_string(const basic_output_format& format, string_allocator& allocator = string_allocator()) const + { + return evaluate().to_string(format,allocator); + } + + void to_stream(std::basic_ostream& os) const + { + evaluate().to_stream(os); + } + + void to_stream(std::basic_ostream& os, const basic_output_format& format) const + { + evaluate().to_stream(os,format); + } + + void to_stream(std::basic_ostream& os, const basic_output_format& format, bool indenting) const + { + evaluate().to_stream(os,format,indenting); + } + + void swap(basic_json& val) + { + evaluate_with_default().swap(val); + } + + friend std::basic_ostream& operator<<(std::basic_ostream& os, const json_proxy& o) + { + o.to_stream(os); + return os; + } + +#if !defined(JSONCONS_NO_DEPRECATED) + + void resize_array(size_t n) + { + evaluate().resize_array(n); + } + + template + void resize_array(size_t n, T val) + { + evaluate().resize_array(n,val); + } + + object_iterator begin_members() + { + return evaluate().begin_members(); + } + + const_object_iterator begin_members() const + { + return evaluate().begin_members(); + } + + object_iterator end_members() + { + return evaluate().end_members(); + } + + const_object_iterator end_members() const + { + return evaluate().end_members(); + } + + array_iterator begin_elements() + { + return evaluate().begin_elements(); + } + + const_array_iterator begin_elements() const + { + return evaluate().begin_elements(); + } + + array_iterator end_elements() + { + return evaluate().end_elements(); + } + + const_array_iterator end_elements() const + { + return evaluate().end_elements(); + } + + const basic_json& get(const string_type& name) const + { + return evaluate().get(name); + } + + bool is_ulonglong() const JSONCONS_NOEXCEPT + { + return evaluate().is_ulonglong(); + } + + bool is_longlong() const JSONCONS_NOEXCEPT + { + return evaluate().is_longlong(); + } + + int as_int() const + { + return evaluate().as_int(); + } + + unsigned int as_uint() const + { + return evaluate().as_uint(); + } + + long as_long() const + { + return evaluate().as_long(); + } + + unsigned long as_ulong() const + { + return evaluate().as_ulong(); + } + + long long as_longlong() const + { + return evaluate().as_longlong(); + } + + void add(size_t index, const basic_json& value) + { + evaluate_with_default().add(index, value); + } + + void add(size_t index, basic_json&& value) + { + evaluate_with_default().add(index, std::move(value)); + } + + bool has_member(const string_type& name) const + { + return evaluate().has_member(name); + } + + // Remove a range of elements from an array + void remove_range(size_t from_index, size_t to_index) + { + evaluate().remove_range(from_index, to_index); + } + // Remove a range of elements from an array + void remove(const string_type& name) + { + evaluate().remove(name); + } + void remove_member(const string_type& name) + { + evaluate().remove(name); + } + bool is_empty() const JSONCONS_NOEXCEPT + { + return empty(); + } + bool is_numeric() const JSONCONS_NOEXCEPT + { + return is_number(); + } +#endif + }; + + static basic_json parse_stream(std::basic_istream& is); + static basic_json parse_stream(std::basic_istream& is, basic_parse_error_handler& err_handler); + + static basic_json parse(const string_type& s) + { + basic_json_deserializer> handler; + basic_json_parser parser(handler); + parser.begin_parse(); + parser.parse(s.data(),0,s.length()); + parser.end_parse(); + parser.check_done(s.data(),parser.index(),s.length()); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json string"); + } + return handler.get_result(); + } + + static basic_json parse(const string_type& s, basic_parse_error_handler& err_handler) + { + basic_json_deserializer> handler; + basic_json_parser parser(handler,err_handler); + parser.begin_parse(); + parser.parse(s.data(),0,s.length()); + parser.end_parse(); + parser.check_done(s.data(),parser.index(),s.length()); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json string"); + } + return handler.get_result(); + } + + static basic_json parse_file(const std::string& s); + + static basic_json parse_file(const std::string& s, basic_parse_error_handler& err_handler); + + static basic_json make_array() + { + return basic_json::array(); + } + + static basic_json make_array(size_t n, const array_allocator& allocator = array_allocator()) + { + return basic_json::array(n,allocator); + } + + template + static basic_json make_array(size_t n, const T& val, const array_allocator& allocator = array_allocator()) + { + return basic_json::array(n, val,allocator); + } + + template + static typename std::enable_if::type make_array(size_t n) + { + return array(n); + } + + template + static typename std::enable_if::type make_array(size_t n, const T& val, const Alloc& allocator = Alloc()) + { + return array(n,val,allocator); + } + + template + static typename std::enable_if<(dim>1),basic_json>::type make_array(size_t n, Args... args) + { + const size_t dim1 = dim - 1; + + basic_json val = make_array(args...); + val.resize(n); + for (size_t i = 0; i < n; ++i) + { + val[i] = make_array(args...); + } + return val; + } + + variant var_; + + basic_json() + : var_() + { + } + + basic_json(const Alloc& allocator) + : var_(allocator) + { + } + + basic_json(std::initializer_list init, + const Alloc& allocator = Alloc()) + : var_(std::move(init), allocator) + { + } + + basic_json(const basic_json& val) + : var_(val.var_) + { + } + + basic_json(const basic_json& val, const Alloc& allocator) + : var_(val.var_,allocator) + { + } + + basic_json(basic_json&& other) + : var_(std::move(other.var_)) + { + } + + basic_json(basic_json&& other, const Alloc& allocator) + : var_(std::move(other.var_),allocator) + { + } + + basic_json(const array& val) + : var_(val) + { + } + + basic_json(array&& other) + : var_(std::move(other)) + { + } + + basic_json(const object& other) + : var_(other) + { + } + + basic_json(object&& other) + : var_(std::move(other)) + { + } + + template + basic_json(const json_proxy& proxy, const Alloc& allocator = Alloc()) + : var_(proxy.evaluate().var_,allocator) + { + } + + template + basic_json(T val) + : var_(null_type()) + { + json_type_traits::assign(*this,val); + } + + basic_json(double val, uint8_t precision) + : var_(val,precision) + { + } + + template + basic_json(T val, const Alloc& allocator) + : var_(allocator) + { + json_type_traits::assign(*this,val); + } + + basic_json(const char_type *s, size_t length, const Alloc& allocator = Alloc()) + : var_(s, length, allocator) + { + } + template + basic_json(InputIterator first, InputIterator last, const Alloc& allocator = Alloc()) + : var_(first,last,allocator) + { + } + + ~basic_json() + { + } + + basic_json& operator=(const basic_json& rhs) + { + var_ = rhs.var_; + return *this; + } + + basic_json& operator=(basic_json&& rhs) + { + if (this != &rhs) + { + var_ = std::move(rhs.var_); + } + return *this; + } + + basic_json& operator=(std::initializer_list init) + { + basic_json val(init); + swap(val); + return *this; + } + + template + basic_json& operator=(T val) + { + json_type_traits::assign(*this,val); + return *this; + } + + bool operator!=(const basic_json& rhs) const; + + bool operator==(const basic_json& rhs) const; + + size_t size() const JSONCONS_NOEXCEPT + { + switch (var_.type_) + { + case value_types::empty_object_t: + return 0; + case value_types::object_t: + return var_.value_.object_val_->size(); + case value_types::array_t: + return var_.value_.array_val_->size(); + default: + return 0; + } + } + + basic_json& operator[](size_t i) + { + return at(i); + } + + const basic_json& operator[](size_t i) const + { + return at(i); + } + + json_proxy> operator[](const string_type& name) + { + switch (var_.type_) + { + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return json_proxy>(*this, name); + break; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an object"); + break; + } + } + + const basic_json& operator[](const string_type& name) const + { + return at(name); + } + + string_type to_string(const string_allocator& allocator=string_allocator()) const JSONCONS_NOEXCEPT + { + string_type s(allocator); + std::basic_ostringstream os(s); + { + basic_json_serializer serializer(os); + to_stream(serializer); + } + return os.str(); + } + + string_type to_string(const basic_output_format& format, + const string_allocator& allocator=string_allocator()) const + { + string_type s(allocator); + std::basic_ostringstream os(s); + { + basic_json_serializer serializer(os, format); + to_stream(serializer); + } + return os.str(); + } + + void to_stream(basic_json_output_handler& handler) const + { + switch (var_.type_) + { + case value_types::small_string_t: + handler.value(var_.value_.small_string_val_,var_.length_or_precision_); + break; + case value_types::string_t: + handler.value(var_.value_.string_val_->data(),var_.value_.string_val_->length()); + break; + case value_types::double_t: + handler.value(var_.value_.double_val_, var_.length_or_precision_); + break; + case value_types::integer_t: + handler.value(var_.value_.integer_val_); + break; + case value_types::uinteger_t: + handler.value(var_.value_.uinteger_val_); + break; + case value_types::bool_t: + handler.value(var_.value_.bool_val_); + break; + case value_types::null_t: + handler.value(null_type()); + break; + case value_types::empty_object_t: + handler.begin_object(); + handler.end_object(); + break; + case value_types::object_t: + { + handler.begin_object(); + object* o = var_.value_.object_val_; + for (const_object_iterator it = o->begin(); it != o->end(); ++it) + { + handler.name((it->name()).data(),it->name().length()); + it->value().to_stream(handler); + } + handler.end_object(); + } + break; + case value_types::array_t: + { + handler.begin_array(); + array *o = var_.value_.array_val_; + for (const_array_iterator it = o->begin(); it != o->end(); ++it) + { + it->to_stream(handler); + } + handler.end_array(); + } + break; + case value_types::any_t: + var_.value_.any_val_->to_stream(handler); + break; + default: + break; + } + } + + void to_stream(std::basic_ostream& os) const + { + basic_json_serializer serializer(os); + to_stream(serializer); + } + + void to_stream(std::basic_ostream& os, const basic_output_format& format) const + { + basic_json_serializer serializer(os, format); + to_stream(serializer); + } + + void to_stream(std::basic_ostream& os, const basic_output_format& format, bool indenting) const + { + basic_json_serializer serializer(os, format, indenting); + to_stream(serializer); + } + + bool is_null() const JSONCONS_NOEXCEPT + { + return var_.is_null(); + } + + size_t count(const string_type& name) const + { + switch (var_.type_) + { + case value_types::object_t: + { + auto it = var_.value_.object_val_->find(name.data(),name.length()); + if (it == members().end()) + { + return 0; + } + size_t count = 0; + while (it != members().end() && it->name() == name) + { + ++count; + ++it; + } + return count; + } + break; + default: + return 0; + } + } + + template + bool is() const + { + return json_type_traits::is(*this); + } + + bool is_string() const JSONCONS_NOEXCEPT + { + return var_.is_string(); + } + + + bool is_bool() const JSONCONS_NOEXCEPT + { + return var_.is_bool(); + } + + bool is_object() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::object_t || var_.type_ == value_types::empty_object_t; + } + + bool is_array() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::array_t; + } + + bool is_any() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::any_t; + } + + bool is_integer() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::integer_t || (var_.type_ == value_types::uinteger_t && (as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()))); + } + + bool is_uinteger() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::uinteger_t || (var_.type_ == value_types::integer_t && as_integer() >= 0); + } + + bool is_double() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::double_t; + } + + bool is_number() const JSONCONS_NOEXCEPT + { + return var_.is_number(); + } + + bool empty() const JSONCONS_NOEXCEPT + { + return var_.empty(); + } + + size_t capacity() const + { + switch (var_.type_) + { + case value_types::array_t: + return var_.value_.array_val_->capacity(); + case value_types::object_t: + return var_.value_.object_val_->capacity(); + default: + return 0; + } + } + + template::value + >::type* = nullptr> + void create_object_implicitly() + { + var_.type_ = value_types::object_t; + var_.value_.object_val_ = create_impl(Alloc(),object_allocator(Alloc())); + } + + template::value + >::type* = nullptr> + void create_object_implicitly() const + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Cannot create_impl object implicitly - allocator is not default constructible."); + } + + void reserve(size_t n) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->reserve(n); + break; + case value_types::empty_object_t: + { + create_object_implicitly(); + var_.value_.object_val_->reserve(n); + } + break; + case value_types::object_t: + { + var_.value_.object_val_->reserve(n); + } + break; + default: + break; + } + } + + void resize(size_t n) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->resize(n); + break; + default: + break; + } + } + + template + void resize(size_t n, T val) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->resize(n, val); + break; + default: + break; + } + } + + template + T as() const + { + return json_type_traits::as(*this); + } + + template + typename std::enable_if::value>::type as(const string_allocator& allocator) const + { + return json_type_traits::as(*this,allocator); + } + + bool as_bool() const JSONCONS_NOEXCEPT + { + switch (var_.type_) + { + case value_types::null_t: + case value_types::empty_object_t: + return false; + case value_types::bool_t: + return var_.value_.bool_val_; + case value_types::double_t: + return var_.value_.double_val_ != 0.0; + case value_types::integer_t: + return var_.value_.integer_val_ != 0; + case value_types::uinteger_t: + return var_.value_.uinteger_val_ != 0; + case value_types::small_string_t: + return var_.length_or_precision_ != 0; + case value_types::string_t: + return var_.value_.string_val_->length() != 0; + case value_types::array_t: + return var_.value_.array_val_->size() != 0; + case value_types::object_t: + return var_.value_.object_val_->size() != 0; + case value_types::any_t: + return true; + default: + return false; + } + } + + int64_t as_integer() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an integer"); + } + } + + uint64_t as_uinteger() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an unsigned integer"); + } + } + + double as_double() const + { + switch (var_.type_) + { + case value_types::double_t: + return var_.value_.double_val_; + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::null_t: + return std::numeric_limits::quiet_NaN(); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not a double"); + } + } + + string_type as_string() const JSONCONS_NOEXCEPT + { + switch (var_.type_) + { + case value_types::small_string_t: + return string_type(var_.value_.small_string_val_,var_.length_or_precision_); + case value_types::string_t: + return string_type(var_.value_.string_val_->data(),var_.value_.string_val_->length(),var_.value_.string_val_->get_allocator()); + default: + return to_string(); + } + } + + string_type as_string(const string_allocator& allocator) const JSONCONS_NOEXCEPT + { + switch (var_.type_) + { + case value_types::small_string_t: + return string_type(var_.value_.small_string_val_,var_.length_or_precision_,allocator); + case value_types::string_t: + return string_type(var_.value_.string_val_->data(),var_.value_.string_val_->length(),allocator); + default: + return to_string(allocator); + } + } + + string_type as_string(const basic_output_format& format) const + { + switch (var_.type_) + { + case value_types::small_string_t: + return string_type(var_.value_.small_string_val_,var_.length_or_precision_); + case value_types::string_t: + return string_type(var_.value_.string_val_->data(),var_.value_.string_val_->length(),var_.value_.string_val_->get_allocator()); + default: + return to_string(format); + } + } + + string_type as_string(const basic_output_format& format, + const string_allocator& allocator) const + { + switch (var_.type_) + { + case value_types::small_string_t: + return string_type(var_.value_.small_string_val_,var_.length_or_precision_,allocator); + case value_types::string_t: + return string_type(var_.value_.string_val_->data(),var_.value_.string_val_->length(),allocator); + default: + return to_string(format,allocator); + } + } + + const char_type* as_cstring() const + { + switch (var_.type_) + { + case value_types::small_string_t: + return var_.value_.small_string_val_; + case value_types::string_t: + return var_.value_.string_val_->c_str(); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not a cstring"); + } + } + + any& any_value(); + + const any& any_value() const; + + basic_json& at(const string_type& name) + { + switch (var_.type_) + { + case value_types::empty_object_t: + JSONCONS_THROW_EXCEPTION_1(std::out_of_range,"%s not found", name); + case value_types::object_t: + { + auto it = var_.value_.object_val_->find(name.data(),name.length()); + if (it == members().end()) + { + JSONCONS_THROW_EXCEPTION_1(std::out_of_range, "%s not found", name); + } + return it->value(); + } + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + basic_json& evaluate() + { + return *this; + } + + basic_json& evaluate_with_default() + { + return *this; + } + + const basic_json& evaluate() const + { + return *this; + } + + basic_json& evaluate(size_t i) + { + return at(i); + } + + const basic_json& evaluate(size_t i) const + { + return at(i); + } + + basic_json& evaluate(const string_type& name) + { + return at(name); + } + + const basic_json& evaluate(const string_type& name) const + { + return at(name); + } + + const basic_json& at(const string_type& name) const + { + switch (var_.type_) + { + case value_types::empty_object_t: + JSONCONS_THROW_EXCEPTION_1(std::out_of_range,"%s not found", name); + case value_types::object_t: + { + auto it = var_.value_.object_val_->find(name.data(),name.length()); + if (it == members().end()) + { + JSONCONS_THROW_EXCEPTION_1(std::out_of_range, "%s not found", name); + } + return it->value(); + } + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + basic_json& at(size_t i) + { + switch (var_.type_) + { + case value_types::array_t: + if (i >= var_.value_.array_val_->size()) + { + JSONCONS_THROW_EXCEPTION(std::out_of_range,"Invalid array subscript"); + } + return var_.value_.array_val_->operator[](i); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Index on non-array value not supported"); + } + } + + const basic_json& at(size_t i) const + { + switch (var_.type_) + { + case value_types::array_t: + if (i >= var_.value_.array_val_->size()) + { + JSONCONS_THROW_EXCEPTION(std::out_of_range,"Invalid array subscript"); + } + return var_.value_.array_val_->operator[](i); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Index on non-array value not supported"); + } + } + + object_iterator find(const string_type& name) + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name.data(),name.length()); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + const_object_iterator find(const string_type& name) const + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name.data(),name.length()); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + object_iterator find(const char_type* name) + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name, std::char_traits::length(name)); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + const_object_iterator find(const char_type* name) const + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name, std::char_traits::length(name)); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + object_iterator find(const char_type* name, size_t length) + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name, length); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + const_object_iterator find(const char_type* name, size_t length) const + { + switch (var_.type_) + { + case value_types::empty_object_t: + return members().end(); + case value_types::object_t: + return var_.value_.object_val_->find(name, length); + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + template + basic_json get(const string_type& name, T&& default_val) const + { + switch (var_.type_) + { + case value_types::empty_object_t: + { + return basic_json(std::forward(default_val)); + } + case value_types::object_t: + { + const_object_iterator it = var_.value_.object_val_->find(name.data(),name.length()); + if (it != members().end()) + { + return it->value(); + } + else + { + return basic_json(std::forward(default_val)); + } + } + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + // Modifiers + + void shrink_to_fit() + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->shrink_to_fit(); + break; + case value_types::object_t: + var_.value_.object_val_->shrink_to_fit(); + break; + default: + break; + } + } + + void clear() + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->clear(); + break; + case value_types::object_t: + var_.value_.object_val_->clear(); + break; + default: + break; + } + } + + void erase(object_iterator first, object_iterator last) + { + switch (var_.type_) + { + case value_types::empty_object_t: + break; + case value_types::object_t: + var_.value_.object_val_->erase(first, last); + break; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an object"); + break; + } + } + + void erase(array_iterator first, array_iterator last) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->erase(first, last); + break; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an array"); + break; + } + } + + // Removes all elements from an array value whose index is between from_index, inclusive, and to_index, exclusive. + + void erase(const string_type& name) + { + switch (var_.type_) + { + case value_types::empty_object_t: + break; + case value_types::object_t: + var_.value_.object_val_->erase(name.data(),name.length()); + break; + default: + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object", name); + break; + } + } + + void set(const string_type& name, const basic_json& value) + { + switch (var_.type_) + { + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + var_.value_.object_val_->set(name, value); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object", name); + } + } + } + + void set(string_type&& name, const basic_json& value){ + switch (var_.type_){ + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + var_.value_.object_val_->set(std::move(name),value); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + void set(const string_type& name, basic_json&& value){ + switch (var_.type_){ + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + var_.value_.object_val_->set(name,std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + void set(string_type&& name, basic_json&& value) + { + switch (var_.type_) + { + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + var_.value_.object_val_->set(std::move(name),std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + object_iterator set(object_iterator hint, const string_type& name, const basic_json& value) + { + switch (var_.type_) + { + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return var_.value_.object_val_->set(hint, name, value); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object", name); + } + } + } + + object_iterator set(object_iterator hint, string_type&& name, const basic_json& value){ + switch (var_.type_){ + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return var_.value_.object_val_->set(hint, std::move(name),value); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + object_iterator set(object_iterator hint, const string_type& name, basic_json&& value){ + switch (var_.type_){ + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return var_.value_.object_val_->set(hint, name,std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + object_iterator set(object_iterator hint, string_type&& name, basic_json&& value){ + switch (var_.type_){ + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return var_.value_.object_val_->set(hint, std::move(name),std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to set %s on a value that is not an object",name); + } + } + } + + void add(const basic_json& value) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->push_back(value); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + void add(basic_json&& value){ + switch (var_.type_){ + case value_types::array_t: + var_.value_.array_val_->push_back(std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + array_iterator add(const_array_iterator pos, const basic_json& value) + { + switch (var_.type_) + { + case value_types::array_t: + return var_.value_.array_val_->add(pos, value); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + array_iterator add(const_array_iterator pos, basic_json&& value){ + switch (var_.type_){ + case value_types::array_t: + return var_.value_.array_val_->add(pos, std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + value_types type() const + { + return var_.type_; + } + + uint8_t length_or_precision() const + { + return var_.length_or_precision_; + } + + void swap(basic_json& b) + { + var_.swap(b.var_); + } + + template + std::vector as_vector() const + { + std::vector v(size()); + for (size_t i = 0; i < v.size(); ++i) + { + v[i] = json_type_traits::as(at(i)); + } + return v; + } + + friend void swap(basic_json& a, basic_json& b) + { + a.swap(b); + } + + void assign_any(const typename basic_json::any& rhs) + { + var_.assign(rhs); + } + + void assign_string(const string_type& rhs) + { + var_.assign(rhs); + } + + void assign_string(const char_type* rhs, size_t length) + { + var_.assign_string(rhs,length); + } + + void assign_bool(bool rhs) + { + var_.assign(rhs); + } + + void assign_object(const object & rhs) + { + var_.assign(rhs); + } + + void assign_array(const array& rhs) + { + var_.assign(rhs); + } + + void assign_null() + { + var_.assign(null_type()); + } + + template + const T& any_cast() const + { + if (var_.type_ != value_types::any_t) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad any cast"); + } + return var_.value_.any_val_->template cast(); + } + template + T& any_cast() + { + if (var_.type_ != value_types::any_t) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad any cast"); + } + return var_.value_.any_val_->template cast(); + } + + void assign_integer(int64_t rhs) + { + var_.assign(rhs); + } + + void assign_uinteger(uint64_t rhs) + { + var_.assign(rhs); + } + + void assign_double(double rhs, uint8_t precision = 0) + { + var_.assign(rhs,precision); + } + + static basic_json make_2d_array(size_t m, size_t n); + + template + static basic_json make_2d_array(size_t m, size_t n, T val); + + static basic_json make_3d_array(size_t m, size_t n, size_t k); + + template + static basic_json make_3d_array(size_t m, size_t n, size_t k, T val); + +#if !defined(JSONCONS_NO_DEPRECATED) + typedef any json_any_type; + + static basic_json parse(std::basic_istream& is) + { + return parse_stream(is); + } + static basic_json parse(std::basic_istream& is, basic_parse_error_handler& err_handler) + { + return parse_stream(is,err_handler); + } + + static basic_json parse_string(const string_type& s) + { + return parse(s); + } + + static basic_json parse_string(const string_type& s, basic_parse_error_handler& err_handler) + { + return parse(s,err_handler); + } + + void resize_array(size_t n) + { + resize(n); + } + + template + void resize_array(size_t n, T val) + { + resize(n,val); + } + + object_iterator begin_members() + { + return members().begin(); + } + + const_object_iterator begin_members() const + { + return members().begin(); + } + + object_iterator end_members() + { + return members().end(); + } + + const_object_iterator end_members() const + { + return members().end(); + } + + array_iterator begin_elements() + { + return elements().begin(); + } + + const_array_iterator begin_elements() const + { + return elements().begin(); + } + + array_iterator end_elements() + { + return elements().end(); + } + + const_array_iterator end_elements() const + { + return elements().end(); + } + + const basic_json& get(const string_type& name) const + { + static const basic_json a_null = null_type(); + + switch (var_.type_) + { + case value_types::empty_object_t: + return a_null; + case value_types::object_t: + { + const_object_iterator it = var_.value_.object_val_->find(name.data(),name.length()); + return it != members().end() ? it->value() : a_null; + } + default: + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Attempting to get %s from a value that is not an object", name); + } + } + } + + bool is_longlong() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::integer_t; + } + + bool is_ulonglong() const JSONCONS_NOEXCEPT + { + return var_.type_ == value_types::uinteger_t; + } + + long long as_longlong() const + { + return as_integer(); + } + + unsigned long long as_ulonglong() const + { + return as_uinteger(); + } + + int as_int() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an int"); + } + } + + unsigned int as_uint() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an unsigned int"); + } + } + + long as_long() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not a long"); + } + } + + unsigned long as_ulong() const + { + switch (var_.type_) + { + case value_types::double_t: + return static_cast(var_.value_.double_val_); + case value_types::integer_t: + return static_cast(var_.value_.integer_val_); + case value_types::uinteger_t: + return static_cast(var_.value_.uinteger_val_); + case value_types::bool_t: + return var_.value_.bool_val_ ? 1 : 0; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an unsigned long"); + } + } + + void add(size_t index, const basic_json& value) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->add(index, value); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + void add(size_t index, basic_json&& value){ + switch (var_.type_){ + case value_types::array_t: + var_.value_.array_val_->add(index, std::move(value)); + break; + default: + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Attempting to insert into a value that is not an array"); + } + } + } + + bool has_member(const string_type& name) const + { + switch (var_.type_) + { + case value_types::object_t: + { + const_object_iterator it = var_.value_.object_val_->find(name.data(),name.length()); + return it != members().end(); + } + break; + default: + return false; + } + } + + void remove_range(size_t from_index, size_t to_index) + { + switch (var_.type_) + { + case value_types::array_t: + var_.value_.array_val_->remove_range(from_index, to_index); + break; + default: + break; + } + } + // Removes all elements from an array value whose index is between from_index, inclusive, and to_index, exclusive. + + void remove(const string_type& name) + { + erase(name.data(),name.length()); + } + void remove_member(const string_type& name) + { + erase(name.data(),name.length()); + } + // Removes a member from an object value + + bool is_empty() const JSONCONS_NOEXCEPT + { + return empty(); + } + bool is_numeric() const JSONCONS_NOEXCEPT + { + return is_number(); + } + + void assign_longlong(long long rhs) + { + var_.assign(rhs); + } + void assign_ulonglong(unsigned long long rhs) + { + var_.assign(rhs); + } + + template + static typename std::enable_if::type make_multi_array() + { + return make_array(); + } + template + static typename std::enable_if::type make_multi_array(size_t n) + { + return make_array(n); + } + template + static typename std::enable_if::type make_multi_array(size_t n, T val) + { + return make_array(n,val); + } + template + static typename std::enable_if::type make_multi_array(size_t m, size_t n) + { + return make_array<2>(m, n); + } + template + static typename std::enable_if::type make_multi_array(size_t m, size_t n, T val) + { + return make_array<2>(m, n, val); + } + template + static typename std::enable_if::type make_multi_array(size_t m, size_t n, size_t k) + { + return make_array<3>(m, n, k); + } + template + static typename std::enable_if::type make_multi_array(size_t m, size_t n, size_t k, T val) + { + return make_array<3>(m, n, k, val); + } +#endif + + object_range members() + { + switch (var_.type_) + { + case value_types::empty_object_t: + return object_range(object_iterator(true),object_iterator(true)); + case value_types::object_t: + return object_range(object_value().begin(),object_value().end()); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an object"); + } + } + + const_object_range members() const + { + switch (var_.type_) + { + case value_types::empty_object_t: + return const_object_range(const_object_iterator(true),const_object_iterator(true)); + case value_types::object_t: + return const_object_range(object_value().begin(),object_value().end()); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an object"); + } + } + + array_range elements() + { + switch (var_.type_) + { + case value_types::array_t: + return array_range(array_value().begin(),array_value().end()); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an array"); + } + } + + const_array_range elements() const + { + switch (var_.type_) + { + case value_types::array_t: + return const_array_range(array_value().begin(),array_value().end()); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an array"); + } + } + + array& array_value() + { + switch (var_.type_) + { + case value_types::array_t: + return *(var_.value_.array_val_); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad array cast"); + break; + } + } + + const array& array_value() const + { + switch (var_.type_) + { + case value_types::array_t: + return *(var_.value_.array_val_); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad array cast"); + break; + } + } + + object& object_value() + { + switch (var_.type_) + { + case value_types::empty_object_t: + create_object_implicitly(); + case value_types::object_t: + return *(var_.value_.object_val_); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad object cast"); + break; + } + } + + const object& object_value() const + { + switch (var_.type_) + { + case value_types::empty_object_t: + const_cast(this)->create_object_implicitly(); // HERE + case value_types::object_t: + return *(var_.value_.object_val_); + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad object cast"); + break; + } + } + +private: + + friend std::basic_ostream& operator<<(std::basic_ostream& os, const basic_json& o) + { + o.to_stream(os); + return os; + } + + friend std::basic_istream& operator<<(std::basic_istream& is, basic_json& o) + { + basic_json_deserializer> handler; + basic_json_reader reader(is, handler); + reader.read_next(); + reader.check_done(); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json stream"); + } + o = handler.get_result(); + return is; + } +}; + +template +void swap(typename JsonT::member_type& a, typename JsonT::member_type& b) +{ + a.swap(b); +} + +template +bool basic_json::operator!=(const basic_json& rhs) const +{ + return !(*this == rhs); +} + +template +bool basic_json::operator==(const basic_json& rhs) const +{ + return var_ == rhs.var_; +} + +template +basic_json basic_json::make_2d_array(size_t m, size_t n) +{ + basic_json a = basic_json::array(); + a.resize(m); + for (size_t i = 0; i < a.size(); ++i) + { + a[i] = basic_json::make_array(n); + } + return a; +} + +template +template +basic_json basic_json::make_2d_array(size_t m, size_t n, T val) +{ + basic_json v; + v = val; + basic_json a = make_array(m); + for (size_t i = 0; i < a.size(); ++i) + { + a[i] = basic_json::make_array(n, v); + } + return a; +} + +template +basic_json basic_json::make_3d_array(size_t m, size_t n, size_t k) +{ + basic_json a = basic_json::array(); + a.resize(m); + for (size_t i = 0; i < a.size(); ++i) + { + a[i] = basic_json::make_2d_array(n, k); + } + return a; +} + +template +template +basic_json basic_json::make_3d_array(size_t m, size_t n, size_t k, T val) +{ + basic_json v; + v = val; + basic_json a = make_array(m); + for (size_t i = 0; i < a.size(); ++i) + { + a[i] = basic_json::make_2d_array(n, k, v); + } + return a; +} + +template +basic_json basic_json::parse_stream(std::basic_istream& is) +{ + basic_json_deserializer> handler; + basic_json_reader reader(is, handler); + reader.read_next(); + reader.check_done(); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json stream"); + } + return handler.get_result(); +} + +template +basic_json basic_json::parse_stream(std::basic_istream& is, + basic_parse_error_handler& err_handler) +{ + basic_json_deserializer> handler; + basic_json_reader reader(is, handler, err_handler); + reader.read_next(); + reader.check_done(); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json stream"); + } + return handler.get_result(); +} + +template +basic_json basic_json::parse_file(const std::string& filename) +{ + FILE* fp; + +#if defined(JSONCONS_HAS_FOPEN_S) + errno_t err = fopen_s(&fp, filename.c_str(), "rb"); + if (err != 0) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Cannot open file %s", filename); + } +#else + fp = std::fopen(filename.c_str(), "rb"); + if (fp == nullptr) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Cannot open file %s", filename); + } +#endif + basic_json_deserializer> handler; + try + { + // obtain file size: + std::fseek (fp , 0 , SEEK_END); + long size = std::ftell (fp); + std::rewind(fp); + + if (size > 0) + { + std::vector buffer(size); + + // copy the file into the buffer: + size_t result = std::fread (buffer.data(),1,size,fp); + if (result != static_cast(size)) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Error reading file %s", filename); + } + + basic_json_parser parser(handler); + parser.begin_parse(); + parser.parse(buffer.data(),0,buffer.size()); + parser.end_parse(); + parser.check_done(buffer.data(),parser.index(),buffer.size()); + } + + std::fclose (fp); + } + catch (...) + { + std::fclose (fp); + throw; + } + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json file"); + } + return handler.get_result(); +} + +template +basic_json basic_json::parse_file(const std::string& filename, + basic_parse_error_handler& err_handler) +{ + FILE* fp; + +#if !defined(JSONCONS_HAS_FOPEN_S) + fp = std::fopen(filename.c_str(), "rb"); + if (fp == nullptr) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Cannot open file %s", filename); + } +#else + errno_t err = fopen_s(&fp, filename.c_str(), "rb"); + if (err != 0) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Cannot open file %s", filename); + } +#endif + + basic_json_deserializer> handler; + try + { + // obtain file size: + std::fseek (fp , 0 , SEEK_END); + long size = std::ftell (fp); + std::rewind(fp); + + if (size > 0) + { + std::vector buffer(size); + + // copy the file into the buffer: + size_t result = std::fread (buffer.data(),1,size,fp); + if (result != static_cast(size)) + { + JSONCONS_THROW_EXCEPTION_1(std::runtime_error,"Error reading file %s", filename); + } + + basic_json_parser parser(handler,err_handler); + parser.begin_parse(); + parser.parse(buffer.data(),0,buffer.size()); + parser.end_parse(); + parser.check_done(buffer.data(),parser.index(),buffer.size()); + } + + std::fclose (fp); + } + catch (...) + { + std::fclose (fp); + throw; + } + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json file"); + } + return handler.get_result(); +} + +template +typename basic_json::any& basic_json::any_value() +{ + switch (var_.type_) + { + case value_types::any_t: + { + return *var_.value_.any_val_; + } + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an any value"); + } +} + +template +const typename basic_json::any& basic_json::any_value() const +{ + switch (var_.type_) + { + case value_types::any_t: + { + return *var_.value_.any_val_; + } + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Not an any value"); + } +} + +template +std::basic_istream& operator>>(std::basic_istream& is, JsonT& o) +{ + basic_json_deserializer handler; + basic_json_reader reader(is, handler); + reader.read_next(); + reader.check_done(); + if (!handler.is_valid()) + { + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Failed to parse json stream"); + } + o = handler.get_result(); + return is; +} + +template +class json_printable +{ +public: + typedef typename JsonT::char_type char_type; + + json_printable(const JsonT& o, + bool is_pretty_print) + : o_(&o), is_pretty_print_(is_pretty_print) + { + } + + json_printable(const JsonT& o, + bool is_pretty_print, + const basic_output_format& format) + : o_(&o), is_pretty_print_(is_pretty_print), format_(format) + { + ; + } + + void to_stream(std::basic_ostream& os) const + { + o_->to_stream(os, format_, is_pretty_print_); + } + + friend std::basic_ostream& operator<<(std::basic_ostream& os, const json_printable& o) + { + o.to_stream(os); + return os; + } + + const JsonT *o_; + bool is_pretty_print_; + basic_output_format format_; +private: + json_printable(); +}; + +template +json_printable print(const JsonT& val) +{ + return json_printable(val,false); +} + +template +json_printable print(const JsonT& val, + const basic_output_format& format) +{ + return json_printable(val, false, format); +} + +template +json_printable pretty_print(const JsonT& val) +{ + return json_printable(val,true); +} + +template +json_printable pretty_print(const JsonT& val, + const basic_output_format& format) +{ + return json_printable(val, true, format); +} + +typedef basic_json> json; +typedef basic_json> wjson; + +typedef basic_json_deserializer json_deserializer; +typedef basic_json_deserializer wjson_deserializer; + +} + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_deserializer.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_deserializer.hpp new file mode 100644 index 00000000..31cd0db9 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_deserializer.hpp @@ -0,0 +1,267 @@ +// Copyright 2013-2016 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_DESERIALIZER_HPP +#define JSONCONS_JSON_DESERIALIZER_HPP + +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" + +namespace jsoncons { + +template +class basic_json_deserializer : public basic_json_input_handler +{ + static const int default_stack_size = 1000; + + typedef typename JsonT::char_type char_type; + typedef typename JsonT::member_type member_type; + typedef typename JsonT::string_type string_type; + typedef typename string_type::allocator_type string_allocator; + typedef typename JsonT::allocator_type allocator_type; + typedef typename JsonT::array array; + typedef typename array::allocator_type array_allocator; + typedef typename JsonT::object object; + typedef typename object::allocator_type object_allocator; + typedef typename JsonT::value_type value_type; + + string_allocator sa_; + object_allocator oa_; + array_allocator aa_; + + JsonT result_; + size_t top_; + + struct stack_item + { + string_type name_; + value_type value_; + }; + std::vector stack_; + std::vector stack2_; + bool is_valid_; + +public: + basic_json_deserializer(const string_allocator& sa = string_allocator(), + const allocator_type& allocator = allocator_type()) + : sa_(sa), + oa_(allocator), + aa_(allocator), + top_(0), + stack_(default_stack_size), + stack2_(), + is_valid_(true) // initial json value is an empty object + + { + stack2_.reserve(100); + } + + bool is_valid() const + { + return is_valid_; + } + + JsonT get_result() + { + is_valid_ = false; + return std::move(result_); + } + +#if !defined(JSONCONS_NO_DEPRECATED) + JsonT& root() + { + return result_; + } +#endif + +private: + + void push_initial() + { + top_ = 0; + if (top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void pop_initial() + { + JSONCONS_ASSERT(top_ == 1); + result_.swap(stack_[0].value_); + --top_; + } + + void push_object() + { + stack2_.push_back(top_); + stack_[top_].value_ = object(oa_); + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void pop_object() + { + stack2_.pop_back(); + JSONCONS_ASSERT(top_ > 0); + } + + void push_array() + { + stack2_.push_back(top_); + stack_[top_].value_ = array(aa_); + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void pop_array() + { + stack2_.pop_back(); + JSONCONS_ASSERT(top_ > 0); + } + + void do_begin_json() override + { + is_valid_ = false; + push_initial(); + } + + void do_end_json() override + { + is_valid_ = true; + pop_initial(); + } + + void do_begin_object(const basic_parsing_context&) override + { + push_object(); + } + + void do_end_object(const basic_parsing_context&) override + { + end_structure(); + pop_object(); + } + + void do_begin_array(const basic_parsing_context&) override + { + push_array(); + } + + void do_end_array(const basic_parsing_context&) override + { + end_structure(); + pop_array(); + } + + static member_type move_pair(stack_item&& val) + { + return member_type(std::move(val.name_),std::move(val.value_)); + } + + void end_structure() + { + JSONCONS_ASSERT(stack2_.size() > 0); + if (stack_[stack2_.back()].value_.is_object()) + { + size_t count = top_ - (stack2_.back() + 1); + auto s = stack_.begin() + (stack2_.back()+1); + auto send = s + count; + stack_[stack2_.back()].value_.object_value().insert( + std::make_move_iterator(s), + std::make_move_iterator(send), + move_pair); + top_ -= count; + } + else + { + size_t count = top_ - (stack2_.back() + 1); + stack_[stack2_.back()].value_.resize(count); + + auto s = stack_.begin() + (stack2_.back()+1); + auto dend = stack_[stack2_.back()].value_.elements().end(); + for (auto it = stack_[stack2_.back()].value_.elements().begin(); + it != dend; ++it, ++s) + { + *it = std::move(s->value_); + } + top_ -= count; + } + } + + void do_name(const char_type* p, size_t length, const basic_parsing_context&) override + { + stack_[top_].name_ = string_type(p,length,sa_); + } + + void do_string_value(const char_type* p, size_t length, const basic_parsing_context&) override + { + stack_[top_].value_ = JsonT(p,length,sa_); + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void do_integer_value(int64_t value, const basic_parsing_context&) override + { + stack_[top_].value_ = value; + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void do_uinteger_value(uint64_t value, const basic_parsing_context&) override + { + stack_[top_].value_ = value; + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void do_double_value(double value, uint8_t precision, const basic_parsing_context&) override + { + stack_[top_].value_ = value_type(value,precision); + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void do_bool_value(bool value, const basic_parsing_context&) override + { + stack_[top_].value_ = value; + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } + + void do_null_value(const basic_parsing_context&) override + { + stack_[top_].value_ = null_type(); + if (++top_ >= stack_.size()) + { + stack_.resize(top_*2); + } + } +}; + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_error_category.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_error_category.hpp new file mode 100644 index 00000000..90d12d56 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_error_category.hpp @@ -0,0 +1,111 @@ +/// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_TEXT_ERROR_CATEGORY_HPP +#define JSONCONS_JSON_TEXT_ERROR_CATEGORY_HPP + +#include "jsoncons/jsoncons.hpp" +#include + +namespace jsoncons { + +namespace json_parser_errc +{ + const int unexpected_eof = 1; + const int invalid_json_text = 2; + const int extra_character = 3; + const int max_depth_exceeded = 4; + const int single_quote = 5; + const int illegal_character_in_string = 6; + const int extra_comma = 7; + const int expected_name = 8; + const int expected_value = 9; + const int invalid_value = 10; + const int expected_colon = 11; + const int illegal_control_character = 12; + const int illegal_escaped_character = 13; + const int expected_codepoint_surrogate_pair = 14; + const int invalid_hex_escape_sequence = 15; + const int invalid_unicode_escape_sequence = 16; + const int leading_zero = 17; + const int invalid_number = 18; + const int expected_comma_or_right_brace = 19; + const int expected_comma_or_right_bracket = 20; + const int unexpected_right_bracket = 21; + const int unexpected_right_brace = 22; +} + +class json_error_category_impl + : public std::error_category +{ +public: + virtual const char* name() const JSONCONS_NOEXCEPT + { + return "json"; + } + virtual std::string message(int ev) const + { + switch (ev) + { + case json_parser_errc::unexpected_eof: + return "Unexpected end of file"; + case json_parser_errc::invalid_json_text: + return "Invalid JSON text"; + case json_parser_errc::extra_character: + return "Unexpected non-whitespace character after JSON text"; + case json_parser_errc::max_depth_exceeded: + return "Maximum JSON depth exceeded"; + case json_parser_errc::single_quote: + return "JSON strings cannot be quoted with single quotes"; + case json_parser_errc::illegal_character_in_string: + return "Illegal character in string"; + case json_parser_errc::extra_comma: + return "Extra comma"; + case json_parser_errc::expected_name: + return "Expected object member name"; + case json_parser_errc::expected_value: + return "Expected value"; + case json_parser_errc::invalid_value: + return "Invalid value"; + case json_parser_errc::expected_colon: + return "Expected name separator ':'"; + case json_parser_errc::illegal_control_character: + return "Illegal control character in string"; + case json_parser_errc::illegal_escaped_character: + return "Illegal escaped character in string"; + case json_parser_errc::expected_codepoint_surrogate_pair: + return "Invalid codepoint, expected another \\u token to begin the second half of a codepoint surrogate pair."; + case json_parser_errc::invalid_hex_escape_sequence: + return "Invalid codepoint, expected hexadecimal digit."; + case json_parser_errc::invalid_unicode_escape_sequence: + return "Invalid codepoint, expected four hexadecimal digits."; + case json_parser_errc::leading_zero: + return "A number cannot have a leading zero"; + case json_parser_errc::invalid_number: + return "Invalid number"; + case json_parser_errc::expected_comma_or_right_brace: + return "Expected comma or right brace ']'"; + case json_parser_errc::expected_comma_or_right_bracket: + return "Expected comma or right bracket ']'"; + case json_parser_errc::unexpected_right_brace: + return "Unexpected right brace '}'"; + case json_parser_errc::unexpected_right_bracket: + return "Unexpected right bracket ']'"; + default: + return "Unknown JSON parser error"; + } + } +}; + +inline +const std::error_category& json_error_category() +{ + static json_error_category_impl instance; + return instance; +} + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_filter.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_filter.hpp new file mode 100644 index 00000000..2019c01d --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_filter.hpp @@ -0,0 +1,324 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_FILTER_HPP +#define JSONCONS_JSON_FILTER_HPP + +#include + +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/json_output_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" + +namespace jsoncons { + +template +class basic_json_input_output_adapter : public basic_json_input_handler +{ +public: + basic_json_input_output_adapter() + : writer_(std::addressof(null_json_output_handler())) + { + } + + basic_json_input_output_adapter(basic_json_output_handler& handler) + : writer_(std::addressof(handler)) + { + } + +private: + + void do_begin_json() override + { + writer_->begin_json(); + } + + void do_end_json() override + { + writer_->end_json(); + } + + void do_begin_object(const basic_parsing_context& context) override + { + writer_->begin_object(); + } + + void do_end_object(const basic_parsing_context& context) override + { + writer_->end_object(); + } + + void do_begin_array(const basic_parsing_context& context) override + { + writer_->begin_array(); + } + + void do_end_array(const basic_parsing_context& context) override + { + writer_->end_array(); + } + + void do_name(const CharT* name, size_t length, + const basic_parsing_context& context) override + { + writer_->name(name, length); + } + + void do_string_value(const CharT* value, size_t length, + const basic_parsing_context& context) override + { + writer_->value(value, length); + } + + void do_integer_value(int64_t value, const basic_parsing_context& context) override + { + writer_->value(value); + } + + void do_uinteger_value(uint64_t value, + const basic_parsing_context& context) override + { + writer_->value(value); + } + + void do_double_value(double value, uint8_t precision, const basic_parsing_context& context) override + { + writer_->value(value, precision); + } + + void do_bool_value(bool value, const basic_parsing_context& context) override + { + writer_->value(value); + } + + void do_null_value(const basic_parsing_context& context) override + { + writer_->value(null_type()); + } + + basic_json_output_handler* writer_; +}; + +template +class basic_json_filter : public basic_json_input_handler +{ +public: + basic_json_filter(basic_json_input_handler& handler) + : handler_(std::addressof(handler)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())) + { + } + + basic_json_filter(basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : handler_(std::addressof(handler)), + err_handler_(std::addressof(err_handler)) + { + } + + basic_json_filter(basic_json_output_handler& output_handler) + : input_output_adapter_(output_handler), handler_(std::addressof(input_output_adapter_)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())) + { + } + + basic_json_filter(basic_json_output_handler& output_handler, + basic_parse_error_handler& err_handler) + : input_output_adapter_(output_handler), handler_(std::addressof(input_output_adapter_)), + err_handler_(std::addressof(err_handler)) + { + } + + basic_json_input_handler& input_handler() + { + return *handler_; + } + +#if !defined(JSONCONS_NO_DEPRECATED) + basic_json_input_handler& parent() + { + return *handler_; + } +#endif + +private: + void do_begin_json() override + { + handler_->begin_json(); + } + + void do_end_json() override + { + handler_->end_json(); + } + + void do_begin_object(const basic_parsing_context& context) override + { + handler_->begin_object(context); + } + + void do_end_object(const basic_parsing_context& context) override + { + handler_->end_object(context); + } + + void do_begin_array(const basic_parsing_context& context) override + { + handler_->begin_array(context); + } + + void do_end_array(const basic_parsing_context& context) override + { + handler_->end_array(context); + } + + void do_name(const CharT* name, size_t length, const basic_parsing_context& context) override + { + handler_->name(name, length, context); + } + + void do_string_value(const CharT* value, size_t length, const basic_parsing_context& context) override + { + handler_->value(value,length,context); + } + + void do_double_value(double value, uint8_t precision, const basic_parsing_context& context) override + { + handler_->value(value,precision,context); + } + + void do_integer_value(int64_t value, const basic_parsing_context& context) override + { + handler_->value(value,context); + } + + void do_uinteger_value(uint64_t value, const basic_parsing_context& context) override + { + handler_->value(value,context); + } + + void do_bool_value(bool value, const basic_parsing_context& context) override + { + handler_->value(value,context); + } + + void do_null_value(const basic_parsing_context& context) override + { + handler_->value(null_type(),context); + } + + basic_json_input_output_adapter input_output_adapter_; + basic_json_input_handler* handler_; + basic_parse_error_handler* err_handler_; +}; + +// Filters out begin_json and end_json events +template +class basic_begin_end_json_filter : public basic_json_filter +{ +public: + basic_begin_end_json_filter(basic_json_input_handler& handler) + : basic_json_filter(handler) + { + } +private: + void do_begin_json() override + { + } + + void do_end_json() override + { + } +}; + +template +class basic_json_output_input_adapter : public basic_json_output_handler +{ +public: + basic_json_output_input_adapter(basic_json_input_handler& input_handler, + const basic_parsing_context& context) + : input_handler_(std::addressof(input_handler)), + context_(std::addressof(context)) + { + } + +private: + + void do_begin_json() override + { + input_handler_->begin_json(); + } + + void do_end_json() override + { + input_handler_->end_json(); + } + + void do_begin_object() override + { + input_handler_->begin_object(*context_); + } + + void do_end_object() override + { + input_handler_->end_object(*context_); + } + + void do_begin_array() override + { + input_handler_->begin_array(*context_); + } + + void do_end_array() override + { + input_handler_->end_array(*context_); + } + + void do_name(const CharT* name, size_t length) override + { + input_handler_->name(name, length, *context_); + } + + void do_string_value(const CharT* value, size_t length) override + { + input_handler_->value(value, length, *context_); + } + + void do_integer_value(int64_t value) override + { + input_handler_->value(value, *context_); + } + + void do_uinteger_value(uint64_t value) override + { + input_handler_->value(value, *context_); + } + + void do_double_value(double value, uint8_t precision) override + { + input_handler_->value(value, precision, *context_); + } + + void do_bool_value(bool value) override + { + input_handler_->value(value, *context_); + } + + void do_null_value() override + { + input_handler_->value(null_type(), *context_); + } + + basic_json_input_handler* input_handler_; + const basic_parsing_context* context_; +}; + +typedef basic_json_filter json_filter; +typedef basic_json_filter wjson_filter; + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_input_handler.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_input_handler.hpp new file mode 100644 index 00000000..566209e5 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_input_handler.hpp @@ -0,0 +1,282 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_INPUT_HANDLER_HPP +#define JSONCONS_JSON_INPUT_HANDLER_HPP + +#include +#include "jsoncons/jsoncons.hpp" + +namespace jsoncons { + +template +uint64_t string_to_uinteger(const CharT *s, size_t length) throw(std::overflow_error) +{ + static const uint64_t max_value = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + static const uint64_t max_value_div_10 = max_value / 10; + uint64_t n = 0; + for (size_t i = 0; i < length; ++i) + { + uint64_t x = s[i] - '0'; + if (n > max_value_div_10) + { + throw std::overflow_error("Unsigned overflow"); + } + n = n * 10; + if (n > max_value - x) + { + throw std::overflow_error("Unsigned overflow"); + } + + n += x; + } + return n; +} + +template +int64_t string_to_integer(bool has_neg, const CharT *s, size_t length) throw(std::overflow_error) +{ + const long long max_value = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + const long long max_value_div_10 = max_value / 10; + + long long n = 0; + for (size_t i = 0; i < length; ++i) + { + long long x = s[i] - '0'; + if (n > max_value_div_10) + { + throw std::overflow_error("Integer overflow"); + } + n = n * 10; + if (n > max_value - x) + { + throw std::overflow_error("Integer overflow"); + } + + n += x; + } + return has_neg ? -n : n; +} + +template +class basic_parsing_context; + +template +class basic_json_input_handler +{ +public: + virtual ~basic_json_input_handler() {} + + void begin_json() + { + do_begin_json(); + } + + void end_json() + { + do_end_json(); + } + + void begin_object(const basic_parsing_context& context) + { + do_begin_object(context); + } + + void end_object(const basic_parsing_context& context) + { + do_end_object(context); + } + + void begin_array(const basic_parsing_context& context) + { + do_begin_array(context); + } + + void end_array(const basic_parsing_context& context) + { + do_end_array(context); + } + + void name(const std::basic_string& name, const basic_parsing_context& context) + { + do_name(name.data(), name.length(), context); + } + + void name(const CharT* p, size_t length, const basic_parsing_context& context) + { + do_name(p, length, context); + } + + void value(const std::basic_string& value, const basic_parsing_context& context) + { + do_string_value(value.data(), value.length(), context); + } + + void value(const CharT* p, size_t length, const basic_parsing_context& context) + { + do_string_value(p, length, context); + } + + void value(const CharT* p, const basic_parsing_context& context) + { + do_string_value(p, std::char_traits::length(p), context); + } + + void value(int value, const basic_parsing_context& context) + { + do_integer_value(value,context); + } + + void value(long value, const basic_parsing_context& context) + { + do_integer_value(value,context); + } + + void value(long long value, const basic_parsing_context& context) + { + do_integer_value(value,context); + } + + void value(unsigned int value, const basic_parsing_context& context) + { + do_uinteger_value(value,context); + } + + void value(unsigned long value, const basic_parsing_context& context) + { + do_uinteger_value(value,context); + } + + void value(unsigned long long value, const basic_parsing_context& context) + { + do_uinteger_value(value,context); + } + + void value(float value, uint8_t precision, const basic_parsing_context& context) + { + do_double_value(value, precision, context); + } + + void value(double value, uint8_t precision, const basic_parsing_context& context) + { + do_double_value(value, precision, context); + } + + void value(bool value, const basic_parsing_context& context) + { + do_bool_value(value,context); + } + + void value(null_type, const basic_parsing_context& context) + { + do_null_value(context); + } + +private: + virtual void do_begin_json() = 0; + + virtual void do_end_json() = 0; + + virtual void do_begin_object(const basic_parsing_context& context) = 0; + + virtual void do_end_object(const basic_parsing_context& context) = 0; + + virtual void do_begin_array(const basic_parsing_context& context) = 0; + + virtual void do_end_array(const basic_parsing_context& context) = 0; + + virtual void do_name(const CharT* name, size_t length, const basic_parsing_context& context) = 0; + + virtual void do_null_value(const basic_parsing_context& context) = 0; + + virtual void do_string_value(const CharT* value, size_t length, const basic_parsing_context& context) = 0; + + virtual void do_double_value(double value, uint8_t precision, const basic_parsing_context& context) = 0; + + virtual void do_integer_value(int64_t value, const basic_parsing_context& context) = 0; + + virtual void do_uinteger_value(uint64_t value, const basic_parsing_context& context) = 0; + + virtual void do_bool_value(bool value, const basic_parsing_context& context) = 0; +}; + + +template +class basic_empty_json_input_handler : public basic_json_input_handler +{ +public: + static basic_json_input_handler& instance() + { + static basic_empty_json_input_handler instance; + return instance; + } +private: + void do_begin_json() override + { + } + + void do_end_json() override + { + } + + void do_begin_object(const basic_parsing_context&) override + { + } + + void do_end_object(const basic_parsing_context&) override + { + } + + void do_begin_array(const basic_parsing_context&) override + { + } + + void do_end_array(const basic_parsing_context&) override + { + } + + void do_name(const CharT* p, size_t length, const basic_parsing_context&) override + { + (void)p; + (void)length; + } + + void do_null_value(const basic_parsing_context&) override + { + } + + void do_string_value(const CharT* p, size_t length, const basic_parsing_context&) override + { + (void)p; + (void)length; + } + + void do_double_value(double, uint8_t, const basic_parsing_context&) override + { + } + + void do_integer_value(int64_t, const basic_parsing_context&) override + { + } + + void do_uinteger_value(uint64_t, const basic_parsing_context&) override + { + } + + void do_bool_value(bool, const basic_parsing_context&) override + { + } +}; + +typedef basic_json_input_handler json_input_handler; +typedef basic_json_input_handler wjson_input_handler; + +typedef basic_empty_json_input_handler empty_json_input_handler; +typedef basic_empty_json_input_handler wempty_json_input_handler; + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_output_handler.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_output_handler.hpp new file mode 100644 index 00000000..d0f3de8f --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_output_handler.hpp @@ -0,0 +1,262 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_OUTPUT_HANDLER_HPP +#define JSONCONS_JSON_OUTPUT_HANDLER_HPP + +#include +#include "jsoncons/jsoncons.hpp" + +namespace jsoncons { + +template +void print_integer(int64_t value, buffered_ostream& os) +{ + CharT buf[255]; + uint64_t u = (value < 0) ? static_cast(-value) : static_cast(value); + CharT* p = buf; + do + { + *p++ = static_cast(48 + u%10); + } + while (u /= 10); + if (value < 0) + { + os.put('-'); + } + while (--p >= buf) + { + os.put(*p); + } +} + +template +void print_uinteger(uint64_t value, buffered_ostream& os) +{ + CharT buf[255]; + CharT* p = buf; + do + { + *p++ = static_cast(48 + value % 10); + } while (value /= 10); + while (--p >= buf) + { + os.put(*p); + } +} + +template +class basic_json_output_handler +{ +public: + virtual ~basic_json_output_handler() {} + + // Overloaded methods + + void begin_json() + { + do_begin_json(); + } + + void end_json() + { + do_end_json(); + } + + void begin_object() + { + do_begin_object(); + } + + void end_object() + { + do_end_object(); + } + + void begin_array() + { + do_begin_array(); + } + + void end_array() + { + do_end_array(); + } + + void name(const std::basic_string& name) + { + do_name(name.data(), name.length()); + } + + void name(const CharT* p, size_t length) + { + do_name(p, length); + } + + void value(const std::basic_string& value) + { + do_string_value(value.data(), value.length()); + } + + void value(const CharT* p, size_t length) + { + do_string_value(p, length); + } + + void value(const CharT* p) + { + do_string_value(p, std::char_traits::length(p)); + } + + void value(int value) + { + do_integer_value(value); + } + + void value(long value) + { + do_integer_value(value); + } + + void value(long long value) + { + do_integer_value(value); + } + + void value(unsigned int value) + { + do_uinteger_value(value); + } + + void value(unsigned long value) + { + do_uinteger_value(value); + } + + void value(unsigned long long value) + { + do_uinteger_value(value); + } + + void value(double value, uint8_t precision = 0) + { + do_double_value(value, precision); + } + + void value(bool value) + { + do_bool_value(value); + } + + void value(null_type) + { + do_null_value(); + } + +private: + + virtual void do_begin_json() = 0; + + virtual void do_end_json() = 0; + + virtual void do_name(const CharT* name, size_t length) = 0; + + virtual void do_begin_object() = 0; + + virtual void do_end_object() = 0; + + virtual void do_begin_array() = 0; + + virtual void do_end_array() = 0; + + virtual void do_null_value() = 0; + + virtual void do_string_value(const CharT* value, size_t length) = 0; + + virtual void do_double_value(double value, uint8_t precision) = 0; + + virtual void do_integer_value(int64_t value) = 0; + + virtual void do_uinteger_value(uint64_t value) = 0; + + virtual void do_bool_value(bool value) = 0; +}; + +template +class null_json_output_handler_impl : public basic_json_output_handler +{ +private: + + void do_begin_json() override + { + } + + void do_end_json() override + { + } + + void do_name(const CharT* name, size_t length) override + { + (void)name; + (void)length; + } + + void do_begin_object() override + { + } + + void do_end_object() override + { + } + + void do_begin_array() override + { + } + + void do_end_array() override + { + } + + void do_null_value() override + { + } + + void do_string_value(const CharT* p, size_t length) override + { + (void)p; + (void)length; + } + + void do_double_value(double, uint8_t) override + { + } + + void do_integer_value(int64_t) override + { + } + + void do_uinteger_value(uint64_t) override + { + } + + void do_bool_value(bool) override + { + } + +}; + +template +basic_json_output_handler& null_json_output_handler() +{ + static null_json_output_handler_impl instance; + return instance; +} + +typedef basic_json_output_handler json_output_handler; +typedef basic_json_output_handler wjson_output_handler; + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp new file mode 100644 index 00000000..8a06c2e7 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp @@ -0,0 +1,1587 @@ +// Copyright 2015 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_PARSER_HPP +#define JSONCONS_JSON_PARSER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" +#include "jsoncons/json_error_category.hpp" + +namespace jsoncons { + +enum class states +{ + root, + start, + slash, + slash_slash, + slash_star, + slash_star_star, + expect_comma_or_end, + object, + expect_member_name_or_end, + expect_member_name, + expect_colon, + expect_value_or_end, + expect_value, + array, + string, + member_name, + escape, + u1, + u2, + u3, + u4, + expect_surrogate_pair1, + expect_surrogate_pair2, + u6, + u7, + u8, + u9, + minus, + zero, + integer, + fraction, + exp1, + exp2, + exp3, + n, + t, + f, + cr, + lf, + done +}; + +template +class basic_json_parser : private basic_parsing_context +{ + static const int default_initial_stack_capacity_ = 100; + + std::vector stack_; + basic_json_input_handler *handler_; + basic_parse_error_handler *err_handler_; + size_t column_; + size_t line_; + uint32_t cp_; + uint32_t cp2_; + std::basic_string string_buffer_; + std::basic_string number_buffer_; + bool is_negative_; + size_t index_; + int initial_stack_capacity_; + int nesting_depth_; + int max_depth_; + float_reader float_reader_; + const CharT* begin_input_; + const CharT* end_input_; + const CharT* p_; + uint8_t precision_; + std::pair literal_; + size_t literal_index_; + +public: + basic_json_parser(basic_json_input_handler& handler) + : handler_(std::addressof(handler)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())), + column_(0), + line_(0), + cp_(0), + is_negative_(false), + index_(0), + initial_stack_capacity_(default_initial_stack_capacity_) + { + max_depth_ = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + + basic_json_parser(basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : handler_(std::addressof(handler)), + err_handler_(std::addressof(err_handler)), + column_(0), + line_(0), + cp_(0), + is_negative_(false), + index_(0), + initial_stack_capacity_(default_initial_stack_capacity_) + + { + max_depth_ = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + + const basic_parsing_context& parsing_context() const + { + return *this; + } + + ~basic_json_parser() + { + } + + size_t max_nesting_depth() const + { + return static_cast(max_depth_); + } + + void max_nesting_depth(size_t max_nesting_depth) + { + max_depth_ = static_cast(std::min(max_nesting_depth,static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()))); + } + + states parent() const + { + return stack_[stack_.size()-2]; + } + + bool done() const + { + return stack_.back() == states::done; + } + + void do_space() + { + while ((p_ + 1) < end_input_ && (*(p_ + 1) == ' ' || *(p_ + 1) == '\t')) + { + ++p_; + ++column_; + } + } + + void do_begin_object() + { + if (++nesting_depth_ >= max_depth_) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + stack_.back() = states::object; + stack_.push_back(states::expect_member_name_or_end); + handler_->begin_object(*this); + } + + void do_end_object() + { + --nesting_depth_; + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + if (stack_.back() == states::object) + { + handler_->end_object(*this); + } + else if (stack_.back() == states::array) + { + err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this); + } + else + { + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this); + } + + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + stack_.back() = states::done; + handler_->end_json(); + } + else + { + stack_.back() = states::expect_comma_or_end; + } + } + + void do_begin_array() + { + if (++nesting_depth_ >= max_depth_) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + stack_.back() = states::array; + stack_.push_back(states::expect_value_or_end); + handler_->begin_array(*this); + } + + void do_end_array() + { + --nesting_depth_; + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + if (stack_.back() == states::array) + { + handler_->end_array(*this); + } + else if (stack_.back() == states::object) + { + err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this); + } + else + { + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this); + } + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + stack_.back() = states::done; + handler_->end_json(); + } + else + { + stack_.back() = states::expect_comma_or_end; + } + } + + void begin_parse() + { + stack_.clear(); + stack_.reserve(initial_stack_capacity_); + stack_.push_back(states::root); + stack_.push_back(states::start); + line_ = 1; + column_ = 1; + nesting_depth_ = 0; + } + + void check_done(const CharT* input, size_t start, size_t length) + { + index_ = start; + for (; index_ < length; ++index_) + { + CharT curr_char_ = input[index_]; + switch (curr_char_) + { + case '\n': + case '\r': + case '\t': + case ' ': + break; + default: + err_handler_->error(std::error_code(json_parser_errc::extra_character, json_error_category()), *this); + break; + } + } + } + + void parse_string() + { + const CharT* sb = p_; + bool done = false; + while (!done && p_ < end_input_) + { + switch (*p_) + { + case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: + case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: + case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f: + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this); + // recovery - skip + done = true; + ++p_; + break; + case '\r': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); + stack_.push_back(states::cr); + done = true; + ++p_; + } + break; + case '\n': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); + stack_.push_back(states::lf); + done = true; + ++p_; + } + break; + case '\t': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); + done = true; + ++p_; + } + break; + case '\\': + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); + stack_.back() = states::escape; + done = true; + ++p_; + break; + case '\"': + if (string_buffer_.length() == 0) + { + end_string_value(sb,p_-sb); + } + else + { + string_buffer_.append(sb,p_-sb); + end_string_value(string_buffer_.data(),string_buffer_.length()); + string_buffer_.clear(); + } + column_ += (p_ - sb + 1); + done = true; + ++p_; + break; + default: + ++p_; + break; + } + } + if (!done) + { + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); + } + } + + void parse(const CharT* const input, size_t start, size_t length) + { + begin_input_ = input + start; + end_input_ = input + length; + p_ = begin_input_; + + index_ = start; + while ((p_ < end_input_) && (stack_.back() != states::done)) + { + switch (*p_) + { + case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: + case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: + case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f: + err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this); + break; + default: + break; + } + + switch (stack_.back()) + { + case states::cr: + ++line_; + column_ = 1; + switch (*p_) + { + case '\n': + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + ++p_; + break; + default: + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + break; + } + break; + case states::lf: + ++line_; + column_ = 1; + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + break; + case states::start: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '{': + handler_->begin_json(); + do_begin_object(); + break; + case '[': + handler_->begin_json(); + do_begin_array(); + break; + case '\"': + handler_->begin_json(); + stack_.back() = states::string; + break; + case '-': + handler_->begin_json(); + is_negative_ = true; + stack_.back() = states::minus; + break; + case '0': + handler_->begin_json(); + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + handler_->begin_json(); + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::integer; + break; + case 'f': + handler_->begin_json(); + stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + break; + case 'n': + handler_->begin_json(); + stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + handler_->begin_json(); + stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case '}': + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this); + break; + case ']': + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this); + break; + default: + err_handler_->fatal_error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + + case states::expect_comma_or_end: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '}': + do_end_object(); + break; + case ']': + do_end_array(); + break; + case ',': + begin_member_or_element(); + break; + default: + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::array) + { + err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this); + } + else if (parent() == states::object) + { + err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this); + } + break; + } + } + ++p_; + ++column_; + break; + case states::expect_member_name_or_end: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '}': + do_end_object(); + break; + case '\"': + stack_.back() = states::member_name; + stack_.push_back(states::string); + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_member_name: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '\"': + //stack_.back() = states::string; + stack_.back() = states::member_name; + stack_.push_back(states::string); + break; + case '}': + --nesting_depth_; + err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this); + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_colon: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case ':': + stack_.back() = states::expect_value; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_colon, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_value: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '{': + do_begin_object(); + break; + case '[': + do_begin_array(); + break; + case '\"': + stack_.back() = states::string; + break; + case '-': + is_negative_ = true; + stack_.back() = states::minus; + break; + case '0': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::integer; + break; + case 'f': + stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + break; + case 'n': + stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case ']': + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::array) + { + err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this); + } + else + { + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + } + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_value_or_end: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case ' ':case '\t': + do_space(); + break; + case '/': + stack_.push_back(states::slash); + break; + case '{': + do_begin_object(); + break; + case '[': + do_begin_array(); + break; + case ']': + do_end_array(); + break; + case '\"': + stack_.back() = states::string; + break; + case '-': + is_negative_ = true; + stack_.back() = states::minus; + break; + case '0': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::integer; + break; + case 'f': + stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + break; + case 'n': + stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::string: + parse_string(); + break; + case states::escape: + { + escape_next_char(*p_); + } + ++p_; + ++column_; + break; + case states::u1: + { + append_codepoint(*p_); + stack_.back() = states::u2; + } + ++p_; + ++column_; + break; + case states::u2: + { + append_codepoint(*p_); + stack_.back() = states::u3; + } + ++p_; + ++column_; + break; + case states::u3: + { + append_codepoint(*p_); + stack_.back() = states::u4; + } + ++p_; + ++column_; + break; + case states::u4: + { + append_codepoint(*p_); + if (cp_ >= min_lead_surrogate && cp_ <= max_lead_surrogate) + { + stack_.back() = states::expect_surrogate_pair1; + } + else + { + json_char_traits::append_codepoint_to_string(cp_, string_buffer_); + stack_.back() = states::string; + } + } + ++p_; + ++column_; + break; + case states::expect_surrogate_pair1: + { + switch (*p_) + { + case '\\': + cp2_ = 0; + stack_.back() = states::expect_surrogate_pair2; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_surrogate_pair2: + { + switch (*p_) + { + case 'u': + stack_.back() = states::u6; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::u6: + { + append_second_codepoint(*p_); + stack_.back() = states::u7; + } + ++p_; + ++column_; + break; + case states::u7: + { + append_second_codepoint(*p_); + stack_.back() = states::u8; + } + ++p_; + ++column_; + break; + case states::u8: + { + append_second_codepoint(*p_); + stack_.back() = states::u9; + } + ++p_; + ++column_; + break; + case states::u9: + { + append_second_codepoint(*p_); + uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF); + json_char_traits::append_codepoint_to_string(cp, string_buffer_); + stack_.back() = states::string; + } + ++p_; + ++column_; + break; + case states::minus: + { + switch (*p_) + { + case '0': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::integer; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::zero: + { + switch (*p_) + { + case '\r': + end_integer_value(); + stack_.push_back(states::cr); + break; + case '\n': + end_integer_value(); + stack_.push_back(states::lf); + break; + case ' ':case '\t': + end_integer_value(); + do_space(); + break; + case '/': + end_integer_value(); + stack_.push_back(states::slash); + break; + case '}': + end_integer_value(); + do_end_object(); + break; + case ']': + end_integer_value(); + do_end_array(); + break; + case '.': + precision_ = static_cast(number_buffer_.length()); + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::fraction; + break; + case ',': + end_integer_value(); + begin_member_or_element(); + break; + case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + err_handler_->error(std::error_code(json_parser_errc::leading_zero, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::integer: + { + switch (*p_) + { + case '\r': + end_integer_value(); + stack_.push_back(states::cr); + break; + case '\n': + end_integer_value(); + stack_.push_back(states::lf); + break; + case ' ':case '\t': + end_integer_value(); + do_space(); + break; + case '/': + end_integer_value(); + stack_.push_back(states::slash); + break; + case '}': + end_integer_value(); + do_end_object(); + break; + case ']': + end_integer_value(); + do_end_array(); + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::integer; + break; + case '.': + precision_ = static_cast(number_buffer_.length()); + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::fraction; + break; + case ',': + end_integer_value(); + begin_member_or_element(); + break; + case 'e':case 'E': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::fraction: + { + switch (*p_) + { + case '\r': + end_fraction_value(); + stack_.push_back(states::cr); + break; + case '\n': + end_fraction_value(); + stack_.push_back(states::lf); + break; + case ' ':case '\t': + end_fraction_value(); + do_space(); + break; + case '/': + end_fraction_value(); + stack_.push_back(states::slash); + break; + case '}': + end_fraction_value(); + do_end_object(); + break; + case ']': + end_fraction_value(); + do_end_array(); + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + ++precision_; + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::fraction; + break; + case ',': + end_fraction_value(); + begin_member_or_element(); + break; + case 'e':case 'E': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp1: + { + switch (*p_) + { + case '+': + stack_.back() = states::exp2; + break; + case '-': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp2; + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp2: + { + switch (*p_) + { + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp3: + { + switch (*p_) + { + case '\r': + end_fraction_value(); + stack_.push_back(states::cr); + break; + case '\n': + end_fraction_value(); + stack_.push_back(states::lf); + break; + case ' ':case '\t': + end_fraction_value(); + do_space(); + break; + case '/': + end_fraction_value(); + stack_.push_back(states::slash); + break; + case '}': + end_fraction_value(); + do_end_object(); + break; + case ']': + end_fraction_value(); + do_end_array(); + break; + case ',': + end_fraction_value(); + begin_member_or_element(); + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::t: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(true, *this); + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + stack_.back() = states::done; + handler_->end_json(); + } + else + { + stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::f: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(false, *this); + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + stack_.back() = states::done; + handler_->end_json(); + } + else + { + stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::n: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(null_type(), *this); + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + stack_.back() = states::done; + handler_->end_json(); + } + else + { + stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::slash: + { + switch (*p_) + { + case '*': + stack_.back() = states::slash_star; + break; + case '/': + stack_.back() = states::slash_slash; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::slash_star: + { + switch (*p_) + { + case '\r': + stack_.push_back(states::cr); + break; + case '\n': + stack_.push_back(states::lf); + break; + case '*': + stack_.back() = states::slash_star_star; + break; + } + } + ++p_; + ++column_; + break; + case states::slash_slash: + { + switch (*p_) + { + case '\r': + stack_.pop_back(); + break; + case '\n': + stack_.pop_back(); + break; + default: + ++p_; + ++column_; + } + } + break; + case states::slash_star_star: + { + switch (*p_) + { + case '/': + JSONCONS_ASSERT(!stack_.empty()) + stack_.pop_back(); + break; + default: + stack_.back() = states::slash_star; + break; + } + } + ++p_; + ++column_; + break; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad parser state"); + break; + } + } + index_ += (p_-begin_input_); + } + + void end_parse() + { + JSONCONS_ASSERT(stack_.size() >= 2); + if (parent() == states::root) + { + switch (stack_.back()) + { + case states::zero: + case states::integer: + end_integer_value(); + break; + case states::fraction: + case states::exp3: + end_fraction_value(); + break; + default: + break; + } + } + if (stack_.back() == states::lf || stack_.back() == states::cr) + { + stack_.pop_back(); + } + if (!(stack_.back() == states::done || stack_.back() == states::start)) + { + err_handler_->error(std::error_code(json_parser_errc::unexpected_eof, json_error_category()), *this); + } + } + + states state() const + { + return stack_.back(); + } + + size_t index() const + { + return index_; + } +private: + void end_fraction_value() + { + try + { + double d = float_reader_.read(number_buffer_.data(), precision_); + if (is_negative_) + d = -d; + handler_->value(d, static_cast(precision_), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); // recovery + } + number_buffer_.clear(); + is_negative_ = false; + + JSONCONS_ASSERT(stack_.size() >= 2); + switch (parent()) + { + case states::array: + case states::object: + stack_.back() = states::expect_comma_or_end; + break; + case states::root: + stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + void end_integer_value() + { + if (is_negative_) + { + try + { + int64_t d = string_to_integer(is_negative_, number_buffer_.data(), number_buffer_.length()); + handler_->value(d, *this); + } + catch (const std::exception&) + { + try + { + double d = float_reader_.read(number_buffer_.data(), number_buffer_.length()); + handler_->value(-d, static_cast(number_buffer_.length()), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); + } + } + } + else + { + try + { + uint64_t d = string_to_uinteger(number_buffer_.data(), number_buffer_.length()); + handler_->value(d, *this); + } + catch (const std::exception&) + { + try + { + double d = float_reader_.read(number_buffer_.data(),number_buffer_.length()); + handler_->value(d, static_cast(number_buffer_.length()), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); + } + } + } + + JSONCONS_ASSERT(stack_.size() >= 2); + switch (parent()) + { + case states::array: + case states::object: + stack_.back() = states::expect_comma_or_end; + break; + case states::root: + stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + number_buffer_.clear(); + is_negative_ = false; + } + + void append_codepoint(int c) + { + switch (c) + { + case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + case 'a':case 'b':case 'c':case 'd':case 'e':case 'f': + case 'A':case 'B':case 'C':case 'D':case 'E':case 'F': + cp_ = append_to_codepoint(cp_, c); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + + void append_second_codepoint(int c) + { + switch (c) + { + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + case 'a':case 'b':case 'c':case 'd':case 'e':case 'f': + case 'A':case 'B':case 'C':case 'D':case 'E':case 'F': + cp2_ = append_to_codepoint(cp2_, c); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + + void escape_next_char(int next_input) + { + switch (next_input) + { + case '\"': + string_buffer_.push_back('\"'); + stack_.back() = states::string; + break; + case '\\': + string_buffer_.push_back('\\'); + stack_.back() = states::string; + break; + case '/': + string_buffer_.push_back('/'); + stack_.back() = states::string; + break; + case 'b': + string_buffer_.push_back('\b'); + stack_.back() = states::string; + break; + case 'f': + string_buffer_.push_back('\f'); + stack_.back() = states::string; + break; + case 'n': + string_buffer_.push_back('\n'); + stack_.back() = states::string; + break; + case 'r': + string_buffer_.push_back('\r'); + stack_.back() = states::string; + break; + case 't': + string_buffer_.push_back('\t'); + stack_.back() = states::string; + break; + case 'u': + cp_ = 0; + stack_.back() = states::u1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::illegal_escaped_character, json_error_category()), *this); + break; + } + } + + void end_string_value(const CharT* s, size_t length) + { + JSONCONS_ASSERT(stack_.size() >= 2); + switch (parent()) + { + case states::member_name: + handler_->name(s, length, *this); + stack_.pop_back(); + stack_.back() = states::expect_colon; + break; + case states::object: + case states::array: + handler_->value(s, length, *this); + stack_.back() = states::expect_comma_or_end; + break; + case states::root: + handler_->value(s, length, *this); + stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + void begin_member_or_element() + { + JSONCONS_ASSERT(stack_.size() >= 2); + switch (parent()) + { + case states::object: + stack_.back() = states::expect_member_name; + break; + case states::array: + stack_.back() = states::expect_value; + break; + case states::root: + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + uint32_t append_to_codepoint(uint32_t cp, int c) + { + cp *= 16; + if (c >= '0' && c <= '9') + { + cp += c - '0'; + } + else if (c >= 'a' && c <= 'f') + { + cp += c - 'a' + 10; + } + else if (c >= 'A' && c <= 'F') + { + cp += c - 'A' + 10; + } + else + { + err_handler_->error(std::error_code(json_parser_errc::invalid_hex_escape_sequence, json_error_category()), *this); + } + return cp; + } + + size_t do_line_number() const override + { + return line_; + } + + size_t do_column_number() const override + { + return column_; + } + + CharT do_current_char() const override + { + return p_ < end_input_? *p_ : 0; + } +}; + +typedef basic_json_parser json_parser; +typedef basic_json_parser wjson_parser; + +} + +#endif + diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig b/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig new file mode 100644 index 00000000..e4769d5c --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_parser.hpp.orig @@ -0,0 +1,2157 @@ +// Copyright 2015 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_PARSER_HPP +#define JSONCONS_JSON_PARSER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" +#include "jsoncons/json_error_category.hpp" + +namespace jsoncons { + +enum class modes +{ + done, + start, + array_element, + object_member_name, + object_member_value +}; + +enum class states +{ + start, + slash, + slash_slash, + slash_star, + slash_star_star, + expect_comma_or_end, + object, + expect_member_name, + expect_colon, + expect_value, + array, + string, + escape, + u1, + u2, + u3, + u4, + expect_surrogate_pair1, + expect_surrogate_pair2, + u6, + u7, + u8, + u9, + minus, + zero, + integer, + fraction, + exp1, + exp2, + exp3, + n, + t, + f, + cr, + lf, + done, + scalar +}; + +template +class basic_json_parser : private basic_parsing_context +{ + static const int default_depth = 100; + + std::vector state_stack_; + int top_; + std::vector stack_; + basic_json_input_handler *handler_; + basic_parse_error_handler *err_handler_; + size_t column_; + size_t line_; + uint32_t cp_; + uint32_t cp2_; + std::basic_string string_buffer_; + std::basic_string number_buffer_; + bool is_negative_; + states saved_state_; + states pre_line_break_state_; + size_t index_; + int depth_; + int max_depth_; + float_reader float_reader_; + const CharT* begin_input_; + const CharT* end_input_; + const CharT* p_; + uint8_t precision_; + std::pair literal_; + size_t literal_index_; + + std::vector stack2_; + +public: + basic_json_parser(basic_json_input_handler& handler) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())), + column_(0), + line_(0), + cp_(0), + is_negative_(false), + index_(0), + depth_(default_depth) + { + max_depth_ = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + + basic_json_parser(basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(err_handler)), + column_(0), + line_(0), + cp_(0), + is_negative_(false), + index_(0), + depth_(default_depth) + + { + max_depth_ = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + + const basic_parsing_context& parsing_context() const + { + return *this; + } + + ~basic_json_parser() + { + } + + size_t max_nesting_depth() const + { + return static_cast(max_depth_); + } + + void max_nesting_depth(size_t max_nesting_depth) + { + max_depth_ = static_cast(std::min(max_nesting_depth,static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()))); + if (depth_ > max_depth_) + { + depth_ = max_depth_; + stack_.resize(depth_); + } + } + + bool done() const + { + return state_stack_.back() == states::done; + } + + void begin_parse() + { + if (!push(modes::done)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.clear(); + state_stack_.push_back(states::start); + line_ = 1; + column_ = 1; + stack2_.push_back(states::start); + stack2_.push_back(states::scalar); + } + + void check_done(const CharT* input, size_t start, size_t length) + { + index_ = start; + for (; index_ < length; ++index_) + { + CharT curr_char_ = input[index_]; + switch (curr_char_) + { + case '\n': + case '\r': + case '\t': + case ' ': + break; + default: + err_handler_->error(std::error_code(json_parser_errc::extra_character, json_error_category()), *this); + break; + } + } + } + + bool parse_string(const CharT** first, const CharT** last) + { + const CharT* sb = p_; + bool done = false; + bool complete = false; + while (!done && p_ < end_input_) + { + switch (*p_) + { + case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: + case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: + case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f: + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this); + // recovery - skip + done = true; + ++p_; + break; + case '\r': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + done = true; + ++p_; + + stack2_.push_back(states::cr); + } + break; + case '\n': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; + done = true; + ++p_; + + stack2_.push_back(states::lf); + } + break; + case '\t': + { + column_ += (p_ - sb + 1); + err_handler_->error(std::error_code(json_parser_errc::illegal_character_in_string, json_error_category()), *this); + // recovery - keep + string_buffer_.append(sb, p_ - sb + 1); + done = true; + ++p_; + } + break; + case '\\': + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); +<<<<<<< HEAD + state_stack_.back() = states::escape; +======= + state_ = states::escape; + stack2_.front() = states::escape; +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + done = true; + ++p_; + break; + case '\"': + if (string_buffer_.length() == 0) + { + *first = sb; + *last = p_; + //end_string_value(sb,p_-sb); + } + else + { + string_buffer_.append(sb,p_-sb); + *first = string_buffer_.data(); + *last = string_buffer_.data() + string_buffer_.length(); + //end_string_value(string_buffer_.data(),string_buffer_.length()); + //string_buffer_.clear(); + } + column_ += (p_ - sb + 1); + done = true; + complete = true; + ++p_; + break; + default: + ++p_; + break; + } + } + if (!done) + { + string_buffer_.append(sb,p_-sb); + column_ += (p_ - sb + 1); + } + + return complete; + } + + void parse(const CharT* const input, size_t start, size_t length) + { + begin_input_ = input + start; + end_input_ = input + length; + p_ = begin_input_; + + index_ = start; + while ((p_ < end_input_) && (state_stack_.back() != states::done)) + { + switch (*p_) + { + case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: + case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: + case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f: + err_handler_->error(std::error_code(json_parser_errc::illegal_control_character, json_error_category()), *this); + break; + default: + break; + } + + switch (state_stack_.back()) + { + case states::cr: + ++line_; + column_ = 1; + switch (*p_) + { + case '\n': + state_stack_.back() = pre_line_break_state_; + ++p_; + break; + default: + state_stack_.back() = pre_line_break_state_; + break; + } + JSONCONS_ASSERT(stack2_.size() > 0); + stack2_.pop_back(); + break; + case states::lf: + ++line_; + column_ = 1; +<<<<<<< HEAD + state_stack_.back() = pre_line_break_state_; +======= + state_ = pre_line_break_state_; + JSONCONS_ASSERT(stack2_.size() > 0); + stack2_.pop_back(); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case states::start: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '{': + handler_->begin_json(); + if (!push(modes::object_member_name)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } +<<<<<<< HEAD + state_stack_.back() = states::object; +======= + state_ = states::object; + +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + handler_->begin_object(*this); + break; + case '[': + handler_->begin_json(); + if (!push(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.back() = states::array; + handler_->begin_array(*this); + break; + case '\"': + handler_->begin_json(); + flip(modes::done, modes::start); + state_stack_.back() = states::string; + break; + case '-': + handler_->begin_json(); + flip(modes::done, modes::start); + is_negative_ = true; + state_stack_.back() = states::minus; + break; + case '0': + handler_->begin_json(); + flip(modes::done, modes::start); + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + handler_->begin_json(); + flip(modes::done, modes::start); + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::integer; + break; + case 'f': + handler_->begin_json(); + flip(modes::done, modes::start); + state_stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + break; + case 'n': + handler_->begin_json(); + flip(modes::done, modes::start); + state_stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + handler_->begin_json(); + flip(modes::done, modes::start); + state_stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + case '}': + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this); + break; + case ']': + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this); + break; + default: + err_handler_->fatal_error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + + case states::expect_comma_or_end: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '}': + if (peek() == modes::object_member_value) + { + pop(modes::object_member_value); + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + else if (peek() == modes::array_element) + { + err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this); + } + else + { + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_brace, json_error_category()), *this); + } + break; + case ']': + if (peek() == modes::array_element) + { + pop(modes::array_element); + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + else if (peek() == modes::object_member_value) + { + err_handler_->fatal_error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this); + } + else + { + err_handler_->fatal_error(std::error_code(json_parser_errc::unexpected_right_bracket, json_error_category()), *this); + } + break; + case ',': + begin_member_or_element(); + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + default: + if (peek() == modes::array_element) + { + err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_bracket, json_error_category()), *this); + } + else if (peek() == modes::object_member_value) + { + err_handler_->error(std::error_code(json_parser_errc::expected_comma_or_right_brace, json_error_category()), *this); + } + break; + } + } + ++p_; + ++column_; + break; + case states::object: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '}': + if (!pop(modes::object_member_name)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case '\"': + state_stack_.back() = states::string; + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_member_name: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '\"': + state_stack_.back() = states::string; + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + case '}': + err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this); + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_name, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_colon: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case ':': + begin_member_value(); + state_stack_.back() = states::expect_value; + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_colon, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_value: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '{': + if (!push(modes::object_member_name)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.back() = states::object; + handler_->begin_object(*this); + break; + case '[': + if (!push(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.back() = states::array; + handler_->begin_array(*this); + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + + case '\"': + state_stack_.back() = states::string; + break; + case '-': + is_negative_ = true; + state_stack_.back() = states::minus; + break; + case '0': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::integer; + break; + case 'f': + state_stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + /*if ((p_+4) < end_input_) + { + if ((*(p_+1) == 'a') & (*(p_+2) == 'l') & (*(p_+3) == 's') & (*(p_+4) == 'e')) + { + p_ += 4; + column_ += 4; + handler_->value(false, *this); + if (peek() == modes::start) + { + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + }*/ + break; + case 'n': + state_stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + state_stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case ']': + if (peek() == modes::array_element) + { + err_handler_->error(std::error_code(json_parser_errc::extra_comma, json_error_category()), *this); + } + else + { + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + } + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::array: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + break; + case '{': + if (!push(modes::object_member_name)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.back() = states::object; + handler_->begin_object(*this); + break; + case '[': + if (!push(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::max_depth_exceeded, json_error_category()), *this); + } + state_stack_.back() = states::array; + handler_->begin_array(*this); + break; + case ']': + if (!pop(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case '\"': + state_stack_.back() = states::string; + break; + case '/': + saved_state_ = state_stack_.back(); + state_stack_.back() = states::slash; + break; + case '-': + is_negative_ = true; + state_stack_.back() = states::minus; + break; + case '0': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::integer; + break; + case 'f': + state_stack_.back() = states::f; + literal_ = json_literals::false_literal(); + literal_index_ = 1; + /*if ((p_+4) < end_input_) + { + if ((*(p_+1) == 'a') & (*(p_+2) == 'l') & (*(p_+3) == 's') & (*(p_+4) == 'e')) + { + p_ += 4; + column_ += 4; + handler_->value(false, *this); + if (peek() == modes::start) + { + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + }*/ + break; + case 'n': + state_stack_.back() = states::n; + literal_ = json_literals::null_literal(); + literal_index_ = 1; + break; + case 't': + state_stack_.back() = states::t; + literal_ = json_literals::true_literal(); + literal_index_ = 1; + break; + case '\'': + err_handler_->error(std::error_code(json_parser_errc::single_quote, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::string: + { + const CharT* first; + const CharT* last; + if (parse_string(&first,&last)) + { + end_string_value(first,last-first); + string_buffer_.clear(); + } + } + break; + case states::escape: + { + escape_next_char(*p_); + } + ++p_; + ++column_; + break; + case states::u1: + { + append_codepoint(*p_); + state_stack_.back() = states::u2; + } + ++p_; + ++column_; + break; + case states::u2: + { + append_codepoint(*p_); + state_stack_.back() = states::u3; + } + ++p_; + ++column_; + break; + case states::u3: + { + append_codepoint(*p_); + state_stack_.back() = states::u4; + } + ++p_; + ++column_; + break; + case states::u4: + { + append_codepoint(*p_); + if (cp_ >= min_lead_surrogate && cp_ <= max_lead_surrogate) + { + state_stack_.back() = states::expect_surrogate_pair1; + } + else + { + json_char_traits::append_codepoint_to_string(cp_, string_buffer_); + state_stack_.back() = states::string; + } + } + ++p_; + ++column_; + break; + case states::expect_surrogate_pair1: + { + switch (*p_) + { + case '\\': + cp2_ = 0; + state_stack_.back() = states::expect_surrogate_pair2; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::expect_surrogate_pair2: + { + switch (*p_) + { + case 'u': + state_stack_.back() = states::u6; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_codepoint_surrogate_pair, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::u6: + { + append_second_codepoint(*p_); + state_stack_.back() = states::u7; + } + ++p_; + ++column_; + break; + case states::u7: + { + append_second_codepoint(*p_); + state_stack_.back() = states::u8; + } + ++p_; + ++column_; + break; + case states::u8: + { + append_second_codepoint(*p_); + state_stack_.back() = states::u9; + } + ++p_; + ++column_; + break; + case states::u9: + { + append_second_codepoint(*p_); + uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF); + json_char_traits::append_codepoint_to_string(cp, string_buffer_); + state_stack_.back() = states::string; + } + ++p_; + ++column_; + break; + case states::minus: + { + switch (*p_) + { + case '0': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::zero; + break; + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::integer; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::zero: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + end_integer_value(); + break; // No change + case '}': + end_integer_value(); + if (!pop(modes::object_member_value)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case ']': + end_integer_value(); + if (!pop(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case '.': + precision_ = static_cast(number_buffer_.length()); + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::fraction; + break; + case ',': + end_integer_value(); + begin_member_or_element(); + break; + case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + err_handler_->error(std::error_code(json_parser_errc::leading_zero, json_error_category()), *this); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::integer: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + end_integer_value(); + break; + case '}': + end_integer_value(); + if (!pop(modes::object_member_value)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case ']': + end_integer_value(); + if (!pop(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::integer; + break; + case '.': + precision_ = static_cast(number_buffer_.length()); + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::fraction; + break; + case ',': + end_integer_value(); + begin_member_or_element(); + break; + case 'e':case 'E': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::fraction: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + end_fraction_value(); + break; + case '}': + end_fraction_value(); + if (!pop(modes::object_member_value)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case ']': + end_fraction_value(); + if (!pop(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + ++precision_; + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::fraction; + break; + case ',': + end_fraction_value(); + begin_member_or_element(); + break; + case 'e':case 'E': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp1: + { + switch (*p_) + { + case '+': + state_stack_.back() = states::exp2; + break; + case '-': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp2; + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp2: + { + switch (*p_) + { + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::exp3: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case ' ':case '\t': + { + bool done = false; + while (!done && (p_ + 1) < end_input_) + { + switch (*(p_ + 1)) + { + case ' ':case '\t': + ++p_; + ++column_; + break; + default: + done = true; + break; + } + } + } + end_fraction_value(); + break; + case '}': + end_fraction_value(); + if (!pop(modes::object_member_value)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_object(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case ']': + end_fraction_value(); + if (!pop(modes::array_element)) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + } + handler_->end_array(*this); + if (peek() == modes::done) + { + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + break; + case ',': + end_fraction_value(); + begin_member_or_element(); + break; + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + number_buffer_.push_back(static_cast(*p_)); + state_stack_.back() = states::exp3; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::t: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(true, *this); + if (peek() == modes::start) + { + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::f: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(false, *this); + if (peek() == modes::start) + { + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::n: + while (p_ < end_input_ && literal_index_ < literal_.second) + { + if (*p_ != literal_.first[literal_index_]) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_value, json_error_category()), *this); + } + ++p_; + ++literal_index_; + ++column_; + } + if (literal_index_ == literal_.second) + { + handler_->value(null_type(), *this); + if (peek() == modes::start) + { + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + } + else + { + state_stack_.back() = states::expect_comma_or_end; + } + } + break; + case states::slash: + { + switch (*p_) + { + case '*': + state_stack_.back() = states::slash_star; + break; + case '/': + state_stack_.back() = states::slash_slash; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + ++p_; + ++column_; + break; + case states::slash_star: + { + switch (*p_) + { + case '\r': +<<<<<<< HEAD + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = state_stack_.back(); + state_stack_.back() = states::lf; +======= + pre_line_break_state_ = state_; + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + case '*': + state_stack_.back() = states::slash_star_star; + break; + } + } + ++p_; + ++column_; + break; + case states::slash_slash: + { + switch (*p_) + { + case '\r': + pre_line_break_state_ = saved_state_; +<<<<<<< HEAD + state_stack_.back() = states::cr; + break; + case '\n': + pre_line_break_state_ = saved_state_; + state_stack_.back() = states::lf; +======= + state_ = states::cr; + stack2_.push_back(states::cr); + break; + case '\n': + pre_line_break_state_ = saved_state_; + state_ = states::lf; + stack2_.push_back(states::lf); +>>>>>>> 8522df40eb2e2c14a4b40274eedf44dd9d631bb8 + break; + } + } + ++p_; + ++column_; + break; + case states::slash_star_star: + { + switch (*p_) + { + case '/': + state_stack_.back() = saved_state_; + break; + default: + state_stack_.back() = states::slash_star; + break; + } + } + ++p_; + ++column_; + break; + default: + JSONCONS_THROW_EXCEPTION(std::runtime_error,"Bad parser state"); + break; + } + } + index_ += (p_-begin_input_); + } + + void end_parse() + { + if (peek() == modes::start) + { + switch (state_stack_.back()) + { + case states::zero: + case states::integer: + end_integer_value(); + break; + case states::fraction: + case states::exp3: + end_fraction_value(); + break; + default: + break; + } + } + if (!pop(modes::done)) + { + err_handler_->error(std::error_code(json_parser_errc::unexpected_eof, json_error_category()), *this); + } + } + + states state() const + { + return state_stack_.back(); + } + + size_t index() const + { + return index_; + } +private: + void end_fraction_value() + { + try + { + double d = float_reader_.read(number_buffer_.data(), precision_); + if (is_negative_) + d = -d; + handler_->value(d, static_cast(precision_), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); // recovery + } + number_buffer_.clear(); + is_negative_ = false; + switch (stack_[top_]) + { + case modes::array_element: + case modes::object_member_value: + state_stack_.back() = states::expect_comma_or_end; + break; + case modes::start: + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + void end_integer_value() + { + if (is_negative_) + { + try + { + int64_t d = string_to_integer(is_negative_, number_buffer_.data(), number_buffer_.length()); + handler_->value(d, *this); + } + catch (const std::exception&) + { + try + { + double d = float_reader_.read(number_buffer_.data(), number_buffer_.length()); + handler_->value(-d, static_cast(number_buffer_.length()), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); + } + } + } + else + { + try + { + uint64_t d = string_to_uinteger(number_buffer_.data(), number_buffer_.length()); + handler_->value(d, *this); + } + catch (const std::exception&) + { + try + { + double d = float_reader_.read(number_buffer_.data(),number_buffer_.length()); + handler_->value(d, static_cast(number_buffer_.length()), *this); + } + catch (...) + { + err_handler_->error(std::error_code(json_parser_errc::invalid_number, json_error_category()), *this); + handler_->value(null_type(), *this); + } + } + } + + switch (stack_[top_]) + { + case modes::array_element: + case modes::object_member_value: + state_stack_.back() = states::expect_comma_or_end; + break; + case modes::start: + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + number_buffer_.clear(); + is_negative_ = false; + } + + void append_codepoint(int c) + { + switch (c) + { + case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + case 'a':case 'b':case 'c':case 'd':case 'e':case 'f': + case 'A':case 'B':case 'C':case 'D':case 'E':case 'F': + cp_ = append_to_codepoint(cp_, c); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + + void append_second_codepoint(int c) + { + switch (c) + { + case '0': + case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': + case 'a':case 'b':case 'c':case 'd':case 'e':case 'f': + case 'A':case 'B':case 'C':case 'D':case 'E':case 'F': + cp2_ = append_to_codepoint(cp2_, c); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::expected_value, json_error_category()), *this); + break; + } + } + + void escape_next_char(int next_input) + { + switch (next_input) + { + case '\"': + string_buffer_.push_back('\"'); + state_stack_.back() = states::string; + break; + case '\\': + string_buffer_.push_back('\\'); + state_stack_.back() = states::string; + break; + case '/': + string_buffer_.push_back('/'); + state_stack_.back() = states::string; + break; + case 'b': + string_buffer_.push_back('\b'); + state_stack_.back() = states::string; + break; + case 'f': + string_buffer_.push_back('\f'); + state_stack_.back() = states::string; + break; + case 'n': + string_buffer_.push_back('\n'); + state_stack_.back() = states::string; + break; + case 'r': + string_buffer_.push_back('\r'); + state_stack_.back() = states::string; + break; + case 't': + string_buffer_.push_back('\t'); + state_stack_.back() = states::string; + break; + case 'u': + cp_ = 0; + state_stack_.back() = states::u1; + break; + default: + err_handler_->error(std::error_code(json_parser_errc::illegal_escaped_character, json_error_category()), *this); + break; + } + } + + void end_string_value(const CharT* s, size_t length) + { + switch (stack_[top_]) + { + case modes::object_member_name: + handler_->name(s, length, *this); + state_stack_.back() = states::expect_colon; + break; + case modes::array_element: + case modes::object_member_value: + handler_->value(s, length, *this); + state_stack_.back() = states::expect_comma_or_end; + break; + case modes::start: + handler_->value(s, length, *this); + flip(modes::start,modes::done); + state_stack_.back() = states::done; + handler_->end_json(); + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + void begin_member_or_element() + { + switch (stack_[top_]) + { + case modes::object_member_value: + // A comma causes a flip from object_member_value modes to object_member_name modes. + flip(modes::object_member_value, modes::object_member_name); + state_stack_.back() = states::expect_member_name; + break; + case modes::array_element: + state_stack_.back() = states::expect_value; + break; + case modes::done: + break; + default: + err_handler_->error(std::error_code(json_parser_errc::invalid_json_text, json_error_category()), *this); + break; + } + } + + void begin_member_value() + { + flip(modes::object_member_name, modes::object_member_value); + state_stack_.back() = states::expect_value; + } + + uint32_t append_to_codepoint(uint32_t cp, int c) + { + cp *= 16; + if (c >= '0' && c <= '9') + { + cp += c - '0'; + } + else if (c >= 'a' && c <= 'f') + { + cp += c - 'a' + 10; + } + else if (c >= 'A' && c <= 'F') + { + cp += c - 'A' + 10; + } + else + { + err_handler_->error(std::error_code(json_parser_errc::invalid_hex_escape_sequence, json_error_category()), *this); + } + return cp; + } + + size_t do_line_number() const override + { + return line_; + } + + size_t do_column_number() const override + { + return column_; + } + + CharT do_current_char() const override + { + return p_ < end_input_? *p_ : 0; + } + + bool push(modes mode) + { + ++top_; + if (top_ >= depth_) + { + if (top_ >= max_depth_) + { + return false; + } + depth_ *= 2; + stack_.resize(depth_); + } + stack_[top_] = mode; + return true; + } + + modes peek() + { + return stack_[top_]; + } + + bool peek(modes mode) + { + return stack_[top_] == mode; + } + + void flip(modes mode1, modes mode2) + { + JSONCONS_ASSERT((top_ >= 0) && (stack_[top_] == mode1)) + stack_[top_] = mode2; + } + + bool pop(modes mode) + { + if (top_ < 0 || stack_[top_] != mode) + { + return false; + } + --top_; + return true; + } +}; + +typedef basic_json_parser json_parser; +typedef basic_json_parser wjson_parser; + +} + +#endif + diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_reader.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_reader.hpp new file mode 100644 index 00000000..a0dd4641 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_reader.hpp @@ -0,0 +1,176 @@ +// Copyright 2015 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_READER_HPP +#define JSONCONS_JSON_READER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" +#include "jsoncons/json_parser.hpp" + +namespace jsoncons { + +template +class basic_json_reader +{ + static const size_t default_max_buffer_length = 16384; + + basic_json_parser parser_; + std::basic_istream *is_; + basic_parse_error_handler *err_handler_; + bool eof_; + std::vector buffer_; + size_t buffer_length_; + size_t buffer_capacity_; + size_t index_; +public: + basic_json_reader(std::basic_istream& is, + basic_json_input_handler& handler) + : parser_(handler), + is_(std::addressof(is)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())), + eof_(false), + buffer_length_(0), + buffer_capacity_(default_max_buffer_length), + index_(0) + { + buffer_.resize(buffer_capacity_); + } + + basic_json_reader(std::basic_istream& is, + basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : parser_(handler,err_handler), + is_(std::addressof(is)), + err_handler_(std::addressof(err_handler)), + eof_(false), + buffer_length_(0), + buffer_capacity_(default_max_buffer_length), + index_(0) + { + buffer_.resize(buffer_capacity_); + } + + size_t buffer_capacity() const + { + return buffer_capacity_; + } + + void buffer_capacity(size_t capacity) + { + buffer_capacity_ = capacity; + buffer_.resize(buffer_capacity_); + } + + size_t max_nesting_depth() const + { + return parser_.max_nesting_depth(); + } + + void max_nesting_depth(size_t depth) + { + parser_.max_nesting_depth(depth); + } + + void read_next() + { + parser_.begin_parse(); + while (!eof_ && !parser_.done()) + { + if (!(index_ < buffer_length_)) + { + if (!is_->eof()) + { + is_->read(buffer_.data(), buffer_capacity_); + buffer_length_ = static_cast(is_->gcount()); + if (buffer_length_ == 0) + { + eof_ = true; + } + index_ = 0; + } + else + { + eof_ = true; + } + } + if (!eof_) + { + parser_.parse(buffer_.data(),index_,buffer_length_); + index_ = parser_.index(); + } + } + parser_.end_parse(); + } + + void check_done() + { + while (!eof_) + { + if (!(index_ < buffer_length_)) + { + if (!is_->eof()) + { + is_->read(buffer_.data(), buffer_capacity_); + buffer_length_ = static_cast(is_->gcount()); + if (buffer_length_ == 0) + { + eof_ = true; + } + index_ = 0; + } + else + { + eof_ = true; + } + } + if (!eof_) + { + parser_.check_done(buffer_.data(),index_,buffer_length_); + index_ = parser_.index(); + } + } + } + + bool eof() const + { + return eof_; + } + +#if !defined(JSONCONS_NO_DEPRECATED) + void read() + { + read_next(); + } + + size_t max_depth() const + { + return parser_.max_nesting_depth(); + } + + void max_depth(size_t depth) + { + parser_.max_nesting_depth(depth); + } +#endif +}; + +typedef basic_json_reader json_reader; +typedef basic_json_reader wjson_reader; + +} + +#endif + diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_serializer.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_serializer.hpp new file mode 100644 index 00000000..d9f3bf4f --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_serializer.hpp @@ -0,0 +1,435 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_SERIALIZER_HPP +#define JSONCONS_JSON_SERIALIZER_HPP + +#include +#include +#include +#include +#include +#include +#include // std::numeric_limits +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/output_format.hpp" +#include "jsoncons/json_output_handler.hpp" + +namespace jsoncons { + +template +class basic_json_serializer : public basic_json_output_handler +{ + static const size_t default_buffer_length = 16384; + + struct stack_item + { + stack_item(bool is_object) + : is_object_(is_object), count_(0), option_(block_options::next_line), multiline_(false) + { + scalar_option_ = is_object ? block_options::next_line : block_options::same_line; + } + stack_item(bool is_object, block_options option) + : is_object_(is_object), count_(0), option_(option), multiline_(false) + { + scalar_option_ = is_object ? block_options::next_line : block_options::same_line; + } + bool is_multiline() const + { + return multiline_; + } + + bool is_object() const + { + return is_object_; + } + + bool is_same_line() const + { + return option_ = block_options::same_line; + } + + bool is_next_line() const + { + return option_ == block_options::next_line; + } + + bool scalar_next_line() const + { + return scalar_option_ == block_options::next_line; + } + + bool is_object_; + size_t count_; + block_options option_; + block_options scalar_option_; + bool multiline_; + }; + basic_output_format format_; + std::vector stack_; + int indent_; + std::streamsize original_precision_; + std::ios_base::fmtflags original_format_flags_; + bool indenting_; + float_printer fp_; + buffered_ostream bos_; +public: + basic_json_serializer(std::basic_ostream& os) + : indent_(0), + indenting_(false), + fp_(format_.precision()), + bos_(os) + { + } + + basic_json_serializer(std::basic_ostream& os, bool indenting) + : indent_(0), + indenting_(indenting), + fp_(format_.precision()), + bos_(os) + { + } + + basic_json_serializer(std::basic_ostream& os, const basic_output_format& format) + : format_(format), + indent_(0), + indenting_(false), + fp_(format_.precision()), + bos_(os) + { + } + basic_json_serializer(std::basic_ostream& os, const basic_output_format& format, bool indenting) + : format_(format), + indent_(0), + indenting_(indenting), + fp_(format_.precision()), + bos_(os) + { + } + + ~basic_json_serializer() + { + } + +private: + // Implementing methods + void do_begin_json() override + { + } + + void do_end_json() override + { + bos_.flush(); + } + + void do_begin_object() override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + bos_. put(','); + } + } + } + + if (indenting_) + { + if (!stack_.empty() && stack_.back().is_object()) + { + if (format_.object_object_block_option() == block_options::next_line) + { + write_indent(); + } + stack_.push_back(stack_item(true,format_.object_object_block_option())); + } + else if (!stack_.empty()) + { + if (format_.array_object_block_option() == block_options::next_line) + { + write_indent(); + } + stack_.push_back(stack_item(true,format_.array_object_block_option())); + } + else + { + stack_.push_back(stack_item(true)); + } + indent(); + } + else + { + stack_.push_back(stack_item(true)); + } + bos_.put('{'); + } + + void do_end_object() override + { + JSONCONS_ASSERT(!stack_.empty()); + if (indenting_) + { + unindent(); + write_indent(); + } + stack_.pop_back(); + bos_.put('}'); + + end_value(); + } + + + void do_begin_array() override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + bos_. put(','); + } + } + } + if (indenting_) + { + if (!stack_.empty() && stack_.back().is_object()) + { + if (format_.object_array_block_option() == block_options::next_line) + { + write_indent(); + } + stack_.push_back(stack_item(false,format_.object_array_block_option())); + } + else if (!stack_.empty()) + { + if (format_.array_array_block_option() == block_options::next_line) + { + write_indent(); + } + stack_.push_back(stack_item(false,format_.array_array_block_option())); + } + else + { + stack_.push_back(stack_item(false)); + } + indent(); + } + else + { + stack_.push_back(stack_item(false)); + } + bos_.put('['); + } + + void do_end_array() override + { + JSONCONS_ASSERT(!stack_.empty()); + if (indenting_) + { + unindent(); + if (stack_.back().is_multiline()) + { + write_indent(); + } + } + stack_.pop_back(); + bos_.put(']'); + end_value(); + } + + void do_name(const CharT* name, size_t length) override + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + bos_. put(','); + } + if (indenting_) + { + if (stack_.back().scalar_next_line()) + { + write_indent(); + } + } + } + + bos_.put('\"'); + escape_string(name, length, format_, bos_); + bos_.put('\"'); + bos_.put(':'); + bos_.put(' '); + } + + void do_null_value() override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + + auto buf = json_literals::null_literal(); + bos_.write(buf.first,buf.second); + + end_value(); + } + + void do_string_value(const CharT* value, size_t length) override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + + bos_. put('\"'); + escape_string(value, length, format_, bos_); + bos_. put('\"'); + + end_value(); + } + + void do_double_value(double value, uint8_t precision) override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + + if (is_nan(value) && format_.replace_nan()) + { + bos_.write(format_.nan_replacement()); + } + else if (is_pos_inf(value) && format_.replace_pos_inf()) + { + bos_.write(format_.pos_inf_replacement()); + } + else if (is_neg_inf(value) && format_.replace_neg_inf()) + { + bos_.write(format_.neg_inf_replacement()); + } + else + { + fp_.print(value,precision,bos_); + } + + end_value(); + } + + void do_integer_value(int64_t value) override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + print_integer(value,bos_); + end_value(); + } + + void do_uinteger_value(uint64_t value) override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + print_uinteger(value,bos_); + end_value(); + } + + void do_bool_value(bool value) override + { + if (!stack_.empty() && !stack_.back().is_object()) + { + begin_scalar_value(); + } + + if (value) + { + auto buf = json_literals::true_literal(); + bos_.write(buf.first,buf.second); + } + else + { + auto buf = json_literals::false_literal(); + bos_.write(buf.first,buf.second); + } + + end_value(); + } + + void begin_scalar_value() + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + bos_. put(','); + } + if (indenting_) + { + if (stack_.back().scalar_next_line()) + { + write_indent(); + } + } + } + } + + void begin_value() + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + bos_. put(','); + } + if (indenting_ && stack_.back().is_next_line()) + { + write_indent(); + } + } + } + + void end_value() + { + if (!stack_.empty()) + { + ++stack_.back().count_; + } + } + + void indent() + { + indent_ += static_cast(format_.indent()); + } + + void unindent() + { + indent_ -= static_cast(format_.indent()); + } + + void write_indent() + { + if (!stack_.empty()) + { + stack_.back().multiline_ = true; + } + bos_. put('\n'); + for (int i = 0; i < indent_; ++i) + { + bos_. put(' '); + } + } +}; + +typedef basic_json_serializer json_serializer; +typedef basic_json_serializer wjson_serializer; + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_structures.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_structures.hpp new file mode 100644 index 00000000..ee8f75af --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_structures.hpp @@ -0,0 +1,860 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_STRUCTURES_HPP +#define JSONCONS_JSON_STRUCTURES_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" + +namespace jsoncons { + +template +class json_array +{ +public: + typedef Alloc allocator_type; + typedef JsonT value_type; + typedef typename std::allocator_traits:: template rebind_alloc vector_allocator_type; + typedef typename std::vector::reference reference; + typedef typename std::vector::const_reference const_reference; + typedef typename std::vector::iterator iterator; + typedef typename std::vector::const_iterator const_iterator; + + json_array() + : elements_() + { + } + + explicit json_array(const Alloc& allocator) + : elements_(allocator) + { + } + + explicit json_array(size_t n, const Alloc& allocator = Alloc()) + : elements_(n,JsonT(),allocator) + { + } + + explicit json_array(size_t n, const JsonT& value, const Alloc& allocator = Alloc()) + : elements_(n,value,allocator) + { + } + + template + json_array(InputIterator begin, InputIterator end, const Alloc& allocator = Alloc()) + : elements_(begin,end,allocator) + { + } + + json_array(const json_array& val) + : elements_(val.elements_) + { + } + + json_array(const json_array& val, const Alloc& allocator) + : elements_(val.elements_,allocator) + { + } + json_array(json_array&& val) + : elements_(std::move(val.elements_)) + { + } + json_array(json_array&& val, const Alloc& allocator) + : elements_(std::move(val.elements_),allocator) + { + } + + json_array(std::initializer_list init, + const Alloc& allocator = Alloc()) + : elements_(std::move(init),allocator) + { + } + + Alloc get_allocator() const + { + return elements_.get_allocator(); + } + + void swap(json_array& val) + { + elements_.swap(val.elements_); + } + + size_t size() const {return elements_.size();} + + size_t capacity() const {return elements_.capacity();} + + void clear() {elements_.clear();} + + void shrink_to_fit() + { + for (size_t i = 0; i < elements_.size(); ++i) + { + elements_[i].shrink_to_fit(); + } + elements_.shrink_to_fit(); + } + + void reserve(size_t n) {elements_.reserve(n);} + + void resize(size_t n) {elements_.resize(n);} + + void resize(size_t n, const JsonT& val) {elements_.resize(n,val);} + + void remove_range(size_t from_index, size_t to_index) + { + JSONCONS_ASSERT(from_index <= to_index); + JSONCONS_ASSERT(to_index <= elements_.size()); + elements_.erase(elements_.begin()+from_index,elements_.begin()+to_index); + } + + void erase(iterator first, iterator last) + { + elements_.erase(first,last); + } + + JsonT& operator[](size_t i) {return elements_[i];} + + const JsonT& operator[](size_t i) const {return elements_[i];} + + void push_back(const JsonT& value) + { + elements_.push_back(value); + } + + void push_back(JsonT&& value) + { + elements_.push_back(std::move(value)); + } + + void add(size_t index, const JsonT& value) + { + auto position = index < elements_.size() ? elements_.begin() + index : elements_.end(); + elements_.insert(position, value); + } + + void add(size_t index, JsonT&& value) + { + auto it = index < elements_.size() ? elements_.begin() + index : elements_.end(); + elements_.insert(it, std::move(value)); + } + +#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ < 9 + // work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54577 + iterator add(const_iterator pos, const JsonT& value) + { + iterator it = elements_.begin() + (pos - elements_.begin()); + return elements_.insert(it, value); + } + + iterator add(const_iterator pos, JsonT&& value) + { + iterator it = elements_.begin() + (pos - elements_.begin()); + return elements_.insert(it, std::move(value)); + } +#else + iterator add(const_iterator pos, const JsonT& value) + { + return elements_.insert(pos, value); + } + + iterator add(const_iterator pos, JsonT&& value) + { + return elements_.insert(pos, std::move(value)); + } +#endif + + iterator begin() {return elements_.begin();} + + iterator end() {return elements_.end();} + + const_iterator begin() const {return elements_.begin();} + + const_iterator end() const {return elements_.end();} + + bool operator==(const json_array& rhs) const + { + if (size() != rhs.size()) + { + return false; + } + for (size_t i = 0; i < size(); ++i) + { + if (elements_[i] != rhs.elements_[i]) + { + return false; + } + } + return true; + } +private: + json_array& operator=(const json_array&); + std::vector elements_; +}; + +template +class member_lt_string +{ + size_t length_; +public: + member_lt_string(size_t length) + : length_(length) + { + } + + bool operator()(const ValueT& a, const CharT* b) const + { + size_t len = std::min JSONCONS_NO_MACRO_EXP(a.name().length(),length_); + int result = std::char_traits::compare(a.name().data(),b,len); + if (result != 0) + { + return result < 0; + } + + return a.name().length() < length_; + } +}; + +template +bool name_le_string(const StringT& a, const CharT* b, size_t length) +{ + size_t min_len = std::min JSONCONS_NO_MACRO_EXP(a.length(),length); + int result = std::char_traits::compare(a.data(),b, min_len); + if (result != 0) + { + return result < 0; + } + + return a.length() <= length; +} + +template +bool name_eq_string(const StringT& a, const CharT* b, size_t length) +{ + return a.length() == length && std::char_traits::compare(a.data(),b,length) == 0; +} + +template +class member_lt_member +{ + typedef typename ValueT::char_type char_type; +public: + bool operator()(const ValueT& a, const ValueT& b) const + { + if (a.name().length() == b.name().length()) + { + return std::char_traits::compare(a.name().data(),b.name().data(),a.name().length()) < 0; + } + + size_t len = std::min JSONCONS_NO_MACRO_EXP(a.name().length(),b.name().length()); + int result = std::char_traits::compare(a.name().data(),b.name().data(),len); + if (result != 0) + { + return result < 0; + } + + return a.name().length() < b.name().length(); + } +}; + +template +class name_value_pair +{ +public: + typedef StringT string_type; + typedef typename StringT::value_type char_type; + + name_value_pair() + { + } + name_value_pair(const string_type& name) + : name_(name) + { + } + name_value_pair(string_type&& name) + : name_(std::move(name)) + { + } + + name_value_pair(const string_type& name, const ValueT& val) + : name_(name), value_(val) + { + } + name_value_pair(string_type&& name, const ValueT& val) + : name_(std::move(name)), value_(val) + { + } + name_value_pair(const string_type& name, ValueT&& val) + : name_(name), value_(std::move(val)) + { + } + name_value_pair(string_type&& name, ValueT&& val) + : name_(std::move(name)), value_(std::move(val)) + { + } + name_value_pair(const name_value_pair& member) + : name_(member.name_), value_(member.value_) + { + } + name_value_pair(name_value_pair&& member) + : name_(std::move(member.name_)), value_(std::move(member.value_)) + { + } + + const string_type& name() const + { + return name_; + } + + ValueT& value() + { + return value_; + } + + const ValueT& value() const + { + return value_; + } + + void value(const ValueT& value) + { + value_ = value; + } + + void value(ValueT&& value) + { + value_ = std::move(value); + } + + void swap(name_value_pair& member) + { + name_.swap(member.name_); + value_.swap(member.value_); + } + + name_value_pair& operator=(const name_value_pair& member) + { + if (this != & member) + { + name_ = member.name_; + value_ = member.value_; + } + return *this; + } + + name_value_pair& operator=(name_value_pair&& member) + { + if (this != &member) + { + name_.swap(member.name_); + value_.swap(member.value_); + } + return *this; + } + + void shrink_to_fit() + { + name_.shrink_to_fit(); + value_.shrink_to_fit(); + } +private: + string_type name_; + ValueT value_; +}; + +template +class json_object_iterator +{ +public: + typedef IteratorT iterator; + typedef typename std::iterator_traits::value_type value_type; + typedef typename std::iterator_traits::difference_type difference_type; + typedef typename std::iterator_traits::pointer pointer; + typedef typename std::iterator_traits::reference reference; + typedef std::bidirectional_iterator_tag iterator_category; + + json_object_iterator(bool empty = false) + : empty_(empty) + { + } + + json_object_iterator(iterator it) + : empty_(false), it_(it) + { + } + + json_object_iterator(const json_object_iterator& it) + : empty_(it.empty_), it_(it.it_) + { + } + + json_object_iterator& operator=(json_object_iterator rhs) + { + swap(*this,rhs); + return *this; + } + + json_object_iterator& operator++() + { + ++it_; + return *this; + } + + json_object_iterator operator++(int) // postfix increment + { + json_object_iterator temp(*this); + ++it_; + return temp; + } + + json_object_iterator& operator--() + { + --it_; + return *this; + } + + json_object_iterator operator--(int) + { + json_object_iterator temp(*this); + --it_; + return temp; + } + + reference operator*() const + { + return *it_; + } + + pointer operator->() const + { + return &(*it_); + } + + bool empty() const + { + return empty_; + } + + friend bool operator==(const json_object_iterator& it1, const json_object_iterator& it2) + { + return (it1.empty() && it2.empty()) || (it1.it_ == it2.it_); + } + friend bool operator!=(const json_object_iterator& it1, const json_object_iterator& it2) + { + return !(it1.it_ == it2.it_); + } + friend void swap(json_object_iterator& lhs, json_object_iterator& rhs) + { + using std::swap; + swap(lhs.it_,rhs.it_); + swap(lhs.empty_,rhs.empty_); + } + + iterator get() + { + return it_; + } + +//private: + bool empty_; + IteratorT it_; +}; + +template +class json_object +{ +public: + typedef Alloc allocator_type; + typedef typename JsonT::char_type char_type; + typedef StringT string_type; + typedef name_value_pair value_type; + typedef typename std::vector::iterator base_iterator; + typedef typename std::vector::const_iterator const_base_iterator; + + typedef json_object_iterator iterator; + typedef json_object_iterator const_iterator; +private: + std::vector members_; +public: + json_object(const allocator_type& allocator = allocator_type()) + : members_(allocator) + { + } + + json_object(const json_object& val) + : members_(val.members_) + { + } + + json_object(json_object&& val) + : members_(std::move(val.members_)) + { + } + + json_object(const json_object& val, const allocator_type& allocator) : + members_(val.members_,allocator) + { + } + + json_object(json_object&& val,const allocator_type& allocator) : + members_(std::move(val.members_),allocator) + { + } + + Alloc get_allocator() const + { + return members_.get_allocator(); + } + + iterator begin() + { + //return members_.begin(); + return iterator(members_.begin()); + } + + iterator end() + { + //return members_.end(); + return iterator(members_.end()); + } + + const_iterator begin() const + { + //return iterator(members.data()); + return const_iterator(members_.begin()); + } + + const_iterator end() const + { + //return members_.end(); + return const_iterator(members_.end()); + } +/* + const_iterator cbegin() const + { + return members_.begin(); + } + + const_iterator cend() const + { + return members_.end(); + } +*/ + void swap(json_object& val) + { + members_.swap(val.members_); + } + + size_t size() const {return members_.size();} + + size_t capacity() const {return members_.capacity();} + + void clear() {members_.clear();} + + void shrink_to_fit() + { + for (size_t i = 0; i < members_.size(); ++i) + { + members_[i].shrink_to_fit(); + } + members_.shrink_to_fit(); + } + + void reserve(size_t n) {members_.reserve(n);} + + iterator find(const char_type* name, size_t length) + { + member_lt_string comp(length); + auto it = std::lower_bound(members_.begin(),members_.end(), name, comp); + auto result = (it != members_.end() && name_eq_string(it->name(),name,length)) ? it : members_.end(); + return iterator(result); + } + + const_iterator find(const char_type* name, size_t length) const + { + member_lt_string comp(length); + auto it = std::lower_bound(members_.begin(),members_.end(), name, comp); + auto result = (it != members_.end() && name_eq_string(it->name(),name,length)) ? it : members_.end(); + return const_iterator(result); + } + + void erase(iterator first, iterator last) + { + members_.erase(first.get(),last.get()); + } + + void erase(const char_type* name, size_t length) + { + member_lt_string comp(length); + auto it = std::lower_bound(members_.begin(),members_.end(), name, comp); + if (it != members_.end() && name_eq_string(it->name(),name,length)) + { + members_.erase(it); + } + } + + template + void insert(InputIt first, InputIt last, UnaryPredicate pred) + { + size_t count = std::distance(first,last); + size_t pos = members_.size(); + members_.resize(pos+count); + auto d = members_.begin()+pos; + for (auto s = first; s != last; ++s, ++d) + { + *d = pred(*s); + } + std::sort(members_.begin(),members_.end(),member_lt_member()); + } + + void set(const char_type* s, size_t length, const JsonT& value) + { + auto it = std::lower_bound(members_.begin(),members_.end(),s,member_lt_string(length)); + if (it == members_.end()) + { + members_.push_back(value_type(string_type(s,length),value)); + } + else if (name_eq_string(it->name(),s,length)) + { + it->value(value); + } + else + { + members_.insert(it,value_type(string_type(s,length),value)); + } + } + + void set(const char_type* s, size_t length, JsonT&& value) + { + auto it = std::lower_bound(members_.begin(),members_.end(),s,member_lt_string(length)); + if (it == members_.end()) + { + members_.push_back(value_type(string_type(s,length),std::move(value))); + } + else if (name_eq_string(it->name(),s,length)) + { + it->value(std::move(value)); + } + else + { + members_.insert(it,value_type(string_type(s,length),std::move(value))); + } + } + + void set(string_type&& name, const JsonT& value) + { + auto it = std::lower_bound(members_.begin(),members_.end(),name.data() ,member_lt_string(name.length())); + if (it == members_.end()) + { + members_.push_back(value_type(std::move(name), value)); + } + else if (it->name() == name) + { + it->value(value); + } + else + { + members_.insert(it,value_type(std::move(name),value)); + } + } + + void set(const string_type& name, const JsonT& value) + { + set(name.data(),name.length(),value); + } + + void set(const string_type& name, JsonT&& value) + { + set(name.data(),name.length(),std::move(value)); + } + + void set(string_type&& name, JsonT&& value) + { + auto it = std::lower_bound(members_.begin(),members_.end(),name.data() ,member_lt_string(name.length())); + if (it == members_.end()) + { + members_.push_back(value_type(std::move(name), std::move(value))); + } + else if (it->name() == name) + { + it->value(std::move(value)); + } + else + { + members_.insert(it,value_type(std::move(name),std::move(value))); + } + } + + iterator set(iterator hint, const char_type* name, const JsonT& value) + { + return set(hint, name, std::char_traits::length(name), value); + } + + iterator set(iterator hint, const char_type* name, JsonT&& value) + { + return set(hint, name, std::char_traits::length(name), std::move(value)); + } + + iterator set(iterator hint, const char_type* s, size_t length, const JsonT& value) + { + base_iterator it; + if (hint.get() != members_.end() && name_le_string(hint.get()->name(), s, length)) + { + it = std::lower_bound(hint.get(),members_.end(),s,member_lt_string(length)); + } + else + { + it = std::lower_bound(members_.begin(),members_.end(),s, member_lt_string(length)); + } + + if (it == members_.end()) + { + members_.push_back(value_type(string_type(s, length), value)); + it = members_.begin() + (members_.size() - 1); + } + else if (name_eq_string(it->name(),s,length)) + { + it->value(value); + } + else + { + it = members_.insert(it,value_type(string_type(s,length),value)); + } + return iterator(it); + } + + iterator set(iterator hint, const char_type* s, size_t length, JsonT&& value) + { + base_iterator it; + if (hint.get() != members_.end() && name_le_string(hint.get()->name(), s, length)) + { + it = std::lower_bound(hint.get(),members_.end(),s,member_lt_string(length)); + } + else + { + it = std::lower_bound(members_.begin(),members_.end(),s, member_lt_string(length)); + } + + if (it == members_.end()) + { + members_.push_back(value_type(string_type(s, length), std::move(value))); + it = members_.begin() + (members_.size() - 1); + } + else if (name_eq_string(it->name(),s,length)) + { + it->value(std::move(value)); + } + else + { + it = members_.insert(it,value_type(string_type(s,length),std::move(value))); + } + return iterator(it); + } + + iterator set(iterator hint, const string_type& name, const JsonT& value) + { + return set(hint,name.data(),name.length(),value); + } + + iterator set(iterator hint, string_type&& name, const JsonT& value) + { + base_iterator it; + if (hint.get() != members_.end() && hint.get()->name() <= name) + { + it = std::lower_bound(hint.get(),members_.end(),name.data() ,member_lt_string(name.length())); + } + else + { + it = std::lower_bound(members_.begin(),members_.end(),name.data() ,member_lt_string(name.length())); + } + + if (it == members_.end()) + { + members_.push_back(value_type(std::move(name), value)); + it = members_.begin() + (members_.size() - 1); + } + else if (it->name() == name) + { + it->value(value); + } + else + { + it = members_.insert(it,value_type(std::move(name),value)); + } + return iterator(it); + } + + iterator set(iterator hint, const string_type& name, JsonT&& value) + { + return set(hint,name.data(),name.length(),std::move(value)); + } + + iterator set(iterator hint, string_type&& name, JsonT&& value) + { + typename std::vector::iterator it; + if (hint.get() != members_.end() && hint.get()->name() <= name) + { + it = std::lower_bound(hint.get(),members_.end(),name.data() ,member_lt_string(name.length())); + } + else + { + it = std::lower_bound(members_.begin(),members_.end(),name.data() ,member_lt_string(name.length())); + } + + if (it == members_.end()) + { + members_.push_back(value_type(std::move(name), std::move(value))); + it = members_.begin() + (members_.size() - 1); + } + else if (it->name() == name) + { + it->value(std::move(value)); + } + else + { + it = members_.insert(it,value_type(std::move(name),std::move(value))); + } + return iterator(it); + } + + bool operator==(const json_object& rhs) const + { + if (size() != rhs.size()) + { + return false; + } + for (auto it = members_.begin(); it != members_.end(); ++it) + { + + auto rhs_it = std::lower_bound(rhs.members_.begin(), rhs.members_.end(), *it, member_lt_member()); + // member_lt_member actually only compares keys, so we need to check the value separately + if (rhs_it == rhs.members_.end() || rhs_it->name() != it->name() || rhs_it->value() != it->value()) + { + return false; + } + } + return true; + } +private: + json_object& operator=(const json_object&); +}; + + + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/json_type_traits.hpp b/vendor/jsoncons-0.99.2/jsoncons/json_type_traits.hpp new file mode 100644 index 00000000..aeda7a0b --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/json_type_traits.hpp @@ -0,0 +1,594 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSON_TYPE_TRAITS_HPP +#define JSONCONS_JSON_TYPE_TRAITS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" +#endif + +namespace jsoncons { + +template +class json_type_traits +{ +public: + static bool is(const JsonT&) + { + return false; + } +}; + +template +class json_type_traits +{ +public: + typedef typename JsonT::string_type string_type; + typedef typename string_type::allocator_type string_allocator; + + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_string(); + } + static string_type as(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.as_string(); + } + static string_type as(const JsonT& rhs, const string_allocator& allocator) JSONCONS_NOEXCEPT + { + return rhs.as_string(allocator); + } + static void assign(JsonT& lhs, const string_type& rhs) + { + lhs.assign_string(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& lhs) JSONCONS_NOEXCEPT + { + return lhs.is_any(); + } + static typename JsonT::any as(const JsonT& rhs) + { + return rhs.any_value(); + } + static void assign(JsonT& lhs, typename JsonT::any rhs) + { + lhs.assign_any(rhs); + } +}; + +template +class json_type_traits::const_pointer_type> +{ +public: + typedef typename JsonT::char_type char_type; + + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_string(); + } + static const char_type* as(const JsonT& rhs) + { + return rhs.as_cstring(); + } + static void assign(JsonT& lhs, const char_type *rhs) + { + size_t length = std::char_traits::length(rhs); + lhs.assign_string(rhs,length); + } +}; + +template +class json_type_traits::pointer_type> +{ +public: + typedef typename JsonT::char_type char_type; + + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_string(); + } + static const char_type* as(const JsonT& rhs) + { + return rhs.as_cstring(); + } + static void assign(JsonT& lhs, const char_type *rhs) + { + size_t length = std::char_traits::length(rhs); + lhs.assign_string(rhs,length); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else + { + return false; + } + } + static char as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, char ch) + { + lhs.assign_integer(ch); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else + { + return false; + } + } + static unsigned char as(const JsonT& rhs) + { + return static_cast(rhs.as_uinteger()); + } + static void assign(JsonT& lhs, unsigned char ch) + { + lhs.assign_uinteger(ch); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); + } + else + { + return false; + } + } + static signed char as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, signed char ch) + { + lhs.assign_integer(ch); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); + } + else + { + return false; + } + } + static wchar_t as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, wchar_t ch) + { + lhs.assign_integer(ch); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_object(); + } + static typename JsonT::object as(JsonT rhs) + { + JSONCONS_ASSERT(rhs.is_object()); + return rhs.object_value(); + } + static void assign(JsonT& lhs, typename JsonT::object rhs) + { + lhs.assign_object(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_array(); + } + static typename JsonT::array as(const JsonT& rhs) + { + JSONCONS_ASSERT(rhs.is_array()); + return rhs.array_value(); + } + static void assign(JsonT& lhs, typename JsonT::array rhs) + { + lhs.assign_array(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_null(); + } + static typename jsoncons::null_type as(const JsonT& rhs) + { + JSONCONS_ASSERT(rhs.is_null()); + return jsoncons::null_type(); + } + static void assign(JsonT& lhs, null_type) + { + lhs.assign_null(); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_bool(); + } + static bool as(const JsonT& rhs) + { + return rhs.as_bool(); + } + static void assign(JsonT& lhs, bool rhs) + { + lhs.assign_bool(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); + } + else + { + return false; + } + } + static short as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, short rhs) + { + lhs.assign_integer(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else + { + return false; + } + } + static unsigned short as(const JsonT& rhs) + { + return (unsigned short)rhs.as_uinteger(); + } + static void assign(JsonT& lhs, unsigned short rhs) + { + lhs.assign_uinteger(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); + } + else + { + return false; + } + } + static int as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, int rhs) + { + lhs.assign_integer(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else + { + return false; + } + } + static unsigned int as(const JsonT& rhs) + { + return static_cast(rhs.as_uinteger()); + } + static void assign(JsonT& lhs, unsigned int rhs) + { + lhs.assign_uinteger(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); + } + else + { + return false; + } + } + static long as(const JsonT& rhs) + { + return static_cast(rhs.as_integer()); + } + static void assign(JsonT& lhs, long rhs) + { + lhs.assign_integer(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + if (rhs.is_integer()) + { + return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else if (rhs.is_uinteger()) + { + return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + } + else + { + return false; + } + } + static unsigned long as(const JsonT& rhs) + { + return static_cast(rhs.as_uinteger()); + } + static void assign(JsonT& lhs, unsigned long rhs) + { + lhs.assign_uinteger(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_integer(); + } + static long long as(const JsonT& rhs) + { + return rhs.as_integer(); + } + static void assign(JsonT& lhs, long long rhs) + { + lhs.assign_integer(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_uinteger(); + } + static unsigned long long as(const JsonT& rhs) + { + return rhs.as_uinteger(); + } + static void assign(JsonT& lhs, unsigned long long rhs) + { + lhs.assign_uinteger(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_double(); + } + + static double as(const JsonT& rhs) + { + return rhs.as_double(); + } + static void assign(JsonT& lhs, double rhs) + { + lhs.assign_double(rhs); + } +}; + +template +class json_type_traits +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + return rhs.is_double(); + } + static double as(const JsonT& rhs) + { + return static_cast(rhs.as_double()); + } + static void assign(JsonT& lhs, float rhs) + { + lhs.assign_double(static_cast(rhs)); + } +}; + +template +class json_type_traits> +{ +public: + static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT + { + bool result = rhs.is_array(); + for (size_t i = 0; result && i < rhs.size(); ++i) + { + if (!rhs[i].template is()) + { + result = false; + } + } + return result; + } + static std::vector as(const JsonT& rhs) + { + std::vector v(rhs.size()); + for (size_t i = 0; i < v.size(); ++i) + { + v[i] = rhs[i].template as(); + } + return v; + } + static void assign(JsonT& lhs, const std::vector& rhs) + { + lhs = JsonT(rhs.begin(), rhs.end()); + } +}; + +} + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/jsoncons.hpp b/vendor/jsoncons-0.99.2/jsoncons/jsoncons.hpp new file mode 100644 index 00000000..a45e4f8c --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/jsoncons.hpp @@ -0,0 +1,347 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONCONS_HPP +#define JSONCONS_JSONCONS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons_config.hpp" +#include "jsoncons/jsoncons_io.hpp" + +namespace jsoncons { + +// null_type + +struct null_type +{ +}; + +// json_exception + +class json_exception +{ +public: + virtual const char* what() const JSONCONS_NOEXCEPT = 0; +}; + +template +class json_exception_0 : public Base, public virtual json_exception +{ +public: + json_exception_0(std::string s) JSONCONS_NOEXCEPT + : Base(""), message_(s) + { + } + ~json_exception_0() JSONCONS_NOEXCEPT + { + } + const char* what() const JSONCONS_NOEXCEPT + { + return message_.c_str(); + } +private: + std::string message_; +}; + +template +class json_exception_1 : public Base, public virtual json_exception +{ +public: + json_exception_1(const std::string& format, const std::string& arg1) JSONCONS_NOEXCEPT + : Base(""), format_(format), arg1_(arg1) + { + } + json_exception_1(const std::string& format, const std::wstring& arg1) JSONCONS_NOEXCEPT + : Base(""), format_(format) + { + char buf[255]; + size_t retval; +#if defined(JSONCONS_HAS_WCSTOMBS_S) + wcstombs_s(&retval, buf, sizeof(buf), arg1.c_str(), arg1.size()); +#else + retval = wcstombs(buf, arg1.c_str(), sizeof(buf)); +#endif + if (retval != static_cast(-1)) + { + arg1_ = buf; + } + } + ~json_exception_1() JSONCONS_NOEXCEPT + { + } + const char* what() const JSONCONS_NOEXCEPT + { + c99_snprintf(const_cast(message_),255, format_.c_str(),arg1_.c_str()); + return message_; + } +private: + std::string format_; + std::string arg1_; + char message_[255]; +}; + +#define JSONCONS_STR2(x) #x +#define JSONCONS_STR(x) JSONCONS_STR2(x) + +#define JSONCONS_THROW_EXCEPTION(Base,x) throw jsoncons::json_exception_0((x)) +#define JSONCONS_THROW_EXCEPTION_1(Base,fmt,arg1) throw jsoncons::json_exception_1((fmt),(arg1)) +#define JSONCONS_ASSERT(x) if (!(x)) { \ + throw jsoncons::json_exception_0("assertion '" #x "' failed at " __FILE__ ":" \ + JSONCONS_STR(__LINE__)); } + +// json_char_traits + +const uint16_t min_lead_surrogate = 0xD800; +const uint16_t max_lead_surrogate = 0xDBFF; +const uint16_t min_trail_surrogate = 0xDC00; +const uint16_t max_trail_surrogate = 0xDFFF; + +template +struct json_literals +{ +}; + +template <> +struct json_literals +{ + static std::pair null_literal() + { + static const char* value = "null"; + return std::pair(value,4); + } + + static std::pair true_literal() + { + static const char* value = "true"; + return std::pair(value,4); + } + + static std::pair false_literal() + { + static const char* value = "false"; + return std::pair(value,5); + } +}; + +template <> +struct json_literals +{ + static std::pair null_literal() + { + static const wchar_t* value = L"null"; + return std::pair(value,4); + } + + static std::pair true_literal() + { + static const wchar_t* value = L"true"; + return std::pair(value,4); + } + + static std::pair false_literal() + { + static const wchar_t* value = L"false"; + return std::pair(value,5); + } +}; + +template +struct json_char_traits +{ +}; + +template <> +struct json_char_traits +{ + static uint32_t convert_char_to_codepoint(const char*& it, + const char*) + { + char c = *it; + uint32_t u(c >= 0 ? c : 256 + c ); + uint32_t cp = u; + if (u < 0x80) + { + } + else if ((u >> 5) == 0x6) + { + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp = ((cp << 6) & 0x7ff) + (u & 0x3f); + } + else if ((u >> 4) == 0xe) + { + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp = ((cp << 12) & 0xffff) + ((static_cast(0xff & u) << 6) & 0xfff); + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp += (u) & 0x3f; + } + else if ((u >> 3) == 0x1e) + { + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp = ((cp << 18) & 0x1fffff) + ((static_cast(0xff & u) << 12) & 0x3ffff); + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp += (static_cast(0xff & u) << 6) & 0xfff; + c = *(++it); + u = (c >= 0 ? c : 256 + c ); + cp += (u) & 0x3f; + } + else + { + } + return cp; + } + + static void append_codepoint_to_string(uint32_t cp, std::string& s) + { + if (cp <= 0x7f) + { + s.push_back(static_cast(cp)); + } + else if (cp <= 0x7FF) + { + s.push_back(static_cast(0xC0 | (0x1f & (cp >> 6)))); + s.push_back(static_cast(0x80 | (0x3f & cp))); + } + else if (cp <= 0xFFFF) + { + s.push_back(0xE0 | static_cast((0xf & (cp >> 12)))); + s.push_back(0x80 | static_cast((0x3f & (cp >> 6)))); + s.push_back(static_cast(0x80 | (0x3f & cp))); + } + else if (cp <= 0x10FFFF) + { + s.push_back(static_cast(0xF0 | (0x7 & (cp >> 18)))); + s.push_back(static_cast(0x80 | (0x3f & (cp >> 12)))); + s.push_back(static_cast(0x80 | (0x3f & (cp >> 6)))); + s.push_back(static_cast(0x80 | (0x3f & cp))); + } + } + +}; + +template <> +struct json_char_traits // assume utf16 +{ + static void append_codepoint_to_string(uint32_t cp, std::wstring& s) + { + if (cp <= 0xFFFF) + { + s.push_back(static_cast(cp)); + } + else if (cp <= 0x10FFFF) + { + s.push_back(static_cast((cp >> 10) + min_lead_surrogate - (0x10000 >> 10))); + s.push_back(static_cast((cp & 0x3ff) + min_trail_surrogate)); + } + } + + static uint32_t convert_char_to_codepoint(const wchar_t*& it, const wchar_t*) + { + uint32_t cp = (0xffff & *it); + if ((cp >= min_lead_surrogate && cp <= max_lead_surrogate)) // surrogate pair + { + uint32_t trail_surrogate = 0xffff & *(++it); + cp = (cp << 10) + trail_surrogate + 0x10000u - (min_lead_surrogate << 10) - min_trail_surrogate; + } + return cp; + } +}; + +template <> +struct json_char_traits // assume utf32 +{ + static void append_codepoint_to_string(uint32_t cp, std::wstring& s) + { + if (cp <= 0xFFFF) + { + s.push_back(static_cast(cp)); + } + else if (cp <= 0x10FFFF) + { + s.push_back(static_cast(cp)); + } + } + + static uint32_t convert_char_to_codepoint(const wchar_t*& it, const wchar_t*) + { + uint32_t cp = static_cast(*it); + return cp; + } +}; + +inline +bool is_control_character(uint32_t c) +{ + return c <= 0x1F || c == 0x7f; +} + +inline +char to_hex_character(unsigned char c) +{ + JSONCONS_ASSERT(c <= 0xF); + + return (c < 10) ? ('0' + c) : ('A' - 10 + c); +} + +inline +bool is_non_ascii_character(uint32_t c) +{ + return c >= 0x80; +} + +template +struct type_wrapper +{ + typedef T* pointer_type; + typedef const T* const_pointer_type; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; +}; + +template +struct type_wrapper +{ + typedef T* pointer_type; + typedef const T* const_pointer_type; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; +}; + +template +struct type_wrapper +{ + typedef T* pointer_type; + typedef const T* const_pointer_type; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; +}; + +template +struct type_wrapper +{ + typedef T* pointer_type; + typedef const T* const_pointer_type; + typedef T value_type; + typedef T& reference; + typedef const T& const_reference; +}; + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/jsoncons_config.hpp b/vendor/jsoncons-0.99.2/jsoncons/jsoncons_config.hpp new file mode 100644 index 00000000..7d261ec0 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/jsoncons_config.hpp @@ -0,0 +1,123 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONCONS_CONFIG_HPP +#define JSONCONS_JSONCONS_CONFIG_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // std::numeric_limits + +// Uncomment the following line to suppress deprecated names (recommended for new code) +// #define JSONCONS_NO_DEPRECATED + +#define JSONCONS_NO_MACRO_EXP + +namespace jsoncons +{ + +// Follow boost + +#if defined (__clang__) +#if defined(_GLIBCXX_USE_NOEXCEPT) +#define JSONCONS_NOEXCEPT _GLIBCXX_USE_NOEXCEPT +#else +#define JSONCONS_NOEXCEPT noexcept +#endif +#elif defined(__GNUC__) +#define JSONCONS_NOEXCEPT _GLIBCXX_USE_NOEXCEPT +#elif defined(_MSC_VER) +#if _MSC_VER >= 1900 +#define JSONCONS_NOEXCEPT noexcept +#else +#define JSONCONS_NOEXCEPT +#endif +#else +#define JSONCONS_NOEXCEPT +#endif + +#if defined(_MSC_VER) +#define JSONCONS_HAS_FOPEN_S +#define JSONCONS_HAS_WCSTOMBS_S +#if _MSC_VER < 1800 // VS2013 +#define JSONCONS_NO_RAW_STRING_LITERALS +#define JSONCONS_NO_FOR_RANGE +#endif +#if _MSC_VER >= 1900 +#define JSONCONS_ALIGNOF alignof +#else +#define JSONCONS_ALIGNOF __alignof +#endif +#else +#define JSONCONS_ALIGNOF alignof +#endif + +#ifdef _MSC_VER +#pragma warning( disable : 4290 ) +inline bool is_nan(double x) { return _isnan(x) != 0; } +inline bool is_inf(double x) +{ + return !_finite(x) && !_isnan(x); +} +inline bool is_pos_inf(double x) +{ + return is_inf(x) && x > 0; +} +inline bool is_neg_inf(double x) +{ + return is_inf(x) && x < 0; +} + +inline +int c99_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + int count = -1; + + if (size != 0) count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); + if (count == -1) count = _vscprintf(format, ap); + + return count; +} + +inline +int c99_snprintf(char *str, size_t size, const char *format, ...) +{ + int count; + va_list ap; + + va_start(ap, format); + count = c99_vsnprintf(str, size, format, ap); + va_end(ap); + + return count; +} +#else +inline bool is_nan(double x) +{ return std::isnan( x ); } +inline bool is_pos_inf(double x) +{return std::isinf(x) && x > 0;} +inline bool is_neg_inf(double x) +{return std::isinf(x) && x > 0;} + +#if __cplusplus >= 201103L +#define c99_snprintf snprintf +#else +#define c99_snprintf std::snprintf +#endif + +#endif + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/jsoncons_io.hpp b/vendor/jsoncons-0.99.2/jsoncons/jsoncons_io.hpp new file mode 100644 index 00000000..27c90fa1 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/jsoncons_io.hpp @@ -0,0 +1,358 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONCONS_IO_HPP +#define JSONCONS_JSONCONS_IO_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // std::numeric_limits +#include "jsoncons_config.hpp" +#include "ovectorstream.hpp" + +namespace jsoncons +{ + +template +class buffered_ostream +{ + static const size_t default_buffer_length = 16384; + + std::basic_ostream* os_; + std::vector buffer_; + CharT * const begin_buffer_; + const CharT* const end_buffer_; + CharT* p_; +public: + buffered_ostream(std::basic_ostream& os) + : os_(std::addressof(os)), buffer_(default_buffer_length), begin_buffer_(buffer_.data()), end_buffer_(buffer_.data()+default_buffer_length), p_(buffer_.data()) + { + } + ~buffered_ostream() + { + os_->write(begin_buffer_, (p_ - begin_buffer_)); + os_->flush(); + } + + void flush() + { + os_->write(begin_buffer_, (p_ - begin_buffer_)); + p_ = begin_buffer_; + os_->flush(); + } + + void write(const CharT* s, size_t length) + { + size_t diff = end_buffer_ - p_; + if (diff >= length) + { + std::memcpy(p_, s, length*sizeof(CharT)); + p_ += length; + } + else + { + os_->write(begin_buffer_, (p_ - begin_buffer_)); + os_->write(s, length); + p_ = begin_buffer_; + } + } + + void write(const std::basic_string& s) + { + write(s.data(),s.length()); + } + + void put(CharT c) + { + if (p_ < end_buffer_) + { + *p_++ = c; + } + else + { + os_->write(begin_buffer_, (p_-begin_buffer_)); + p_ = begin_buffer_; + *p_++ = c; + } + } + +}; + +#ifdef _MSC_VER + +template +class float_printer +{ + uint8_t precision_; +public: + float_printer(int precision) + : precision_(precision) + { + } + + void print(double val, uint8_t precision, buffered_ostream& os) + { + char buf[_CVTBUFSIZE]; + int decimal_point = 0; + int sign = 0; + + int prec = (precision == 0) ? precision_ : precision; + + int err = _ecvt_s(buf, _CVTBUFSIZE, val, prec, &decimal_point, &sign); + if (err != 0) + { + throw std::runtime_error("Failed attempting double to string conversion"); + } + char* s = buf; + char* se = s + prec; + + int i, k; + int j; + + if (sign) + { + os.put('-'); + } + if (decimal_point <= -4 || decimal_point > se - s + 5) + { + os.put(*s++); + if (s < se) + { + os.put('.'); + while ((se-1) > s && *(se-1) == '0') + { + --se; + } + + while(s < se) + { + os.put(*s++); + } + } + os.put('e'); + /* sprintf(b, "%+.2d", decimal_point - 1); */ + if (--decimal_point < 0) { + os.put('-'); + decimal_point = -decimal_point; + } + else + os.put('+'); + for(j = 2, k = 10; 10*k <= decimal_point; j++, k *= 10); + for(;;) + { + i = decimal_point / k; + os.put(i + '0'); + if (--j <= 0) + break; + decimal_point -= i*k; + decimal_point *= 10; + } + } + else if (decimal_point <= 0) + { + os.put('0'); + os.put('.'); + while ((se-1) > s && *(se-1) == '0') + { + --se; + } + for(; decimal_point < 0; decimal_point++) + { + os.put('0'); + } + while(s < se) + { + os.put(*s++); + } + } + else { + while(s < se) + { + os.put(*s++); + if ((--decimal_point == 0) && s < se) + { + os.put('.'); + while ((se-1) > s && *(se-1) == '0') + { + --se; + } + } + } + for(; decimal_point > 0; decimal_point--) + { + os.put('0'); + } + } + } +}; + +#else + +template +class float_printer +{ + jsoncons::basic_ovectorstream vs_; + uint8_t precision_; +public: + float_printer(uint8_t precision) + : vs_(255), precision_(precision) + { + vs_.set_locale(std::locale::classic()); + vs_.precision(precision); + } + + void print(double val, uint8_t precision, buffered_ostream& os) + { + vs_.reset(); + vs_.precision(precision == 0 ? precision_ : precision); + vs_ << val; + + const CharT* s = vs_.data(); + const CharT* se = s + vs_.length(); + + bool dot = false; + while (s < se) + { + if (*s == '.') + { + dot = true; + } + else if (*s == 'e') + { + if (!dot) + { + os.put('.'); + os.put('0'); + dot = true; + } + } + os.put(*s); + ++s; + } + if (!dot) + { + os.put('.'); + os.put('0'); + } + } +}; + +#endif + +// string_to_float only requires narrow char +#ifdef _MSC_VER +class float_reader +{ +private: + _locale_t locale_; +public: + float_reader() + { + locale_ = _create_locale(LC_NUMERIC, "C"); + } + ~float_reader() + { + _free_locale(locale_); + } + + double read(const char* s, size_t length) + { + const char *begin = s; + char *end = nullptr; + double val = _strtod_l(begin, &end, locale_); + if (begin == end) + { + throw std::invalid_argument("Invalid float value"); + } + return val; + } + + float_reader(const float_reader& fr) = delete; + float_reader& operator=(const float_reader& fr) = delete; +}; + +#else +class float_reader +{ +private: + std::vector buffer_; + std::string decimal_point_; + bool is_dot_; +public: + float_reader() + : buffer_() + { + struct lconv * lc = localeconv(); + if (lc != nullptr) + { + decimal_point_ = std::string(lc->decimal_point); + } + else + { + decimal_point_ = std::string("."); + } + buffer_.reserve(100); + is_dot_ = decimal_point_ == "."; + } + + double read(const char* s, size_t length) + { + double val; + if (is_dot_) + { + const char *begin = s; + char *end = nullptr; + val = strtod(begin, &end); + if (begin == end) + { + throw std::invalid_argument("Invalid float value"); + } + } + else + { + buffer_.clear(); + size_t j = 0; + const char* pe = s + length; + for (const char* p = s; p < pe; ++p) + { + if (*p == '.') + { + buffer_.insert(buffer_.begin() + j, decimal_point_.begin(), decimal_point_.end()); + j += decimal_point_.length(); + } + else + { + buffer_.push_back(*p); + ++j; + } + } + const char *begin = buffer_.data(); + char *end = nullptr; + val = strtod(begin, &end); + if (begin == end) + { + throw std::invalid_argument("Invalid float value"); + } + } + return val; + } + + float_reader(const float_reader& fr) = delete; + float_reader& operator=(const float_reader& fr) = delete; +}; +#endif + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/output_format.hpp b/vendor/jsoncons-0.99.2/jsoncons/output_format.hpp new file mode 100644 index 00000000..54e74874 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/output_format.hpp @@ -0,0 +1,330 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_OUTPUT_FORMAT_HPP +#define JSONCONS_OUTPUT_FORMAT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace jsoncons { + +enum class block_options {next_line,same_line}; + +template +class buffered_ostream; + +template +class basic_output_format +{ + int indent_; + uint8_t precision_; + bool replace_nan_; + bool replace_pos_inf_; + bool replace_neg_inf_; + std::basic_string nan_replacement_; + std::basic_string pos_inf_replacement_; + std::basic_string neg_inf_replacement_; + bool escape_all_non_ascii_; + bool escape_solidus_; + block_options object_array_block_option_; + block_options array_array_block_option_; + block_options object_object_block_option_; + block_options array_object_block_option_; +public: + static const size_t default_indent = 4; + +// Constructors + + basic_output_format() + : + indent_(default_indent), + precision_(16), + replace_nan_(true), + replace_pos_inf_(true), + replace_neg_inf_(true), + nan_replacement_(json_literals::null_literal().first), + pos_inf_replacement_(json_literals::null_literal().first), + neg_inf_replacement_(json_literals::null_literal().first), + escape_all_non_ascii_(false), + escape_solidus_(false), + object_array_block_option_(block_options::same_line), + array_array_block_option_(block_options::next_line), + object_object_block_option_(block_options::same_line), + array_object_block_option_(block_options::next_line) + { + } + +// Accessors + + block_options object_array_block_option() + { + return object_array_block_option_; + } + + basic_output_format& object_array_block_option(block_options value) + { + object_array_block_option_ = value; + return *this; + } + + block_options object_object_block_option() + { + return object_object_block_option_; + } + + basic_output_format& object_object_block_option(block_options value) + { + object_object_block_option_ = value; + return *this; + } + + block_options array_array_block_option() + { + return array_array_block_option_; + } + + basic_output_format& array_array_block_option(block_options value) + { + array_array_block_option_ = value; + return *this; + } + + block_options array_object_block_option() + { + return array_object_block_option_; + } + + basic_output_format& array_object_block_option(block_options value) + { + array_object_block_option_ = value; + return *this; + } + + int indent() const + { + return indent_; + } + + uint8_t precision() const + { + return precision_; + } + + bool escape_all_non_ascii() const + { + return escape_all_non_ascii_; + } + + bool escape_solidus() const + { + return escape_solidus_; + } + + bool replace_nan() const {return replace_nan_;} + + bool replace_pos_inf() const {return replace_pos_inf_;} + + bool replace_neg_inf() const {return replace_neg_inf_;} + + std::basic_string nan_replacement() const + { + return nan_replacement_; + } + + std::basic_string pos_inf_replacement() const + { + return pos_inf_replacement_; + } + + std::basic_string neg_inf_replacement() const + { + return neg_inf_replacement_; + } + +// Modifiers + + basic_output_format& precision(uint8_t prec) + { + precision_ = prec; + return *this; + } + + basic_output_format& escape_all_non_ascii(bool value) + { + escape_all_non_ascii_ = value; + return *this; + } + + basic_output_format& escape_solidus(bool value) + { + escape_solidus_ = value; + return *this; + } + + basic_output_format& replace_nan(bool replace) + { + replace_nan_ = replace; + return *this; + } + + basic_output_format& replace_inf(bool replace) + { + replace_pos_inf_ = replace; + replace_neg_inf_ = replace; + return *this; + } + + basic_output_format& replace_pos_inf(bool replace) + { + replace_pos_inf_ = replace; + return *this; + } + + basic_output_format& replace_neg_inf(bool replace) + { + replace_neg_inf_ = replace; + return *this; + } + + basic_output_format& nan_replacement(const std::basic_string& replacement) + { + nan_replacement_ = replacement; + return *this; + } + + basic_output_format& pos_inf_replacement(const std::basic_string& replacement) + { + pos_inf_replacement_ = replacement; + return *this; + } + + basic_output_format& neg_inf_replacement(const std::basic_string& replacement) + { + neg_inf_replacement_ = replacement; + return *this; + } + + basic_output_format& indent(int value) + { + indent_ = value; + return *this; + } +}; + +template +void escape_string(const CharT* s, + size_t length, + const basic_output_format& format, + buffered_ostream& os) +{ + const CharT* begin = s; + const CharT* end = s + length; + for (const CharT* it = begin; it != end; ++it) + { + CharT c = *it; + switch (c) + { + case '\\': + os.put('\\'); + os.put('\\'); + break; + case '"': + os.put('\\'); + os.put('\"'); + break; + case '\b': + os.put('\\'); + os.put('b'); + break; + case '\f': + os.put('\\'); + os.put('f'); + break; + case '\n': + os.put('\\'); + os.put('n'); + break; + case '\r': + os.put('\\'); + os.put('r'); + break; + case '\t': + os.put('\\'); + os.put('t'); + break; + default: + uint32_t u(c >= 0 ? c : 256 + c); + if (format.escape_solidus() && c == '/') + { + os.put('\\'); + os.put('/'); + } + else if (is_control_character(u) || format.escape_all_non_ascii()) + { + // convert utf8 to codepoint + uint32_t cp = json_char_traits::convert_char_to_codepoint(it, end); + if (is_non_ascii_character(cp) || is_control_character(u)) + { + if (cp > 0xFFFF) + { + cp -= 0x10000; + uint32_t first = (cp >> 10) + 0xD800; + uint32_t second = ((cp & 0x03FF) + 0xDC00); + + os.put('\\'); + os.put('u'); + os.put(to_hex_character(first >> 12 & 0x000F)); + os.put(to_hex_character(first >> 8 & 0x000F)); + os.put(to_hex_character(first >> 4 & 0x000F)); + os.put(to_hex_character(first & 0x000F)); + os.put('\\'); + os.put('u'); + os.put(to_hex_character(second >> 12 & 0x000F)); + os.put(to_hex_character(second >> 8 & 0x000F)); + os.put(to_hex_character(second >> 4 & 0x000F)); + os.put(to_hex_character(second & 0x000F)); + } + else + { + os.put('\\'); + os.put('u'); + os.put(to_hex_character(cp >> 12 & 0x000F)); + os.put(to_hex_character(cp >> 8 & 0x000F)); + os.put(to_hex_character(cp >> 4 & 0x000F)); + os.put(to_hex_character(cp & 0x000F)); + } + } + else + { + os.put(c); + } + } + else if (format.escape_solidus() && c == '/') + { + os.put('\\'); + os.put('/'); + } + else + { + os.put(c); + } + break; + } + } +} + +typedef basic_output_format output_format; +typedef basic_output_format woutput_format; + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/ovectorstream.hpp b/vendor/jsoncons-0.99.2/jsoncons/ovectorstream.hpp new file mode 100644 index 00000000..e19f5085 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/ovectorstream.hpp @@ -0,0 +1,227 @@ +// Copyright 2016 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_OVECTORSTREAM_HPP +#define JSONCONS_OVECTORSTREAM_HPP + +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons_config.hpp" + +namespace jsoncons { + +template< + class CharT, + class Traits = std::char_traits +> class basic_ovectorstream; + +template +class basic_ovectorbuf + : public std::basic_streambuf +{ +private: + std::ios_base::openmode mode_; + std::vector buf_; + +public: + typedef CharT char_type; + typedef typename CharTraits::int_type int_type; + typedef typename CharTraits::pos_type pos_type; + typedef typename CharTraits::off_type off_type; + typedef CharTraits traits_type; + typedef std::basic_streambuf base_streambuf; + +public: + + explicit basic_ovectorbuf(std::size_t length) JSONCONS_NOEXCEPT + : base_streambuf(), + mode_(std::ios_base::out | std::ios_base::binary), + buf_(length) + { + // Set write position to beginning of buffer. + this->setp(buf_.data(), buf_.data() + buf_.size()); + } + + virtual ~basic_ovectorbuf() {} + + const CharT* data() const + { + return buf_.data(); + } + +protected: + int_type underflow() override + { + return this->gptr() != this->egptr() ? + CharTraits::to_int_type(*this->gptr()) : CharTraits::eof(); + } + + int_type pbackfail(int_type c = CharTraits::eof()) override + { + if (this->gptr() != this->eback()) + { + if (!CharTraits::eq_int_type(c, CharTraits::eof())) + { + if (CharTraits::eq(CharTraits::to_char_type(c), this->gptr()[-1])) + { + this->gbump(-1); + return c; + } + this->gbump(-1); + *this->gptr() = c; + return c; + } + else + { + this->gbump(-1); + return CharTraits::not_eof(c); + } + } + else + { + return CharTraits::eof(); + } + } + + int_type overflow(int_type c = CharTraits::eof()) override + { + if (!CharTraits::eq_int_type(c, CharTraits::eof())) + { + size_t pos = buf_.size(); + buf_.resize(pos*2); + this->setp(buf_.data(), buf_.data() + buf_.size()); + this->pubseekpos(pos, std::ios_base::out); + *this->pptr() = CharTraits::to_char_type(c); + this->pbump(1); + this->pubsync(); + return c; + } + else + { + return CharTraits::not_eof(c); + } + } + + pos_type seekoff(off_type off, std::ios_base::seekdir dir, + std::ios_base::openmode mode = std::ios_base::out) override + { + (void)mode; // Always out + + std::streamoff newoff; + switch (dir) + { + case std::ios_base::beg: + newoff = 0; + break; + case std::ios_base::end: + newoff = static_cast(buf_.size()); + break; + case std::ios_base::cur: + newoff = static_cast(this->pptr() - this->pbase()); + break; + default: + return pos_type(off_type(-1)); + } + + off += newoff; + + std::ptrdiff_t n = this->epptr() - this->pbase(); + + if (off < 0 || off > n) return pos_type(off_type(-1)); + else + { + this->setp(this->pbase(), this->pbase() + n); + this->pbump(static_cast(off)); + } + + return pos_type(off); + } + + pos_type seekoff_beg(off_type off) + { + std::ptrdiff_t n = this->epptr() - this->pbase(); + + if (off < 0 || off > n) + { + return pos_type(off_type(-1)); + } + else + { + this->setp(this->pbase(), this->pbase() + n); + this->pbump(static_cast(off)); + } + + return pos_type(off); + } + + pos_type seekpos(pos_type pos, std::ios_base::openmode mode + = std::ios_base::out) override + { + (void)mode; // Always out + + return seekoff_beg(pos - pos_type(off_type(0))); + } +}; + +template +class basic_ovectorstream : + private basic_ovectorbuf, + public std::basic_ostream +{ +public: + typedef typename std::basic_ios + ::char_type char_type; + typedef typename std::basic_ios::int_type int_type; + typedef typename std::basic_ios::pos_type pos_type; + typedef typename std::basic_ios::off_type off_type; + typedef typename std::basic_ios::traits_type traits_type; + +private: + typedef basic_ovectorbuf base_ouputbuf; + typedef std::basic_ios base_ios; + typedef std::basic_ostream base_streambuf; + base_ouputbuf& get_buf() {return *this;} + const base_ouputbuf& get_buf() const {return *this;} + +public: + basic_ovectorstream(std::size_t length) JSONCONS_NOEXCEPT + : base_ouputbuf(length), + base_streambuf(&get_buf()) + {} + + ~basic_ovectorstream() {} + +public: + + size_t length() + { + return this->pptr() - this->pbase(); + } + + void set_locale(const std::locale& loc) + { + std::locale result = std::basic_ostream::imbue(loc); + this->pubimbue(loc); + } + + void reset() + { + this->clear(); + this->seekp(0, std::ios::beg); + } + + const CharT* data() const + { + return get_buf().data(); + } +}; + +} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons/parse_error_handler.hpp b/vendor/jsoncons-0.99.2/jsoncons/parse_error_handler.hpp new file mode 100644 index 00000000..9081fc95 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons/parse_error_handler.hpp @@ -0,0 +1,172 @@ +/// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_PARSE_ERROR_HANDLER_HPP +#define JSONCONS_PARSE_ERROR_HANDLER_HPP + +#include "jsoncons/jsoncons.hpp" +#include + +namespace jsoncons { + +class parse_exception : public std::exception, public virtual json_exception +{ +public: + parse_exception(std::error_code ec, + size_t line, + size_t column) + : error_code_(ec), + line_number_(line), + column_number_(column) + { + } + parse_exception(const parse_exception& other) + : error_code_(other.error_code_), + line_number_(other.line_number_), + column_number_(other.column_number_) + { + } + const char* what() const JSONCONS_NOEXCEPT + { + std::ostringstream os; + os << error_code_.message() << " at line " << line_number_ << " and column " << column_number_; + const_cast(buffer_) = os.str(); + return buffer_.c_str(); + } + + const std::error_code code() const + { + return error_code_; + } + + size_t line_number() const + { + return line_number_; + } + + size_t column_number() const + { + return column_number_; + } +private: + std::error_code error_code_; + std::string buffer_; + size_t line_number_; + size_t column_number_; +}; + +typedef parse_exception json_parse_exception; + +template +class basic_parsing_context +{ +public: + virtual ~basic_parsing_context() {} + + size_t line_number() const + { + return do_line_number(); + } + size_t column_number() const + { + return do_column_number(); + } + CharT current_char() const + { + return do_current_char(); + } + +#if !defined(JSONCONS_NO_DEPRECATED) + CharT last_char() const + { + return do_current_char(); + } +#endif + +private: + virtual size_t do_line_number() const = 0; + virtual size_t do_column_number() const = 0; + virtual CharT do_current_char() const = 0; +}; + +typedef basic_parsing_context parsing_context; +typedef basic_parsing_context wparsing_context; + +template +class basic_parse_error_handler +{ +public: + virtual ~basic_parse_error_handler() + { + } + + void warning(std::error_code ec, + const basic_parsing_context& context) throw (parse_exception) + { + do_warning(ec,context); + } + + void error(std::error_code ec, + const basic_parsing_context& context) throw (parse_exception) + { + do_error(ec,context); + } + + void fatal_error(std::error_code ec, + const basic_parsing_context& context) throw (parse_exception) + { + do_fatal_error(ec,context); + throw parse_exception(ec,context.line_number(),context.column_number()); + } + +private: + virtual void do_warning(std::error_code, + const basic_parsing_context& context) throw (parse_exception) = 0; + + virtual void do_error(std::error_code, + const basic_parsing_context& context) throw (parse_exception) = 0; + + virtual void do_fatal_error(std::error_code, + const basic_parsing_context& context) throw (parse_exception) + { + (void)context; + } +}; + +template +class basic_default_parse_error_handler : public basic_parse_error_handler +{ +public: + static basic_parse_error_handler& instance() + { + static basic_default_parse_error_handler instance; + return instance; + } +private: + virtual void do_warning(std::error_code, + const basic_parsing_context& context) throw (parse_exception) + { + (void)context; + } + + virtual void do_error(std::error_code ec, + const basic_parsing_context& context) throw (parse_exception) + { + throw parse_exception(ec,context.line_number(),context.column_number()); + } +}; + +typedef basic_parse_error_handler parse_error_handler; +typedef basic_parse_error_handler wparse_error_handler; + +typedef basic_default_parse_error_handler default_parse_error_handler; +typedef basic_default_parse_error_handler wdefault_parse_error_handler; + +typedef basic_parsing_context parsing_context; +typedef basic_parsing_context wparsing_context; + +} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/boost/type_extensions.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/boost/type_extensions.hpp new file mode 100644 index 00000000..59936cd7 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/boost/type_extensions.hpp @@ -0,0 +1,59 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_EXT_TYPE_EXTENSIONS_HPP +#define JSONCONS_EXT_TYPE_EXTENSIONS_HPP + +#include "jsoncons/json.hpp" +#include "boost/date_time/gregorian/gregorian.hpp" + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" +#endif + +namespace jsoncons +{ + template + class json_type_traits + { + public: + static bool is(const JsonT& val) JSONCONS_NOEXCEPT + { + if (!val.is_string()) + { + return false; + } + std::string s = val.template as(); + try + { + boost::gregorian::date_from_iso_string(s); + return true; + } + catch (...) + { + return false; + } + } + + static boost::gregorian::date as(const JsonT& val) + { + std::string s = val.template as(); + return boost::gregorian::from_simple_string(s); + } + + static void assign(JsonT& lhs, boost::gregorian::date val) + { + lhs = to_iso_extended_string(val); + } + }; +} + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_error_category.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_error_category.hpp new file mode 100644 index 00000000..5056d380 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_error_category.hpp @@ -0,0 +1,55 @@ +/// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_CSV_CSV_TEXT_ERROR_CATEGORY_HPP +#define JSONCONS_CSV_CSV_TEXT_ERROR_CATEGORY_HPP + +#include "jsoncons/jsoncons.hpp" +#include + +namespace jsoncons { namespace csv { + +namespace csv_parser_errc +{ + const int unexpected_eof = 1; + const int expected_quote = 2; + const int invalid_csv_text = 3; + const int invalid_state = 4; +} + +class csv_error_category_impl + : public std::error_category +{ +public: + virtual const char* name() const JSONCONS_NOEXCEPT + { + return "csv"; + } + virtual std::string message(int ev) const + { + switch (ev) + { + case csv_parser_errc::unexpected_eof: + return "Unexpected end of file"; + case csv_parser_errc::expected_quote: + return "Expected quote character"; + case csv_parser_errc::invalid_csv_text: + return "Invalid CSV text"; + default: + return "Unknown JSON parser error"; + } + } +}; + +inline +const std::error_category& csv_error_category() +{ + static csv_error_category_impl instance; + return instance; +} + +}} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parameters.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parameters.hpp new file mode 100644 index 00000000..099a154f --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parameters.hpp @@ -0,0 +1,341 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_CSV_CSV_PARAMETERS_HPP +#define JSONCONS_CSV_CSV_PARAMETERS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace jsoncons { namespace csv { + +enum class quote_styles +{ + all,minimal,none,nonnumeric +}; + +template +class basic_csv_parameters +{ +public: + static const size_t default_indent = 4; + +// Constructors + + basic_csv_parameters() + : + assume_header_(false), + ignore_empty_values_(false), + trim_leading_(false), + trim_trailing_(false), + trim_leading_inside_quotes_(false), + trim_trailing_inside_quotes_(false), + unquoted_empty_value_is_null_(false), + field_delimiter_(','), + quote_char_('\"'), + quote_escape_char_('\"'), + comment_starter_('\0'), + quote_style_(quote_styles::minimal), + max_lines_(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()), + header_lines_(0) + { + line_delimiter_.push_back('\n'); + } + +// Properties + + size_t header_lines() const + { + return (assume_header_ && header_lines_ <= 1) ? 1 : header_lines_; + } + + basic_csv_parameters& header_lines(size_t value) + { + header_lines_ = value; + return *this; + } + + bool assume_header() const + { + return assume_header_; + } + + basic_csv_parameters& assume_header(bool value) + { + assume_header_ = value; + return *this; + } + + bool ignore_empty_values() const + { + return ignore_empty_values_; + } + + basic_csv_parameters& ignore_empty_values(bool value) + { + ignore_empty_values_ = value; + return *this; + } + + bool trim_leading() const + { + return trim_leading_; + } + + basic_csv_parameters& trim_leading(bool value) + { + trim_leading_ = value; + return *this; + } + + bool trim_trailing() const + { + return trim_trailing_; + } + + basic_csv_parameters& trim_trailing(bool value) + { + trim_trailing_ = value; + return *this; + } + + bool trim_leading_inside_quotes() const + { + return trim_leading_inside_quotes_; + } + + basic_csv_parameters& trim_leading_inside_quotes(bool value) + { + trim_leading_inside_quotes_ = value; + return *this; + } + + bool trim_trailing_inside_quotes() const + { + return trim_trailing_inside_quotes_; + } + + basic_csv_parameters& trim_trailing_inside_quotes(bool value) + { + trim_trailing_inside_quotes_ = value; + return *this; + } + + bool trim() const + { + return trim_leading_ && trim_trailing_; + } + + basic_csv_parameters& trim(bool value) + { + trim_leading_ = value; + trim_trailing_ = value; + return *this; + } + + bool trim_inside_quotes() const + { + return trim_leading_inside_quotes_ && trim_trailing_inside_quotes_; + } + + basic_csv_parameters& trim_inside_quotes(bool value) + { + trim_leading_inside_quotes_ = value; + trim_trailing_inside_quotes_ = value; + return *this; + } + + bool unquoted_empty_value_is_null() const + { + return unquoted_empty_value_is_null_; + } + + basic_csv_parameters& unquoted_empty_value_is_null(bool value) + { + unquoted_empty_value_is_null_ = value; + return *this; + } + + std::vector> column_names() const + { + return column_names_; + } + + basic_csv_parameters& column_names(const std::vector>& value) + { + column_names_ = value; + return *this; + } + + std::vector> column_types() const + { + return column_types_; + } + + basic_csv_parameters& column_types(const std::vector>& value) + { + column_types_ = value; + return *this; + } + + std::vector> column_defaults() const + { + return column_defaults_; + } + + basic_csv_parameters& column_defaults(const std::vector>& value) + { + column_defaults_ = value; + return *this; + } + + CharT field_delimiter() const + { + return field_delimiter_; + } + + basic_csv_parameters& field_delimiter(CharT value) + { + field_delimiter_ = value; + return *this; + } + + std::basic_string line_delimiter() const + { + return line_delimiter_; + } + + basic_csv_parameters& line_delimiter(std::basic_string value) + { + line_delimiter_ = value; + return *this; + } + + CharT quote_char() const + { + return quote_char_; + } + + basic_csv_parameters& quote_char(CharT value) + { + quote_char_ = value; + return *this; + } + + CharT quote_escape_char() const + { + return quote_escape_char_; + } + + basic_csv_parameters& quote_escape_char(CharT value) + { + quote_escape_char_ = value; + return *this; + } + + CharT comment_starter() const + { + return comment_starter_; + } + + basic_csv_parameters& comment_starter(CharT value) + { + comment_starter_ = value; + return *this; + } + + quote_styles quote_style() const + { + return quote_style_; + } + + basic_csv_parameters& assume_header(quote_styles value) + { + quote_style_ = value; + return *this; + } + + unsigned long max_lines() const + { + return max_lines_; + } + + basic_csv_parameters& max_lines(unsigned long value) + { + max_lines_ = value; + return *this; + } + +#if !defined(JSONCONS_NO_DEPRECATED) + + std::basic_string header() const + { + return header_; + } + + basic_csv_parameters& header(const std::basic_string& value) + { + header_ = value; + return *this; + } + + std::basic_string data_types() const + { + return data_types_; + } + + basic_csv_parameters& data_types(const std::basic_string& value) + { + data_types_ = value; + return *this; + } + + std::basic_string default_values() const + { + return default_values_; + } + + basic_csv_parameters& default_values(const std::basic_string& value) + { + default_values_ = value; + return *this; + } +#endif +private: + bool assume_header_; + bool ignore_empty_values_; + bool trim_leading_; + bool trim_trailing_; + bool trim_leading_inside_quotes_; + bool trim_trailing_inside_quotes_; + bool unquoted_empty_value_is_null_; + CharT field_delimiter_; + CharT quote_char_; + CharT quote_escape_char_; + CharT comment_starter_; + quote_styles quote_style_; + unsigned long max_lines_; + size_t header_lines_; + std::basic_string line_delimiter_; + std::basic_string header_; + std::basic_string data_types_; + std::basic_string default_values_; + std::vector> column_names_; + std::vector> column_types_; + std::vector> column_defaults_; +}; + +typedef basic_csv_parameters csv_parameters; +typedef basic_csv_parameters wcsv_parameters; + +}} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parser.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parser.hpp new file mode 100644 index 00000000..14323666 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_parser.hpp @@ -0,0 +1,903 @@ +// Copyright 2015 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_CSV_CSV_PARSER_HPP +#define JSONCONS_CSV_CSV_PARSER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" +#include "jsoncons/json_parser.hpp" +#include "jsoncons/json_filter.hpp" +#include "jsoncons_ext/csv/csv_error_category.hpp" +#include "jsoncons_ext/csv/csv_parameters.hpp" + +namespace jsoncons { namespace csv { + +template +struct json_csv_parser_traits +{ +}; + +template <> +struct json_csv_parser_traits +{ + static const std::string string_literal() {return "string";}; + + static const std::string integer_literal() {return "integer";}; + + static const std::string float_literal() {return "float";}; + + static const std::string boolean_literal() {return "boolean";}; +}; + +template <> +struct json_csv_parser_traits // assume utf16 +{ + static const std::wstring string_literal() {return L"string";}; + + static const std::wstring integer_literal() {return L"integer";}; + + static const std::wstring float_literal() {return L"float";}; + + static const std::wstring boolean_literal() {return L"boolean";}; +}; + +enum class csv_modes { + done, + header, + array, + object +}; + +enum class csv_states +{ + start, + comment, + expect_value, + between_fields, + quoted_string, + unquoted_string, + escaped_value, + minus, + zero, + integer, + fraction, + exp1, + exp2, + exp3, + done +}; + +enum class data_types +{ + string_t,integer_t,float_t,boolean_t +}; + +template +class basic_csv_parser : private basic_parsing_context +{ + static const int default_depth = 3; + + csv_states state_; + int top_; + std::vector stack_; + basic_json_input_handler *handler_; + basic_parse_error_handler *err_handler_; + bool is_negative_; + uint32_t cp_; + size_t index_; + unsigned long column_; + unsigned long line_; + int curr_char_; + int prev_char_; + std::basic_string string_buffer_; + csv_states saved_state_; + int depth_; + basic_csv_parameters parameters_; + std::vector> column_names_; + std::vector column_types_; + std::vector> column_defaults_; + size_t column_index_; + basic_begin_end_json_filter filter_; + basic_json_parser parser_; + +public: + basic_csv_parser(basic_json_input_handler& handler) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())), + is_negative_(false), + cp_(0), + index_(0), + filter_(handler), + parser_(filter_) + { + depth_ = default_depth; + state_ = csv_states::start; + top_ = -1; + line_ = 1; + column_ = 0; + column_index_ = 0; + } + + basic_csv_parser(basic_json_input_handler& handler, + basic_csv_parameters params) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(basic_default_parse_error_handler::instance())), + is_negative_(false), + cp_(0), + index_(0), + parameters_(params), + filter_(handler), + parser_(filter_) + { + depth_ = default_depth; + state_ = csv_states::start; + top_ = -1; + line_ = 1; + column_ = 0; + column_index_ = 0; + } + + basic_csv_parser(basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(err_handler)), + is_negative_(false), + cp_(0), + index_(0), + filter_(handler), + parser_(filter_) + { + depth_ = default_depth; + state_ = csv_states::start; + top_ = -1; + line_ = 1; + column_ = 0; + column_index_ = 0; + } + + basic_csv_parser(basic_json_input_handler& handler, + basic_parse_error_handler& err_handler, + basic_csv_parameters params) + : top_(-1), + stack_(default_depth), + handler_(std::addressof(handler)), + err_handler_(std::addressof(err_handler)), + is_negative_(false), + cp_(0), + index_(0), + parameters_(params), + filter_(handler), + parser_(filter_) + { + depth_ = default_depth; + state_ = csv_states::start; + top_ = -1; + line_ = 1; + column_ = 0; + column_index_ = 0; + } + + ~basic_csv_parser() + { + } + + const basic_parsing_context& parsing_context() const + { + return *this; + } + + bool done() const + { + return state_ == csv_states::done; + } + + const std::vector>& column_labels() const + { + return column_names_; + } + + void after_field() + { + ++column_index_; + } + + void before_record() + { + if (column_index_ == 0) + { + switch (stack_[top_]) + { + case csv_modes::array: + handler_->begin_array(*this); + break; + case csv_modes::object: + handler_->begin_object(*this); + break; + default: + break; + } + } + } + + void after_record() + { + switch (stack_[top_]) + { + case csv_modes::array: + handler_->end_array(*this); + break; + case csv_modes::object: + handler_->end_object(*this); + break; + case csv_modes::header: + if (line_ >= parameters_.header_lines()) + { + if (column_names_.size() > 0) + { + flip(csv_modes::header, csv_modes::object); + } + else + { + flip(csv_modes::header, csv_modes::array); + } + } + break; + default: + break; + } + column_index_ = 0; + } + + void begin_parse() + { + push(csv_modes::done); + handler_->begin_json(); + + if (parameters_.column_names().size() > 0) + { + column_names_ = parameters_.column_names(); + } +#if !defined(JSONCONS_NO_DEPRECATED) + else if (parameters_.header().length() > 0) + { + basic_empty_json_input_handler ih; + basic_csv_parameters params; + params.field_delimiter(parameters_.field_delimiter()); + params.quote_char(parameters_.quote_char()); + params.quote_escape_char(parameters_.quote_escape_char()); + params.assume_header(true); + basic_csv_parser p(ih,params); + p.begin_parse(); + p.parse(parameters_.header().data(),0,parameters_.header().length()); + p.end_parse(); + column_names_ = p.column_labels(); + } +#endif + if (parameters_.column_types().size() > 0) + { + column_types_.resize(parameters_.column_types().size()); + for (size_t i = 0; i < parameters_.column_types().size(); ++i) + { + if (parameters_.column_types()[i] == json_csv_parser_traits::string_literal()) + { + column_types_[i] = data_types::string_t; + } + else if (parameters_.column_types()[i] == json_csv_parser_traits::integer_literal()) + { + column_types_[i] = data_types::integer_t; + } + else if (parameters_.column_types()[i] == json_csv_parser_traits::float_literal()) + { + column_types_[i] = data_types::float_t; + } + else if (parameters_.column_types()[i] == json_csv_parser_traits::boolean_literal()) + { + column_types_[i] = data_types::boolean_t; + } + } + } +#if !defined(JSONCONS_NO_DEPRECATED) + else if (parameters_.data_types().length() > 0) + { + basic_empty_json_input_handler ih; + basic_csv_parameters params; + params.field_delimiter(parameters_.field_delimiter()); + params.assume_header(true); + basic_csv_parser p(ih,params); + p.begin_parse(); + p.parse(parameters_.data_types().data(),0,parameters_.data_types().length()); + p.end_parse(); + column_types_.resize(p.column_labels().size()); + for (size_t i = 0; i < p.column_labels().size(); ++i) + { + if (p.column_labels()[i] == json_csv_parser_traits::string_literal()) + { + column_types_[i] = data_types::string_t; + } + else if (p.column_labels()[i] == json_csv_parser_traits::integer_literal()) + { + column_types_[i] = data_types::integer_t; + } + else if (p.column_labels()[i] == json_csv_parser_traits::float_literal()) + { + column_types_[i] = data_types::float_t; + } + else if (p.column_labels()[i] == json_csv_parser_traits::boolean_literal()) + { + column_types_[i] = data_types::boolean_t; + } + } + } +#endif + if (parameters_.column_defaults().size() > 0) + { + column_defaults_ = parameters_.column_defaults(); + } +#if !defined(JSONCONS_NO_DEPRECATED) + else if (parameters_.default_values().length() > 0) + { + basic_empty_json_input_handler ih; + basic_csv_parameters params; + params.field_delimiter(parameters_.field_delimiter()); + params.assume_header(true); + basic_csv_parser p(ih,params); + p.begin_parse(); + p.parse(parameters_.default_values().data(),0,parameters_.default_values().length()); + p.end_parse(); + column_defaults_.resize(p.column_labels().size()); + for (size_t i = 0; i < p.column_labels().size(); ++i) + { + column_defaults_[i] = p.column_labels()[i]; + } + } +#endif + if (parameters_.header_lines() > 0) + { + push(csv_modes::header); + } + else + { + push(csv_modes::array); + } + handler_->begin_array(*this); + state_ = csv_states::expect_value; + column_index_ = 0; + prev_char_ = 0; + curr_char_ = 0; + column_ = 1; + } + + void parse(const CharT* p, size_t start, size_t length) + { + index_ = start; + for (; index_ < length && state_ != csv_states::done; ++index_) + { + curr_char_ = p[index_]; +all_csv_states: + switch (state_) + { + case csv_states::comment: + if (curr_char_ == '\n') + { + state_ = csv_states::expect_value; + } + else if (prev_char_ == '\r') + { + state_ = csv_states::expect_value; + goto all_csv_states; + } + break; + case csv_states::expect_value: + if (column_ == 1 && curr_char_ == parameters_.comment_starter()) + { + state_ = csv_states::comment; + } + else + { + state_ = csv_states::unquoted_string; + goto all_csv_states; + } + break; + case csv_states::between_fields: + if (curr_char_ == '\r' || (prev_char_ != '\r' && curr_char_ == '\n')) + { + after_record(); + state_ = csv_states::expect_value; + } + else if (curr_char_ == parameters_.field_delimiter()) + { + state_ = csv_states::expect_value; + } + break; + case csv_states::escaped_value: + { + if (curr_char_ == parameters_.quote_char()) + { + string_buffer_.push_back(curr_char_); + state_ = csv_states::quoted_string; + } + else if (parameters_.quote_escape_char() == parameters_.quote_char()) + { + before_record(); + end_quoted_string_value(); + after_field(); + state_ = csv_states::between_fields; + goto all_csv_states; + } + } + break; + case csv_states::quoted_string: + { + if (curr_char_ == parameters_.quote_escape_char()) + { + state_ = csv_states::escaped_value; + } + else if (curr_char_ == parameters_.quote_char()) + { + before_record(); + end_quoted_string_value(); + after_field(); + state_ = csv_states::between_fields; + } + else + { + string_buffer_.push_back(curr_char_); + } + } + break; + case csv_states::unquoted_string: + { + if (curr_char_ == '\r' || (prev_char_ != '\r' && curr_char_ == '\n')) + { + before_record(); + end_unquoted_string_value(); + after_field(); + after_record(); + state_ = csv_states::expect_value; + } + else if (curr_char_ == '\n') + { + if (prev_char_ != '\r') + { + before_record(); + end_unquoted_string_value(); + after_field(); + after_record(); + state_ = csv_states::expect_value; + } + } + else if (curr_char_ == parameters_.field_delimiter()) + { + before_record(); + end_unquoted_string_value(); + after_field(); + state_ = csv_states::expect_value; + } + else if (curr_char_ == parameters_.quote_char()) + { + string_buffer_.clear(); + state_ = csv_states::quoted_string; + } + else + { + string_buffer_.push_back(curr_char_); + } + } + break; + default: + err_handler_->error(std::error_code(csv_parser_errc::invalid_state, csv_error_category()), *this); + break; + } + if (line_ > parameters_.max_lines()) + { + state_ = csv_states::done; + } + switch (curr_char_) + { + case '\r': + ++line_; + column_ = 1; + break; + case '\n': + if (prev_char_ != '\r') + { + ++line_; + } + column_ = 1; + break; + default: + ++column_; + break; + } + prev_char_ = curr_char_; + } + } + + void end_parse() + { + switch (state_) + { + case csv_states::unquoted_string: + before_record(); + end_unquoted_string_value(); + after_field(); + break; + case csv_states::escaped_value: + if (parameters_.quote_escape_char() == parameters_.quote_char()) + { + before_record(); + end_quoted_string_value(); + after_field(); + } + break; + default: + break; + } + if (column_index_ > 0) + { + after_record(); + } + switch (stack_[top_]) + { + case csv_modes::array: + if (!pop(csv_modes::array)) + { + err_handler_->error(std::error_code(csv_parser_errc::unexpected_eof, csv_error_category()), *this); + } + break; + case csv_modes::object: + if (!pop(csv_modes::object)) + { + err_handler_->error(std::error_code(csv_parser_errc::unexpected_eof, csv_error_category()), *this); + } + break; + case csv_modes::header: + if (!pop(csv_modes::header)) + { + err_handler_->error(std::error_code(csv_parser_errc::unexpected_eof, csv_error_category()), *this); + } + break; + default: + break; + } + handler_->end_array(*this); + if (!pop(csv_modes::done)) + { + err_handler_->error(std::error_code(csv_parser_errc::unexpected_eof, csv_error_category()), *this); + } + handler_->end_json(); + } + + csv_states state() const + { + return state_; + } + + size_t index() const + { + return index_; + } +private: + + void trim_string_buffer(bool trim_leading, bool trim_trailing) + { + size_t start = 0; + size_t length = string_buffer_.length(); + if (trim_leading) + { + bool done = false; + while (!done && start < string_buffer_.length()) + { + if ((string_buffer_[start] < 256) && std::isspace(string_buffer_[start])) + { + ++start; + } + else + { + done = true; + } + } + } + if (trim_trailing) + { + bool done = false; + while (!done && length > 0) + { + if ((string_buffer_[length-1] < 256) && std::isspace(string_buffer_[length-1])) + { + --length; + } + else + { + done = true; + } + } + } + if (start != 0 || length != string_buffer_.size()) + { + string_buffer_ = string_buffer_.substr(start,length-start); + } + } + + void end_unquoted_string_value() + { + if (parameters_.trim_leading() | parameters_.trim_trailing()) + { + trim_string_buffer(parameters_.trim_leading(),parameters_.trim_trailing()); + } + switch (stack_[top_]) + { + case csv_modes::header: + if (parameters_.assume_header() && line_ == 1) + { + column_names_.push_back(string_buffer_); + } + break; + case csv_modes::object: + if (!(parameters_.ignore_empty_values() && string_buffer_.size() == 0)) + { + if (column_index_ < column_names_.size()) + { + handler_->name(column_names_[column_index_].data(), column_names_[column_index_].length(), *this); + if (parameters_.unquoted_empty_value_is_null() && string_buffer_.length() == 0) + { + handler_->value(jsoncons::null_type(),*this); + } + else + { + end_value(); + } + } + } + break; + case csv_modes::array: + if (parameters_.unquoted_empty_value_is_null() && string_buffer_.length() == 0) + { + handler_->value(jsoncons::null_type(),*this); + } + else + { + end_value(); + } + break; + default: + err_handler_->error(std::error_code(csv_parser_errc::invalid_csv_text, csv_error_category()), *this); + break; + } + state_ = csv_states::expect_value; + string_buffer_.clear(); + } + + void end_quoted_string_value() + { + if (parameters_.trim_leading_inside_quotes() | parameters_.trim_trailing_inside_quotes()) + { + trim_string_buffer(parameters_.trim_leading_inside_quotes(),parameters_.trim_trailing_inside_quotes()); + } + switch (stack_[top_]) + { + case csv_modes::header: + if (parameters_.assume_header() && line_ == 1) + { + column_names_.push_back(string_buffer_); + } + break; + case csv_modes::object: + if (!(parameters_.ignore_empty_values() && string_buffer_.size() == 0)) + { + if (column_index_ < column_names_.size()) + { + handler_->name(column_names_[column_index_].data(), column_names_[column_index_].length(), *this); + end_value(); + } + } + break; + case csv_modes::array: + end_value(); + break; + default: + err_handler_->error(std::error_code(csv_parser_errc::invalid_csv_text, csv_error_category()), *this); + break; + } + state_ = csv_states::expect_value; + string_buffer_.clear(); + } + + void end_value() + { + if (column_index_ < column_types_.size()) + { + switch (column_types_[column_index_]) + { + case data_types::integer_t: + { + std::istringstream iss(string_buffer_); + long long val; + iss >> val; + if (!iss.fail()) + { + handler_->value(val, *this); + } + else + { + if (column_index_ < column_defaults_.size() && column_defaults_[column_index_].length() > 0) + { + parser_.begin_parse(); + parser_.parse(column_defaults_[column_index_].data(),0,column_defaults_[column_index_].length()); + parser_.end_parse(); + } + else + { + handler_->value(null_type(), *this); + } + } + } + break; + case data_types::float_t: + { + std::istringstream iss(string_buffer_); + double val; + iss >> val; + if (!iss.fail()) + { + handler_->value(val, 0, *this); + } + else + { + if (column_index_ < column_defaults_.size() && column_defaults_[column_index_].length() > 0) + { + parser_.begin_parse(); + parser_.parse(column_defaults_[column_index_].data(),0,column_defaults_[column_index_].length()); + parser_.end_parse(); + } + else + { + handler_->value(null_type(), *this); + } + } + } + break; + case data_types::boolean_t: + { + if (string_buffer_.length() == 1 && string_buffer_[0] == '0') + { + handler_->value(false, *this); + } + else if (string_buffer_.length() == 1 && string_buffer_[0] == '1') + { + handler_->value(true, *this); + } + else if (string_buffer_.length() == 5 && ((string_buffer_[0] == 'f' || string_buffer_[0] == 'F') && (string_buffer_[1] == 'a' || string_buffer_[1] == 'A') && (string_buffer_[2] == 'l' || string_buffer_[2] == 'L') && (string_buffer_[3] == 's' || string_buffer_[3] == 'S') && (string_buffer_[4] == 'e' || string_buffer_[4] == 'E'))) + { + handler_->value(false, *this); + } + else if (string_buffer_.length() == 4 && ((string_buffer_[0] == 't' || string_buffer_[0] == 'T') && (string_buffer_[1] == 'r' || string_buffer_[1] == 'R') && (string_buffer_[2] == 'u' || string_buffer_[2] == 'U') && (string_buffer_[3] == 'e' || string_buffer_[3] == 'E'))) + { + handler_->value(true, *this); + } + else + { + if (column_index_ < column_defaults_.size() && column_defaults_[column_index_].length() > 0) + { + parser_.begin_parse(); + parser_.parse(column_defaults_[column_index_].data(),0,column_defaults_[column_index_].length()); + parser_.end_parse(); + } + else + { + handler_->value(null_type(), *this); + } + } + } + break; + default: + if (string_buffer_.length() > 0) + { + handler_->value(string_buffer_.data(), string_buffer_.length(), *this); + } + else + { + if (column_index_ < column_defaults_.size() && column_defaults_[column_index_].length() > 0) + { + parser_.begin_parse(); + parser_.parse(column_defaults_[column_index_].data(),0,column_defaults_[column_index_].length()); + parser_.end_parse(); + } + else + { + handler_->value("", *this); + } + } + break; + } + } + else + { + handler_->value(string_buffer_.data(), string_buffer_.length(), *this); + } + } + + size_t do_line_number() const override + { + return line_; + } + + size_t do_column_number() const override + { + return column_; + } + + CharT do_current_char() const override + { + return (CharT)prev_char_; + } + + void push(csv_modes mode) + { + ++top_; + if (top_ >= depth_) + { + depth_ *= 2; + stack_.resize(depth_); + } + stack_[top_] = mode; + } + + int peek() + { + return stack_[top_]; + } + + bool peek(csv_modes mode) + { + return stack_[top_] == mode; + } + + bool flip(csv_modes mode1, csv_modes mode2) + { + if (top_ < 0 || stack_[top_] != mode1) + { + return false; + } + stack_[top_] = mode2; + return true; + } + + bool pop(csv_modes mode) + { + if (top_ < 0 || stack_[top_] != mode) + { + return false; + } + --top_; + return true; + } +}; + +typedef basic_csv_parser csv_parser; +typedef basic_csv_parser wcsv_parser; + +}} + +#endif + diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_reader.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_reader.hpp new file mode 100644 index 00000000..38213e25 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_reader.hpp @@ -0,0 +1,175 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_CSV_CSV_READER_HPP +#define JSONCONS_CSV_CSV_READER_HPP + +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/json_input_handler.hpp" +#include "jsoncons/parse_error_handler.hpp" +#include "jsoncons_ext/csv/csv_error_category.hpp" +#include "jsoncons_ext/csv/csv_parser.hpp" +#include "jsoncons/json.hpp" + +namespace jsoncons { namespace csv { + +template +class basic_csv_reader +{ + struct stack_item + { + stack_item() + : array_begun_(false) + { + } + + bool array_begun_; + }; +public: + // Structural characters + static const size_t default_max_buffer_length = 16384; + //! Parse an input stream of CSV text into a json object + /*! + \param is The input stream to read from + */ + + basic_csv_reader(std::basic_istream& is, + basic_json_input_handler& handler) + + : parser_(handler), + is_(std::addressof(is)), + buffer_(default_max_buffer_length), + buffer_capacity_(default_max_buffer_length), + buffer_position_(0), + buffer_length_(0), + eof_(false), + index_(0) + { + } + + basic_csv_reader(std::basic_istream& is, + basic_json_input_handler& handler, + basic_csv_parameters params) + + : parser_(handler,params), + is_(std::addressof(is)), + buffer_(default_max_buffer_length), + buffer_capacity_(default_max_buffer_length), + buffer_position_(0), + buffer_length_(0), + eof_(false), + index_(0) + { + } + + basic_csv_reader(std::basic_istream& is, + basic_json_input_handler& handler, + basic_parse_error_handler& err_handler) + : + parser_(handler,err_handler), + is_(std::addressof(is)), + buffer_(), + buffer_capacity_(default_max_buffer_length), + buffer_position_(0), + buffer_length_(0), + eof_(false), + index_(0) + + + { + } + + basic_csv_reader(std::basic_istream& is, + basic_json_input_handler& handler, + basic_parse_error_handler& err_handler, + basic_csv_parameters params) + : + parser_(handler,err_handler,params), + is_(std::addressof(is)), + buffer_(), + buffer_capacity_(default_max_buffer_length), + buffer_position_(0), + buffer_length_(0), + eof_(false), + index_(0) + { + } + + ~basic_csv_reader() + { + } + + void read() + { + parser_.begin_parse(); + while (!eof_ && !parser_.done()) + { + if (!(index_ < buffer_length_)) + { + if (!is_->eof()) + { + is_->read(buffer_.data(), buffer_capacity_); + buffer_length_ = static_cast(is_->gcount()); + if (buffer_length_ == 0) + { + eof_ = true; + } + index_ = 0; + } + else + { + eof_ = true; + } + } + if (!eof_) + { + parser_.parse(buffer_.data(),index_,buffer_length_); + index_ = parser_.index(); + } + } + parser_.end_parse(); + } + + bool eof() const + { + return eof_; + } + + size_t buffer_capacity() const + { + return buffer_capacity_; + } + + void buffer_capacity(size_t buffer_capacity) + { + buffer_capacity_ = buffer_capacity; + } + +private: + basic_csv_reader(const basic_csv_reader&) = delete; + basic_csv_reader& operator = (const basic_csv_reader&) = delete; + + basic_csv_parser parser_; + std::basic_istream* is_; + std::vector buffer_; + size_t buffer_capacity_; + size_t buffer_position_; + size_t buffer_length_; + bool eof_; + size_t index_; +}; + +typedef basic_csv_reader csv_reader; + +}} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_serializer.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_serializer.hpp new file mode 100644 index 00000000..f331b629 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/csv/csv_serializer.hpp @@ -0,0 +1,445 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_CSV_CSV_SERIALIZER_HPP +#define JSONCONS_CSV_CSV_SERIALIZER_HPP + +#include +#include +#include +#include +#include +#include +#include "jsoncons/jsoncons.hpp" +#include "jsoncons/output_format.hpp" +#include "jsoncons/json_output_handler.hpp" +#include // std::numeric_limits + +namespace jsoncons { namespace csv { + +template +struct csv_char_traits +{ +}; + +template <> +struct csv_char_traits +{ + static const std::string all_literal() {return "all";}; + + static const std::string minimal_literal() {return "minimal";}; + + static const std::string none_literal() {return "none";}; + + static const std::string nonnumeric_literal() {return "nonumeric";}; +}; + +template <> +struct csv_char_traits +{ + static const std::wstring all_literal() {return L"all";}; + + static const std::wstring minimal_literal() {return L"minimal";}; + + static const std::wstring none_literal() {return L"none";}; + + static const std::wstring nonnumeric_literal() {return L"nonumeric";}; +}; + +template +void escape_string(const CharT* s, + size_t length, + CharT quote_char, CharT quote_escape_char, + buffered_ostream& os) +{ + const CharT* begin = s; + const CharT* end = s + length; + for (const CharT* it = begin; it != end; ++it) + { + CharT c = *it; + if (c == quote_char) + { + os.put(quote_escape_char); + os.put(quote_char); + } + else + { + os.put(c); + } + } +} + +template +class basic_csv_serializer : public basic_json_output_handler +{ + struct stack_item + { + stack_item(bool is_object) + : is_object_(is_object), count_(0), skip_(false) + { + } + bool is_object() const + { + return is_object_; + } + + bool is_object_; + size_t count_; + bool skip_; + }; + buffered_ostream os_; + basic_csv_parameters parameters_; + basic_output_format format_; + std::vector stack_; + std::streamsize original_precision_; + std::ios_base::fmtflags original_format_flags_; + std::basic_ostringstream header_oss_; + buffered_ostream header_os_; + std::map,size_t> header_; + float_printer fp_; +public: + basic_csv_serializer(std::basic_ostream& os) + : + os_(os), + format_(), + stack_(), + original_precision_(), + original_format_flags_(), + header_os_(header_oss_), + header_(), + fp_(format_.precision()) + { + } + + basic_csv_serializer(std::basic_ostream& os, + basic_csv_parameters params) + : + os_(os), + parameters_(params), + format_(), + stack_(), + original_precision_(), + original_format_flags_(), + header_os_(header_oss_), + header_(), + fp_(format_.precision()) + { + } + + ~basic_csv_serializer() + { + } + +private: + + void do_begin_json() override + { + } + + void do_end_json() override + { + } + + void do_begin_object() override + { + stack_.push_back(stack_item(true)); + } + + void do_end_object() override + { + if (stack_.size() == 2) + { + os_.write(parameters_.line_delimiter()); + if (stack_[0].count_ == 0) + { + os_.write(header_oss_.str()); + os_.write(parameters_.line_delimiter()); + } + } + stack_.pop_back(); + + end_value(); + } + + void do_begin_array() override + { + stack_.push_back(stack_item(false)); + } + + void do_end_array() override + { + if (stack_.size() == 2) + { + os_.write(parameters_.line_delimiter()); + } + stack_.pop_back(); + + end_value(); + } + + void do_name(const CharT* name, size_t length) override + { + if (stack_.size() == 2) + { + if (stack_[0].count_ == 0) + { + if (stack_.back().count_ > 0) + { + os_.put(parameters_.field_delimiter()); + } + bool quote = false; + if (parameters_.quote_style() == quote_styles::all || parameters_.quote_style() == quote_styles::nonnumeric || + (parameters_.quote_style() == quote_styles::minimal && std::char_traits::find(name,length,parameters_.field_delimiter()) != nullptr)) + { + quote = true; + os_.put(parameters_.quote_char()); + } + jsoncons::csv::escape_string(name, length, parameters_.quote_char(), parameters_.quote_escape_char(), os_); + if (quote) + { + os_.put(parameters_.quote_char()); + } + header_[name] = stack_.back().count_; + } + else + { + typename std::map,size_t>::iterator it = header_.find(std::basic_string(name,length)); + if (it == header_.end()) + { + stack_.back().skip_ = true; + //std::cout << " Not found "; + } + else + { + stack_.back().skip_ = false; + while (stack_.back().count_ < it->second) + { + os_.put(parameters_.field_delimiter()); + ++stack_.back().count_; + } + // std::cout << " (" << it->value() << " " << stack_.back().count_ << ") "; + } + } + } + } + + void do_null_value() override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + do_null_value(header_os_); + } + else + { + do_null_value(os_); + } + } + } + + void do_string_value(const CharT* val, size_t length) override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + value(val,length,header_os_); + } + else + { + value(val,length,os_); + } + } + } + + void do_double_value(double val, uint8_t precision) override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + value(val,header_os_); + } + else + { + value(val,os_); + } + } + } + + void do_integer_value(int64_t val) override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + value(val,header_os_); + } + else + { + value(val,os_); + } + } + } + + void do_uinteger_value(uint64_t val) override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + value(val,header_os_); + } + else + { + value(val,os_); + } + } + } + + void do_bool_value(bool val) override + { + if (stack_.size() == 2 && !stack_.back().skip_) + { + if (stack_.back().is_object() && stack_[0].count_ == 0) + { + value(val,header_os_); + } + else + { + value(val,os_); + } + } + } + + void value(const CharT* val, size_t length, buffered_ostream& os) + { + begin_value(os); + + bool quote = false; + if (parameters_.quote_style() == quote_styles::all || parameters_.quote_style() == quote_styles::nonnumeric || + (parameters_.quote_style() == quote_styles::minimal && std::char_traits::find(val, length, parameters_.field_delimiter()) != nullptr)) + { + quote = true; + os.put(parameters_.quote_char()); + } + jsoncons::csv::escape_string(val, length, parameters_.quote_char(), parameters_.quote_escape_char(), os); + if (quote) + { + os.put(parameters_.quote_char()); + } + + end_value(); + } + + void value(double val, buffered_ostream& os) + { + begin_value(os); + + if (is_nan(val) && format_.replace_nan()) + { + os.write(format_.nan_replacement()); + } + else if (is_pos_inf(val) && format_.replace_pos_inf()) + { + os.write(format_.pos_inf_replacement()); + } + else if (is_neg_inf(val) && format_.replace_neg_inf()) + { + os.write(format_.neg_inf_replacement()); + } + //else if (format_.floatfield() != 0) + //{ + // std::basic_ostringstream ss; + // ss.imbue(std::locale::classic()); + // ss.setf(format_.floatfield(), std::ios::floatfield); + // ss << std::showpoint << std::setprecision(format_.precision()) << val; + // os.write(ss.str()); + //} + else + { + fp_.print(val,format_.precision(),os); + } + + end_value(); + + } + + void value(int64_t val, buffered_ostream& os) + { + begin_value(os); + + std::basic_ostringstream ss; + ss << val; + os.write(ss.str()); + + end_value(); + } + + void value(uint64_t val, buffered_ostream& os) + { + begin_value(os); + + std::basic_ostringstream ss; + ss << val; + os.write(ss.str()); + + end_value(); + } + + void value(bool val, buffered_ostream& os) + { + begin_value(os); + + if (val) + { + auto buf = json_literals::true_literal(); + os.write(buf.first,buf.second); + } + else + { + auto buf = json_literals::false_literal(); + os.write(buf.first,buf.second); + } + + end_value(); + } + + void do_null_value(buffered_ostream& os) + { + begin_value(os); + auto buf = json_literals::null_literal(); + os.write(buf.first,buf.second); + end_value(); + + } + + void begin_value(buffered_ostream& os) + { + if (!stack_.empty()) + { + if (stack_.back().count_ > 0) + { + os.put(parameters_.field_delimiter()); + } + } + } + + void end_value() + { + if (!stack_.empty()) + { + ++stack_.back().count_; + } + } +}; + +typedef basic_csv_serializer csv_serializer; + +}} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/json_query.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/json_query.hpp new file mode 100644 index 00000000..7e530abd --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/json_query.hpp @@ -0,0 +1,921 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONPATH_JSONQUERY_HPP +#define JSONCONS_JSONPATH_JSONQUERY_HPP + +#include +#include +#include +#include +#include +#include +#include "jsoncons/json.hpp" +#include "jsonpath_filter.hpp" +#include "jsonpath_error_category.hpp" + +namespace jsoncons { namespace jsonpath { + + template + bool try_string_to_index(const CharT *s, size_t length, size_t* value) + { + static const size_t max_value = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); + static const size_t max_value_div_10 = max_value / 10; + + size_t n = 0; + for (size_t i = 0; i < length; ++i) + { + CharT c = s[i]; + switch (c) + { + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + { + size_t x = c - '0'; + if (n > max_value_div_10) + { + return false; + } + n = n * 10; + if (n > max_value - x) + { + return false; + } + + n += x; + } + break; + default: + return false; + break; + } + } + *value = n; + return true; + } + + template + struct json_jsonpath_traits + { + }; + + template <> + struct json_jsonpath_traits + { + static const std::string length_literal() {return "length";}; + }; + + template <> + struct json_jsonpath_traits // assume utf16 + { + static const std::wstring length_literal() {return L"length";}; + }; + +// here + +template +JsonT json_query(const JsonT& root, const typename JsonT::char_type* path, size_t length) +{ + jsonpath_evaluator evaluator; + evaluator.evaluate(root,path,length); + return evaluator.get_values(); +} + +template +JsonT json_query(const JsonT& root, const typename JsonT::string_type& path) +{ + return json_query(root,path.data(),path.length()); +} + +template +JsonT json_query(const JsonT& root, const typename JsonT::char_type* path) +{ + return json_query(root,path,std::char_traits::length(path)); +} + +enum class states +{ + start, + cr, + lf, + expect_separator, + expect_unquoted_name, + unquoted_name, + single_quoted_name, + double_quoted_name, + left_bracket, + left_bracket_start, + left_bracket_end, + left_bracket_end2, + left_bracket_step, + left_bracket_step2, + expect_right_bracket, + dot +}; + +template +class jsonpath_evaluator : private basic_parsing_context +{ +private: + typedef typename JsonT::char_type char_type; + typedef typename JsonT::string_type string_type; + typedef const JsonT* cjson_ptr; + typedef std::vector node_set; + + basic_parse_error_handler *err_handler_; + states state_; + string_type buffer_; + size_t start_; + size_t end_; + size_t step_; + bool positive_start_; + bool positive_end_; + bool positive_step_; + bool end_undefined_; + std::vector stack_; + bool recursive_descent_; + std::vector nodes_; + std::vector> temp_; + size_t line_; + size_t column_; + const char_type* begin_input_; + const char_type* end_input_; + const char_type* p_; + states pre_line_break_state_; + + void transfer_nodes() + { + stack_.push_back(nodes_); + nodes_.clear(); + } + +public: + jsonpath_evaluator() + : err_handler_(std::addressof(basic_default_parse_error_handler::instance())) + { + } + + JsonT get_values() const + { + JsonT result = JsonT::make_array(); + + if (stack_.size() > 0) + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + cjson_ptr p = stack_.back()[i]; + result.add(*p); + } + } + return result; + } + + void evaluate(const JsonT& root, const string_type& path) + { + evaluate(root,path.data(),path.length()); + } + void evaluate(const JsonT& root, const char_type* path) + { + evaluate(root,path,std::char_traits::length(path)); + } + + void evaluate(const JsonT& root, const char_type* path, size_t length) + { + begin_input_ = path; + end_input_ = path + length; + p_ = begin_input_; + + line_ = 1; + column_ = 1; + state_ = states::start; + buffer_.clear(); + start_ = 0; + end_ = 0; + step_ = 1; + recursive_descent_ = false; + positive_start_ = true; + positive_end_ = true; + positive_step_ = true; + end_undefined_ = false; + + while (p_ < end_input_) + { + switch (state_) + { + case states::cr: + ++line_; + column_ = 1; + switch (*p_) + { + case '\n': + state_ = pre_line_break_state_; + ++p_; + ++column_; + break; + default: + state_ = pre_line_break_state_; + break; + } + break; + case states::lf: + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case states::start: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ' ':case '\t': + ++p_; + ++column_; + break; + case '$': + case '@': + { + node_set v; + v.push_back(std::addressof(root)); + stack_.push_back(v); + state_ = states::expect_separator; + } + break; + default: + err_handler_->fatal_error(std::error_code(jsonpath_parser_errc::expected_root, jsonpath_error_category()), *this); + break; + }; + ++p_; + ++column_; + break; + case states::dot: + switch (*p_) + { + case '.': + recursive_descent_ = true; + ++p_; + ++column_; + state_ = states::expect_unquoted_name; + break; + default: + state_ = states::expect_unquoted_name; + break; + } + break; + case states::expect_unquoted_name: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case '.': + err_handler_->fatal_error(std::error_code(jsonpath_parser_errc::expected_name, jsonpath_error_category()), *this); + ++p_; + ++column_; + break; + case '*': + end_all(); + transfer_nodes(); + state_ = states::expect_separator; + ++p_; + ++column_; + break; + default: + state_ = states::unquoted_name; + break; + } + break; + case states::expect_separator: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ' ':case '\t': + ++p_; + ++column_; + break; + case '.': + state_ = states::dot; + break; + case '[': + state_ = states::left_bracket; + break; + default: + err_handler_->fatal_error(std::error_code(jsonpath_parser_errc::expected_separator, jsonpath_error_category()), *this); + break; + }; + ++p_; + ++column_; + break; + case states::expect_right_bracket: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ',': + state_ = states::left_bracket; + break; + case ']': + transfer_nodes(); + state_ = states::expect_separator; + break; + case ' ':case '\t': + break; + default: + err_handler_->fatal_error(std::error_code(jsonpath_parser_errc::expected_right_bracket, jsonpath_error_category()), *this); + break; + } + ++p_; + ++column_; + break; + case states::left_bracket_step: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case '-': + positive_step_ = false; + state_ = states::left_bracket_step2; + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + step_ = static_cast(*p_-'0'); + state_ = states::left_bracket_step2; + break; + case ']': + end_array_slice(); + transfer_nodes(); + state_ = states::expect_separator; + break; + } + ++p_; + ++column_; + break; + case states::left_bracket_step2: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + step_ = step_*10 + static_cast(*p_-'0'); + break; + case ']': + end_array_slice(); + transfer_nodes(); + state_ = states::expect_separator; + break; + } + ++p_; + ++column_; + break; + case states::left_bracket_end: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case '-': + positive_end_ = false; + state_ = states::left_bracket_end2; + break; + case ':': + step_ = 0; + state_ = states::left_bracket_step; + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + end_undefined_ = false; + end_ = static_cast(*p_-'0'); + state_ = states::left_bracket_end2; + break; + case ']': + end_array_slice(); + transfer_nodes(); + state_ = states::expect_separator; + break; + } + ++p_; + ++column_; + break; + case states::left_bracket_end2: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ':': + step_ = 0; + state_ = states::left_bracket_step; + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + end_undefined_ = false; + end_ = end_*10 + static_cast(*p_-'0'); + break; + case ']': + end_array_slice(); + transfer_nodes(); + state_ = states::expect_separator; + break; + } + ++p_; + ++column_; + break; + case states::left_bracket_start: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ':': + step_ = 1; + end_undefined_ = true; + state_ = states::left_bracket_end; + break; + case ',': + find_elements(); + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + start_ = start_*10 + static_cast(*p_-'0'); + break; + case ']': + find_elements(); + transfer_nodes(); + state_ = states::expect_separator; + break; + } + ++p_; + ++column_; + break; + case states::left_bracket: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case ' ':case '\t': + ++p_; + ++column_; + break; + case '(': + { + if (stack_.back().size() == 1) + { + jsonpath_filter_parser parser(&p_,&line_,&column_); + parser.parse(p_,end_input_); + auto index = parser.eval(*(stack_.back()[0])); + if (index.template is()) + { + start_ = index. template as(); + find_elements(); + } + else if (index.is_string()) + { + find(index.as_string()); + } + } + else + { + ++p_; + ++column_; + } + } + break; + case '?': + { + jsonpath_filter_parser parser(&p_,&line_,&column_); + parser.parse(p_,end_input_); + nodes_.clear(); + for (size_t j = 0; j < stack_.back().size(); ++j) + { + accept(*(stack_.back()[j]),parser); + } + } + break; + + case ':': + step_ = 1; + end_undefined_ = true; + state_ = states::left_bracket_end; + ++p_; + ++column_; + break; + case ',': + find_elements(); + ++p_; + ++column_; + break; + case '-': + positive_start_ = false; + state_ = states::left_bracket_start; + ++p_; + ++column_; + break; + case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9': + start_ = static_cast(*p_-'0'); + state_ = states::left_bracket_start; + ++p_; + ++column_; + break; + case ']': + //find_elements(); + transfer_nodes(); + state_ = states::expect_separator; + ++p_; + ++column_; + break; + case '*': + end_all(); + //transfer_nodes(); + state_ = states::expect_right_bracket; + ++p_; + ++column_; + break; + case '\'': + state_ = states::single_quoted_name; + ++p_; + ++column_; + break; + case '\"': + state_ = states::double_quoted_name; + ++p_; + ++column_; + break; + default: + ++p_; + ++column_; + break; + } + break; + case states::unquoted_name: + switch (*p_) + { + case '\r': + pre_line_break_state_ = state_; + state_ = states::cr; + break; + case '\n': + pre_line_break_state_ = state_; + state_ = states::lf; + break; + case '[': + find(buffer_); + buffer_.clear(); + transfer_nodes(); + start_ = 0; + state_ = states::left_bracket; + break; + case '.': + find(buffer_); + buffer_.clear(); + transfer_nodes(); + state_ = states::dot; + break; + case ' ':case '\t': + break; + default: + buffer_.push_back(*p_); + break; + }; + ++p_; + ++column_; + break; + case states::single_quoted_name: + switch (*p_) + { + case '\'': + find(buffer_); + buffer_.clear(); + state_ = states::expect_right_bracket; + break; + case '\\': + buffer_.push_back(*p_); + if (p_+1 < end_input_) + { + ++p_; + ++column_; + buffer_.push_back(*p_); + } + break; + default: + buffer_.push_back(*p_); + break; + }; + ++p_; + ++column_; + break; + case states::double_quoted_name: + switch (*p_) + { + case '\"': + find(buffer_); + buffer_.clear(); + state_ = states::expect_right_bracket; + break; + case '\\': + buffer_.push_back(*p_); + if (p_+1 < end_input_) + { + ++p_; + ++column_; + buffer_.push_back(*p_); + } + break; + default: + buffer_.push_back(*p_); + break; + }; + ++p_; + ++column_; + break; + default: + ++p_; + ++column_; + break; + } + } + switch (state_) + { + case states::unquoted_name: + { + find(buffer_); + buffer_.clear(); + transfer_nodes(); + } + break; + default: + break; + } + } + + void accept(const JsonT& val, + jsonpath_filter_parser& filter) + { + if (val.is_object()) + { + if (recursive_descent_ && val.is_object()) + { + for (auto it = val.members().begin(); it != val.members().end(); ++it) + { + accept(it->value(),filter); + } + } + if (filter.exists(val)) + { + nodes_.push_back(std::addressof(val)); + } + } + else if (val.is_array()) + { + for (auto it = val.elements().begin(); it != val.elements().end(); ++it) + { + accept(*it,filter); + } + } + } + + + + void end_all() + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + cjson_ptr p = stack_.back()[i]; + if (p->is_array()) + { + for (auto it = p->elements().begin(); it != p->elements().end(); ++it) + { + nodes_.push_back(std::addressof(*it)); + } + } + else if (p->is_object()) + { + for (auto it = p->members().begin(); it != p->members().end(); ++it) + { + nodes_.push_back(std::addressof(it->value())); + } + } + + } + start_ = 0; + } + + void find_elements() + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + cjson_ptr p = stack_.back()[i]; + if (p->is_array() && start_ < p->size()) + { + nodes_.push_back(std::addressof((*p)[start_])); + } + } + start_ = 0; + } + + void end_array_slice() + { + if (positive_step_) + { + end_array_slice1(); + } + else + { + end_array_slice2(); + } + start_ = 0; + end_ = 0; + step_ = 1; + positive_start_ = positive_end_ = positive_step_ = true; + end_undefined_ = true; + } + + void end_array_slice1() + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + cjson_ptr p = stack_.back()[i]; + if (p->is_array()) + { + size_t start = positive_start_ ? start_ : p->size() - start_; + size_t end; + if (!end_undefined_) + { + end = positive_end_ ? end_ : p->size() - end_; + } + else + { + end = p->size(); + } + for (size_t j = start; j < end; j += step_) + { + if (p->is_array() && j < p->size()) + { + nodes_.push_back(std::addressof((*p)[j])); + } + } + } + } + } + + void end_array_slice2() + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + cjson_ptr p = stack_.back()[i]; + size_t start = positive_start_ ? start_ : p->size() - start_; + size_t end; + if (!end_undefined_) + { + end = positive_end_ ? end_ : p->size() - end_; + } + else + { + end = p->size(); + } + + size_t j = end + step_ - 1; + while (j > (start+step_-1)) + { + j -= step_; + if (p->is_array() && j < p->size()) + { + nodes_.push_back(std::addressof((*p)[j])); + } + } + } + } + + void find(const string_type& name) + { + if (name.length() > 0) + { + for (size_t i = 0; i < stack_.back().size(); ++i) + { + find1(*(stack_.back()[i]), name); + } + recursive_descent_ = false; + } + } + + void find1(const JsonT& context_val, const string_type& name) + { + if (context_val.is_object()) + { + if (context_val.count(name) > 0) + { + nodes_.push_back(std::addressof(context_val.at(name))); + } + if (recursive_descent_) + { + for (auto it = context_val.members().begin(); it != context_val.members().end(); ++it) + { + if (it->value().is_object() || it->value().is_array()) + { + find1(it->value(), name); + } + } + } + } + else if (context_val.is_array()) + { + size_t index = 0; + if (try_string_to_index(name.data(),name.size(),&index)) + { + if (index < context_val.size()) + { + nodes_.push_back(std::addressof(context_val[index])); + } + } + else if (name == json_jsonpath_traits::length_literal() && context_val.size() > 0) + { + auto q = std::make_shared(context_val.size()); + temp_.push_back(q); + nodes_.push_back(q.get()); + } + if (recursive_descent_) + { + for (auto it = context_val.elements().begin(); it != context_val.elements().end(); ++it) + { + if (it->is_object() || it->is_array()) + { + find1(*it, name); + } + } + } + } + } + + size_t do_line_number() const override + { + return line_; + } + + size_t do_column_number() const override + { + return column_; + } + + char_type do_current_char() const override + { + return 0; //p_ < end_input_? *p_ : 0; + } + +}; + +}} + +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_error_category.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_error_category.hpp new file mode 100644 index 00000000..7f6b6a12 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_error_category.hpp @@ -0,0 +1,75 @@ +/// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONPATH_JSONPATH_ERROR_CATEGORY_HPP +#define JSONCONS_JSONPATH_JSONPATH_ERROR_CATEGORY_HPP + +#include "jsoncons/jsoncons.hpp" +#include + +namespace jsoncons { namespace jsonpath { + +namespace jsonpath_parser_errc +{ + const int expected_root = 1; + const int expected_right_bracket = 2; + const int expected_name = 3; + const int expected_separator = 4; + const int invalid_filter = 5; + const int invalid_filter_expected_slash = 6; + const int invalid_filter_unbalanced_paren = 7; + const int invalid_filter_unsupported_operator = 8; + const int invalid_filter_expected_right_brace = 9; + const int invalid_filter_expected_primary = 10; +} + +class jsonpath_error_category_impl + : public std::error_category +{ +public: + virtual const char* name() const JSONCONS_NOEXCEPT + { + return "jsonpath"; + } + virtual std::string message(int ev) const + { + switch (ev) + { + case jsonpath_parser_errc::expected_root: + return "Expected $"; + case jsonpath_parser_errc::expected_right_bracket: + return "Expected ]"; + case jsonpath_parser_errc::expected_name: + return "Expected a name following a dot"; + case jsonpath_parser_errc::expected_separator: + return "Expected dot or left bracket separator"; + case jsonpath_parser_errc::invalid_filter: + return "Invalid path filter"; + case jsonpath_parser_errc::invalid_filter_expected_slash: + return "Invalid path filter, expected '/'"; + case jsonpath_parser_errc::invalid_filter_unbalanced_paren: + return "Invalid path filter, unbalanced parenthesis"; + case jsonpath_parser_errc::invalid_filter_unsupported_operator: + return "Unsupported operator"; + case jsonpath_parser_errc::invalid_filter_expected_right_brace: + return "Invalid path filter, expected right brace }"; + case jsonpath_parser_errc::invalid_filter_expected_primary: + return "Invalid path filter, expected primary expression."; + default: + return "Unknown jsonpath parser error"; + } + } +}; + +inline +const std::error_category& jsonpath_error_category() +{ + static jsonpath_error_category_impl instance; + return instance; +} + +}} +#endif diff --git a/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_filter.hpp b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_filter.hpp new file mode 100644 index 00000000..b0ac51c6 --- /dev/null +++ b/vendor/jsoncons-0.99.2/jsoncons_ext/jsonpath/jsonpath_filter.hpp @@ -0,0 +1,1495 @@ +// Copyright 2013 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_JSONPATH_FILTER_HPP +#define JSONCONS_JSONPATH_FILTER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include "jsoncons/json.hpp" +#include "jsonpath_error_category.hpp" + +namespace jsoncons { namespace jsonpath { + +template +class jsonpath_evaluator; + +enum class filter_states +{ + start, + cr, + lf, + expect_right_round_bracket, + expect_oper_or_right_round_bracket, + expect_path_or_value, + expect_regex, + regex, + single_quoted_text, + double_quoted_text, + unquoted_text, + path, + value, + oper +}; + +enum class token_types +{ + left_paren, + right_paren, + term, + eq, + ne, + regex, + ampamp, + pipepipe, + lt, + gt, + lte, + gte, + plus, + minus, + exclaim, + done +}; + +template +class term +{ +public: + typedef typename JsonT::string_type string_type; + typedef typename JsonT::char_type char_type; + + virtual void initialize(const JsonT& context_node) + { + } + virtual bool accept_single_node() const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT evaluate_single_node() const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool exclaim() const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool eq(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool eq(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool ne(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool ne(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool regex(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool regex2(const string_type& subject) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool ampamp(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool ampamp(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool pipepipe(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool pipepipe(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool lt(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool lt(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool gt(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual bool gt(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT minus(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT minus(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT unary_minus() const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT plus(const term& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } + virtual JsonT plus(const JsonT& rhs) const + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unsupported_operator, jsonpath_error_category()),1,1); + } +}; + +template +class token +{ + token_types type_; + std::shared_ptr> term_ptr_; +public: + token(token_types type) + : type_(type) + { + } + token(token_types type, std::shared_ptr> term_ptr) + : type_(type), term_ptr_(term_ptr) + { + } + token(const token& t) + : type_(t.type_), term_ptr_(t.term_ptr_) + { + } + + token_types type() const + { + return type_; + } + + std::shared_ptr> term_ptr() + { + return term_ptr_; + } + + void initialize(const JsonT& context_node) + { + if (term_ptr_.get() != nullptr) + { + term_ptr_->initialize(context_node); + } + } +}; + +template +class token_stream +{ + std::vector>& tokens_; + size_t index_; +public: + token_stream(std::vector>& tokens) + : tokens_(tokens), index_(0) + { + } + + token get() + { + static token done = token(token_types::done); + return index_ < tokens_.size() ? tokens_[index_++] : done; + } + void putback() + { + --index_; + } +}; + +template +bool ampamp(const JsonT& lhs, const JsonT& rhs) +{ + return lhs.as_bool() && rhs.as_bool(); +} + +template +bool pipepipe(const JsonT& lhs, const JsonT& rhs) +{ + return lhs.as_bool() || rhs.as_bool(); +} + +template +bool lt(const JsonT& lhs, const JsonT& rhs) +{ + bool result = false; + if (lhs. template is() && rhs. template is()) + { + result = lhs. template as() < rhs. template as(); + } + else if (lhs. template is() && rhs. template is()) + { + result = lhs. template as() < rhs. template as(); + } + else if ((lhs.is_number() && rhs.is_double()) || (lhs.is_double() && rhs.is_number())) + { + result = lhs.as_double() < rhs.as_double(); + } + else if (lhs.is_string() && rhs.is_string()) + { + result = lhs.as_string() < rhs.as_string(); + } + return result; +} + +template +bool gt(const JsonT& lhs, const JsonT& rhs) +{ + return lt(rhs,lhs); +} + +template +JsonT plus(const JsonT& lhs, const JsonT& rhs) +{ + JsonT result = jsoncons::null_type(); + if (lhs.is_integer() && rhs.is_integer()) + { + result = ((lhs.as_integer() + rhs.as_integer())); + } + else if ((lhs.is_number() && rhs.is_double()) || (lhs.is_double() && rhs.is_number())) + { + result = (lhs.as_double() + rhs.as_double()); + } + else if (lhs.is_uinteger() && rhs.is_uinteger()) + { + result = (lhs.as_uinteger() + rhs.as_uinteger()); + } + return result; +} + +template +JsonT unary_minus(const JsonT& lhs) +{ + JsonT result = jsoncons::null_type(); + if (lhs.is_integer()) + { + result = -lhs.as_integer(); + } + else if (lhs.is_double()) + { + result = -lhs.as_double(); + } + return result; +} + +template +JsonT minus(const JsonT& lhs, const JsonT& rhs) +{ + JsonT result = jsoncons::null_type(); + if (lhs.is_integer() && rhs.is_integer()) + { + result = ((lhs.as_integer() - rhs.as_integer())); + } + else if ((lhs.is_number() && rhs.is_double()) || (lhs.is_double() && rhs.is_number())) + { + result = (lhs.as_double() - rhs.as_double()); + } + else if (lhs.is_uinteger() && rhs.is_uinteger() && lt(rhs,lhs)) + { + result = (lhs.as_uinteger() - rhs.as_uinteger()); + } + return result; +} + +template +class value_term : public term +{ + JsonT value_; +public: + template + value_term(const T& value) + : value_(value) + { + } + + bool accept_single_node() const override + { + return value_.as_bool(); + } + + JsonT evaluate_single_node() const override + { + return value_; + } + + bool exclaim() const override + { + return !value_.as_bool(); + } + + bool eq(const term& rhs) const override + { + return rhs.eq(value_); + } + + bool eq(const JsonT& rhs) const override + { + return value_ == rhs; + } + + bool ne(const term& rhs) const override + { + return rhs.ne(value_); + } + bool ne(const JsonT& rhs) const override + { + return value_ != rhs; + } + bool regex(const term& rhs) const override + { + return rhs.regex2(value_.as_string()); + } + bool ampamp(const term& rhs) const override + { + return rhs.ampamp(value_); + } + bool ampamp(const JsonT& rhs) const override + { + return jsoncons::jsonpath::ampamp(value_,rhs); + } + bool pipepipe(const term& rhs) const override + { + return rhs.pipepipe(value_); + } + bool pipepipe(const JsonT& rhs) const override + { + return jsoncons::jsonpath::pipepipe(value_,rhs); + } + + bool lt(const term& rhs) const override + { + return rhs.gt(value_); + } + + bool lt(const JsonT& rhs) const override + { + return jsoncons::jsonpath::lt(value_,rhs); + } + + bool gt(const term& rhs) const override + { + return rhs.lt(value_); + } + + bool gt(const JsonT& rhs) const override + { + return jsoncons::jsonpath::gt(value_,rhs); + } + + JsonT minus(const term& rhs) const override + { + return jsoncons::jsonpath::plus(rhs.unary_minus(),value_); + } + + JsonT minus(const JsonT& rhs) const override + { + return jsoncons::jsonpath::minus(value_,rhs); + } + + JsonT unary_minus() const override + { + return jsoncons::jsonpath::unary_minus(value_); + } + + JsonT plus(const term& rhs) const override + { + return rhs.plus(value_); + } + + JsonT plus(const JsonT& rhs) const override + { + return jsoncons::jsonpath::plus(value_,rhs); + } +}; + +template +class regex_term : public term +{ + typedef typename JsonT::char_type char_type; + typedef typename JsonT::string_type string_type; + string_type pattern_; + std::regex::flag_type flags_; +public: + regex_term(const string_type& pattern, std::regex::flag_type flags) + : pattern_(pattern), flags_(flags) + { + } + + bool regex2(const string_type& subject) const override + { + std::basic_regex pattern(pattern_, + flags_); + return std::regex_match(subject, pattern); + } +}; + +template +class path_term : public term +{ + typedef typename JsonT::string_type string_type; + + string_type path_; + JsonT nodes_; +public: + path_term(const string_type& path) + : path_(path) + { + } + + void initialize(const JsonT& context_node) override + { + jsonpath_evaluator evaluator; + evaluator.evaluate(context_node,path_); + nodes_ = evaluator.get_values(); + } + + bool accept_single_node() const override + { + return nodes_.size() != 0; + } + + JsonT evaluate_single_node() const override + { + return nodes_.size() == 1 ? nodes_[0] : nodes_; + } + + bool exclaim() const override + { + return nodes_.size() == 0; + } + + bool eq(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.eq(nodes_[i]); + } + } + return result; + } + + bool eq(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = nodes_[i] == rhs; + } + } + return result; + } + + bool ne(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.ne(nodes_[i]); + } + } + return result; + + } + bool ne(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = nodes_[i] != rhs; + } + } + return result; + } + bool regex(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.regex2(nodes_[i].as_string()); + } + } + return result; + } + bool ampamp(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.ampamp(nodes_[i]); + } + } + return result; + } + bool ampamp(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = jsoncons::jsonpath::ampamp(nodes_[i],rhs); + } + } + return result; + } + bool pipepipe(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.pipepipe(nodes_[i]); + } + } + return result; + } + bool pipepipe(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = jsoncons::jsonpath::pipepipe(nodes_[i],rhs); + } + } + return result; + } + + bool lt(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = jsoncons::jsonpath::lt(nodes_[i],rhs); + } + } + return result; + } + + bool lt(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.gt(nodes_[i]); + } + } + return result; + } + + bool gt(const JsonT& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = jsoncons::jsonpath::gt(nodes_[i],rhs); + } + } + return result; + } + + bool gt(const term& rhs) const override + { + bool result = false; + if (nodes_.size() > 0) + { + result = true; + for (size_t i = 0; result && i < nodes_.size(); ++i) + { + result = rhs.lt(nodes_[i]); + } + } + return result; + } + + JsonT minus(const JsonT& rhs) const override + { + return nodes_.size() == 1 ? jsoncons::jsonpath::minus(nodes_[0],rhs) : jsoncons::null_type(); + } + + JsonT minus(const term& rhs) const override + { + + return nodes_.size() == 1 ? jsoncons::jsonpath::plus(rhs.unary_minus(),nodes_[0]) : jsoncons::null_type(); + } + + JsonT unary_minus() const override + { + return nodes_.size() == 1 ? jsoncons::jsonpath::unary_minus(nodes_[0]) : jsoncons::null_type(); + } + + JsonT plus(const JsonT& rhs) const override + { + static auto a_null = jsoncons::null_type(); + return nodes_.size() == 1 ? jsoncons::jsonpath::plus(nodes_[0],rhs) : a_null; + } + + JsonT plus(const term& rhs) const override + { + static auto a_null = jsoncons::null_type(); + return nodes_.size() == 1 ? rhs.plus(nodes_[0]) : a_null; + } +}; + +template +class jsonpath_filter_parser +{ + typedef typename JsonT::string_type string_type; + typedef typename JsonT::char_type char_type; + + size_t& line_; + size_t& column_; + filter_states state_; + string_type buffer_; + std::vector> tokens_; + int depth_; + const char_type* begin_input_; + const char_type* end_input_; + const char_type*& p_; + filter_states pre_line_break_state_; +public: + jsonpath_filter_parser(const char_type** expr, size_t* line,size_t* column) + : line_(*line), column_(*column),p_(*expr) + { + } + + bool exists(const JsonT& context_node) + { + for (auto it=tokens_.begin(); it != tokens_.end(); ++it) + { + it->initialize(context_node); + } + bool result = false; + + token_stream ts(tokens_); + auto e = expression(ts); + result = e->accept_single_node(); + + return result; + } + + JsonT eval(const JsonT& context_node) + { + try + { + for (auto it=tokens_.begin(); it != tokens_.end(); ++it) + { + it->initialize(context_node); + } + + token_stream ts(tokens_); + auto e = expression(ts); + JsonT result = e->evaluate_single_node(); + + return result; + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + } + + std::shared_ptr> primary(token_stream& ts) + { + auto t = ts.get(); + + switch (t.type()) + { + case token_types::left_paren: + { + auto expr = expression(ts); + t = ts.get(); + if (t.type() != token_types::right_paren) + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_expected_right_brace, jsonpath_error_category()),line_,column_); + } + return expr; + } + case token_types::term: + return t.term_ptr(); + case token_types::exclaim: + { + JsonT val = primary(ts)->exclaim(); + auto expr = std::make_shared>(val); + return expr; + } + case token_types::minus: + { + JsonT val = primary(ts)->unary_minus(); + auto expr = std::make_shared>(val); + return expr; + } + default: + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_expected_primary, jsonpath_error_category()),line_,column_); + } + } + + std::shared_ptr> expression(token_stream& ts) + { + auto left = make_term(ts); + auto t = ts.get(); + while (true) + { + switch (t.type()) + { + case token_types::plus: + { + JsonT val = left->plus(*(make_term(ts))); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::minus: + { + JsonT val = left->minus(*(make_term(ts))); + left = std::make_shared>(val); + t = ts.get(); + } + break; + default: + ts.putback(); + return left; + } + } + return left; + } + + std::shared_ptr> make_term(token_stream& ts) + { + auto left = primary(ts); + auto t = ts.get(); + while (true) + { + switch (t.type()) + { + case token_types::eq: + { + bool e = left->eq(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::ne: + { + bool e = left->ne(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::regex: + { + bool e = left->regex(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::ampamp: + { + bool e = left->ampamp(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::pipepipe: + { + bool e = left->pipepipe(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::lt: + { + bool e = left->lt(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::gt: + { + bool e = left->gt(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::lte: + { + bool e = left->lt(*(primary(ts))) || left->eq(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + case token_types::gte: + { + bool e = left->gt(*(primary(ts))) || left->eq(*(primary(ts))); + JsonT val(e); + left = std::make_shared>(val); + t = ts.get(); + } + break; + default: + ts.putback(); + return left; + } + } + } + + void parse(const char_type* expr, size_t length) + { + parse(expr,expr+length); + } + + void parse(const char_type* expr, const char_type* end_expr) + { + p_ = expr; + end_input_ = end_expr; + depth_ = 0; + tokens_.clear(); + state_ = filter_states::start; + bool done = false; + while (!done && p_ < end_input_) + { + switch (state_) + { + case filter_states::cr: + ++line_; + column_ = 1; + switch (*p_) + { + case '\n': + state_ = pre_line_break_state_; + ++p_; + ++column_; + break; + default: + state_ = pre_line_break_state_; + break; + } + break; + case filter_states::lf: + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case filter_states::start: + switch (*p_) + { + case '\r': + case '\n': + pre_line_break_state_ = state_; + state_ = filter_states::lf; + break; + case '(': + state_ = filter_states::expect_path_or_value; + ++depth_; + tokens_.push_back(token(token_types::left_paren)); + break; + case ')': + tokens_.push_back(token(token_types::right_paren)); + if (--depth_ == 0) + { + done = true; + } + break; + } + ++p_; + ++column_; + break; + case filter_states::oper: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '!': + if (p_+1 < end_input_ && *(p_+1) == '=') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::ne)); + } + else + { + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::exclaim)); + } + break; + case '&': + if (p_+1 < end_input_ && *(p_+1) == '&') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::ampamp)); + } + break; + case '|': + if (p_+1 < end_input_ && *(p_+1) == '|') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::pipepipe)); + } + break; + case '=': + if (p_+1 < end_input_ && *(p_+1) == '=') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::eq)); + } + else if (p_+1 < end_input_ && *(p_+1) == '~') + { + ++p_; + ++column_; + state_ = filter_states::expect_regex; + tokens_.push_back(token(token_types::regex)); + } + break; + case '>': + if (p_+1 < end_input_ && *(p_+1) == '=') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::gte)); + } + else + { + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::gt)); + } + break; + case '<': + if (p_+1 < end_input_ && *(p_+1) == '=') + { + ++p_; + ++column_; + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::lte)); + } + else + { + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::lt)); + } + break; + case '+': + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::plus)); + break; + case '-': + state_ = filter_states::expect_path_or_value; + tokens_.push_back(token(token_types::minus)); + break; + case ' ':case '\t': + break; + default: + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter, jsonpath_error_category()),line_,column_); + break; + + } + ++p_; + ++column_; + break; + case filter_states::unquoted_text: + { + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '<': + case '>': + case '!': + case '=': + case '&': + case '|': + case '+': + case '-': + { + if (buffer_.length() > 0) + { + try + { + auto val = JsonT::parse(buffer_); + tokens_.push_back(token(token_types::term,std::make_shared>(val))); + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + buffer_.clear(); + } + state_ = filter_states::oper; + } + break; + case ')': + if (buffer_.length() > 0) + { + try + { + auto val = JsonT::parse(buffer_); + tokens_.push_back(token(token_types::term,std::make_shared>(val))); + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + buffer_.clear(); + } + tokens_.push_back(token(token_types::right_paren)); + if (--depth_ == 0) + { + state_ = filter_states::start; + done = true; + } + else + { + state_ = filter_states::expect_path_or_value; + } + ++p_; + ++column_; + break; + case ' ':case '\t': + if (buffer_.length() > 0) + { + try + { + auto val = JsonT::parse(buffer_); + tokens_.push_back(token(token_types::term,std::make_shared>(val))); + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + buffer_.clear(); + } + ++p_; + ++column_; + break; + default: + buffer_.push_back(*p_); + ++p_; + ++column_; + break; + } + } + break; + case filter_states::single_quoted_text: + { + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '\\': + buffer_.push_back(*p_); + if (p_+1 < end_input_) + { + ++p_; + ++column_; + buffer_.push_back(*p_); + } + break; + case '\'': + buffer_.push_back('\"'); + //if (buffer_.length() > 0) + { + try + { + auto val = JsonT::parse(buffer_); + tokens_.push_back(token(token_types::term,std::make_shared>(val))); + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + buffer_.clear(); + } + state_ = filter_states::expect_path_or_value; + break; + + default: + buffer_.push_back(*p_); + break; + } + } + ++p_; + ++column_; + break; + case filter_states::double_quoted_text: + { + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '\\': + buffer_.push_back(*p_); + if (p_+1 < end_input_) + { + ++p_; + ++column_; + buffer_.push_back(*p_); + } + break; + case '\"': + buffer_.push_back(*p_); + //if (buffer_.length() > 0) + { + try + { + auto val = JsonT::parse(buffer_); + tokens_.push_back(token(token_types::term,std::make_shared>(val))); + } + catch (const parse_exception& e) + { + throw parse_exception(e.code(),line_,column_); + } + buffer_.clear(); + } + state_ = filter_states::expect_path_or_value; + break; + + default: + buffer_.push_back(*p_); + break; + } + } + ++p_; + ++column_; + break; + case filter_states::expect_path_or_value: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '<': + case '>': + case '!': + case '=': + case '&': + case '|': + case '+': + case '-': + state_ = filter_states::oper; + // don't increment + break; + case '@': + buffer_.push_back(*p_); + state_ = filter_states::path; + ++p_; + ++column_; + break; + case ' ':case '\t': + ++p_; + ++column_; + break; + case '\'': + buffer_.push_back('\"'); + state_ = filter_states::single_quoted_text; + ++p_; + ++column_; + break; + case '\"': + buffer_.push_back(*p_); + state_ = filter_states::double_quoted_text; + ++p_; + ++column_; + break; + case '(': + ++depth_; + tokens_.push_back(token(token_types::left_paren)); + ++p_; + ++column_; + break; + case ')': + tokens_.push_back(token(token_types::right_paren)); + if (--depth_ == 0) + { + done = true; + state_ = filter_states::start; + } + ++p_; + ++column_; + break; + default: + // don't increment + state_ = filter_states::unquoted_text; + break; + }; + break; + case filter_states::expect_oper_or_right_round_bracket: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case ' ':case '\t': + break; + case ')': + tokens_.push_back(token(token_types::right_paren)); + if (--depth_ == 0) + { + done = true; + state_ = filter_states::start; + } + break; + case '<': + case '>': + case '!': + case '=': + case '&': + case '|': + case '+': + case '-': + { + state_ = filter_states::oper; + // don't increment p + } + break; + default: + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter, jsonpath_error_category()),line_,column_); + break; + }; + break; + case filter_states::expect_right_round_bracket: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case ' ':case '\t': + break; + case ')': + tokens_.push_back(token(token_types::right_paren)); + if (--depth_ == 0) + { + done = true; + state_ = filter_states::start; + } + else + { + state_ = filter_states::expect_oper_or_right_round_bracket; + } + break; + default: + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter, jsonpath_error_category()),line_,column_); + break; + }; + ++p_; + ++column_; + break; + case filter_states::path: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '<': + case '>': + case '!': + case '=': + case '&': + case '|': + case '+': + case '-': + { + if (buffer_.length() > 0) + { + tokens_.push_back(token(token_types::term,std::make_shared>(buffer_))); + buffer_.clear(); + } + state_ = filter_states::oper; + // don't increment + } + break; + case ')': + if (buffer_.length() > 0) + { + tokens_.push_back(token(token_types::term,std::make_shared>(buffer_))); + tokens_.push_back(token(token_types::right_paren)); + buffer_.clear(); + } + if (--depth_ == 0) + { + state_ = filter_states::start; + done = true; + } + else + { + state_ = filter_states::expect_path_or_value; + } + ++p_; + ++column_; + break; + default: + buffer_.push_back(*p_); + ++p_; + ++column_; + break; + }; + break; + case filter_states::expect_regex: + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '/': + state_ = filter_states::regex; + break; + case ' ':case '\t': + break; + default: + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_expected_slash, jsonpath_error_category()),line_,column_); + break; + }; + ++p_; + ++column_; + break; + case filter_states::regex: + { + switch (*p_) + { + case '\r': + case '\n': + ++line_; + column_ = 1; + state_ = pre_line_break_state_; + break; + case '/': + //if (buffer_.length() > 0) + { + std::regex::flag_type flags = std::regex_constants::ECMAScript; + if (p_+1 < end_input_ && *(p_+1) == 'i') + { + ++p_; + ++column_; + flags |= std::regex_constants::icase; + } + tokens_.push_back(token(token_types::term,std::make_shared>(buffer_,flags))); + buffer_.clear(); + } + state_ = filter_states::expect_path_or_value; + break; + + default: + buffer_.push_back(*p_); + break; + } + } + ++p_; + ++column_; + break; + default: + ++p_; + ++column_; + break; + } + } + if (depth_ != 0) + { + throw parse_exception(std::error_code(jsonpath_parser_errc::invalid_filter_unbalanced_paren, jsonpath_error_category()),line_,column_); + } + } +}; + + +}} +#endif \ No newline at end of file -- cgit v1.2.3 From 2987f964d309366b5a8ea8e480f1596f8ff5a060 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Switch Automatizer over to using jsoncons --- src/include/tome/squelch/automatizer.hpp | 11 +- src/include/tome/squelch/condition.hpp | 90 ++++----- src/include/tome/squelch/rule.hpp | 10 +- src/squelch/automatizer.cc | 25 +-- src/squelch/condition.cc | 323 +++++++++++++++++-------------- src/squelch/rule.cc | 63 +++--- src/squeltch.cc | 87 +++++---- 7 files changed, 319 insertions(+), 290 deletions(-) diff --git a/src/include/tome/squelch/automatizer.hpp b/src/include/tome/squelch/automatizer.hpp index 786ca1ae..4361941a 100644 --- a/src/include/tome/squelch/automatizer.hpp +++ b/src/include/tome/squelch/automatizer.hpp @@ -2,8 +2,8 @@ #include #include +#include #include -#include #include "tome/squelch/rule_fwd.hpp" #include "tome/squelch/cursor_fwd.hpp" @@ -44,15 +44,14 @@ public: bool apply_rules(object_type *o_ptr, int item_idx) const; /** - * Build a JSON data structure to represent - * all the rules. + * Build a JSON document to represent all the rules. */ - std::shared_ptr to_json() const; + jsoncons::json to_json() const; /** - * Load rules from a JSON data structure. + * Load rules from a JSON document. */ - void load_json(json_t *json); + void load_json(jsoncons::json const &); /** * Remove currently selected condition or rule. diff --git a/src/include/tome/squelch/condition.hpp b/src/include/tome/squelch/condition.hpp index 5d1240f5..584ecb0e 100644 --- a/src/include/tome/squelch/condition.hpp +++ b/src/include/tome/squelch/condition.hpp @@ -3,10 +3,10 @@ #include "tome/squelch/condition_fwd.hpp" #include +#include #include #include -#include -#include +#include #include "tome/squelch/cursor_fwd.hpp" #include "tome/squelch/tree_printer_fwd.hpp" @@ -60,7 +60,7 @@ public: } public: - json_t *to_json() const; + jsoncons::json to_json() const; virtual void add_child(ConditionFactory const &factory) { // Default is to not support children. @@ -88,16 +88,16 @@ public: /** * Parse condition from JSON */ - static std::shared_ptr parse_condition(json_t *); + static std::shared_ptr parse_condition(jsoncons::json const &); /** * Convert an (optional) condition to JSON. */ - static json_t *optional_to_json(std::shared_ptr condition); + static jsoncons::json optional_to_json(std::shared_ptr condition); protected: virtual void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const = 0; - virtual void to_json(json_t *) const = 0; + virtual void to_json(jsoncons::json &) const = 0; // What do we want to match? match_type match; @@ -116,12 +116,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: uint8_t m_tval; @@ -140,12 +140,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_name; @@ -164,12 +164,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_contain; @@ -189,12 +189,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: uint8_t m_min; @@ -228,10 +228,10 @@ public: virtual std::shared_ptr next_child(Condition *current) override; // Parse a list of conditions from JSON property - static std::vector< std::shared_ptr > parse_conditions(json_t *); + static std::vector< std::shared_ptr > parse_conditions(jsoncons::json const &); protected: - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; protected: std::vector< std::shared_ptr > m_conditions; @@ -248,7 +248,7 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; @@ -265,7 +265,7 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; @@ -285,12 +285,12 @@ public: public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: status_type m_status; @@ -309,12 +309,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_race; @@ -333,12 +333,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_subrace; @@ -357,12 +357,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_class; @@ -381,12 +381,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: std::string m_inscription; @@ -406,12 +406,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: int m_min; @@ -432,12 +432,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: int m_min; @@ -459,12 +459,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: uint16_t m_skill_idx; @@ -485,12 +485,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: identification_state m_state; @@ -509,12 +509,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: char m_symbol; @@ -533,12 +533,12 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; private: uint16_t m_ability_idx; @@ -563,10 +563,10 @@ public: virtual std::shared_ptr first_child() override; protected: - void to_json(json_t *) const override; + void to_json(jsoncons::json &) const override; static std::shared_ptr parse_single_subcondition( - json_t *condition_json); + jsoncons::json const &condition_json); protected: std::shared_ptr m_subcondition; @@ -584,7 +584,7 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; @@ -603,7 +603,7 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: @@ -623,7 +623,7 @@ public: bool is_match(object_type *) const override; - static std::shared_ptr from_json(json_t *); + static std::shared_ptr from_json(jsoncons::json const &); protected: void write_tree(TreePrinter *, Cursor *, uint8_t, uint8_t) const override; diff --git a/src/include/tome/squelch/rule.hpp b/src/include/tome/squelch/rule.hpp index 63f1b6c0..752a0c2e 100644 --- a/src/include/tome/squelch/rule.hpp +++ b/src/include/tome/squelch/rule.hpp @@ -1,7 +1,7 @@ #pragma once -#include #include +#include #include "tome/squelch/condition_fwd.hpp" #include "tome/squelch/cursor_fwd.hpp" @@ -75,14 +75,14 @@ public: bool apply_rule(object_type *o_ptr, int item_idx) const; /** - * Convert rule to JSON + * Convert rule to JSON. */ - virtual json_t *to_json() const; + virtual jsoncons::json to_json() const; /** * Parse rule from JSON */ - static std::shared_ptr parse_rule(json_t *); + static std::shared_ptr parse_rule(jsoncons::json const &); protected: virtual bool do_apply_rule(object_type *, int) const = 0; @@ -148,7 +148,7 @@ public: , m_inscription(inscription) { } - json_t *to_json() const override; + jsoncons::json to_json() const override; protected: virtual void do_write_tree(TreePrinter *p) const override; diff --git a/src/squelch/automatizer.cc b/src/squelch/automatizer.cc index c3c52b1b..2f177ef9 100644 --- a/src/squelch/automatizer.cc +++ b/src/squelch/automatizer.cc @@ -12,20 +12,21 @@ namespace squelch { /** * Parse rules from JSON array */ -static std::vector< std::shared_ptr < Rule > > parse_rules(json_t *rules_j) +static std::vector< std::shared_ptr < Rule > > parse_rules(jsoncons::json const &rules_json) { std::vector< std::shared_ptr < Rule > > rules; - if (!json_is_array(rules_j)) + if (!rules_json.is_array()) { msg_format("Error 'rules' is not an array"); return rules; } - for (size_t i = 0; i < json_array_size(rules_j); i++) + auto rules_array = rules_json.array_value(); + + for (auto const &rule_value : rules_array) { - json_t *rule_j = json_array_get(rules_j, i); - auto rule = Rule::parse_rule(rule_j); + auto rule = Rule::parse_rule(rule_value); if (rule) { rules.push_back(rule); @@ -63,25 +64,25 @@ bool Automatizer::apply_rules(object_type *o_ptr, int item_idx) const return false; } -std::shared_ptr Automatizer::to_json() const +jsoncons::json Automatizer::to_json() const { - auto rules_json = std::shared_ptr(json_array(), &json_decref); + auto document = jsoncons::json::array(); for (auto rule : m_rules) { - json_array_append_new(rules_json.get(), rule->to_json()); + document.push_back(rule->to_json()); } - return rules_json; + return document; } -void Automatizer::load_json(json_t *json) +void Automatizer::load_json(jsoncons::json const &document) { // Go through all the found rules - auto rules = parse_rules(json); + auto rules = parse_rules(document); // Load rule - for (auto rule : rules) + for (auto rule: rules) { append_rule(rule); } diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 9e93016e..e7429cab 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -57,12 +57,15 @@ EnumStringMap &identification_state_mapping() return *m; } -json_t *Condition::to_json() const +jsoncons::json Condition::to_json() const { - json_t *j = json_object(); - json_object_set_new(j, "type", - json_string(match_mapping().stringify(match))); + // Start with an object with only 'type' property + jsoncons::json j; + j["type"] = match_mapping().stringify(match); + + // Add sub-class properties to_json(j); + // Return the completed JSON return j; } @@ -85,11 +88,11 @@ void Condition::display(TreePrinter *tree_printer, Cursor *cursor) const tree_printer->dedent(); } -std::shared_ptr Condition::parse_condition(json_t *condition_json) +std::shared_ptr Condition::parse_condition(jsoncons::json const &condition_json) { // Parsers for concrete types of conditions. static std::map< match_type, - std::function< std::shared_ptr< Condition > ( json_t * ) > > parsers { + std::function(jsoncons::json const &)>> parsers { { match_type::AND, &AndCondition::from_json }, { match_type::OR, &OrCondition::from_json }, { match_type::NOT, &NotCondition::from_json }, @@ -111,15 +114,13 @@ std::shared_ptr Condition::parse_condition(json_t *condition_json) { match_type::SKILL, &SkillCondition::from_json }, { match_type::ABILITY, &AbilityCondition::from_json } }; - if ((condition_json == nullptr) || json_is_null(condition_json)) + if (condition_json.is_null()) { return nullptr; } - cptr type_s = nullptr; - if (json_unpack(condition_json, - "{s:s}", - "type", &type_s) < 0) + cptr type_s = condition_json.get("type").as(); + if (!type_s) { msg_print("Missing/invalid 'type' in condition"); return nullptr; @@ -143,11 +144,11 @@ std::shared_ptr Condition::parse_condition(json_t *condition_json) return nullptr; } -json_t *Condition::optional_to_json(std::shared_ptr condition) +jsoncons::json Condition::optional_to_json(std::shared_ptr condition) { return condition ? condition->to_json() - : json_null(); + : jsoncons::json::null_type(); } bool TvalCondition::is_match(object_type *o_ptr) const @@ -155,22 +156,23 @@ bool TvalCondition::is_match(object_type *o_ptr) const return (o_ptr->tval == m_tval); } -std::shared_ptr TvalCondition::from_json(json_t *j) +std::shared_ptr TvalCondition::from_json(jsoncons::json const &j) { - int tval; - - if (json_unpack(j, "{s:i}", "tval", &tval) < 0) + auto tval_j = j.get("tval"); + if (!tval_j.is_uinteger()) { msg_print("Missing/invalid 'tval' property"); return nullptr; } + int tval = tval_j.as_uint(); + return std::make_shared(tval); } -void TvalCondition::to_json(json_t *j) const +void TvalCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "tval", json_integer(m_tval)); + j["tval"] = m_tval; } void TvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const @@ -192,14 +194,16 @@ bool NameCondition::is_match(object_type *o_ptr) const return boost::algorithm::iequals(m_name, buf1); } -std::shared_ptr NameCondition::from_json(json_t *j) +std::shared_ptr NameCondition::from_json(jsoncons::json const &j) { - cptr s = nullptr; - if (json_unpack(j, "{s:s}", "name", &s) < 0) + cptr s = j.get("name").as(); + + if (!s) { msg_print("Missing/invalid 'name' property"); return nullptr; } + return std::make_shared(s); } @@ -213,9 +217,9 @@ void NameCondition::write_tree(TreePrinter *p, Cursor *cursor, uint8_t ecol, uin p->write(TERM_WHITE, "\n"); } -void NameCondition::to_json(json_t *j) const +void NameCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "name", json_string(m_name.c_str())); + j["name"] = m_name; } bool ContainCondition::is_match(object_type *o_ptr) const @@ -225,14 +229,16 @@ bool ContainCondition::is_match(object_type *o_ptr) const return boost::algorithm::icontains(buf1, m_contain); } -std::shared_ptr ContainCondition::from_json(json_t *j) +std::shared_ptr ContainCondition::from_json(jsoncons::json const &j) { - cptr s = nullptr; - if (json_unpack(j, "{s:s}", "contain", &s) < 0) + cptr s = j.get("contain").as(); + + if (!s) { msg_print("Missing/invalid 'contain' property"); return nullptr; } + return std::make_shared(s); } @@ -246,9 +252,9 @@ void ContainCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_ p->write(TERM_WHITE, "\n"); } -void ContainCondition::to_json(json_t *j) const +void ContainCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "contain", json_string(m_contain.c_str())); + j["contain"] = m_contain; } bool SvalCondition::is_match(object_type *o_ptr) const @@ -258,19 +264,25 @@ bool SvalCondition::is_match(object_type *o_ptr) const (o_ptr->sval <= m_max)); } -std::shared_ptr SvalCondition::from_json(json_t *j) +std::shared_ptr SvalCondition::from_json(jsoncons::json const &j) { - int min, max; + auto min_j = j.get("min"); + if (!min_j.is_uinteger()) + { + msg_print("Missing/invalid 'min' property"); + return nullptr; + } - if (json_unpack(j, "{s:i,s:i}", - "min", &min, - "max", &max) < 0) + auto max_j = j.get("max"); + if (!max_j.is_uinteger()) { - msg_print("Missing/invalid 'min'/'max' properties"); + msg_print("Missing/invalid 'max' property"); return nullptr; } - return std::make_shared(min, max); + return std::make_shared( + min_j.as_uint(), + max_j.as_uint()); } void SvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const @@ -284,10 +296,10 @@ void SvalCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t b p->write(TERM_WHITE, "\n"); } -void SvalCondition::to_json(json_t *j) const +void SvalCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "min", json_integer(m_min)); - json_object_set_new(j, "max", json_integer(m_max)); + j["min"] = m_min; + j["max"] = m_max; } void GroupingCondition::add_child(ConditionFactory const &factory) @@ -369,16 +381,15 @@ std::shared_ptr GroupingCondition::next_child(Condition *current) return nullptr; } -std::vector< std::shared_ptr > GroupingCondition::parse_conditions(json_t *j) +std::vector< std::shared_ptr > GroupingCondition::parse_conditions(jsoncons::json const &j) { - json_t *conditions_j = json_object_get(j, "conditions"); + auto conditions_j = j.get("conditions"); - if ((conditions_j == nullptr) || - (json_is_null(conditions_j))) + if (conditions_j.is_null()) { return std::vector< std::shared_ptr >(); } - else if (!json_is_array(conditions_j)) + else if (!conditions_j.is_array()) { msg_print("'conditions' property has invalid type"); return std::vector< std::shared_ptr >(); @@ -386,11 +397,8 @@ std::vector< std::shared_ptr > GroupingCondition::parse_conditions(js else { std::vector< std::shared_ptr > subconditions; - for (size_t i = 0; i < json_array_size(conditions_j); i++) + for (auto const &subcondition_j: conditions_j.array_value()) { - json_t *subcondition_j = - json_array_get(conditions_j, i); - std::shared_ptr subcondition = parse_condition(subcondition_j); @@ -403,14 +411,16 @@ std::vector< std::shared_ptr > GroupingCondition::parse_conditions(js } } -void GroupingCondition::to_json(json_t *j) const +void GroupingCondition::to_json(jsoncons::json &j) const { - json_t *ja = json_array(); + // Put all the sub-conditions into an array + jsoncons::json::array ja; for (auto condition_p : m_conditions) { - json_array_append_new(ja, optional_to_json(condition_p)); + ja.push_back(optional_to_json(condition_p)); } - json_object_set_new(j, "conditions", ja); + // Add to JSON object + j["conditions"] = ja; } bool AndCondition::is_match(object_type *o_ptr) const @@ -425,7 +435,7 @@ bool AndCondition::is_match(object_type *o_ptr) const return true; } -std::shared_ptr AndCondition::from_json(json_t *j) +std::shared_ptr AndCondition::from_json(jsoncons::json const &j) { auto condition = std::make_shared(); for (auto subcondition : parse_conditions(j)) @@ -458,7 +468,7 @@ bool OrCondition::is_match(object_type *o_ptr) const return false; } -std::shared_ptr OrCondition::from_json(json_t *j) +std::shared_ptr OrCondition::from_json(jsoncons::json const &j) { std::shared_ptr condition = std::make_shared(); @@ -487,10 +497,11 @@ bool StatusCondition::is_match(object_type *o_ptr) const return m_status == object_status(o_ptr); } -std::shared_ptr StatusCondition::from_json(json_t *j) +std::shared_ptr StatusCondition::from_json(jsoncons::json const &j) { - cptr s; - if (json_unpack(j, "{s:s}", "status", &s) < 0) + cptr s = j.get("status").as(); + + if (!s) { msg_print("Missing/invalid 'status' property"); return nullptr; @@ -517,9 +528,9 @@ void StatusCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void StatusCondition::to_json(json_t *j) const +void StatusCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "status", json_string(status_mapping().stringify(m_status))); + j["status"] = status_mapping().stringify(m_status); } bool RaceCondition::is_match(object_type *o_ptr) const @@ -527,11 +538,11 @@ bool RaceCondition::is_match(object_type *o_ptr) const return boost::algorithm::iequals(m_race, rp_ptr->title); } -std::shared_ptr RaceCondition::from_json(json_t *j) +std::shared_ptr RaceCondition::from_json(jsoncons::json const &j) { - cptr s; + cptr s = j.get("race").as(); - if (json_unpack(j, "{s:s}", "race", &s) < 0) + if (!s) { msg_print("Missing/invalid 'race' property"); return nullptr; @@ -551,9 +562,9 @@ void RaceCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t b p->write(TERM_WHITE, "\n"); } -void RaceCondition::to_json(json_t *j) const +void RaceCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "race", json_string(m_race.c_str())); + j["race"] = m_race; } bool SubraceCondition::is_match(object_type *o_ptr) const @@ -561,11 +572,11 @@ bool SubraceCondition::is_match(object_type *o_ptr) const return boost::algorithm::iequals(m_subrace, rmp_ptr->title); } -std::shared_ptr SubraceCondition::from_json(json_t *j) +std::shared_ptr SubraceCondition::from_json(jsoncons::json const &j) { - cptr s; + cptr s = j.get("subrace").as(); - if (json_unpack(j, "{s:s}", "subrace", &s) < 0) + if (!s) { msg_print("Missing/invalid 'subrace' property"); return nullptr; @@ -585,9 +596,9 @@ void SubraceCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_ p->write(TERM_WHITE, "\n"); } -void SubraceCondition::to_json(json_t *j) const +void SubraceCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "subrace", json_string(m_subrace.c_str())); + j["subrace"] = m_subrace; } bool ClassCondition::is_match(object_type *o_ptr) const @@ -595,11 +606,11 @@ bool ClassCondition::is_match(object_type *o_ptr) const return boost::algorithm::iequals(m_class, spp_ptr->title); } -std::shared_ptr ClassCondition::from_json(json_t *j) +std::shared_ptr ClassCondition::from_json(jsoncons::json const &j) { - cptr s; + cptr s = j.get("class").as(); - if (json_unpack(j, "{s:s}", "class", &s) < 0) + if (!s) { msg_print("Missing/invalid 'class' property"); return nullptr; @@ -619,9 +630,9 @@ void ClassCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void ClassCondition::to_json(json_t *j) const +void ClassCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "class", json_string(m_class.c_str())); + j["class"] = m_class; } bool InscriptionCondition::is_match(object_type *o_ptr) const @@ -631,14 +642,16 @@ bool InscriptionCondition::is_match(object_type *o_ptr) const m_inscription); } -std::shared_ptr InscriptionCondition::from_json(json_t *j) +std::shared_ptr InscriptionCondition::from_json(jsoncons::json const &j) { - cptr s = nullptr; - if (json_unpack(j, "{s:s}", "inscription", &s) < 0) + cptr s = j.get("inscription").as(); + + if (!s) { msg_print("Missing/invalid 'inscription' property"); return nullptr; } + return std::make_shared(s); } @@ -653,9 +666,9 @@ void InscriptionCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, ui p->write(TERM_WHITE, "\n"); } -void InscriptionCondition::to_json(json_t *j) const +void InscriptionCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "inscription", json_string(m_inscription.c_str())); + j["inscription"] = m_inscription; } bool DiscountCondition::is_match(object_type *o_ptr) const @@ -665,17 +678,23 @@ bool DiscountCondition::is_match(object_type *o_ptr) const (o_ptr->discount <= m_max)); } -std::shared_ptr DiscountCondition::from_json(json_t *j) +std::shared_ptr DiscountCondition::from_json(jsoncons::json const &j) { - int min, max; + auto min_j = j.get("min"); + if (!min_j.is_integer()) + { + msg_print("Missing/invalid 'min' property"); + return nullptr; + } + int min = min_j.as_int(); - if (json_unpack(j, "{s:i,s:i}", - "min", &min, - "max", &max) < 0) + auto max_j = j.get("max"); + if (!max_j.is_integer()) { - msg_print("Missing/invalid 'min'/'max' properties"); + msg_print("Missing/invalid 'max' property"); return nullptr; } + int max = max_j.as_int(); return std::make_shared(min, max); } @@ -691,10 +710,10 @@ void DiscountCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8 p->write(TERM_WHITE, "\n"); } -void DiscountCondition::to_json(json_t *j) const +void DiscountCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "min", json_integer(m_min)); - json_object_set_new(j, "max", json_integer(m_max)); + j["min"] = m_min; + j["max"] = m_max; } bool LevelCondition::is_match(object_type *) const @@ -703,16 +722,23 @@ bool LevelCondition::is_match(object_type *) const (p_ptr->lev <= m_max)); } -std::shared_ptr LevelCondition::from_json(json_t *j) +std::shared_ptr LevelCondition::from_json(jsoncons::json const &j) { - int min, max; - if (json_unpack(j, "{s:i,s:i}", - "min", &min, - "max", &max) < 0) + auto min_j = j.get("min"); + if (!min_j.is_integer()) { - msg_print("Missing/invalid 'min'/'max' properties"); + msg_print("Missing/invalid 'min' property"); return nullptr; } + int min = min_j.as_int(); + + auto max_j = j.get("max"); + if (!max_j.is_integer()) + { + msg_print("Missing/invalid 'max' property"); + return nullptr; + } + int max = max_j.as_int(); return std::make_shared(min, max); } @@ -729,10 +755,10 @@ void LevelCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void LevelCondition::to_json(json_t *j) const +void LevelCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "min", json_integer(m_min)); - json_object_set_new(j, "max", json_integer(m_max)); + j["min"] = m_min; + j["max"] = m_max; } bool SkillCondition::is_match(object_type *) const @@ -742,16 +768,28 @@ bool SkillCondition::is_match(object_type *) const (sk <= m_max)); } -std::shared_ptr SkillCondition::from_json(json_t *j) +std::shared_ptr SkillCondition::from_json(jsoncons::json const &j) { - cptr s; - int min, max; - if (json_unpack(j, "{s:i,s:i,s:s}", - "min", &min, - "max", &max, - "name", &s) < 0) + auto min_j = j.get("min"); + if (!min_j.is_integer()) + { + msg_print("Missing/invalid 'min' property"); + return nullptr; + } + int min = min_j.as_int(); + + auto max_j = j.get("max"); + if (!max_j.is_integer()) { - msg_print("Missing/invalid 'min'/'max'/'name' properties"); + msg_print("Missing/invalid 'max' property"); + return nullptr; + } + int max = max_j.as_int(); + + auto s = j.get("name").as(); + if (!s) + { + msg_print("Missing/invalid 'name' property"); return nullptr; } @@ -776,14 +814,11 @@ void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void SkillCondition::to_json(json_t *j) const +void SkillCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "name", - json_string(s_descriptors[m_skill_idx].name)); - json_object_set_new(j, "min", - json_integer(m_min)); - json_object_set_new(j, "max", - json_integer(m_max)); + j["name"] = s_descriptors[m_skill_idx].name; + j["min"] = m_min; + j["max"] = m_max; } bool StateCondition::is_match(object_type *o_ptr) const @@ -800,10 +835,11 @@ bool StateCondition::is_match(object_type *o_ptr) const return false; } -std::shared_ptr StateCondition::from_json(json_t *j) +std::shared_ptr StateCondition::from_json(jsoncons::json const &j) { - cptr s; - if (json_unpack(j, "{s:s}", "state", &s) < 0) + cptr s = j.get("state").as(); + + if (!s) { msg_print("Missing/invalid 'state' property"); return nullptr; @@ -830,11 +866,9 @@ void StateCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void StateCondition::to_json(json_t *j) const +void StateCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "state", - json_string(identification_state_mapping(). - stringify(m_state))); + j["state"] = identification_state_mapping().stringify(m_state); } bool SymbolCondition::is_match(object_type *o_ptr) const @@ -843,21 +877,16 @@ bool SymbolCondition::is_match(object_type *o_ptr) const return k_ptr->d_char == m_symbol; } -std::shared_ptr SymbolCondition::from_json(json_t *j) +std::shared_ptr SymbolCondition::from_json(jsoncons::json const &j) { - cptr s_ = nullptr; - if (json_unpack(j, "{s:s}", "symbol", &s_) < 0) - { - msg_print("Missing/invalid 'symbol' property"); - return nullptr; - } + auto s = j.get("symbol").as(); - std::string s(s_); if (s.empty()) { - msg_print("Invalid 'symbol' property: Too short"); + msg_print("Missing/invalid 'symbol' property"); return nullptr; } + if (s.size() > 1) { msg_print("Invalid 'symbol' property: Too long"); @@ -878,10 +907,9 @@ void SymbolCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t p->write(TERM_WHITE, "\n"); } -void SymbolCondition::to_json(json_t *j) const +void SymbolCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "symbol", - json_string(format("%c", m_symbol))); + j["symbol"] = format("%c", m_symbol); } bool AbilityCondition::is_match(object_type *) const @@ -889,10 +917,11 @@ bool AbilityCondition::is_match(object_type *) const return p_ptr->has_ability(m_ability_idx); } -std::shared_ptr AbilityCondition::from_json(json_t *j) +std::shared_ptr AbilityCondition::from_json(jsoncons::json const &j) { - cptr a; - if (json_unpack(j, "{s:s}", "ability", &a) < 0) + cptr a = j.get("ability").as(); + + if (!a) { msg_print("Missing/invalid 'ability' property"); return nullptr; @@ -918,10 +947,9 @@ void AbilityCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_ p->write(TERM_WHITE, "\n"); } -void AbilityCondition::to_json(json_t *j) const +void AbilityCondition::to_json(jsoncons::json &j) const { - cptr ability_s = ab_info[m_ability_idx].name; - json_object_set_new(j, "ability", json_string(ability_s)); + j["ability"] = ab_info[m_ability_idx].name; } void SingleSubconditionCondition::add_child(std::function< std::shared_ptr () > const &factory) @@ -946,23 +974,20 @@ std::shared_ptr SingleSubconditionCondition::first_child() return m_subcondition; } -void SingleSubconditionCondition::to_json(json_t *j) const +void SingleSubconditionCondition::to_json(jsoncons::json &j) const { - json_object_set_new(j, "condition", - optional_to_json(m_subcondition)); + j["condition"] = optional_to_json(m_subcondition); } -std::shared_ptr SingleSubconditionCondition::parse_single_subcondition(json_t *in_json) +std::shared_ptr SingleSubconditionCondition::parse_single_subcondition(jsoncons::json const &in_json) { - json_t *condition_j = - json_object_get(in_json, "condition"); + auto condition_j = in_json.get("condition"); - if ((condition_j == nullptr) || - (json_is_null(condition_j))) + if (condition_j.is_null()) { return nullptr; } - else if (!json_is_object(condition_j)) + else if (!condition_j.is_object()) { msg_format("Invalid 'condition' property"); return nullptr; @@ -983,7 +1008,7 @@ bool NotCondition::is_match(object_type *o_ptr) const return !m_subcondition->is_match(o_ptr); } -std::shared_ptr NotCondition::from_json(json_t *j) +std::shared_ptr NotCondition::from_json(jsoncons::json const &j) { return std::make_shared(parse_single_subcondition(j)); } @@ -1016,7 +1041,7 @@ bool InventoryCondition::is_match(object_type *) const return false; } -std::shared_ptr InventoryCondition::from_json(json_t *j) +std::shared_ptr InventoryCondition::from_json(jsoncons::json const &j) { return std::make_shared( parse_single_subcondition(j)); @@ -1052,7 +1077,7 @@ bool EquipmentCondition::is_match(object_type *) const return false; } -std::shared_ptr EquipmentCondition::from_json(json_t *j) +std::shared_ptr EquipmentCondition::from_json(jsoncons::json const &j) { return std::make_shared( parse_single_subcondition(j)); diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc index 223cf6d3..50a771ae 100644 --- a/src/squelch/rule.cc +++ b/src/squelch/rule.cc @@ -41,22 +41,16 @@ std::shared_ptr Rule::get_condition() const return m_condition; } -json_t *Rule::to_json() const +jsoncons::json Rule::to_json() const { - json_t *rule_json = json_object(); - json_object_set_new(rule_json, - "name", - json_string(m_name.c_str())); - json_object_set_new(rule_json, - "action", - json_string(action_mapping().stringify(m_action))); - json_object_set_new(rule_json, - "module", - json_string(modules[m_module_idx].meta.name)); - json_object_set_new(rule_json, - "condition", - Condition::optional_to_json(m_condition)); - return rule_json; + jsoncons::json j; + + j["name"] = jsoncons::json::string_type(m_name); + j["action"] = action_mapping().stringify(m_action); + j["module"] = modules[m_module_idx].meta.name; + j["condition"] = Condition::optional_to_json(m_condition); + + return j; } void Rule::add_new_condition(Cursor *cursor, @@ -138,23 +132,19 @@ bool Rule::apply_rule(object_type *o_ptr, int item_idx) const return false; } -std::shared_ptr Rule::parse_rule(json_t *rule_json) +std::shared_ptr Rule::parse_rule(jsoncons::json const &rule_json) { - if (!json_is_object(rule_json)) + if (!rule_json.is_object()) { msg_print("Rule is not an object"); return nullptr; } // Retrieve the attributes - char *rule_name_s = nullptr; - char *rule_action_s = nullptr; - char *rule_module_s = nullptr; - if (json_unpack(rule_json, - "{s:s,s:s,s:s}", - "name", &rule_name_s, - "action", &rule_action_s, - "module", &rule_module_s) < 0) + char const *rule_name_s = rule_json.get("name").as(); + char const *rule_action_s = rule_json.get("action").as(); + char const *rule_module_s = rule_json.get("module").as(); + if ((!rule_name_s) || (!rule_action_s) || (!rule_module_s)) { msg_print("Rule missing required field(s)"); return nullptr; @@ -178,28 +168,29 @@ std::shared_ptr Rule::parse_rule(json_t *rule_json) // Parse condition std::shared_ptr condition = - Condition::parse_condition(json_object_get(rule_json, "condition")); + Condition::parse_condition(rule_json.get("condition")); // Parse rule switch (action) { case action_type::AUTO_INSCRIBE: { - json_t *rule_inscription_j = json_object_get(rule_json, "inscription"); + auto rule_inscription_j = rule_json.get("inscription"); - if (rule_inscription_j == nullptr) + if (rule_inscription_j.is_null()) { msg_print("Inscription rule missing 'inscription' attribute"); return nullptr; } - if (!json_is_string(rule_inscription_j)) + + if (!rule_inscription_j.is_string()) { msg_print("Inscription rule 'inscription' attribute wrong type"); return nullptr; } - std::string inscription = - json_string_value(rule_inscription_j); + std::string inscription = rule_inscription_j.as(); + return std::make_shared( rule_name_s, module_idx, condition, inscription); } @@ -290,14 +281,10 @@ bool PickUpRule::do_apply_rule(object_type *o_ptr, int item_idx) const return true; } -json_t *InscribeRule::to_json() const +jsoncons::json InscribeRule::to_json() const { - json_t *j = Rule::to_json(); - - json_object_set_new(j, - "inscription", - json_string(m_inscription.c_str())); - + jsoncons::json j; + j["inscription"] = m_inscription; return j; } diff --git a/src/squeltch.cc b/src/squeltch.cc index 69c25dfd..eed3bf1b 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -30,11 +30,10 @@ #include "variable.h" #include "variable.hpp" -#include #include -#include #include #include +#include #include #include @@ -182,14 +181,28 @@ static void automatizer_save_rules() return; } + // Function for showing a message + auto show_message = [hgt, wid](std::string text) { + auto n = std::max(text.size(), 28); + while (text.size() < n) + { + text += ' '; + } + c_put_str(TERM_WHITE, text.c_str(), hgt/2, wid/2 - 14); + }; + + // Function for showing an error message + auto error = [show_message]() { + show_message("Saving rules FAILED!"); + inkey(); + }; + // Build the filename path_build(buf, 1024, ANGBAND_DIR_USER, name); if (file_exist(buf)) { - c_put_str(TERM_WHITE, "File exists, continue?[y/n]", - hgt / 2, - wid / 2 - 14); + show_message("File exists, continue? [y/n]"); ch = inkey(); if ((ch != 'Y') && (ch != 'y')) { @@ -197,29 +210,32 @@ static void automatizer_save_rules() } } - // Write to file - { - auto rules_json = automatizer->to_json(); + // Pretty-printing options + jsoncons::output_format format; + format.indent(2); - int status = json_dump_file(rules_json.get(), buf, - JSON_INDENT(2) | - JSON_SORT_KEYS); - if (status == 0) - { - c_put_str(TERM_WHITE, "Saved rules in file ", - hgt / 2, - wid / 2 - 14); - } - else - { - c_put_str(TERM_WHITE, "Saving rules failed! ", - hgt / 2, - wid / 2 - 14); - } + // Convert to a JSON document + auto rules_document = automatizer->to_json(); - // Wait for keypress - inkey(); + // Open output stream + std::ofstream of(buf, std::ios_base::out | std::ios_base::binary); + if (of.fail()) + { + error(); + return; } + + // Write JSON to output + of << jsoncons::pretty_print(rules_document, format); + if (of.fail()) + { + error(); + return; + } + + // Success + show_message("Saved rules in file"); + inkey(); } static void rename_rule(Rule *rule) @@ -574,20 +590,21 @@ bool automatizer_load(boost::filesystem::path const &path) return false; // Not fatal; just skip } - // Parse file - json_error_t error; - std::shared_ptr rules_json( - json_load_file(path.c_str(), 0, &error), - &json_decref); - if (rules_json == nullptr) + // Parse into memory + jsoncons::json rules_json; + try + { + rules_json = jsoncons::json::parse_file(path.string()); + } + catch (jsoncons::json_exception const &exc) { msg_format("Error parsing automatizer rules from '%s'.", path.c_str()); - msg_format("Line %d, Column %d", error.line, error.column); - msg_print(nullptr); + msg_print(exc.what()); return false; } - // Load rules - automatizer->load_json(rules_json.get()); + // We didn't return directly via an exception, so let's extract + // the rules. + automatizer->load_json(rules_json); return true; } -- cgit v1.2.3 From bdcb28714dfaa042785f34b2042d612d7a2744e5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove requirement for jansson --- CMakeLists.txt | 11 ----------- README.md | 2 -- 2 files changed, 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b804357..43cea2c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,17 +43,6 @@ ENDIF() # Add standard math library SET(LIBS ${LIBS} m) -# -# JSON support -# -PKG_CHECK_MODULES(JANSSON REQUIRED jansson) -IF(JANSSON_FOUND) - ADD_DEFINITIONS(${JANSSON_CFLAGS}) - INCLUDE_DIRECTORIES(${JANSSON_INCLUDE_DIRS}) - LINK_DIRECTORIES(${JANSSON_LIBRARY_DIRS}) - SET(LIBS ${LIBS} ${JANSSON_LIBRARIES}) -ENDIF() - # # BOOST # diff --git a/README.md b/README.md index b61fd0b1..9ab5b368 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ See below for specific distribution-specific hints, if needed. You will need to have the following libraries installed on your system somewhere where CMake can find them: -- [jansson](http://www.digip.org/jansson/) - [Boost](https://www.boost.org/) Version requirements may vary somewhat, but usually you should be @@ -59,7 +58,6 @@ To compile on an Ubuntu install, you'll need at least the - `cmake` - `build-essential` -- `libjansson-dev` - `libboost-all-dev` packages. -- cgit v1.2.3 From 500324e97a02ad8dcee869e334e81455653f46bf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Add kdevelop "files" to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c3a196db..3870f443 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea +*.kdev4 *.o lib*.a *.~* @@ -11,4 +12,5 @@ install_manifest.txt Makefile compile_commands.json /nbproject +/build tome2.cbp -- cgit v1.2.3 From d8de8c129fb9fc8d2110f39108949d7025456151 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove dead code --- src/init1.cc | 2 -- src/randart.cc | 20 -------------------- src/randart.hpp | 1 - src/variable.cc | 7 ------- 4 files changed, 30 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index fa99031f..012537ce 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -43,7 +43,6 @@ #include "store_action_type.hpp" #include "store_flag.hpp" #include "store_info_type.hpp" -#include "store_type.hpp" #include "tables.hpp" #include "town_type.hpp" #include "trap_type.hpp" @@ -53,7 +52,6 @@ #include "variable.h" #include "variable.hpp" #include "vault_type.hpp" -#include "wilderness_map.hpp" #include "wilderness_type_info.hpp" #include "z-rand.hpp" diff --git a/src/randart.cc b/src/randart.cc index 7a6b2398..698be95b 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -26,10 +26,8 @@ #include /* Chance of using syllables to form the name instead of the "template" files */ -#define TABLE_NAME 45 #define A_CURSED 13 #define WEIRD_LUCK 12 -#define ACTIVATION_CHANCE 3 /* * Attempt to add a power to a randart @@ -115,24 +113,6 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m return (ret); } -void give_activation_power (object_type * o_ptr) -{ - o_ptr->xtra2 = 0; - o_ptr->art_flags &= ~TR_ACTIVATE; - o_ptr->timeout = 0; -} - - -int get_activation_power() -{ - object_type *o_ptr, forge; - - o_ptr = &forge; - - give_activation_power(o_ptr); - - return o_ptr->xtra2; -} #define MIN_NAME_LEN 5 #define MAX_NAME_LEN 9 diff --git a/src/randart.hpp b/src/randart.hpp index 31b70f08..385ee2a5 100644 --- a/src/randart.hpp +++ b/src/randart.hpp @@ -3,7 +3,6 @@ #include "h-basic.h" #include "object_type_fwd.hpp" -extern int get_activation_power(void); extern void build_prob(cptr learn); extern bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name); extern bool_ artifact_scroll(void); diff --git a/src/variable.cc b/src/variable.cc index f3defc5d..777c2b17 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -277,13 +277,6 @@ bool_ *macro__cmd; char *macro__buf; -/* - * The array of normal options - */ -u32b option_flag[8]; -u32b option_mask[8]; - - /* * The array of window options */ -- cgit v1.2.3 From 561276dc17514fc130b67953b06a3498d6ce23af Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Use cbegin() instead of begin() in uniform_element() --- src/z-rand.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/z-rand.hpp b/src/z-rand.hpp index 235b9503..b04523c3 100644 --- a/src/z-rand.hpp +++ b/src/z-rand.hpp @@ -91,7 +91,7 @@ s32b rand_spread(s32b a, s32b d); **/ template typename C::const_iterator uniform_element(C const &c) { - return c.begin() + rand_int(c.size()); + return c.cbegin() + rand_int(c.size()); } /** -- cgit v1.2.3 From db827140e1c87342a4534d71d1681d0d6e375d3c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move initialization of Game earlier --- src/init2.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 9d2a9d84..1438ed60 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -1137,6 +1137,9 @@ void init_angband(void) char buf[1024]; + // Initialize game structure + game = new Game(); + /* Init some VERY basic stuff, like macro arrays */ init_basic(); @@ -1246,9 +1249,6 @@ void init_angband(void) /* Close it */ (void)fd_close(fd); - // Initialize game structure - game = new Game(); - /*** Initialise some arrays ***/ /* Initialise misc. values */ -- cgit v1.2.3 From 4d51094236b79b5d525c771d6cd3d990b9e64df8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Add GameEditData struct to contain *_info arrays --- src/game.hpp | 12 +++++++----- src/game_edit_data.hpp | 9 +++++++++ src/game_edit_data_fwd.hpp | 3 +++ 3 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 src/game_edit_data.hpp create mode 100644 src/game_edit_data_fwd.hpp diff --git a/src/game.hpp b/src/game.hpp index b4894fd6..5da479c9 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -1,6 +1,8 @@ #pragma once #include "game_fwd.hpp" + +#include "game_edit_data.hpp" #include "grid.hpp" #include "h-basic.h" #include "player_defs.hpp" @@ -23,9 +25,9 @@ struct Game { */ std::array player_hp { }; -}; + /** + * Game edit data + */ + GameEditData edit_data; -/** - * Game instance - */ -extern Game *game; +}; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp new file mode 100644 index 00000000..e05f6d60 --- /dev/null +++ b/src/game_edit_data.hpp @@ -0,0 +1,9 @@ +#pragma once + +/** + * Game edit data, i.e. the parsed contents of the edit .txt + * files. + */ +struct GameEditData { + +}; diff --git a/src/game_edit_data_fwd.hpp b/src/game_edit_data_fwd.hpp new file mode 100644 index 00000000..3c986dfa --- /dev/null +++ b/src/game_edit_data_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct GameEditData; -- cgit v1.2.3 From 1173c144b06d5d2d3c9e6351af5e6f06cb843d4b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move v_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/game_edit_data.hpp | 9 +++++++++ src/generate.cc | 20 ++++++++++++++------ src/init1.cc | 42 +++++++++++++++++++++--------------------- src/init2.cc | 2 +- src/variable.cc | 10 ---------- src/variable.hpp | 3 --- src/vault_type_fwd.hpp | 3 --- 9 files changed, 45 insertions(+), 50 deletions(-) delete mode 100644 src/vault_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index b2471a06..91b903a6 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -27,9 +27,6 @@ M:r:14 # Maximum number of items in k_info.txt M:K:819 -# Maximum number of vaults in v_info.txt -M:V:108 - # Maximum number of terrain features in f_info.txt M:F:256 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 98375869..7ba48a75 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -27,9 +27,6 @@ M:r:14 # Maximum number of items in k_info.txt M:K:886 -# Maximum number of vaults in v_info.txt -M:V:108 - # Maximum number of terrain features in f_info.txt M:F:249 diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index e05f6d60..7dea2610 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,9 +1,18 @@ #pragma once +#include "vault_type.hpp" + +#include + /** * Game edit data, i.e. the parsed contents of the edit .txt * files. */ struct GameEditData { + /** + * Vaults + */ + std::vector v_info; + }; diff --git a/src/generate.cc b/src/generate.cc index 752b0f53..3f6d64c0 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -3744,8 +3744,10 @@ static void build_vault(int yval, int xval, int ymax, int xmax, std::string cons */ static void build_type7(int by0, int bx0) { - vault_type *v_ptr = NULL; - int dummy = 0, xval, yval; + auto const &v_info = game->edit_data.v_info; + + auto v_ptr(v_info.end()); + int dummy = 0; /* Pick a lesser vault */ while (dummy < SAFE_MAX_ATTEMPTS) @@ -3753,13 +3755,15 @@ static void build_type7(int by0, int bx0) dummy++; /* Access a random vault record */ - v_ptr = &v_info[rand_int(max_v_idx)]; + v_ptr = uniform_element(v_info); /* Accept the first lesser vault */ if (v_ptr->typ == 7) break; } /* Try to allocate space for room. If fails, exit */ + int xval; + int yval; if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval)) { if (options->cheat_room) @@ -3806,8 +3810,10 @@ static void build_type7(int by0, int bx0) */ static void build_type8(int by0, int bx0) { - vault_type *v_ptr = NULL; - int dummy = 0, xval, yval; + auto const &v_info = game->edit_data.v_info; + + auto v_ptr(v_info.end()); + int dummy = 0; /* Pick a lesser vault */ while (dummy < SAFE_MAX_ATTEMPTS) @@ -3815,13 +3821,15 @@ static void build_type8(int by0, int bx0) dummy++; /* Access a random vault record */ - v_ptr = &v_info[rand_int(max_v_idx)]; + v_ptr = uniform_element(v_info); /* Accept the first greater vault */ if (v_ptr->typ == 8) break; } /* Try to allocate space for room. If fails, exit */ + int xval; + int yval; if (!room_alloc(v_ptr->wid, v_ptr->hgt, FALSE, by0, bx0, &xval, &yval)) { if (options->cheat_room) diff --git a/src/init1.cc b/src/init1.cc index 012537ce..08cc80a0 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -51,7 +51,6 @@ #include "util.h" #include "variable.h" #include "variable.hpp" -#include "vault_type.hpp" #include "wilderness_type_info.hpp" #include "z-rand.hpp" @@ -61,6 +60,20 @@ using boost::algorithm::iequals; using boost::algorithm::ends_with; +/** + * Expand vector such that it has room for an item at index i. + * If the vector is already large enough, nothing happens. + */ +template typename std::vector::reference expand_to_fit_index(std::vector &v, std::size_t i) +{ + if (v.size() < i + 1) + { + v.resize(i + 1); + } + return v[i]; +} + + /* * This file is used to initialize various variables and arrays for the * Angband game. Note the use of "fd_read()" and "fd_write()" to bypass @@ -1950,12 +1963,12 @@ errr init_player_info_txt(FILE *fp) */ errr init_v_info_txt(FILE *fp) { - int i; char buf[1024]; - char *s; + + auto &v_info = game->edit_data.v_info; /* Current entry */ - vault_type *v_ptr = NULL; + vault_type *v_ptr = nullptr; /* Just before the first record */ error_idx = -1; @@ -1980,7 +1993,7 @@ errr init_v_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -1992,23 +2005,16 @@ errr init_v_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i <= error_idx) return (4); - /* Verify information */ - if (i >= max_v_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - v_ptr = &v_info[i]; - - /* Initialize data -- we ignore the name, it's not - * used for anything */ - v_ptr->data = my_strdup(""); + v_ptr = &expand_to_fit_index(v_info, i); /* Next... */ continue; @@ -2021,7 +2027,7 @@ errr init_v_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire the text */ - s = buf + 2; + cptr s = buf + 2; /* Append data */ v_ptr->data += s; @@ -7001,12 +7007,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_k_idx = atoi(zz[1]); } - /* Maximum v_idx */ - else if (zz[0][0] == 'V') - { - max_v_idx = atoi(zz[1]); - } - /* Maximum f_idx */ else if (zz[0][0] == 'F') { diff --git a/src/init2.cc b/src/init2.cc index 1438ed60..de810fc0 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -536,7 +536,7 @@ namespace { static void allocate() { - v_info = new vault_type[max_v_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/variable.cc b/src/variable.cc index 777c2b17..33f9694e 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -430,11 +430,6 @@ player_class *cp_ptr; player_spec *spp_ptr; -/* - * The vault generation arrays - */ -vault_type *v_info; - /* * The terrain feature arrays */ @@ -678,11 +673,6 @@ u16b max_re_idx; */ u16b max_k_idx; -/* - * Maximum number of vaults in v_info.txt - */ -u16b max_v_idx; - /* * Maximum number of terrain features in f_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index b04f3140..f3b4c351 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -43,7 +43,6 @@ #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" #include "trap_type_fwd.hpp" -#include "vault_type_fwd.hpp" #include "wilderness_type_info_fwd.hpp" #include "seed.hpp" @@ -171,7 +170,6 @@ extern char player_base[32]; extern ability_type *ab_info; extern skill_type *s_info; extern skill_descriptor *s_descriptors; -extern vault_type *v_info; extern feature_type *f_info; extern object_kind *k_info; extern artifact_type *a_info; @@ -207,7 +205,6 @@ extern u16b max_s_idx; extern u16b max_r_idx; extern u16b max_re_idx; extern u16b max_k_idx; -extern u16b max_v_idx; extern u16b max_f_idx; extern u16b max_a_idx; extern u16b max_e_idx; diff --git a/src/vault_type_fwd.hpp b/src/vault_type_fwd.hpp deleted file mode 100644 index 25ffd8cc..00000000 --- a/src/vault_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct vault_type; -- cgit v1.2.3 From fd6449ac75f553e32d2efa84c3cdfba88bb32d6e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move ra_gen and ra_info into GameEditData --- lib/edit/misc.txt | 3 -- lib/mods/theme/edit/misc.txt | 3 -- src/game_edit_data.hpp | 13 ++++++++ src/init1.cc | 71 +++++++++++++++++----------------------- src/init2.cc | 2 +- src/object2.cc | 21 ++++++------ src/randart.cc | 75 ++++++++++++++++++++++++------------------- src/randart_gen_type_fwd.hpp | 3 -- src/randart_part_type.hpp | 16 ++++++--- src/randart_part_type_fwd.hpp | 3 -- src/variable.cc | 11 ------- src/variable.hpp | 5 --- 12 files changed, 106 insertions(+), 120 deletions(-) delete mode 100644 src/randart_gen_type_fwd.hpp delete mode 100644 src/randart_part_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 91b903a6..2db42931 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of randart parts in ra_info.txt -M:Z:516 - # Maximum number of monsters in r_info.txt # WARNING ! add one more to the real count for the player ghost !! M:R:1078 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 7ba48a75..04e87eae 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of randart parts in ra_info.txt -M:Z:519 - # Maximum number of monsters in r_info.txt # WARNING ! add one more to the real count for the player ghost !! M:R:1081 diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 7dea2610..2cfea630 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,5 +1,7 @@ #pragma once +#include "randart_gen_type.hpp" +#include "randart_part_type.hpp" #include "vault_type.hpp" #include @@ -15,4 +17,15 @@ struct GameEditData { */ std::vector v_info; + /** + * Random artifact part descriptors, i.e. the bits that + * randarts are made up of. + */ + std::vector ra_info; + + /** + * Random artifact generation parameters. + */ + std::vector ra_gen; + }; diff --git a/src/init1.cc b/src/init1.cc index 08cc80a0..4f563005 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -55,6 +55,7 @@ #include "z-rand.hpp" #include +#include using boost::algorithm::iequals; using boost::algorithm::ends_with; @@ -4013,9 +4014,10 @@ errr init_e_info_txt(FILE *fp) */ errr init_ra_info_txt(FILE *fp) { - int i, cur_t = 0, j, cur_g = 0; + auto &ra_gen = game->edit_data.ra_gen; + auto &ra_info = game->edit_data.ra_info; + char buf[1024]; - char *s; /* Current entry */ randart_part_type *ra_ptr = NULL; @@ -4050,11 +4052,14 @@ errr init_ra_info_txt(FILE *fp) &chance, &dd, &ds, &plus)) return (1); /* Save the values */ - ra_gen[cur_g].chance = chance; - ra_gen[cur_g].dd = dd; - ra_gen[cur_g].ds = ds; - ra_gen[cur_g].plus = plus; - cur_g++; + randart_gen_type gen; + gen.chance = chance; + gen.dd = dd; + gen.ds = ds; + gen.plus = plus; + + /* Add to data */ + ra_gen.emplace_back(gen); /* Next... */ continue; @@ -4064,30 +4069,16 @@ errr init_ra_info_txt(FILE *fp) if (buf[0] == 'N') { /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_ra_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - ra_ptr = &ra_info[i]; - - /* Needed hack */ - ra_ptr->power = -1; - cur_t = 0; - - for (j = 0; j < 20; j++) - { - ra_ptr->tval[j] = 255; - } - ra_ptr->flags = object_flag_set(); - ra_ptr->fego = ego_flag_set(); + ra_ptr = &expand_to_fit_index(ra_info, i); /* Next... */ continue; @@ -4099,20 +4090,19 @@ errr init_ra_info_txt(FILE *fp) /* Process 'T' for "Tval/Sval" (up to 5 lines) */ if (buf[0] == 'T') { - int tv, minsv, maxsv; - - if (cur_t == 20) return 1; - /* Scan for the values */ + int tv, minsv, maxsv; if (3 != sscanf(buf + 2, "%d:%d:%d", &tv, &minsv, &maxsv)) return (1); - /* Save the values */ - ra_ptr->tval[cur_t] = tv; - ra_ptr->min_sval[cur_t] = minsv; - ra_ptr->max_sval[cur_t] = maxsv; + /* Set up filter */ + randart_part_type::kind_filter_t filter; + filter.tval = tv; + filter.min_sval = minsv; + filter.max_sval = maxsv; - cur_t++; + /* Add filter */ + ra_ptr->kind_filter.emplace_back(filter); /* Next... */ continue; @@ -4174,18 +4164,21 @@ errr init_ra_info_txt(FILE *fp) /* Process 'Z' for "Granted power" */ if (buf[0] == 'Z') { - int i; - /* Acquire the text */ - s = buf + 2; + char const *s = buf + 2; /* Find it in the list */ + std::size_t i; for (i = 0; i < POWER_MAX; i++) { if (iequals(s, powers_type[i].name)) break; } - if (i == POWER_MAX) return (6); + /* Not present? Fail */ + if (i == POWER_MAX) + { + return (6); + } ra_ptr->power = i; @@ -7025,12 +7018,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_e_idx = atoi(zz[1]); } - /* Maximum ra_idx */ - else if (zz[0][0] == 'Z') - { - max_ra_idx = atoi(zz[1]); - } - /* Maximum o_idx */ else if (zz[0][0] == 'O') { diff --git a/src/init2.cc b/src/init2.cc index de810fc0..98476d58 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -392,7 +392,7 @@ namespace { static void allocate() { - ra_info = new randart_part_type[max_ra_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/object2.cc b/src/object2.cc index 98487e46..ab84a214 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -4679,23 +4679,20 @@ static bool_ kind_is_good(int k_idx) */ bool_ kind_is_artifactable(int k_idx) { - int i, j; - object_kind *k_ptr = &k_info[k_idx]; + auto const &ra_info = game->edit_data.ra_info; + object_kind *k_ptr = &k_info[k_idx]; if (kind_is_good(k_idx)) { - /* We consider the item artifactable if there is at least one - * randart power in ra_info that could be added to this item. */ - for (i = 0; i < max_ra_idx; i++) + // Consider the item artifactable if there is at least one + // randart power which could be added to the item. + for (auto const &ra_ref: ra_info) { - randart_part_type *ra_ptr = &ra_info[i]; - - for (j = 0; j < 20; j++) + for (auto const &filter: ra_ref.kind_filter) { - if (ra_ptr->tval[j] != k_ptr->tval) continue; - if (ra_ptr->min_sval[j] > k_ptr->sval) continue; - if (ra_ptr->max_sval[j] < k_ptr->sval) continue; - /* Winner */ + if (filter.tval != k_ptr->tval) continue; + if (filter.min_sval > k_ptr->sval) continue; + if (filter.max_sval < k_ptr->sval) continue; return TRUE; } } diff --git a/src/randart.cc b/src/randart.cc index 698be95b..488f11e1 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -7,6 +7,8 @@ */ #include "randart.hpp" + +#include "game.hpp" #include "mimic.hpp" #include "object1.hpp" #include "object2.hpp" @@ -14,17 +16,12 @@ #include "object_type.hpp" #include "options.hpp" #include "player_type.hpp" -#include "randart_gen_type.hpp" -#include "randart_part_type.hpp" #include "spells2.hpp" #include "util.hpp" #include "variable.h" #include "variable.hpp" #include "z-rand.hpp" -#include -#include - /* Chance of using syllables to form the name instead of the "template" files */ #define A_CURSED 13 #define WEIRD_LUCK 12 @@ -32,39 +29,49 @@ /* * Attempt to add a power to a randart */ -static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *max_times) +static bool_ grab_one_power(int *ra_idx, object_type const *o_ptr, std::vector &max_times) { + auto const &ra_info = game->edit_data.ra_info; + + assert(max_times.size() >= ra_info.size()); + bool_ ret = FALSE; std::vector ok_ra; /* Grab the ok randart */ - for (size_t i = 0; i < max_ra_idx; i++) + for (size_t i = 0; i < ra_info.size(); i++) { - randart_part_type *ra_ptr = &ra_info[i]; + auto ra_ptr = &ra_info[i]; bool_ ok = FALSE; /* Must have the correct fields */ - for (size_t j = 0; j < 20; j++) + for (auto const &filter: ra_ptr->kind_filter) { - if (ra_ptr->tval[j] == o_ptr->tval) + if ((filter.tval == o_ptr->tval) && + (filter.min_sval <= o_ptr->sval) && + (o_ptr->sval <= filter.max_sval)) { - if ((ra_ptr->min_sval[j] <= o_ptr->sval) && (ra_ptr->max_sval[j] >= o_ptr->sval)) ok = TRUE; + ok = TRUE; + break; } + } - if (ok) break; + if ((0 < ra_ptr->max_pval) && (ra_ptr->max_pval < o_ptr->pval)) + { + ok = FALSE; } - if ((0 < ra_ptr->max_pval) && (ra_ptr->max_pval < o_ptr->pval)) ok = FALSE; + if (!ok) { /* Doesnt count as a try*/ continue; } - /* Good should be good, bad should be bad */ - if (good && (ra_ptr->value <= 0)) continue; - if ((!good) && (ra_ptr->value > 0)) continue; + /* Skip bad powers */ + if (ra_ptr->value <= 0) continue; + /* Already chosen the maximum number of times? */ if (max_times[i] >= ra_ptr->max) continue; /* Must NOT have the antagonic flags */ @@ -78,8 +85,8 @@ static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *m /* Now test them a few times */ for (size_t count = 0; count < ok_ra.size() * 10; count++) { - size_t i = ok_ra[rand_int(ok_ra.size())]; - randart_part_type *ra_ptr = &ra_info[i]; + size_t i = *uniform_element(ok_ra); + auto ra_ptr = &ra_info[i]; /* XXX XXX Enforce minimum player level (loosely) */ if (ra_ptr->level > p_ptr->lev) @@ -238,8 +245,11 @@ void get_random_name(char * return_name) bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) { + auto const &ra_gen = game->edit_data.ra_gen; + auto const &ra_info = game->edit_data.ra_info; + char new_name[80]; - int powers = 0, i; + int powers = 0; s32b total_flags, total_power = 0; bool_ a_cursed = FALSE; s16b pval = 0; @@ -249,35 +259,34 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) if ((!a_scroll) && (randint(A_CURSED) == 1)) a_cursed = TRUE; - i = 0; - while (ra_gen[i].chance) + for (auto const &g: ra_gen) { - powers += damroll(ra_gen[i].dd, ra_gen[i].ds) + ra_gen[i].plus; - i++; + powers += damroll(g.dd, g.ds) + g.plus; } if ((!a_cursed) && (randint(30) == 1)) powers *= 2; if (a_cursed) powers /= 2; - std::unique_ptr max_times(new s16b[max_ra_idx]); - for (int i = 0; i < max_ra_idx; i++) { - max_times[i] = 0; - } + std::vector max_times(ra_info.size(), 0); /* Main loop */ while (powers) { - int ra_idx; - randart_part_type *ra_ptr; - powers--; - if (!grab_one_power(&ra_idx, o_ptr, TRUE, max_times.get())) continue; + int ra_idx; + if (!grab_one_power(&ra_idx, o_ptr, max_times)) + { + continue; + } - ra_ptr = &ra_info[ra_idx]; + auto ra_ptr = &ra_info[ra_idx]; - if (wizard) msg_format("Adding randart power: %d", ra_idx); + if (wizard) + { + msg_format("Adding randart power: %d", ra_idx); + } total_power += ra_ptr->value; diff --git a/src/randart_gen_type_fwd.hpp b/src/randart_gen_type_fwd.hpp deleted file mode 100644 index eba3e84e..00000000 --- a/src/randart_gen_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct randart_gen_type; diff --git a/src/randart_part_type.hpp b/src/randart_part_type.hpp index ad7b0c30..5a4ca329 100644 --- a/src/randart_part_type.hpp +++ b/src/randart_part_type.hpp @@ -4,14 +4,21 @@ #include "h-basic.h" #include "object_flag_set.hpp" +#include + /** * Random artifact part descriptor. */ struct randart_part_type { - byte tval[20] { }; - byte min_sval[20] { }; - byte max_sval[20] { }; +public: + struct kind_filter_t { + byte tval; + byte min_sval; + byte max_sval; + }; + + std::vector kind_filter; byte level = 0; /* Minimum level */ byte rarity = 0; /* Object rarity */ @@ -32,5 +39,6 @@ struct randart_part_type object_flag_set aflags; /* Antagonistic ego item flags */ - s16b power = 0; /* Power granted(if any) */ + s16b power = -1; /* Power granted(if any) */ + }; diff --git a/src/randart_part_type_fwd.hpp b/src/randart_part_type_fwd.hpp deleted file mode 100644 index 979fd72c..00000000 --- a/src/randart_part_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct randart_part_type; diff --git a/src/variable.cc b/src/variable.cc index 33f9694e..3d27e442 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -455,12 +455,6 @@ set_type *set_info; */ ego_item_type *e_info; -/* - * The randart arrays - */ -randart_part_type *ra_info; -randart_gen_type ra_gen[30]; - /* jk */ /* the trap-arrays */ trap_type *t_info; @@ -688,11 +682,6 @@ u16b max_a_idx; */ u16b max_e_idx; -/* - * Maximum number of randarts in ra_info.txt - */ -u16b max_ra_idx; - /* * Maximum number of dungeon types in d_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index f3b4c351..b9c965a5 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -28,8 +28,6 @@ #include "player_race_mod_fwd.hpp" #include "player_spec_fwd.hpp" #include "player_type_fwd.hpp" -#include "randart_gen_type_fwd.hpp" -#include "randart_part_type_fwd.hpp" #include "random_artifact.hpp" #include "random_quest.hpp" #include "school_type.hpp" @@ -174,8 +172,6 @@ extern feature_type *f_info; extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; -extern randart_part_type *ra_info; -extern randart_gen_type ra_gen[30]; extern monster_race *r_info; extern monster_ego *re_info; extern dungeon_info_type *d_info; @@ -208,7 +204,6 @@ extern u16b max_k_idx; extern u16b max_f_idx; extern u16b max_a_idx; extern u16b max_e_idx; -extern u16b max_ra_idx; extern u16b max_d_idx; extern u16b max_o_idx; extern u16b max_m_idx; -- cgit v1.2.3 From b329b2fd77e32112a08fc41e1be58b32648225cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move ow_info and ba_info into GameEditData --- lib/edit/misc.txt | 6 ------ lib/mods/theme/edit/misc.txt | 6 ------ src/bldg.cc | 9 ++++++--- src/game_edit_data.hpp | 12 ++++++++++++ src/init1.cc | 44 ++++++++++++-------------------------------- src/init2.cc | 4 ++-- src/owner_type.hpp | 14 ++++++++------ src/owner_type_fwd.hpp | 3 --- src/store.cc | 37 ++++++++++++++++++++++++++----------- src/store_action_type.hpp | 12 ++++++------ src/util.cc | 1 - src/util.hpp | 4 +++- src/variable.cc | 20 -------------------- src/variable.hpp | 6 ------ 14 files changed, 75 insertions(+), 103 deletions(-) delete mode 100644 src/owner_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 2db42931..0a9f4fdc 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -45,12 +45,6 @@ M:U:176 # Maximum number of terrain types in wf_info.txt M:W:30 -# Maximum number of owners types in ow_info.txt -M:N:70 - -# Maximum number of building actions in ba_info.txt -M:B:62 - # Maximum number of store types in st_info.txt M:S:61 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 04e87eae..4fa03332 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -45,12 +45,6 @@ M:U:176 # Maximum number of terrain types in wf_info.txt M:W:64 -# Maximum number of owners types in ow_info.txt -M:N:215 - -# Maximum number of building actions in ba_info.txt -M:B:70 - # Maximum number of store types in st_info.txt M:S:89 diff --git a/src/bldg.cc b/src/bldg.cc index d465dbbe..0425a909 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -16,6 +16,7 @@ #include "cave_type.hpp" #include "cmd3.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "hook_quest_finish_in.hpp" #include "hook_quest_fail_in.hpp" @@ -53,8 +54,9 @@ static int building_loc = 0; */ static bool_ is_state_aux(store_type const *s_ptr, int state) { - owner_type *ow_ptr = &ow_info[s_ptr->owner]; + auto const &ow_info = game->edit_data.ow_info; + auto ow_ptr = &ow_info[s_ptr->owner]; /* Check race */ if (ow_ptr->races[state][p_ptr->prace / 32] & (1 << p_ptr->prace)) @@ -112,11 +114,12 @@ static void clear_bldg(int min_row, int max_row) */ void show_building(store_type const *s_ptr) { + auto const &ba_info = game->edit_data.ba_info; store_info_type *st_ptr = &st_info[s_ptr->st_idx]; for (std::size_t i = 0; i < st_ptr->actions.size(); i++) { - store_action_type *ba_ptr = &ba_info[st_ptr->actions[i]]; + auto ba_ptr = &ba_info[st_ptr->actions[i]]; byte action_color; char buff[20]; @@ -194,7 +197,7 @@ void show_building(store_type const *s_ptr) strnfmt(tmp_str, 80, " %c", ba_ptr->letter); c_put_str(TERM_YELLOW, tmp_str, 21 + (i / 2), 17 + (30 * (i % 2))); - strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name, buff); + strnfmt(tmp_str, 80, ") %s %s", ba_ptr->name.c_str(), buff); c_put_str(action_color, tmp_str, 21 + (i / 2), 2 + 17 + (30 * (i % 2))); } } diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 2cfea630..8ffb6b9a 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,7 +1,9 @@ #pragma once +#include "owner_type.hpp" #include "randart_gen_type.hpp" #include "randart_part_type.hpp" +#include "store_action_type.hpp" #include "vault_type.hpp" #include @@ -28,4 +30,14 @@ struct GameEditData { */ std::vector ra_gen; + /** + * Building actions. + */ + std::vector ba_info; + + /** + * Building owners. + */ + std::vector ow_info; + }; diff --git a/src/init1.cc b/src/init1.cc index 4f563005..086314a2 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5928,9 +5928,9 @@ errr init_st_info_txt(FILE *fp) */ errr init_ba_info_txt(FILE *fp) { - int i = 0; + auto &ba_info = game->edit_data.ba_info; + char buf[1024]; - char *s; /* Current entry */ store_action_type *ba_ptr = NULL; @@ -5958,7 +5958,7 @@ errr init_ba_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -5970,23 +5970,19 @@ errr init_ba_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_ba_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - ba_ptr = &ba_info[i]; + ba_ptr = &expand_to_fit_index(ba_info, i); /* Copy name */ - assert(!ba_ptr->name); - ba_ptr->name = my_strdup(s); + ba_ptr->name = s; /* Next... */ continue; @@ -6047,9 +6043,9 @@ errr init_ba_info_txt(FILE *fp) */ errr init_ow_info_txt(FILE *fp) { - int i; + auto &ow_info = game->edit_data.ow_info; + char buf[1024]; - char *s; /* Current entry */ owner_type *ow_ptr = NULL; @@ -6076,7 +6072,7 @@ errr init_ow_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -6088,23 +6084,19 @@ errr init_ow_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_ow_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - ow_ptr = &ow_info[i]; + ow_ptr = &expand_to_fit_index(ow_info, i); /* Copy name */ - assert(!ow_ptr->name); - ow_ptr->name = my_strdup(s); + ow_ptr->name = s; /* Next... */ continue; @@ -7067,12 +7059,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_wf_idx = atoi(zz[1]); } - /* Maximum ba_idx */ - else if (zz[0][0] == 'B') - { - max_ba_idx = atoi(zz[1]); - } - /* Maximum st_idx */ else if (zz[0][0] == 'S') { @@ -7085,12 +7071,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_set_idx = atoi(zz[1]); } - /* Maximum ow_idx */ - else if (zz[0][0] == 'N') - { - max_ow_idx = atoi(zz[1]); - } - /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { diff --git a/src/init2.cc b/src/init2.cc index 98476d58..160dbeef 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -472,7 +472,7 @@ namespace { static void allocate() { - ow_info = make_array(max_ow_idx); + // Nothing to do } static errr parse(FILE *fp) @@ -488,7 +488,7 @@ namespace { static void allocate() { - ba_info = make_array(max_ba_idx); + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/owner_type.hpp b/src/owner_type.hpp index 703d3159..4c47dc48 100644 --- a/src/owner_type.hpp +++ b/src/owner_type.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "h-basic.h" /* @@ -10,30 +12,30 @@ struct owner_type /** * Name */ - const char *name; + std::string name; /** * Purse limit */ - s16b max_cost; + s16b max_cost = 0; /** * Inflation */ - s16b inflation; + s16b inflation = 0; /** * Liked/hated races. */ - u32b races[2][2]; + u32b races[2][2] { }; /** * Liked/hated classes */ - u32b classes[2][2]; + u32b classes[2][2] { }; /** * Costs for liked people */ - s16b costs[3]; + s16b costs[3] { }; }; diff --git a/src/owner_type_fwd.hpp b/src/owner_type_fwd.hpp deleted file mode 100644 index 20c25802..00000000 --- a/src/owner_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct owner_type; diff --git a/src/store.cc b/src/store.cc index eb8f703c..ab6e119b 100644 --- a/src/store.cc +++ b/src/store.cc @@ -15,6 +15,7 @@ #include "cmd4.hpp" #include "cmd5.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "obj_theme.hpp" #include "object1.hpp" @@ -223,7 +224,7 @@ static store_type *st_ptr = NULL; /* * We store the current "owner type" here so everyone can access it */ -static owner_type *ot_ptr = NULL; +static owner_type const *ot_ptr = NULL; @@ -1577,7 +1578,7 @@ void display_store(void) else { /* Put the owner name and race */ - strnfmt(buf, 80, "%s", ot_ptr->name); + strnfmt(buf, 80, "%s", ot_ptr->name.c_str()); put_str(buf, 3, 10); /* Show the max price in the store (above prices) */ @@ -2757,8 +2758,10 @@ static bool_ leave_store = FALSE; * Find building action for command. Returns nullptr if no matching * action is found. */ -static store_action_type *find_store_action(s16b command_cmd) +static store_action_type const *find_store_action(s16b command_cmd) { + auto const &ba_info = game->edit_data.ba_info; + for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++) { auto ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; @@ -2793,8 +2796,7 @@ static bool_ store_process_command(void) /* Handle repeating the last command */ repeat_check(); - store_action_type *ba_ptr = - find_store_action(command_cmd); + auto ba_ptr = find_store_action(command_cmd); if (ba_ptr) { @@ -3097,6 +3099,9 @@ static bool_ store_process_command(void) */ void do_cmd_store(void) { + auto const &ow_info = game->edit_data.ow_info; + auto const &ba_info = game->edit_data.ba_info; + int which; int maintain_num; int tmp_chr; @@ -3180,7 +3185,7 @@ void do_cmd_store(void) /* Mega-Hack -- Ignore keymaps on store action letters */ for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++) { - store_action_type *ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; + auto ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]]; request_command_ignore_keymaps[2*i] = ba_ptr->letter; request_command_ignore_keymaps[2*i+1] = ba_ptr->letter_aux; } @@ -3363,6 +3368,8 @@ void do_cmd_store(void) */ void store_shuffle(int which) { + auto const &ow_info = game->edit_data.ow_info; + /* Ignore home */ if (which == STORE_HOME) return; @@ -3410,6 +3417,8 @@ void store_shuffle(int which) */ void store_maint(int town_num, int store_num) { + auto const &ow_info = game->edit_data.ow_info; + int const old_rating = rating; cur_store_num = store_num; @@ -3500,6 +3509,8 @@ void store_maint(int town_num, int store_num) */ void store_init(int town_num, int store_num) { + auto const &ow_info = game->edit_data.ow_info; + cur_store_num = store_num; // Activate store @@ -3540,10 +3551,12 @@ void store_init(int town_num, int store_num) */ void do_cmd_home_trump(void) { + auto const &ow_info = game->edit_data.ow_info; + auto const &ba_info = game->edit_data.ba_info; + int which; int maintain_num; int tmp_chr; - int i; int town_num; /* Extract the store code */ @@ -3568,8 +3581,10 @@ void do_cmd_home_trump(void) if (maintain_num) { /* Maintain the store */ - for (i = 0; i < maintain_num; i++) + for (int i = 0; i < maintain_num; i++) + { store_maint(town_num, which); + } /* Save the visit */ town_info[town_num].store[which].last_visit = turn; @@ -3611,10 +3626,10 @@ void do_cmd_home_trump(void) display_store(); /* Mega-Hack -- Ignore keymaps on store action letters */ - for (i = 0; i < 6; i++) + auto const &st_actions = st_info[st_ptr->st_idx].actions; + for (std::size_t i = 0; (i < (MAX_IGNORE_KEYMAPS/2)) && (i < st_actions.size()); i++) { - store_action_type *ba_ptr = - &ba_info[st_info[st_ptr->st_idx].actions[i]]; + auto ba_ptr = &ba_info[st_actions[i]]; request_command_ignore_keymaps[2*i] = ba_ptr->letter; request_command_ignore_keymaps[2*i+1] = ba_ptr->letter_aux; } diff --git a/src/store_action_type.hpp b/src/store_action_type.hpp index 048e13a0..ee479375 100644 --- a/src/store_action_type.hpp +++ b/src/store_action_type.hpp @@ -7,11 +7,11 @@ */ struct store_action_type { - const char *name; /* Name */ + std::string name; /* Name */ - s16b costs[3]; /* Costs for liked people */ - char letter; /* Action letter */ - char letter_aux; /* Action letter */ - s16b action; /* Action code */ - s16b action_restr; /* Action restriction */ + std::array costs { }; /* Costs for liked people */ + char letter = '\0'; /* Action letter */ + char letter_aux = '\0'; /* Action letter */ + s16b action = 0; /* Action code */ + s16b action_restr = 0; /* Action restriction */ }; diff --git a/src/util.cc b/src/util.cc index 6dfbca65..cde2fcb6 100644 --- a/src/util.cc +++ b/src/util.cc @@ -2716,7 +2716,6 @@ static char request_command_buffer[256]; * request_command(). This MUST have at least twice as many characters as * there are building actions in the actions[] array in store_info_type. */ -#define MAX_IGNORE_KEYMAPS 12 char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS]; /* diff --git a/src/util.hpp b/src/util.hpp index eafe4f31..c4c7b30c 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -6,6 +6,8 @@ #include #include +#define MAX_IGNORE_KEYMAPS 12 + extern bool_ input_box(cptr text, int y, int x, char *buf, int max); extern void draw_box(int y, int x, int h, int w); extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); @@ -54,7 +56,7 @@ extern bool_ get_string(cptr prompt, char *buf, int len); extern bool_ get_check(cptr prompt); extern bool_ get_com(cptr prompt, char *command); extern s32b get_quantity(cptr prompt, s32b max); -extern char request_command_ignore_keymaps[]; +extern char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS]; extern bool_ request_command_inven_mode; extern void request_command(int shopping); extern bool_ is_a_vowel(int ch); diff --git a/src/variable.cc b/src/variable.cc index 3d27e442..1eb5aaab 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -516,16 +516,6 @@ int wildc2i[256]; */ store_info_type *st_info; -/* - * The building actions types arrays - */ -store_action_type *ba_info; - -/* - * The owner types arrays - */ -owner_type *ow_info; - /* * Default texts for feature information. */ @@ -705,16 +695,6 @@ u16b max_rmp_idx; u16b max_c_idx; u16b max_mc_idx; -/* - * Maximum number of actions types in ba_info.txt - */ -u16b max_ba_idx; - -/* - * Maximum number of owner types in ow_info.txt - */ -u16b max_ow_idx; - /* * Maximum number of objects in the level */ diff --git a/src/variable.hpp b/src/variable.hpp index b9c965a5..a42d246c 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -21,7 +21,6 @@ #include "object_kind_fwd.hpp" #include "object_type_fwd.hpp" #include "options.hpp" -#include "owner_type_fwd.hpp" #include "player_class_fwd.hpp" #include "player_defs.hpp" #include "player_race_fwd.hpp" @@ -36,7 +35,6 @@ #include "skill_modifiers_fwd.hpp" #include "skill_type_fwd.hpp" #include "skills_defs.hpp" -#include "store_action_type_fwd.hpp" #include "store_info_type_fwd.hpp" #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" @@ -183,8 +181,6 @@ extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; extern store_info_type *st_info; -extern store_action_type *ba_info; -extern owner_type *ow_info; extern set_type *set_info; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; @@ -213,8 +209,6 @@ extern u16b max_c_idx; extern u16b max_mc_idx; extern u16b max_rmp_idx; extern u16b max_st_idx; -extern u16b max_ba_idx; -extern u16b max_ow_idx; extern u16b max_wf_idx; extern u16b max_set_idx; extern int init_flags; -- cgit v1.2.3 From 460513b54733dbc3b10274622d960b3c47f60e85 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove meta_class_info We replace it with a single number on the C:N: line which determines the display order of the classes. (That's all that meta_class_info effectively did.) --- lib/edit/misc.txt | 3 - lib/edit/p_info.txt | 68 ++------------------ lib/mods/theme/edit/misc.txt | 3 - lib/mods/theme/edit/p_info.txt | 70 +++------------------ src/birth.cc | 58 +++++------------ src/init1.cc | 140 +++++++++++------------------------------ src/init2.cc | 2 - src/meta_class_type.hpp | 11 ---- src/meta_class_type_fwd.hpp | 3 - src/player_class.hpp | 2 + src/variable.cc | 2 - src/variable.hpp | 3 - 12 files changed, 69 insertions(+), 296 deletions(-) delete mode 100644 src/meta_class_type.hpp delete mode 100644 src/meta_class_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 0a9f4fdc..d83cbe48 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -63,9 +63,6 @@ M:P:S:10 # Maximum number of class types in p_info.txt M:P:C:32 -# Maximum number of meta class types in p_info.txt -M:P:M:1 - # Maximum number of histories types in p_info.txt M:P:H:266 diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index 8fd03864..a6ab0984 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -51,7 +51,7 @@ G:k:+1000:+1000:Magic-Device # C:a:b:level:ability # C:a:O:tval:sval:xdy -C:N:0:Warrior +C:N:0:0:Warrior C:D:0:Simple fighters, they hack away with their trusty weapon. C:D:1:Rookie C:D:1:Soldier @@ -180,7 +180,7 @@ C:a:g:Manwe Sulimo C:a:g:Tulkas C:a:g:Melkor Bauglir -C:N:1:Mage +C:N:1:3:Mage C:D:0:The basic spellcaster with lots of different skills C:D:1:Apprentice C:D:1:Trickster @@ -333,7 +333,7 @@ C:a:k:+0:-150:Magic-Device C:a:O:23:4:1d1 C:a:O:111:50:1d1 -C:N:2:Archer +C:N:2:1:Archer C:D:0:'Kill them before they see you' could be the motto of the archer class. C:D:0:As deadly with a bow as a warrior is with a sword. C:D:1:Rock Thrower @@ -399,7 +399,7 @@ C:a:g:Manwe Sulimo C:a:g:Tulkas C:a:g:Yavanna Kementari -C:N:3:Rogue +C:N:3:2:Rogue C:D:0:Rogues are masters of tricks. They can steal from shops and monsters, C:D:0:and lure monsters into deadly monster traps. C:D:1:Cutpurse @@ -492,7 +492,7 @@ C:a:k:+0:+1000:Backstab C:a:k:+0:-1800:Stealing C:a:k:+0:-800:Magic-Device -C:N:4:Loremaster +C:N:4:5:Loremaster C:D:0:Loremasters are skilled in most combat and monster skills. C:D:1:Apprentice C:D:1:Apprentice @@ -652,7 +652,7 @@ C:a:k:+0:-100:Symbiosis C:a:k:+0:-100:Mimicry C:a:k:+1000:+500:Music -C:N:5:Priest +C:N:5:4:Priest C:D:0:A priest serves a god (Vala, Maia or Eru himself) to bring down C:D:0:the empire of fear and shadows of Morgoth. C:D:1:Believer @@ -751,44 +751,6 @@ C:a:k:+1000:+300:Mindcraft C:a:k:+0:+200:Sneakiness C:a:k:+0:+100:Magic-Device -###############################TEST############################### -C:N:30:Test -C:D:0:Simple testers. -C:D:1:Rookie -C:D:1:Soldier -C:D:1:Mercenary -C:D:1:Veteran -C:D:1:Swordsman -C:D:1:Champion -C:D:1:Hero -C:D:1:Baron -C:D:1:Duke -C:D:1:Lord -C:S:5:-2:-2:2:2:-1:0:3 -C:B:6:30:5 -C:P:9:0 -C:R:30:0 -C:F:RES_FEAR -C:E:0:0:0:0:0:0 -C:O:45:38:1d1 -C:O:37:4:1d1 -C:k:+1000:+800:Combat -C:k:+1000:+850:Weaponmastery -C:k:+0:+200:Sword-mastery -C:k:+0:+200:Axe-mastery -C:k:+0:+200:Hafted-mastery -C:k:+0:+200:Polearm-mastery -C:k:+1000:+600:Archery -C:k:+1000:+900:Sneakiness -C:k:+1000:+900:Disarming -C:k:+1000:+300:Magic -C:k:+0:+550:Antimagic - -C:a:N:Shinny test -C:a:D:Simple testers, they test all with their shiny hacks ! -C:a:O:23:16:1d1 -###############################TEST############################### - @@ -2062,21 +2024,3 @@ H:263:90:103:104:65:hundreds of H:264:100:103:104:70:uncounted multitudes of H:265:100:104:0:50:foul offspring. - - -############################################################################## -############################################################################## -############################################################################## -############################################################################## -# M:N:idx:color:Meta class name -# M:C:class name - -I: - -M:N:0:U:Classes -- The Classes of Middle-earth -M:C:Warrior -M:C:Archer -M:C:Rogue -M:C:Mage -M:C:Priest -M:C:Loremaster diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 4fa03332..2bd5a9bc 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -63,9 +63,6 @@ M:P:S:26 # Maximum number of class types in p_info.txt M:P:C:50 -# Maximum number of meta class types in p_info.txt -M:P:M:1 - # Maximum number of histories types in p_info.txt M:P:H:294 diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 3137b7f1..daec798d 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -51,7 +51,7 @@ G:k:+1000:+1000:Magic-Device # C:a:b:level:ability # C:a:O:tval:sval:xdy -C:N:0:Warrior +C:N:0:0:Warrior C:D:0:Simple fighters, they hack away with their trusty weapon. C:D:1:Rookie C:D:1:Soldier @@ -205,7 +205,7 @@ C:a:k:+0:+500:Spirituality C:a:k:+1000:+200:Prayer C:a:k:=0:=0:Antimagic -C:N:1:Mage +C:N:1:3:Mage C:D:0:The basic spellcaster with lots of different skills C:D:1:Apprentice C:D:1:Trickster @@ -396,7 +396,7 @@ C:a:k:+1000:+700:Mindcraft C:a:O:111:50:1d1 C:a:O:21:3:1d1 -C:N:2:Archer +C:N:2:1:Archer C:D:0:'Kill them before they see you' could be the motto of the archer class. C:D:0:As deadly with a bow as a warrior is with a sword. C:D:1:Rock Thrower @@ -483,7 +483,7 @@ C:a:O:19:12:1d1 C:a:O:17:1:10d3 C:a:g:All Gods -C:N:3:Rogue +C:N:3:2:Rogue C:D:0:Rogues are masters of tricks. They can steal from shops and monsters, C:D:0:and lure monsters into deadly monster traps. C:D:1:Cutpurse @@ -589,7 +589,7 @@ C:a:b:15:Extra Max Blow(2) C:a:O:23:7:1d1 C:a:O:35:1:1d1 -C:N:4:Loremaster +C:N:4:5:Loremaster C:D:0:Loremasters are skilled in most combat and monster skills. C:D:1:Apprentice C:D:1:Apprentice @@ -785,7 +785,7 @@ C:a:b:5:Extra Max Blow(2) C:a:O:71:37:1d1 C:a:g:Nobody -C:N:5:Pacifist +C:N:5:6:Pacifist C:D:0:Pacifists do not believe in violence and do not want to kill C:D:0:everything in sight. C:D:1:Novice @@ -842,7 +842,7 @@ C:a:k:+0:+700:Divination C:a:k:+0:+700:Temporal C:a:k:+1000:+600:Symbiosis -C:N:6:Priest +C:N:6:4:Priest C:D:0:A priest serves a god (Vala, Maia or Eru himself) to bring down C:D:0:the empire of fear and shadows of Morgoth. C:D:1:Believer @@ -986,44 +986,6 @@ C:a:k:+0:+300:Prayer C:a:k:+0:-600:Necromancy C:a:k:+0:+100:Spell-power -###############################TEST############################### -C:N:30:Test -C:D:0:Simple testers. -C:D:1:Rookie -C:D:1:Soldier -C:D:1:Mercenary -C:D:1:Veteran -C:D:1:Swordsman -C:D:1:Champion -C:D:1:Hero -C:D:1:Baron -C:D:1:Duke -C:D:1:Lord -C:S:5:-2:-2:2:2:-1:0:3 -C:B:6:30:5 -C:P:9:0 -C:R:30:0 -C:F:RES_FEAR -C:E:0:0:0:0:0:0 -C:O:45:38:1d1 -C:O:37:4:1d1 -C:k:+1000:+800:Combat -C:k:+1000:+850:Weaponmastery -C:k:+0:+200:Sword-mastery -C:k:+0:+200:Axe-mastery -C:k:+0:+200:Hafted-mastery -C:k:+0:+200:Polearm-mastery -C:k:+1000:+600:Archery -C:k:+1000:+900:Sneakiness -C:k:+1000:+900:Disarming -C:k:+1000:+300:Magic -C:k:+0:+550:Antimagic - -C:a:N:Shinny test -C:a:D:Simple testers, they test all with their shiny hacks ! -C:a:O:23:16:1d1 -###############################TEST############################### - @@ -3068,21 +3030,3 @@ H:290:100:111:112:80:Your glowing red eyes H:291:40:112:0:60:radiate miserable servility. H:292:60:112:0:70:radiate contempt. H:293:100:112:0:80:radiate pure evil. - -############################################################################## -############################################################################## -############################################################################## -############################################################################## -# M:N:idx:color:Meta class name -# M:C:class name - -I: - -M:N:0:U:Classes -- The Classes of Middle-earth -M:C:Warrior -M:C:Archer -M:C:Rogue -M:C:Mage -M:C:Priest -M:C:Loremaster -M:C:Pacifist diff --git a/src/birth.cc b/src/birth.cc index bb2f0816..67817673 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -24,7 +24,6 @@ #include "init2.hpp" #include "mimic.hpp" #include "messages.hpp" -#include "meta_class_type.hpp" #include "modules.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -1478,7 +1477,7 @@ static bool_ do_quick_start = FALSE; static bool_ player_birth_aux_ask() { - int i, k, n, v, sel; + int k, n, v, sel; int racem[100], max_racem = 0; @@ -1787,52 +1786,29 @@ static bool_ player_birth_aux_ask() } else { - int z; - - for (z = 0; z < 2; z++) + for (int z = 0; z < 2; z++) + { restrictions[z] = (rp_ptr->choice[z] | rmp_ptr->pclass[z]) & (~rmp_ptr->mclass[z]); + } - if (max_mc_idx > 1) + // Get list of all the classes. + std::vector class_types; + for (std::size_t i = 0; i < max_c_idx; i++) { - /* Extra info */ - Term_putstr(5, 13, -1, TERM_WHITE, - "Your 'class' determines various intrinsic abilities and bonuses."); - - /* Get a class type */ - for (i = 0; i < max_mc_idx; i++) - c_put_str(meta_class_info[i].color, format("%c) %s", I2A(i), meta_class_info[i].name), 16 + i, 2); - while (1) + if (class_info[i].title) { - strnfmt(buf, 200, "Choose a class type (a-%c), * for random, = for options: ", I2A(max_mc_idx - 1)); - put_str(buf, 15, 2); - c = inkey(); - if (c == 'Q') quit(NULL); - if (c == 'S') return (FALSE); - if (c == '*') - { - k = rand_int(max_mc_idx); - break; - } - k = (islower(c) ? A2I(c) : (D2I(c) + 26)); - if ((k >= 0) && (k < max_mc_idx)) break; - if (c == '?') do_cmd_help(); - else if (c == '=') - { - screen_save(); - do_cmd_options_aux(6, "Startup Options", FALSE); - screen_load(); - } - else bell(); + class_types.push_back(i); } } - else - { - k = 0; - } - clear_from(15); - - auto const &class_types = meta_class_info[k].classes; + // Sort into display order + std::stable_sort( + class_types.begin(), + class_types.end(), + [](auto i, auto j) { + return class_info[i].display_order_idx < class_info[j].display_order_idx; + } + ); /* Count classes */ n = class_types.size(); diff --git a/src/init1.cc b/src/init1.cc index 086314a2..5867ef5a 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -15,7 +15,6 @@ #include "gods.hpp" #include "hist_type.hpp" #include "init2.hpp" -#include "meta_class_type.hpp" #include "monster2.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" @@ -55,6 +54,8 @@ #include "z-rand.hpp" #include +#include +#include #include using boost::algorithm::iequals; @@ -925,18 +926,15 @@ static int read_ability(std::vector *abilities, char * */ errr init_player_info_txt(FILE *fp) { - int i = 0; int lev = 1; int tit_idx = 0; char buf[1024]; - char *s, *t; /* Current entry */ player_race *rp_ptr = NULL; player_race_mod *rmp_ptr = NULL; player_class *c_ptr = NULL; player_spec *s_ptr = NULL; - meta_class_type *mc_ptr = NULL; /* Just before the first record */ @@ -1003,7 +1001,7 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'R') && (buf[2] == 'N')) { /* Find the colon before the name */ - s = strchr(buf + 4, ':'); + char *s = strchr(buf + 4, ':'); /* Verify that colon */ if (!s) return (1); @@ -1015,7 +1013,7 @@ errr init_player_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 4); + int i = atoi(buf + 4); /* Verify information */ if (i < error_idx) return (4); @@ -1044,7 +1042,7 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'R') && (buf[2] == 'D')) { /* Acquire the text */ - s = buf + 4; + char const *s = buf + 4; if (!rp_ptr->desc) { @@ -1113,12 +1111,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'Z' for "powers" */ if ((buf[0] == 'R') && (buf[2] == 'Z')) { - int i; - /* Acquire the text */ - s = buf + 4; + char const *s = buf + 4; /* Find it in the list */ + int i; for (i = 0; i < POWER_MAX; i++) { if (iequals(s, powers_type[i].name)) break; @@ -1226,7 +1223,7 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'S') && (buf[2] == 'N')) { /* Find the colon before the name */ - s = strchr(buf + 4, ':'); + char *s = strchr(buf + 4, ':'); /* Verify that colon */ if (!s) return (1); @@ -1238,7 +1235,7 @@ errr init_player_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 4); + int i = atoi(buf + 4); /* Verify information */ if (i < error_idx) return (4); @@ -1266,7 +1263,7 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'S') && (buf[2] == 'D')) { /* Acquire the text */ - s = buf + 6; + char const *s = buf + 6; /* Place */ if (buf[4] == 'A') @@ -1344,12 +1341,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'Z' for "powers" */ if ((buf[0] == 'S') && (buf[2] == 'Z')) { - int i; - /* Acquire the text */ - s = buf + 4; + char const *s = buf + 4; /* Find it in the list */ + int i; for (i = 0; i < POWER_MAX; i++) { if (iequals(s, powers_type[i].name)) break; @@ -1481,25 +1477,26 @@ errr init_player_info_txt(FILE *fp) /* Process 'N' for "New/Number/Name" */ if ((buf[0] == 'C') && (buf[2] == 'N')) { - /* Find the colon before the name */ - s = strchr(buf + 4, ':'); + /* Advance beyond prefix */ + char *s = strchr(buf + 4, ':'); /* Verify that colon */ if (!s) return (1); - /* Nuke the colon, advance to the name */ - *s++ = '\0'; + /* Extract the suffix */ + std::string suffix(s + 1); + if (suffix.empty()) return (1); - /* Paranoia -- require a name */ - if (!*s) return (1); + /* Split suffix into fields */ + std::vector fields; + boost::algorithm::split(fields, suffix, boost::is_any_of(":")); - /* Get the index */ - i = atoi(buf + 4); + /* Make sure we have two fields */ + if (fields.size() < 2) return (1); - /* Verify information */ + /* Get the entry index */ + int i = atoi(buf + 4); if (i < error_idx) return (4); - - /* Verify information */ if (i >= max_c_idx) return (2); /* Save the index */ @@ -1510,7 +1507,8 @@ errr init_player_info_txt(FILE *fp) /* Copy name */ assert(!c_ptr->title); - c_ptr->title = my_strdup(s); + c_ptr->display_order_idx = std::stoi(fields[0]); + c_ptr->title = my_strdup(fields[1].c_str()); /* Initialize */ lev = 1; @@ -1524,7 +1522,7 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'C') && (buf[2] == 'D')) { /* Acquire the text */ - s = buf + 6; + char const *s = buf + 6; switch (buf[4]) { @@ -1667,12 +1665,11 @@ errr init_player_info_txt(FILE *fp) /* Process 'Z' for "powers" */ if ((buf[0] == 'C') && (buf[2] == 'Z')) { - int i; - /* Acquire the text */ - s = buf + 4; + char const *s = buf + 4; /* Find it in the list */ + int i; for (i = 0; i < POWER_MAX; i++) { if (iequals(s, powers_type[i].name)) break; @@ -1735,8 +1732,10 @@ errr init_player_info_txt(FILE *fp) if ((buf[0] == 'C') && (buf[2] == 'F')) { /* Parse every entry */ - for (s = buf + 4; *s; ) + for (char *s = buf + 4; *s; ) { + char *t; + /* Find the end of this entry */ for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; @@ -1768,7 +1767,7 @@ errr init_player_info_txt(FILE *fp) if (buf[4] == 'N') { /* Find the colon before the name */ - s = buf + 6; + char const *s = buf + 6; /* Paranoia -- require a name */ if (!*s) return (1); @@ -1788,7 +1787,7 @@ errr init_player_info_txt(FILE *fp) if (buf[4] == 'D') { /* Acquire the text */ - s = buf + 6; + char const *s = buf + 6; if (!s_ptr->desc) { @@ -1860,8 +1859,10 @@ errr init_player_info_txt(FILE *fp) if (buf[4] == 'G') { /* Parse every entry */ - for (s = buf + 6; *s; ) + for (char *s = buf + 6; *s; ) { + char *t; + /* Find the end of this entry */ for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; @@ -1887,69 +1888,6 @@ errr init_player_info_txt(FILE *fp) } } - /* Process 'N' for "New/Number/Name" */ - if ((buf[0] == 'M') && (buf[2] == 'N')) - { - /* Find the colon before the name */ - s = strchr(buf + 4, ':'); - - /* Verify that colon */ - if (!s) return (1); - - /* Nuke the colon, advance to the name */ - *s++ = '\0'; - - /* Paranoia -- require a name */ - if (!*s) return (1); - - /* Get the index */ - i = atoi(buf + 4); - - /* Verify information */ - if (i < error_idx) return (4); - - /* Verify information */ - if (i >= max_mc_idx) return (2); - - /* Save the index */ - error_idx = i; - - /* Point at the "info" */ - mc_ptr = &meta_class_info[i]; - - /* Append chars to the name */ - strcpy(mc_ptr->name, s + 2); - mc_ptr->color = color_char_to_attr(s[0]); - - /* Next... */ - continue; - } - - /* Process 'C' for "Classes" */ - if ((buf[0] == 'M') && (buf[2] == 'C')) - { - int i; - - /* Acquire the text */ - s = buf + 4; - - /* Find it in the list */ - for (i = 0; i < max_c_idx; i++) - { - if (class_info[i].title && iequals(s, class_info[i].title)) - { - break; - } - } - - if (i == max_c_idx) return (6); - - mc_ptr->classes.push_back(i); - - /* Next... */ - continue; - } - /* Oops */ return (6); } @@ -7031,10 +6969,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst { max_c_idx = atoi(zz[2]); } - else if (zz[1][0] == 'M') - { - max_mc_idx = atoi(zz[2]); - } else if (zz[1][0] == 'H') { max_bg_idx = atoi(zz[2]); diff --git a/src/init2.cc b/src/init2.cc index 160dbeef..327556e3 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -20,7 +20,6 @@ #include "init1.hpp" #include "lua_bind.hpp" #include "messages.hpp" -#include "meta_class_type.hpp" #include "modules.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" @@ -556,7 +555,6 @@ namespace { race_mod_info = new player_race_mod[max_rmp_idx]; class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); - meta_class_info = new meta_class_type[max_mc_idx]; gen_skill = new skill_modifiers; } diff --git a/src/meta_class_type.hpp b/src/meta_class_type.hpp deleted file mode 100644 index bd47f998..00000000 --- a/src/meta_class_type.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "h-basic.h" -#include - -struct meta_class_type -{ - char name[80] = ""; /* Name */ - byte color = 0; - std::vector classes; /* List of classes */ -}; diff --git a/src/meta_class_type_fwd.hpp b/src/meta_class_type_fwd.hpp deleted file mode 100644 index 2d0e482a..00000000 --- a/src/meta_class_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct meta_class_type; diff --git a/src/player_class.hpp b/src/player_class.hpp index 61d35b5b..0e6f5839 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -20,6 +20,8 @@ struct player_class char *desc = nullptr; /* Small desc of the class */ const char *titles[PY_MAX_LEVEL / 5] { }; /* Titles */ + int display_order_idx; /* Display order index; lowest first */ + player_shared ps; player_race_flag_set flags; diff --git a/src/variable.cc b/src/variable.cc index 1eb5aaab..0f51c49e 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -503,7 +503,6 @@ player_race_mod *race_mod_info; * Player class arrays */ player_class *class_info; -meta_class_type *meta_class_info; /* * The wilderness features arrays @@ -693,7 +692,6 @@ u16b max_set_idx = 1; u16b max_rp_idx; u16b max_rmp_idx; u16b max_c_idx; -u16b max_mc_idx; /* * Maximum number of objects in the level diff --git a/src/variable.hpp b/src/variable.hpp index a42d246c..d8e5cb17 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -14,7 +14,6 @@ #include "fate.hpp" #include "feature_type_fwd.hpp" #include "hist_type_fwd.hpp" -#include "meta_class_type_fwd.hpp" #include "monster_ego_fwd.hpp" #include "monster_race_fwd.hpp" #include "monster_type_fwd.hpp" @@ -174,7 +173,6 @@ extern monster_race *r_info; extern monster_ego *re_info; extern dungeon_info_type *d_info; extern player_class *class_info; -extern meta_class_type *meta_class_info; extern player_race *race_info; extern player_race_mod *race_mod_info; extern trap_type *t_info; @@ -206,7 +204,6 @@ extern u16b max_m_idx; extern u16b max_t_idx; extern u16b max_rp_idx; extern u16b max_c_idx; -extern u16b max_mc_idx; extern u16b max_rmp_idx; extern u16b max_st_idx; extern u16b max_wf_idx; -- cgit v1.2.3 From 80f38daed5c89df95dcf3aee3e9d3a4ecafe5d03 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove unused includes --- src/init1.cc | 5 ----- src/variable.cc | 2 -- 2 files changed, 7 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 5867ef5a..ac1d6bc7 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -26,20 +26,16 @@ #include "object_flag.hpp" #include "object_flag_meta.hpp" #include "object_kind.hpp" -#include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" #include "player_race_flag.hpp" #include "player_race_mod.hpp" #include "player_type.hpp" -#include "randart_gen_type.hpp" -#include "randart_part_type.hpp" #include "set_type.hpp" #include "skill_flag.hpp" #include "skill_type.hpp" #include "skills.hpp" #include "spells5.hpp" -#include "store_action_type.hpp" #include "store_flag.hpp" #include "store_info_type.hpp" #include "tables.hpp" @@ -56,7 +52,6 @@ #include #include #include -#include using boost::algorithm::iequals; using boost::algorithm::ends_with; diff --git a/src/variable.cc b/src/variable.cc index 0f51c49e..6356d2b9 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -10,9 +10,7 @@ #include "variable.h" #include "cli_comm_fwd.hpp" -#include "dungeon_flag_set.hpp" #include "player_type.hpp" -#include "randart_gen_type.hpp" #include "skill_modifiers.hpp" #include "util.hpp" -- cgit v1.2.3 From 1232fbbcbaa8e6f084a7a1ef1394f1cafc6eb5b6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove long-obsolete junk --- angdos.cfg | 634 ------------------------------------------------------------- tome.ini | 94 --------- 2 files changed, 728 deletions(-) delete mode 100644 angdos.cfg delete mode 100644 tome.ini diff --git a/angdos.cfg b/angdos.cfg deleted file mode 100644 index d541b389..00000000 --- a/angdos.cfg +++ /dev/null @@ -1,634 +0,0 @@ -# File: angdos.cfg - -# -# This file contains configuration data for Angband when compiled -# (and run) with the "main-dos.c" file. -# -# It may also contain configuration data for the Allegro library, -# which should (perhaps) precede the Angband configuration data. -# - - -# -# Optional: graphics driver (Allegro) -# -# 1 = VGA mode 13h 2 = Mode-X -# 3 = VESA 1.x 4 = VBE 2.0 (banked) -# 5 = VBE 2.0 (linear) 6 = VBE/AF -# 7 = Xtended mode 8 = ATI 18800/28800 -# 9 = ATI mach64 10 = Cirrus 64xx -# 11 = Cirrus 54xx 12 = Paradise -# 13 = S3 14 = Trident -# 15 = Tseng ET3000 16 = Tseng ET4000 -# 17 = Video-7 -# -### gfx_card = - -########### Sound-support settings ########## - -[sound] -# Section containing sound configuration information, using the variables: -# digi_card = x -# Sets the driver to use for playing samples, where x is one of the values: -# 0 = none 1 = SB (autodetect breed) -# 2 = SB 1.0 3 = SB 1.5 -# 4 = SB 2.0 5 = SB Pro -# 6 = SB16 7 = GUS (unfinished) - -# midi_card = x -# Sets the driver to use for MIDI music, where x is one of the values: -# 0 = none 1 = Adlib (autodetect OPL version) -# 2 = OPL2 3 = Dual OPL2 (SB Pro-1) -# 4 = OPL3 5 = SB MIDI interface -# 6 = MPU-401 7 = GUS (unfinished) -# 8 = DIGMID 9 = AWE32 - -# digi_voices = x -# Specifies the minimum number of voices to reserve for use by the digital -# sound driver. How many are possible depends on the driver. - -# midi_voices = x -# Specifies the minimum number of voices to reserve for use by the MIDI sound -# driver. How many are possible depends on the driver. - -# flip_pan = x -# Toggling this between 0 and 1 reverses the left/right panning of samples, -# which might be needed because some SB cards get the stereo image the -# wrong way round. - -# sb_port = x -# Sets the port address of the SB (this is usually 220). - -# sb_dma = x -# Sets the DMA channel for the SB (this is usually 1). - -# sb_irq = x -# Sets the IRQ for the SB (this is usually 7). - -# sb_freq = x -# Sets the sample frequency, which defaults to 16129. Possible values are: -# 11906 - works with any SB -# 16129 - works with any SB -# 22727 - on SB 2.0 and above -# 45454 - only on SB 2.0 or SB16 (not the stereo SB Pro driver) - -# fm_port = x -# Sets the port address of the OPL synth (this is usually 388). - -# mpu_port = x -# Sets the port address of the MPU-401 MIDI interface (this is usually 330). - - -# Volume Settings: -digi_volume = 0 -midi_volume = 0 - -########### General Angband settings ########## - -[Angband] -Graphics = 0 -Sound = 0 - -Resolution = 2 - -########### Screen Resolution 640 x 480 ########## - -[Mode-1] -screen_wid = 640 -screen_hgt = 480 - -Description = - -bitmap_wid = 8 -bitmap_hgt = 8 - -bitmap_file = 8x8.gif - -num_windows = 3 - -[Term-1-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 13 - -font_wid = 8 -font_hgt = 13 - -font_file = xm8x13b.fnt - -[Term-1-1] - -x = 0 -y = 336 - -cols = 80 -rows = 24 - -tile_wid = 4 -tile_hgt = 6 - -font_wid = 4 -font_hgt = 6 - -font_file = xm4x6.fnt - -[Term-1-2] - -x = 320 -y = 336 - -cols = 80 -rows = 24 - -tile_wid = 4 -tile_hgt = 6 - -font_wid = 4 -font_hgt = 6 - -font_file = xm4x6.fnt - - -########### Screen Resolution 640 x 480 ########## - -[Mode-2] -screen_wid = 640 -screen_hgt = 480 - -Description = with new graphics - -bitmap_wid = 16 -bitmap_hgt = 16 - -bitmap_file = 16x16.gif - -graf-mode = new - -num_windows = 3 - -[Term-2-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 13 - -font_wid = 8 -font_hgt = 13 - -font_file = xm8x13b.fnt - -[Term-2-1] - -x = 0 -y = 336 - -cols = 80 -rows = 24 - -tile_wid = 4 -tile_hgt = 6 - -font_wid = 4 -font_hgt = 6 - -font_file = xm4x6.fnt - -[Term-2-2] - -x = 320 -y = 336 - -cols = 80 -rows = 24 - -tile_wid = 4 -tile_hgt = 6 - -font_wid = 4 -font_hgt = 6 - -font_file = xm4x6.fnt - - -########## Screen Resolution 800 x 600 ########## - -[Mode-3] -screen_wid = 800 -screen_hgt = 600 - -Description = - -bitmap_wid = 8 -bitmap_hgt = 8 - -bitmap_file = 8x8.gif - -num_windows = 3 - -[Term-3-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 10 -tile_hgt = 17 - -font_wid = 10 -font_hgt = 17 - -font_file = xm10x17.fnt - -[Term-3-1] - -x = 0 -y = 408 - -cols = 80 -rows = 24 - -tile_wid = 5 -tile_hgt = 8 - -font_wid = 5 -font_hgt = 8 - -font_file = xm5x8.fnt - -[Term-3-2] - -x = 400 -y = 408 - -cols = 80 -rows = 24 - -tile_wid = 5 -tile_hgt = 8 - -font_wid = 5 -font_hgt = 8 - -font_file = xm5x8.fnt - - -########## Screen Resolution 800 x 600 ########## - -[Mode-4] -screen_wid = 800 -screen_hgt = 600 - -Description = with new graphics - -bitmap_wid = 16 -bitmap_hgt = 16 - -bitmap_file = 16x16.gif - -graf-mode = new - -num_windows = 3 - -[Term-4-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 10 -tile_hgt = 17 - -font_wid = 10 -font_hgt = 17 - -font_file = xm10x17.fnt - -[Term-4-1] - -x = 0 -y = 408 - -cols = 80 -rows = 24 - -tile_wid = 5 -tile_hgt = 8 - -font_wid = 5 -font_hgt = 8 - -font_file = xm5x8.fnt - -[Term-4-2] - -x = 400 -y = 408 - -cols = 80 -rows = 24 - -tile_wid = 5 -tile_hgt = 8 - -font_wid = 5 -font_hgt = 8 - -font_file = xm5x8.fnt - - -########## Screen Resolution 1024 x 768 ########## - -[Mode-5] -screen_wid = 1024 -screen_hgt = 768 - -Description = - -bitmap_wid = 8 -bitmap_hgt = 8 - -bitmap_file = 8x8.gif - -num_windows = 3 - -[Term-5-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 12 -tile_hgt = 20 - -font_wid = 12 -font_hgt = 20 - -font_file = xm12x20.fnt - -[Term-5-1] - -x = 0 -y = 480 - -cols = 80 -rows = 24 - -tile_wid = 6 -tile_hgt = 12 - -font_wid = 6 -font_hgt = 12 - -font_file = xm6x12.fnt - -[Term-5-2] - -x = 481 -y = 480 - -cols = 80 -rows = 24 - -tile_wid = 6 -tile_hgt = 12 - -font_wid = 6 -font_hgt = 12 - -font_file = xm6x12.fnt - - -########## Screen Resolution 1024 x 768 ########## - -[Mode-6] -screen_wid = 1024 -screen_hgt = 768 - -Description = with new graphics - -bitmap_wid = 16 -bitmap_hgt = 16 - -bitmap_file = 16x16.gif - -graf-mode = new - -num_windows = 3 - -[Term-6-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 12 -tile_hgt = 20 - -font_wid = 12 -font_hgt = 20 - -font_file = xm12x20.fnt - -[Term-6-1] - -x = 0 -y = 480 - -cols = 80 -rows = 24 - -tile_wid = 6 -tile_hgt = 12 - -font_wid = 6 -font_hgt = 12 - -font_file = xm6x12.fnt - -[Term-6-2] - -x = 481 -y = 480 - -cols = 80 -rows = 24 - -tile_wid = 6 -tile_hgt = 12 - -font_wid = 6 -font_hgt = 12 - -font_file = xm6x12.fnt - - -########## Screen Resolution 1280 x 1024 ########## - -[Mode-7] -screen_wid = 1280 -screen_hgt = 1024 - -Description = - -bitmap_wid = 8 -bitmap_hgt = 8 - -bitmap_file = 8x8.gif - -num_windows = 3 - -[Term-7-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 16 -tile_hgt = 25 - -font_wid = 16 -font_hgt = 25 - -font_file = xm16x25.fnt - -[Term-7-1] - -x = 0 -y = 610 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 16 - -font_wid = 8 -font_hgt = 16 - -font_file = xm8x16.fnt - -[Term-7-2] - -x = 640 -y = 610 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 16 - -font_wid = 8 -font_hgt = 16 - -font_file = xm8x16.fnt - - -########## Screen Resolution 1280 x 1024 ########## - -[Mode-8] -screen_wid = 1280 -screen_hgt = 1024 - -Description = with new graphics - -bitmap_wid = 16 -bitmap_hgt = 16 - -bitmap_file = 16x16.gif - -graf-mode = new - -num_windows = 3 - -[Term-8-0] - -x = 0 -y = 0 - -cols = 80 -rows = 24 - -tile_wid = 16 -tile_hgt = 25 - -font_wid = 16 -font_hgt = 25 - -font_file = xm16x25.fnt - -[Term-8-1] - -x = 0 -y = 610 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 16 - -font_wid = 8 -font_hgt = 16 - -font_file = xm8x16.fnt - -[Term-8-2] - -x = 640 -y = 610 - -cols = 80 -rows = 24 - -tile_wid = 8 -tile_hgt = 16 - -font_wid = 8 -font_hgt = 16 - -font_file = xm8x16.fnt - -########### Background settings ########## - -[Background] -# Background-0 : Standard background -# Background-1 : inven/equip -# Background-2 : equip/inven -# Background-3 : player (basic) -# Background-4 : player (extra) -# Background-5 : XXX -# Background-6 : XXX -# Background-7 : messages -# Background-8 : overhead view -# Background-9 : monster recall -# Background-10 : object recall -# Background-11 : XXX -# Background-12 : snap-shot -# Background-13 : XXX -# Background-14 : XXX -# Background-15 : borg messages -# Background-16 : borg status - -Background-0 = backgrnd.gif diff --git a/tome.ini b/tome.ini deleted file mode 100644 index b69fa9e7..00000000 --- a/tome.ini +++ /dev/null @@ -1,94 +0,0 @@ -[Angband] -LibPath=.\lib -Graphics=0 -Bigtile=0 -Sound=0 -GammaVal=0 - -[Term-0] -Visible=1 -Font=8X13.FON -Bizarre=0 -TileWid=8 -TileHgt=13 -NumCols=126 -NumRows=28 -PositionX=0 -PositionY=0 - -[Term-1] -Visible=1 -Font=7X13.FON -Bizarre=0 -TileWid=7 -TileHgt=13 -NumCols=77 -NumRows=24 -PositionX=2 -PositionY=398 - -[Term-2] -Visible=0 -Font=6X12.FON -Bizarre=0 -TileWid=6 -TileHgt=12 -NumCols=76 -NumRows=24 -PositionX=331 -PositionY=126 - -[Term-3] -Visible=1 -Font=6X12.FON -Bizarre=0 -TileWid=6 -TileHgt=12 -NumCols=78 -NumRows=24 -PositionX=549 -PositionY=423 - -[Term-4] -Visible=0 -Font=8X13.FON -Bizarre=0 -TileWid=8 -TileHgt=13 -NumCols=80 -NumRows=24 -PositionX=90 -PositionY=60 - -[Term-5] -Visible=0 -Font=8X13.FON -Bizarre=0 -TileWid=8 -TileHgt=13 -NumCols=80 -NumRows=24 -PositionX=60 -PositionY=40 - -[Term-6] -Visible=0 -Font=8X13.FON -Bizarre=0 -TileWid=8 -TileHgt=13 -NumCols=80 -NumRows=24 -PositionX=30 -PositionY=20 - -[Term-7] -Visible=0 -Font=8X13.FON -Bizarre=0 -TileWid=8 -TileHgt=13 -NumCols=80 -NumRows=24 -PositionX=0 -PositionY=0 -- cgit v1.2.3 From bea14b1db03fcd62d7dfd6633a0802f222792311 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Fix typo where incorrect array bound was being used --- src/object1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object1.cc b/src/object1.cc index c812462f..0d93c917 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -695,7 +695,7 @@ void reset_visuals(void) } /* Reset attr/char code for trap overlay graphics */ - for (i = 0; i < max_rmp_idx; i++) + for (i = 0; i < max_t_idx; i++) { trap_type *t_ptr = &t_info[i]; -- cgit v1.2.3 From 3cdeb22086fc177165acb2d7b6530ccc230ec8e6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move class_info to GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/birth.cc | 17 ++++++++++------- src/files.cc | 2 ++ src/game_edit_data.hpp | 6 ++++++ src/help.cc | 4 ++-- src/help.hpp | 4 +++- src/init1.cc | 36 +++++++++++++++--------------------- src/init2.cc | 1 - src/loadsave.cc | 2 ++ src/notes.cc | 3 +++ src/player_class.hpp | 4 ++-- src/variable.cc | 10 ++-------- src/variable.hpp | 6 ++---- 14 files changed, 49 insertions(+), 52 deletions(-) diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index d83cbe48..cec8b4a4 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -60,9 +60,6 @@ M:P:R:22 # Maximum number of subrace types in p_info.txt M:P:S:10 -# Maximum number of class types in p_info.txt -M:P:C:32 - # Maximum number of histories types in p_info.txt M:P:H:266 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 2bd5a9bc..3bf40391 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -60,9 +60,6 @@ M:P:R:24 # Maximum number of subrace types in p_info.txt M:P:S:26 -# Maximum number of class types in p_info.txt -M:P:C:50 - # Maximum number of histories types in p_info.txt M:P:H:294 diff --git a/src/birth.cc b/src/birth.cc index 67817673..ba0ed9df 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1176,6 +1176,8 @@ static void player_outfit(void) static void dump_classes(std::vector const &classes, int sel, u32b *restrictions) { + auto const &class_info = game->edit_data.class_info; + char buf[80]; /* Clean up */ @@ -1200,7 +1202,7 @@ static void dump_classes(std::vector const &classes, int sel, u32b *restri /* Display */ strnfmt(buf, 80, "%c%c%c %s%s", p1, - (n <= 25) ? I2A(n) : I2D(n - 26), p2, cp_ptr->title, mod); + (n <= 25) ? I2A(n) : I2D(n - 26), p2, cp_ptr->title.c_str(), mod); /* Print some more info */ if (sel == n) @@ -1235,6 +1237,8 @@ static void dump_classes(std::vector const &classes, int sel, u32b *restri static void dump_specs(int sel_) { + auto const &class_info = game->edit_data.class_info; + assert(sel_ >= 0); std::size_t sel = sel_; @@ -1477,6 +1481,8 @@ static bool_ do_quick_start = FALSE; static bool_ player_birth_aux_ask() { + auto &class_info = game->edit_data.class_info; + int k, n, v, sel; int racem[100], max_racem = 0; @@ -1793,19 +1799,16 @@ static bool_ player_birth_aux_ask() // Get list of all the classes. std::vector class_types; - for (std::size_t i = 0; i < max_c_idx; i++) + for (std::size_t i = 0; i < class_info.size(); i++) { - if (class_info[i].title) - { - class_types.push_back(i); - } + class_types.push_back(i); } // Sort into display order std::stable_sort( class_types.begin(), class_types.end(), - [](auto i, auto j) { + [&class_info](auto i, auto j) { return class_info[i].display_order_idx < class_info[j].display_order_idx; } ); diff --git a/src/files.cc b/src/files.cc index 12c05345..24545ef3 100644 --- a/src/files.cc +++ b/src/files.cc @@ -4402,6 +4402,8 @@ static void show_info(void) */ static void display_scores_aux(int highscore_fd, int from, int to, int note, high_score *score) { + auto const &class_info = game->edit_data.class_info; + int i, j, k, n, place; byte attr; char out_val[256]; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 8ffb6b9a..c6f45dc0 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,6 +1,7 @@ #pragma once #include "owner_type.hpp" +#include "player_class.hpp" #include "randart_gen_type.hpp" #include "randart_part_type.hpp" #include "store_action_type.hpp" @@ -40,4 +41,9 @@ struct GameEditData { */ std::vector ow_info; + /** + * Player classes. + */ + std::vector class_info; + }; diff --git a/src/help.cc b/src/help.cc index f8d75e79..55051bfa 100644 --- a/src/help.cc +++ b/src/help.cc @@ -713,9 +713,9 @@ void help_subrace(cptr subrace) show_context_help(find_context_help(subrace_table, subrace)); } -void help_class(cptr klass) +void help_class(std::string const &klass) { - show_context_help(find_context_help(class_table, klass)); + show_context_help(find_context_help(class_table, klass.c_str())); } void help_god(cptr god) diff --git a/src/help.hpp b/src/help.hpp index 7c057a01..5272226e 100644 --- a/src/help.hpp +++ b/src/help.hpp @@ -2,10 +2,12 @@ #include "h-basic.h" +#include + extern void init_hooks_help(); extern void help_race(cptr race); extern void help_subrace(cptr subrace); -extern void help_class(cptr klass); +extern void help_class(std::string const &klass); extern void help_god(cptr god); extern void help_skill(cptr skill); extern void help_ability(cptr ability); diff --git a/src/init1.cc b/src/init1.cc index ac1d6bc7..b4c0a5ac 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -682,13 +682,12 @@ static void strappend(char **s, const char *t) static bool_ unknown_shut_up = FALSE; static errr grab_one_class_flag(u32b *choice, cptr what) { - int i; - cptr s; + auto const &class_info = game->edit_data.class_info; /* Scan classes flags */ - for (i = 0; i < max_c_idx && (s = class_info[i].title); i++) + for (std::size_t i = 0; i < class_info.size(); i++) { - if (streq(what, s)) + if (class_info[i].title == what) { (choice[i / 32]) |= (1L << i); return (0); @@ -921,6 +920,8 @@ static int read_ability(std::vector *abilities, char * */ errr init_player_info_txt(FILE *fp) { + auto &class_info = game->edit_data.class_info; + int lev = 1; int tit_idx = 0; char buf[1024]; @@ -1492,18 +1493,17 @@ errr init_player_info_txt(FILE *fp) /* Get the entry index */ int i = atoi(buf + 4); if (i < error_idx) return (4); - if (i >= max_c_idx) return (2); /* Save the index */ error_idx = i; /* Point at the "info" */ - c_ptr = &class_info[i]; + c_ptr = &expand_to_fit_index(class_info, i); + assert(c_ptr->title.empty()); - /* Copy name */ - assert(!c_ptr->title); + /* Initialize */ c_ptr->display_order_idx = std::stoi(fields[0]); - c_ptr->title = my_strdup(fields[1].c_str()); + c_ptr->title = fields[1]; /* Initialize */ lev = 1; @@ -1522,15 +1522,13 @@ errr init_player_info_txt(FILE *fp) switch (buf[4]) { case '0': /* Class description */ - if (!c_ptr->desc) + // Need newline? + if (!c_ptr->desc.empty()) { - - c_ptr->desc = my_strdup(s); - } - else - { - strappend(&c_ptr->desc, format("\n%s", s)); + c_ptr->desc += '\n'; } + // Append + c_ptr->desc += s; break; case '1': /* Class title */ @@ -6960,10 +6958,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst { max_rmp_idx = atoi(zz[2]); } - else if (zz[1][0] == 'C') - { - max_c_idx = atoi(zz[2]); - } else if (zz[1][0] == 'H') { max_bg_idx = atoi(zz[2]); @@ -7222,7 +7216,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp) /* Class */ else if (streq(b + 1, "CLASS")) { - v = cp_ptr->title; + v = cp_ptr->title.c_str(); // The string SHOULD be stable enough for this } /* Player */ diff --git a/src/init2.cc b/src/init2.cc index 327556e3..9800c4f4 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -553,7 +553,6 @@ namespace { { race_info = new player_race[max_rp_idx]; race_mod_info = new player_race_mod[max_rmp_idx]; - class_info = new player_class[max_c_idx]; bg = make_array(max_bg_idx); gen_skill = new skill_modifiers; } diff --git a/src/loadsave.cc b/src/loadsave.cc index 8c2a79c4..82603563 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2427,6 +2427,8 @@ static bool do_player_hd(ls_flag_t flag) */ static bool_ do_savefile_aux(ls_flag_t flag) { + auto &class_info = game->edit_data.class_info; + /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) { diff --git a/src/notes.cc b/src/notes.cc index 8804509e..071b02e9 100644 --- a/src/notes.cc +++ b/src/notes.cc @@ -10,6 +10,7 @@ #include "notes.hpp" #include "files.hpp" +#include "game.hpp" #include "player_class.hpp" #include "player_type.hpp" #include "util.hpp" @@ -113,6 +114,8 @@ void add_note(char *note, char code) */ void add_note_type(int note_number) { + auto const &class_info = game->edit_data.class_info; + char true_long_day[50]; char buf[1024]; time_t ct = time((time_t*)0); diff --git a/src/player_class.hpp b/src/player_class.hpp index 0e6f5839..02d0fc11 100644 --- a/src/player_class.hpp +++ b/src/player_class.hpp @@ -16,8 +16,8 @@ */ struct player_class { - const char *title = nullptr; /* Type of class */ - char *desc = nullptr; /* Small desc of the class */ + std::string title; /* Type of class */ + std::string desc; /* Small desc of the class */ const char *titles[PY_MAX_LEVEL / 5] { }; /* Titles */ int display_order_idx; /* Display order index; lowest first */ diff --git a/src/variable.cc b/src/variable.cc index 6356d2b9..30d07469 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -424,8 +424,8 @@ player_type *p_ptr = nullptr; */ player_race *rp_ptr; player_race_mod *rmp_ptr; -player_class *cp_ptr; -player_spec *spp_ptr; +player_class const *cp_ptr; +player_spec const *spp_ptr; /* @@ -497,11 +497,6 @@ player_race *race_info; */ player_race_mod *race_mod_info; -/* - * Player class arrays - */ -player_class *class_info; - /* * The wilderness features arrays */ @@ -689,7 +684,6 @@ u16b max_set_idx = 1; */ u16b max_rp_idx; u16b max_rmp_idx; -u16b max_c_idx; /* * Maximum number of objects in the level diff --git a/src/variable.hpp b/src/variable.hpp index d8e5cb17..a86f4d2e 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -158,8 +158,8 @@ extern char *keymap_act[KEYMAP_MODES][256]; extern player_type *p_ptr; extern player_race *rp_ptr; extern player_race_mod *rmp_ptr; -extern player_class *cp_ptr; -extern player_spec *spp_ptr; +extern player_class const *cp_ptr; +extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; extern ability_type *ab_info; @@ -172,7 +172,6 @@ extern ego_item_type *e_info; extern monster_race *r_info; extern monster_ego *re_info; extern dungeon_info_type *d_info; -extern player_class *class_info; extern player_race *race_info; extern player_race_mod *race_mod_info; extern trap_type *t_info; @@ -203,7 +202,6 @@ extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; extern u16b max_rp_idx; -extern u16b max_c_idx; extern u16b max_rmp_idx; extern u16b max_st_idx; extern u16b max_wf_idx; -- cgit v1.2.3 From d33961f89a0c80f2fae4020184e72467b5c192cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move race_info and race_mod_info to GameEditData --- lib/edit/misc.txt | 6 ------ lib/mods/theme/edit/misc.txt | 6 ------ src/birth.cc | 43 +++++++++++++++++++++++-------------- src/cmd5.cc | 16 +++++++++----- src/corrupt.cc | 11 ++++++++-- src/dungeon.cc | 40 +++++++++++++++++----------------- src/files.cc | 29 +++++++++++++++---------- src/game_edit_data.hpp | 12 +++++++++++ src/help.cc | 8 +++---- src/help.hpp | 4 ++-- src/init1.cc | 51 ++++++++++++++++---------------------------- src/init2.cc | 2 -- src/loadsave.cc | 4 ++++ src/object1.cc | 11 +++++----- src/player_race.hpp | 5 +++-- src/util.cc | 4 ++++ src/variable.cc | 20 ++--------------- src/variable.hpp | 8 ++----- src/xtra1.cc | 2 +- src/xtra2.cc | 6 ++++-- src/xtra2.hpp | 2 +- 21 files changed, 148 insertions(+), 142 deletions(-) diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index cec8b4a4..c412340a 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -54,12 +54,6 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 -# Maximum number of race types in p_info.txt -M:P:R:22 - -# Maximum number of subrace types in p_info.txt -M:P:S:10 - # Maximum number of histories types in p_info.txt M:P:H:266 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 3bf40391..e4857746 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -54,12 +54,6 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 -# Maximum number of race types in p_info.txt -M:P:R:24 - -# Maximum number of subrace types in p_info.txt -M:P:S:26 - # Maximum number of histories types in p_info.txt M:P:H:294 diff --git a/src/birth.cc b/src/birth.cc index ba0ed9df..889d1cc9 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1303,6 +1303,8 @@ static void dump_specs(int sel_) static int dump_races(int sel) { + auto const &race_info = game->edit_data.race_info; + int n = 0; char buf[80]; @@ -1310,7 +1312,7 @@ static int dump_races(int sel) /* Clean up */ clear_from(12); - for (n = 0; n < max_rp_idx; n++) + for (n = 0; n < static_cast(race_info.size()); n++) { char p2 = ')', p1 = ' '; @@ -1325,7 +1327,7 @@ static int dump_races(int sel) } /* Display */ - strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rp_ptr->title); + strnfmt(buf, 80, "%c%c%c %s", p1, I2A(n), p2, rp_ptr->title.c_str()); /* Print some more info */ if (sel == n) @@ -1360,6 +1362,8 @@ static int dump_races(int sel) static int dump_rmods(int sel, int *racem, int max) { + auto const &race_mod_info = game->edit_data.race_mod_info; + int n = 0; char buf[80]; @@ -1482,6 +1486,8 @@ static bool_ do_quick_start = FALSE; static bool_ player_birth_aux_ask() { auto &class_info = game->edit_data.class_info; + auto const &race_info = game->edit_data.race_info; + auto const &race_mod_info = game->edit_data.race_mod_info; int k, n, v, sel; @@ -1564,8 +1570,10 @@ static bool_ player_birth_aux_ask() else { /* Only one choice = instant choice */ - if (max_rp_idx == 1) + if (race_info.size() == 1) + { k = 0; + } else { /* Extra info */ @@ -1580,7 +1588,7 @@ static bool_ player_birth_aux_ask() while (1) { strnfmt(buf, 200, "Choose a race (%c-%c), * for a random choice, = for options, 8/2/4/6 for movement: ", - I2A(0), I2A(max_rp_idx - 1)); + I2A(0), I2A(race_info.size() - 1)); put_str(buf, 17, 2); c = inkey(); @@ -1588,7 +1596,7 @@ static bool_ player_birth_aux_ask() if (c == 'S') return (FALSE); if (c == '*') { - k = rand_int(max_rp_idx); + k = rand_int(race_info.size()); break; } k = (islower(c) ? A2I(c) : -1); @@ -1643,7 +1651,7 @@ static bool_ player_birth_aux_ask() rp_ptr = &race_info[p_ptr->prace]; /* Display */ - c_put_str(TERM_L_BLUE, rp_ptr->title, RACE_ROW, 9); + c_put_str(TERM_L_BLUE, rp_ptr->title.c_str(), RACE_ROW, 9); /* Get a random name */ if (!do_quick_start) create_random_name(p_ptr->prace, player_name); @@ -1665,14 +1673,16 @@ static bool_ player_birth_aux_ask() else { /* Only one choice = instant choice */ - if (max_rmp_idx == 1) + if (race_mod_info.size() == 1) + { k = 0; + } else { for (n = 0; n < 100; n++) racem[n] = 0; max_racem = 0; - for (n = 0; n < max_rmp_idx; n++) + for (n = 0; n < static_cast(race_mod_info.size()); n++) { /* Analyze */ p_ptr->pracem = n; @@ -3002,22 +3012,23 @@ static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf) */ static void validate_bg(void) { - int i, race; + auto const &race_info = game->edit_data.race_info; bool_ chart_checked[512]; - char buf[1024]; - - - for (i = 0; i < 512; i++) chart_checked[i] = FALSE; + for (std::size_t i = 0; i < 512; i++) + { + chart_checked[i] = FALSE; + } /* Check each race */ - for (race = 0; race < max_rp_idx; race++) + for (auto const &race: race_info) { /* Get the first chart for this race */ - int chart = race_info[race].chart; + int chart = race.chart; - (void) strcpy(buf, ""); + /* Buffer */ + char buf[1024] = { '\0' }; /* Validate the chart recursively */ validate_bg_aux(chart, chart_checked, buf); diff --git a/src/cmd5.cc b/src/cmd5.cc index e2c2e1b8..bcf22124 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -13,6 +13,7 @@ #include "cave_type.hpp" #include "corrupt.hpp" #include "dungeon_flag.hpp" +#include "game.hpp" #include "lua_bind.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -287,6 +288,8 @@ static void do_poly_wounds() void do_poly_self(void) { + auto const &race_info = game->edit_data.race_info; + int power = p_ptr->lev; int poly_power; @@ -357,22 +360,25 @@ void do_poly_self(void) /* Roll until an appropriate selection is made */ while (1) { - new_race = rand_int(max_rp_idx); + new_race = rand_int(race_info.size()); expfact = race_info[new_race].ps.exp; - if ((new_race != p_ptr->prace) && (expfact <= goalexpfact)) break; + if ((new_race != p_ptr->prace) && (expfact <= goalexpfact)) + { + break; + } } if (effect_msg[0]) { msg_format("You turn into a%s %s!", - ((is_a_vowel(*race_info[new_race].title)) ? "n" : ""), - race_info[new_race].title); + (is_a_vowel(race_info[new_race].title[0]) ? "n" : ""), + race_info[new_race].title.c_str()); } else { msg_format("You turn into a %s %s!", effect_msg, - race_info[new_race].title); + race_info[new_race].title.c_str()); } p_ptr->prace = new_race; diff --git a/src/corrupt.cc b/src/corrupt.cc index 18b23ad4..bd3ae5f0 100644 --- a/src/corrupt.cc +++ b/src/corrupt.cc @@ -1,5 +1,6 @@ #include "corrupt.hpp" +#include "game.hpp" #include "init1.hpp" #include "object_flag.hpp" #include "player_race.hpp" @@ -46,6 +47,8 @@ static void subrace_add_power(player_race_mod *rmp_ptr, int power) static void player_gain_vampire_teeth() { + auto &race_mod_info = game->edit_data.race_mod_info; + player_race_mod *rmp_ptr = NULL; switch_subrace(SUBRACE_SAVE, TRUE); @@ -60,6 +63,8 @@ static void player_gain_vampire_teeth() static void player_gain_vampire_strength() { + auto &race_mod_info = game->edit_data.race_mod_info; + player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE]; rmp_ptr->ps.mhp += +1; @@ -79,6 +84,8 @@ static void player_gain_vampire_strength() static void player_gain_vampire() { + auto &race_mod_info = game->edit_data.race_mod_info; + player_race_mod *rmp_ptr = &race_mod_info[SUBRACE_SAVE]; if (rmp_ptr->title == "Vampire") @@ -694,7 +701,7 @@ static bool_ player_can_gain_corruption(int corruption_idx) if (corruption_idx == CORRUPT_TROLL_BLOOD) { /* Ok trolls should not get this one. never. */ - if (streq(rp_ptr->title, "Troll")) + if (rp_ptr->title == "Troll") { allowed = FALSE; } @@ -704,7 +711,7 @@ static bool_ player_can_gain_corruption(int corruption_idx) if (game_module_idx == MODULE_THEME) { - if (streq(rp_ptr->title, "Maia")) + if (rp_ptr->title == "Maia") { /* We use a whitelist of corruptions for Maiar */ bool_ allow = FALSE; diff --git a/src/dungeon.cc b/src/dungeon.cc index 92f5862e..6f1c8c5a 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1014,7 +1014,7 @@ static bool_ grace_delay_trigger() */ static void process_world_gods() { - const char *race_name = rp_ptr->title; + auto const &race_name = rp_ptr->title; auto const &subrace_name = rmp_ptr->title; if (p_ptr->pgod == GOD_VARDA) @@ -1027,10 +1027,10 @@ static void process_world_gods() inc_piety(GOD_ALL, 2); } - if (streq(race_name, "Orc") || - streq(race_name, "Troll") || - streq(race_name, "Dragon") || - streq(race_name, "Demon")) + if ((race_name == "Orc") || + (race_name == "Troll") || + (race_name == "Dragon") || + (race_name == "Demon")) { /* Varda hates evil races */ inc_piety(GOD_ALL, -2); @@ -1053,16 +1053,16 @@ static void process_world_gods() { int i; /* Ulmo likes the Edain (except Easterlings) */ - if (streq(race_name, "Human") || - streq(race_name, "Dunadan") || - streq(race_name, "Druadan") || - streq(race_name, "RohanKnight")) + if ((race_name == "Human") || + (race_name == "Dunadan") || + (race_name == "Druadan") || + (race_name == "RohanKnight")) { inc_piety(GOD_ALL, 2); } - else if (streq(race_name, "Easterling") || - streq(race_name, "Demon") || - streq(race_name, "Orc")) + else if ((race_name == "Easterling") || + (race_name == "Demon") || + (race_name == "Orc")) { /* hated races */ inc_piety(GOD_ALL, -2); @@ -1097,10 +1097,10 @@ static void process_world_gods() /* Aule likes Dwarves and Dark Elves (Eol's * influence here) */ - if (!(streq(race_name, "Dwarf") || - streq(race_name, "Petty-dwarf") || - streq(race_name, "Gnome") || - streq(race_name, "Dark-Elf"))) + if (!((race_name == "Dwarf") || + (race_name == "Petty-dwarf") || + (race_name == "Gnome") || + (race_name == "Dark-Elf"))) { inc_piety(GOD_ALL, -1); } @@ -1182,14 +1182,14 @@ static void process_world_gods() } /* He likes High Elves only, though, as races */ - if (!streq(race_name, "High-Elf")) + if (!(race_name == "High-Elf")) { inc_piety(GOD_ALL, -1); } /* Really hates vampires and demons */ if ((subrace_name == "Vampire") || - streq(race_name, "Demon")) + (race_name == "Demon")) { inc_piety(GOD_ALL, -10); } @@ -1766,7 +1766,7 @@ static void process_world(void) int dec = 5 - wisdom_scale(3); /* Blech what an hideous hack */ - if (!strcmp(rp_ptr->title, "Ent")) + if (!(rp_ptr->title == "Ent")) { dec -= wisdom_scale(2); } @@ -5016,7 +5016,7 @@ static void load_all_pref_files(void) /* Access the "race" pref file */ - sprintf(buf, "%s.prf", rp_ptr->title); + sprintf(buf, "%s.prf", rp_ptr->title.c_str()); /* Process that file */ process_pref_file(buf); diff --git a/src/files.cc b/src/files.cc index 24545ef3..cec925df 100644 --- a/src/files.cc +++ b/src/files.cc @@ -214,6 +214,8 @@ s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2) */ errr process_pref_file_aux(char *buf) { + auto &race_mod_info = game->edit_data.race_mod_info; + int i, j, n1, n2; char *zz[16]; @@ -293,7 +295,7 @@ errr process_pref_file_aux(char *buf) i = (huge)strtol(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_rmp_idx) return (1); + if (i >= static_cast(race_mod_info.size())) return (1); rmp_ptr = &race_mod_info[i]; if (n1) rmp_ptr->g_attr = n1; if (n2) @@ -891,7 +893,7 @@ static cptr process_pref_file_expr(char **sp, char *fp) /* Race */ else if (streq(b + 1, "RACE")) { - v = rp_ptr->title; + v = rp_ptr->title.c_str(); // The string SHOULD be stable enough for this } /* Race */ @@ -4568,6 +4570,7 @@ static void display_scores_aux(int highscore_fd, int from, int to, int note, hig */ void show_highclass(int building) { + auto const &race_info = game->edit_data.race_info; int i = 0, j, m = 0; int pr, pc, clev; @@ -4642,7 +4645,7 @@ void show_highclass(int building) ((building == 1) && (clev >= PY_MAX_LEVEL))) { sprintf(out_val, "%3d) %s the %s (Level %2d)", - (m + 1), the_score.who, race_info[pr].title, clev); + (m + 1), the_score.who, race_info[pr].title.c_str(), clev); prt(out_val, (m + 7), 0); m++; } @@ -4653,7 +4656,7 @@ void show_highclass(int building) if ((building == 1) && (p_ptr->lev >= PY_MAX_LEVEL)) { sprintf(out_val, "You) %s the %s (Level %2d)", - player_name, race_info[p_ptr->prace].title, p_ptr->lev); + player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); prt(out_val, (m + 8), 0); } else if ((building != 1)) @@ -4661,7 +4664,7 @@ void show_highclass(int building) if ((p_ptr->lev > clev) && (p_ptr->pclass == (building - 10))) { sprintf(out_val, "You) %s the %s (Level %2d)", - player_name, race_info[p_ptr->prace].title, p_ptr->lev); + player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); prt(out_val, (m + 8), 0); } } @@ -4681,6 +4684,8 @@ void show_highclass(int building) */ void race_score(int race_num) { + auto const &race_info = game->edit_data.race_info; + int i = 0, j, m = 0; int pr, clev, lastlev; high_score the_score; @@ -4690,7 +4695,7 @@ void race_score(int race_num) lastlev = 0; /* rr9: TODO - pluralize the race */ - sprintf(tmp_str, "The Greatest of all the %s", race_info[race_num].title); + sprintf(tmp_str, "The Greatest of all the %s", race_info[race_num].title.c_str()); prt(tmp_str, 5, 3); /* Build the filename */ @@ -4726,7 +4731,7 @@ void race_score(int race_num) { sprintf(out_val, "%3d) %s the %s (Level %3d)", (m + 1), the_score.who, - race_info[pr].title, clev); + race_info[pr].title.c_str(), clev); prt(out_val, (m + 7), 0); m++; lastlev = clev; @@ -4738,7 +4743,7 @@ void race_score(int race_num) if ((p_ptr->prace == race_num) && (p_ptr->lev >= lastlev)) { sprintf(out_val, "You) %s the %s (Level %3d)", - player_name, race_info[p_ptr->prace].title, p_ptr->lev); + player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); prt(out_val, (m + 8), 0); } @@ -4752,15 +4757,17 @@ void race_score(int race_num) */ void race_legends(void) { - int i, j; + auto const &race_info = game->edit_data.race_info; - for (i = 0; i < max_rp_idx; i++) + for (size_t i = 0; i < race_info.size(); i++) { race_score(i); msg_print("Hit any key to continue"); msg_print(NULL); - for (j = 5; j < 19; j++) + for (int j = 5; j < 19; j++) + { prt("", j, 0); + } } } diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index c6f45dc0..7addfd65 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -2,6 +2,8 @@ #include "owner_type.hpp" #include "player_class.hpp" +#include "player_race.hpp" +#include "player_race_mod.hpp" #include "randart_gen_type.hpp" #include "randart_part_type.hpp" #include "store_action_type.hpp" @@ -46,4 +48,14 @@ struct GameEditData { */ std::vector class_info; + /** + * Player races. + */ + std::vector race_info; + + /** + * Player subraces. + */ + std::vector race_mod_info; + }; diff --git a/src/help.cc b/src/help.cc index 55051bfa..1997717e 100644 --- a/src/help.cc +++ b/src/help.cc @@ -703,14 +703,14 @@ static context_help_type *find_context_help(context_help_type table[], cptr key) /* * Racial help */ -void help_race(cptr race) +void help_race(std::string const &race) { - show_context_help(find_context_help(race_table, race)); + show_context_help(find_context_help(race_table, race.c_str())); } -void help_subrace(cptr subrace) +void help_subrace(std::string const &subrace) { - show_context_help(find_context_help(subrace_table, subrace)); + show_context_help(find_context_help(subrace_table, subrace.c_str())); } void help_class(std::string const &klass) diff --git a/src/help.hpp b/src/help.hpp index 5272226e..5de6e6c6 100644 --- a/src/help.hpp +++ b/src/help.hpp @@ -5,8 +5,8 @@ #include extern void init_hooks_help(); -extern void help_race(cptr race); -extern void help_subrace(cptr subrace); +extern void help_race(std::string const &race); +extern void help_subrace(std::string const &subrace); extern void help_class(std::string const &klass); extern void help_god(cptr god); extern void help_skill(cptr skill); diff --git a/src/init1.cc b/src/init1.cc index b4c0a5ac..3b0bb701 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -703,13 +703,12 @@ static errr grab_one_class_flag(u32b *choice, cptr what) static errr grab_one_race_allow_flag(u32b *choice, cptr what) { - int i; - cptr s; + auto const &race_info = game->edit_data.race_info; /* Scan classes flags */ - for (i = 0; i < max_rp_idx && (s = race_info[i].title); i++) + for (std::size_t i = 0; i < race_info.size(); i++) { - if (streq(what, s)) + if (race_info[i].title == what) { (choice[i / 32]) |= (1L << i); return (0); @@ -921,6 +920,8 @@ static int read_ability(std::vector *abilities, char * errr init_player_info_txt(FILE *fp) { auto &class_info = game->edit_data.class_info; + auto &race_info = game->edit_data.race_info; + auto &race_mod_info = game->edit_data.race_mod_info; int lev = 1; int tit_idx = 0; @@ -1014,18 +1015,15 @@ errr init_player_info_txt(FILE *fp) /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_rp_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - rp_ptr = &race_info[i]; + rp_ptr = &expand_to_fit_index(race_info, i); + assert(rp_ptr->title.empty()); /* Copy title */ - assert(!rp_ptr->title); - rp_ptr->title = my_strdup(s); + rp_ptr->title = s; /* Initialize */ lev = 1; @@ -1037,18 +1035,15 @@ errr init_player_info_txt(FILE *fp) /* Process 'D' for "Description" */ if ((buf[0] == 'R') && (buf[2] == 'D')) { - /* Acquire the text */ - char const *s = buf + 4; - - if (!rp_ptr->desc) - { - rp_ptr->desc = my_strdup(s); - } - else + // Need newline? + if (!rp_ptr->desc.empty()) { - strappend(&rp_ptr->desc, format("\n%s", s)); + rp_ptr->desc += '\n'; } + // Append + rp_ptr->desc += (buf + 4); + /* Next... */ continue; } @@ -1236,14 +1231,12 @@ errr init_player_info_txt(FILE *fp) /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_rmp_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - rmp_ptr = &race_mod_info[i]; + rmp_ptr = &expand_to_fit_index(race_mod_info, i); + assert(rmp_ptr->title.empty()); /* Copy title */ rmp_ptr->title = s; @@ -6950,15 +6943,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst /* Maximum player types */ else if (zz[0][0] == 'P') { - if (zz[1][0] == 'R') - { - max_rp_idx = atoi(zz[2]); - } - else if (zz[1][0] == 'S') - { - max_rmp_idx = atoi(zz[2]); - } - else if (zz[1][0] == 'H') + if (zz[1][0] == 'H') { max_bg_idx = atoi(zz[2]); } @@ -7204,7 +7189,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp) /* Race */ else if (streq(b + 1, "RACE")) { - v = rp_ptr->title; + v = rp_ptr->title.c_str(); // The string SHOULD be stable enough for this } /* Race Mod */ diff --git a/src/init2.cc b/src/init2.cc index 9800c4f4..1596c057 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -551,8 +551,6 @@ namespace { static void allocate() { - race_info = new player_race[max_rp_idx]; - race_mod_info = new player_race_mod[max_rmp_idx]; bg = make_array(max_bg_idx); gen_skill = new skill_modifiers; } diff --git a/src/loadsave.cc b/src/loadsave.cc index 82603563..5354af9a 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -438,6 +438,8 @@ static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) */ static void do_subrace(ls_flag_t flag) { + auto &race_mod_info = game->edit_data.race_mod_info; + player_race_mod *sr_ptr = &race_mod_info[SUBRACE_SAVE]; int i; @@ -2428,6 +2430,8 @@ static bool do_player_hd(ls_flag_t flag) static bool_ do_savefile_aux(ls_flag_t flag) { auto &class_info = game->edit_data.class_info; + auto const &race_info = game->edit_data.race_info; + auto const &race_mod_info = game->edit_data.race_mod_info; /* Mention the savefile version */ if (flag == ls_flag_t::LOAD) diff --git a/src/object1.cc b/src/object1.cc index 0d93c917..e0b4f60b 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -18,6 +18,7 @@ #include "ego_item_type.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hook_get_in.hpp" #include "hooks.hpp" #include "lua_bind.hpp" @@ -632,6 +633,8 @@ void flavor_init(void) */ void reset_visuals(void) { + auto &race_mod_info = game->edit_data.race_mod_info; + int i; /* Extract some info about terrain features */ @@ -685,13 +688,11 @@ void reset_visuals(void) } /* Reset attr/char code for race modifier overlay graphics */ - for (i = 0; i < max_rmp_idx; i++) + for (player_race_mod &rmp: race_mod_info) { - player_race_mod *rmp_ptr = &race_mod_info[i]; - /* Default attr/char */ - rmp_ptr->g_attr = 0; - rmp_ptr->g_char = 0; + rmp.g_attr = 0; + rmp.g_char = 0; } /* Reset attr/char code for trap overlay graphics */ diff --git a/src/player_race.hpp b/src/player_race.hpp index 560ba34f..a2f4699c 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -12,6 +12,7 @@ #include "skill_modifiers.hpp" #include +#include #include @@ -20,8 +21,8 @@ */ struct player_race { - const char *title = nullptr; /* Type of race */ - char *desc = nullptr; + std::string title; /* Type of race */ + std::string desc; char luck = '\0'; /* Luck */ diff --git a/src/util.cc b/src/util.cc index cde2fcb6..cd1c0c4f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -8,6 +8,7 @@ #include "cli_comm.hpp" #include "cmd3.hpp" #include "cmd4.hpp" +#include "game.hpp" #include "init1.hpp" #include "messages.hpp" #include "monster_ego.hpp" @@ -3422,6 +3423,9 @@ std::string get_day(s32b day_no) std::string get_player_race_name(int pr, int ps) { + auto const &race_info = game->edit_data.race_info; + auto const &race_mod_info = game->edit_data.race_mod_info; + if (ps) { if (race_mod_info[ps].place) diff --git a/src/variable.cc b/src/variable.cc index 30d07469..426d4b3a 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -422,8 +422,8 @@ player_type *p_ptr = nullptr; * Pointer to the player tables * (sex, race, race mod, class, magic) */ -player_race *rp_ptr; -player_race_mod *rmp_ptr; +player_race const *rp_ptr; +player_race_mod const *rmp_ptr; player_class const *cp_ptr; player_spec const *spp_ptr; @@ -487,16 +487,6 @@ skill_type *s_info; */ skill_descriptor *s_descriptors; -/* - * Player race arrays - */ -player_race *race_info; - -/* - * Player mod race arrays - */ -player_race_mod *race_mod_info; - /* * The wilderness features arrays */ @@ -679,12 +669,6 @@ u16b max_st_idx; */ u16b max_set_idx = 1; -/* - * Maximum number of players info in p_info.txt - */ -u16b max_rp_idx; -u16b max_rmp_idx; - /* * Maximum number of objects in the level */ diff --git a/src/variable.hpp b/src/variable.hpp index a86f4d2e..80520f67 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -156,8 +156,8 @@ extern byte tval_to_attr[128]; extern char tval_to_char[128]; extern char *keymap_act[KEYMAP_MODES][256]; extern player_type *p_ptr; -extern player_race *rp_ptr; -extern player_race_mod *rmp_ptr; +extern player_race const *rp_ptr; +extern player_race_mod const *rmp_ptr; extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; @@ -172,8 +172,6 @@ extern ego_item_type *e_info; extern monster_race *r_info; extern monster_ego *re_info; extern dungeon_info_type *d_info; -extern player_race *race_info; -extern player_race_mod *race_mod_info; extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; @@ -201,8 +199,6 @@ extern u16b max_d_idx; extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; -extern u16b max_rp_idx; -extern u16b max_rmp_idx; extern u16b max_st_idx; extern u16b max_wf_idx; extern u16b max_set_idx; diff --git a/src/xtra1.cc b/src/xtra1.cc index 037a1f46..aff76b71 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1050,7 +1050,7 @@ static void prt_frame(void) int i; /* Race and Class */ - prt_field(rp_ptr->title, ROW_RACE, COL_RACE); + prt_field(rp_ptr->title.c_str(), ROW_RACE, COL_RACE); prt_field(spp_ptr->title, ROW_CLASS, COL_CLASS); /* Title */ diff --git a/src/xtra2.cc b/src/xtra2.cc index 5ed06491..040299ff 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5288,9 +5288,11 @@ static void corrupt_corrupted(void) /* * Change to an other subrace */ -void switch_subrace(int racem, bool_ copy_old) +void switch_subrace(std::size_t racem, bool_ copy_old) { - if ((racem < 0) && (racem >= max_rmp_idx)) return; + auto &race_mod_info = game->edit_data.race_mod_info; + + assert(racem < race_mod_info.size()); /* If we switch to the saved subrace, we copy over the old subrace data */ if (copy_old && (racem == SUBRACE_SAVE)) diff --git a/src/xtra2.hpp b/src/xtra2.hpp index a5e07cd3..c81bef73 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -8,7 +8,7 @@ #include extern void do_rebirth(void); -extern void switch_subrace(int racem, bool_ copy_old); +extern void switch_subrace(std::size_t racem, bool_ copy_old); extern void drop_from_wild(void); extern bool_ set_roots(int v, s16b ac, s16b dam); extern bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag); -- cgit v1.2.3 From 42847682e6b753a819d23c3df77467f6d39c486b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move bg into GameEditData --- lib/edit/misc.txt | 3 - lib/edit/p_info.txt | 678 ++++++++++++++++++------------------ lib/mods/theme/edit/misc.txt | 3 - lib/mods/theme/edit/p_info.txt | 756 ++++++++++++++++++++--------------------- src/birth.cc | 47 ++- src/game_edit_data.hpp | 6 + src/hist_type.hpp | 4 +- src/hist_type_fwd.hpp | 3 - src/init1.cc | 32 +- src/init2.cc | 2 - src/variable.cc | 6 - src/variable.hpp | 3 - 12 files changed, 756 insertions(+), 787 deletions(-) delete mode 100644 src/hist_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index c412340a..4ad6829e 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -54,9 +54,6 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 -# Maximum number of histories types in p_info.txt -M:P:H:266 - # Maximum number of skills in s_info.txt M:k:60 diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index a6ab0984..8fdfb96e 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -1662,7 +1662,7 @@ S:E:0:0:0:0:0:0 ############################################################################## ############################################################################## # H: Race history -# H:index:chance:chart:next chart:social class bonus:desc +# H:chance:chart:next chart:social class bonus:desc # Dunadan, Human: 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. # RohanKnight: 84 -> 85 -> 50 -> 51 -> 52 -> 53. @@ -1686,341 +1686,341 @@ S:E:0:0:0:0:0:0 # Kobold: 82 -> 83 -> 80 -> 81 -> 65 -> 66. # Deathmold: 100 -> 101 -> 102 -> 103 -> 104. -H:0:10:1:2:25:You are the illegitimate and unacknowledged child -H:1:20:1:2:35:You are the illegitimate but acknowledged child -H:2:95:1:2:45:You are one of several children -H:3:100:1:2:50:You are the first child - -H:4:40:2:3:65:of a Serf. -H:5:65:2:3:80:of a Yeoman. -H:6:80:2:3:90:of a Townsman. -H:7:90:2:3:105:of a Guildsman. -H:8:96:2:3:120:of a Landed Knight. -H:9:99:2:3:130:of a Noble Lord. -H:10:100:2:3:140:of the Royal Blood Line. - -H:11:20:3:50:20:You are the black sheep of the family. -H:12:80:3:50:55:You are a credit to the family. -H:13:100:3:50:60:You are a well-liked child. - -H:14:25:4:1:40:Your mother was of the Avari. -H:15:40:4:1:50:Your father was of the Avari. -H:16:65:4:1:60:Your mother was of the Nandor. -H:17:80:4:1:60:Your father was of the Nandor. -H:18:96:4:1:70:Your mother was of the Sindar. -H:19:99:4:1:70:Your father was of the Sindar. -H:20:100:4:1:100:Your ancestry traces to Elrond. - -H:21:60:5:6:50:You are one of several children -H:22:100:5:6:55:You are the only child - -H:23:40:6:9:40:of an Avarin -H:24:70:6:9:50:of a Nandorin -H:25:100:6:9:60:of a Sindarin - -H:26:60:7:8:50:You are one of several children -H:27:100:7:8:55:You are the only child - -H:28:75:8:9:50:of a Telerin -H:29:95:8:9:55:of a Noldorin -H:30:100:8:9:60:of a Vanyarin - -H:31:40:9:54:80:Ranger. -H:32:70:9:54:90:Archer. -H:33:87:9:54:110:Warrior. -H:34:95:9:54:125:Mage. -H:35:99:9:54:140:Prince. -H:36:100:9:54:145:King. - -H:37:85:10:11:45:You are one of several children of a Hobbit -H:38:100:10:11:55:You are the only child of a Hobbit - -H:39:20:11:3:55:Bum. -H:40:30:11:3:80:Tavern Owner. -H:41:40:11:3:90:Miller. -H:42:50:11:3:100:Home Owner. -H:43:80:11:3:110:Burglar. -H:44:95:11:3:115:Warrior. -H:45:99:11:3:125:Mage. -H:46:100:11:3:140:Clan Elder. - -H:47:85:13:14:45:You are one of several children of a Gnome -H:48:100:13:14:55:You are the only child of a Gnome - -H:49:20:14:3:55:Beggar. -H:50:50:14:3:70:Braggart. -H:51:75:14:3:85:Prankster. -H:52:95:14:3:100:Warrior. -H:53:100:14:3:125:Mage. - -H:54:25:16:17:40:You are one of two children of a Dwarven -H:55:100:16:17:50:You are the only child of a Dwarven - -H:56:10:17:18:60:Thief. -H:57:35:17:18:80:Smith. -H:58:75:17:18:90:Miner. -H:59:90:17:18:110:Warrior. -H:60:99:17:18:130:Priest. -H:61:100:17:18:150:King. - -H:62:15:18:57:10:You are the black sheep of the family. -H:63:85:18:57:50:You are a credit to the family. -H:64:100:18:57:55:You are a well liked child. - -H:65:100:20:2:50:You are the adopted child - -H:66:100:22:23:50:You are the offspring of a - -H:67:30:23:24:20:Forest-Troll -H:68:60:23:24:25:Cave-Troll -H:69:75:23:24:30:Hill-Troll -H:70:90:23:24:35:Stone-Troll -H:71:95:23:24:40:Snow-Troll -H:72:100:23:24:45:Water-Troll - -H:73:25:24:62:50:Worker. -H:74:95:24:62:55:Warrior. -H:75:99:24:62:65:Shaman. -H:76:100:24:62:80:Clan Chief. - -H:77:100:25:26:50:You are one of several children of - -H:78:40:26:27:40:a Snaga -H:79:80:26:27:50:an Orc -H:80:100:26:27:60:an Uruk - -H:81:30:27:28:20:Slave -H:82:60:27:28:50:Archer -H:83:90:27:28:60:Warrior -H:84:95:27:28:80:Shaman -H:85:100:27:28:100:Chieftain - -H:86:30:28:80:50:from the Misty Mountains. -H:87:60:28:80:50:from the Grey Mountains. -H:88:90:28:80:70:from the orc-hold of Mount Gundabad. -H:89:100:28:80:80:from the Pits of Angband. - -H:90:25:29:3:50:You are one of five children of a blue Yeek. -H:91:75:29:3:75:You are one of five children of a brown Yeek. -H:92:100:29:3:100:You are one of five children of a master Yeek. - -H:93:20:50:51:50:You have dark brown eyes, -H:94:60:50:51:50:You have brown eyes, -H:95:70:50:51:50:You have hazel eyes, -H:96:80:50:51:50:You have green eyes, -H:97:90:50:51:50:You have blue eyes, -H:98:100:50:51:50:You have blue-gray eyes, - -H:99:70:51:52:50:straight -H:100:90:51:52:50:wavy -H:101:100:51:52:50:curly - -H:102:30:52:53:50:black hair, -H:103:70:52:53:50:brown hair, -H:104:80:52:53:50:auburn hair, -H:105:90:52:53:50:red hair, -H:106:100:52:53:50:blond hair, - -H:107:10:53:0:50:and a very dark complexion. -H:108:30:53:0:50:and a dark complexion. -H:109:80:53:0:50:and an average complexion. -H:110:90:53:0:50:and a fair complexion. -H:111:100:53:0:50:and a very fair complexion. - -H:112:85:54:55:50:You have light grey eyes, -H:113:95:54:55:50:You have light blue eyes, -H:114:100:54:55:50:You have light green eyes, - -H:115:75:55:56:50:straight -H:116:100:55:56:50:wavy - -H:117:75:56:0:50:black hair, and a fair complexion. -H:118:85:56:0:50:brown hair, and a fair complexion. -H:119:95:56:0:50:blond hair, and a fair complexion. -H:120:100:56:0:50:silver hair, and a fair complexion. - -H:121:99:57:58:50:You have dark brown eyes, -H:122:100:57:58:60:You have glowing red eyes, - -H:123:90:58:59:50:straight -H:124:100:58:59:50:wavy - -H:125:75:59:60:50:black hair, -H:126:100:59:60:50:brown hair, - -H:127:25:60:61:50:a one foot beard, -H:128:60:60:61:51:a two foot beard, -H:129:90:60:61:53:a three foot beard, -H:130:100:60:61:55:a four foot beard, - -H:131:100:61:0:50:and a dark complexion. - -H:132:60:62:63:50:You have slime green eyes, -H:133:85:62:63:50:You have puke yellow eyes, -H:134:99:62:63:50:You have blue-bloodshot eyes, -H:135:100:62:63:55:You have glowing red eyes, - -H:136:33:63:64:50:dirty -H:137:66:63:64:50:mangy -H:138:100:63:64:50:oily - -H:139:33:64:65:50:sea-weed green hair, -H:140:66:64:65:50:bright red hair, -H:141:100:64:65:50:dark purple hair, - -H:142:25:65:66:50:and green -H:143:50:65:66:50:and blue -H:144:75:65:66:50:and white -H:145:100:65:66:50:and black - -H:146:33:66:0:50:ulcerous skin. -H:147:66:66:0:50:scabby skin. -H:148:100:66:0:50:leprous skin. - -H:149:85:69:70:45:You are one of several children of a Dark Elven -H:150:100:69:70:55:You are the only child of a Dark Elven - -H:151:50:70:71:60:Warrior. -H:152:80:70:71:75:Warlock. -H:153:100:70:71:95:Noble. - -H:154:100:71:72:50:You have black eyes, - -H:155:70:72:73:50:straight -H:156:90:72:73:50:wavy -H:157:100:72:73:50:curly - -H:158:100:73:0:50:black hair and a very dark complexion. - -H:159:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. -H:160:100:74:20:25:Your father was an Ogre, but it is unacknowledged. - -H:161:90:75:76:50:You are a descendant of Beorn to the -H:162:100:75:20:100:Your father was Beorn. - -H:163:13:76:20:55:9th degree. -H:164:25:76:20:60:8th degree. -H:165:38:76:20:65:7th degree. -H:166:50:76:20:70:6th degree. -H:167:63:76:20:75:5th degree. -H:168:75:76:20:80:4th degree. -H:169:88:76:20:85:3rd degree. -H:170:100:76:20:90:2nd degree. - -H:171:100:78:79:50:You are one of several children of - -H:172:50:79:80:50:a Brown Yeek. -H:173:75:79:80:50:a Blue Yeek. -H:174:95:79:80:85:a Master Yeek. -H:175:100:79:80:120:Boldor, the King of the Yeeks. - -H:176:25:80:81:50:You have pale eyes, -H:177:50:80:81:50:You have glowing eyes, -H:178:75:80:81:50:You have tiny black eyes, -H:179:100:80:81:50:You have shining black eyes, - -H:180:20:81:65:50:no hair at all, -H:181:40:81:65:50:short black hair, -H:182:60:81:65:50:long black hair, -H:183:80:81:65:50:bright red hair, -H:184:100:81:65:50:colourless albino hair, - -H:185:100:82:83:50:You are one of several children of - -H:186:40:83:80:50:a Small Kobold. -H:187:75:83:80:55:a Kobold. -H:188:95:83:80:65:a Large Kobold. -H:189:100:83:80:100:Mughash, the Kobold Lord. - -H:190:85:84:85:45:You are one of several children -H:191:100:84:85:50:You are the first child - -H:192:60:85:50:40:of a Serf. -H:193:85:85:50:55:of a Devoted Mercenary. -H:194:96:85:50:60:of a Landed Knight. -H:195:99:85:50:100:of a Marshal of the Riddermark. -H:196:100:85:50:120:of a King of the Rohirrim. - -H:197:100:87:88:89:You are one of several children of - -H:198:30:88:18:20:a Petty-Dwarf Slave. -H:199:50:88:18:40:a Petty-Dwarf Thief. -H:200:70:88:18:60:a Petty-Dwarf Smith. -H:201:90:88:18:75:a Petty-Dwarf Miner. -H:202:95:88:18:100:a Petty-Dwarf Shaman. -H:203:100:88:18:100:Mim, Betrayer of Turin. - -H:204:85:89:90:50:You are one of many Manwe Maia. -H:205:100:89:90:60:You are the one of the most famous Manwe Maia. - -H:206:90:90:93:100:Your eagle looks very good. -H:207:100:90:93:120:Your eagle is splendid. - -H:208:10:91:92:20:You are a unnoticed minion of -H:209:25:91:92:30:You are a minor servant of -H:210:45:91:92:40:You are a subject of -H:211:65:91:92:50:You have attached yourself to -H:212:85:91:92:65:You are associated with -H:213:95:91:92:80:You are a notable follower of -H:214:100:91:92:100:You are a celebrated assistant to - -H:215:20:92:93:55:Nessa. -H:216:40:92:93:60:Vana. -H:217:50:92:93:65:Tulkas. -H:218:80:92:93:75:Mandos. -H:219:90:92:93:80:Nienna. -H:220:95:92:93:90:Varda. -H:221:100:92:93:95:Manwe. - -H:222:100:93:94:50:In the past you dwelt on earth in the form of - -H:223:25:94:0:50:various animals. -H:224:55:94:0:55:a spirit of forest and river. -H:225:70:94:0:60:a beneficent but unseen force. -H:226:96:94:0:70:a wise and ancient counsellor. -H:227:100:94:0:80:a Wizard of legend. - -H:228:30:95:96:30:You are of an unknown generation of the Ents. -H:229:40:95:96:50:You are of the third generation of the Ents. -H:230:60:95:96:60:You are of the second generation of the Ents. -H:231:100:95:96:80:You are one of the first beings who awoke on Arda. - -H:232:50:96:0:50:You have green skin and inflexible members. -H:233:100:96:0:50:You have brown skin and inflexible members. - -H:234:10:100:101:30:You were born in dirty bilge-water, -H:235:20:100:101:35:You were born in dirty straw, -H:236:30:100:101:40:You were born in wet mud, -H:237:40:100:101:45:You were born in a pile of dust, -H:238:50:100:101:50:You were born in sand, -H:239:60:100:101:50:You were born in pebbles, -H:240:70:100:101:55:You were born in a kobold corpse, -H:241:80:100:101:60:You were born in dragon droppings, -H:242:90:100:101:65:You were born in a pile of bones, -H:243:100:100:101:70:You were born in a corpse of a mighty hero, - -H:244:10:101:102:30:created by rotting flesh. -H:245:20:101:102:35:created by a kobold magician. -H:246:30:101:102:40:created by a corrupted apprentice. -H:247:40:101:102:45:created by a curious mage apprentice. -H:248:50:101:102:50:created by an evil Symbiant. -H:249:60:101:102:50:created by a practicing Necromancer. -H:250:70:101:102:55:created by the Mutant Breeders. -H:251:80:101:102:60:created by a curious adventurer. -H:252:90:101:102:65:called to life by the Witch-King of Angmar. -H:253:100:101:102:70:called to life by Sauron himself. - -H:254:100:102:103:50:Since then you have given life to - -H:255:10:103:104:30:no -H:256:20:103:104:35:one weak-willed -H:257:30:103:104:40:two -H:258:40:103:104:45:three -H:259:50:103:104:50:four -H:260:60:103:104:50:five -H:261:70:103:104:55:about twenty -H:262:80:103:104:60:dozens of -H:263:90:103:104:65:hundreds of -H:264:100:103:104:70:uncounted multitudes of - -H:265:100:104:0:50:foul offspring. +H:10:1:2:25:You are the illegitimate and unacknowledged child +H:20:1:2:35:You are the illegitimate but acknowledged child +H:95:1:2:45:You are one of several children +H:100:1:2:50:You are the first child + +H:40:2:3:65:of a Serf. +H:65:2:3:80:of a Yeoman. +H:80:2:3:90:of a Townsman. +H:90:2:3:105:of a Guildsman. +H:96:2:3:120:of a Landed Knight. +H:99:2:3:130:of a Noble Lord. +H:100:2:3:140:of the Royal Blood Line. + +H:20:3:50:20:You are the black sheep of the family. +H:80:3:50:55:You are a credit to the family. +H:100:3:50:60:You are a well-liked child. + +H:25:4:1:40:Your mother was of the Avari. +H:40:4:1:50:Your father was of the Avari. +H:65:4:1:60:Your mother was of the Nandor. +H:80:4:1:60:Your father was of the Nandor. +H:96:4:1:70:Your mother was of the Sindar. +H:99:4:1:70:Your father was of the Sindar. +H:100:4:1:100:Your ancestry traces to Elrond. + +H:60:5:6:50:You are one of several children +H:100:5:6:55:You are the only child + +H:40:6:9:40:of an Avarin +H:70:6:9:50:of a Nandorin +H:100:6:9:60:of a Sindarin + +H:60:7:8:50:You are one of several children +H:100:7:8:55:You are the only child + +H:75:8:9:50:of a Telerin +H:95:8:9:55:of a Noldorin +H:100:8:9:60:of a Vanyarin + +H:40:9:54:80:Ranger. +H:70:9:54:90:Archer. +H:87:9:54:110:Warrior. +H:95:9:54:125:Mage. +H:99:9:54:140:Prince. +H:100:9:54:145:King. + +H:85:10:11:45:You are one of several children of a Hobbit +H:100:10:11:55:You are the only child of a Hobbit + +H:20:11:3:55:Bum. +H:30:11:3:80:Tavern Owner. +H:40:11:3:90:Miller. +H:50:11:3:100:Home Owner. +H:80:11:3:110:Burglar. +H:95:11:3:115:Warrior. +H:99:11:3:125:Mage. +H:100:11:3:140:Clan Elder. + +H:85:13:14:45:You are one of several children of a Gnome +H:100:13:14:55:You are the only child of a Gnome + +H:20:14:3:55:Beggar. +H:50:14:3:70:Braggart. +H:75:14:3:85:Prankster. +H:95:14:3:100:Warrior. +H:100:14:3:125:Mage. + +H:25:16:17:40:You are one of two children of a Dwarven +H:100:16:17:50:You are the only child of a Dwarven + +H:10:17:18:60:Thief. +H:35:17:18:80:Smith. +H:75:17:18:90:Miner. +H:90:17:18:110:Warrior. +H:99:17:18:130:Priest. +H:100:17:18:150:King. + +H:15:18:57:10:You are the black sheep of the family. +H:85:18:57:50:You are a credit to the family. +H:100:18:57:55:You are a well liked child. + +H:100:20:2:50:You are the adopted child + +H:100:22:23:50:You are the offspring of a + +H:30:23:24:20:Forest-Troll +H:60:23:24:25:Cave-Troll +H:75:23:24:30:Hill-Troll +H:90:23:24:35:Stone-Troll +H:95:23:24:40:Snow-Troll +H:100:23:24:45:Water-Troll + +H:25:24:62:50:Worker. +H:95:24:62:55:Warrior. +H:99:24:62:65:Shaman. +H:100:24:62:80:Clan Chief. + +H:100:25:26:50:You are one of several children of + +H:40:26:27:40:a Snaga +H:80:26:27:50:an Orc +H:100:26:27:60:an Uruk + +H:30:27:28:20:Slave +H:60:27:28:50:Archer +H:90:27:28:60:Warrior +H:95:27:28:80:Shaman +H:100:27:28:100:Chieftain + +H:30:28:80:50:from the Misty Mountains. +H:60:28:80:50:from the Grey Mountains. +H:90:28:80:70:from the orc-hold of Mount Gundabad. +H:100:28:80:80:from the Pits of Angband. + +H:25:29:3:50:You are one of five children of a blue Yeek. +H:75:29:3:75:You are one of five children of a brown Yeek. +H:100:29:3:100:You are one of five children of a master Yeek. + +H:20:50:51:50:You have dark brown eyes, +H:60:50:51:50:You have brown eyes, +H:70:50:51:50:You have hazel eyes, +H:80:50:51:50:You have green eyes, +H:90:50:51:50:You have blue eyes, +H:100:50:51:50:You have blue-gray eyes, + +H:70:51:52:50:straight +H:90:51:52:50:wavy +H:100:51:52:50:curly + +H:30:52:53:50:black hair, +H:70:52:53:50:brown hair, +H:80:52:53:50:auburn hair, +H:90:52:53:50:red hair, +H:100:52:53:50:blond hair, + +H:10:53:0:50:and a very dark complexion. +H:30:53:0:50:and a dark complexion. +H:80:53:0:50:and an average complexion. +H:90:53:0:50:and a fair complexion. +H:100:53:0:50:and a very fair complexion. + +H:85:54:55:50:You have light grey eyes, +H:95:54:55:50:You have light blue eyes, +H:100:54:55:50:You have light green eyes, + +H:75:55:56:50:straight +H:100:55:56:50:wavy + +H:75:56:0:50:black hair, and a fair complexion. +H:85:56:0:50:brown hair, and a fair complexion. +H:95:56:0:50:blond hair, and a fair complexion. +H:100:56:0:50:silver hair, and a fair complexion. + +H:99:57:58:50:You have dark brown eyes, +H:100:57:58:60:You have glowing red eyes, + +H:90:58:59:50:straight +H:100:58:59:50:wavy + +H:75:59:60:50:black hair, +H:100:59:60:50:brown hair, + +H:25:60:61:50:a one foot beard, +H:60:60:61:51:a two foot beard, +H:90:60:61:53:a three foot beard, +H:100:60:61:55:a four foot beard, + +H:100:61:0:50:and a dark complexion. + +H:60:62:63:50:You have slime green eyes, +H:85:62:63:50:You have puke yellow eyes, +H:99:62:63:50:You have blue-bloodshot eyes, +H:100:62:63:55:You have glowing red eyes, + +H:33:63:64:50:dirty +H:66:63:64:50:mangy +H:100:63:64:50:oily + +H:33:64:65:50:sea-weed green hair, +H:66:64:65:50:bright red hair, +H:100:64:65:50:dark purple hair, + +H:25:65:66:50:and green +H:50:65:66:50:and blue +H:75:65:66:50:and white +H:100:65:66:50:and black + +H:33:66:0:50:ulcerous skin. +H:66:66:0:50:scabby skin. +H:100:66:0:50:leprous skin. + +H:85:69:70:45:You are one of several children of a Dark Elven +H:100:69:70:55:You are the only child of a Dark Elven + +H:50:70:71:60:Warrior. +H:80:70:71:75:Warlock. +H:100:70:71:95:Noble. + +H:100:71:72:50:You have black eyes, + +H:70:72:73:50:straight +H:90:72:73:50:wavy +H:100:72:73:50:curly + +H:100:73:0:50:black hair and a very dark complexion. + +H:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. +H:100:74:20:25:Your father was an Ogre, but it is unacknowledged. + +H:90:75:76:50:You are a descendant of Beorn to the +H:100:75:20:100:Your father was Beorn. + +H:13:76:20:55:9th degree. +H:25:76:20:60:8th degree. +H:38:76:20:65:7th degree. +H:50:76:20:70:6th degree. +H:63:76:20:75:5th degree. +H:75:76:20:80:4th degree. +H:88:76:20:85:3rd degree. +H:100:76:20:90:2nd degree. + +H:100:78:79:50:You are one of several children of + +H:50:79:80:50:a Brown Yeek. +H:75:79:80:50:a Blue Yeek. +H:95:79:80:85:a Master Yeek. +H:100:79:80:120:Boldor, the King of the Yeeks. + +H:25:80:81:50:You have pale eyes, +H:50:80:81:50:You have glowing eyes, +H:75:80:81:50:You have tiny black eyes, +H:100:80:81:50:You have shining black eyes, + +H:20:81:65:50:no hair at all, +H:40:81:65:50:short black hair, +H:60:81:65:50:long black hair, +H:80:81:65:50:bright red hair, +H:100:81:65:50:colourless albino hair, + +H:100:82:83:50:You are one of several children of + +H:40:83:80:50:a Small Kobold. +H:75:83:80:55:a Kobold. +H:95:83:80:65:a Large Kobold. +H:100:83:80:100:Mughash, the Kobold Lord. + +H:85:84:85:45:You are one of several children +H:100:84:85:50:You are the first child + +H:60:85:50:40:of a Serf. +H:85:85:50:55:of a Devoted Mercenary. +H:96:85:50:60:of a Landed Knight. +H:99:85:50:100:of a Marshal of the Riddermark. +H:100:85:50:120:of a King of the Rohirrim. + +H:100:87:88:89:You are one of several children of + +H:30:88:18:20:a Petty-Dwarf Slave. +H:50:88:18:40:a Petty-Dwarf Thief. +H:70:88:18:60:a Petty-Dwarf Smith. +H:90:88:18:75:a Petty-Dwarf Miner. +H:95:88:18:100:a Petty-Dwarf Shaman. +H:100:88:18:100:Mim, Betrayer of Turin. + +H:85:89:90:50:You are one of many Manwe Maia. +H:100:89:90:60:You are the one of the most famous Manwe Maia. + +H:90:90:93:100:Your eagle looks very good. +H:100:90:93:120:Your eagle is splendid. + +H:10:91:92:20:You are a unnoticed minion of +H:25:91:92:30:You are a minor servant of +H:45:91:92:40:You are a subject of +H:65:91:92:50:You have attached yourself to +H:85:91:92:65:You are associated with +H:95:91:92:80:You are a notable follower of +H:100:91:92:100:You are a celebrated assistant to + +H:20:92:93:55:Nessa. +H:40:92:93:60:Vana. +H:50:92:93:65:Tulkas. +H:80:92:93:75:Mandos. +H:90:92:93:80:Nienna. +H:95:92:93:90:Varda. +H:100:92:93:95:Manwe. + +H:100:93:94:50:In the past you dwelt on earth in the form of + +H:25:94:0:50:various animals. +H:55:94:0:55:a spirit of forest and river. +H:70:94:0:60:a beneficent but unseen force. +H:96:94:0:70:a wise and ancient counsellor. +H:100:94:0:80:a Wizard of legend. + +H:30:95:96:30:You are of an unknown generation of the Ents. +H:40:95:96:50:You are of the third generation of the Ents. +H:60:95:96:60:You are of the second generation of the Ents. +H:100:95:96:80:You are one of the first beings who awoke on Arda. + +H:50:96:0:50:You have green skin and inflexible members. +H:100:96:0:50:You have brown skin and inflexible members. + +H:10:100:101:30:You were born in dirty bilge-water, +H:20:100:101:35:You were born in dirty straw, +H:30:100:101:40:You were born in wet mud, +H:40:100:101:45:You were born in a pile of dust, +H:50:100:101:50:You were born in sand, +H:60:100:101:50:You were born in pebbles, +H:70:100:101:55:You were born in a kobold corpse, +H:80:100:101:60:You were born in dragon droppings, +H:90:100:101:65:You were born in a pile of bones, +H:100:100:101:70:You were born in a corpse of a mighty hero, + +H:10:101:102:30:created by rotting flesh. +H:20:101:102:35:created by a kobold magician. +H:30:101:102:40:created by a corrupted apprentice. +H:40:101:102:45:created by a curious mage apprentice. +H:50:101:102:50:created by an evil Symbiant. +H:60:101:102:50:created by a practicing Necromancer. +H:70:101:102:55:created by the Mutant Breeders. +H:80:101:102:60:created by a curious adventurer. +H:90:101:102:65:called to life by the Witch-King of Angmar. +H:100:101:102:70:called to life by Sauron himself. + +H:100:102:103:50:Since then you have given life to + +H:10:103:104:30:no +H:20:103:104:35:one weak-willed +H:30:103:104:40:two +H:40:103:104:45:three +H:50:103:104:50:four +H:60:103:104:50:five +H:70:103:104:55:about twenty +H:80:103:104:60:dozens of +H:90:103:104:65:hundreds of +H:100:103:104:70:uncounted multitudes of + +H:100:104:0:50:foul offspring. diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index e4857746..59b86e90 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -54,9 +54,6 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 -# Maximum number of histories types in p_info.txt -M:P:H:294 - # Maximum number of skills in s_info.txt M:k:60 diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index daec798d..e1b06ca5 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -2624,7 +2624,7 @@ R:k:+500:+200:Magic ############################################################################## ############################################################################## # H: Race history -# H:index:chance:chart:next chart:social class bonus:desc +# H:chance:chart:next chart:social class bonus:desc # Dunadan, Human: 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. # RohanKnight: 84 -> 85 -> 50 -> 51 -> 52 -> 53. @@ -2650,383 +2650,377 @@ R:k:+500:+200:Magic # Easterling: 105 -> 106 -> 107 -> 108. # Demon: 109 -> 110 -> 111 -> 112. -H:0:10:1:2:25:You are the illegitimate and unacknowledged child -H:1:20:1:2:35:You are the illegitimate but acknowledged child -H:2:95:1:2:45:You are one of several children -H:3:100:1:2:50:You are the first child - -H:4:40:2:3:65:of a Serf. -H:5:65:2:3:80:of a Yeoman. -H:6:80:2:3:90:of a Townsman. -H:7:90:2:3:105:of a Guildsman. -H:8:96:2:3:120:of a Landed Knight. -H:9:99:2:3:130:of a Noble Lord. -H:10:100:2:3:140:of the Royal Blood Line. - -H:11:20:3:50:20:You are the black sheep of the family. -H:12:80:3:50:55:You are a credit to the family. -H:13:100:3:50:60:You are a well-liked child. - -H:14:25:4:1:40:Your mother was of the Avari. -H:15:40:4:1:50:Your father was of the Avari. -H:16:65:4:1:60:Your mother was of the Nandor. -H:17:80:4:1:60:Your father was of the Nandor. -H:18:96:4:1:70:Your mother was of the Sindar. -H:19:99:4:1:70:Your father was of the Sindar. -H:20:100:4:1:100:Your ancestry traces to Elrond. - -H:21:60:5:6:50:You are one of several children -H:22:100:5:6:55:You are the only child - -H:23:40:6:9:40:of an Avarin -H:24:70:6:9:50:of a Nandorin -H:25:100:6:9:60:of a Sindarin - -H:26:60:7:8:50:You are one of several children -H:27:100:7:8:55:You are the only child - -H:28:75:8:9:50:of a Telerin -H:29:95:8:9:55:of a Noldorin -H:30:100:8:9:60:of a Vanyarin - -H:31:40:9:54:80:Ranger. -H:32:70:9:54:90:Archer. -H:33:87:9:54:110:Warrior. -H:34:95:9:54:125:Mage. -H:35:99:9:54:140:Prince. -H:36:100:9:54:145:King. - -H:37:85:10:11:45:You are one of several children of a Hobbit -H:38:100:10:11:55:You are the only child of a Hobbit - -H:39:20:11:3:55:Bum. -H:40:30:11:3:80:Tavern Owner. -H:41:40:11:3:90:Miller. -H:42:50:11:3:100:Home Owner. -H:43:80:11:3:110:Burglar. -H:44:95:11:3:115:Warrior. -H:45:99:11:3:125:Mage. -H:46:100:11:3:140:Clan Elder. - -H:47:85:13:14:45:You are one of several children of a Gnome -H:48:100:13:14:55:You are the only child of a Gnome - -H:49:20:14:3:55:Beggar. -H:50:50:14:3:70:Braggart. -H:51:75:14:3:85:Prankster. -H:52:95:14:3:100:Warrior. -H:53:100:14:3:125:Mage. - -H:54:25:16:17:40:You are one of two children of a Dwarven -H:55:100:16:17:50:You are the only child of a Dwarven - -H:56:10:17:18:60:Thief. -H:57:35:17:18:80:Smith. -H:58:75:17:18:90:Miner. -H:59:90:17:18:110:Warrior. -H:60:99:17:18:130:Priest. -H:61:100:17:18:150:King. - -H:62:15:18:57:10:You are the black sheep of the family. -H:63:85:18:57:50:You are a credit to the family. -H:64:100:18:57:55:You are a well liked child. - -H:65:100:20:2:50:You are the adopted child - -H:66:100:22:23:50:You are the offspring of a - -H:67:30:23:24:20:Forest-Troll -H:68:60:23:24:25:Cave-Troll -H:69:75:23:24:30:Hill-Troll -H:70:90:23:24:35:Stone-Troll -H:71:95:23:24:40:Snow-Troll -H:72:100:23:24:45:Water-Troll - -H:73:25:24:62:50:Worker. -H:74:95:24:62:55:Warrior. -H:75:99:24:62:65:Shaman. -H:76:100:24:62:80:Clan Chief. - -H:77:100:25:26:50:You are one of several children of - -H:78:40:26:27:40:a Snaga -H:79:80:26:27:50:an Orc -H:80:100:26:27:60:an Uruk - -H:81:30:27:28:20:Slave -H:82:60:27:28:50:Archer -H:83:90:27:28:60:Warrior -H:84:95:27:28:80:Shaman -H:85:100:27:28:100:Chieftain - -H:86:30:28:80:50:from the Misty Mountains. -H:87:60:28:80:50:from the Grey Mountains. -H:88:90:28:80:70:from the orc-hold of Mount Gundabad. -H:89:100:28:80:80:from the Pits of Angband. - -H:90:25:29:3:50:You are one of five children of a blue Yeek. -H:91:75:29:3:75:You are one of five children of a brown Yeek. -H:92:100:29:3:100:You are one of five children of a master Yeek. - -H:93:20:50:51:50:You have dark brown eyes, -H:94:60:50:51:50:You have brown eyes, -H:95:70:50:51:50:You have hazel eyes, -H:96:80:50:51:50:You have green eyes, -H:97:90:50:51:50:You have blue eyes, -H:98:100:50:51:50:You have blue-gray eyes, - -H:99:70:51:52:50:straight -H:100:90:51:52:50:wavy -H:101:100:51:52:50:curly - -H:102:30:52:53:50:black hair, -H:103:70:52:53:50:brown hair, -H:104:80:52:53:50:auburn hair, -H:105:90:52:53:50:red hair, -H:106:100:52:53:50:blond hair, - -H:107:10:53:0:50:and a very dark complexion. -H:108:30:53:0:50:and a dark complexion. -H:109:80:53:0:50:and an average complexion. -H:110:90:53:0:50:and a fair complexion. -H:111:100:53:0:50:and a very fair complexion. - -H:112:85:54:55:50:You have light grey eyes, -H:113:95:54:55:50:You have light blue eyes, -H:114:100:54:55:50:You have light green eyes, - -H:115:75:55:56:50:straight -H:116:100:55:56:50:wavy - -H:117:75:56:0:50:black hair, and a fair complexion. -H:118:85:56:0:50:brown hair, and a fair complexion. -H:119:95:56:0:50:blond hair, and a fair complexion. -H:120:100:56:0:50:silver hair, and a fair complexion. - -H:121:99:57:58:50:You have dark brown eyes, -H:122:100:57:58:60:You have glowing red eyes, - -H:123:90:58:59:50:straight -H:124:100:58:59:50:wavy - -H:125:75:59:60:50:black hair, -H:126:100:59:60:50:brown hair, - -H:127:25:60:61:50:a one foot beard, -H:128:60:60:61:51:a two foot beard, -H:129:90:60:61:53:a three foot beard, -H:130:100:60:61:55:a four foot beard, - -H:131:100:61:0:50:and a dark complexion. - -H:132:60:62:63:50:You have slime green eyes, -H:133:85:62:63:50:You have puke yellow eyes, -H:134:99:62:63:50:You have blue-bloodshot eyes, -H:135:100:62:63:55:You have glowing red eyes, - -H:136:33:63:64:50:dirty -H:137:66:63:64:50:mangy -H:138:100:63:64:50:oily - -H:139:33:64:65:50:sea-weed green hair, -H:140:66:64:65:50:bright red hair, -H:141:100:64:65:50:dark purple hair, - -H:142:25:65:66:50:and green -H:143:50:65:66:50:and blue -H:144:75:65:66:50:and white -H:145:100:65:66:50:and black - -H:146:33:66:0:50:ulcerous skin. -H:147:66:66:0:50:scabby skin. -H:148:100:66:0:50:leprous skin. - -H:149:85:69:70:45:You are one of several children of a Dark Elven -H:150:100:69:70:55:You are the only child of a Dark Elven - -H:151:50:70:71:60:Warrior. -H:152:80:70:71:75:Warlock. -H:153:100:70:71:95:Noble. - -H:154:100:71:72:50:You have black eyes, - -H:155:70:72:73:50:straight -H:156:90:72:73:50:wavy -H:157:100:72:73:50:curly - -H:158:100:73:0:50:black hair and a very dark complexion. - -H:159:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. -H:160:100:74:20:25:Your father was an Ogre, but it is unacknowledged. - -H:161:90:75:76:50:You are a descendant of Beorn to the -H:162:100:75:20:100:Your father was Beorn. - -H:163:13:76:20:55:9th degree. -H:164:25:76:20:60:8th degree. -H:165:38:76:20:65:7th degree. -H:166:50:76:20:70:6th degree. -H:167:63:76:20:75:5th degree. -H:168:75:76:20:80:4th degree. -H:169:88:76:20:85:3rd degree. -H:170:100:76:20:90:2nd degree. - -H:171:100:78:79:50:You are one of several children of - -H:172:50:79:80:50:a Brown Yeek. -H:173:75:79:80:50:a Blue Yeek. -H:174:95:79:80:85:a Master Yeek. -H:175:100:79:80:120:Boldor, the King of the Yeeks. - -H:176:25:80:81:50:You have pale eyes, -H:177:50:80:81:50:You have glowing eyes, -H:178:75:80:81:50:You have tiny black eyes, -H:179:100:80:81:50:You have shining black eyes, - -H:180:20:81:65:50:no hair at all, -H:181:40:81:65:50:short black hair, -H:182:60:81:65:50:long black hair, -H:183:80:81:65:50:bright red hair, -H:184:100:81:65:50:colourless albino hair, - -### Kobold histories replaced by Druadan histories - -H:185:100:82:83:50:You are one of several children of - -H:186:40:83:71:50:a Druadan Gatherer. -H:187:75:83:71:55:a Druadan Hunter. -H:188:95:83:71:65:a Druadan Shaman. -H:189:100:83:71:100:Ghan-buri-Ghan. - -H:190:85:84:85:45:You are one of several children -H:191:100:84:85:50:You are the first child - -H:192:60:85:50:40:of a Serf. -H:193:85:85:50:55:of a Devoted Mercenary. -H:194:96:85:50:60:of a Landed Knight. -H:195:99:85:50:100:of a Marshal of the Riddermark. -H:196:100:85:50:120:of a King of the Mark. - -H:197:100:87:88:89:You are one of several children of - -H:198:30:88:18:20:a Petty-Dwarf Slave. -H:199:50:88:18:40:a Petty-Dwarf Thief. -H:200:70:88:18:60:a Petty-Dwarf Smith. -H:201:90:88:18:75:a Petty-Dwarf Miner. -H:202:95:88:18:100:a Petty-Dwarf Shaman. -H:203:100:88:18:100:Mim, Betrayer of Turin. - -H:204:85:89:90:50:You are one of many Eagles of Manwe. -H:205:100:89:90:60:You are the one of the most known Eagles of Manwe. - -H:206:90:90:0:100:Your back and breast are dark brown, and you have very large wings. -H:207:100:90:0:120:Your back and breast are dazzling white, your wings magnificent. - -H:208:10:91:92:20:You are a unnoticed minion of -H:209:25:91:92:30:You are a minor servant of -H:210:45:91:92:40:You are a subject of -H:211:65:91:92:50:You have attached yourself to -H:212:85:91:92:65:You are associated with -H:213:95:91:92:80:You are a notable follower of -H:214:100:91:92:100:You are a celebrated assistant to - -H:215:20:92:93:55:Nessa. -H:216:40:92:93:60:Vana. -H:217:50:92:93:65:Tulkas. -H:218:80:92:93:75:Mandos. -H:219:90:92:93:80:Nienna. -H:220:95:92:93:90:Varda. -H:221:100:92:93:95:Manwe. - -H:222:100:93:94:50:In the past you dwelt on earth in the form of - -H:223:25:94:0:50:various animals. -H:224:55:94:0:55:a spirit of forest and river. -H:225:70:94:0:60:a beneficent but unseen force. -H:226:96:94:0:70:a wise and ancient counsellor. -H:227:100:94:0:80:a Wizard of legend. - -H:228:30:95:96:30:You are of an unknown generation of the Ents. -H:229:40:95:96:50:You are of the third generation of the Ents. -H:230:60:95:96:60:You are of the second generation of the Ents. -H:231:100:95:96:80:You are one of the first beings who awoke on Arda. - -H:232:50:96:0:50:You have green skin and inflexible members. -H:233:100:96:0:50:You have brown skin and inflexible members. - -### Death Mold histories have been replaced by Dragon histories. - -H:234:10:100:101:30:You were born in the land of Rhun, -H:235:20:100:101:35:You were born in the Misty Mountains, -H:236:30:100:101:40:You were born in the Blue Mountains, -H:237:40:100:101:45:You were born in Dol Guldur, -H:238:50:100:101:50:You were born in Angmar, -H:239:60:100:101:50:You were born in Barad-dur, -H:240:70:100:101:55:You were born at the foot of the Orodruin, -H:241:80:100:101:60:You were born in Angband, -H:242:90:100:101:65:You were born in Utumno, -H:243:100:100:101:70:You were born in the Void, - -H:244:10:101:102:30:awakened by accident. -H:245:20:101:102:35:awakened by hunger. -H:246:30:101:102:40:awakened by the glint of jewels. -H:247:40:101:102:45:awakened by an unsuspecting traveler. -H:248:50:101:102:50:awakened by a corrupt Mage. -H:249:60:101:102:50:awakened by an evil Sorcerer. -H:250:70:101:102:55:awakened by a powerful evil Wizard. -H:251:80:101:102:60:awakened by the Witch-King of Angmar. -H:252:90:101:102:65:awakened by Gorthaur. -H:253:100:101:102:70:awakened by Melkor Bauglir. - -H:254:100:102:103:50:Since then you have destroyed - -H:255:10:103:104:30:no -H:256:20:103:104:35:one weak-willed -H:257:30:103:104:40:two -H:258:40:103:104:45:three -H:259:50:103:104:50:four -H:260:60:103:104:50:five -H:261:70:103:104:55:about twenty -H:262:80:103:104:60:dozens of -H:263:90:103:104:65:hundreds of -H:264:100:103:104:70:uncounted multitudes of - -H:265:100:104:0:50:enemies of the Dark. - -### Easterling histories added in the Theme module - -H:266:50:105:106:50:You are one of many children of -H:267:100:105:106:50:You are the only child of - -H:268:20:106:107:35:an Easterling slave. -H:269:30:106:107:40:an Easterling landlord. -H:270:40:106:107:45:an Easterling squire. -H:271:50:106:107:50:an Easterling warrior. -H:272:60:106:107:55:a Wainrider from Near Harad. -H:273:70:106:107:60:a warlord from Far Harad. -H:274:80:106:107:65:a Corsair of Umbar. -H:275:90:106:107:70:Ulfast, son of Ulfang. -H:276:100:106:107:75:Ulwarth, son of Ulfang. - -H:277:25:107:108:10:You have brown eyes, -H:278:50:107:108:30:You have piercing black eyes, -H:279:100:107:108:60:You have alert yellow eyes, - -H:280:50:108:0:25:chestnut brown hair, and a dark complexion. -H:281:100:108:0:50:jet-black hair, and a dark complexion. - -H:282:40:109:110:60:You have only recently been corrupted, -H:283:60:109:110:70:You've been corrupted for quite a while, -H:284:100:109:110:80:You were one of the first beings to be corrupted, - -H:285:40:110:111:60:and your entire being detests this fact. -H:286:60:110:111:70:but you don't mind it so much anymore. -H:287:100:110:111:80:and you consider that to have been your true birth. - -H:288:40:111:112:60:Your watery green eyes -H:289:60:111:112:70:Your piercing black eyes -H:290:100:111:112:80:Your glowing red eyes - -H:291:40:112:0:60:radiate miserable servility. -H:292:60:112:0:70:radiate contempt. -H:293:100:112:0:80:radiate pure evil. +H:10:1:2:25:You are the illegitimate and unacknowledged child +H:20:1:2:35:You are the illegitimate but acknowledged child +H:95:1:2:45:You are one of several children +H:100:1:2:50:You are the first child + +H:40:2:3:65:of a Serf. +H:65:2:3:80:of a Yeoman. +H:80:2:3:90:of a Townsman. +H:90:2:3:105:of a Guildsman. +H:96:2:3:120:of a Landed Knight. +H:99:2:3:130:of a Noble Lord. +H:100:2:3:140:of the Royal Blood Line. + +H:20:3:50:20:You are the black sheep of the family. +H:80:3:50:55:You are a credit to the family. +H:100:3:50:60:You are a well-liked child. + +H:25:4:1:40:Your mother was of the Avari. +H:40:4:1:50:Your father was of the Avari. +H:65:4:1:60:Your mother was of the Nandor. +H:80:4:1:60:Your father was of the Nandor. +H:96:4:1:70:Your mother was of the Sindar. +H:99:4:1:70:Your father was of the Sindar. +H:100:4:1:100:Your ancestry traces to Elrond. + +H:60:5:6:50:You are one of several children +H:100:5:6:55:You are the only child + +H:40:6:9:40:of an Avarin +H:70:6:9:50:of a Nandorin +H:100:6:9:60:of a Sindarin + +H:60:7:8:50:You are one of several children +H:100:7:8:55:You are the only child + +H:75:8:9:50:of a Telerin +H:95:8:9:55:of a Noldorin +H:100:8:9:60:of a Vanyarin + +H:40:9:54:80:Ranger. +H:70:9:54:90:Archer. +H:87:9:54:110:Warrior. +H:95:9:54:125:Mage. +H:99:9:54:140:Prince. +H:100:9:54:145:King. + +H:85:10:11:45:You are one of several children of a Hobbit +H:100:10:11:55:You are the only child of a Hobbit + +H:20:11:3:55:Bum. +H:30:11:3:80:Tavern Owner. +H:40:11:3:90:Miller. +H:50:11:3:100:Home Owner. +H:80:11:3:110:Burglar. +H:95:11:3:115:Warrior. +H:99:11:3:125:Mage. +H:100:11:3:140:Clan Elder. + +H:85:13:14:45:You are one of several children of a Gnome +H:100:13:14:55:You are the only child of a Gnome + +H:20:14:3:55:Beggar. +H:50:14:3:70:Braggart. +H:75:14:3:85:Prankster. +H:95:14:3:100:Warrior. +H:100:14:3:125:Mage. + +H:25:16:17:40:You are one of two children of a Dwarven +H:100:16:17:50:You are the only child of a Dwarven + +H:10:17:18:60:Thief. +H:35:17:18:80:Smith. +H:75:17:18:90:Miner. +H:90:17:18:110:Warrior. +H:99:17:18:130:Priest. +H:100:17:18:150:King. + +H:15:18:57:10:You are the black sheep of the family. +H:85:18:57:50:You are a credit to the family. +H:100:18:57:55:You are a well liked child. + +H:100:20:2:50:You are the adopted child + +H:100:22:23:50:You are the offspring of a + +H:30:23:24:20:Forest-Troll +H:60:23:24:25:Cave-Troll +H:75:23:24:30:Hill-Troll +H:90:23:24:35:Stone-Troll +H:95:23:24:40:Snow-Troll +H:100:23:24:45:Water-Troll + +H:25:24:62:50:Worker. +H:95:24:62:55:Warrior. +H:99:24:62:65:Shaman. +H:100:24:62:80:Clan Chief. + +H:100:25:26:50:You are one of several children of + +H:40:26:27:40:a Snaga +H:80:26:27:50:an Orc +H:100:26:27:60:an Uruk + +H:30:27:28:20:Slave +H:60:27:28:50:Archer +H:90:27:28:60:Warrior +H:95:27:28:80:Shaman +H:100:27:28:100:Chieftain + +H:30:28:80:50:from the Misty Mountains. +H:60:28:80:50:from the Grey Mountains. +H:90:28:80:70:from the orc-hold of Mount Gundabad. +H:100:28:80:80:from the Pits of Angband. + +H:25:29:3:50:You are one of five children of a blue Yeek. +H:75:29:3:75:You are one of five children of a brown Yeek. +H:100:29:3:100:You are one of five children of a master Yeek. + +H:20:50:51:50:You have dark brown eyes, +H:60:50:51:50:You have brown eyes, +H:70:50:51:50:You have hazel eyes, +H:80:50:51:50:You have green eyes, +H:90:50:51:50:You have blue eyes, +H:100:50:51:50:You have blue-gray eyes, + +H:70:51:52:50:straight +H:90:51:52:50:wavy +H:100:51:52:50:curly + +H:30:52:53:50:black hair, +H:70:52:53:50:brown hair, +H:80:52:53:50:auburn hair, +H:90:52:53:50:red hair, +H:100:52:53:50:blond hair, + +H:10:53:0:50:and a very dark complexion. +H:30:53:0:50:and a dark complexion. +H:80:53:0:50:and an average complexion. +H:90:53:0:50:and a fair complexion. +H:100:53:0:50:and a very fair complexion. + +H:85:54:55:50:You have light grey eyes, +H:95:54:55:50:You have light blue eyes, +H:100:54:55:50:You have light green eyes, + +H:75:55:56:50:straight +H:100:55:56:50:wavy + +H:75:56:0:50:black hair, and a fair complexion. +H:85:56:0:50:brown hair, and a fair complexion. +H:95:56:0:50:blond hair, and a fair complexion. +H:100:56:0:50:silver hair, and a fair complexion. + +H:99:57:58:50:You have dark brown eyes, +H:100:57:58:60:You have glowing red eyes, + +H:90:58:59:50:straight +H:100:58:59:50:wavy + +H:75:59:60:50:black hair, +H:100:59:60:50:brown hair, + +H:25:60:61:50:a one foot beard, +H:60:60:61:51:a two foot beard, +H:90:60:61:53:a three foot beard, +H:100:60:61:55:a four foot beard, + +H:100:61:0:50:and a dark complexion. + +H:60:62:63:50:You have slime green eyes, +H:85:62:63:50:You have puke yellow eyes, +H:99:62:63:50:You have blue-bloodshot eyes, +H:100:62:63:55:You have glowing red eyes, + +H:33:63:64:50:dirty +H:66:63:64:50:mangy +H:100:63:64:50:oily + +H:33:64:65:50:sea-weed green hair, +H:66:64:65:50:bright red hair, +H:100:64:65:50:dark purple hair, + +H:25:65:66:50:and green +H:50:65:66:50:and blue +H:75:65:66:50:and white +H:100:65:66:50:and black + +H:33:66:0:50:ulcerous skin. +H:66:66:0:50:scabby skin. +H:100:66:0:50:leprous skin. + +H:85:69:70:45:You are one of several children of a Dark Elven +H:100:69:70:55:You are the only child of a Dark Elven + +H:50:70:71:60:Warrior. +H:80:70:71:75:Warlock. +H:100:70:71:95:Noble. + +H:100:71:72:50:You have black eyes, + +H:70:72:73:50:straight +H:90:72:73:50:wavy +H:100:72:73:50:curly + +H:100:73:0:50:black hair and a very dark complexion. + +H:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. +H:100:74:20:25:Your father was an Ogre, but it is unacknowledged. + +H:90:75:76:50:You are a descendant of Beorn to the +H:100:75:20:100:Your father was Beorn. + +H:13:76:20:55:9th degree. +H:25:76:20:60:8th degree. +H:38:76:20:65:7th degree. +H:50:76:20:70:6th degree. +H:63:76:20:75:5th degree. +H:75:76:20:80:4th degree. +H:88:76:20:85:3rd degree. +H:100:76:20:90:2nd degree. + +H:100:78:79:50:You are one of several children of + +H:50:79:80:50:a Brown Yeek. +H:75:79:80:50:a Blue Yeek. +H:95:79:80:85:a Master Yeek. +H:100:79:80:120:Boldor, the King of the Yeeks. + +H:25:80:81:50:You have pale eyes, +H:50:80:81:50:You have glowing eyes, +H:75:80:81:50:You have tiny black eyes, +H:100:80:81:50:You have shining black eyes, + +H:20:81:65:50:no hair at all, +H:40:81:65:50:short black hair, +H:60:81:65:50:long black hair, +H:80:81:65:50:bright red hair, +H:100:81:65:50:colourless albino hair, + +H:100:82:83:50:You are one of several children of + +H:40:83:71:50:a Druadan Gatherer. +H:75:83:71:55:a Druadan Hunter. +H:95:83:71:65:a Druadan Shaman. +H:100:83:71:100:Ghan-buri-Ghan. + +H:85:84:85:45:You are one of several children +H:100:84:85:50:You are the first child + +H:60:85:50:40:of a Serf. +H:85:85:50:55:of a Devoted Mercenary. +H:96:85:50:60:of a Landed Knight. +H:99:85:50:100:of a Marshal of the Riddermark. +H:100:85:50:120:of a King of the Mark. + +H:100:87:88:89:You are one of several children of + +H:30:88:18:20:a Petty-Dwarf Slave. +H:50:88:18:40:a Petty-Dwarf Thief. +H:70:88:18:60:a Petty-Dwarf Smith. +H:90:88:18:75:a Petty-Dwarf Miner. +H:95:88:18:100:a Petty-Dwarf Shaman. +H:100:88:18:100:Mim, Betrayer of Turin. + +H:85:89:90:50:You are one of many Eagles of Manwe. +H:100:89:90:60:You are the one of the most known Eagles of Manwe. + +H:90:90:0:100:Your back and breast are dark brown, and you have very large wings. +H:100:90:0:120:Your back and breast are dazzling white, your wings magnificent. + +H:10:91:92:20:You are a unnoticed minion of +H:25:91:92:30:You are a minor servant of +H:45:91:92:40:You are a subject of +H:65:91:92:50:You have attached yourself to +H:85:91:92:65:You are associated with +H:95:91:92:80:You are a notable follower of +H:100:91:92:100:You are a celebrated assistant to + +H:20:92:93:55:Nessa. +H:40:92:93:60:Vana. +H:50:92:93:65:Tulkas. +H:80:92:93:75:Mandos. +H:90:92:93:80:Nienna. +H:95:92:93:90:Varda. +H:100:92:93:95:Manwe. + +H:100:93:94:50:In the past you dwelt on earth in the form of + +H:25:94:0:50:various animals. +H:55:94:0:55:a spirit of forest and river. +H:70:94:0:60:a beneficent but unseen force. +H:96:94:0:70:a wise and ancient counsellor. +H:100:94:0:80:a Wizard of legend. + +H:30:95:96:30:You are of an unknown generation of the Ents. +H:40:95:96:50:You are of the third generation of the Ents. +H:60:95:96:60:You are of the second generation of the Ents. +H:100:95:96:80:You are one of the first beings who awoke on Arda. + +H:50:96:0:50:You have green skin and inflexible members. +H:100:96:0:50:You have brown skin and inflexible members. + +H:10:100:101:30:You were born in the land of Rhun, +H:20:100:101:35:You were born in the Misty Mountains, +H:30:100:101:40:You were born in the Blue Mountains, +H:40:100:101:45:You were born in Dol Guldur, +H:50:100:101:50:You were born in Angmar, +H:60:100:101:50:You were born in Barad-dur, +H:70:100:101:55:You were born at the foot of the Orodruin, +H:80:100:101:60:You were born in Angband, +H:90:100:101:65:You were born in Utumno, +H:100:100:101:70:You were born in the Void, + +H:10:101:102:30:awakened by accident. +H:20:101:102:35:awakened by hunger. +H:30:101:102:40:awakened by the glint of jewels. +H:40:101:102:45:awakened by an unsuspecting traveler. +H:50:101:102:50:awakened by a corrupt Mage. +H:60:101:102:50:awakened by an evil Sorcerer. +H:70:101:102:55:awakened by a powerful evil Wizard. +H:80:101:102:60:awakened by the Witch-King of Angmar. +H:90:101:102:65:awakened by Gorthaur. +H:100:101:102:70:awakened by Melkor Bauglir. + +H:100:102:103:50:Since then you have destroyed + +H:10:103:104:30:no +H:20:103:104:35:one weak-willed +H:30:103:104:40:two +H:40:103:104:45:three +H:50:103:104:50:four +H:60:103:104:50:five +H:70:103:104:55:about twenty +H:80:103:104:60:dozens of +H:90:103:104:65:hundreds of +H:100:103:104:70:uncounted multitudes of + +H:100:104:0:50:enemies of the Dark. + +H:50:105:106:50:You are one of many children of +H:100:105:106:50:You are the only child of + +H:20:106:107:35:an Easterling slave. +H:30:106:107:40:an Easterling landlord. +H:40:106:107:45:an Easterling squire. +H:50:106:107:50:an Easterling warrior. +H:60:106:107:55:a Wainrider from Near Harad. +H:70:106:107:60:a warlord from Far Harad. +H:80:106:107:65:a Corsair of Umbar. +H:90:106:107:70:Ulfast, son of Ulfang. +H:100:106:107:75:Ulwarth, son of Ulfang. + +H:25:107:108:10:You have brown eyes, +H:50:107:108:30:You have piercing black eyes, +H:100:107:108:60:You have alert yellow eyes, + +H:50:108:0:25:chestnut brown hair, and a dark complexion. +H:100:108:0:50:jet-black hair, and a dark complexion. + +H:40:109:110:60:You have only recently been corrupted, +H:60:109:110:70:You've been corrupted for quite a while, +H:100:109:110:80:You were one of the first beings to be corrupted, + +H:40:110:111:60:and your entire being detests this fact. +H:60:110:111:70:but you don't mind it so much anymore. +H:100:110:111:80:and you consider that to have been your true birth. + +H:40:111:112:60:Your watery green eyes +H:60:111:112:70:Your piercing black eyes +H:100:111:112:80:Your glowing red eyes + +H:40:112:0:60:radiate miserable servility. +H:60:112:0:70:radiate contempt. +H:100:112:0:80:radiate pure evil. diff --git a/src/birth.cc b/src/birth.cc index 889d1cc9..0d8a5e20 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -58,6 +58,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include #include @@ -518,6 +519,8 @@ static void get_extra(void) */ static void get_history(void) { + auto const &bg = game->edit_data.bg; + int i, n, chart, roll; char *s, *t; @@ -526,7 +529,10 @@ static void get_history(void) /* Clear the previous history strings */ - for (i = 0; i < 4; i++) history[i][0] = '\0'; + for (i = 0; i < 4; i++) + { + history[i][0] = '\0'; + } /* Clear the history text */ buf[0] = '\0'; @@ -543,12 +549,14 @@ static void get_history(void) /* Roll for nobility */ roll = randint(100); - /* Access the proper entry in the table */ - while ((chart != bg[i].chart) || (roll > bg[i].roll)) i++; + while ((chart != bg[i].chart) || (roll > bg[i].roll)) + { + i++; + } /* Acquire the textual history */ - (void)strcat(buf, bg[i].info); + strcat(buf, bg[i].info.c_str()); /* Enter the next chart */ chart = bg[i].next; @@ -2941,12 +2949,9 @@ static bool_ player_birth_aux() /* * Helper function for validate_bg(). */ -static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf) +static void validate_bg_aux(int chart, bool_ chart_checked[], std::string &buf) { - char *s; - - int i; - + auto const &bg = game->edit_data.bg; /* Assume the chart does not exist */ bool_ chart_exists = FALSE; @@ -2954,34 +2959,29 @@ static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf) /* Assume the chart is not complete */ bool_ chart_complete = FALSE; - int bg_max = max_bg_idx; - /* No chart */ if (!chart) return; /* Already saw this chart */ if (chart_checked[chart]) return; - /* Build a debug message */ - s = buf + strlen(buf); - /* XXX XXX XXX */ - (void) strnfmt(s, -1, "%d --> ", chart); + buf += fmt::format("{:d} --> ", chart); /* Check each chart */ - for (i = 0; i < bg_max; i++) + for (auto const &hist: bg) { /* Require same chart */ - if (bg[i].chart != chart) continue; + if (hist.chart != chart) continue; /* The chart exists */ chart_exists = TRUE; /* Validate the "next" chart recursively */ - validate_bg_aux(bg[i].next, chart_checked, buf); + validate_bg_aux(hist.next, chart_checked, buf); /* Require a terminator */ - if (bg[i].roll != 100) continue; + if (hist.roll != 100) continue; /* The chart is complete */ chart_complete = TRUE; @@ -2990,7 +2990,7 @@ static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf) /* Failed: The chart does not exist */ if (!chart_exists) { - quit_fmt("birth.c: bg[] chart %d does not exist\n%s", chart, buf); + quit_fmt("birth.c: bg[] chart %d does not exist\n%s", chart, buf.c_str()); } /* Failed: The chart is not complete */ @@ -3001,9 +3001,6 @@ static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf) /* Remember we saw this chart */ chart_checked[chart] = TRUE; - - /* Build a debug message */ - *s = 0; } @@ -3027,10 +3024,8 @@ static void validate_bg(void) /* Get the first chart for this race */ int chart = race.chart; - /* Buffer */ - char buf[1024] = { '\0' }; - /* Validate the chart recursively */ + std::string buf; validate_bg_aux(chart, chart_checked, buf); } } diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 7addfd65..9370b7d4 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,5 +1,6 @@ #pragma once +#include "hist_type.hpp" #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -58,4 +59,9 @@ struct GameEditData { */ std::vector race_mod_info; + /** + * Player race histories + */ + std::vector bg; + }; diff --git a/src/hist_type.hpp b/src/hist_type.hpp index 2da47b7c..07b5a632 100644 --- a/src/hist_type.hpp +++ b/src/hist_type.hpp @@ -2,12 +2,14 @@ #include "h-basic.h" +#include + /** * Player background descriptor. */ struct hist_type { - char *info; /* Textual History */ + std::string info; /* Textual History */ byte roll; /* Frequency of this entry */ s16b chart; /* Chart index */ diff --git a/src/hist_type_fwd.hpp b/src/hist_type_fwd.hpp deleted file mode 100644 index d1cbce91..00000000 --- a/src/hist_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct hist_type; diff --git a/src/init1.cc b/src/init1.cc index 3b0bb701..f6d798a9 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -922,6 +922,7 @@ errr init_player_info_txt(FILE *fp) auto &class_info = game->edit_data.class_info; auto &race_info = game->edit_data.race_info; auto &race_mod_info = game->edit_data.race_mod_info; + auto &bg = game->edit_data.bg; int lev = 1; int tit_idx = 0; @@ -962,21 +963,21 @@ errr init_player_info_txt(FILE *fp) /* Process 'H' for "History" */ if (buf[0] == 'H') { - int idx; - char *zz[6]; + char *zz[5]; /* Scan for the values */ - if (tokenize(buf + 2, 6, zz, ':', ':') != 6) return (1); + if (tokenize(buf + 2, 5, zz, ':', ':') != 5) return (1); - idx = atoi(zz[0]); - bg[idx].roll = atoi(zz[1]); - bg[idx].chart = atoi(zz[2]); - bg[idx].next = atoi(zz[3]); - bg[idx].bonus = atoi(zz[4]); + /* Create new entry */ + hist_type hist; + hist.roll = atoi(zz[0]); + hist.chart = atoi(zz[1]); + hist.next = atoi(zz[2]); + hist.bonus = atoi(zz[3]); + hist.info = my_strdup(zz[4]); - /* Copy text */ - assert(!bg[idx].info); - bg[idx].info = my_strdup(zz[5]); + /* Append */ + bg.emplace_back(hist); /* Next... */ continue; @@ -6940,15 +6941,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_o_idx = atoi(zz[1]); } - /* Maximum player types */ - else if (zz[0][0] == 'P') - { - if (zz[1][0] == 'H') - { - max_bg_idx = atoi(zz[2]); - } - } - /* Maximum m_idx */ else if (zz[0][0] == 'M') { diff --git a/src/init2.cc b/src/init2.cc index 1596c057..be69192f 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -15,7 +15,6 @@ #include "generate.hpp" #include "gen_evol.hpp" #include "gen_maze.hpp" -#include "hist_type.hpp" #include "hooks.hpp" #include "init1.hpp" #include "lua_bind.hpp" @@ -551,7 +550,6 @@ namespace { static void allocate() { - bg = make_array(max_bg_idx); gen_skill = new skill_modifiers; } diff --git a/src/variable.cc b/src/variable.cc index 426d4b3a..272d9267 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -773,12 +773,6 @@ DECLARE_FLAG_ZERO_IMPL(dungeon_flag_set, dungeon_flags); */ birther previous_char; -/* - * Race histories - */ -hist_type *bg; -int max_bg_idx; - /* * The spell list of schools */ diff --git a/src/variable.hpp b/src/variable.hpp index 80520f67..9b1e4816 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -13,7 +13,6 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "feature_type_fwd.hpp" -#include "hist_type_fwd.hpp" #include "monster_ego_fwd.hpp" #include "monster_race_fwd.hpp" #include "monster_type_fwd.hpp" @@ -225,7 +224,6 @@ extern bool_ *special_lvl[MAX_DUNGEON_DEPTH]; extern bool_ generate_special_feeling; DECLARE_FLAG_ZERO_INTF(dungeon_flag_set, dungeon_flags); extern birther previous_char; -extern int max_bg_idx; extern s16b schools_count; extern school_type schools[SCHOOLS_MAX]; extern int project_time; @@ -248,7 +246,6 @@ extern s32b DUNGEON_ASTRAL_WILD_Y; extern deity_type deity_info[MAX_GODS]; extern timer_type *gl_timers; extern const char *get_version_string(); -extern hist_type *bg; extern bool_ arg_wizard; extern bool_ arg_force_original; extern bool_ arg_force_roguelike; -- cgit v1.2.3 From 4b179786d73cde338e97503d036baea9015f655d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move gen_skill to GameEditData --- src/game_edit_data.hpp | 5 +++++ src/init1.cc | 3 ++- src/init2.cc | 2 +- src/skills.cc | 5 ++++- src/variable.cc | 5 ----- src/variable.hpp | 1 - 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 9370b7d4..bfb2e418 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -64,4 +64,9 @@ struct GameEditData { */ std::vector bg; + /** + * Base skills for all characters. + */ + skill_modifiers gen_skill; + }; diff --git a/src/init1.cc b/src/init1.cc index f6d798a9..afd256a4 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -923,6 +923,7 @@ errr init_player_info_txt(FILE *fp) auto &race_info = game->edit_data.race_info; auto &race_mod_info = game->edit_data.race_mod_info; auto &bg = game->edit_data.bg; + auto &gen_skill = game->edit_data.gen_skill; int lev = 1; int tit_idx = 0; @@ -986,7 +987,7 @@ errr init_player_info_txt(FILE *fp) /* Process 'G:k' for "General skills" */ if ((buf[0] == 'G') && (buf[2] == 'k')) { - if (read_skill_modifiers(gen_skill, buf + 4)) + if (read_skill_modifiers(&gen_skill, buf + 4)) { return 1; } diff --git a/src/init2.cc b/src/init2.cc index be69192f..f48cc44c 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -550,7 +550,7 @@ namespace { static void allocate() { - gen_skill = new skill_modifiers; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/skills.cc b/src/skills.cc index b97e80a8..a1f9f793 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -14,6 +14,7 @@ #include "cmd3.hpp" #include "cmd5.hpp" #include "cmd7.hpp" +#include "game.hpp" #include "gods.hpp" #include "help.hpp" #include "hooks.hpp" @@ -1198,7 +1199,9 @@ static void augment_skills(s32b *v, s32b *m, skill_modifier const &s) */ void compute_skills(s32b *v, s32b *m, int i) { - augment_skills(v, m, gen_skill->modifiers[i]); + auto const &gen_skill = game->edit_data.gen_skill; + + augment_skills(v, m, gen_skill.modifiers[i]); augment_skills(v, m, rp_ptr->skill_modifiers.modifiers[i]); augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers[i]); augment_skills(v, m, cp_ptr->skill_modifiers.modifiers[i]); diff --git a/src/variable.cc b/src/variable.cc index 272d9267..b1a8c674 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -786,11 +786,6 @@ int project_time = 0; s32b project_time_effect = 0; effect_type effects[MAX_EFFECTS]; -/* - * General skills set - */ -skill_modifiers *gen_skill; - /* * Table of "cli" macros. */ diff --git a/src/variable.hpp b/src/variable.hpp index 9b1e4816..4f00f1da 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -229,7 +229,6 @@ extern school_type schools[SCHOOLS_MAX]; extern int project_time; extern s32b project_time_effect; extern effect_type effects[MAX_EFFECTS]; -extern skill_modifiers *gen_skill; extern bool_ automatizer_enabled; extern s16b last_teleportation_y; extern s16b last_teleportation_x; -- cgit v1.2.3 From 667acd0e312301ad613b6a71f843c51d2062aee6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move d_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/birth.cc | 61 ++++++++++++++++++++++++-------------------- src/cmd1.cc | 3 +++ src/cmd2.cc | 16 +++++++++--- src/cmd4.cc | 15 ++++++++--- src/cmd6.cc | 3 +++ src/dungeon.cc | 8 +++++- src/files.cc | 32 +++++++++++++++-------- src/game_edit_data.hpp | 6 +++++ src/generate.cc | 40 +++++++++++++++++++++++++---- src/init1.cc | 49 +++++++++++++++++------------------ src/init2.cc | 22 ++++++++-------- src/levels.cc | 23 ++++++++++++++--- src/loadsave.cc | 18 ++++++++----- src/monster2.cc | 8 ++++-- src/object1.cc | 2 ++ src/object2.cc | 4 +++ src/player_type.hpp | 2 +- src/q_god.cc | 22 +++++++++++++++- src/q_rand.cc | 9 ++++--- src/q_thrain.cc | 3 +++ src/spells1.cc | 3 +++ src/spells2.cc | 18 ++++++++++--- src/traps.cc | 5 +++- src/variable.cc | 10 -------- src/variable.hpp | 3 --- src/wizard2.cc | 6 ++++- src/xtra1.cc | 4 ++- src/xtra2.cc | 4 +++ 30 files changed, 274 insertions(+), 131 deletions(-) diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 4ad6829e..69f02bdb 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -36,9 +36,6 @@ M:s:10 # Maximum number of ego-items in e_info.txt M:E:200 -# Maximum number of dungeon types in d_info.txt -M:D:31 - # Maximum number of trap types in tr_info.txt M:U:176 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 59b86e90..8c5aceec 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -36,9 +36,6 @@ M:s:17 # Maximum number of ego-items in e_info.txt M:E:238 -# Maximum number of dungeon types in d_info.txt -M:D:41 - # Maximum number of trap types in tr_info.txt M:U:176 diff --git a/src/birth.cc b/src/birth.cc index 0d8a5e20..2106527c 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -719,8 +719,7 @@ static void birth_put_stats(void) */ static void player_wipe(void) { - int i, j; - + auto const &d_info = game->edit_data.d_info; /* Wipe special levels */ wipe_saved(); @@ -735,9 +734,9 @@ static void player_wipe(void) p_ptr->lives = 0; /* Wipe the history */ - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { - for (j = 0; j < 60; j++) + for (std::size_t j = 0; j < 60; j++) { if (j < 59) history[i][j] = ' '; else history[i][j] = '\0'; @@ -745,22 +744,22 @@ static void player_wipe(void) } /* Wipe the towns */ - for (i = 0; i < max_d_idx; i++) + for (std::size_t i = 0; i < d_info.size(); i++) { - for (j = 0; j < MAX_DUNGEON_DEPTH; j++) + for (std::size_t j = 0; j < MAX_DUNGEON_DEPTH; j++) { special_lvl[j][i] = 0; } } /* Wipe the towns */ - for (i = max_real_towns + 1; i < max_towns; i++) + for (std::size_t i = max_real_towns + 1; i < max_towns; i++) { town_info[i].flags = 0; } /* Wipe the quests */ - for (i = 0; i < MAX_Q_IDX; i++) + for (std::size_t i = 0; i < MAX_Q_IDX; i++) { quest[i].status = QUEST_STATUS_UNTAKEN; for (auto &quest_data : quest[i].data) @@ -774,7 +773,7 @@ static void player_wipe(void) equip_cnt = 0; /* Clear the inventory */ - for (i = 0; i < INVEN_TOTAL; i++) + for (std::size_t i = 0; i < INVEN_TOTAL; i++) { object_wipe(&p_ptr->inventory[i]); } @@ -783,14 +782,14 @@ static void player_wipe(void) init_randart(); /* Start with no artifacts made yet */ - for (i = 0; i < max_a_idx; i++) + for (std::size_t i = 0; i < max_a_idx; i++) { artifact_type *a_ptr = &a_info[i]; a_ptr->cur_num = 0; } /* Reset the "objects" */ - for (i = 1; i < max_k_idx; i++) + for (std::size_t i = 1; i < max_k_idx; i++) { object_kind *k_ptr = &k_info[i]; @@ -806,7 +805,7 @@ static void player_wipe(void) /* Reset the "monsters" */ - for (i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; @@ -843,7 +842,7 @@ static void player_wipe(void) wizard = 0; /* Clear the fate */ - for (i = 0; i < MAX_FATES; i++) + for (std::size_t i = 0; i < MAX_FATES; i++) { fates[i].fate = 0; } @@ -871,7 +870,7 @@ static void player_wipe(void) doppleganger = 0; /* Wipe the recall depths */ - for (i = 0; i < max_d_idx; i++) + for (std::size_t i = 0; i < d_info.size(); i++) { max_dlv[i] = 0; } @@ -883,7 +882,7 @@ static void player_wipe(void) } /* Wipe the known traps list */ - for (i = 0; i < max_t_idx; i++) + for (std::size_t i = 0; i < max_t_idx; i++) { t_info[i].known = 0; t_info[i].ident = FALSE; @@ -897,7 +896,7 @@ static void player_wipe(void) p_ptr->allow_one_death = 0; /* Wipe the power list */ - for (i = 0; i < POWER_MAX; i++) + for (std::size_t i = 0; i < POWER_MAX; i++) { p_ptr->powers_mod[i] = 0; } @@ -1496,6 +1495,7 @@ static bool_ player_birth_aux_ask() auto &class_info = game->edit_data.class_info; auto const &race_info = game->edit_data.race_info; auto const &race_mod_info = game->edit_data.race_mod_info; + auto const &d_info = game->edit_data.d_info; int k, n, v, sel; @@ -3055,7 +3055,10 @@ static void init_town(int t_idx) */ void player_birth(void) { - int i, j, rtown = TOWN_RANDOM; + auto &d_info = game->edit_data.d_info; + + /* Starting index for generated towns */ + std::size_t rtown = TOWN_RANDOM; /* Validate the bg[] table */ validate_bg(); @@ -3081,9 +3084,11 @@ void player_birth(void) apply_level_abilities(1); /* Complete the god */ - i = p_ptr->pgod; - p_ptr->pgod = 0; - follow_god(i, TRUE); + { + byte i = p_ptr->pgod; + p_ptr->pgod = 0; + follow_god(i, TRUE); + } /* Select the default melee type */ select_default_melee(); @@ -3102,9 +3107,9 @@ void player_birth(void) player_outfit(); /* Initialize random towns in the dungeons */ - for (i = 0; i < max_d_idx; i++) + for (std::size_t i = 0; i < d_info.size(); i++) { - dungeon_info_type *d_ptr = &d_info[i]; + auto d_ptr = &d_info[i]; int num = 0, z; d_ptr->t_num = 0; @@ -3125,15 +3130,17 @@ void player_birth(void) while (TRUE) { - int j; bool_ ok = TRUE; lev = rand_range(d_ptr->mindepth, d_ptr->maxdepth - 1); /* Be sure it wasnt already used */ - for (j = 0; j < num; j++) + for (int j = 0; j < num; j++) { - if (d_ptr->t_level[j] == lev) ok = FALSE; + if (d_ptr->t_level[j] == lev) + { + ok = FALSE; + } } /* Ok found one */ @@ -3159,7 +3166,7 @@ void player_birth(void) } /* Init the towns */ - for (i = 1; i < max_towns; i++) + for (std::size_t i = 1; i < max_towns; i++) { /* Not destroyed ! yet .. ;) */ town_info[i].destroyed = FALSE; @@ -3170,7 +3177,7 @@ void player_birth(void) create_stores_stock(i); /* Init the stores */ - for (j = 0; j < max_st_idx; j++) + for (std::size_t j = 0; j < max_st_idx; j++) { /* Initialize */ store_init(i, j); diff --git a/src/cmd1.cc b/src/cmd1.cc index c0283512..7d53fbef 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -16,6 +16,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hooks.hpp" #include "hook_move_in.hpp" @@ -2724,6 +2725,8 @@ static bool_ easy_open_door(int y, int x) */ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) { + auto const &d_info = game->edit_data.d_info; + int y, x, tmp; cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px]; diff --git a/src/cmd2.cc b/src/cmd2.cc index eccf37f0..c581d89b 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -164,13 +164,15 @@ static bool ask_leave() */ void do_cmd_go_up(void) { + auto const &d_info = game->edit_data.d_info; + bool_ go_up = FALSE, go_up_many = FALSE, prob_traveling = FALSE; cave_type *c_ptr; int oldl = dun_level; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; /* Player grid */ @@ -358,6 +360,8 @@ static bool_ between_effect(void) */ void do_cmd_go_down(void) { + auto const &d_info = game->edit_data.d_info; + cave_type *c_ptr; bool_ go_down = FALSE, go_down_many = FALSE, prob_traveling = FALSE; @@ -368,7 +372,7 @@ void do_cmd_go_down(void) int old_dun = dun_level; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; /* MUST be actived now */ @@ -513,7 +517,7 @@ void do_cmd_go_down(void) { if (d_info[c_ptr->special].min_plev <= p_ptr->lev) { - dungeon_info_type *d_ptr = &d_info[c_ptr->special]; + auto d_ptr = &d_info[c_ptr->special]; /* Do the lua scripts refuse ? ;) */ { @@ -649,6 +653,8 @@ static s16b chest_check(int y, int x) */ static void chest_death(int y, int x, s16b o_idx) { + auto const &d_info = game->edit_data.d_info; + int number; bool_ small; @@ -1458,6 +1464,8 @@ static bool_ twall(int y, int x, byte feat) */ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) { + auto const &d_info = game->edit_data.d_info; + int skill_req = 0, skill_req_1pct = 0; cave_type *c_ptr = &cave[y][x]; @@ -4223,6 +4231,8 @@ void do_cmd_boomerang(void) static bool_ tport_vertically(bool_ how) { + auto const &d_info = game->edit_data.d_info; + /* quest? */ if (p_ptr->inside_quest) { diff --git a/src/cmd4.cc b/src/cmd4.cc index 12d47324..b06947dc 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -14,6 +14,7 @@ #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "init1.hpp" #include "levels.hpp" @@ -2722,6 +2723,8 @@ static cptr do_cmd_feeling_text[11] = */ void do_cmd_feeling(void) { + auto const &d_info = game->edit_data.d_info; + /* Verify the feeling */ if (feeling < 0) feeling = 0; if (feeling > 10) feeling = 10; @@ -2763,7 +2766,7 @@ void do_cmd_feeling(void) { /* This could be simplified with a correct p_ptr->town_num */ int i, town_level = 0; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; /* Is it a town level ? */ for (i = 0; i < TOWN_DUNGEON; i++) @@ -3625,10 +3628,12 @@ static void do_cmd_knowledge_objects(void) */ static void do_cmd_knowledge_dungeons(void) { + auto const &d_info = game->edit_data.d_info; + fmt::MemoryWriter w; /* Scan all dungeons */ - for (int y = 1; y < max_d_idx; y++) + for (std::size_t y = 1; y < d_info.size(); y++) { /* The dungeon has a valid recall depth set */ if (max_dlv[y]) @@ -3651,12 +3656,14 @@ static void do_cmd_knowledge_dungeons(void) */ void do_cmd_knowledge_towns(void) { + auto const &d_info = game->edit_data.d_info; + fmt::MemoryWriter w; /* Scan all dungeons */ - for (int i = 0; i < max_d_idx; i++) + for (auto const &d_ref: d_info) { - dungeon_info_type *d_ptr = &d_info[i]; + auto d_ptr = &d_ref; /* Scan all dungeon town slots */ for (int j = 0; j < TOWN_DUNGEON; j++) diff --git a/src/cmd6.cc b/src/cmd6.cc index 393261bf..e52d1e32 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -18,6 +18,7 @@ #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hook_eat_in.hpp" #include "hook_eat_out.hpp" #include "hooks.hpp" @@ -2867,6 +2868,8 @@ static object_filter_t const &item_tester_hook_readable() */ void do_cmd_read_scroll(void) { + auto const &d_info = game->edit_data.d_info; + /* Check some conditions */ if (p_ptr->blind) { diff --git a/src/dungeon.cc b/src/dungeon.cc index 6f1c8c5a..a2696236 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1215,6 +1215,8 @@ static void process_world_gods() */ static void process_world(void) { + auto const &d_info = game->edit_data.d_info; + timer_type *t_ptr; int x, y, i, j; @@ -1223,7 +1225,7 @@ static void process_world(void) bool_ cave_no_regen = FALSE; int upkeep_factor = 0; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; cave_type *c_ptr; @@ -4636,6 +4638,8 @@ static void process_player(void) */ static void dungeon(void) { + auto const &d_info = game->edit_data.d_info; + /* Reset various flags */ hack_mind = FALSE; @@ -5054,6 +5058,8 @@ static void load_all_pref_files(void) */ void play_game() { + auto const &d_info = game->edit_data.d_info; + int i, tmp_dun; bool_ cheat_death = FALSE; diff --git a/src/files.cc b/src/files.cc index cec925df..d85a7dbf 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2325,6 +2325,7 @@ void display_player(int mode) cptr describe_player_location() { auto const &wilderness = game->wilderness; + auto const &d_info = game->edit_data.d_info; int i; static char desc[80]; @@ -2563,6 +2564,8 @@ static bool_ file_character_check_stores(std::unordered_set *seen_ */ errr file_character(cptr name, bool_ full) { + auto const &d_info = game->edit_data.d_info; + int i, j, x, y; byte a; char c; @@ -2691,7 +2694,7 @@ errr file_character(cptr name, bool_ full) fprintf(fff, "\n Always unusual rooms: OFF"); fprintf(fff, "\n\n Recall Depth:"); - for (y = 1; y < max_d_idx; y++) + for (y = 1; y < static_cast(d_info.size()); y++) { if (max_dlv[y]) fprintf(fff, "\n %s: Level %d (%d')", @@ -4011,7 +4014,9 @@ void autosave_checkpoint() */ static long total_points(void) { - s16b max_dl = 0, i, k; + auto const &d_info = game->edit_data.d_info; + + s16b max_dl = 0; long temp, Total = 0; long mult = 20; /* was 100. Divided values by 5 because of an overflow error */ long comp_death = (p_ptr->companion_killed * 2 / 5); @@ -4028,9 +4033,13 @@ static long total_points(void) if (mult < 2) mult = 2; /* At least 10% of the original score */ /* mult is now between 2 and 40, i.e. 10% and 200% */ - for (i = 0; i < max_d_idx; i++) + for (std::size_t i = 0; i < d_info.size(); i++) + { if (max_dlv[i] > max_dl) + { max_dl = max_dlv[i]; + } + } temp = p_ptr->lev * p_ptr->lev * p_ptr->lev * p_ptr->lev + (100 * max_dl); @@ -4042,7 +4051,7 @@ static long total_points(void) temp += p_ptr->au / 5; /* Completing quest increase score */ - for (i = 0; i < MAX_Q_IDX; i++) + for (std::size_t i = 0; i < MAX_Q_IDX; i++) { if (quest[i].status >= QUEST_STATUS_COMPLETED) { @@ -4056,7 +4065,7 @@ static long total_points(void) /* The know objects increase the score */ /* Scan the object kinds */ - for (k = 1; k < max_k_idx; k++) + for (std::size_t k = 1; k < max_k_idx; k++) { object_kind *k_ptr = &k_info[k]; @@ -4079,7 +4088,7 @@ static long total_points(void) } } - for (k = 1; k < max_r_idx; k++) + for (std::size_t k = 1; k < max_r_idx; k++) { monster_race *r_ptr = &r_info[k]; @@ -5132,13 +5141,16 @@ static void kingly(void) */ void wipe_saved() { - int d, l, od = dungeon_type, ol = dun_level; + auto const &d_info = game->edit_data.d_info; + + int od = dungeon_type; + int ol = dun_level; - for (d = 0; d < max_d_idx; d++) + for (std::size_t d = 0; d < d_info.size(); d++) { - dungeon_info_type *d_ptr = &d_info[d]; + auto d_ptr = &d_info[d]; - for (l = d_ptr->mindepth; l <= d_ptr->maxdepth; l++) + for (auto l = d_ptr->mindepth; l <= d_ptr->maxdepth; l++) { char buf[10]; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index bfb2e418..6f1ffa8f 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,5 +1,6 @@ #pragma once +#include "dungeon_info_type.hpp" #include "hist_type.hpp" #include "owner_type.hpp" #include "player_class.hpp" @@ -18,6 +19,11 @@ */ struct GameEditData { + /** + * Dungeons + */ + std::vector d_info; + /** * Vaults */ diff --git a/src/generate.cc b/src/generate.cc index 3f6d64c0..a3b3d0bd 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -430,6 +430,8 @@ static void place_up_stairs(int y, int x) */ static void place_down_stairs(int y, int x) { + auto const &d_info = game->edit_data.d_info; + cave_type *c_ptr = &cave[y][x]; /* @@ -456,7 +458,9 @@ static void place_down_stairs(int y, int x) */ static bool_ is_safe_floor(int y, int x) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; byte feat = cave[y][x].feat; /* One of the legal floor types */ @@ -886,6 +890,8 @@ static void place_between(int y, int x) */ static void place_random_stairs(int y, int x) { + auto const &d_info = game->edit_data.d_info; + /* Paranoia */ if (!cave_clean_bold(y, x)) return; @@ -1022,6 +1028,8 @@ static void place_random_door(int y, int x) */ static void alloc_stairs(int feat, int num, int walls, int branch) { + auto const &d_info = game->edit_data.d_info; + int y, x, i, j, cnt; /* Place "num" stairs */ @@ -1413,6 +1421,8 @@ static void add_river(int feat1, int feat2) */ static void build_streamer(int feat, int chance) { + auto const &d_info = game->edit_data.d_info; + int i, tx, ty; int y, x, dir; int dummy = 0; @@ -6126,6 +6136,8 @@ static void build_type12(int by0, int bx0) */ static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water) { + auto const &d_info = game->edit_data.d_info; + int i, y, x; int tmp_row, tmp_col; int row_dir, col_dir; @@ -6380,6 +6392,8 @@ static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water) */ static int next_to_corr(int y1, int x1) { + auto const &d_info = game->edit_data.d_info; + int i, y, x, k = 0; cave_type *c_ptr; @@ -6684,8 +6698,10 @@ static void fill_level(bool_ use_floor, byte smooth); */ bool_ level_generate_dungeon() { + auto const &d_info = game->edit_data.d_info; + int i, k, y, x, y1, x1, branch = get_branch(); - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; int max_vault_ok = 2; @@ -7240,7 +7256,9 @@ static void save_all_friends() */ static void init_feat_info(void) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; int i; int cur_depth, max_depth; int p1, p2; @@ -7346,6 +7364,8 @@ static void init_feat_info(void) static void fill_level(bool_ use_floor, byte smooth) { + auto const &d_info = game->edit_data.d_info; + int y, x; int step; int shift; @@ -7598,7 +7618,9 @@ static void supersize_grid_tile(int sy, int sx, int ty, int tx) */ static bool_ cave_gen(void) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; int max_vault_ok = 2; @@ -8117,6 +8139,8 @@ static bool_ cave_gen(void) bool_ build_special_level(void) { + auto const &d_info = game->edit_data.d_info; + char buf[80]; int y, x, ystart = 2, xstart = 2; s16b level; @@ -8178,6 +8202,8 @@ bool_ build_special_level(void) */ static void wipe_special_level(void) { + auto const &d_info = game->edit_data.d_info; + s16b level; char buf[80]; @@ -8204,6 +8230,8 @@ static void wipe_special_level(void) */ static void finalise_special_level(void) { + auto const &d_info = game->edit_data.d_info; + s16b level; char buf[80]; @@ -8274,7 +8302,9 @@ static void generate_grid_mana() */ void generate_cave(void) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; int tester_1, tester_2; int y, x, num, i; bool_ loaded = FALSE; diff --git a/src/init1.cc b/src/init1.cc index afd256a4..5fd257b0 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5113,15 +5113,14 @@ errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str) */ errr init_d_info_txt(FILE *fp) { - int i, j; + auto &d_info = game->edit_data.d_info; + char buf[1024]; s16b rule_num = 0; byte r_char_number = 0; - char *s; - /* Current entry */ dungeon_info_type *d_ptr = NULL; @@ -5148,7 +5147,7 @@ errr init_d_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -5160,19 +5159,16 @@ errr init_d_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_d_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - d_ptr = &d_info[i]; + d_ptr = &expand_to_fit_index(d_info, i); /* Copy name */ assert(!d_ptr->name); @@ -5191,14 +5187,15 @@ errr init_d_info_txt(FILE *fp) d_ptr->fill_method = 1; rule_num = -1; r_char_number = 0; - for (j = 0; j < 5; j++) + for (std::size_t j = 0; j < 5; j++) { - int k; - d_ptr->rules[j].mode = DUNGEON_MODE_NONE; d_ptr->rules[j].percent = 0; - for (k = 0; k < 5; k++) d_ptr->rules[j].r_char[k] = 0; + for (std::size_t k = 0; k < 5; k++) + { + d_ptr->rules[j].r_char[k] = 0; + } } /* Set default drop theme */ @@ -5223,7 +5220,7 @@ errr init_d_info_txt(FILE *fp) d_ptr->short_name[2] = buf[4]; /* Acquire the text */ - s = buf + 6; + char *s = buf + 6; /* Append to description */ strappend(&d_ptr->text, s); @@ -5369,8 +5366,15 @@ errr init_d_info_txt(FILE *fp) cptr tmp; /* Find the next empty blow slot (if any) */ - for (i = 0; i < 4; i++) if ((!d_ptr->d_side[i]) && - (!d_ptr->d_dice[i])) break; + std::size_t i; + for (i = 0; i < 4; i++) + { + if ((!d_ptr->d_side[i]) && + (!d_ptr->d_dice[i])) + { + break; + } + } /* Oops, no more slots */ if (i == 4) return (1); @@ -5423,7 +5427,8 @@ errr init_d_info_txt(FILE *fp) int artif = 0, monst = 0, obj = 0; int ix = -1, iy = -1, ox = -1, oy = -1; int fill_method; - s = buf + 2; + + char const *s = buf + 2; /* Read dungeon in/out coords */ if (4 == sscanf(s, "WILD_%d_%d__%d_%d", &ix, &iy, &ox, &oy)) @@ -5519,7 +5524,7 @@ errr init_d_info_txt(FILE *fp) if (buf[0] == 'M') { byte r_char; - s = buf + 2; + char const *s = buf + 2; /* Read monster symbols */ if (1 == sscanf(s, "R_CHAR_%c", &r_char)) @@ -5546,7 +5551,7 @@ errr init_d_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - s = buf + 2; + char const *s = buf + 2; /* Parse this entry */ if (0 != grab_one_monster_spell_flag(&d_ptr->rules[rule_num].mspells, s)) @@ -6984,12 +6989,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst wilderness.height(atoi(zz[1])); } - /* Maximum d_idx */ - else if (zz[0][0] == 'D') - { - max_d_idx = atoi(zz[1]); - } - return (0); } } diff --git a/src/init2.cc b/src/init2.cc index f48cc44c..f664ba40 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -438,7 +438,7 @@ namespace { static void allocate() { - d_info = new dungeon_info_type[max_d_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -717,7 +717,7 @@ void create_stores_stock(int t) */ static errr init_other(void) { - int i, n; + auto const &d_info = game->edit_data.d_info; /*** Prepare the "dungeon" information ***/ @@ -743,27 +743,27 @@ static errr init_other(void) km_list = new monster_type[max_m_idx]; /* Allocate and Wipe the max dungeon level */ - max_dlv = make_array(max_d_idx); + max_dlv = make_array(d_info.size()); /* Allocate and Wipe the special levels */ - for (i = 0; i < MAX_DUNGEON_DEPTH; i++) + for (std::size_t i = 0; i < MAX_DUNGEON_DEPTH; i++) { - special_lvl[i] = make_array(max_d_idx); + special_lvl[i] = make_array(d_info.size()); } /* Allocate and wipe each line of the cave */ cave = new cave_type *[MAX_HGT]; - for (i = 0; i < MAX_HGT; i++) + for (std::size_t i = 0; i < MAX_HGT; i++) { /* Allocate one row of the cave */ cave[i] = new cave_type[MAX_WID]; } /* Analyze the windows */ - for (n = 0; n < 8; n++) + for (std::size_t n = 0; n < 8; n++) { /* Analyze the options */ - for (i = 0; i < 32; i++) + for (std::size_t i = 0; i < 32; i++) { /* Accept */ if (window_flag_desc[i]) @@ -1007,12 +1007,12 @@ static void init_sets_aux() */ static void init_guardians(void) { - int i; + auto const &d_info = game->edit_data.d_info; /* Scan dungeons */ - for (i = 0; i < max_d_idx; i++) + for (std::size_t i = 0; i < d_info.size(); i++) { - dungeon_info_type *d_ptr = &d_info[i]; + auto d_ptr = &d_info[i]; /* Mark the guadian monster */ if (d_ptr->final_guardian) diff --git a/src/levels.cc b/src/levels.cc index 726ebd1a..2a1bb3ab 100644 --- a/src/levels.cc +++ b/src/levels.cc @@ -9,6 +9,7 @@ #include "levels.hpp" #include "dungeon_info_type.hpp" +#include "game.hpp" #include "init1.hpp" #include "util.hpp" #include "util.h" @@ -78,6 +79,8 @@ static bool_ get_command(const char *file, char comm, char *param) */ int get_branch() { + auto const &d_info = game->edit_data.d_info; + char file[20], buf[5]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); @@ -95,6 +98,8 @@ int get_branch() */ int get_fbranch() { + auto const &d_info = game->edit_data.d_info; + char file[20], buf[5]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); @@ -112,6 +117,8 @@ int get_fbranch() */ int get_flevel() { + auto const &d_info = game->edit_data.d_info; + char file[20], buf[5]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); @@ -129,6 +136,8 @@ int get_flevel() */ bool_ get_dungeon_save(char *buf) { + auto const &d_info = game->edit_data.d_info; + char file[20]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); @@ -144,8 +153,9 @@ bool_ get_dungeon_save(char *buf) */ bool_ get_dungeon_generator(char *buf) { - char file[20]; + auto const &d_info = game->edit_data.d_info; + char file[20]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); /* Get and return the level */ @@ -159,8 +169,9 @@ bool_ get_dungeon_generator(char *buf) */ bool_ get_dungeon_special(char *buf) { - char file[20]; + auto const &d_info = game->edit_data.d_info; + char file[20]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); /* Get and return the level */ @@ -174,8 +185,9 @@ bool_ get_dungeon_special(char *buf) */ bool_ get_dungeon_name(char *buf) { - char file[20]; + auto const &d_info = game->edit_data.d_info; + char file[20]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); /* Get and return the level */ @@ -189,6 +201,8 @@ bool_ get_dungeon_name(char *buf) */ void get_level_flags() { + auto const &d_info = game->edit_data.d_info; + char file[20]; char buf[1024], *s, *t; @@ -226,8 +240,9 @@ void get_level_flags() */ bool_ get_level_desc(char *buf) { - char file[20]; + auto const &d_info = game->edit_data.d_info; + char file[20]; sprintf(file, "dun%d.%d", dungeon_type, dun_level - d_info[dungeon_type].mindepth); /* Get and return the level */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 5354af9a..c100418e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -532,6 +532,8 @@ static void note(cptr msg) static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { + auto const &d_info = game->edit_data.d_info; + do_string(player_name, 32, flag); do_string(died_from, 80, flag); @@ -543,14 +545,14 @@ static bool_ do_extra(ls_flag_t flag) /* Handle the special levels info */ { - byte tmp8u = max_d_idx; + byte tmp8u = d_info.size(); u16b tmp16u = MAX_DUNGEON_DEPTH; do_byte(&tmp8u, flag); if (flag == ls_flag_t::LOAD) { - if (tmp8u > max_d_idx) + if (tmp8u > d_info.size()) { note(format("Too many dungeon types!", static_cast(tmp8u))); } @@ -719,7 +721,7 @@ static bool_ do_extra(ls_flag_t flag) // Max dungeon levels { - byte tmp8u = max_d_idx; + byte tmp8u = d_info.size(); do_byte(&tmp8u, flag); @@ -729,7 +731,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&tmp16s, flag); - if ((flag == ls_flag_t::LOAD) && (i <= max_d_idx)) + if ((flag == ls_flag_t::LOAD) && (i <= d_info.size())) { max_dlv[i] = tmp16s; } @@ -794,7 +796,7 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->tim_invis, flag); do_s16b(&p_ptr->word_recall, flag); - do_s16b(&p_ptr->recall_dungeon, flag); + do_byte(&p_ptr->recall_dungeon, flag); do_s16b(&p_ptr->see_infra, flag); do_s16b(&p_ptr->tim_infra, flag); do_s16b(&p_ptr->oppose_fire, flag); @@ -2128,6 +2130,8 @@ static bool do_object_lore(ls_flag_t flag) static bool do_towns(ls_flag_t flag) { + auto &d_info = game->edit_data.d_info; + u16b max_towns_ldsv = max_towns; do_u16b(&max_towns_ldsv, flag); @@ -2172,12 +2176,12 @@ static bool do_towns(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { - max_towns_ldsv = max_d_idx; + max_towns_ldsv = d_info.size(); } do_u16b(&max_towns_ldsv, flag); - if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > max_d_idx)) + if ((flag == ls_flag_t::LOAD) && (max_towns_ldsv > d_info.size())) { note("Too many dungeon types!"); return false; diff --git a/src/monster2.cc b/src/monster2.cc index 3ca14275..c2b615ee 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -838,7 +838,9 @@ errr get_mon_num_prep(void) */ bool_ apply_rule(monster_race *r_ptr, byte rule) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; if (d_ptr->rules[rule].mode == DUNGEON_MODE_NONE) { @@ -886,7 +888,9 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) bool_ restrict_monster_to_dungeon(int r_idx) { - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto const &d_info = game->edit_data.d_info; + + auto d_ptr = &d_info[dungeon_type]; monster_race *r_ptr = &r_info[r_idx]; /* Select a random rule */ diff --git a/src/object1.cc b/src/object1.cc index e0b4f60b..fe777d10 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2481,6 +2481,8 @@ static void describe_device(object_type *o_ptr) */ static cptr object_out_desc_where_found(s16b level, s16b dungeon) { + auto const &d_info = game->edit_data.d_info; + static char str[80]; if (dungeon == DUNGEON_WILDERNESS) diff --git a/src/object2.cc b/src/object2.cc index ab84a214..913bf4f6 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -4834,6 +4834,8 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & */ void place_object(int y, int x, bool_ good, bool_ great, int where) { + auto const &d_info = game->edit_data.d_info; + s16b o_idx; cave_type *c_ptr; @@ -5352,6 +5354,8 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) */ void acquirement(int y1, int x1, int num, bool_ great, bool_ known) { + auto const &d_info = game->edit_data.d_info; + object_type *i_ptr; object_type object_type_body; diff --git a/src/player_type.hpp b/src/player_type.hpp index 0e7aa93f..14a9466f 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -169,7 +169,7 @@ struct player_type s16b immov_cntr = 0; /* Timed -- Last ``immovable'' command. */ - s16b recall_dungeon = 0; /* Recall in which dungeon */ + byte recall_dungeon = 0; /* Recall in which dungeon */ s16b word_recall = 0; /* Word of recall counter */ s32b energy = 0; /* Current energy */ diff --git a/src/q_god.cc b/src/q_god.cc index f5e182cc..cfd5b257 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -422,6 +422,8 @@ static void quest_god_generate_relic() static void quest_god_set_god_dungeon_attributes_eru() { + auto &d_info = game->edit_data.d_info; + /* The Eru temple is based on Meneltarma. */ /* W: Not too many monsters (they'll be tough though, with big @@ -482,6 +484,8 @@ static void quest_god_set_god_dungeon_attributes_eru() static void quest_god_set_god_dungeon_attributes_manwe() { + auto &d_info = game->edit_data.d_info; + /* Manwe's lost temple is high in the clouds */ /* W: Has average number of monsters. */ @@ -544,6 +548,8 @@ static void quest_god_set_god_dungeon_attributes_manwe() static void quest_god_set_god_dungeon_attributes_tulkas() { + auto &d_info = game->edit_data.d_info; + /* Tulkas dungeon is quite normal, possibly a bit boring to be * honest. Maybe I should add something radical to it. 'The * house of Tulkas in the midmost of Valmar was a house of @@ -589,6 +595,8 @@ static void quest_god_set_god_dungeon_attributes_tulkas() static void quest_god_set_god_dungeon_attributes_melkor() { + auto &d_info = game->edit_data.d_info; + /* Melkors dungeon will be dark, fiery and stuff */ /* Many many monsters! (but prob ADJUST_LEVEL_1_2) */ @@ -642,6 +650,8 @@ static void quest_god_set_god_dungeon_attributes_melkor() static void quest_god_set_god_dungeon_attributes_yavanna() { + auto &d_info = game->edit_data.d_info; + /* Yavannas dungeon will be very natural, tress and stuff. */ d_info[DUNGEON_GOD].min_m_alloc_level = 22; @@ -693,6 +703,8 @@ static void quest_god_set_god_dungeon_attributes_yavanna() static void quest_god_set_god_dungeon_attributes_aule() { + auto &d_info = game->edit_data.d_info; + d_info[DUNGEON_GOD].min_m_alloc_level = 24; d_info[DUNGEON_GOD].max_m_alloc_chance = 80; @@ -735,6 +747,8 @@ static void quest_god_set_god_dungeon_attributes_aule() static void quest_god_set_god_dungeon_attributes_varda() { + auto &d_info = game->edit_data.d_info; + /* Varda lives with Manwe, so high in the clouds */ /* W: Has average number of monsters. */ @@ -794,6 +808,8 @@ static void quest_god_set_god_dungeon_attributes_varda() static void quest_god_set_god_dungeon_attributes_ulmo() { + auto &d_info = game->edit_data.d_info; + /* Ulmo dungeon is basically Tulkas, except with acquatic creatures. */ /* W: but with lots of monsters */ @@ -839,6 +855,8 @@ static void quest_god_set_god_dungeon_attributes_ulmo() static void quest_god_set_god_dungeon_attributes_mandos() { + auto &d_info = game->edit_data.d_info; + /* Mandos dungeon is basically Tulkas, except with undead. */ /* W: but with lots of monsters */ @@ -1093,6 +1111,8 @@ static bool_ quest_god_char_dump_hook(void *, void *in_, void *) static void set_god_dungeon_attributes() { + auto &d_info = game->edit_data.d_info; + /* dungeon properties altered according to which god player is worshipping, */ if (p_ptr->pgod == GOD_ERU) { @@ -1138,7 +1158,7 @@ static void set_god_dungeon_attributes() /* W: All dungeons are 5 levels deep, and created at 2/3 of * the player clvl when the quest is given */ { - dungeon_info_type *d_ptr = &d_info[DUNGEON_GOD]; + auto d_ptr = &d_info[DUNGEON_GOD]; d_ptr->mindepth = cquest_dun_mindepth; d_ptr->maxdepth = cquest_dun_maxdepth; d_ptr->min_plev = cquest_dun_minplev; diff --git a/src/q_rand.cc b/src/q_rand.cc index 1fed570e..9606ea7b 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -5,6 +5,7 @@ #include "cave_type.hpp" #include "dungeon_flag.hpp" #include "dungeon_info_type.hpp" +#include "game.hpp" #include "generate.hpp" #include "hook_build_room1_in.hpp" #include "hook_chardump_in.hpp" @@ -54,6 +55,8 @@ GENERATE_MONSTER_LOOKUP_FN(get_adventurer, "Adventurer") void initialize_random_quests(int n) { + auto const &d_info = game->edit_data.d_info; + int step, lvl, i, k; int old_type = dungeon_type; @@ -81,12 +84,10 @@ void initialize_random_quests(int n) random_quest *q_ptr = &random_quests[rl]; - int j; - /* Find the appropriate dungeon */ - for (j = 0; j < max_d_idx; j++) + for (std::size_t j = 0; j < d_info.size(); j++) { - dungeon_info_type *d_ptr = &d_info[j]; + auto d_ptr = &d_info[j]; if (!(d_ptr->flags & DF_PRINCIPAL)) continue; diff --git a/src/q_thrain.cc b/src/q_thrain.cc index b7eb0756..2ec46cda 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_info_type.hpp" +#include "game.hpp" #include "generate.hpp" #include "hook_build_room1_in.hpp" #include "hook_move_in.hpp" @@ -238,6 +239,8 @@ static bool_ quest_thrain_turn_hook(void *, void *, void *) bool_ quest_thrain_init_hook() { + auto const &d_info = game->edit_data.d_info; + if (!cquest.data[0]) { cquest.data[0] = rand_range(d_info[DUNGEON_DOL_GULDUR].mindepth + 1, d_info[DUNGEON_DOL_GULDUR].maxdepth - 1); diff --git a/src/spells1.cc b/src/spells1.cc index eb3664cc..ab789a38 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -18,6 +18,7 @@ #include "files.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "gods.hpp" #include "melee2.hpp" #include "monster2.hpp" @@ -6905,6 +6906,8 @@ bool_ unsafe = FALSE; */ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad) { + auto const &d_info = game->edit_data.d_info; + int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0; /* Hack -- assume obvious */ diff --git a/src/spells2.cc b/src/spells2.cc index 2b776c4f..2540146e 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -17,6 +17,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hook_identify_in.hpp" #include "hooks.hpp" #include "melee2.hpp" @@ -6086,6 +6087,8 @@ static void print_dungeon_batch(std::vector const &dungeon_idxs, int start, bool_ mode) { + auto const &d_info = game->edit_data.d_info; + char buf[80]; int i, j; byte attr; @@ -6094,7 +6097,7 @@ static void print_dungeon_batch(std::vector const &dungeon_idxs, for (i = 0, j = start; i < 20 && j < static_cast(dungeon_idxs.size()); i++, j++) { - dungeon_info_type *d_ptr = &d_info[dungeon_idxs[j]]; + auto d_ptr = &d_info[dungeon_idxs[j]]; strnfmt(buf, 80, " %c) %-30s", I2A(i), d_ptr->name); if (mode) @@ -6117,11 +6120,14 @@ static void print_dungeon_batch(std::vector const &dungeon_idxs, static int find_dungeon_by_name(char const *name) { + auto const &d_info = game->edit_data.d_info; + /* Find the index corresponding to the name */ - for (int i = 1; i < max_d_idx; i++) + for (std::size_t i = 1; i < d_info.size(); i++) { /* Skip non-initialized entries. */ - if (d_info[i].name == nullptr) { + if (d_info[i].name == nullptr) + { continue; } if (iequals(name, d_info[i].name)) @@ -6135,6 +6141,8 @@ static int find_dungeon_by_name(char const *name) static int reset_recall_aux() { + auto const &d_info = game->edit_data.d_info; + char which; int start = 0; int ret; @@ -6142,7 +6150,7 @@ static int reset_recall_aux() // Dungeons available for recall std::vector dungeons; - for (size_t i = 1; i < max_d_idx; i++) + for (size_t i = 1; i < d_info.size(); i++) { /* skip "blocked" dungeons */ if (d_info[i].flags & DF_NO_RECALL) continue; @@ -6259,6 +6267,8 @@ static int reset_recall_aux() bool_ reset_recall(bool_ no_trepas_max_depth) { + auto const &d_info = game->edit_data.d_info; + int dun, depth, max; /* Choose dungeon */ diff --git a/src/traps.cc b/src/traps.cc index 5ba66cbd..067934b9 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -19,6 +19,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -1934,12 +1935,14 @@ void player_activate_door_trap(s16b y, s16b x) */ void place_trap(int y, int x) { + auto const &d_info = game->edit_data.d_info; + s16b trap; trap_type *t_ptr; int cnt; u32b flags; cave_type *c_ptr = &cave[y][x]; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; /* No traps in town or on first level */ if (dun_level <= 1) return; diff --git a/src/variable.cc b/src/variable.cc index b1a8c674..621cdd4c 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -467,11 +467,6 @@ monster_race *r_info; */ monster_ego *re_info; -/* - * The dungeon types arrays - */ -dungeon_info_type *d_info; - /* * Player abilities arrays */ @@ -654,11 +649,6 @@ u16b max_a_idx; */ u16b max_e_idx; -/* - * Maximum number of dungeon types in d_info.txt - */ -u16b max_d_idx; - /* * Maximum number of stores types in st_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 4f00f1da..534f9596 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -8,7 +8,6 @@ #include "cave_type_fwd.hpp" #include "deity_type.hpp" #include "dungeon_flag_set.hpp" -#include "dungeon_info_type_fwd.hpp" #include "effect_type.hpp" #include "ego_item_type_fwd.hpp" #include "fate.hpp" @@ -170,7 +169,6 @@ extern artifact_type *a_info; extern ego_item_type *e_info; extern monster_race *r_info; extern monster_ego *re_info; -extern dungeon_info_type *d_info; extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; @@ -194,7 +192,6 @@ extern u16b max_k_idx; extern u16b max_f_idx; extern u16b max_a_idx; extern u16b max_e_idx; -extern u16b max_d_idx; extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; diff --git a/src/wizard2.cc b/src/wizard2.cc index dd0d50e8..5c4ff5cd 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -1301,6 +1301,8 @@ void do_cmd_wiz_cure_all(void) */ static void do_cmd_wiz_jump(void) { + auto const &d_info = game->edit_data.d_info; + /* Ask for level */ if (command_arg <= 0) { @@ -1509,6 +1511,8 @@ static void do_cmd_wiz_body(s16b bidx) */ void do_cmd_debug() { + auto const &d_info = game->edit_data.d_info; + int x, y; char cmd; @@ -1569,7 +1573,7 @@ void do_cmd_debug() /* Change of Dungeon type */ case 'D': - if ((command_arg >= 0) && (command_arg < max_d_idx)) + if ((command_arg >= 0) && (std::size_t(command_arg) < d_info.size())) { dungeon_type = command_arg; dun_level = d_info[dungeon_type].mindepth; diff --git a/src/xtra1.cc b/src/xtra1.cc index aff76b71..6c9d0a29 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -539,8 +539,10 @@ static void prt_sp(void) */ static void prt_depth(int row, int col) { + auto const &d_info = game->edit_data.d_info; + char depths[32]; - dungeon_info_type *d_ptr = &d_info[dungeon_type]; + auto d_ptr = &d_info[dungeon_type]; if (p_ptr->wild_mode) { diff --git a/src/xtra2.cc b/src/xtra2.cc index 040299ff..496bcbf0 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2400,6 +2400,8 @@ static void monster_death_gods(int m_idx, monster_type *m_ptr) */ void monster_death(int m_idx) { + auto const &d_info = game->edit_data.d_info; + monster_type *m_ptr = &m_list[m_idx]; auto const r_ptr = m_ptr->race(); @@ -3886,6 +3888,8 @@ bool_ target_object(int y, int x, int mode, cptr info, bool_ *boring, */ static int target_set_aux(int y, int x, int mode, cptr info) { + auto const &d_info = game->edit_data.d_info; + cave_type *c_ptr = &cave[y][x]; cptr s1, s2, s3; -- cgit v1.2.3 From 7ccb0c1a48d571abd6dc3aca725275e2d264aa2d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Change strings in dungeon_info_type to std::string --- src/cmd1.cc | 2 +- src/cmd2.cc | 2 +- src/cmd6.cc | 2 +- src/dungeon_info_type.hpp | 8 ++++---- src/files.cc | 4 ++-- src/generate.cc | 4 +++- src/init1.cc | 22 ++++++++-------------- src/object1.cc | 2 +- src/spells1.cc | 2 +- src/spells2.cc | 16 +++++++--------- src/wizard2.cc | 2 +- src/xtra2.cc | 8 ++++---- 12 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index 7d53fbef..19a52062 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -3153,7 +3153,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Mega-hack for dungeon branches */ if ((feat == FEAT_MORE) && c_ptr->special) { - msg_format("There is %s", d_info[c_ptr->special].text); + msg_format("There is %s", d_info[c_ptr->special].text.c_str()); } else { diff --git a/src/cmd2.cc b/src/cmd2.cc index c581d89b..dd5f302a 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -548,7 +548,7 @@ void do_cmd_go_down(void) dun_level = d_ptr->mindepth; } - msg_format("You go into %s", d_info[dungeon_type].text); + msg_format("You go into %s", d_info[dungeon_type].text.c_str()); } else { diff --git a/src/cmd6.cc b/src/cmd6.cc index e52d1e32..195d9648 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -2977,7 +2977,7 @@ void do_cmd_read_scroll(void) } msg_format("Recall reset to %s at level %d.", - d_info[p_ptr->recall_dungeon].name, + d_info[p_ptr->recall_dungeon].name.c_str(), max_dlv[p_ptr->recall_dungeon]); ident = TRUE; diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index b15cf9fe..324a32bd 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -15,11 +15,11 @@ constexpr int TOWN_DUNGEON = 4; /* A structure for the != dungeon types */ struct dungeon_info_type { - const char *name = nullptr; /* Name */ - char *text = nullptr; /* Description */ - char short_name[3] = { 0 }; /* Short name */ + std::string name; /* Name */ + std::string text; /* Description */ + std::string short_name; /* Short name */ - char generator[30] = { 0 }; /* Name of the level generator */ + std::string generator; /* Name of the level generator */ s16b floor1 = 0; /* Floor tile 1 */ byte floor_percent1[2] = { 0 }; /* Chance of type 1 */ diff --git a/src/files.cc b/src/files.cc index d85a7dbf..183ae0af 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2335,7 +2335,7 @@ cptr describe_player_location() if (dungeon_type != DUNGEON_WILDERNESS && dun_level > 0) { - sprintf(desc, "on level %d of %s", dun_level, d_info[dungeon_type].name); + sprintf(desc, "on level %d of %s", dun_level, d_info[dungeon_type].name.c_str()); } else if (wf_info[feat].terrain_idx == TERRAIN_TOWN) { @@ -2698,7 +2698,7 @@ errr file_character(cptr name, bool_ full) { if (max_dlv[y]) fprintf(fff, "\n %s: Level %d (%d')", - d_info[y].name, + d_info[y].name.c_str(), max_dlv[y], 50 * (max_dlv[y])); } fprintf(fff, "\n"); diff --git a/src/generate.cc b/src/generate.cc index a3b3d0bd..96f4ebaf 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -7633,7 +7633,9 @@ static bool_ cave_gen(void) char generator_name[100]; if (!get_dungeon_generator(generator_name)) - strnfmt(generator_name, 99, "%s", d_ptr->generator); + { + strnfmt(generator_name, sizeof(generator_name)-1, "%s", d_ptr->generator.c_str()); + } /* * We generate a double dungeon. First we should halve the desired diff --git a/src/init1.cc b/src/init1.cc index 5fd257b0..4233b032 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5169,13 +5169,10 @@ errr init_d_info_txt(FILE *fp) /* Point at the "info" */ d_ptr = &expand_to_fit_index(d_info, i); + assert(d_ptr->name.empty()); /* Copy name */ - assert(!d_ptr->name); - d_ptr->name = my_strdup(s); - - /* Initialize description */ - d_ptr->text = my_strdup(""); + d_ptr->name = s; /* HACK -- Those ones HAVE to have a set default value */ d_ptr->size_x = -1; @@ -5202,7 +5199,7 @@ errr init_d_info_txt(FILE *fp) d_ptr->objs = obj_theme::defaults(); /* The default generator */ - strcpy(d_ptr->generator, "dungeon"); + d_ptr->generator = "dungeon"; /* Next... */ continue; @@ -5215,15 +5212,12 @@ errr init_d_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire short name */ - d_ptr->short_name[0] = buf[2]; - d_ptr->short_name[1] = buf[3]; - d_ptr->short_name[2] = buf[4]; - - /* Acquire the text */ - char *s = buf + 6; + d_ptr->short_name += buf[2]; + d_ptr->short_name += buf[3]; + d_ptr->short_name += buf[4]; /* Append to description */ - strappend(&d_ptr->text, s); + d_ptr->text += (buf + 6); /* Next... */ continue; @@ -5312,7 +5306,7 @@ errr init_d_info_txt(FILE *fp) /* Process 'G' for "Generator" (one line only) */ if (buf[0] == 'G') { - strnfmt(d_ptr->generator, 30, "%s", buf + 2); + d_ptr->generator = (buf + 2); /* Next... */ continue; diff --git a/src/object1.cc b/src/object1.cc index fe777d10..3e783121 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2503,7 +2503,7 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon) } else { - sprintf(str, "on level %d of %s", level, d_info[dungeon].name); + sprintf(str, "on level %d of %s", level, d_info[dungeon].name.c_str()); } return str; diff --git a/src/spells1.cc b/src/spells1.cc index ab789a38..8be8b06a 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -7010,7 +7010,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad /* Did the dungeon do it? */ if (who == -100) { - sprintf(killer, "%s", d_info[dungeon_type].name); + sprintf(killer, "%s", d_info[dungeon_type].name.c_str()); } if (who == -101) { diff --git a/src/spells2.cc b/src/spells2.cc index 2540146e..ae7f8aa1 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -6089,7 +6089,6 @@ static void print_dungeon_batch(std::vector const &dungeon_idxs, { auto const &d_info = game->edit_data.d_info; - char buf[80]; int i, j; byte attr; @@ -6099,7 +6098,9 @@ static void print_dungeon_batch(std::vector const &dungeon_idxs, { auto d_ptr = &d_info[dungeon_idxs[j]]; - strnfmt(buf, 80, " %c) %-30s", I2A(i), d_ptr->name); + char buf[80]; + strnfmt(buf, 80, " %c) %-30s", I2A(i), d_ptr->name.c_str()); + if (mode) { if (d_ptr->min_plev > p_ptr->lev) @@ -6125,11 +6126,6 @@ static int find_dungeon_by_name(char const *name) /* Find the index corresponding to the name */ for (std::size_t i = 1; i < d_info.size(); i++) { - /* Skip non-initialized entries. */ - if (d_info[i].name == nullptr) - { - continue; - } if (iequals(name, d_info[i].name)) { return i; @@ -6208,7 +6204,8 @@ static int reset_recall_aux() else if (which == '@') { char buf[80]; - strcpy(buf, d_info[p_ptr->recall_dungeon].name); + strcpy(buf, d_info[p_ptr->recall_dungeon].name.c_str()); + if (!get_string("Which dungeon? ", buf, 79)) continue; /* Find the index corresponding to the name */ @@ -6281,8 +6278,9 @@ bool_ reset_recall(bool_ no_trepas_max_depth) max = d_info[dun].maxdepth; else max = max_dlv[dun]; + depth = get_quantity(format("Which level in %s(%d-%d)? ", - d_info[dun].name, + d_info[dun].name.c_str(), d_info[dun].mindepth, max), max); diff --git a/src/wizard2.cc b/src/wizard2.cc index 5c4ff5cd..046fd80c 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -1577,7 +1577,7 @@ void do_cmd_debug() { dungeon_type = command_arg; dun_level = d_info[dungeon_type].mindepth; - msg_format("You go into %s", d_info[dungeon_type].text); + msg_format("You go into %s", d_info[dungeon_type].text.c_str()); /* Leaving */ p_ptr->leaving = TRUE; diff --git a/src/xtra2.cc b/src/xtra2.cc index 496bcbf0..95234f79 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -4200,7 +4200,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) /* Terrain feature if needed */ if (boring || (feat >= FEAT_GLYPH)) { - cptr name; + std::string name; /* Hack -- special handling for building doors */ if (feat == FEAT_SHOP) @@ -4246,7 +4246,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const &wf = wf_info[wilderness(x, y).feat]; s3 = ""; - name = format("%s(%s)", wf.name, wf.text); + name = fmt::format("{}({})", wf.name, wf.text); } if ((feat == FEAT_FOUNTAIN) && (c_ptr->info & CAVE_IDNT)) @@ -4270,12 +4270,12 @@ static int target_set_aux(int y, int x, int mode, cptr info) /* Display a message */ if (!wizard) { - sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, info); + sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name.c_str(), info); } else { sprintf(out_val, "%s%s%s%s [%s] (%d:%d:%d)", - s1, s2, s3, name, info, + s1, s2, s3, name.c_str(), info, c_ptr->feat, c_ptr->mimic, c_ptr->special); } prt(out_val, 0, 0); -- cgit v1.2.3 From 5928204e69432be76b618bfa08c03e9bee6b3b09 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Use std::string for describe_player_location() --- src/files.cc | 32 ++++++++++++++++++-------------- src/files.hpp | 2 +- src/spells2.cc | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/files.cc b/src/files.cc index 183ae0af..a2c11846 100644 --- a/src/files.cc +++ b/src/files.cc @@ -60,8 +60,10 @@ #include "xtra1.hpp" #include "z-rand.hpp" +#include #include #include +#include #include #include #include @@ -2322,28 +2324,28 @@ void display_player(int mode) * Describe the player's location -- either by dungeon level, town, or in * wilderness with landmark reference. */ -cptr describe_player_location() +std::string describe_player_location() { auto const &wilderness = game->wilderness; auto const &d_info = game->edit_data.d_info; - int i; - static char desc[80]; + std::string desc; + int pwx = (p_ptr->wild_mode ? p_ptr->px : p_ptr->wilderness_x); int pwy = (p_ptr->wild_mode ? p_ptr->py : p_ptr->wilderness_y); int feat = wilderness(pwx, pwy).feat; if (dungeon_type != DUNGEON_WILDERNESS && dun_level > 0) { - sprintf(desc, "on level %d of %s", dun_level, d_info[dungeon_type].name.c_str()); + desc += fmt::format("on level {:d} of {}", dun_level, d_info[dungeon_type].name); } else if (wf_info[feat].terrain_idx == TERRAIN_TOWN) { - sprintf(desc, "in the town of %s", wf_info[feat].name); + desc += fmt::format("in the town of {}", wf_info[feat].name); } else if (wf_info[feat].entrance) { - sprintf(desc, "near %s", wf_info[feat].name); + desc += fmt::format("near {}", wf_info[feat].name); } else { @@ -2382,12 +2384,12 @@ cptr describe_player_location() if (!landmark) { - sprintf(desc, "in %s", wf_info[feat].text); + desc += fmt::format("in {}", wf_info[feat].text); } else if (pwx == lwx && pwy == lwy) { /* Paranoia; this should have been caught above */ - sprintf(desc, "near %s", wf_info[feat].name); + desc += fmt::format("near {}", wf_info[feat].name); } else { @@ -2409,7 +2411,8 @@ cptr describe_player_location() if (dy * 81 < dx * 31) ns = ""; if (dx * 81 < dy * 31) ew = ""; - sprintf(desc, "in %s %s%s of %s", + desc += fmt::format( + "in {} {}{} of {}", wf_info[feat].text, ns, ew, @@ -2417,10 +2420,8 @@ cptr describe_player_location() } } - /* strip trailing whitespace */ - for (i = 0; desc[i]; ++i); - while (desc[--i] == ' ') - desc[i] = 0; + /* Strip trailing whitespace */ + boost::trim_right(desc); return desc; } @@ -2724,7 +2725,10 @@ errr file_character(cptr name, bool_ full) } /* Where we are, if we're alive */ - if (!death) fprintf(fff, "\n You are currently %s.", describe_player_location()); + if (!death) + { + fprintf(fff, "\n You are currently %s.", describe_player_location().c_str()); + } /* Monsters slain */ { diff --git a/src/files.hpp b/src/files.hpp index 35a10079..bd39c759 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -13,7 +13,7 @@ extern object_flag_set player_flags(); extern void wipe_saved(void); extern s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2); extern void display_player(int mode); -extern cptr describe_player_location(void); +extern std::string describe_player_location(); extern errr file_character(cptr name, bool_ full); extern errr process_pref_file_aux(char *buf); extern errr process_pref_file(cptr name); diff --git a/src/spells2.cc b/src/spells2.cc index ae7f8aa1..02b51056 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -831,7 +831,7 @@ void self_knowledge(FILE *fff) static char buf[250]; sprintf(buf, "You are dead, killed by %s %s.", - died_from, describe_player_location()); + died_from, describe_player_location().c_str()); info[i++] = buf; } -- cgit v1.2.3 From 1726fc7a8ab66c15385bdda8f0533cddeb867b58 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move set_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/game_edit_data.hpp | 6 ++++++ src/init1.cc | 22 ++++++--------------- src/init2.cc | 17 ++++++++++------ src/object1.cc | 46 +++++++++++++++++++++++++++++++++++--------- src/set_type_fwd.hpp | 3 --- src/variable.cc | 10 ---------- src/variable.hpp | 3 --- 9 files changed, 60 insertions(+), 53 deletions(-) delete mode 100644 src/set_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 69f02bdb..8bddc2e3 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -30,9 +30,6 @@ M:F:256 # Maximum number of artifacts in a_info.txt M:A:219 -# Maximum number of sets types in set_info.txt -M:s:10 - # Maximum number of ego-items in e_info.txt M:E:200 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 8c5aceec..7b4b3b08 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -30,9 +30,6 @@ M:F:249 # Maximum number of artifacts in a_info.txt M:A:257 -# Maximum number of sets types in set_info.txt -M:s:17 - # Maximum number of ego-items in e_info.txt M:E:238 diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 6f1ffa8f..863cabe4 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -8,6 +8,7 @@ #include "player_race_mod.hpp" #include "randart_gen_type.hpp" #include "randart_part_type.hpp" +#include "set_type.hpp" #include "store_action_type.hpp" #include "vault_type.hpp" @@ -40,6 +41,11 @@ struct GameEditData { */ std::vector ra_gen; + /** + * Artifact sets + */ + std::vector set_info; + /** * Building actions. */ diff --git a/src/init1.cc b/src/init1.cc index 4233b032..7d8afaa9 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2872,12 +2872,11 @@ errr init_a_info_txt(FILE *fp) */ errr init_set_info_txt(FILE *fp) { - int i; + auto &set_info = game->edit_data.set_info; + int cur_art = 0, cur_num = 0; char buf[1024]; - char *s; - /* Current entry */ set_type *set_ptr = NULL; @@ -2905,7 +2904,7 @@ errr init_set_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -2917,19 +2916,16 @@ errr init_set_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_set_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - set_ptr = &set_info[i]; + set_ptr = &expand_to_fit_index(set_info, i); /* Copy name */ assert(!set_ptr->name); @@ -2946,7 +2942,7 @@ errr init_set_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire the text */ - s = buf + 2; + char const *s = buf + 2; /* Append chars to the description */ strappend(&set_ptr->desc, s); @@ -6965,12 +6961,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_st_idx = atoi(zz[1]); } - /* Maximum set_idx */ - else if (zz[0][0] == 's') - { - max_set_idx = atoi(zz[1]); - } - /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { diff --git a/src/init2.cc b/src/init2.cc index f664ba40..6ae3d9ba 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -309,7 +309,7 @@ namespace { static void allocate() { - set_info = new set_type[max_set_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -989,15 +989,20 @@ static errr init_alloc(void) /* Init the sets in a_info */ static void init_sets_aux() { - int i, j; + auto const &set_info = game->edit_data.set_info; - for (i = 0; i < max_a_idx; i++) + for (std::size_t i = 0; i < max_a_idx; i++) + { a_info[i].set = -1; - for (i = 0; i < max_set_idx; i++) + } + + for (std::size_t i = 0; i < set_info.size(); i++) { - for (j = 0; j < set_info[i].num; j++) + auto const &set_ref = set_info[i]; + + for (std::size_t j = 0; j < set_ref.num; j++) { - a_info[set_info[i].arts[j].a_idx].set = i; + a_info[set_ref.arts[j].a_idx].set = i; } } } diff --git a/src/object1.cc b/src/object1.cc index 3e783121..0d958fc8 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2514,6 +2514,8 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon) */ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it) { + auto const &set_info = game->edit_data.set_info; + cptr vp[64]; byte vc[64]; int vn; @@ -6124,12 +6126,21 @@ void object_gain_level(object_type *o_ptr) */ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) { - set_type *s_ptr = &set_info[set_idx]; - int i; + auto &set_info = game->edit_data.set_info; + + auto s_ptr = &set_info[set_idx]; if ( -1 == a_info[a_idx].set) return (FALSE); + + int i; for (i = 0; i < s_ptr->num; i++) - if (a_idx == s_ptr->arts[i].a_idx) break; + { + if (a_idx == s_ptr->arts[i].a_idx) + { + break; + } + } + if (!s_ptr->arts[i].present) { s_ptr->num_use++; @@ -6144,17 +6155,26 @@ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) } return (TRUE); } + return (FALSE); } bool_ takeoff_set(s16b a_idx, s16b set_idx) { - set_type *s_ptr = &set_info[set_idx]; - int i; + auto &set_info = game->edit_data.set_info; + + auto s_ptr = &set_info[set_idx]; if ( -1 == a_info[a_idx].set) return (FALSE); + + int i; for (i = 0; i < s_ptr->num; i++) - if (a_idx == s_ptr->arts[i].a_idx) break; + { + if (a_idx == s_ptr->arts[i].a_idx) + { + break; + } + } if (s_ptr->arts[i].present) { @@ -6170,12 +6190,15 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx) return (TRUE); } + return (FALSE); } void apply_set(s16b a_idx, s16b set_idx) { - set_type *s_ptr = &set_info[set_idx]; + auto const &set_info = game->edit_data.set_info; + + auto s_ptr = &set_info[set_idx]; if ( -1 == a_info[a_idx].set) { @@ -6185,7 +6208,10 @@ void apply_set(s16b a_idx, s16b set_idx) int i; for (i = 0; i < s_ptr->num; i++) { - if (a_idx == s_ptr->arts[i].a_idx) break; + if (a_idx == s_ptr->arts[i].a_idx) + { + break; + } } if (s_ptr->arts[i].present) @@ -6201,12 +6227,14 @@ void apply_set(s16b a_idx, s16b set_idx) static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) { + auto const &set_info = game->edit_data.set_info; + if ( -1 == a_info[a_idx].set) { return; } - set_type *s_ptr = &set_info[set_idx]; + auto s_ptr = &set_info[set_idx]; int i; for (i = 0; i < s_ptr->num; i++) diff --git a/src/set_type_fwd.hpp b/src/set_type_fwd.hpp deleted file mode 100644 index 3b311808..00000000 --- a/src/set_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct set_type; diff --git a/src/variable.cc b/src/variable.cc index 621cdd4c..8356148b 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -443,11 +443,6 @@ object_kind *k_info; */ artifact_type *a_info; -/* - * The item set arrays - */ -set_type *set_info; - /* * The ego-item arrays */ @@ -654,11 +649,6 @@ u16b max_e_idx; */ u16b max_st_idx; -/* - * Item sets - */ -u16b max_set_idx = 1; - /* * Maximum number of objects in the level */ diff --git a/src/variable.hpp b/src/variable.hpp index 534f9596..a413a0f3 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -27,7 +27,6 @@ #include "random_artifact.hpp" #include "random_quest.hpp" #include "school_type.hpp" -#include "set_type_fwd.hpp" #include "skill_descriptor_fwd.hpp" #include "skill_modifiers_fwd.hpp" #include "skill_type_fwd.hpp" @@ -173,7 +172,6 @@ extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; extern store_info_type *st_info; -extern set_type *set_info; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; extern cptr DEFAULT_FEAT_BLOCK; @@ -197,7 +195,6 @@ extern u16b max_m_idx; extern u16b max_t_idx; extern u16b max_st_idx; extern u16b max_wf_idx; -extern u16b max_set_idx; extern int init_flags; extern bool_ ambush_flag; extern bool_ fate_flag; -- cgit v1.2.3 From 0cea35759ed072d3a42b54926d6fee7d12346418 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Change set_type name/desc to std::string --- src/init1.cc | 15 +++++++++------ src/object1.cc | 6 +++--- src/set_type.hpp | 6 ++++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/init1.cc b/src/init1.cc index 7d8afaa9..b68309b7 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2926,10 +2926,10 @@ errr init_set_info_txt(FILE *fp) /* Point at the "info" */ set_ptr = &expand_to_fit_index(set_info, i); + assert(set_ptr->name.empty()); /* Copy name */ - assert(!set_ptr->name); - set_ptr->name = my_strdup(s); + set_ptr->name = s; /* Next... */ continue; @@ -2941,11 +2941,14 @@ errr init_set_info_txt(FILE *fp) /* Process 'D' for "Description" */ if (buf[0] == 'D') { - /* Acquire the text */ - char const *s = buf + 2; + /* Need newline? */ + if (!set_ptr->desc.empty()) + { + set_ptr->desc += '\n'; + } - /* Append chars to the description */ - strappend(&set_ptr->desc, s); + /* Append */ + set_ptr->desc += (buf + 2); /* Next... */ continue; diff --git a/src/object1.cc b/src/object1.cc index 0d958fc8..191b2046 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2574,7 +2574,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (a_ptr->set != -1) { - text_out_c(TERM_GREEN, set_info[a_ptr->set].desc); + text_out_c(TERM_GREEN, set_info[a_ptr->set].desc.c_str()); text_out("\n"); } } @@ -6151,7 +6151,7 @@ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) } else if ((s_ptr->num_use == s_ptr->num) && (!silent)) { - cmsg_format(TERM_GREEN, "%s item set completed.", s_ptr->name); + cmsg_format(TERM_GREEN, "%s item set completed.", s_ptr->name.c_str()); } return (TRUE); } @@ -6185,7 +6185,7 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx) if (s_ptr->num_use == s_ptr->num - 1) { - cmsg_format(TERM_GREEN, "%s item set not complete anymore.", s_ptr->name); + cmsg_format(TERM_GREEN, "%s item set not complete anymore.", s_ptr->name.c_str()); } return (TRUE); diff --git a/src/set_type.hpp b/src/set_type.hpp index 0a04b384..bf13c932 100644 --- a/src/set_type.hpp +++ b/src/set_type.hpp @@ -1,6 +1,8 @@ #pragma once #include +#include + #include "set_component.hpp" /** @@ -8,8 +10,8 @@ */ struct set_type { - const char *name = nullptr; /* Name */ - char *desc = nullptr; /* Desc */ + std::string name; /* Name */ + std::string desc; /* Desc */ byte num = 0; /* Number of artifacts used */ byte num_use = 0; /* Number actually worn */ -- cgit v1.2.3 From aebc48dffa75698be4d2c1bb2b1a0927b10be1cc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move st_info into GameEditData --- lib/edit/misc.txt | 3 -- lib/mods/theme/edit/misc.txt | 3 -- src/birth.cc | 3 +- src/bldg.cc | 4 +- src/cave.cc | 5 +++ src/files.cc | 14 +++--- src/game_edit_data.hpp | 6 +++ src/init1.cc | 23 +++------- src/init2.cc | 11 +++-- src/loadsave.cc | 6 ++- src/object1.cc | 10 ++--- src/store.cc | 37 ++++++++++++++-- src/store_info_type_fwd.hpp | 3 -- src/variable.cc | 10 ----- src/variable.hpp | 3 -- src/wild.cc | 101 ++++++++++++++++++++++++++++--------------- src/xtra2.cc | 1 + 17 files changed, 150 insertions(+), 93 deletions(-) delete mode 100644 src/store_info_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 8bddc2e3..8bf64864 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -39,9 +39,6 @@ M:U:176 # Maximum number of terrain types in wf_info.txt M:W:30 -# Maximum number of store types in st_info.txt -M:S:61 - # Maximum size for "o_list[]" M:O:1024 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 7b4b3b08..b4f43f5e 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -39,9 +39,6 @@ M:U:176 # Maximum number of terrain types in wf_info.txt M:W:64 -# Maximum number of store types in st_info.txt -M:S:89 - # Maximum size for "o_list[]" M:O:1024 diff --git a/src/birth.cc b/src/birth.cc index 2106527c..0ea545b5 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -3055,6 +3055,7 @@ static void init_town(int t_idx) */ void player_birth(void) { + auto const &st_info = game->edit_data.st_info; auto &d_info = game->edit_data.d_info; /* Starting index for generated towns */ @@ -3177,7 +3178,7 @@ void player_birth(void) create_stores_stock(i); /* Init the stores */ - for (std::size_t j = 0; j < max_st_idx; j++) + for (std::size_t j = 0; j < st_info.size(); j++) { /* Initialize */ store_init(i, j); diff --git a/src/bldg.cc b/src/bldg.cc index 0425a909..8f681744 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -115,7 +115,9 @@ static void clear_bldg(int min_row, int max_row) void show_building(store_type const *s_ptr) { auto const &ba_info = game->edit_data.ba_info; - store_info_type *st_ptr = &st_info[s_ptr->st_idx]; + auto const &st_info = game->edit_data.st_info; + + auto st_ptr = &st_info[s_ptr->st_idx]; for (std::size_t i = 0; i < st_ptr->actions.size(); i++) { diff --git a/src/cave.cc b/src/cave.cc index e460ddc8..92f57c95 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -4,6 +4,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_enter_dungeon_in.hpp" #include "monster2.hpp" #include "monster_race.hpp" @@ -845,6 +846,8 @@ static byte darker_attrs[16] = static void map_info(int y, int x, byte *ap, char *cp) { + auto const &st_info = game->edit_data.st_info; + byte a; byte c; @@ -1278,6 +1281,8 @@ static void map_info(int y, int x, byte *ap, char *cp) */ void map_info_default(int y, int x, byte *ap, char *cp) { + auto const &st_info = game->edit_data.st_info; + byte a; byte c; diff --git a/src/files.cc b/src/files.cc index a2c11846..eef16227 100644 --- a/src/files.cc +++ b/src/files.cc @@ -217,6 +217,7 @@ s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2) errr process_pref_file_aux(char *buf) { auto &race_mod_info = game->edit_data.race_mod_info; + auto &st_info = game->edit_data.st_info; int i, j, n1, n2; @@ -376,12 +377,13 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 2, 3, zz, ':', '/') == 3) { - store_info_type *st_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t i = std::stoul(zz[0], 0, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_st_idx) return (1); - st_ptr = &st_info[i]; + + if (i >= st_info.size()) return (1); + + auto st_ptr = &st_info[i]; if (n1) st_ptr->x_attr = n1; if (n2) st_ptr->x_char = n2; return (0); @@ -2513,8 +2515,10 @@ void file_character_print_item(FILE *fff, char label, object_type *obj, bool_ fu * * Prints out one "store" (for Home and Mathom-house) */ -void file_character_print_store(FILE *fff, wilderness_type_info *place, int store, bool_ full) +static void file_character_print_store(FILE *fff, wilderness_type_info *place, std::size_t store, bool_ full) { + auto const &st_info = game->edit_data.st_info; + town_type *town = &town_info[place->entrance]; store_type *st_ptr = &town->store[store]; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 863cabe4..7b69ecac 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -10,6 +10,7 @@ #include "randart_part_type.hpp" #include "set_type.hpp" #include "store_action_type.hpp" +#include "store_info_type.hpp" #include "vault_type.hpp" #include @@ -51,6 +52,11 @@ struct GameEditData { */ std::vector ba_info; + /** + * Buildings + */ + std::vector st_info; + /** * Building owners. */ diff --git a/src/init1.cc b/src/init1.cc index b68309b7..fb44c99b 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5617,9 +5617,9 @@ static errr grab_one_store_flag(store_flag_set *flags, cptr what) */ errr init_st_info_txt(FILE *fp) { - int i = 0; + auto &st_info = game->edit_data.st_info; + char buf[1024]; - char *s; /* Current entry */ store_info_type *st_ptr = NULL; @@ -5647,7 +5647,7 @@ errr init_st_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -5659,22 +5659,19 @@ errr init_st_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_st_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - st_ptr = &st_info[i]; + st_ptr = &expand_to_fit_index(st_info, i); + assert(!st_ptr->name); /* Copy name */ - assert(!st_ptr->name); st_ptr->name = my_strdup(s); /* Next... */ @@ -5688,7 +5685,7 @@ errr init_st_info_txt(FILE *fp) if (buf[0] == 'I') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -6958,12 +6955,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_wf_idx = atoi(zz[1]); } - /* Maximum st_idx */ - else if (zz[0][0] == 'S') - { - max_st_idx = atoi(zz[1]); - } - /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { diff --git a/src/init2.cc b/src/init2.cc index 6ae3d9ba..242fd4bb 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -454,7 +454,7 @@ namespace { static void allocate() { - st_info = new store_info_type[max_st_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -666,6 +666,8 @@ static errr init_misc(void) */ static errr init_towns(void) { + auto const &st_info = game->edit_data.st_info; + town_info = new town_type[max_towns]; for (std::size_t i = 1; i < max_towns; i++) @@ -676,7 +678,7 @@ static errr init_towns(void) } /* Fill in each store */ - for (std::size_t j = 0; j < max_st_idx; j++) + for (std::size_t j = 0; j < st_info.size(); j++) { /* Create the store */ town_info[i].store.emplace_back(store_type()); @@ -695,11 +697,13 @@ static errr init_towns(void) void create_stores_stock(int t) { + auto const &st_info = game->edit_data.st_info; + town_type *t_ptr = &town_info[t]; if (t_ptr->stocked) return; - for (int j = 0; j < max_st_idx; j++) + for (std::size_t j = 0; j < st_info.size(); j++) { store_type *st_ptr = &t_ptr->store[j]; @@ -709,6 +713,7 @@ void create_stores_stock(int t) /* Reserve space for stock */ st_ptr->stock.reserve(st_ptr->stock_size); } + t_ptr->stocked = TRUE; } diff --git a/src/loadsave.cc b/src/loadsave.cc index c100418e..64b4f6d6 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2038,6 +2038,8 @@ static void do_timers(ls_flag_t flag) */ static void do_stores(ls_flag_t flag) { + auto const &st_info = game->edit_data.st_info; + // Indexes for "real" towns. std::vector reals; reals.reserve(max_towns); @@ -2059,9 +2061,9 @@ static void do_stores(ls_flag_t flag) do_vector(flag, reals, do_byte); /* Read the stores */ - u16b n_stores = max_st_idx; + u16b n_stores = st_info.size(); do_u16b(&n_stores, flag); - assert(n_stores <= max_st_idx); + assert(n_stores <= st_info.size()); for (auto const z: reals) { diff --git a/src/object1.cc b/src/object1.cc index 191b2046..b035326f 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -633,6 +633,7 @@ void flavor_init(void) */ void reset_visuals(void) { + auto &st_info = game->edit_data.st_info; auto &race_mod_info = game->edit_data.race_mod_info; int i; @@ -648,13 +649,11 @@ void reset_visuals(void) } /* Extract default attr/char code for stores */ - for (i = 0; i < max_st_idx; i++) + for (auto &st_ref: st_info) { - store_info_type *st_ptr = &st_info[i]; - /* Default attr/char */ - st_ptr->x_attr = st_ptr->d_attr; - st_ptr->x_char = st_ptr->d_char; + st_ref.x_attr = st_ref.d_attr; + st_ref.x_char = st_ref.d_char; } /* Extract default attr/char code for objects */ @@ -2515,6 +2514,7 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon) bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it) { auto const &set_info = game->edit_data.set_info; + auto const &st_info = game->edit_data.st_info; cptr vp[64]; byte vc[64]; diff --git a/src/store.cc b/src/store.cc index ab6e119b..161601e4 100644 --- a/src/store.cc +++ b/src/store.cc @@ -249,6 +249,8 @@ static owner_type const *ot_ptr = NULL; */ static s32b price_item(object_type *o_ptr, int greed, bool_ flip) { + auto const &st_info = game->edit_data.st_info; + int factor; int adjust; s32b price; @@ -572,6 +574,8 @@ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr) */ static bool_ store_check_num(object_type *o_ptr) { + auto const &st_info = game->edit_data.st_info; + /* Free space is always usable */ if (st_ptr->stock.size() < st_ptr->stock_size) { @@ -626,6 +630,8 @@ static bool is_blessed(object_type const *o_ptr) */ static bool store_will_buy(object_type const *o_ptr) { + auto const &st_info = game->edit_data.st_info; + cptr store_name = st_info[st_ptr->st_idx].name; /* Hack -- The Home is simple */ @@ -1074,6 +1080,8 @@ static void store_item_optimize(int item) */ static bool_ black_market_crap(object_type *o_ptr) { + auto const &st_info = game->edit_data.st_info; + /* Ego items are never crap */ if (o_ptr->name2) return (FALSE); @@ -1083,7 +1091,7 @@ static bool_ black_market_crap(object_type *o_ptr) if (o_ptr->to_d > 0) return (FALSE); /* Check all stores */ - for (std::size_t i = 0; i < max_st_idx; i++) + for (std::size_t i = 0; i < st_info.size(); i++) { if (i == STORE_HOME) continue; if (st_info[i].flags & STF_MUSEUM) continue; @@ -1133,7 +1141,10 @@ static void store_delete(void) /* Analyze store flags and return a level */ int return_level() { - store_info_type *sti_ptr = &st_info[st_ptr->st_idx]; + auto const &st_info = game->edit_data.st_info; + + auto sti_ptr = &st_info[st_ptr->st_idx]; + int level; if (sti_ptr->flags & STF_RANDOM) level = 0; @@ -1186,6 +1197,8 @@ static bool_ kind_is_storeok(int k_idx) */ static void store_create(void) { + auto const &st_info = game->edit_data.st_info; + int i = 0, tries, level = 0; object_type forge; @@ -1400,6 +1413,8 @@ static void store_create(void) */ static void display_entry(int pos) { + auto const &st_info = game->edit_data.st_info; + /* Get the item */ auto o_ptr = &st_ptr->stock[pos]; @@ -1543,6 +1558,8 @@ void store_prt_gold(void) */ void display_store(void) { + auto const &st_info = game->edit_data.st_info; + char buf[80]; @@ -1825,7 +1842,9 @@ static bool_ sell_haggle(object_type *o_ptr, s32b *price) */ static bool retire_owner_p(void) { - store_info_type *sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx]; + auto const &st_info = game->edit_data.st_info; + + auto sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx]; if (sti_ptr->owners.size() > 1) { @@ -2070,6 +2089,8 @@ void store_stole(void) */ void store_purchase(void) { + auto const &st_info = game->edit_data.st_info; + /* Museum? */ if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) { @@ -2379,6 +2400,8 @@ void store_purchase(void) */ void store_sell(void) { + auto const &st_info = game->edit_data.st_info; + int choice; int item, item_pos; int amt; @@ -2678,6 +2701,8 @@ void store_sell(void) */ void store_examine(void) { + auto const &st_info = game->edit_data.st_info; + /* Empty? */ if (st_ptr->stock.empty()) { @@ -2760,6 +2785,7 @@ static bool_ leave_store = FALSE; */ static store_action_type const *find_store_action(s16b command_cmd) { + auto const &st_info = game->edit_data.st_info; auto const &ba_info = game->edit_data.ba_info; for (std::size_t i = 0; i < st_info[st_ptr->st_idx].actions.size(); i++) @@ -3101,6 +3127,7 @@ void do_cmd_store(void) { auto const &ow_info = game->edit_data.ow_info; auto const &ba_info = game->edit_data.ba_info; + auto const &st_info = game->edit_data.st_info; int which; int maintain_num; @@ -3369,6 +3396,7 @@ void do_cmd_store(void) void store_shuffle(int which) { auto const &ow_info = game->edit_data.ow_info; + auto const &st_info = game->edit_data.st_info; /* Ignore home */ if (which == STORE_HOME) return; @@ -3418,6 +3446,7 @@ void store_shuffle(int which) void store_maint(int town_num, int store_num) { auto const &ow_info = game->edit_data.ow_info; + auto const &st_info = game->edit_data.st_info; int const old_rating = rating; @@ -3510,6 +3539,7 @@ void store_maint(int town_num, int store_num) void store_init(int town_num, int store_num) { auto const &ow_info = game->edit_data.ow_info; + auto const &st_info = game->edit_data.st_info; cur_store_num = store_num; @@ -3553,6 +3583,7 @@ void do_cmd_home_trump(void) { auto const &ow_info = game->edit_data.ow_info; auto const &ba_info = game->edit_data.ba_info; + auto const &st_info = game->edit_data.st_info; int which; int maintain_num; diff --git a/src/store_info_type_fwd.hpp b/src/store_info_type_fwd.hpp deleted file mode 100644 index a0dace90..00000000 --- a/src/store_info_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct store_info_type; diff --git a/src/variable.cc b/src/variable.cc index 8356148b..89e0bd5b 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -483,11 +483,6 @@ skill_descriptor *s_descriptors; wilderness_type_info *wf_info; int wildc2i[256]; -/* - * The store/building types arrays - */ -store_info_type *st_info; - /* * Default texts for feature information. */ @@ -644,11 +639,6 @@ u16b max_a_idx; */ u16b max_e_idx; -/* - * Maximum number of stores types in st_info.txt - */ -u16b max_st_idx; - /* * Maximum number of objects in the level */ diff --git a/src/variable.hpp b/src/variable.hpp index a413a0f3..415b0676 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -31,7 +31,6 @@ #include "skill_modifiers_fwd.hpp" #include "skill_type_fwd.hpp" #include "skills_defs.hpp" -#include "store_info_type_fwd.hpp" #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" #include "trap_type_fwd.hpp" @@ -171,7 +170,6 @@ extern monster_ego *re_info; extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; -extern store_info_type *st_info; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; extern cptr DEFAULT_FEAT_BLOCK; @@ -193,7 +191,6 @@ extern u16b max_e_idx; extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; -extern u16b max_st_idx; extern u16b max_wf_idx; extern int init_flags; extern bool_ ambush_flag; diff --git a/src/wild.cc b/src/wild.cc index 78a29f56..e4fdf33f 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -888,33 +888,51 @@ static void build_store_hidden(int n, int yy, int xx) } /* Return a list of stores */ -static int get_shops(int *rooms) +static std::vector get_shops() { - int i, n, num = 0; + auto const &st_info = game->edit_data.st_info; - for (n = 0; n < max_st_idx; n++) - { - rooms[n] = 0; - } + std::vector rooms; - for (n = 0; n < max_st_idx; n++) + for (std::size_t n = 0; n < st_info.size(); n++) { int chance = 50; - if (st_info[n].flags & STF_COMMON) chance += 30; - if (st_info[n].flags & STF_RARE) chance -= 20; - if (st_info[n].flags & STF_VERY_RARE) chance -= 30; + if (st_info[n].flags & STF_COMMON) + { + chance += 30; + } - if (!magik(chance)) continue; + if (st_info[n].flags & STF_RARE) + { + chance -= 20; + } - for (i = 0; i < num; ++i) + if (st_info[n].flags & STF_VERY_RARE) + { + chance -= 30; + } + + if (!magik(chance)) + { + continue; + } + + for (std::size_t i = 0; i < rooms.size(); ++i) + { if (rooms[i] == n) + { continue; + } + } - if (st_info[n].flags & STF_RANDOM) rooms[num++] = n; + if (st_info[n].flags & STF_RANDOM) + { + rooms.push_back(n); + } } - return num; + return rooms; } /* Generate town borders */ @@ -996,7 +1014,7 @@ static bool_ create_townpeople_hook(int r_idx) */ static void town_gen_hack(int t_idx, int qy, int qx) { - int y, x, floor, num = 0; + int y, x, floor; bool_ (*old_get_mon_num_hook)(int r_idx); /* Do we use dungeon floor or normal one */ @@ -1015,8 +1033,7 @@ static void town_gen_hack(int t_idx, int qy, int qx) } /* Prepare an Array of "remaining stores", and count them */ - std::unique_ptr rooms(new int[max_st_idx]); - num = get_shops(rooms.get()); + auto rooms = get_shops(); /* Place two rows of stores */ for (y = 0; y < 2; y++) @@ -1024,10 +1041,14 @@ static void town_gen_hack(int t_idx, int qy, int qx) /* Place four stores per row */ for (x = 0; x < 4; x++) { - if(--num > -1) + if (!rooms.empty()) { + /* Extract store */ + auto room = rooms.back(); + rooms.pop_back(); + /* Build that store at the proper location */ - build_store(qy, qx, rooms[num], y, x); + build_store(qy, qx, room, y, x); } } } @@ -1084,7 +1105,7 @@ static void town_gen_hack(int t_idx, int qy, int qx) static void town_gen_circle(int t_idx, int qy, int qx) { - int y, x, cy, cx, rad, floor, num = 0; + int y, x, cy, cx, rad, floor; bool_ (*old_get_mon_num_hook)(int r_idx); /* Do we use dungeon floor or normal one */ @@ -1147,9 +1168,8 @@ static void town_gen_circle(int t_idx, int qy, int qx) } } - /* Prepare an Array of "remaining stores", and count them */ - std::unique_ptr rooms(new int[max_st_idx]); - num = get_shops(rooms.get()); + /* Get "remaining stores" */ + auto rooms = get_shops(); /* Place two rows of stores */ for (y = 0; y < 2; y++) @@ -1157,10 +1177,14 @@ static void town_gen_circle(int t_idx, int qy, int qx) /* Place four stores per row */ for (x = 0; x < 4; x++) { - if(--num > -1) + if (!rooms.empty()) { + /* Extract store */ + auto room = rooms.back(); + rooms.pop_back(); + /* Build that store at the proper location */ - build_store_circle(qy, qx, rooms[num], y, x); + build_store_circle(qy, qx, room, y, x); } } } @@ -1213,31 +1237,38 @@ static void town_gen_circle(int t_idx, int qy, int qx) static void town_gen_hidden(int t_idx, int qy, int qx) { - int y, x, n, num = 0, i; - - /* Prepare an Array of "remaining stores", and count them */ - std::unique_ptr rooms(new int[max_st_idx]); - num = get_shops(rooms.get()); + /* Get "remaining stores" */ + auto rooms = get_shops(); /* Get a number of stores to place */ - n = rand_int(num / 2) + (num / 2); + std::size_t n = rand_int(rooms.size() / 2) + (rooms.size() / 2); /* Place k stores */ - for (i = 0; i < n; i++) + for (std::size_t i = 0; i < n; i++) { /* Find a good spot */ + int x; + int y; while (TRUE) { y = rand_range(1, cur_hgt - 2); x = rand_range(1, cur_wid - 2); - if (cave_empty_bold(y, x)) break; + if (cave_empty_bold(y, x)) + { + break; + } } - if(--num > -1) + /* Any stores left? */ + if (!rooms.empty()) { + /* Extract store */ + auto room = rooms.back(); + rooms.pop_back(); + /* Build that store at the proper location */ - build_store_hidden(rooms[num], y, x); + build_store_hidden(room, y, x); } } } diff --git a/src/xtra2.cc b/src/xtra2.cc index 95234f79..d9de48cd 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3889,6 +3889,7 @@ bool_ target_object(int y, int x, int mode, cptr info, bool_ *boring, static int target_set_aux(int y, int x, int mode, cptr info) { auto const &d_info = game->edit_data.d_info; + auto const &st_info = game->edit_data.st_info; cave_type *c_ptr = &cave[y][x]; -- cgit v1.2.3 From e02a2dfd184a996a02ecc6004a0a03bcfbd19131 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Change store_info_type::name to std::string --- src/files.cc | 2 +- src/init1.cc | 4 ++-- src/object1.cc | 4 ++-- src/store.cc | 41 +++++++++++++++++++---------------------- src/store_info_type.hpp | 2 +- 5 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/files.cc b/src/files.cc index eef16227..6e795923 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2525,7 +2525,7 @@ static void file_character_print_store(FILE *fff, wilderness_type_info *place, s if (st_ptr->stock.size()) { /* Header with name of the town */ - fprintf(fff, " [%s Inventory - %s]\n\n", st_info[store].name, place->name); + fprintf(fff, " [%s Inventory - %s]\n\n", st_info[store].name.c_str(), place->name); /* Dump all available items */ for (std::size_t i = 0; i < st_ptr->stock.size(); i++) diff --git a/src/init1.cc b/src/init1.cc index fb44c99b..658cf8e2 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5669,10 +5669,10 @@ errr init_st_info_txt(FILE *fp) /* Point at the "info" */ st_ptr = &expand_to_fit_index(st_info, i); - assert(!st_ptr->name); + assert(st_ptr->name.empty()); /* Copy name */ - st_ptr->name = my_strdup(s); + st_ptr->name = s; /* Next... */ continue; diff --git a/src/object1.cc b/src/object1.cc index b035326f..656446c3 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -3493,12 +3493,12 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait else if (o_ptr->found == OBJ_FOUND_STORE) { text_out(format("\nYou bought it from the %s.", - st_info[o_ptr->found_aux1].name)); + st_info[o_ptr->found_aux1].name.c_str())); } else if (o_ptr->found == OBJ_FOUND_STOLEN) { text_out(format("\nYou stole it from the %s.", - st_info[o_ptr->found_aux1].name)); + st_info[o_ptr->found_aux1].name.c_str())); } else if (o_ptr->found == OBJ_FOUND_SELFMADE) { diff --git a/src/store.cc b/src/store.cc index 161601e4..47d5d943 100644 --- a/src/store.cc +++ b/src/store.cc @@ -43,6 +43,7 @@ #include "z-rand.hpp" #include +#include #define STORE_GENERAL_STORE "General Store" #define STORE_ARMOURY "Armoury" @@ -632,7 +633,7 @@ static bool store_will_buy(object_type const *o_ptr) { auto const &st_info = game->edit_data.st_info; - cptr store_name = st_info[st_ptr->st_idx].name; + auto const &store_name = st_info[st_ptr->st_idx].name; /* Hack -- The Home is simple */ if (cur_store_num == 7) @@ -652,7 +653,7 @@ static bool store_will_buy(object_type const *o_ptr) } /* What do stores buy? */ - if (streq(store_name, STORE_GENERAL_STORE)) + if ((store_name == STORE_GENERAL_STORE)) { switch (o_ptr->tval) { @@ -670,7 +671,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_ARMOURY)) + else if ((store_name == STORE_ARMOURY)) { switch (o_ptr->tval) { @@ -686,7 +687,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_WEAPONSMITH)) + else if ((store_name == STORE_WEAPONSMITH)) { switch (o_ptr->tval) { @@ -704,7 +705,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_TEMPLE)) + else if ((store_name == STORE_TEMPLE)) { switch (o_ptr->tval) { @@ -743,7 +744,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_ALCHEMY)) + else if ((store_name == STORE_ALCHEMY)) { switch (o_ptr->tval) { @@ -754,7 +755,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_MAGIC)) + else if ((store_name == STORE_MAGIC)) { switch (o_ptr->tval) { @@ -785,11 +786,11 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_BLACK_MARKET)) + else if ((store_name == STORE_BLACK_MARKET)) { return true; } - else if (streq(store_name, STORE_BOOKS)) + else if ((store_name == STORE_BOOKS)) { switch (o_ptr->tval) { @@ -801,11 +802,11 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_PETS)) + else if ((store_name == STORE_PETS)) { return (o_ptr->tval == TV_EGG); } - else if (streq(store_name, STORE_HUNTING_SUPPLIES)) + else if ((store_name == STORE_HUNTING_SUPPLIES)) { switch (o_ptr->tval) { @@ -819,7 +820,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_RUNIC_MAGIC)) + else if ((store_name == STORE_RUNIC_MAGIC)) { switch (o_ptr->tval) { @@ -828,7 +829,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_CONSTRUCTION_SUPPLIES)) + else if ((store_name == STORE_CONSTRUCTION_SUPPLIES)) { switch (o_ptr->tval) { @@ -837,7 +838,7 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if (streq(store_name, STORE_MUSIC)) + else if ((store_name == STORE_MUSIC)) { return (o_ptr->tval == TV_INSTRUMENT); } @@ -1219,7 +1220,7 @@ static void store_create(void) obj_all_done = FALSE; /* Magic Shop */ - if (streq(st_info[st_ptr->st_idx].name, STORE_MAGIC) && + if ((st_info[st_ptr->st_idx].name == STORE_MAGIC) && magik(20)) { s16b spell; @@ -1235,7 +1236,7 @@ static void store_create(void) } /* Temple */ - else if (streq(st_info[st_ptr->st_idx].name, STORE_TEMPLE) && + else if ((st_info[st_ptr->st_idx].name == STORE_TEMPLE) && magik(20)) { s16b spell; @@ -1581,8 +1582,7 @@ void display_store(void) else if (st_info[st_ptr->st_idx].flags & STF_MUSEUM) { /* Show the name of the store */ - strnfmt(buf, 80, "%s", st_info[cur_store_num].name); - prt(buf, 3, 30); + prt(st_info[cur_store_num].name, 3, 30); /* Label the item descriptions */ put_str("Item Description", 5, 3); @@ -1599,10 +1599,7 @@ void display_store(void) put_str(buf, 3, 10); /* Show the max price in the store (above prices) */ - strnfmt(buf, 80, "%s (" FMTs16b ")", - st_info[cur_store_num].name, - ot_ptr->max_cost); - prt(buf, 3, 50); + prt(fmt::format("{:s} ({:d})", st_info[cur_store_num].name, ot_ptr->max_cost), 3, 50); /* Label the item descriptions */ put_str("Item Description", 5, 3); diff --git a/src/store_info_type.hpp b/src/store_info_type.hpp index abb87095..78aa071e 100644 --- a/src/store_info_type.hpp +++ b/src/store_info_type.hpp @@ -11,7 +11,7 @@ */ struct store_info_type { - const char *name = nullptr; /* Name */ + std::string name; /* Name */ std::vector items; /* Table -- Legal item kinds */ -- cgit v1.2.3 From 616954ca62b114793735b8b5a888714e1263bdc3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove redundant parameters form town_gen_* functions --- src/wild.cc | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/wild.cc b/src/wild.cc index e4fdf33f..01b36f87 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -967,7 +967,7 @@ static void set_border(int y, int x) } -static void town_borders(int t_idx, int qy, int qx) +static void town_borders(int qy, int qx) { int y, x; @@ -1012,7 +1012,7 @@ static bool_ create_townpeople_hook(int r_idx) * layout, including the size and shape of the buildings, the * locations of the doorways, and the location of the stairs. */ -static void town_gen_hack(int t_idx, int qy, int qx) +static void town_gen_hack(int qy, int qx) { int y, x, floor; bool_ (*old_get_mon_num_hook)(int r_idx); @@ -1054,7 +1054,7 @@ static void town_gen_hack(int t_idx, int qy, int qx) } /* Generates the town's borders */ - if (magik(TOWN_NORMAL_FLOOR)) town_borders(t_idx, qy, qx); + if (magik(TOWN_NORMAL_FLOOR)) town_borders(qy, qx); /* Some inhabitants(leveled .. hehe :) */ @@ -1103,7 +1103,7 @@ static void town_gen_hack(int t_idx, int qy, int qx) get_mon_num_prep(); } -static void town_gen_circle(int t_idx, int qy, int qx) +static void town_gen_circle(int qy, int qx) { int y, x, cy, cx, rad, floor; bool_ (*old_get_mon_num_hook)(int r_idx); @@ -1235,7 +1235,7 @@ static void town_gen_circle(int t_idx, int qy, int qx) } -static void town_gen_hidden(int t_idx, int qy, int qx) +static void town_gen_hidden() { /* Get "remaining stores" */ auto rooms = get_shops(); @@ -1293,22 +1293,20 @@ static void town_gen_hidden(int t_idx, int qy, int qx) */ void town_gen(int t_idx) { - int qy, qx; - /* Level too small to contain a town */ if (cur_hgt < SCREEN_HGT) return; if (cur_wid < SCREEN_WID) return; - /* Center fo the level */ - qy = (cur_hgt - SCREEN_HGT) / 2; - qx = (cur_wid - SCREEN_WID) / 2; + /* Center of the level */ + int qy = (cur_hgt - SCREEN_HGT) / 2; + int qx = (cur_wid - SCREEN_WID) / 2; /* Build stuff */ switch (rand_int(3)) { case 0: { - town_gen_hack(t_idx, qy, qx); + town_gen_hack(qy, qx); if (wizard) { msg_format("Town level(normal) (%d, seed %d)", @@ -1319,7 +1317,7 @@ void town_gen(int t_idx) case 1: { - town_gen_circle(t_idx, qy, qx); + town_gen_circle(qy, qx); if (wizard) { msg_format("Town level(circle)(%d, seed %d)", @@ -1330,7 +1328,7 @@ void town_gen(int t_idx) case 2: { - town_gen_hidden(t_idx, qy, qx); + town_gen_hidden(); if (wizard) { msg_format("Town level(hidden)(%d, seed %d)", -- cgit v1.2.3 From dd76070a7d8676a5f13dcc91fc7ed2eb2639d9df Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move ab_info into GameEditData --- lib/edit/misc.txt | 3 -- lib/mods/theme/edit/misc.txt | 3 -- src/ability_type_fwd.hpp | 3 -- src/game_edit_data.hpp | 6 ++++ src/init1.cc | 69 ++++++++++++++++++++++++-------------------- src/init2.cc | 2 +- src/skills.cc | 58 +++++++++++++++++++++++++------------ src/squelch/condition.cc | 5 ++++ src/variable.cc | 10 ------- src/variable.hpp | 3 -- 10 files changed, 89 insertions(+), 73 deletions(-) delete mode 100644 src/ability_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 8bf64864..5f5a4b1d 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -47,6 +47,3 @@ M:M:768 # Maximum number of skills in s_info.txt M:k:60 - -# Maximum number of traits in ab_info.txt -M:b:50 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index b4f43f5e..8cbac0ce 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -47,6 +47,3 @@ M:M:768 # Maximum number of skills in s_info.txt M:k:60 - -# Maximum number of traits in ab_info.txt -M:b:50 diff --git a/src/ability_type_fwd.hpp b/src/ability_type_fwd.hpp deleted file mode 100644 index bade8638..00000000 --- a/src/ability_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct ability_type; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 7b69ecac..b8463158 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,5 +1,6 @@ #pragma once +#include "ability_type.hpp" #include "dungeon_info_type.hpp" #include "hist_type.hpp" #include "owner_type.hpp" @@ -87,4 +88,9 @@ struct GameEditData { */ skill_modifiers gen_skill; + /** + * Player abilities. + */ + std::vector ab_info; + }; diff --git a/src/init1.cc b/src/init1.cc index 658cf8e2..977bad9a 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3279,9 +3279,9 @@ errr init_s_info_txt(FILE *fp) */ errr init_ab_info_txt(FILE *fp) { - int i, z; + auto &ab_info = game->edit_data.ab_info; + char buf[1024]; - char *s; /* Current entry */ ability_type *ab_ptr = NULL; @@ -3310,7 +3310,7 @@ errr init_ab_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -3322,16 +3322,13 @@ errr init_ab_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); - - /* Verify information */ - if (i >= max_ab_idx) return (2); + int i = atoi(buf + 2); /* Save the index */ error_idx = i; /* Point at the "info" */ - ab_ptr = &ab_info[i]; + ab_ptr = &expand_to_fit_index(ab_info, i); /* Copy name */ assert(!ab_ptr->name); @@ -3339,13 +3336,13 @@ errr init_ab_info_txt(FILE *fp) /* Init */ ab_ptr->action_mkey = 0; - for (z = 0; z < 10; z++) + for (std::size_t z = 0; z < 10; z++) { ab_ptr->skills[z] = -1; ab_ptr->need_abilities[z] = -1; ab_ptr->forbid_abilities[z] = -1; } - for (z = 0; z < 6; z++) + for (std::size_t z = 0; z < 6; z++) { ab_ptr->stat[z] = -1; } @@ -3361,7 +3358,7 @@ errr init_ab_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire the text */ - s = buf + 2; + char const *s = buf + 2; /* Append description */ if (!ab_ptr->desc) @@ -3383,7 +3380,7 @@ errr init_ab_info_txt(FILE *fp) char *txt; /* Acquire the text */ - s = buf + 2; + char *s = buf + 2; if (NULL == (txt = strchr(s, ':'))) return (1); *txt = '\0'; @@ -3438,8 +3435,14 @@ errr init_ab_info_txt(FILE *fp) if (skill == -1) return (1); + std::size_t z; for (z = 0; z < 10; z++) - if (ab_ptr->skills[z] == -1) break; + { + if (ab_ptr->skills[z] == -1) + { + break; + } + } if (z < 10) { @@ -3454,20 +3457,14 @@ errr init_ab_info_txt(FILE *fp) /* Process 'a' for "needed ability" */ if (buf[0] == 'a') { - s16b ab; - - ab = find_ability(buf + 2); - - if (ab == -1) return (1); - - for (z = 0; z < 10; z++) - if (ab_ptr->need_abilities[z] == -1) break; - - if (z < 10) + s16b ab = find_ability(buf + 2); + if (ab == -1) { - ab_ptr->need_abilities[z] = ab; + return (1); } + ab_ptr->need_abilities.push_back(ab); + /* Next... */ continue; } @@ -3521,15 +3518,29 @@ errr init_ab_info_txt(FILE *fp) if ((ab1 == -1) || (ab2 == -1)) return (1); + std::size_t z; + for (z = 0; z < 10; z++) - if (ab_info[ab1].forbid_abilities[z] == -1) break; + { + if (ab_info[ab1].forbid_abilities[z] == -1) + { + break; + } + } + if (z < 10) { ab_info[ab1].forbid_abilities[z] = ab2; } for (z = 0; z < 10; z++) - if (ab_info[ab2].forbid_abilities[z] == -1) break; + { + if (ab_info[ab2].forbid_abilities[z] == -1) + { + break; + } + } + if (z < 10) { ab_info[ab2].forbid_abilities[z] = ab1; @@ -6901,12 +6912,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst if (max_s_idx > MAX_SKILLS) return (1); } - /* Maximum ab_idx */ - else if (zz[0][0] == 'b') - { - max_ab_idx = atoi(zz[1]); - } - /* Maximum k_idx */ else if (zz[0][0] == 'K') { diff --git a/src/init2.cc b/src/init2.cc index 242fd4bb..cf68f4be 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -358,7 +358,7 @@ namespace { static void allocate() { - ab_info = make_array(max_ab_idx); + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/skills.cc b/src/skills.cc index a1f9f793..cbd07540 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -811,6 +811,8 @@ static void print_skill_batch(const std::vector> &p, int s static int do_cmd_activate_skill_aux() { + auto const &ab_info = game->edit_data.ab_info; + char which; int start = 0; int ret; @@ -845,7 +847,7 @@ static int do_cmd_activate_skill_aux() } } - for (size_t i = 0; i < max_ab_idx; i++) + for (size_t i = 0; i < ab_info.size(); i++) { if (ab_info[i].action_mkey && p_ptr->has_ability(i)) { @@ -955,6 +957,8 @@ static int do_cmd_activate_skill_aux() /* Ask & execute a skill */ void do_cmd_activate_skill() { + auto const &ab_info = game->edit_data.ab_info; + int x_idx; bool_ push = TRUE; @@ -963,26 +967,34 @@ void do_cmd_activate_skill() { push = FALSE; } - else if (!command_arg) x_idx = do_cmd_activate_skill_aux(); + else if (!command_arg) + { + x_idx = do_cmd_activate_skill_aux(); + } else { - int i, j; - x_idx = command_arg; /* Check validity */ + int i; for (i = 1; i < max_s_idx; i++) { if (s_info[i].value && (s_descriptors[i].action_mkey == x_idx)) + { break; + } } - for (j = 0; j < max_ab_idx; j++) + + std::size_t j; + for (j = 0; j < ab_info.size(); j++) { if (p_ptr->has_ability(j) && (ab_info[j].action_mkey == x_idx)) + { break; + } } - if ((j == max_ab_idx) && (i == max_s_idx)) + if ((j == ab_info.size()) && (i == max_s_idx)) { msg_print("Uh?"); return; @@ -1432,10 +1444,9 @@ void do_get_new_skill() */ s16b find_ability(cptr name) { - u16b i; + auto const &ab_info = game->edit_data.ab_info; - /* Scan ability list */ - for (i = 0; i < max_ab_idx; i++) + for (std::size_t i = 0; i < ab_info.size(); i++) { if (ab_info[i].name && streq(ab_info[i].name, name)) { @@ -1450,7 +1461,9 @@ s16b find_ability(cptr name) /* Do we meet the requirements */ static bool_ can_learn_ability(int ab) { - ability_type *ab_ptr = &ab_info[ab]; + auto const &ab_info = game->edit_data.ab_info; + + auto ab_ptr = &ab_info[ab]; int i; if (p_ptr->has_ability(ab)) @@ -1503,6 +1516,8 @@ static bool_ can_learn_ability(int ab) /* Learn an ability */ static void gain_ability(int ab) { + auto const &ab_info = game->edit_data.ab_info; + int wid, hgt; Term_get_size(&wid, &hgt); @@ -1525,8 +1540,10 @@ static void gain_ability(int ab) p_ptr->skill_points -= ab_info[ab].cost; } -static bool compare_abilities(const int ab_idx1, const int ab_idx2) +static bool compare_abilities(std::size_t ab_idx1, std::size_t ab_idx2) { + auto const &ab_info = game->edit_data.ab_info; + return strcmp(ab_info[ab_idx1].name, ab_info[ab_idx2].name) < 0; } @@ -1535,11 +1552,11 @@ static bool compare_abilities(const int ab_idx1, const int ab_idx2) */ void dump_abilities(FILE *fff) { - int i; + auto const &ab_info = game->edit_data.ab_info; // Find all abilities that the player has. - std::vector table; - for (i = 0; i < max_ab_idx; i++) + std::vector table; + for (std::size_t i = 0; i < ab_info.size(); i++) { if (ab_info[i].name && p_ptr->has_ability(i)) { @@ -1569,8 +1586,10 @@ void dump_abilities(FILE *fff) /* * Draw the abilities list */ -static void print_abilities(const std::vector &table, int sel, int start) +static void print_abilities(const std::vector &table, int sel, int start) { + auto const &ab_info = game->edit_data.ab_info; + int i, j; int wid, hgt; cptr keys; @@ -1639,9 +1658,10 @@ static void print_abilities(const std::vector &table, int sel, int start) */ void do_cmd_ability() { + auto const &ab_info = game->edit_data.ab_info; + int sel = 0, start = 0; char c; - int i; int wid, hgt; /* Save the screen */ @@ -1651,8 +1671,8 @@ void do_cmd_ability() Term_clear(); /* Initialise the abilities list */ - std::vector table; - for (i = 0; i < max_ab_idx; i++) + std::vector table; + for (std::size_t i = 0; i < ab_info.size(); i++) { if (ab_info[i].name) { @@ -1770,6 +1790,8 @@ void apply_level_abilities(int level) { auto apply = [level](std::vector const &abilities) -> void { + auto const &ab_info = game->edit_data.ab_info; + for (auto const &a: abilities) { if (a.level == level) diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index e7429cab..7c01c4cd 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -6,6 +6,7 @@ #include "tome/squelch/cursor.hpp" #include "tome/squelch/tree_printer.hpp" #include "../ability_type.hpp" +#include "../game.hpp" #include "../object1.hpp" #include "../object2.hpp" #include "../object_kind.hpp" @@ -939,6 +940,8 @@ std::shared_ptr AbilityCondition::from_json(jsoncons::json const &j) void AbilityCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const { + auto const &ab_info = game->edit_data.ab_info; + cptr ability_s = ab_info[m_ability_idx].name; p->write(ecol, "You have the "); @@ -949,6 +952,8 @@ void AbilityCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_ void AbilityCondition::to_json(jsoncons::json &j) const { + auto const &ab_info = game->edit_data.ab_info; + j["ability"] = ab_info[m_ability_idx].name; } diff --git a/src/variable.cc b/src/variable.cc index 89e0bd5b..a13ee3aa 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -462,11 +462,6 @@ monster_race *r_info; */ monster_ego *re_info; -/* - * Player abilities arrays - */ -ability_type *ab_info; - /* * Player skills arrays */ @@ -604,11 +599,6 @@ s32b get_level_use_stick = -1; */ u16b max_s_idx; -/* - * Maximum number of abilities in ab_info.txt - */ -u16b max_ab_idx; - /* * Maximum number of monsters in r_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 415b0676..2192d2b2 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -1,7 +1,6 @@ #pragma once #include "angband.h" -#include "ability_type_fwd.hpp" #include "alloc_entry_fwd.hpp" #include "artifact_type_fwd.hpp" #include "birther.hpp" @@ -158,7 +157,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern ability_type *ab_info; extern skill_type *s_info; extern skill_descriptor *s_descriptors; extern feature_type *f_info; @@ -180,7 +178,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_ab_idx; extern u16b max_s_idx; extern u16b max_r_idx; extern u16b max_re_idx; -- cgit v1.2.3 From c84490dd6fb5d1e85482c2271e00cb768bae410e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Change ability_type::{name, desc, action_desc} to std::string --- src/ability_type.hpp | 8 +++++--- src/help.cc | 4 ++-- src/help.hpp | 2 +- src/include/tome/squelch/tree_printer.hpp | 4 +++- src/init1.cc | 24 ++++++++++-------------- src/skills.cc | 30 +++++++++++++++++------------- src/squelch/condition.cc | 4 +--- src/squelch/tree_printer.cc | 5 +++++ 8 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/ability_type.hpp b/src/ability_type.hpp index 3a2a51ee..0291e4de 100644 --- a/src/ability_type.hpp +++ b/src/ability_type.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "h-basic.h" /** @@ -7,10 +9,10 @@ */ struct ability_type { - const char *name; /* Name */ - char *desc; /* Description */ + std::string name; /* Name */ + std::string desc; /* Description */ - const char *action_desc; /* Action Description */ + std::string action_desc; /* Action Description */ s16b action_mkey; /* Action do to */ diff --git a/src/help.cc b/src/help.cc index 1997717e..b74e6584 100644 --- a/src/help.cc +++ b/src/help.cc @@ -734,7 +734,7 @@ void help_skill(cptr skill) show_context_help(find_context_help(skill_table, skill)); } -void help_ability(cptr ability) +void help_ability(std::string const &ability) { - show_context_help(find_context_help(ability_table, ability)); + show_context_help(find_context_help(ability_table, ability.c_str())); } diff --git a/src/help.hpp b/src/help.hpp index 5de6e6c6..eb8c3c98 100644 --- a/src/help.hpp +++ b/src/help.hpp @@ -10,4 +10,4 @@ extern void help_subrace(std::string const &subrace); extern void help_class(std::string const &klass); extern void help_god(cptr god); extern void help_skill(cptr skill); -extern void help_ability(cptr ability); +extern void help_ability(std::string const &ability); diff --git a/src/include/tome/squelch/tree_printer.hpp b/src/include/tome/squelch/tree_printer.hpp index e8ee1e56..c9e79af2 100644 --- a/src/include/tome/squelch/tree_printer.hpp +++ b/src/include/tome/squelch/tree_printer.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace squelch { @@ -30,7 +31,8 @@ public: void scroll_right(); - void write(uint8_t color, const char *line); + void write(uint8_t color, const char *); + void write(uint8_t color, std::string const &); private: int m_indent; diff --git a/src/init1.cc b/src/init1.cc index 977bad9a..f9df3c1b 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3329,10 +3329,10 @@ errr init_ab_info_txt(FILE *fp) /* Point at the "info" */ ab_ptr = &expand_to_fit_index(ab_info, i); + assert(ab_ptr->name.empty()); /* Copy name */ - assert(!ab_ptr->name); - ab_ptr->name = my_strdup(s); + ab_ptr->name = s; /* Init */ ab_ptr->action_mkey = 0; @@ -3357,19 +3357,15 @@ errr init_ab_info_txt(FILE *fp) /* Process 'D' for "Description" */ if (buf[0] == 'D') { - /* Acquire the text */ - char const *s = buf + 2; - - /* Append description */ - if (!ab_ptr->desc) - { - ab_ptr->desc = my_strdup(s); - } - else + /* Need newline? */ + if (!ab_ptr->desc.empty()) { - strappend(&ab_ptr->desc, format("\n%s", s)); + ab_ptr->desc += '\n'; } + /* Append */ + ab_ptr->desc += (buf + 2); + /* Next... */ continue; } @@ -3387,8 +3383,8 @@ errr init_ab_info_txt(FILE *fp) txt++; /* Copy name */ - assert(!ab_ptr->action_desc); - ab_ptr->action_desc = my_strdup(txt); + assert(ab_ptr->action_desc.empty()); + ab_ptr->action_desc = txt; /* Set mkey */ ab_ptr->action_mkey = atoi(s); diff --git a/src/skills.cc b/src/skills.cc index cbd07540..d923af65 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -784,7 +784,7 @@ void select_default_melee() /* * Print a batch of skills. */ -static void print_skill_batch(const std::vector> &p, int start) +static void print_skill_batch(const std::vector> &p, int start) { char buff[80]; int j = 0; @@ -800,7 +800,7 @@ static void print_skill_batch(const std::vector> &p, int s sprintf(buff, " %c - %d) %-30s", I2A(j), std::get<1>(p[i]), - std::get<0>(p[i])); + std::get<0>(p[i]).c_str()); prt(buff, 2 + j, 20); j++; @@ -817,7 +817,7 @@ static int do_cmd_activate_skill_aux() int start = 0; int ret; - std::vector> p; + std::vector> p; /* More than 1 melee skill ? */ if (get_melee_skills() > 1) @@ -920,8 +920,10 @@ static int do_cmd_activate_skill_aux() size_t i = 0; for (; i < p.size(); i++) { - if (!strcmp(buf, std::get<0>(p[i]))) + if (std::get<0>(p[i]) == buf) + { break; + } } if (i < p.size()) @@ -1448,7 +1450,9 @@ s16b find_ability(cptr name) for (std::size_t i = 0; i < ab_info.size(); i++) { - if (ab_info[i].name && streq(ab_info[i].name, name)) + auto const &ab_name = ab_info[i].name; + + if ((!ab_name.empty()) && (ab_name == name)) { return (i); } @@ -1544,7 +1548,7 @@ static bool compare_abilities(std::size_t ab_idx1, std::size_t ab_idx2) { auto const &ab_info = game->edit_data.ab_info; - return strcmp(ab_info[ab_idx1].name, ab_info[ab_idx2].name) < 0; + return ab_info[ab_idx1].name < ab_info[ab_idx2].name; } /* @@ -1558,7 +1562,7 @@ void dump_abilities(FILE *fff) std::vector table; for (std::size_t i = 0; i < ab_info.size(); i++) { - if (ab_info[i].name && p_ptr->has_ability(i)) + if ((!ab_info[i].name.empty()) && p_ptr->has_ability(i)) { table.push_back(i); } @@ -1576,7 +1580,7 @@ void dump_abilities(FILE *fff) for (int i : table) { - fprintf(fff, "\n * %s", ab_info[i].name); + fprintf(fff, "\n * %s", ab_info[i].name.c_str()); } fprintf(fff, "\n"); @@ -1603,7 +1607,7 @@ static void print_abilities(const std::vector &table, int sel, int c_prt((p_ptr->skill_points) ? TERM_L_BLUE : TERM_L_RED, format("Skill points left: %d", p_ptr->skill_points), 2, 0); - print_desc_aux(ab_info[table[sel]].desc, 3, 0); + print_desc_aux(ab_info[table[sel]].desc.c_str(), 3, 0); for (j = start; j < start + (hgt - 7); j++) { @@ -1639,7 +1643,7 @@ static void print_abilities(const std::vector &table, int sel, int end = ']'; } - c_prt(color, format("%c.%c%s", deb, end, ab_info[i].name), + c_prt(color, format("%c.%c%s", deb, end, ab_info[i].name.c_str()), j + 7 - start, 0); if (!p_ptr->has_ability(i)) @@ -1654,7 +1658,7 @@ static void print_abilities(const std::vector &table, int sel, int } /* - * Interreact with abilitiess + * Interreact with abilities */ void do_cmd_ability() { @@ -1674,7 +1678,7 @@ void do_cmd_ability() std::vector table; for (std::size_t i = 0; i < ab_info.size(); i++) { - if (ab_info[i].name) + if (!ab_info[i].name.empty()) { table.push_back(i); } @@ -1798,7 +1802,7 @@ void apply_level_abilities(int level) { if ((level > 1) && (!p_ptr->has_ability(a.ability))) { - cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[a.ability].name); + cmsg_format(TERM_L_GREEN, "You have learned the ability '%s'.", ab_info[a.ability].name.c_str()); } p_ptr->gain_ability(a.ability); diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 7c01c4cd..09535c53 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -942,10 +942,8 @@ void AbilityCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_ { auto const &ab_info = game->edit_data.ab_info; - cptr ability_s = ab_info[m_ability_idx].name; - p->write(ecol, "You have the "); - p->write(bcol, ability_s); + p->write(bcol, ab_info[m_ability_idx].name); p->write(ecol, " ability"); p->write(TERM_WHITE, "\n"); } diff --git a/src/squelch/tree_printer.cc b/src/squelch/tree_printer.cc index 2be098dc..0dbceec9 100644 --- a/src/squelch/tree_printer.cc +++ b/src/squelch/tree_printer.cc @@ -86,4 +86,9 @@ void TreePrinter::write(uint8_t color, cptr line) } } +void TreePrinter::write(uint8_t color, std::string const &line) +{ + write(color, line.c_str()); +} + } // namespace -- cgit v1.2.3 From 5f3ce3824f5174608a955703a14595c14d0a577d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Clean up ability_type --- lib/edit/ab_info.txt | 2 - lib/mods/theme/edit/ab_info.txt | 2 - src/ability_type.hpp | 42 ++++++++++++++------ src/init1.cc | 88 +++-------------------------------------- src/skills.cc | 39 +++++++----------- 5 files changed, 52 insertions(+), 121 deletions(-) diff --git a/lib/edit/ab_info.txt b/lib/edit/ab_info.txt index 976c6d03..ec878c67 100644 --- a/lib/edit/ab_info.txt +++ b/lib/edit/ab_info.txt @@ -20,8 +20,6 @@ # S:level(linear mode):stats # a:needed ability -# E:excluding ability:excluding ability - # Do not forget to update misc.txt with an entry like the following : # Maximum number of traits in ab_info.txt # M:b:50 diff --git a/lib/mods/theme/edit/ab_info.txt b/lib/mods/theme/edit/ab_info.txt index 976c6d03..ec878c67 100644 --- a/lib/mods/theme/edit/ab_info.txt +++ b/lib/mods/theme/edit/ab_info.txt @@ -20,8 +20,6 @@ # S:level(linear mode):stats # a:needed ability -# E:excluding ability:excluding ability - # Do not forget to update misc.txt with an entry like the following : # Maximum number of traits in ab_info.txt # M:b:50 diff --git a/src/ability_type.hpp b/src/ability_type.hpp index 0291e4de..0ec596ba 100644 --- a/src/ability_type.hpp +++ b/src/ability_type.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "h-basic.h" @@ -9,19 +10,38 @@ */ struct ability_type { - std::string name; /* Name */ - std::string desc; /* Description */ +public: + struct skill_requirement { + s16b skill_idx = 0; + s16b level = 0; + }; - std::string action_desc; /* Action Description */ +public: + std::string name; /* Name */ + std::string desc; /* Description */ - s16b action_mkey; /* Action do to */ + std::string action_desc; /* Action Description */ - s16b cost; /* Skill points cost */ + s16b action_mkey = 0; /* Action do to */ + + s16b cost = 0; /* Skill points cost */ + + std::vector need_skills; /* List of prereq skills */ + + s16b stat[6] { }; /* List of prereq stats */ + + std::vector need_abilities; /* List of prereq abilities */ + + /** + * Default constructor + */ + ability_type() + { + for (auto &stat_ref: stat) + { + // Requirement is always met unless otherwise specified. + stat_ref = -1; + } + } - /* Prereqs */ - s16b skills[10]; /* List of prereq skills(10 max) */ - s16b skill_levels[10]; /* List of prereq skills(10 max) */ - s16b stat[6]; /* List of prereq stats */ - s16b need_abilities[10]; /* List of prereq abilities(10 max) */ - s16b forbid_abilities[10]; /* List of forbidden abilities(10 max) */ }; diff --git a/src/init1.cc b/src/init1.cc index f9df3c1b..a6376090 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3334,19 +3334,6 @@ errr init_ab_info_txt(FILE *fp) /* Copy name */ ab_ptr->name = s; - /* Init */ - ab_ptr->action_mkey = 0; - for (std::size_t z = 0; z < 10; z++) - { - ab_ptr->skills[z] = -1; - ab_ptr->need_abilities[z] = -1; - ab_ptr->forbid_abilities[z] = -1; - } - for (std::size_t z = 0; z < 6; z++) - { - ab_ptr->stat[z] = -1; - } - /* Next... */ continue; } @@ -3415,7 +3402,6 @@ errr init_ab_info_txt(FILE *fp) if (buf[0] == 'k') { char *sec; - s16b level, skill; /* Scan for the values */ if (NULL == (sec = strchr(buf + 2, ':'))) @@ -3426,25 +3412,15 @@ errr init_ab_info_txt(FILE *fp) sec++; if (!*sec) return (1); - level = atoi(buf + 2); - skill = find_skill(sec); - + s16b level = atoi(buf + 2); + s16b skill = find_skill(sec); if (skill == -1) return (1); - std::size_t z; - for (z = 0; z < 10; z++) - { - if (ab_ptr->skills[z] == -1) - { - break; - } - } + ability_type::skill_requirement req; + req.skill_idx = skill; + req.level = level; - if (z < 10) - { - ab_ptr->skills[z] = skill; - ab_ptr->skill_levels[z] = level; - } + ab_ptr->need_skills.emplace_back(req); /* Next... */ continue; @@ -3494,58 +3470,6 @@ errr init_ab_info_txt(FILE *fp) continue; } - /* Process 'E' for "Excluding ability" */ - if (buf[0] == 'E') - { - char *sec; - s16b ab1, ab2; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 2, ':'))) - { - return (1); - } - *sec = '\0'; - sec++; - if (!*sec) return (1); - - ab1 = find_ability(buf + 2); - ab2 = find_ability(sec); - - if ((ab1 == -1) || (ab2 == -1)) return (1); - - std::size_t z; - - for (z = 0; z < 10; z++) - { - if (ab_info[ab1].forbid_abilities[z] == -1) - { - break; - } - } - - if (z < 10) - { - ab_info[ab1].forbid_abilities[z] = ab2; - } - - for (z = 0; z < 10; z++) - { - if (ab_info[ab2].forbid_abilities[z] == -1) - { - break; - } - } - - if (z < 10) - { - ab_info[ab2].forbid_abilities[z] = ab1; - } - - /* Next... */ - continue; - } - /* Oops */ return (6); } diff --git a/src/skills.cc b/src/skills.cc index d923af65..dc543ed8 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1462,49 +1462,40 @@ s16b find_ability(cptr name) return ( -1); } -/* Do we meet the requirements */ -static bool_ can_learn_ability(int ab) +/* Do we meet the requirements? */ +static bool can_learn_ability(int ab) { auto const &ab_info = game->edit_data.ab_info; auto ab_ptr = &ab_info[ab]; - int i; if (p_ptr->has_ability(ab)) + { return FALSE; + } if (p_ptr->skill_points < ab_info[ab].cost) + { return FALSE; + } - for (i = 0; i < 10; i++) + for (auto const &need_skill: ab_ptr->need_skills) { - /* Must have skill level */ - if (ab_ptr->skills[i] > -1) + if (get_skill(need_skill.skill_idx) < need_skill.level) { - if (get_skill(ab_ptr->skills[i]) < ab_ptr->skill_levels[i]) - return FALSE; - } - - /* Must have ability */ - if (ab_ptr->need_abilities[i] > -1) - { - if (!p_ptr->has_ability(ab_ptr->need_abilities[i])) - { - return FALSE; - } + return FALSE; } + } - /* Must not have ability */ - if (ab_ptr->forbid_abilities[i] > -1) + for (auto const &need_ability: ab_ptr->need_abilities) + { + if (!p_ptr->has_ability(need_ability)) { - if (p_ptr->has_ability(ab_ptr->forbid_abilities[i])) - { - return FALSE; - } + return FALSE; } } - for (i = 0; i < 6; i++) + for (std::size_t i = 0; i < 6; i++) { /* Must have stat */ if (ab_ptr->stat[i] > -1) -- cgit v1.2.3 From 82e739ef82d6082712fb17ef71e6d9cba2e8fc58 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Fix indentation --- src/player_type.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/player_type.hpp b/src/player_type.hpp index 14a9466f..680c3df0 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -415,10 +415,10 @@ struct player_type */ std::vector random_spells; - /** - * Runecrafter's selfmade spells. - */ - std::vector rune_spells; + /** + * Runecrafter's selfmade spells. + */ + std::vector rune_spells; /** * Does the player have the given ability? -- cgit v1.2.3 From 5869c5622e4345ffd50e0713d188f2d283b61caa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove support for "O:" lines in s_info.txt If was actually not being used. --- lib/edit/s_info.txt | 10 ---------- lib/mods/theme/edit/s_info.txt | 10 ---------- src/init1.cc | 32 -------------------------------- 3 files changed, 52 deletions(-) diff --git a/lib/edit/s_info.txt b/lib/edit/s_info.txt index 87251694..b6c195dc 100644 --- a/lib/edit/s_info.txt +++ b/lib/edit/s_info.txt @@ -16,7 +16,6 @@ # A:action mkey:action desc # E:exclusive skill:exclusive skill -# O:skill:opposing skill%percent # A:skill:friendly skill%percent # T:father:child @@ -260,15 +259,6 @@ f:Boomerang-mastery:Combat%7 f:Barehand-combat:Combat%50 f:Boulder-throwing:Combat%40 -# No more, let's see how it turns out -# Sorcery and Weaponmastery aren't exactly friendly to each other -#O:Sorcery:Weaponmastery%100 -#O:Sorcery:Archery%100 -#O:Sorcery:Barehand-combat%100 -#O:Weaponmastery:Sorcery%100 -#O:Archery:Sorcery%100 -#O:Barehand-combat:Sorcery%100 - ############################### SPIRITUALITY SKILLS ########################### diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt index 2d42bf4a..5d57dbe6 100644 --- a/lib/mods/theme/edit/s_info.txt +++ b/lib/mods/theme/edit/s_info.txt @@ -16,7 +16,6 @@ # A:action mkey:action desc # E:exclusive skill:exclusive skill -# O:skill:opposing skill%percent # A:skill:friendly skill%percent # T:father:child @@ -262,15 +261,6 @@ f:Boomerang-mastery:Combat%7 f:Barehand-combat:Combat%50 f:Boulder-throwing:Combat%40 -# No more, let's see how it turns out -# Sorcery and Weaponmastery aren't exactly friendly to each other -#O:Sorcery:Weaponmastery%100 -#O:Sorcery:Archery%100 -#O:Sorcery:Barehand-combat%100 -#O:Weaponmastery:Sorcery%100 -#O:Archery:Sorcery%100 -#O:Barehand-combat:Sorcery%100 - ############################### SPIRITUALITY SKILLS ########################### diff --git a/src/init1.cc b/src/init1.cc index a6376090..29f63ac7 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3091,38 +3091,6 @@ errr init_s_info_txt(FILE *fp) } - /* Process 'O' for "Opposite" */ - if (buf[0] == 'O') - { - char *sec, *cval; - s16b s1, s2; - - /* Scan for the values */ - if (NULL == (sec = strchr(buf + 2, ':'))) - { - return (1); - } - *sec = '\0'; - sec++; - if (!*sec) return (1); - if (NULL == (cval = strchr(sec, '%'))) - { - return (1); - } - *cval = '\0'; - cval++; - if (!*cval) return (1); - - s1 = find_skill(buf + 2); - s2 = find_skill(sec); - if ((s1 == -1) || (s2 == -1)) return (1); - - s_descriptors[s1].action[s2] = -atoi(cval); - - /* Next... */ - continue; - } - /* Process 'A' for "Amical/friendly" */ if (buf[0] == 'f') { -- cgit v1.2.3 From 765e1a3dc7abce3a849b8d1f124ada7a6984154a Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move s_{info,descriptors} to Game/GameEdtiData --- lib/edit/misc.txt | 3 - lib/mods/theme/edit/misc.txt | 3 - src/birth.cc | 32 +-- src/game.hpp | 6 + src/game_edit_data.hpp | 6 + src/gods.cc | 3 + src/help.cc | 4 +- src/help.hpp | 2 +- src/init1.cc | 61 +++--- src/init2.cc | 3 +- src/loadsave.cc | 10 +- src/lua_bind.cc | 3 + src/mimic.cc | 3 + src/q_bounty.cc | 3 + src/q_god.cc | 2 + src/q_thief.cc | 3 + src/skill_descriptor.hpp | 21 +- src/skill_descriptor_fwd.hpp | 3 - src/skill_modifiers.hpp | 10 +- src/skill_type_fwd.hpp | 3 - src/skills.cc | 457 +++++++++++++++++++++++++++---------------- src/skills.hpp | 4 +- src/skills_defs.hpp | 1 - src/spells6.cc | 5 + src/squelch/condition.cc | 4 + src/variable.cc | 15 -- src/variable.hpp | 5 - src/xtra1.cc | 7 +- src/xtra2.cc | 2 + 29 files changed, 417 insertions(+), 267 deletions(-) delete mode 100644 src/skill_descriptor_fwd.hpp delete mode 100644 src/skill_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 5f5a4b1d..0513f242 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -44,6 +44,3 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 - -# Maximum number of skills in s_info.txt -M:k:60 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 8cbac0ce..d158a6a9 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -44,6 +44,3 @@ M:O:1024 # Maximum size for "m_list[]" M:M:768 - -# Maximum number of skills in s_info.txt -M:k:60 diff --git a/src/birth.cc b/src/birth.cc index 0ea545b5..fe814978 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2769,9 +2769,10 @@ static bool_ player_birth_aux_auto() */ static bool_ player_birth_aux() { - char c; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; - int i, j; + char c; int y = 0, x = 0; @@ -2780,12 +2781,12 @@ static bool_ player_birth_aux() /* Ask */ if (!player_birth_aux_ask()) return (FALSE); - for (i = 1; i < max_s_idx; i++) + for (std::size_t i = 1; i < s_descriptors.size(); i++) { s_info[i].dev = false; } - for (i = 1; i < max_s_idx; i++) + for (std::size_t i = 1; i < s_descriptors.size(); i++) { s32b value = 0, mod = 0; @@ -2845,22 +2846,31 @@ static bool_ player_birth_aux() } /* Edit character background */ - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { strnfmt(old_history[i], 60, "%s", history[i]); } - /* Turn 0 to space */ - for (i = 0; i < 4; i++) + + /* Turn NUL to space */ + for (std::size_t i = 0; i < 4; i++) { - for (j = 0; history[i][j]; j++) /* loop */; + std::size_t j = 0; - for (; j < 59; j++) history[i][j] = ' '; + // Search for the NUL + while (history[i][j++]) + ;; + + // Turn into spaces + for (; j < 59; j++) + { + history[i][j] = ' '; + } } display_player(1); c_put_str(TERM_L_GREEN, "(Character Background - Edit Mode)", 15, 20); while (TRUE) { - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { put_str(history[i], i + 16, 10); } @@ -2897,7 +2907,7 @@ static bool_ player_birth_aux() } else if (c == ESCAPE) { - for (i = 0; i < 4; i++) + for (std::size_t i = 0; i < 4; i++) { strnfmt(history[i], 60, "%s", old_history[i]); put_str(history[i], i + 16, 10); diff --git a/src/game.hpp b/src/game.hpp index 5da479c9..845824b7 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -6,6 +6,7 @@ #include "grid.hpp" #include "h-basic.h" #include "player_defs.hpp" +#include "skill_type.hpp" #include "wilderness_map.hpp" /** @@ -30,4 +31,9 @@ struct Game { */ GameEditData edit_data; + /** + * Current skill values. + */ + std::vector s_info; + }; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index b8463158..bb480f53 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -10,6 +10,7 @@ #include "randart_gen_type.hpp" #include "randart_part_type.hpp" #include "set_type.hpp" +#include "skill_descriptor.hpp" #include "store_action_type.hpp" #include "store_info_type.hpp" #include "vault_type.hpp" @@ -83,6 +84,11 @@ struct GameEditData { */ std::vector bg; + /** + * Player skills + */ + std::vector s_descriptors; + /** * Base skills for all characters. */ diff --git a/src/gods.cc b/src/gods.cc index 7da62d7a..82d8d300 100644 --- a/src/gods.cc +++ b/src/gods.cc @@ -7,6 +7,7 @@ */ #include "gods.hpp" +#include "game.hpp" #include "player_type.hpp" #include "skills.hpp" #include "skill_type.hpp" @@ -79,6 +80,8 @@ static bool_ may_follow_god(int god) */ void follow_god(int god, bool_ silent) { + auto &s_info = game->s_info; + /* Poor unbelievers, i'm so mean ... BOUHAHAHA */ if (get_skill(SKILL_ANTIMAGIC)) { diff --git a/src/help.cc b/src/help.cc index b74e6584..e5014b45 100644 --- a/src/help.cc +++ b/src/help.cc @@ -729,9 +729,9 @@ void help_god(cptr god) } } -void help_skill(cptr skill) +void help_skill(const std::__cxx11::string &skill) { - show_context_help(find_context_help(skill_table, skill)); + show_context_help(find_context_help(skill_table, skill.c_str())); } void help_ability(std::string const &ability) diff --git a/src/help.hpp b/src/help.hpp index eb8c3c98..5adf1381 100644 --- a/src/help.hpp +++ b/src/help.hpp @@ -9,5 +9,5 @@ extern void help_race(std::string const &race); extern void help_subrace(std::string const &subrace); extern void help_class(std::string const &klass); extern void help_god(cptr god); -extern void help_skill(cptr skill); +extern void help_skill(std::string const &skill); extern void help_ability(std::string const &ability); diff --git a/src/init1.cc b/src/init1.cc index 29f63ac7..9431ec46 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -833,7 +833,7 @@ static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf) return 1; } - auto s = &skill_modifiers->modifiers[i]; + auto s = &expand_to_fit_index(skill_modifiers->modifiers, i); s->basem = monster_ego_modify(v); s->base = val; @@ -3011,9 +3011,11 @@ errr init_set_info_txt(FILE *fp) */ errr init_s_info_txt(FILE *fp) { - int i, order = 1; + auto &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; + + int order = 1; char buf[1024]; - char *s; /* Current entry */ skill_descriptor *s_ptr = NULL; @@ -3083,8 +3085,11 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if ((s1 == -1) || (s2 == -1)) return (1); - s_descriptors[s1].action[s2] = SKILL_EXCLUSIVE; - s_descriptors[s2].action[s1] = SKILL_EXCLUSIVE; + // The "exclusive" relation is symmetric, so + // add summetrically so we don't have to specify + // twice in data files. + s_descriptors[s1].excludes.push_back(s2); + s_descriptors[s2].excludes.push_back(s1); /* Next... */ continue; @@ -3117,7 +3122,8 @@ errr init_s_info_txt(FILE *fp) s2 = find_skill(sec); if ((s1 == -1) || (s2 == -1)) return (1); - s_descriptors[s1].action[s2] = atoi(cval); + s_descriptors[s1].increases.emplace_back( + std::make_tuple(s2, atoi(cval))); /* Next... */ continue; @@ -3127,7 +3133,7 @@ errr init_s_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -3139,19 +3145,19 @@ errr init_s_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); - - /* Verify information */ - if (i >= max_s_idx) return (2); + int i = atoi(buf + 2); /* Save the index */ error_idx = i; /* Point at the "info" */ - s_ptr = &s_descriptors[i]; + s_ptr = &expand_to_fit_index(s_descriptors, i); + assert(s_ptr->name.empty()); + + /* Make sure s_info also expands appropriately */ + expand_to_fit_index(s_info, i); /* Copy name */ - assert(!s_ptr->name); s_ptr->name = my_strdup(s); /* Next... */ @@ -3164,19 +3170,15 @@ errr init_s_info_txt(FILE *fp) /* Process 'D' for "Description" */ if (buf[0] == 'D') { - /* Acquire the text */ - s = buf + 2; - - /* Description */ - if (!s_ptr->desc) - { - s_ptr->desc = my_strdup(s); - } - else + /* Need newline? */ + if (!s_ptr->desc.empty()) { - strappend(&s_ptr->desc, format("\n%s", s)); + s_ptr->desc += '\n'; } + /* Append */ + s_ptr->desc += (buf + 2); + /* Next... */ continue; } @@ -3187,15 +3189,15 @@ errr init_s_info_txt(FILE *fp) char *txt; /* Acquire the text */ - s = buf + 2; + char const *s = buf + 2; if (NULL == (txt = strchr(s, ':'))) return (1); *txt = '\0'; txt++; /* Copy action description */ - assert(!s_ptr->action_desc); - s_ptr->action_desc = my_strdup(txt); + assert(s_ptr->action_desc.empty()); + s_ptr->action_desc = txt; /* Copy mkey index */ s_ptr->action_mkey = atoi(s); @@ -6793,13 +6795,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_re_idx = atoi(zz[1]); } - /* Maximum s_idx */ - else if (zz[0][0] == 'k') - { - max_s_idx = atoi(zz[1]); - if (max_s_idx > MAX_SKILLS) return (1); - } - /* Maximum k_idx */ else if (zz[0][0] == 'K') { diff --git a/src/init2.cc b/src/init2.cc index cf68f4be..4ca60938 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -341,8 +341,7 @@ namespace { static void allocate() { - s_info = new skill_type[max_s_idx]; - s_descriptors = new skill_descriptor[max_s_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/loadsave.cc b/src/loadsave.cc index 64b4f6d6..41bd86d1 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -421,10 +421,7 @@ static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag) { - for (std::size_t i = 0; i < MAX_SKILLS; i++) - { - do_skill_modifier(&skill_modifiers->modifiers[i], flag); - } + do_vector(flag, skill_modifiers->modifiers, do_skill_modifier); } static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag) @@ -533,6 +530,7 @@ static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { auto const &d_info = game->edit_data.d_info; + auto &s_info = game->s_info; do_string(player_name, 32, flag); @@ -611,11 +609,11 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->melee_style, flag); do_s16b(&p_ptr->use_piercing_shots, flag); - u16b tmp16u = MAX_SKILLS; + u16b tmp16u = s_info.size(); do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u != MAX_SKILLS)) + if ((flag == ls_flag_t::LOAD) && (tmp16u != s_info.size())) { quit("Too few/many skills"); } diff --git a/src/lua_bind.cc b/src/lua_bind.cc index 1612fb29..bb305aa3 100644 --- a/src/lua_bind.cc +++ b/src/lua_bind.cc @@ -10,6 +10,7 @@ #include "cmd7.hpp" #include "corrupt.hpp" +#include "game.hpp" #include "init1.hpp" #include "monster2.hpp" #include "player_type.hpp" @@ -85,6 +86,8 @@ s32b lua_get_level(spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus) static s32b get_level_device_1(spell_type *spell, s32b max, s32b min) { + auto const &s_info = game->s_info; + // Must be in "device" mode. assert(get_level_use_stick > -1); // Delegate diff --git a/src/mimic.cc b/src/mimic.cc index 463c389d..6ce7b180 100644 --- a/src/mimic.cc +++ b/src/mimic.cc @@ -1,5 +1,6 @@ #include "mimic.hpp" +#include "game.hpp" #include "object_flag.hpp" #include "player_type.hpp" #include "skill_type.hpp" @@ -303,6 +304,8 @@ static s32b mumak_calc() static s32b bear_calc() { + auto &s_info = game->s_info; + p_ptr->pspeed = p_ptr->pspeed - 5 + (p_ptr->mimic_level / 5); p_ptr->to_a = p_ptr->to_a + 5 + ((p_ptr->mimic_level * 2) / 3); diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 56f2669a..e0a7ae2a 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -1,5 +1,6 @@ #include "q_bounty.hpp" +#include "game.hpp" #include "monster2.hpp" #include "monster_race.hpp" #include "monster_race_flag.hpp" @@ -108,6 +109,8 @@ bool_ quest_bounty_drop_item() bool_ quest_bounty_get_item() { + auto &s_info = game->s_info; + if (cquest.status != QUEST_STATUS_TAKEN) { msg_print("You do not have any bounty quest yet."); diff --git a/src/q_god.cc b/src/q_god.cc index cfd5b257..1cb4c0f5 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -1020,6 +1020,8 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *) static bool_ quest_god_get_hook(void *, void *in_, void *) { + auto &s_info = game->s_info; + hook_get_in *in = static_cast(in_); s32b item = -in->o_idx; /* Note the negation */ diff --git a/src/q_thief.cc b/src/q_thief.cc index a1ec76c6..e471aeab 100644 --- a/src/q_thief.cc +++ b/src/q_thief.cc @@ -3,6 +3,7 @@ #include "cave.hpp" #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "game.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -138,6 +139,8 @@ static bool_ quest_thieves_hook(void *, void *, void *) static bool_ quest_thieves_finish_hook(void *, void *in_, void *) { + auto const &s_info = game->s_info; + struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; diff --git a/src/skill_descriptor.hpp b/src/skill_descriptor.hpp index 687597da..8d9de004 100644 --- a/src/skill_descriptor.hpp +++ b/src/skill_descriptor.hpp @@ -1,24 +1,31 @@ #pragma once -#include "skill_descriptor_fwd.hpp" - #include "h-basic.h" #include "skill_flag_set.hpp" #include "skills_defs.hpp" +#include +#include + /** * Skill descriptor. */ struct skill_descriptor { - const char *name = nullptr; /* Name */ - char *desc = nullptr; /* Description */ - - const char *action_desc = nullptr; /* Action Description */ + std::string name; /* Name */ + std::string desc; /* Description */ + std::string action_desc; /* Action Description */ s16b action_mkey = 0; /* Action do to */ - s16b action[MAX_SKILLS] = { 0 }; /* List of actions against other skills */ + std::vector excludes; /* List of skills that this skill excludes; + any skill points assigned completely nullify + the listed skills */ + + std::vector> increases; + /* List of skills the this skill increases, + along with the modifier that gets applied. + The first tuple element is the skill index. */ s16b father = 0; /* Father in the skill tree */ s16b order = 0; /* Order in the tree */ diff --git a/src/skill_descriptor_fwd.hpp b/src/skill_descriptor_fwd.hpp deleted file mode 100644 index 136f337b..00000000 --- a/src/skill_descriptor_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct skill_descriptor; diff --git a/src/skill_modifiers.hpp b/src/skill_modifiers.hpp index fe9d9a1b..5e90b000 100644 --- a/src/skill_modifiers.hpp +++ b/src/skill_modifiers.hpp @@ -3,9 +3,15 @@ #include "h-basic.h" #include "skills_defs.hpp" #include "skill_modifier.hpp" -#include + +#include struct skill_modifiers { - std::array modifiers; + /** + * Skill modifiers indexed by skill. Note that this vector + * may be shorter than the s_descriptors vector. + */ + std::vector modifiers; + }; diff --git a/src/skill_type_fwd.hpp b/src/skill_type_fwd.hpp deleted file mode 100644 index 0a06dadb..00000000 --- a/src/skill_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct skill_type; diff --git a/src/skills.cc b/src/skills.cc index dc543ed8..96d34e06 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -57,6 +57,8 @@ using boost::algorithm::iequals; */ static void increase_skill(int i, s16b *invest) { + auto &s_info = game->s_info; + s32b max_skill_overage; /* No skill points to be allocated */ @@ -99,6 +101,8 @@ static void increase_skill(int i, s16b *invest) */ static void decrease_skill(int i, s16b *invest) { + auto &s_info = game->s_info; + /* Cannot decrease more */ if (!invest[i]) return; @@ -121,14 +125,17 @@ static void decrease_skill(int i, s16b *invest) * Given the name of a skill, returns skill index or -1 if no * such skill is found */ -s16b find_skill(cptr name) +s16b find_skill(cptr needle) { + auto const &s_descriptors = game->edit_data.s_descriptors; + /* Scan skill list */ - for (int i = 1; i < max_s_idx; i++) + for (std::size_t i = 1; i < s_descriptors.size(); i++) { - if (s_descriptors[i].name && streq(s_descriptors[i].name, name)) + auto const &name = s_descriptors[i].name; + if (!name.empty() && (name == needle)) { - return (i); + return i; } } @@ -136,15 +143,15 @@ s16b find_skill(cptr name) return -1; } -s16b find_skill_i(cptr name) +s16b find_skill_i(cptr needle) { - u16b i; + auto const &s_descriptors = game->edit_data.s_descriptors; /* Scan skill list */ - for (i = 1; i < max_s_idx; i++) + for (std::size_t i = 1; i < s_descriptors.size(); i++) { - /* The name matches */ - if (s_descriptors[i].name && iequals(s_descriptors[i].name, name)) + auto const &name = s_descriptors[i].name; + if (!name.empty() && iequals(name, needle)) { return (i); } @@ -160,6 +167,8 @@ s16b find_skill_i(cptr name) */ s16b get_skill(int skill) { + auto const &s_info = game->s_info; + return (s_info[skill].value / SKILL_STEP); } @@ -170,7 +179,7 @@ s16b get_skill(int skill) */ s16b get_skill_scale(int skill, u32b scale) { - s32b temp; + auto const &s_info = game->s_info; /* * SKILL_STEP shouldn't matter here because the second parameter is @@ -182,29 +191,35 @@ s16b get_skill_scale(int skill, u32b scale) * formula given above, I verified this works the same by using a tiny * scheme program... -- pelpel */ - temp = scale * s_info[skill].value; + s32b temp = scale * s_info[skill].value; return (temp / SKILL_MAX); } -static int get_idx(int i) +static std::size_t get_idx(int i) { - for (int j = 1; j < max_s_idx; j++) + auto const &s_descriptors = game->edit_data.s_descriptors; + + for (std::size_t j = 1; j < s_descriptors.size(); j++) { if (s_descriptors[j].order == i) - return (j); + { + return j; + } } - return (0); + + return 0; } static bool_ is_known(int s_idx) { - int i; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; if (wizard) return TRUE; if (s_info[s_idx].value || s_info[s_idx].mod) return TRUE; - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { /* It is our child, if we don't know it we continue to search, if we know it it is enough*/ if (s_descriptors[i].father == s_idx) @@ -218,35 +233,51 @@ static bool_ is_known(int s_idx) return FALSE; } -static void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int lev, bool_ full) +namespace { // anonymous + +struct skill_entry { + std::size_t skill_idx; + int indent_level; +}; + +} + +static void init_table_aux(std::vector *table, int father, int lev, bool_ full) { - for (int j = 1; j < max_s_idx; j++) + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; + + for (std::size_t j = 1; j < s_descriptors.size(); j++) { - int i = get_idx(j); + std::size_t i = get_idx(j); + if (s_descriptors[i].father != father) continue; if (s_info[i].hidden) continue; if (!is_known(i)) continue; - table[*idx][0] = i; - table[*idx][1] = lev; - (*idx)++; + skill_entry entry; + entry.skill_idx = i; + entry.indent_level = lev; + table->emplace_back(entry); if (s_info[i].dev || full) { - init_table_aux(table, idx, i, lev + 1, full); + init_table_aux(table, i, lev + 1, full); } } } -static void init_table(int table[MAX_SKILLS][2], int *max, bool_ full) +static void init_table(std::vector *table, bool_ full) { - *max = 0; - init_table_aux(table, max, -1, 0, full); + table->clear(); + init_table_aux(table, -1, 0, full); } static bool has_child(int sel) { - for (int i = 1; i < max_s_idx; i++) + auto const &s_descriptors = game->edit_data.s_descriptors; + + for (std::size_t i = 1; i < s_descriptors.size(); i++) { if ((s_descriptors[i].father == sel) && is_known(i)) { @@ -263,42 +294,51 @@ static bool has_child(int sel) */ void dump_skills(FILE *fff) { - int i, j, max = 0; - int table[MAX_SKILLS][2]; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; + char buf[80]; - init_table(table, &max, TRUE); + std::vector table; + table.reserve(s_descriptors.size()); + init_table(&table, TRUE); fprintf(fff, "\nSkills (points left: %d)", p_ptr->skill_points); - for (j = 0; j < max; j++) + for (auto const &entry: table) { - int z; - - i = table[j][0]; + std::size_t i = entry.skill_idx; + auto const &skill = s_info[i]; + auto const &skill_name = s_descriptors[i].name; - if ((s_info[i].value == 0) && (i != SKILL_MISC)) + if ((skill.value == 0) && (i != SKILL_MISC)) { - if (s_info[i].mod == 0) continue; + if (skill.mod == 0) + { + continue; + } } sprintf(buf, "\n"); - for (z = 0; z < table[j][1]; z++) strcat(buf, " "); + for (int z = 0; z < entry.indent_level; z++) + { + strcat(buf, " "); + } if (!has_child(i)) { - strcat(buf, format(" . %s", s_descriptors[i].name)); + strcat(buf, format(" . %s", skill_name.c_str())); } else { - strcat(buf, format(" - %s", s_descriptors[i].name)); + strcat(buf, format(" - %s", skill_name.c_str())); } fprintf(fff, "%-49s%s%06.3f [%05.3f]", - buf, s_info[i].value < 0 ? "-" : " ", - static_cast(ABS(s_info[i].value)) / SKILL_STEP, - static_cast(s_info[i].mod) / 1000); + buf, skill.value < 0 ? "-" : " ", + static_cast(ABS(skill.value)) / SKILL_STEP, + static_cast(skill.mod) / 1000); } fprintf(fff, "\n"); @@ -308,9 +348,12 @@ void dump_skills(FILE *fff) /* * Draw the skill tree */ -void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start) +static void print_skills(std::vector const &table, int sel, int start) { - int i, j; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; + + int j; int wid, hgt; cptr keys; @@ -322,52 +365,73 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start) display_message(0, 1, strlen(keys), TERM_WHITE, keys); c_prt((p_ptr->skill_points) ? TERM_L_BLUE : TERM_L_RED, format("Skill points left: %d", p_ptr->skill_points), 2, 0); - print_desc_aux(s_descriptors[table[sel][0]].desc, 3, 0); + print_desc_aux(s_descriptors[table[sel].skill_idx].desc.c_str(), 3, 0); for (j = start; j < start + (hgt - 7); j++) { byte color = TERM_WHITE; char deb = ' ', end = ' '; - if (j >= max) break; + if (j >= static_cast(table.size())) + { + break; + } + + std::size_t i = table[j].skill_idx; + auto const &name = s_descriptors[i].name; + auto const &skill = s_info[i]; - i = table[j][0]; + if ((skill.value == 0) && (i != SKILL_MISC)) + { + if (skill.mod == 0) + { + color = TERM_L_DARK; + } + else + { + color = TERM_ORANGE; + } + } + else if (skill.value == SKILL_MAX) + { + color = TERM_L_BLUE; + } - if ((s_info[i].value == 0) && (i != SKILL_MISC)) + if (skill.hidden) { - if (s_info[i].mod == 0) color = TERM_L_DARK; - else color = TERM_ORANGE; + color = TERM_L_RED; } - else if (s_info[i].value == SKILL_MAX) color = TERM_L_BLUE; - if (s_info[i].hidden) color = TERM_L_RED; + if (j == sel) { color = TERM_L_GREEN; deb = '['; end = ']'; } + if (!has_child(i)) { - c_prt(color, format("%c.%c%s", deb, end, s_descriptors[i].name), - j + 7 - start, table[j][1] * 4); + c_prt(color, format("%c.%c%s", deb, end, name.c_str()), + j + 7 - start, table[j].indent_level * 4); } - else if (s_info[i].dev) + else if (skill.dev) { - c_prt(color, format("%c-%c%s", deb, end, s_descriptors[i].name), - j + 7 - start, table[j][1] * 4); + c_prt(color, format("%c-%c%s", deb, end, name.c_str()), + j + 7 - start, table[j].indent_level * 4); } else { - c_prt(color, format("%c+%c%s", deb, end, s_descriptors[i].name), - j + 7 - start, table[j][1] * 4); + c_prt(color, format("%c+%c%s", deb, end, name.c_str()), + j + 7 - start, table[j].indent_level * 4); } + c_prt(color, format("%s%02ld.%03ld [%01d.%03d]", - s_info[i].value < 0 ? "-" : " ", - ABS(s_info[i].value) / SKILL_STEP, - ABS(s_info[i].value) % SKILL_STEP, - ABS(s_info[i].mod) / 1000, - ABS(s_info[i].mod) % 1000), + skill.value < 0 ? "-" : " ", + ABS(skill.value) / SKILL_STEP, + ABS(skill.value) % SKILL_STEP, + ABS(skill.mod) / 1000, + ABS(skill.mod) % 1000), j + 7 - start, 60); } } @@ -377,6 +441,8 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start) */ void recalc_skills(bool_ init) { + auto const &s_info = game->s_info; + static int thaum_level = 0; /* TODO: This should be a hook in ToME's lua */ @@ -429,49 +495,64 @@ void recalc_skills(bool_ init) /* * Recalc the skill value */ -static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s32b *bonus) +static void recalc_skills_theory( + std::vector &invest, + std::vector const &base_val, + std::vector const &base_mod, + std::vector const &bonus) { - int i, j; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; /* First we assign the normal points */ - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { /* Calc the base */ s_info[i].value = base_val[i] + (base_mod[i] * invest[i]) + bonus[i]; /* It cannot exceed SKILL_MAX */ - if (s_info[i].value > SKILL_MAX) s_info[i].value = SKILL_MAX; + if (s_info[i].value > SKILL_MAX) + { + s_info[i].value = SKILL_MAX; + } } /* Then we modify related skills */ - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { - for (j = 1; j < max_s_idx; j++) - { - /* Ignore self */ - if (j == i) continue; + auto const &s_descriptor = s_descriptors[i]; - /* Exclusive skills */ - if ((s_descriptors[i].action[j] == SKILL_EXCLUSIVE) && invest[i]) + // Process all exlusions + if (invest[i]) + { + for (auto exclude_si: s_descriptor.excludes) { - /* Turn it off */ - p_ptr->skill_points += invest[j]; - invest[j] = 0; - s_info[j].value = 0; + // Give back skill points invested during this "session" + p_ptr->skill_points += invest[exclude_si]; + invest[exclude_si] = 0; + + // Turn it off + s_info[exclude_si].value = 0; } + } - /* Non-exclusive skills */ - else if (s_descriptors[i].action[j]) - { - /* Increase / decrease with a % */ - s32b val = s_info[j].value + (invest[i] * s_info[j].mod * s_descriptors[i].action[j] / 100); + // Add any bonuses + for (auto const &increase: s_descriptor.increases) + { + auto increase_si = std::get<0>(increase); + auto increase_pct = std::get<1>(increase); - /* It cannot exceed SKILL_MAX */ - if (val > SKILL_MAX) val = SKILL_MAX; + /* Increase/decrease by percentage */ + s32b val = s_info[increase_si].value + (invest[i] * s_info[increase_si].mod * increase_pct / 100); - /* Save the modified value */ - s_info[j].value = val; + /* It cannot exceed SKILL_MAX */ + if (val > SKILL_MAX) + { + val = SKILL_MAX; } + + /* Save the modified value */ + s_info[increase_si].value = val; } } } @@ -481,10 +562,11 @@ static void recalc_skills_theory(s16b *invest, s32b *base_val, s32b *base_mod, s */ void do_cmd_skill() { - int sel = 0, start = 0, max; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; + + int sel = 0, start = 0; char c; - int table[MAX_SKILLS][2]; - int i; int wid, hgt; s16b skill_points_save; @@ -493,39 +575,38 @@ void do_cmd_skill() /* Save the screen */ screen_save(); - /* Allocate arrays to save skill values */ - std::unique_ptr skill_values_save(new s32b[MAX_SKILLS]); - std::unique_ptr skill_mods_save(new s32b[MAX_SKILLS]); - std::unique_ptr skill_invest(new s16b[MAX_SKILLS]); - std::unique_ptr skill_bonus(new s32b[MAX_SKILLS]); + /* Allocate arrays to save skill values and track assigned points */ + std::vector skill_values_save; skill_values_save.resize(s_descriptors.size(), 0); + std::vector skill_mods_save; skill_mods_save.resize(s_descriptors.size(), 0); + std::vector skill_invest; skill_invest.resize(s_descriptors.size(), 0); + std::vector skill_bonus; skill_bonus.resize(s_descriptors.size(), 0); /* Save skill points */ skill_points_save = p_ptr->skill_points; /* Save skill values */ - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { - skill_type *s_ptr = &s_info[i]; - + auto s_ptr = &s_info[i]; skill_values_save[i] = s_ptr->value; skill_mods_save[i] = s_ptr->mod; - skill_invest[i] = 0; - skill_bonus[i] = 0; } /* Clear the screen */ Term_clear(); /* Initialise the skill list */ - init_table(table, &max, FALSE); + std::vector table; + table.reserve(s_descriptors.size()); + init_table(&table, FALSE); while (TRUE) { Term_get_size(&wid, &hgt); /* Display list of skills */ - recalc_skills_theory(skill_invest.get(), skill_values_save.get(), skill_mods_save.get(), skill_bonus.get()); - print_skills(table, max, sel, start); + recalc_skills_theory(skill_invest, skill_values_save, skill_mods_save, skill_bonus); + print_skills(table, sel, start); /* Wait for user input */ c = inkey(); @@ -536,16 +617,21 @@ void do_cmd_skill() /* Expand / collapse list of skills */ else if (c == '\r') { - s_info[table[sel][0]].dev = !s_info[table[sel][0]].dev; - - init_table(table, &max, FALSE); + // Toggle the selected skill + s_info[table[sel].skill_idx].dev = !s_info[table[sel].skill_idx].dev; + // Re-populate table + init_table(&table, FALSE); } /* Next page */ else if (c == 'n') { sel += (hgt - 7); - if (sel >= max) sel = max - 1; + + if (sel >= static_cast(table.size())) + { + sel = table.size() - 1; + } } /* Previous page */ @@ -570,31 +656,31 @@ void do_cmd_skill() if (dir == 8) sel--; /* Miscellaneous skills cannot be increased/decreased as a group */ - if ((sel >= 0) && (sel < max) && table[sel][0] == SKILL_MISC) continue; + if ((sel >= 0) && (sel < static_cast(table.size())) && table[sel].skill_idx == SKILL_MISC) continue; /* Increase the current skill */ - if (dir == 6) increase_skill(table[sel][0], skill_invest.get()); + if (dir == 6) increase_skill(table[sel].skill_idx, skill_invest.data()); /* Decrease the current skill */ - if (dir == 4) decrease_skill(table[sel][0], skill_invest.get()); + if (dir == 4) decrease_skill(table[sel].skill_idx, skill_invest.data()); /* XXX XXX XXX Wizard mode commands outside of wizard2.c */ /* Increase the skill */ - if (wizard && (c == '+')) skill_bonus[table[sel][0]] += SKILL_STEP; + if (wizard && (c == '+')) skill_bonus[table[sel].skill_idx] += SKILL_STEP; /* Decrease the skill */ - if (wizard && (c == '-')) skill_bonus[table[sel][0]] -= SKILL_STEP; + if (wizard && (c == '-')) skill_bonus[table[sel].skill_idx] -= SKILL_STEP; /* Contextual help */ if (c == '?') { - help_skill(s_descriptors[table[sel][0]].name); + help_skill(s_descriptors[table[sel].skill_idx].name); } /* Handle boundaries and scrolling */ - if (sel < 0) sel = max - 1; - if (sel >= max) sel = 0; + if (sel < 0) sel = table.size() - 1; + if (sel >= static_cast(table.size())) sel = 0; if (sel < start) start = sel; if (sel >= start + (hgt - 7)) start = sel - (hgt - 7) + 1; } @@ -616,10 +702,9 @@ void do_cmd_skill() p_ptr->skill_points = skill_points_save; /* Restore skill values */ - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { - skill_type *s_ptr = &s_info[i]; - + auto s_ptr = &s_info[i]; s_ptr->value = skill_values_save[i]; s_ptr->mod = skill_mods_save[i]; } @@ -671,9 +756,11 @@ cptr get_melee_name() s16b get_melee_skills() { - int i, j = 0; + auto const &s_info = game->s_info; - for (i = 0; i < MAX_MELEE; i++) + int j = 0; + + for (std::size_t i = 0; i < MAX_MELEE; i++) { if ((s_info[melee_skills[i]].value > 0) && (!s_info[melee_skills[i]].hidden)) { @@ -784,7 +871,7 @@ void select_default_melee() /* * Print a batch of skills. */ -static void print_skill_batch(const std::vector> &p, int start) +static void print_skill_batch(const std::vector> &p, int start) { char buff[80]; int j = 0; @@ -812,12 +899,14 @@ static void print_skill_batch(const std::vectoredit_data.ab_info; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; char which; int start = 0; int ret; - std::vector> p; + std::vector> p; /* More than 1 melee skill ? */ if (get_melee_skills() > 1) @@ -825,7 +914,7 @@ static int do_cmd_activate_skill_aux() p.push_back(std::make_tuple("Change melee mode", 0)); } - for (size_t i = 1; i < max_s_idx; i++) + for (size_t i = 1; i < s_descriptors.size(); i++) { if (s_descriptors[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN))) { @@ -960,6 +1049,8 @@ static int do_cmd_activate_skill_aux() void do_cmd_activate_skill() { auto const &ab_info = game->edit_data.ab_info; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &s_info = game->s_info; int x_idx; bool_ push = TRUE; @@ -978,8 +1069,8 @@ void do_cmd_activate_skill() x_idx = command_arg; /* Check validity */ - int i; - for (i = 1; i < max_s_idx; i++) + std::size_t i; + for (i = 1; i < s_descriptors.size(); i++) { if (s_info[i].value && (s_descriptors[i].action_mkey == x_idx)) { @@ -996,7 +1087,7 @@ void do_cmd_activate_skill() } } - if ((j == ab_info.size()) && (i == max_s_idx)) + if ((j == ab_info.size()) && (i == s_descriptors.size())) { msg_print("Uh?"); return; @@ -1201,32 +1292,39 @@ bool_ forbid_non_blessed() /* * Augment skill value/modifier with the given skill_modifiers */ -static void augment_skills(s32b *v, s32b *m, skill_modifier const &s) +static void augment_skills(s32b *v, s32b *m, std::vector const &modifiers, std::size_t i) { - *v = modify_aux(*v, s.base, s.basem); - *m = modify_aux(*m, s.mod, s.modm); + if (i < modifiers.size()) // Ignore if the skill has no modifiers. + { + auto const &s = modifiers[i]; + *v = modify_aux(*v, s.base, s.basem); + *m = modify_aux(*m, s.mod, s.modm); + } } /* * Gets the base value of a skill, given a race/class/... */ -void compute_skills(s32b *v, s32b *m, int i) +void compute_skills(s32b *v, s32b *m, std::size_t i) { auto const &gen_skill = game->edit_data.gen_skill; - augment_skills(v, m, gen_skill.modifiers[i]); - augment_skills(v, m, rp_ptr->skill_modifiers.modifiers[i]); - augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers[i]); - augment_skills(v, m, cp_ptr->skill_modifiers.modifiers[i]); - augment_skills(v, m, spp_ptr->skill_modifiers.modifiers[i]); + augment_skills(v, m, gen_skill.modifiers, i); + augment_skills(v, m, rp_ptr->skill_modifiers.modifiers, i); + augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers, i); + augment_skills(v, m, cp_ptr->skill_modifiers.modifiers, i); + augment_skills(v, m, spp_ptr->skill_modifiers.modifiers, i); } /* * Initialize a skill with given values */ -void init_skill(s32b value, s32b mod, int i) +void init_skill(s32b value, s32b mod, std::size_t i) { + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; + s_info[i].value = value; s_info[i].mod = mod; s_info[i].hidden = (s_descriptors[i].flags & SKF_HIDDEN) @@ -1294,29 +1392,27 @@ static std::vector wrs(const std::vector &unscaled_weights) void do_get_new_skill() { - std::vector items; - int skl[LOST_SWORD_NSKILLS]; - s32b val[LOST_SWORD_NSKILLS], mod[LOST_SWORD_NSKILLS]; - int available_skills[MAX_SKILLS]; - int max_a = 0, res, i; + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; /* Check if some skills didn't influence other stuff */ recalc_skills(TRUE); /* Grab the ones we can gain */ - max_a = 0; - for (i = 0; i < max_s_idx; i++) + std::vector available_skills; + available_skills.reserve(s_descriptors.size()); + for (std::size_t i = 0; i < s_descriptors.size(); i++) { if (s_descriptors[i].flags & SKF_RANDOM_GAIN) { - available_skills[max_a] = i; - max_a++; + available_skills.push_back(i); } } /* Perform the selection */ std::vector weights; - for (i = 0; i < max_a; i++) { + for (std::size_t i = 0; i < available_skills.size(); i++) + { weights.push_back(s_descriptors[available_skills[i]].random_gain_chance); } @@ -1324,10 +1420,14 @@ void do_get_new_skill() assert(indexes.size() >= LOST_SWORD_NSKILLS); /* Extract the information needed from the skills */ - for (i = 0; i < LOST_SWORD_NSKILLS; i++) + int skl[LOST_SWORD_NSKILLS]; + s32b val[LOST_SWORD_NSKILLS]; + s32b mod[LOST_SWORD_NSKILLS]; + std::vector items; + for (std::size_t i = 0; i < LOST_SWORD_NSKILLS; i++) { s32b s_idx = available_skills[indexes[i]]; - skill_type *s_ptr = &s_info[s_idx]; + auto s_ptr = &s_info[s_idx]; if (s_ptr->mod) { @@ -1341,7 +1441,9 @@ void do_get_new_skill() val[i] = s_ptr->mod * 1; mod[i] = 100; if (mod[i] + s_ptr->mod > 500) + { mod[i] = 500 - s_ptr->mod; + } } else { @@ -1355,41 +1457,56 @@ void do_get_new_skill() val[i] = 1000; } - if (s_ptr->value + val[i] > SKILL_MAX) { + if (s_ptr->value + val[i] > SKILL_MAX) + { val[i] = SKILL_MAX - s_ptr->value; } skl[i] = s_idx; items.push_back(format("%-40s: +%02ld.%03ld value, +%01d.%03d modifier", - s_descriptors[s_idx].name, + s_descriptors[s_idx].name.c_str(), val[i] / SKILL_STEP, val[i] % SKILL_STEP, mod[i] / SKILL_STEP, mod[i] % SKILL_STEP)); } + // Ask for a skill while (TRUE) { char last = 'a' + (LOST_SWORD_NSKILLS-1); char buf[80]; sprintf(buf, "Choose a skill to learn (a-%c to choose, ESC to cancel)?", last); - res = ask_menu(buf, items); + int res = ask_menu(buf, items); /* Ok ? lets learn ! */ if (res > -1) { + std::size_t chosen_skill = skl[res]; + bool_ oppose = FALSE; int oppose_skill = -1; - /* Check we don't oppose an existing skill */ - for (i = 0; i < max_s_idx; i++) + /* Check we don't oppose a skill the player already has */ + for (std::size_t i = 0; i < s_descriptors.size(); i++) { - if ((s_descriptors[i].action[skl[res]] == SKILL_EXCLUSIVE) && - (s_info[i].value != 0)) + auto const &s_descriptor = s_descriptors[i]; + + // Only bother if player has skill + if (s_info[i].value) { - oppose = TRUE; - oppose_skill = i; - break; + // Check if i'th skill opposes the chosen one. + auto found = std::find( + s_descriptor.excludes.begin(), + s_descriptor.excludes.end(), + chosen_skill); + + if (found != s_descriptor.excludes.end()) + { + oppose = TRUE; + oppose_skill = i; + break; + } } } @@ -1407,26 +1524,32 @@ void do_get_new_skill() /* Prepare prompt */ msg = format("This skill is mutually exclusive with " "at least %s, continue?", - s_descriptors[oppose_skill].name); + s_descriptors[oppose_skill].name.c_str()); - /* The player rejected the choice */ - if (!get_check(msg)) continue; + /* The player rejected the choice; go back to prompt */ + if (!get_check(msg)) + { + continue; + } } - auto const s_desc = &s_descriptors[skl[res]]; - auto const s_ptr = &s_info[skl[res]]; + auto const s_desc = &s_descriptors[chosen_skill]; + auto const s_ptr = &s_info[chosen_skill]; + s_ptr->value += val[res]; s_ptr->mod += mod[res]; + if (mod[res]) { msg_format("You can now learn the %s skill.", - s_desc->name); + s_desc->name.c_str()); } else { msg_format("Your knowledge of the %s skill increases.", - s_desc->name); + s_desc->name.c_str()); } + break; } } diff --git a/src/skills.hpp b/src/skills.hpp index 4cd63358..694b29e9 100644 --- a/src/skills.hpp +++ b/src/skills.hpp @@ -15,10 +15,10 @@ extern s16b get_melee_skills(void); extern s16b get_melee_skill(void); extern bool_ forbid_gloves(void); extern bool_ forbid_non_blessed(void); -extern void compute_skills(s32b *v, s32b *m, int i); +extern void compute_skills(s32b *v, s32b *m, std::size_t i); extern void select_default_melee(void); extern void do_get_new_skill(void); -extern void init_skill(s32b value, s32b mod, int i); +extern void init_skill(s32b value, s32b mod, std::size_t i); extern s16b find_ability(cptr name); extern void dump_abilities(FILE *fff); extern void do_cmd_ability(void); diff --git a/src/skills_defs.hpp b/src/skills_defs.hpp index 1dbdee9f..a39fd027 100644 --- a/src/skills_defs.hpp +++ b/src/skills_defs.hpp @@ -60,4 +60,3 @@ #define SKILL_STUN 57 #define SKILL_BOULDER 58 #define SKILL_GEOMANCY 59 -#define MAX_SKILLS 200 diff --git a/src/spells6.cc b/src/spells6.cc index a4564ae3..555f252f 100644 --- a/src/spells6.cc +++ b/src/spells6.cc @@ -1,5 +1,6 @@ #include "spells6.hpp" +#include "game.hpp" #include "gods.hpp" #include "lua_bind.hpp" #include "object2.hpp" @@ -151,6 +152,8 @@ static bool_ geomancy_depends_satisfied() long get_provided_levels(school_type *school) { + auto const &s_info = game->s_info; + for (auto school_provider: school->providers->v) { if (school_provider.deity_idx == p_ptr->pgod) @@ -171,6 +174,8 @@ struct get_level_school_callback_data { static bool get_level_school_callback(struct get_level_school_callback_data *data, int school_idx) { + auto const &s_info = game->s_info; + school_type *school = school_at(school_idx); long r = 0, s = 0, p = 0, ok = 0; diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 09535c53..8715b364 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -806,6 +806,8 @@ std::shared_ptr SkillCondition::from_json(jsoncons::json const &j) void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t bcol) const { + auto const &s_descriptors = game->edit_data.s_descriptors; + p->write(ecol, "Your skill in "); p->write(bcol, s_descriptors[m_skill_idx].name); p->write(ecol, " is from "); @@ -817,6 +819,8 @@ void SkillCondition::write_tree(TreePrinter *p, Cursor *, uint8_t ecol, uint8_t void SkillCondition::to_json(jsoncons::json &j) const { + auto const &s_descriptors = game->edit_data.s_descriptors; + j["name"] = s_descriptors[m_skill_idx].name; j["min"] = m_min; j["max"] = m_max; diff --git a/src/variable.cc b/src/variable.cc index a13ee3aa..0e892bf3 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -462,16 +462,6 @@ monster_race *r_info; */ monster_ego *re_info; -/* - * Player skills arrays - */ -skill_type *s_info; - -/** - * Skill descriptors. - */ -skill_descriptor *s_descriptors; - /* * The wilderness features arrays */ @@ -594,11 +584,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum number of skills in s_info.txt - */ -u16b max_s_idx; - /* * Maximum number of monsters in r_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 2192d2b2..35d482dc 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -26,9 +26,7 @@ #include "random_artifact.hpp" #include "random_quest.hpp" #include "school_type.hpp" -#include "skill_descriptor_fwd.hpp" #include "skill_modifiers_fwd.hpp" -#include "skill_type_fwd.hpp" #include "skills_defs.hpp" #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" @@ -157,8 +155,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern skill_type *s_info; -extern skill_descriptor *s_descriptors; extern feature_type *f_info; extern object_kind *k_info; extern artifact_type *a_info; @@ -178,7 +174,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_s_idx; extern u16b max_r_idx; extern u16b max_re_idx; extern u16b max_k_idx; diff --git a/src/xtra1.cc b/src/xtra1.cc index 6c9d0a29..65767d76 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2508,6 +2508,8 @@ static void calc_schools() /* Apply corruptions */ static void calc_corruptions() { + auto &s_info = game->s_info; + if (player_has_corruption(CORRUPT_BALROG_AURA)) { p_ptr->xtra_flags |= TR_SH_FIRE; @@ -2802,6 +2804,9 @@ static bool_ monk_empty_hands(void) */ void calc_bonuses(bool_ silent) { + auto const &s_descriptors = game->edit_data.s_descriptors; + auto &s_info = game->s_info; + static bool_ monk_notify_aux = FALSE; int i, j, hold; int old_speed; @@ -2976,7 +2981,7 @@ void calc_bonuses(bool_ silent) p_ptr->xtra_flags = object_flag_set(); /* Hide the skills that should auto hide */ - for (i = 0; i < max_s_idx; i++) + for (std::size_t i = 0; i < s_descriptors.size(); i++) { if (s_descriptors[i].flags & SKF_AUTO_HIDE) { diff --git a/src/xtra2.cc b/src/xtra2.cc index d9de48cd..abb9957e 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -420,6 +420,8 @@ bool_ set_oppose_cc(int v) */ bool_ set_mimic(int v, int p, int level) { + auto &s_info = game->s_info; + bool_ notice = FALSE; /* Hack -- Force good values */ -- cgit v1.2.3 From e1230547a936c7180b3a69012659fc511027f035 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move re_info into GameEditData --- lib/edit/misc.txt | 5 ----- lib/mods/theme/edit/misc.txt | 5 ----- src/files.cc | 22 ++++++++++++++++------ src/game_edit_data.hpp | 6 ++++++ src/init1.cc | 43 +++++++++++++++++++------------------------ src/init2.cc | 2 +- src/monster1.cc | 2 ++ src/monster2.cc | 36 ++++++++++++++++++++++++------------ src/monster_ego_fwd.hpp | 3 --- src/object1.cc | 11 +++++------ src/util.cc | 15 +++++++++------ src/variable.cc | 10 ---------- src/variable.hpp | 3 --- src/xtra2.cc | 22 ++++++++++++++++------ 14 files changed, 98 insertions(+), 87 deletions(-) delete mode 100644 src/monster_ego_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 0513f242..8fdf44b3 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -16,11 +16,6 @@ M:Y:66 # WARNING ! add one more to the real count for the player ghost !! M:R:1078 -# Maximum number of monsters in re_info.txt -# WARNING ! Use the exact amount of ego types used, if not you -# will get weird results ! -M:r:14 - # Maximum number of items in k_info.txt M:K:819 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index d158a6a9..590c09a9 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -16,11 +16,6 @@ M:Y:66 # WARNING ! add one more to the real count for the player ghost !! M:R:1081 -# Maximum number of monsters in re_info.txt -# WARNING ! Use the exact amount of ego types used, if not you -# will get weird results ! -M:r:14 - # Maximum number of items in k_info.txt M:K:886 diff --git a/src/files.cc b/src/files.cc index 6e795923..6a046b10 100644 --- a/src/files.cc +++ b/src/files.cc @@ -218,6 +218,7 @@ errr process_pref_file_aux(char *buf) { auto &race_mod_info = game->edit_data.race_mod_info; auto &st_info = game->edit_data.st_info; + auto &re_info = game->edit_data.re_info; int i, j, n1, n2; @@ -274,18 +275,27 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 4, 3, zz, ':', '/') == 3) { - monster_ego *re_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t i = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_re_idx) return (1); - re_ptr = &re_info[i]; - if (n1) re_ptr->g_attr = n1; + + if (i >= re_info.size()) + { + return 1; + } + + auto re_ptr = &re_info[i]; + + if (n1) + { + re_ptr->g_attr = n1; + } if (n2) { re_ptr->g_char = n2; } - return (0); + + return 0; } } diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index bb480f53..85da3997 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -3,6 +3,7 @@ #include "ability_type.hpp" #include "dungeon_info_type.hpp" #include "hist_type.hpp" +#include "monster_ego.hpp" #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -89,6 +90,11 @@ struct GameEditData { */ std::vector s_descriptors; + /** + * Monster race egos + */ + std::vector re_info; + /** * Base skills for all characters. */ diff --git a/src/init1.cc b/src/init1.cc index 9431ec46..62211893 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -4433,12 +4433,12 @@ errr init_r_info_txt(FILE *fp) */ errr init_re_info_txt(FILE *fp) { - int i, j; + auto &re_info = game->edit_data.re_info; + char buf[1024]; byte blow_num = 0; - int r_char_number = 0, nr_char_number = 0; - - char *s, *t; + int r_char_number = 0; + int nr_char_number = 0; /* Current entry */ monster_ego *re_ptr = NULL; @@ -4466,7 +4466,7 @@ errr init_re_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -4478,19 +4478,16 @@ errr init_re_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_re_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - re_ptr = &re_info[i]; + re_ptr = &expand_to_fit_index(re_info, i); /* Copy name */ assert(!re_ptr->name); @@ -4500,9 +4497,8 @@ errr init_re_info_txt(FILE *fp) blow_num = 0; r_char_number = 0; nr_char_number = 0; - for (j = 0; j < 5; j++) re_ptr->r_char[j] = 0; - for (j = 0; j < 5; j++) re_ptr->nr_char[j] = 0; - for (j = 0; j < 4; j++) + + for (std::size_t j = 0; j < 4; j++) { re_ptr->blow[j].method = 0; re_ptr->blow[j].effect = 0; @@ -4598,6 +4594,8 @@ errr init_re_info_txt(FILE *fp) { int n1, n2, dice, side; char mdice, mside; + char *s; + char *t; /* Oops, no more slots */ if (blow_num == 4) return (1); @@ -4658,7 +4656,7 @@ errr init_re_info_txt(FILE *fp) char r_char; /* Parse every entry */ - s = buf + 2; + char const *s = buf + 2; /* XXX XXX XXX Hack -- Read monster symbols */ if (1 == sscanf(s, "R_CHAR_%c", &r_char)) @@ -4688,7 +4686,7 @@ errr init_re_info_txt(FILE *fp) char r_char; /* Parse every entry */ - s = buf + 2; + char const *s = buf + 2; /* XXX XXX XXX Hack -- Read monster symbols */ if (1 == sscanf(s, "R_CHAR_%c", &r_char)) @@ -4727,7 +4725,7 @@ errr init_re_info_txt(FILE *fp) /* Process 'O' for "Basic Monster -Flags" (multiple lines) */ if (buf[0] == 'O') { - s = buf + 2; + char const *s = buf + 2; /* XXX XXX XXX Hack -- Read no flags */ if (!strcmp(s, "MF_ALL")) @@ -4750,7 +4748,8 @@ errr init_re_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - s = buf + 2; + char const *s = buf + 2; + int i; /* XXX XXX XXX Hack -- Read spell frequency */ if (1 == sscanf(s, "1_IN_%d", &i)) @@ -4775,8 +4774,10 @@ errr init_re_info_txt(FILE *fp) if (buf[0] == 'T') { /* Parse every entry */ - for (s = buf + 2; *s; ) + for (char *s = buf + 2; *s; ) { + char *t; + /* Find the end of this entry */ for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; @@ -6789,12 +6790,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_r_idx = atoi(zz[1]); } - /* Maximum re_idx */ - else if (zz[0][0] == 'r') - { - max_re_idx = atoi(zz[1]); - } - /* Maximum k_idx */ else if (zz[0][0] == 'K') { diff --git a/src/init2.cc b/src/init2.cc index 4ca60938..d574deca 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -421,7 +421,7 @@ namespace { static void allocate() { - re_info = new monster_ego[max_re_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/monster1.cc b/src/monster1.cc index 6d913367..2060b7af 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -1259,6 +1259,8 @@ static void roff_aux(std::shared_ptr r_ptr) */ static void roff_name(int r_idx, int ego) { + const auto &re_info = game->edit_data.re_info; + const auto r_ptr = race_info_idx(r_idx, ego); /* Access the chars */ diff --git a/src/monster2.cc b/src/monster2.cc index c2b615ee..108642df 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -172,7 +172,9 @@ s32b modify_aux(s32b a, s32b b, char mod) /* Is this ego ok for this monster ? */ bool_ mego_ok(monster_race const *r_ptr, int ego) { - monster_ego *re_ptr = &re_info[ego]; + const auto &re_info = game->edit_data.re_info; + + auto re_ptr = &re_info[ego]; bool_ ok = FALSE; int i; @@ -206,10 +208,11 @@ bool_ mego_ok(monster_race const *r_ptr, int ego) /* Choose an ego type */ static int pick_ego_monster(monster_race const *r_ptr) { + const auto &re_info = game->edit_data.re_info; + /* Assume no ego */ int ego = 0, lvl; - int tries = max_re_idx + 10; - monster_ego *re_ptr; + int tries = re_info.size() + 10; if ((!(dungeon_flags & DF_ELVEN)) && (!(dungeon_flags & DF_DWARVEN))) { @@ -223,8 +226,8 @@ static int pick_ego_monster(monster_race const *r_ptr) while (tries--) { /* Pick one */ - ego = rand_range(1, max_re_idx - 1); - re_ptr = &re_info[ego]; + ego = rand_range(1, re_info.size() - 1); + auto re_ptr = &re_info[ego]; /* No hope so far */ if (!mego_ok(r_ptr, ego)) continue; @@ -266,6 +269,7 @@ static int pick_ego_monster(monster_race const *r_ptr) std::shared_ptr race_info_idx(int r_idx, int ego) { monster_race *r_ptr = &r_info[r_idx]; + const auto &re_info = game->edit_data.re_info; /* We don't need to allocate anything if it's an ordinary monster. */ if (!ego) { @@ -279,7 +283,7 @@ std::shared_ptr race_info_idx(int r_idx, int ego) *nr_ptr = *r_ptr; /* Get a reference to the ego monster modifiers */ - monster_ego *re_ptr = &re_info[ego]; + auto re_ptr = &re_info[ego]; /* Adjust the values */ for (int i = 0; i < 4; i++) @@ -1159,6 +1163,8 @@ s16b get_mon_num(int level) */ void monster_desc(char *desc, monster_type *m_ptr, int mode) { + const auto &re_info = game->edit_data.re_info; + auto r_ptr = m_ptr->race(); char silly_name[80], name[100]; bool_ seen, pron; @@ -1166,13 +1172,15 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) if (m_ptr->ego) { - if (re_info[m_ptr->ego].before) + auto const &monster_ego = re_info[m_ptr->ego]; + + if (monster_ego.before) { - sprintf(name, "%s %s", re_info[m_ptr->ego].name, r_ptr->name); + sprintf(name, "%s %s", monster_ego.name, r_ptr->name); } else { - sprintf(name, "%s %s", r_ptr->name, re_info[m_ptr->ego].name); + sprintf(name, "%s %s", r_ptr->name, monster_ego.name); } } else @@ -1371,18 +1379,22 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) void monster_race_desc(char *desc, int r_idx, int ego) { + const auto &re_info = game->edit_data.re_info; + monster_race *r_ptr = &r_info[r_idx]; char name[80]; if (ego) { - if (re_info[ego].before) + auto const &monster_ego = re_info[ego]; + + if (monster_ego.before) { - sprintf(name, "%s %s", re_info[ego].name, r_ptr->name); + sprintf(name, "%s %s", monster_ego.name, r_ptr->name); } else { - sprintf(name, "%s %s", r_ptr->name, re_info[ego].name); + sprintf(name, "%s %s", r_ptr->name, monster_ego.name); } } else diff --git a/src/monster_ego_fwd.hpp b/src/monster_ego_fwd.hpp deleted file mode 100644 index 5b47f3e9..00000000 --- a/src/monster_ego_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct monster_ego; diff --git a/src/object1.cc b/src/object1.cc index 656446c3..c98e2ed5 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -635,6 +635,7 @@ void reset_visuals(void) { auto &st_info = game->edit_data.st_info; auto &race_mod_info = game->edit_data.race_mod_info; + auto &re_info = game->edit_data.re_info; int i; @@ -677,17 +678,15 @@ void reset_visuals(void) } /* Reset attr/char code for ego monster overlay graphics */ - for (i = 0; i < max_re_idx; i++) + for (auto &re_ref: re_info) { - monster_ego *re_ptr = &re_info[i]; - /* Default attr/char */ - re_ptr->g_attr = 0; - re_ptr->g_char = 0; + re_ref.g_attr = 0; + re_ref.g_char = 0; } /* Reset attr/char code for race modifier overlay graphics */ - for (player_race_mod &rmp: race_mod_info) + for (auto &rmp: race_mod_info) { /* Default attr/char */ rmp.g_attr = 0; diff --git a/src/util.cc b/src/util.cc index cd1c0c4f..231a249f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3339,17 +3339,20 @@ int test_monster_name(cptr name) return (0); } -int test_mego_name(cptr name) +int test_mego_name(cptr needle) { - int i; + const auto &re_info = game->edit_data.re_info; /* Scan the monsters */ - for (i = 1; i < max_re_idx; i++) + for (std::size_t i = 0; i < re_info.size(); i++) { - monster_ego *re_ptr = &re_info[i]; - if (re_ptr->name && iequals(name, re_ptr->name)) return (i); + auto name = re_info[i].name; + if (name && iequals(name, needle)) + { + return i; + } } - return (0); + return 0; } /* diff --git a/src/variable.cc b/src/variable.cc index 0e892bf3..35aeff7f 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -457,11 +457,6 @@ trap_type *t_info; */ monster_race *r_info; -/* - * The monster ego race arrays - */ -monster_ego *re_info; - /* * The wilderness features arrays */ @@ -589,11 +584,6 @@ s32b get_level_use_stick = -1; */ u16b max_r_idx; -/* - * Maximum number of ego monsters in re_info.txt - */ -u16b max_re_idx; - /* * Maximum number of items in k_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 35d482dc..a1cc5266 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -11,7 +11,6 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "feature_type_fwd.hpp" -#include "monster_ego_fwd.hpp" #include "monster_race_fwd.hpp" #include "monster_type_fwd.hpp" #include "object_kind_fwd.hpp" @@ -160,7 +159,6 @@ extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; extern monster_race *r_info; -extern monster_ego *re_info; extern trap_type *t_info; extern wilderness_type_info *wf_info; extern int wildc2i[256]; @@ -175,7 +173,6 @@ extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); extern u16b max_r_idx; -extern u16b max_re_idx; extern u16b max_k_idx; extern u16b max_f_idx; extern u16b max_a_idx; diff --git a/src/xtra2.cc b/src/xtra2.cc index abb9957e..14cc9bc9 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5151,11 +5151,14 @@ static void clean_wish_name(char *buf, char *name) */ void make_wish(void) { - char buf[200], name[200], *mname; - int i, j, mstatus = MSTATUS_ENEMY; + const auto &re_info = game->edit_data.re_info; + + char name[200], *mname; + int mstatus = MSTATUS_ENEMY; object_type forge, *o_ptr = &forge; /* Make an empty string */ + char buf[200]; buf[0] = 0; /* Ask for the wish */ @@ -5207,8 +5210,12 @@ void make_wish(void) else mstatus = MSTATUS_PET; mname = name + 10; } - else mname = name; - for (i = 1; i < max_r_idx; i++) + else + { + mname = name; + } + + for (std::size_t i = 1; i < max_r_idx; i++) { monster_race *r_ptr = &r_info[i]; @@ -5224,9 +5231,9 @@ void make_wish(void) if (strstr(mname, buf)) { /* try all ego */ - for (j = max_re_idx - 1; j >= 0; j--) + for (std::size_t j = 0; j < re_info.size(); j++) { - monster_ego *re_ptr = &re_info[j]; + auto re_ptr = &re_info[j]; if (j && !re_ptr->name) continue; @@ -5247,6 +5254,7 @@ void make_wish(void) { sprintf(buf, "%s", r_ptr->name); } + strlower(buf); if (iequals(mname, buf)) @@ -5262,7 +5270,9 @@ void make_wish(void) /* Create the monster */ if (place_monster_one(wy, wx, i, j, FALSE, mstatus)) + { msg_print("Your wish becomes truth!"); + } /* Don't search any more */ return; -- cgit v1.2.3 From 5ddcbbf1cdce68e565376819efedd519892512ad Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move wf_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/cmd2.cc | 2 ++ src/dungeon.cc | 2 ++ src/files.cc | 30 +++++++++++++++--------------- src/game_edit_data.hpp | 6 ++++++ src/init1.cc | 22 +++++++--------------- src/init2.cc | 2 +- src/monster1.cc | 2 ++ src/object1.cc | 1 + src/q_god.cc | 1 + src/variable.cc | 6 ------ src/variable.hpp | 3 --- src/wild.cc | 4 ++++ src/wilderness_type_info_fwd.hpp | 3 --- src/wizard2.cc | 2 ++ src/xtra1.cc | 1 + src/xtra2.cc | 1 + 18 files changed, 45 insertions(+), 49 deletions(-) delete mode 100644 src/wilderness_type_info_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 8fdf44b3..2c24b14b 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -31,9 +31,6 @@ M:E:200 # Maximum number of trap types in tr_info.txt M:U:176 -# Maximum number of terrain types in wf_info.txt -M:W:30 - # Maximum size for "o_list[]" M:O:1024 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 590c09a9..017089e7 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -31,9 +31,6 @@ M:E:238 # Maximum number of trap types in tr_info.txt M:U:176 -# Maximum number of terrain types in wf_info.txt -M:W:64 - # Maximum size for "o_list[]" M:O:1024 diff --git a/src/cmd2.cc b/src/cmd2.cc index dd5f302a..641e2738 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -2523,6 +2523,8 @@ void do_cmd_spike(void) static void do_cmd_walk_jump(int pickup, bool_ disarm) { + auto const &wf_info = game->edit_data.wf_info; + int dir; bool_ more = FALSE; diff --git a/src/dungeon.cc b/src/dungeon.cc index a2696236..d3554e50 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -3222,6 +3222,8 @@ static bool_ enter_debug_mode(void) */ static void process_command(void) { + auto const &wf_info = game->edit_data.wf_info; + char error_m[80]; /* Handle repeating the last command */ diff --git a/src/files.cc b/src/files.cc index 6a046b10..f897b515 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2340,6 +2340,7 @@ std::string describe_player_location() { auto const &wilderness = game->wilderness; auto const &d_info = game->edit_data.d_info; + auto const &wf_info = game->edit_data.wf_info; std::string desc; @@ -2370,13 +2371,11 @@ std::string describe_player_location() */ int landmark = 0, lwx = 0, lwy = 0; int l_dist = -1; - int i; - for (i = 0; i < max_wf_idx; i++) + for (std::size_t i = 0; i < wf_info.size(); i++) { int wx = wf_info[i].wild_x; int wy = wf_info[i].wild_y; - int dist; /* Skip if not a landmark */ if (!wf_info[i].entrance) continue; @@ -2384,7 +2383,7 @@ std::string describe_player_location() /* Skip if we haven't seen it */ if (!wilderness(wx, wy).known) continue; - dist = distance(wy, wx, pwy, pwx); + int dist = distance(wy, wx, pwy, pwx); if (dist < l_dist || l_dist < 0) { landmark = i; @@ -2525,7 +2524,7 @@ void file_character_print_item(FILE *fff, char label, object_type *obj, bool_ fu * * Prints out one "store" (for Home and Mathom-house) */ -static void file_character_print_store(FILE *fff, wilderness_type_info *place, std::size_t store, bool_ full) +static void file_character_print_store(FILE *fff, wilderness_type_info const *place, std::size_t store, bool_ full) { auto const &st_info = game->edit_data.st_info; @@ -2555,7 +2554,7 @@ static void file_character_print_store(FILE *fff, wilderness_type_info *place, s * was not already there. XXX This is an ugly workaround for the double Gondolin * problem. */ -static bool_ file_character_check_stores(std::unordered_set *seen_stores, wilderness_type_info *place, int store) +static bool_ file_character_check_stores(std::unordered_set *seen_stores, wilderness_type_info const *place, int store) { town_type *town = &town_info[place->entrance]; store_type *st_ptr = &town->store[store]; @@ -2580,8 +2579,9 @@ static bool_ file_character_check_stores(std::unordered_set *seen_ errr file_character(cptr name, bool_ full) { auto const &d_info = game->edit_data.d_info; + auto const &wf_info = game->edit_data.wf_info; - int i, j, x, y; + int i, x, y; byte a; char c; int fd = -1; @@ -2874,12 +2874,12 @@ errr file_character(cptr name, bool_ full) /* Print all homes in the different towns */ { std::unordered_set seen_stores; - for (j = 0; j < max_wf_idx; j++) + for (auto const &wf_ref: wf_info) { - if (wf_info[j].feat == FEAT_TOWN && - file_character_check_stores(&seen_stores, &wf_info[j], 7)) + if (wf_ref.feat == FEAT_TOWN && + file_character_check_stores(&seen_stores, &wf_ref, 7)) { - file_character_print_store(fff, &wf_info[j], 7, full); + file_character_print_store(fff, &wf_ref, 7, full); } } } @@ -2887,12 +2887,12 @@ errr file_character(cptr name, bool_ full) /* Print all Mathom-houses in the different towns */ { std::unordered_set seen_stores; - for (j = 0; j < max_wf_idx; j++) + for (auto const &wf_ref: wf_info) { - if (wf_info[j].feat == FEAT_TOWN && - file_character_check_stores(&seen_stores, &wf_info[j], 57)) + if (wf_ref.feat == FEAT_TOWN && + file_character_check_stores(&seen_stores, &wf_ref, 57)) { - file_character_print_store(fff, &wf_info[j], 57, full); + file_character_print_store(fff, &wf_ref, 57, full); } } } diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 85da3997..8b118397 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -15,6 +15,7 @@ #include "store_action_type.hpp" #include "store_info_type.hpp" #include "vault_type.hpp" +#include "wilderness_type_info.hpp" #include @@ -95,6 +96,11 @@ struct GameEditData { */ std::vector re_info; + /** + * Wilderness features + */ + std::vector wf_info; + /** * Base skills for all characters. */ diff --git a/src/init1.cc b/src/init1.cc index 62211893..17024337 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6000,9 +6000,9 @@ errr init_ow_info_txt(FILE *fp) */ errr init_wf_info_txt(FILE *fp) { - int i; + auto &wf_info = game->edit_data.wf_info; + char buf[1024]; - char *s; /* Current entry */ wilderness_type_info *wf_ptr = NULL; @@ -6029,7 +6029,7 @@ errr init_wf_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -6041,19 +6041,16 @@ errr init_wf_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_wf_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - wf_ptr = &wf_info[i]; + wf_ptr = &expand_to_fit_index(wf_info, i); /* Copy the name */ assert(!wf_ptr->name); @@ -6070,7 +6067,7 @@ errr init_wf_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire the text */ - s = buf + 2; + char *s = buf + 2; /* Copy description */ assert(!wf_ptr->text); @@ -6177,6 +6174,7 @@ static dungeon_grid letter[255]; static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax, bool_ full) { auto &wilderness = game->wilderness; + auto &wf_info = game->edit_data.wf_info; int i; @@ -6832,12 +6830,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_t_idx = atoi(zz[1]); } - /* Maximum wf_idx */ - else if (zz[0][0] == 'W') - { - max_wf_idx = atoi(zz[1]); - } - /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { diff --git a/src/init2.cc b/src/init2.cc index d574deca..da011da7 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -501,7 +501,7 @@ namespace { static void allocate() { - wf_info = new wilderness_type_info[max_wf_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/monster1.cc b/src/monster1.cc index 2060b7af..2f874259 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -1536,6 +1536,8 @@ static bool_ monster_lava(int r_idx) void set_mon_num_hook(void) { + auto const &wf_info = game->edit_data.wf_info; + if (!dun_level) { auto const &wilderness = game->wilderness; diff --git a/src/object1.cc b/src/object1.cc index c98e2ed5..8be0655a 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2480,6 +2480,7 @@ static void describe_device(object_type *o_ptr) static cptr object_out_desc_where_found(s16b level, s16b dungeon) { auto const &d_info = game->edit_data.d_info; + auto const &wf_info = game->edit_data.wf_info; static char str[80]; diff --git a/src/q_god.cc b/src/q_god.cc index 1cb4c0f5..38b911b7 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -294,6 +294,7 @@ std::string quest_god_describe() static void quest_god_place_rand_dung() { auto &wilderness = game->wilderness; + auto const &wf_info = game->edit_data.wf_info; int x = -1, y = -1, tries; diff --git a/src/variable.cc b/src/variable.cc index 35aeff7f..1f861563 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -460,7 +460,6 @@ monster_race *r_info; /* * The wilderness features arrays */ -wilderness_type_info *wf_info; int wildc2i[256]; /* @@ -619,11 +618,6 @@ u16b max_m_idx; */ u16b max_t_idx; -/* - * Maximum number of wilderness features in wf_info.txt - */ -u16b max_wf_idx; - /* * Flags for initialization */ diff --git a/src/variable.hpp b/src/variable.hpp index a1cc5266..1813b762 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -30,7 +30,6 @@ #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" #include "trap_type_fwd.hpp" -#include "wilderness_type_info_fwd.hpp" #include "seed.hpp" extern int max_macrotrigger; @@ -160,7 +159,6 @@ extern artifact_type *a_info; extern ego_item_type *e_info; extern monster_race *r_info; extern trap_type *t_info; -extern wilderness_type_info *wf_info; extern int wildc2i[256]; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; @@ -180,7 +178,6 @@ extern u16b max_e_idx; extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; -extern u16b max_wf_idx; extern int init_flags; extern bool_ ambush_flag; extern bool_ fate_flag; diff --git a/src/wild.cc b/src/wild.cc index 01b36f87..5627629a 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -157,6 +157,8 @@ static void plasma_recursive(int x1, int y1, int x2, int y2, static int generate_area(int y, int x, bool_ border, bool_ corner) { auto const &wilderness = game->wilderness; + auto const &wf_info = game->edit_data.wf_info; + int road, entrance; int x1, y1; int hack_floor = 0; @@ -577,6 +579,8 @@ void wilderness_gen() void wilderness_gen_small() { auto const &wilderness = game->wilderness; + auto const &wf_info = game->edit_data.wf_info; + int xstart = 0; int ystart = 0; diff --git a/src/wilderness_type_info_fwd.hpp b/src/wilderness_type_info_fwd.hpp deleted file mode 100644 index a206c9e3..00000000 --- a/src/wilderness_type_info_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct wilderness_type_info; diff --git a/src/wizard2.cc b/src/wizard2.cc index 046fd80c..b2713636 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -82,6 +82,8 @@ static void wiz_align_monster(int status) */ static void teleport_player_town(int town) { + auto const &wf_info = game->edit_data.wf_info; + autosave_checkpoint(); /* Change town */ diff --git a/src/xtra1.cc b/src/xtra1.cc index 65767d76..2829b2f6 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -540,6 +540,7 @@ static void prt_sp(void) static void prt_depth(int row, int col) { auto const &d_info = game->edit_data.d_info; + auto const &wf_info = game->edit_data.wf_info; char depths[32]; auto d_ptr = &d_info[dungeon_type]; diff --git a/src/xtra2.cc b/src/xtra2.cc index 14cc9bc9..d9d9746f 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3892,6 +3892,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) { auto const &d_info = game->edit_data.d_info; auto const &st_info = game->edit_data.st_info; + auto const &wf_info = game->edit_data.wf_info; cave_type *c_ptr = &cave[y][x]; -- cgit v1.2.3 From 0c2f30b56c221a826ba64f0ec864c29d0f717644 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move r_info into GameEditData --- lib/edit/misc.txt | 4 --- lib/mods/theme/edit/misc.txt | 4 --- src/birth.cc | 5 +-- src/cave.cc | 10 ++++-- src/cmd1.cc | 31 +++++++++++------ src/cmd2.cc | 32 +++++++++++++---- src/cmd3.cc | 22 ++++++++---- src/cmd4.cc | 43 +++++++++++++---------- src/cmd5.cc | 8 ++++- src/cmd6.cc | 21 +++++++----- src/cmd7.cc | 8 ++++- src/dungeon.cc | 7 ++-- src/files.cc | 81 +++++++++++++++++++++++++++----------------- src/game_edit_data.hpp | 6 ++++ src/generate.cc | 55 +++++++++++++++++++++++------- src/init1.cc | 31 ++++++----------- src/init2.cc | 20 ++++++----- src/loadsave.cc | 12 +++++-- src/melee1.cc | 5 ++- src/melee2.cc | 25 ++++++++++---- src/monster1.cc | 52 +++++++++++++++++++++------- src/monster2.cc | 68 +++++++++++++++++++++++-------------- src/monster3.cc | 19 ++++++++--- src/object1.cc | 42 +++++++++++------------ src/object2.cc | 40 +++++++++++++++------- src/q_bounty.cc | 4 ++- src/q_eol.cc | 5 ++- src/q_main.cc | 19 ++++++++--- src/q_poison.cc | 5 ++- src/q_rand.cc | 5 +++ src/q_shroom.cc | 5 +++ src/spells1.cc | 14 +++++--- src/spells2.cc | 4 ++- src/traps.cc | 12 +++++-- src/util.cc | 12 ++++--- src/variable.cc | 10 ------ src/variable.hpp | 3 -- src/wild.cc | 7 ++-- src/wizard2.cc | 14 +++++--- src/wizard2.hpp | 2 +- src/xtra1.cc | 37 +++++++++++++------- src/xtra2.cc | 13 ++++--- 42 files changed, 540 insertions(+), 282 deletions(-) diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 2c24b14b..02e286b4 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,10 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of monsters in r_info.txt -# WARNING ! add one more to the real count for the player ghost !! -M:R:1078 - # Maximum number of items in k_info.txt M:K:819 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 017089e7..19077acb 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,10 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of monsters in r_info.txt -# WARNING ! add one more to the real count for the player ghost !! -M:R:1081 - # Maximum number of items in k_info.txt M:K:886 diff --git a/src/birth.cc b/src/birth.cc index fe814978..083fe06c 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -720,6 +720,7 @@ static void birth_put_stats(void) static void player_wipe(void) { auto const &d_info = game->edit_data.d_info; + auto &r_info = game->edit_data.r_info; /* Wipe special levels */ wipe_saved(); @@ -805,9 +806,9 @@ static void player_wipe(void) /* Reset the "monsters" */ - for (std::size_t i = 1; i < max_r_idx; i++) + for (auto &r_ref: r_info) { - monster_race *r_ptr = &r_info[i]; + auto r_ptr = &r_ref; /* Hack -- Reset the counter */ r_ptr->cur_num = 0; diff --git a/src/cave.cc b/src/cave.cc index 92f57c95..08482dcc 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -402,6 +402,8 @@ bool_ cave_valid_bold(int y, int x) */ static void image_monster(byte *ap, char *cp) { + auto const &r_info = game->edit_data.r_info; + // Cached state which keeps a list of all the "live" monster race entries. static std::vector *instance = nullptr; @@ -411,7 +413,7 @@ static void image_monster(byte *ap, char *cp) // Create the list of "live" indexes instance = new std::vector(); // Start at 1 to avoid 'player' - for (size_t i = 1; i < max_r_idx; i++) + for (size_t i = 1; i < r_info.size(); i++) { if (r_info[i].name) { @@ -847,6 +849,7 @@ static byte darker_attrs[16] = static void map_info(int y, int x, byte *ap, char *cp) { auto const &st_info = game->edit_data.st_info; + auto const &r_info = game->edit_data.r_info; byte a; @@ -1240,7 +1243,7 @@ static void map_info(int y, int x, byte *ap, char *cp) if ((y == p_ptr->py) && (x == p_ptr->px) && (!p_ptr->invis || p_ptr->see_inv)) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; /* Get the "player" attr */ if (!options->avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) @@ -1282,6 +1285,7 @@ static void map_info(int y, int x, byte *ap, char *cp) void map_info_default(int y, int x, byte *ap, char *cp) { auto const &st_info = game->edit_data.st_info; + auto const &r_info = game->edit_data.r_info; byte a; @@ -1673,7 +1677,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) (!p_ptr->invis || (p_ptr->invis && p_ptr->see_inv))) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; /* Get the "player" attr */ if (!avoid_other && (r_ptr->flags & RF_ATTR_MULTI)) diff --git a/src/cmd1.cc b/src/cmd1.cc index 19a52062..87ef7a6c 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -620,6 +620,8 @@ void touch_zap_player(monster_type *m_ptr) static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, int x, int y) { + auto const &r_info = game->edit_data.r_info; + monster_type *t_ptr = &m_list[m_idx]; int ap_cnt; @@ -641,7 +643,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, if (!o_ptr->k_idx) return; /* Get monster race of the symbiote */ - monster_race *r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; /* Not allowed to attack */ if (r_ptr->flags & RF_NEVER_BLOW) return; @@ -1111,6 +1113,8 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, int x, int y) { + auto const &r_info = game->edit_data.r_info; + monster_type *t_ptr = &m_list[m_idx]; auto tr_ptr = t_ptr->race(); @@ -1973,6 +1977,8 @@ static void do_nazgul(int *k, int *num, int num_blow, int weap, std::shared_ptr< */ void py_attack(int y, int x, int max_blow) { + auto const &r_info = game->edit_data.r_info; + int num = 0, k, bonus, chance; s32b special = 0; @@ -2536,6 +2542,8 @@ void py_attack(int y, int x, int max_blow) bool_ player_can_enter(byte feature) { + auto const &r_info = game->edit_data.r_info; + bool_ pass_wall; bool_ only_wall = FALSE; @@ -2620,11 +2628,13 @@ bool_ player_can_enter(byte feature) static bool_ easy_open_door(int y, int x) { + auto const &r_info = game->edit_data.r_info; + int i, j; cave_type *c_ptr = &cave[y][x]; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) @@ -2726,6 +2736,7 @@ static bool_ easy_open_door(int y, int x) void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; int y, x, tmp; @@ -2733,7 +2744,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) monster_type *m_ptr; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; char m_name[80]; @@ -4041,6 +4052,8 @@ void run_step(int dir) */ void do_cmd_pet(void) { + auto const &r_info = game->edit_data.r_info; + int i = 0; int num = 0; @@ -4301,11 +4314,9 @@ void do_cmd_pet(void) /* Process the monsters (backwards) */ for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--) { - monster_race *r_ptr; - /* Access the monster */ m_ptr = &m_list[pet_ctr]; - r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */ { @@ -4370,11 +4381,9 @@ void do_cmd_pet(void) /* Process the monsters (backwards) */ for (pet_ctr = m_max - 1; pet_ctr >= 1; pet_ctr--) { - monster_race *r_ptr; - /* Access the monster */ m_ptr = &m_list[pet_ctr]; - r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; if ((!(r_ptr->flags & RF_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */ { @@ -4501,9 +4510,11 @@ void do_cmd_integrate_body() */ bool_ do_cmd_leave_body(bool_ drop_body) { + auto const &r_info = game->edit_data.r_info; + object_type *o_ptr, forge; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; int i; diff --git a/src/cmd2.cc b/src/cmd2.cc index 641e2738..9afcb7b4 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -79,11 +79,13 @@ static bool_ do_cmd_bash_altar(int y, int x) */ static bool_ do_cmd_bash_fountain(int y, int x) { + auto const &r_info = game->edit_data.r_info; + int bash, temp; bool_ more = TRUE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) @@ -767,6 +769,8 @@ static void chest_trap(int y, int x, s16b o_idx) */ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) { + auto const &r_info = game->edit_data.r_info; + int i, j; bool_ flag = TRUE; @@ -775,7 +779,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) object_type *o_ptr = &o_list[o_idx]; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) @@ -1011,13 +1015,15 @@ static int coords_to_dir(int y, int x) */ static bool_ do_cmd_open_aux(int y, int x, int dir) { + auto const &r_info = game->edit_data.r_info; + int i, j; cave_type *c_ptr; bool_ more = FALSE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) @@ -1118,6 +1124,8 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) */ void do_cmd_open(void) { + auto const &r_info = game->edit_data.r_info; + int y, x, dir; s16b o_idx; @@ -1126,7 +1134,7 @@ void do_cmd_open(void) bool_ more = FALSE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) @@ -1242,11 +1250,13 @@ void do_cmd_open(void) */ static bool_ do_cmd_close_aux(int y, int x, int dir) { + auto const &r_info = game->edit_data.r_info; + cave_type *c_ptr; bool_ more = FALSE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_OPEN_DOOR)) @@ -2131,13 +2141,15 @@ void do_cmd_disarm(void) */ static bool_ do_cmd_bash_aux(int y, int x, int dir) { + auto const &r_info = game->edit_data.r_info; + int bash, temp; cave_type *c_ptr; bool_ more = FALSE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) @@ -2242,13 +2254,15 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) */ void do_cmd_bash(void) { + auto const &r_info = game->edit_data.r_info; + int y, x, dir; cave_type *c_ptr; bool_ more = FALSE; - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if ((p_ptr->body_monster != 0) && !(r_ptr->flags & RF_BASH_DOOR)) @@ -4514,6 +4528,8 @@ static void do_cmd_sacrifice_aule() */ void do_cmd_sacrifice(void) { + auto const &r_info = game->edit_data.r_info; + byte on_what = cave[p_ptr->py][p_ptr->px].feat; /* Check valididty */ @@ -4736,6 +4752,8 @@ std::vector show_monster_inven(int m_idx) */ void do_cmd_steal() { + auto const &r_info = game->edit_data.r_info; + int dir = 0, item = -1, k = -1; bool_ done = FALSE; diff --git a/src/cmd3.cc b/src/cmd3.cc index 66991c70..d65087f8 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -12,6 +12,7 @@ #include "cave_type.hpp" #include "cli_comm.hpp" #include "files.hpp" +#include "game.hpp" #include "gods.hpp" #include "hook_drop_in.hpp" #include "hook_wield_in.hpp" @@ -1220,6 +1221,8 @@ static cptr ident_info[] = */ static bool compare_monster_experience(int w1, int w2) { + auto const &r_info = game->edit_data.r_info; + /* Extract experience */ s32b z1 = r_info[w1].mexp; s32b z2 = r_info[w2].mexp; @@ -1237,6 +1240,8 @@ static bool compare_monster_experience(int w1, int w2) */ static bool compare_monster_level(int w1, int w2) { + auto const &r_info = game->edit_data.r_info; + /* Extract levels */ byte z1 = r_info[w1].level; byte z2 = r_info[w2].level; @@ -1254,6 +1259,8 @@ static bool compare_monster_level(int w1, int w2) */ static bool compare_player_kills(int w1, int w2) { + auto const &r_info = game->edit_data.r_info; + /* Extract player kills */ s16b z1 = r_info[w1].r_pkills; s16b z2 = r_info[w2].r_pkills; @@ -1272,7 +1279,9 @@ static bool compare_player_kills(int w1, int w2) */ static void roff_top(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; byte a1, a2; @@ -1330,7 +1339,7 @@ static void roff_top(int r_idx) */ void do_cmd_query_symbol(void) { - int i, r_idx; + auto const &r_info = game->edit_data.r_info; char sym, query; @@ -1358,6 +1367,7 @@ void do_cmd_query_symbol(void) "or (Ctrl-A, Ctrl-U, Ctrl-N, Ctrl-M):", &sym)) return; /* Find that character info, and describe it */ + std::size_t i; for (i = 0; ident_info[i]; ++i) { if (sym == ident_info[i][0]) break; @@ -1399,10 +1409,10 @@ void do_cmd_query_symbol(void) prt(buf, 0, 0); /* Collect matching monsters */ - std::vector who; - for (i = 1; i < max_r_idx; i++) + std::vector who; + for (std::size_t i = 1; i < r_info.size(); i++) { - monster_race *r_ptr = &r_info[i]; + auto r_ptr = &r_info[i]; /* Require non-unique monsters if needed */ if (norm && (r_ptr->flags & RF_UNIQUE)) continue; @@ -1480,7 +1490,7 @@ void do_cmd_query_symbol(void) while (1) { /* Extract a race */ - r_idx = who[i]; + auto r_idx = who[i]; /* Hack -- Auto-recall */ monster_race_track(r_idx, 0); diff --git a/src/cmd4.cc b/src/cmd4.cc index b06947dc..85ed490d 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -2014,6 +2014,8 @@ void do_cmd_macros(void) */ void do_cmd_visuals(void) { + auto &r_info = game->edit_data.r_info; + int i; FILE *fff; @@ -2108,9 +2110,9 @@ void do_cmd_visuals(void) fprintf(fff, "# Monster attr/char definitions\n\n"); /* Dump monsters */ - for (i = 0; i < max_r_idx; i++) + for (std::size_t i = 0; i < r_info.size(); i++) { - monster_race *r_ptr = &r_info[i]; + auto r_ptr = &r_info[i]; /* Skip non-entries */ if (!r_ptr->name) continue; @@ -2119,7 +2121,7 @@ void do_cmd_visuals(void) fprintf(fff, "# %s\n", r_ptr->name); /* Dump the monster attr/char info */ - fprintf(fff, "R:%d:0x%02X:0x%02X\n\n", i, + fprintf(fff, "R:%zu:0x%02X:0x%02X\n\n", i, static_cast(r_ptr->x_attr), static_cast(r_ptr->x_char)); } @@ -2253,7 +2255,7 @@ void do_cmd_visuals(void) /* Hack -- query until done */ while (1) { - monster_race *r_ptr = &r_info[r]; + auto r_ptr = &r_info[r]; byte da = (r_ptr->d_attr); char dc = (r_ptr->d_char); @@ -2288,8 +2290,8 @@ void do_cmd_visuals(void) if (i == ESCAPE) break; /* Analyze */ - if (i == 'n') r = (r + max_r_idx + 1) % max_r_idx; - if (i == 'N') r = (r + max_r_idx - 1) % max_r_idx; + if (i == 'n') r = (r + r_info.size() + 1) % r_info.size(); + if (i == 'N') r = (r + r_info.size() - 1) % r_info.size(); if (i == 'a') r_ptr->x_attr = (ca + 1); if (i == 'A') r_ptr->x_attr = (ca - 1); if (i == 'c') r_ptr->x_char = (cc + 1); @@ -3263,7 +3265,10 @@ void do_cmd_knowledge_traps(void) } -static int monster_get_race_level(int r_idx) { +static int monster_get_race_level(int r_idx) +{ + auto const &r_info = game->edit_data.r_info; + /* Hack -- Morgoth is always last */ if (r_idx == 862) { return 20000; @@ -3277,11 +3282,13 @@ static int monster_get_race_level(int r_idx) { */ static void do_cmd_knowledge_uniques(void) { + auto const &r_info = game->edit_data.r_info; + // Extract the unique race indexes. - std::vector unique_r_idxs; - for (int k = 1; k < max_r_idx; k++) + std::vector unique_r_idxs; + for (std::size_t k = 1; k < r_info.size(); k++) { - monster_race *r_ptr = &r_info[k]; + auto r_ptr = &r_info[k]; /* Only print Uniques */ if ((r_ptr->flags & RF_UNIQUE) && @@ -3295,15 +3302,15 @@ static void do_cmd_knowledge_uniques(void) // Sort races by level. std::sort(std::begin(unique_r_idxs), std::end(unique_r_idxs), - [](int r_idx1, int r_idx2) -> bool { + [](auto r_idx1, auto r_idx2) -> bool { return monster_get_race_level(r_idx1) < monster_get_race_level(r_idx2); }); // Scan the monster races fmt::MemoryWriter w; - for (int r_idx : unique_r_idxs) + for (std::size_t r_idx : unique_r_idxs) { - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Only print Uniques */ if (r_ptr->flags & RF_UNIQUE) @@ -3488,6 +3495,8 @@ static void do_cmd_knowledge_pets(void) */ static void do_cmd_knowledge_kill_count(void) { + auto const &r_info = game->edit_data.r_info; + s32b Total = 0; // Buffer @@ -3496,9 +3505,9 @@ static void do_cmd_knowledge_kill_count(void) // Summary of monsters slain { /* For all monsters */ - for (int kk = 1; kk < max_r_idx; kk++) + for (auto const &r_ref: r_info) { - monster_race *r_ptr = &r_info[kk]; + auto r_ptr = &r_ref; if (r_ptr->flags & RF_UNIQUE) { @@ -3530,9 +3539,9 @@ static void do_cmd_knowledge_kill_count(void) Total = 0; /* Scan the monster races */ - for (int k = 0; k < max_r_idx; k++) + for (auto const &r_ref: r_info) { - monster_race *r_ptr = &r_info[k]; + auto r_ptr = &r_ref; if (r_ptr->flags & RF_UNIQUE) { diff --git a/src/cmd5.cc b/src/cmd5.cc index bcf22124..a94f925a 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -542,6 +542,8 @@ void fetch(int dir, int wgt, bool_ require_los) */ std::string symbiote_name(bool capitalize) { + auto const &r_info = game->edit_data.r_info; + object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY]; std::string buf; @@ -554,7 +556,7 @@ std::string symbiote_name(bool capitalize) } else { - monster_race *r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; std::size_t i = 0; if (r_ptr->flags & RF_UNIQUE) @@ -1780,6 +1782,8 @@ static int use_monster_power_aux(monster_race const *r_ptr, bool great, bool sym */ int use_symbiotic_power(int r_idx, bool great) { + auto const &r_info = game->edit_data.r_info; + monster_race const *r_ptr = &r_info[r_idx]; return use_monster_power_aux(r_ptr, great, true, [](monster_power const *) { // Don't need to do anything post-cast. @@ -1791,6 +1795,8 @@ int use_symbiotic_power(int r_idx, bool great) */ void use_monster_power(int r_idx, bool great) { + auto const &r_info = game->edit_data.r_info; + monster_race const *r_ptr = &r_info[r_idx]; use_monster_power_aux(r_ptr, great, false, [r_ptr](monster_power const *power) { // Sometimes give a free cast. diff --git a/src/cmd6.cc b/src/cmd6.cc index 195d9648..630f1e0e 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -154,7 +154,9 @@ static select_by_name_t select_object_by_name(std::string const &prompt) */ static void corpse_effect(object_type *o_ptr, bool_ cutting) { - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[o_ptr->pval2]; /* Assume no bad effects */ bool_ harmful = FALSE; @@ -980,12 +982,12 @@ static object_filter_t const &item_tester_hook_eatable() */ void do_cmd_eat_food(void) { + auto const &r_info = game->edit_data.r_info; + int ident, lev, fval = 0; object_type *q_ptr, forge; - monster_race *r_ptr; - bool_ destroy = TRUE; /* Get an item */ @@ -1360,7 +1362,7 @@ void do_cmd_eat_food(void) /* Corpses... */ else { - r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; /* Analyse the corpse */ switch (o_ptr->sval) @@ -1539,6 +1541,8 @@ void do_cmd_eat_food(void) */ void do_cmd_cut_corpse(void) { + auto const &r_info = game->edit_data.r_info; + int item, meat = 0, not_meat = 0; /* Get an item */ @@ -1554,7 +1558,7 @@ void do_cmd_cut_corpse(void) /* Get the item */ object_type *o_ptr = get_object(item); - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; if ((o_ptr->sval != SV_CORPSE_CORPSE) && (o_ptr->sval != SV_CORPSE_HEAD)) { @@ -2869,6 +2873,7 @@ static object_filter_t const &item_tester_hook_readable() void do_cmd_read_scroll(void) { auto const &d_info = game->edit_data.d_info; + auto &r_info = game->edit_data.r_info; /* Check some conditions */ if (p_ptr->blind) @@ -2936,12 +2941,12 @@ void do_cmd_read_scroll(void) msg_print("You feel the souls of the dead coming back " "from the Halls of Mandos."); - for (int k = 0; k < max_r_idx; k++) + for (auto &r_ref: r_info) { - monster_race *r_ptr = &r_info[k]; + auto r_ptr = &r_ref; if (r_ptr->flags & RF_UNIQUE && - !(r_ptr->flags & RF_SPECIAL_GENE)) + !(r_ptr->flags & RF_SPECIAL_GENE)) { r_ptr->max_num = 1; } diff --git a/src/cmd7.cc b/src/cmd7.cc index 3f039f32..db496995 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -1780,6 +1780,8 @@ void summon_monster(int sumtype) */ void do_cmd_possessor() { + auto const &r_info = game->edit_data.r_info; + char ch, ext; @@ -3568,6 +3570,8 @@ static object_filter_t const &item_tester_hook_totemable() */ void do_cmd_summoner_extract() { + auto const &r_info = game->edit_data.r_info; + object_type forge, *q_ptr; /* Not when confused */ @@ -3640,11 +3644,13 @@ void do_cmd_summoner_extract() void summon_true(int r_idx, int item) { + auto const &r_info = game->edit_data.r_info; + int i, status, x = 1, y = 1, rx, ry = 0, chance; bool_ used; - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Uniques are less likely to be nice */ diff --git a/src/dungeon.cc b/src/dungeon.cc index d3554e50..c044021f 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -775,6 +775,8 @@ static void regenmana(int percent) */ static void regen_monsters(void) { + auto const &r_info = game->edit_data.r_info; + int i, frac; object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY]; @@ -782,7 +784,7 @@ static void regen_monsters(void) if (o_ptr->k_idx) { - monster_race *r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; /* Allow regeneration (if needed) */ if (o_ptr->pval2 < o_ptr->pval3) @@ -1216,6 +1218,7 @@ static void process_world_gods() static void process_world(void) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; timer_type *t_ptr; @@ -1291,7 +1294,7 @@ static void process_world(void) if (o_ptr->k_idx) { - monster_race *r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; if ((randint(1000) < r_ptr->level - ((p_ptr->lev * 2) + get_skill(SKILL_SYMBIOTIC)))) { diff --git a/src/files.cc b/src/files.cc index f897b515..cfd80362 100644 --- a/src/files.cc +++ b/src/files.cc @@ -219,6 +219,7 @@ errr process_pref_file_aux(char *buf) auto &race_mod_info = game->edit_data.race_mod_info; auto &st_info = game->edit_data.st_info; auto &re_info = game->edit_data.re_info; + auto &r_info = game->edit_data.r_info; int i, j, n1, n2; @@ -251,17 +252,26 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 2, 3, zz, ':', '/') == 3) { - monster_race *r_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t i = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_r_idx) return (1); - r_ptr = &r_info[i]; - if (n1) r_ptr->x_attr = n1; + + if (i >= r_info.size()) + { + return (1); + } + + auto r_ptr = &r_info[i]; + + if (n1) + { + r_ptr->x_attr = n1; + } if (n2) { r_ptr->x_char = n2; } + return (0); } } @@ -1385,6 +1395,8 @@ static cptr likert(int x, int y) */ static void display_player_various(void) { + auto const &r_info = game->edit_data.r_info; + int tmp, tmp2, damdice, damsides, dambonus, blows; int xthn, xthb, xfos, xsrh; int xdis, xdev, xsav, xstl; @@ -1566,6 +1578,8 @@ static void display_player_various(void) static object_flag_set wield_monster_flags() { + auto const &r_info = game->edit_data.r_info; + object_flag_set flags; /* Get the carried monster */ @@ -1603,6 +1617,8 @@ static void apply_lflags(LF const &lflags, object_flag_set *f) */ object_flag_set player_flags() { + auto const &r_info = game->edit_data.r_info; + /* Clear */ object_flag_set f; @@ -1713,26 +1729,26 @@ object_flag_set player_flags() } else { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; - - if (r_ptr->flags & RF_REFLECTING) f |= TR_REFLECT; - if (r_ptr->flags & RF_REGENERATE) f |= TR_REGEN; - if (r_ptr->flags & RF_AURA_FIRE) f |= TR_SH_FIRE; - if (r_ptr->flags & RF_AURA_ELEC) f |= TR_SH_ELEC; - if (r_ptr->flags & RF_PASS_WALL) f |= TR_WRAITH; - if (r_ptr->flags & RF_SUSCEP_FIRE) f |= TR_SENS_FIRE; - if (r_ptr->flags & RF_IM_ACID) f |= TR_RES_ACID; - if (r_ptr->flags & RF_IM_ELEC) f |= TR_RES_ELEC; - if (r_ptr->flags & RF_IM_FIRE) f |= TR_RES_FIRE; - if (r_ptr->flags & RF_IM_POIS) f |= TR_RES_POIS; - if (r_ptr->flags & RF_IM_COLD) f |= TR_RES_COLD; - if (r_ptr->flags & RF_RES_NETH) f |= TR_RES_NETHER; - if (r_ptr->flags & RF_RES_NEXU) f |= TR_RES_NEXUS; - if (r_ptr->flags & RF_RES_DISE) f |= TR_RES_DISEN; - if (r_ptr->flags & RF_NO_FEAR) f |= TR_RES_FEAR; - if (r_ptr->flags & RF_NO_SLEEP) f |= TR_FREE_ACT; - if (r_ptr->flags & RF_NO_CONF) f |= TR_RES_CONF; - if (r_ptr->flags & RF_CAN_FLY) f |= TR_FEATHER; + auto &r_ref = r_info[p_ptr->body_monster]; + + if (r_ref.flags & RF_REFLECTING) f |= TR_REFLECT; + if (r_ref.flags & RF_REGENERATE) f |= TR_REGEN; + if (r_ref.flags & RF_AURA_FIRE) f |= TR_SH_FIRE; + if (r_ref.flags & RF_AURA_ELEC) f |= TR_SH_ELEC; + if (r_ref.flags & RF_PASS_WALL) f |= TR_WRAITH; + if (r_ref.flags & RF_SUSCEP_FIRE) f |= TR_SENS_FIRE; + if (r_ref.flags & RF_IM_ACID) f |= TR_RES_ACID; + if (r_ref.flags & RF_IM_ELEC) f |= TR_RES_ELEC; + if (r_ref.flags & RF_IM_FIRE) f |= TR_RES_FIRE; + if (r_ref.flags & RF_IM_POIS) f |= TR_RES_POIS; + if (r_ref.flags & RF_IM_COLD) f |= TR_RES_COLD; + if (r_ref.flags & RF_RES_NETH) f |= TR_RES_NETHER; + if (r_ref.flags & RF_RES_NEXU) f |= TR_RES_NEXUS; + if (r_ref.flags & RF_RES_DISE) f |= TR_RES_DISEN; + if (r_ref.flags & RF_NO_FEAR) f |= TR_RES_FEAR; + if (r_ref.flags & RF_NO_SLEEP) f |= TR_FREE_ACT; + if (r_ref.flags & RF_NO_CONF) f |= TR_RES_CONF; + if (r_ref.flags & RF_CAN_FLY) f |= TR_FEATHER; } f |= p_ptr->xtra_flags; @@ -2219,6 +2235,8 @@ static void display_player_ben_one(int page) */ void display_player(int mode) { + auto const &r_info = game->edit_data.r_info; + int i; char buf[80]; @@ -2230,7 +2248,7 @@ void display_player(int mode) /* Standard */ if ((mode == 0) || (mode == 1)) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; /* Name, Sex, Race, Class */ put_str("Name :", 2, 1); @@ -2580,6 +2598,7 @@ errr file_character(cptr name, bool_ full) { auto const &d_info = game->edit_data.d_info; auto const &wf_info = game->edit_data.wf_info; + auto const &r_info = game->edit_data.r_info; int i, x, y; byte a; @@ -2746,12 +2765,11 @@ errr file_character(cptr name, bool_ full) /* Monsters slain */ { - int k; s32b Total = 0; - for (k = 1; k < max_r_idx; k++) + for (auto const &r_ref: r_info) { - monster_race *r_ptr = &r_info[k]; + auto r_ptr = &r_ref; if (r_ptr->flags & RF_UNIQUE) { @@ -4033,6 +4051,7 @@ void autosave_checkpoint() static long total_points(void) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; s16b max_dl = 0; long temp, Total = 0; @@ -4106,9 +4125,9 @@ static long total_points(void) } } - for (std::size_t k = 1; k < max_r_idx; k++) + for (auto const &r_ref: r_info) { - monster_race *r_ptr = &r_info[k]; + auto r_ptr = &r_ref; if (r_ptr->flags & RF_UNIQUE) { diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 8b118397..16a97da7 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -4,6 +4,7 @@ #include "dungeon_info_type.hpp" #include "hist_type.hpp" #include "monster_ego.hpp" +#include "monster_race.hpp" #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -91,6 +92,11 @@ struct GameEditData { */ std::vector s_descriptors; + /* + * The monster races + */ + std::vector r_info; + /** * Monster race egos */ diff --git a/src/generate.cc b/src/generate.cc index 96f4ebaf..9bd01010 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -2685,7 +2685,9 @@ static void build_type4(int by0, int bx0) */ static bool_ vault_aux_jelly(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2706,7 +2708,9 @@ static bool_ vault_aux_jelly(int r_idx) */ static bool_ vault_aux_animal(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2724,7 +2728,9 @@ static bool_ vault_aux_animal(int r_idx) */ static bool_ vault_aux_undead(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2742,7 +2748,9 @@ static bool_ vault_aux_undead(int r_idx) */ static bool_ vault_aux_chapel(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2763,7 +2771,9 @@ static bool_ vault_aux_chapel(int r_idx) */ static bool_ vault_aux_kennel(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2779,7 +2789,9 @@ static bool_ vault_aux_kennel(int r_idx) */ static bool_ vault_aux_treasure(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2811,6 +2823,8 @@ static bool_ vault_aux_clone(int r_idx) */ static bool_ vault_aux_symbol(int r_idx) { + auto const &r_info = game->edit_data.r_info; + return ((r_info[r_idx].d_char == (r_info[template_race].d_char)) && !(r_info[r_idx].flags & RF_UNIQUE)); } @@ -2821,7 +2835,9 @@ static bool_ vault_aux_symbol(int r_idx) */ static bool_ vault_aux_orc(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2840,7 +2856,9 @@ static bool_ vault_aux_orc(int r_idx) */ static bool_ vault_aux_troll(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2858,7 +2876,9 @@ static bool_ vault_aux_troll(int r_idx) */ static bool_ vault_aux_giant(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2876,7 +2896,9 @@ static bool_ vault_aux_giant(int r_idx) */ static bool_ vault_aux_demon(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -2915,6 +2937,8 @@ static bool_ vault_aux_demon(int r_idx) */ static void build_type5(int by0, int bx0) { + auto const &r_info = game->edit_data.r_info; + int y, x, y1, x1, y2, x2, xval, yval; int tmp, i; cptr name; @@ -2979,7 +3003,7 @@ static void build_type5(int by0, int bx0) { while (1) { - template_race = randint(max_r_idx - 2); + template_race = rand_int(r_info.size()); /* Reject uniques */ if (r_info[template_race].flags & RF_UNIQUE) continue; @@ -3153,6 +3177,8 @@ static void build_type5(int by0, int bx0) */ static void build_type6(int by0, int bx0) { + auto const &r_info = game->edit_data.r_info; + int tmp, what[16]; int i, j, y, x, y1, x1, y2, x2, xval, yval; bool_ empty = FALSE; @@ -3251,7 +3277,7 @@ static void build_type6(int by0, int bx0) do { - template_race = randint(max_r_idx - 2); + template_race = rand_int(r_info.size() - 1); } while ((r_info[template_race].flags & RF_UNIQUE) || (((r_info[template_race].level) + randint(5)) > @@ -3322,7 +3348,9 @@ static void build_type6(int by0, int bx0) /* Restrict monster selection */ get_mon_num_hook = [](int r_idx) -> bool_ { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Decline unique monsters */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); @@ -7619,6 +7647,7 @@ static void supersize_grid_tile(int sy, int sx, int ty, int tx) static bool_ cave_gen(void) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; auto d_ptr = &d_info[dungeon_type]; diff --git a/src/init1.cc b/src/init1.cc index 17024337..3dcee907 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -4097,9 +4097,9 @@ static errr grab_one_monster_spell_flag(monster_spell_flag_set *flags, cptr what */ errr init_r_info_txt(FILE *fp) { - int i; + auto &r_info = game->edit_data.r_info; + char buf[1024]; - char *s, *t; /* Current entry */ monster_race *r_ptr = NULL; @@ -4128,7 +4128,7 @@ errr init_r_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -4140,19 +4140,16 @@ errr init_r_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_r_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - r_ptr = &r_info[i]; + r_ptr = &expand_to_fit_index(r_info, i); /* Allocate name string. */ assert(!r_ptr->name); // Sanity check that we aren't overwriting anything @@ -4178,11 +4175,8 @@ errr init_r_info_txt(FILE *fp) /* Process 'D' for "Description" */ if (buf[0] == 'D') { - /* Acquire the text */ - s = buf + 2; - /* Append to description */ - strappend(&r_ptr->text, s); + strappend(&r_ptr->text, buf + 2); /* Next... */ continue; @@ -4324,7 +4318,9 @@ errr init_r_info_txt(FILE *fp) /* Process 'B' for "Blows" (up to four lines) */ if (buf[0] == 'B') { - int n1, n2; + int i, n1, n2; + char *s; + char *t; /* Find the next empty blow slot (if any) */ for (i = 0; i < 4; i++) if (!r_ptr->blow[i].method) break; @@ -4397,7 +4393,8 @@ errr init_r_info_txt(FILE *fp) /* Process 'S' for "Spell Flags" (multiple lines) */ if (buf[0] == 'S') { - s = buf + 2; + char const *s = buf + 2; + int i; /* XXX XXX XXX Hack -- Read spell frequency */ if (1 == sscanf(s, "1_IN_%d", &i)) @@ -6782,12 +6779,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_real_towns = atoi(zz[1]); } - /* Maximum r_idx */ - else if (zz[0][0] == 'R') - { - max_r_idx = atoi(zz[1]); - } - /* Maximum k_idx */ else if (zz[0][0] == 'K') { diff --git a/src/init2.cc b/src/init2.cc index da011da7..79b5a0a3 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -405,7 +405,7 @@ namespace { static void allocate() { - r_info = new monster_race[max_r_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -722,11 +722,12 @@ void create_stores_stock(int t) static errr init_other(void) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; /*** Prepare the "dungeon" information ***/ /* Allocate and Wipe the special gene flags */ - m_allow_special = make_array(max_r_idx); + m_allow_special = make_array(r_info.size()); k_allow_special = make_array(max_k_idx); a_allow_special = make_array(max_a_idx); @@ -802,12 +803,12 @@ static errr init_other(void) */ static errr init_alloc(void) { + auto const &r_info = game->edit_data.r_info; + int i, j; object_kind *k_ptr; - monster_race *r_ptr; - alloc_entry *table; s16b num[MAX_DEPTH_MONSTER]; @@ -915,10 +916,10 @@ static errr init_alloc(void) alloc_race_size = 0; /* Scan the monsters */ - for (i = 1; i < max_r_idx; i++) + for (auto &r_ref: r_info) { /* Get the i'th race */ - r_ptr = &r_info[i]; + auto r_ptr = &r_ref; /* Legal monsters */ if (r_ptr->rarity) @@ -951,10 +952,10 @@ static errr init_alloc(void) table = alloc_race_table; /* Scan the monsters */ - for (i = 1; i < max_r_idx; i++) + for (i = 1; i < r_info.size(); i++) { /* Get the i'th race */ - r_ptr = &r_info[i]; + auto r_ptr = &r_info[i]; /* Count valid pairs */ if (r_ptr->rarity) @@ -1017,6 +1018,7 @@ static void init_sets_aux() static void init_guardians(void) { auto const &d_info = game->edit_data.d_info; + auto &r_info = game->edit_data.r_info; /* Scan dungeons */ for (std::size_t i = 0; i < d_info.size(); i++) @@ -1026,7 +1028,7 @@ static void init_guardians(void) /* Mark the guadian monster */ if (d_ptr->final_guardian) { - monster_race *r_ptr = &r_info[d_ptr->final_guardian]; + auto r_ptr = &r_info[d_ptr->final_guardian]; r_ptr->flags |= RF_SPECIAL_GENE; diff --git a/src/loadsave.cc b/src/loadsave.cc index 41bd86d1..8d05cb43 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1366,6 +1366,8 @@ static bool do_objects(ls_flag_t flag, bool no_companions) static bool do_monsters(ls_flag_t flag, bool no_companions) { + auto &r_info = game->edit_data.r_info; + u16b n_monsters = m_max; if (flag == ls_flag_t::SAVE) @@ -1618,7 +1620,9 @@ bool_ file_exist(cptr buf) */ static void do_lore(std::size_t r_idx, ls_flag_t flag) { - monster_race *r_ptr = &r_info[r_idx]; + auto &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; do_s16b(&r_ptr->r_pkills, flag); do_s16b(&r_ptr->max_num, flag); @@ -2082,11 +2086,13 @@ static void do_stores(ls_flag_t flag) */ static bool do_monster_lore(ls_flag_t flag) { - u16b tmp16u = max_r_idx; + auto const &r_info = game->edit_data.r_info; + + u16b tmp16u = r_info.size(); do_u16b(&tmp16u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_r_idx)) + if ((flag == ls_flag_t::LOAD) && (tmp16u > r_info.size())) { note("Too many monster races!"); return false; diff --git a/src/melee1.cc b/src/melee1.cc index 5a61a424..458e2fd3 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -10,6 +10,7 @@ #include "cave.hpp" #include "cmd5.hpp" +#include "game.hpp" #include "gods.hpp" #include "mimic.hpp" #include "monster2.hpp" @@ -223,7 +224,9 @@ int get_attack_power(int effect) */ bool_ carried_make_attack_normal(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; int ap_cnt; diff --git a/src/melee2.cc b/src/melee2.cc index 773cdad1..d1fc3767 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -20,6 +20,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hook_mon_speak_in.hpp" #include "hook_monster_ai_in.hpp" #include "hook_monster_ai_out.hpp" @@ -4175,19 +4176,20 @@ static bool_ find_hiding(int m_idx, int *yp, int *xp) /* Find an appropriate corpse */ void find_corpse(monster_type *m_ptr, int *y, int *x) { + auto const &r_info = game->edit_data.r_info; + int k, last = -1; for (k = 0; k < max_o_idx; k++) { object_type *o_ptr = &o_list[k]; - monster_race *rt_ptr, *rt2_ptr; if (!o_ptr->k_idx) continue; if (o_ptr->tval != TV_CORPSE) continue; if ((o_ptr->sval != SV_CORPSE_CORPSE) && (o_ptr->sval != SV_CORPSE_SKELETON)) continue; - rt_ptr = &r_info[o_ptr->pval2]; + auto rt_ptr = &r_info[o_ptr->pval2]; /* Cannot incarnate into a higher level monster */ if (rt_ptr->level > m_ptr->level) continue; @@ -4197,9 +4199,16 @@ void find_corpse(monster_type *m_ptr, int *y, int *x) if (last != -1) { - rt2_ptr = &r_info[o_list[last].pval2]; - if (rt_ptr->level > rt2_ptr->level) last = k; - else continue; + auto rt2_ptr = &r_info[o_list[last].pval2]; + + if (rt_ptr->level > rt2_ptr->level) + { + last = k; + } + else + { + continue; + } } else { @@ -4220,6 +4229,8 @@ void find_corpse(monster_type *m_ptr, int *y, int *x) */ static void get_target_monster(int m_idx) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; int i, t = -1, d = 9999; @@ -4229,7 +4240,7 @@ static void get_target_monster(int m_idx) /* Access the monster */ monster_type *t_ptr = &m_list[i]; /* hack should call the function for ego monsters ... but no_target i not meant to be added by ego and it speeds up the code */ - monster_race *rt_ptr = &r_info[t_ptr->r_idx]; + auto rt_ptr = &r_info[t_ptr->r_idx]; int dd; /* Ignore "dead" monsters */ @@ -6389,6 +6400,8 @@ void summon_maint(int m_idx) */ void process_monsters(void) { + auto const &r_info = game->edit_data.r_info; + int i, e; int fx, fy; diff --git a/src/monster1.cc b/src/monster1.cc index 2f874259..5ad3c696 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -1379,7 +1379,9 @@ void display_roff(int r_idx, int ego) bool_ monster_quest(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Random quests are in the dungeon */ if (r_ptr->flags & RF_WILD_ONLY) return FALSE; @@ -1396,7 +1398,9 @@ bool_ monster_quest(int r_idx) bool_ monster_dungeon(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (!(r_ptr->flags & RF_WILD_ONLY)) return TRUE; @@ -1407,7 +1411,9 @@ bool_ monster_dungeon(int r_idx) static bool_ monster_ocean(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_OCEAN) return TRUE; @@ -1418,7 +1424,9 @@ static bool_ monster_ocean(int r_idx) static bool_ monster_shore(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_SHORE) return TRUE; @@ -1429,7 +1437,9 @@ static bool_ monster_shore(int r_idx) static bool_ monster_waste(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_WASTE) return TRUE; @@ -1440,7 +1450,9 @@ static bool_ monster_waste(int r_idx) static bool_ monster_town(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_TOWN) return TRUE; @@ -1451,7 +1463,9 @@ static bool_ monster_town(int r_idx) static bool_ monster_wood(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_WOOD) return TRUE; @@ -1462,7 +1476,9 @@ static bool_ monster_wood(int r_idx) static bool_ monster_volcano(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_VOLCANO) return TRUE; @@ -1473,7 +1489,9 @@ static bool_ monster_volcano(int r_idx) static bool_ monster_mountain(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_MOUNTAIN) return TRUE; @@ -1484,7 +1502,9 @@ static bool_ monster_mountain(int r_idx) static bool_ monster_grass(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_WILD_GRASS) return TRUE; @@ -1495,7 +1515,9 @@ static bool_ monster_grass(int r_idx) static bool_ monster_deep_water(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (!monster_dungeon(r_idx)) return FALSE; @@ -1508,7 +1530,9 @@ static bool_ monster_deep_water(int r_idx) static bool_ monster_shallow_water(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (!monster_dungeon(r_idx)) return FALSE; @@ -1521,7 +1545,9 @@ static bool_ monster_shallow_water(int r_idx) static bool_ monster_lava(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (!monster_dungeon(r_idx)) return FALSE; diff --git a/src/monster2.cc b/src/monster2.cc index 108642df..dccf47dc 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -65,8 +65,10 @@ s32b monster_exp(s16b level) /* Monster gain a few levels ? */ void monster_check_experience(int m_idx, bool_ silent) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; char m_name[80]; /* Get the name */ @@ -268,8 +270,10 @@ static int pick_ego_monster(monster_race const *r_ptr) */ std::shared_ptr race_info_idx(int r_idx, int ego) { - monster_race *r_ptr = &r_info[r_idx]; - const auto &re_info = game->edit_data.re_info; + auto const &re_info = game->edit_data.re_info; + auto &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* We don't need to allocate anything if it's an ordinary monster. */ if (!ego) { @@ -840,7 +844,7 @@ errr get_mon_num_prep(void) * Some dungeon types restrict the possible monsters. * Return TRUE is the monster is OK and FALSE otherwise */ -bool_ apply_rule(monster_race *r_ptr, byte rule) +static bool_ apply_rule(monster_race const *r_ptr, byte rule) { auto const &d_info = game->edit_data.d_info; @@ -893,9 +897,10 @@ bool_ apply_rule(monster_race *r_ptr, byte rule) bool_ restrict_monster_to_dungeon(int r_idx) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; auto d_ptr = &d_info[dungeon_type]; - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Select a random rule */ byte rule = d_ptr->rule_percents[rand_int(100)]; @@ -940,14 +945,12 @@ bool_ summon_hack = FALSE; */ s16b get_mon_num(int level) { - int i, j, p; + auto const &r_info = game->edit_data.r_info; + int i, j, p; int r_idx; - long value, total; - monster_race *r_ptr; - alloc_entry *table = alloc_race_table; int in_tome; @@ -996,7 +999,7 @@ s16b get_mon_num(int level) r_idx = table[i].index; /* Access the actual race */ - r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Hack -- "unique" monsters must be "unique" */ if ((r_ptr->flags & RF_UNIQUE) && @@ -1163,7 +1166,8 @@ s16b get_mon_num(int level) */ void monster_desc(char *desc, monster_type *m_ptr, int mode) { - const auto &re_info = game->edit_data.re_info; + auto const &re_info = game->edit_data.re_info; + auto const &r_info = game->edit_data.r_info; auto r_ptr = m_ptr->race(); char silly_name[80], name[100]; @@ -1196,11 +1200,11 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { if (rand_int(2) == 0) { - monster_race *hallu_race; + monster_race const *hallu_race; do { - hallu_race = &r_info[randint(max_r_idx - 2)]; + hallu_race = &*uniform_element(r_info); } while ((!hallu_race->name) || (hallu_race->flags & RF_UNIQUE)); @@ -1379,9 +1383,10 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) void monster_race_desc(char *desc, int r_idx, int ego) { - const auto &re_info = game->edit_data.re_info; + auto const &re_info = game->edit_data.re_info; + auto const &r_info = game->edit_data.r_info; - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; char name[80]; if (ego) @@ -1985,6 +1990,8 @@ bool_ place_monster_one_no_drop = FALSE; static s16b hack_m_idx_ii = 0; s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) { + auto &r_info = game->edit_data.r_info; + int i; char dummy[5]; bool_ add_level = FALSE; @@ -2054,7 +2061,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Check for original monster race flags */ { - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Paranoia */ if (!r_ptr->name) @@ -2479,7 +2486,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) /* Count monsters on the level */ { /* Hack -- we need to modify the REAL r_info, not the fake one */ - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; /* Hack -- Count the monsters on the level */ r_ptr->cur_num++; @@ -2513,7 +2520,9 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) */ static bool_ place_monster_group(int y, int x, int r_idx, bool_ slp, int status) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; int old, n, i; int total = 0, extra = 0; @@ -2608,9 +2617,10 @@ static int place_monster_idx = 0; */ static bool_ place_monster_okay(int r_idx) { - monster_race *r_ptr = &r_info[place_monster_idx]; + auto const &r_info = game->edit_data.r_info; - monster_race *z_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[place_monster_idx]; + auto z_ptr = &r_info[r_idx]; /* Hack - Escorts have to have the same dungeon flag */ if (monster_dungeon(place_monster_idx) != monster_dungeon(r_idx)) return (FALSE); @@ -2652,8 +2662,10 @@ static bool_ place_monster_okay(int r_idx) */ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status) { + auto const &r_info = game->edit_data.r_info; + int i; - monster_race *r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; bool_ (*old_get_mon_num_hook)(int r_idx); @@ -2776,9 +2788,11 @@ bool_ place_monster(int y, int x, bool_ slp, bool_ grp) bool_ alloc_horde(int y, int x) { + auto const &r_info = game->edit_data.r_info; + int r_idx = 0; - monster_race * r_ptr = NULL; - monster_type * m_ptr; + monster_race const *r_ptr = NULL; + monster_type *m_ptr; int attempts = 1000; set_mon_num2_hook(y, x); @@ -2907,7 +2921,9 @@ static int summon_specific_type = 0; */ static bool_ summon_specific_okay(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; bool_ okay = FALSE; @@ -3482,7 +3498,9 @@ void monster_swap(int y1, int x1, int y2, int x2) */ static bool_ mutate_monster_okay(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; bool_ okay = FALSE; diff --git a/src/monster3.cc b/src/monster3.cc index f8bb0837..9a7921a7 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -11,6 +11,7 @@ #include "cave_type.hpp" #include "cmd2.hpp" #include "cmd5.hpp" +#include "game.hpp" #include "gods.hpp" #include "melee2.hpp" #include "monster2.hpp" @@ -60,7 +61,11 @@ int is_friend(monster_type *m_ptr) /* Should they attack each others */ bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr) { - monster_race *r_ptr = &r_info[m_ptr->r_idx], *rt_ptr = &r_info[t_ptr->r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[m_ptr->r_idx]; + auto rt_ptr = &r_info[t_ptr->r_idx]; + int s1 = is_friend(m_ptr), s2 = is_friend(t_ptr); /* Monsters hates breeders */ @@ -146,11 +151,13 @@ bool_ ai_multiply(int m_idx) /* Possessor incarnates */ bool_ ai_possessor(int m_idx, int o_idx) { + auto &r_info = game->edit_data.r_info; + object_type *o_ptr = &o_list[o_idx]; monster_type *m_ptr = &m_list[m_idx]; int r_idx = m_ptr->r_idx, r2_idx = o_ptr->pval2; int i; - monster_race *r_ptr = &r_info[r2_idx]; + auto r_ptr = &r_info[r2_idx]; char m_name[80], m_name2[80]; monster_desc(m_name, m_ptr, 0x00); @@ -226,9 +233,11 @@ bool_ ai_possessor(int m_idx, int o_idx) void ai_deincarnate(int m_idx) { + auto &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; int r2_idx = m_ptr->possessor, r_idx = m_ptr->r_idx; - monster_race *r_ptr = &r_info[r2_idx]; + auto r_ptr = &r_info[r2_idx]; int i; char m_name[80]; @@ -413,12 +422,14 @@ bool_ do_control_drop(void) bool_ do_control_magic(void) { + auto const &r_info = game->edit_data.r_info; + int i; bool_ flag, redraw; int ask; char choice; char out_val[160]; - monster_race *r_ptr = &r_info[m_list[p_ptr->control].r_idx]; + auto r_ptr = &r_info[m_list[p_ptr->control].r_idx]; int label; if (!p_ptr->control) return FALSE; diff --git a/src/object1.cc b/src/object1.cc index 8be0655a..466488fe 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -636,6 +636,7 @@ void reset_visuals(void) auto &st_info = game->edit_data.st_info; auto &race_mod_info = game->edit_data.race_mod_info; auto &re_info = game->edit_data.re_info; + auto &r_info = game->edit_data.r_info; int i; @@ -668,13 +669,11 @@ void reset_visuals(void) } /* Extract default attr/char code for monsters */ - for (i = 0; i < max_r_idx; i++) + for (auto &r_ref: r_info) { - monster_race *r_ptr = &r_info[i]; - /* Default attr/char */ - r_ptr->x_attr = r_ptr->d_attr; - r_ptr->x_char = r_ptr->d_char; + r_ref.x_attr = r_ref.d_attr; + r_ref.x_char = r_ref.d_char; } /* Reset attr/char code for ego monster overlay graphics */ @@ -1020,6 +1019,7 @@ static object_flag_set compute_pval_mask() */ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { + auto const &r_info = game->edit_data.r_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -1300,7 +1300,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) case TV_CORPSE: { - monster_race* r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; + modstr = basenm; if (r_ptr->flags & RF_UNIQUE) { @@ -1315,7 +1316,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) case TV_EGG: { - monster_race* r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; + modstr = basenm; basenm = fmt::format("& {} #~", r_ptr->name); break; @@ -1324,7 +1326,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) case TV_HYPNOS: { /* We print hit points further down. --dsb */ - monster_race* r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; + modstr = basenm; basenm = fmt::format("& {}~", r_ptr->name); break; @@ -1411,16 +1414,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { cptr ego = NULL; - monster_race* r_ptr; - if (o_ptr->tval == TV_CORPSE) - { - r_ptr = &r_info[o_ptr->pval2]; - } - else - { - r_ptr = &r_info[o_ptr->pval]; - } - /* Grab any ego-item name */ if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) { @@ -1459,12 +1452,15 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) t += ' '; } - else if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_UNIQUE)) - {} - + else if ((o_ptr->tval == TV_CORPSE) && (r_info[o_ptr->pval2].flags & RF_UNIQUE)) + { + /* Nothing */ + } - else if ((o_ptr->tval == TV_HYPNOS) && (r_ptr->flags & RF_UNIQUE)) - {} + else if ((o_ptr->tval == TV_HYPNOS) && (r_info[o_ptr->pval].flags & RF_UNIQUE)) + { + /* Nothing */ + } /* Hack -- The only one of its kind */ else if (known && artifact_p(o_ptr)) diff --git a/src/object2.cc b/src/object2.cc index 913bf4f6..eb0a66e8 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -769,6 +769,8 @@ bool object_tried_p(object_type const *o_ptr) */ static s32b object_value_base(object_type const *o_ptr) { + auto const &r_info = game->edit_data.r_info; + object_kind *k_ptr = &k_info[o_ptr->k_idx]; /* Aware item -- use template cost */ @@ -816,7 +818,7 @@ static s32b object_value_base(object_type const *o_ptr) /* Eggs */ case TV_EGG: { - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; /* Pay the monster level */ return (r_ptr->level * 100) + 100; @@ -1070,6 +1072,8 @@ s32b flag_cost(object_type const *o_ptr, int plusses) */ s32b object_value_real(object_type const *o_ptr) { + auto const &r_info = game->edit_data.r_info; + s32b value; object_kind *k_ptr = &k_info[o_ptr->k_idx]; @@ -1202,7 +1206,7 @@ s32b object_value_real(object_type const *o_ptr) /* Eggs */ case TV_EGG: { - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; /* Pay the monster level */ value += r_ptr->level * 100; @@ -3214,6 +3218,8 @@ static int get_stick_max_level(byte tval, int level, int spl) */ static void a_m_aux_4(object_type *o_ptr, int level, int power) { + auto const &r_info = game->edit_data.r_info; + s32b bonus_lvl, max_lvl; object_kind *k_ptr = &k_info[o_ptr->k_idx]; @@ -3279,14 +3285,18 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) case TV_CORPSE: { /* Hack -- choose a monster */ - monster_race* r_ptr; int r_idx = get_mon_num(dun_level); - r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; if (!(r_ptr->flags & RF_UNIQUE)) + { o_ptr->pval2 = r_idx; + } else + { o_ptr->pval2 = 2; + } + o_ptr->pval3 = 0; break; } @@ -3294,14 +3304,13 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) case TV_EGG: { /* Hack -- choose a monster */ - monster_race* r_ptr; int r_idx, count = 0; bool_ OK = FALSE; while ((!OK) && (count < 1000)) { r_idx = get_mon_num(dun_level); - r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; if (r_ptr->flags & RF_HAS_EGG) { @@ -3310,9 +3319,13 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) } count++; } - if (count == 1000) o_ptr->pval2 = 940; /* Blue fire-lizard */ - r_ptr = &r_info[o_ptr->pval2]; + if (count == 1000) + { + o_ptr->pval2 = 940; /* Blue fire-lizard */ + } + + auto r_ptr = &r_info[o_ptr->pval2]; o_ptr->weight = (r_ptr->weight + rand_int(r_ptr->weight) / 100) + 1; o_ptr->pval = r_ptr->weight * 3 + rand_int(r_ptr->weight) + 1; break; @@ -3321,9 +3334,8 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) case TV_HYPNOS: { /* Hack -- choose a monster */ - monster_race* r_ptr; int r_idx = get_mon_num(dun_level); - r_ptr = &r_info[r_idx]; + auto r_ptr = &r_info[r_idx]; if (!(r_ptr->flags & RF_NEVER_MOVE)) o_ptr->pval = r_idx; @@ -6311,9 +6323,11 @@ s16b floor_carry(int y, int x, object_type *j_ptr) */ void pack_decay(int item) { + auto const &r_info = game->edit_data.r_info; + object_type *o_ptr = &p_ptr->inventory[item]; - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; object_type *i_ptr; object_type object_type_body; @@ -6396,9 +6410,11 @@ void pack_decay(int item) */ void floor_decay(int item) { + auto const &r_info = game->edit_data.r_info; + object_type *o_ptr = &o_list[item]; - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; object_type *i_ptr; object_type object_type_body; diff --git a/src/q_bounty.cc b/src/q_bounty.cc index e0a7ae2a..1bdb1fe6 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -22,7 +22,9 @@ static bool_ lua_mon_hook_bounty(int r_idx) { - monster_race* r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; /* Reject uniques */ if (r_ptr->flags & RF_UNIQUE) return (FALSE); diff --git a/src/q_eol.cc b/src/q_eol.cc index 1c141624..4392b001 100644 --- a/src/q_eol.cc +++ b/src/q_eol.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "game.hpp" #include "generate.hpp" #include "hook_stair_in.hpp" #include "hook_quest_finish_in.hpp" @@ -184,8 +185,10 @@ static bool_ quest_eol_death_hook(void *, void *in_, void *) static bool_ quest_eol_stair_hook(void *, void *in_, void *) { + auto const &r_info = game->edit_data.r_info; + struct hook_stair_in *in = static_cast(in_); - monster_race *r_ptr = &r_info[get_eol()]; + auto r_ptr = &r_info[get_eol()]; if (p_ptr->inside_quest != QUEST_EOL) return FALSE; diff --git a/src/q_main.cc b/src/q_main.cc index 81b6ac85..159d0f7b 100644 --- a/src/q_main.cc +++ b/src/q_main.cc @@ -1,5 +1,6 @@ #include "q_main.hpp" +#include "game.hpp" #include "hook_chardump_in.hpp" #include "hook_monster_death_in.hpp" #include "hook_new_monster_in.hpp" @@ -30,6 +31,8 @@ static void quest_describe(int q_idx) static bool_ quest_main_monsters_hook(void *, void *in_, void *) { + auto const &r_info = game->edit_data.r_info; + struct hook_new_monster_in *in = static_cast(in_); s32b r_idx = in->r_idx; @@ -50,7 +53,9 @@ static bool_ quest_main_monsters_hook(void *, void *in_, void *) static bool_ quest_morgoth_hook(void *, void *, void *) { - monster_race *r_ptr = &r_info[get_morgoth()]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[get_morgoth()]; /* Need to kill him */ if (!r_ptr->max_num) @@ -126,7 +131,9 @@ bool_ quest_morgoth_init_hook() static bool_ quest_sauron_hook(void *, void *, void *) { - monster_race *r_ptr = &r_info[get_sauron()]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[get_sauron()]; /* Need to kill him */ if (!r_ptr->max_num) @@ -149,10 +156,12 @@ static bool_ quest_sauron_hook(void *, void *, void *) static bool_ quest_sauron_resurect_hook(void *, void *in_, void *) { + auto &r_info = game->edit_data.r_info; + struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; if ((r_ptr->flags & RF_NAZGUL) && r_info[get_sauron()].max_num) { @@ -180,7 +189,9 @@ bool_ quest_sauron_init_hook() static bool_ quest_necro_hook(void *, void *, void *) { - monster_race *r_ptr = &r_info[get_necromancer()]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[get_necromancer()]; /* Need to kill him */ if (!r_ptr->max_num) diff --git a/src/q_poison.cc b/src/q_poison.cc index 54df78f9..24d0320c 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -2,6 +2,7 @@ #include "cave.hpp" #include "cave_type.hpp" +#include "game.hpp" #include "hook_chardump_in.hpp" #include "hook_drop_in.hpp" #include "hook_init_quest_in.hpp" @@ -32,7 +33,9 @@ static int wild_locs[4][2] = static bool_ create_molds_hook(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; if (r_ptr->spells & SF_MULTIPLY) return FALSE; diff --git a/src/q_rand.cc b/src/q_rand.cc index 9606ea7b..019f4b71 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -56,6 +56,7 @@ GENERATE_MONSTER_LOOKUP_FN(get_adventurer, "Adventurer") void initialize_random_quests(int n) { auto const &d_info = game->edit_data.d_info; + auto &r_info = game->edit_data.r_info; int step, lvl, i, k; int old_type = dungeon_type; @@ -437,6 +438,8 @@ static bool_ quest_random_turn_hook(void *, void *, void *) static bool_ quest_random_feeling_hook(void *, void *, void *) { + auto const &r_info = game->edit_data.r_info; + if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); if (!random_quests[dun_level].type) return (FALSE); @@ -616,6 +619,8 @@ static bool_ quest_random_dump_hook(void *, void *in_, void *) std::string quest_random_describe() { + auto const &r_info = game->edit_data.r_info; + // Only emit description if we're actually on a // random quest level. if (!(dungeon_flags & DF_PRINCIPAL)) return ""; diff --git a/src/q_shroom.cc b/src/q_shroom.cc index 4fd1e066..ee5f9d1f 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -1,6 +1,7 @@ #include "q_shroom.hpp" #include "cave.hpp" +#include "game.hpp" #include "hook_chat_in.hpp" #include "hook_give_in.hpp" #include "hook_monster_death_in.hpp" @@ -128,6 +129,8 @@ static bool_ quest_shroom_death_hook(void *, void *in_, void *) static bool_ quest_shroom_give_hook(void *, void *in_, void *) { + auto const &r_info = game->edit_data.r_info; + struct hook_give_in *in = static_cast(in_); object_type *o_ptr; monster_type *m_ptr; @@ -213,6 +216,8 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) static void check_dogs_alive(s32b m_idx) { + auto const &r_info = game->edit_data.r_info; + if ((r_info[get_grip()].max_num == 0) || (r_info[get_wolf()].max_num == 0) || (r_info[get_fang()].max_num == 0)) diff --git a/src/spells1.cc b/src/spells1.cc index 8be8b06a..ed10c525 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -92,7 +92,9 @@ using std::chrono::milliseconds; */ s16b poly_r_idx(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[r_idx]; int i, r; @@ -3812,6 +3814,8 @@ static int raise_ego[MAX_RAISE] = */ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { + auto const &r_info = game->edit_data.r_info; + cave_type *c_ptr = &cave[y][x]; bool_ obvious = FALSE; @@ -3864,8 +3868,9 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { if (o_ptr->tval == TV_CORPSE) { - monster_race *r_ptr = &r_info[o_ptr->pval2]; - s32b dama, radius = 7; + auto r_ptr = &r_info[o_ptr->pval2]; + s32b radius = 7; + s32b dama; if (r_ptr->flags & RF_FORCE_MAXHP) dama = maxroll(r_ptr->hdice, r_ptr->hside); @@ -4094,7 +4099,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) } case GF_RAISE_DEMON: { - monster_race *r_ptr = &r_info[o_ptr->pval2]; + auto r_ptr = &r_info[o_ptr->pval2]; cptr name; if (o_ptr->tval != TV_CORPSE) break; @@ -6907,6 +6912,7 @@ bool_ unsafe = FALSE; static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad) { auto const &d_info = game->edit_data.d_info; + auto const &r_info = game->edit_data.r_info; int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0; diff --git a/src/spells2.cc b/src/spells2.cc index 02b51056..1cd03430 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -801,6 +801,8 @@ bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a sh */ void self_knowledge(FILE *fff) { + auto const &r_info = game->edit_data.r_info; + int i = 0, j, k; int iter; /* Iterator for a loop */ @@ -838,7 +840,7 @@ void self_knowledge(FILE *fff) /* Racial powers... */ if (p_ptr->body_monster != 0) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; if (r_ptr->flags & RF_CHAR_CLEAR || r_ptr->flags & RF_ATTR_CLEAR) diff --git a/src/traps.cc b/src/traps.cc index 067934b9..0f6c1f5d 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -2353,6 +2353,8 @@ bool_ mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr) */ bool_ mon_hit_trap_aux_scroll(int m_idx, int sval) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; int dam = 0, typ = 0; int rad = 0; @@ -2448,7 +2450,7 @@ bool_ mon_hit_trap_aux_scroll(int m_idx, int sval) break; case SV_SCROLL_GENOCIDE: { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; genocide_aux(FALSE, r_ptr->d_char); /* although there's no point in a multiple genocide trap... */ return (!(r_ptr->flags & RF_UNIQUE)); @@ -2490,6 +2492,8 @@ bool_ mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr) */ bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; int dam = 0, typ = 0; int y = m_ptr->fy; @@ -2613,7 +2617,7 @@ bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) break; case SV_POTION_LIFE: { - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; if (r_ptr->flags & RF_UNDEAD) { typ = GF_HOLY_FIRE; @@ -2645,8 +2649,10 @@ bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) */ bool_ mon_hit_trap(int m_idx) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; - monster_race *r_ptr = &r_info[m_ptr->r_idx]; + auto r_ptr = &r_info[m_ptr->r_idx]; object_type object_type_body; diff --git a/src/util.cc b/src/util.cc index 231a249f..9351dce1 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3328,13 +3328,15 @@ void strlower(char *buf) */ int test_monster_name(cptr name) { - int i; + auto const &r_info = game->edit_data.r_info; - /* Scan the monsters */ - for (i = 1; i < max_r_idx; i++) + for (std::size_t i = 0; i < r_info.size(); i++) { - monster_race *r_ptr = &r_info[i]; - if (r_ptr->name && iequals(name, r_ptr->name)) return (i); + auto r_ptr = &r_info[i]; + if (r_ptr->name && iequals(name, r_ptr->name)) + { + return (i); + } } return (0); } diff --git a/src/variable.cc b/src/variable.cc index 1f861563..a58191d5 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -452,11 +452,6 @@ ego_item_type *e_info; /* the trap-arrays */ trap_type *t_info; -/* - * The monster race arrays - */ -monster_race *r_info; - /* * The wilderness features arrays */ @@ -578,11 +573,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum number of monsters in r_info.txt - */ -u16b max_r_idx; - /* * Maximum number of items in k_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 1813b762..70c381b9 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -11,7 +11,6 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "feature_type_fwd.hpp" -#include "monster_race_fwd.hpp" #include "monster_type_fwd.hpp" #include "object_kind_fwd.hpp" #include "object_type_fwd.hpp" @@ -157,7 +156,6 @@ extern feature_type *f_info; extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; -extern monster_race *r_info; extern trap_type *t_info; extern int wildc2i[256]; extern cptr DEFAULT_FEAT_TEXT; @@ -170,7 +168,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_r_idx; extern u16b max_k_idx; extern u16b max_f_idx; extern u16b max_a_idx; diff --git a/src/wild.cc b/src/wild.cc index 5627629a..101e06f5 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -1002,10 +1002,11 @@ static void town_borders(int qy, int qx) static bool_ create_townpeople_hook(int r_idx) { - monster_race *r_ptr = &r_info[r_idx]; + auto const &r_info = game->edit_data.r_info; - if (r_ptr->d_char == 't') return TRUE; - else return FALSE; + auto r_ptr = &r_info[r_idx]; + + return (r_ptr->d_char == 't'); } diff --git a/src/wizard2.cc b/src/wizard2.cc index b2713636..575b6e72 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -1399,15 +1399,17 @@ static void do_cmd_wiz_summon(int num) * * XXX XXX XXX This function is rather dangerous */ -static void do_cmd_wiz_named(int r_idx, bool_ slp) +static void do_cmd_wiz_named(std::size_t r_idx, bool_ slp) { + auto const &r_info = game->edit_data.r_info; + int i, x, y; /* Paranoia */ /* if (!r_idx) return; */ /* Prevent illegal monsters */ - if (r_idx >= max_r_idx) return; + if (r_idx >= r_info.size()) return; /* Try 10 times */ for (i = 0; i < 10; i++) @@ -1439,15 +1441,17 @@ static void do_cmd_wiz_named(int r_idx, bool_ slp) * * XXX XXX XXX This function is rather dangerous */ -void do_cmd_wiz_named_friendly(int r_idx, bool_ slp) +void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp) { + auto const &r_info = game->edit_data.r_info; + int i, x, y; /* Paranoia */ /* if (!r_idx) return; */ /* Prevent illegal monsters */ - if (r_idx >= max_r_idx) return; + if (r_idx >= r_info.size()) return; /* Try 10 times */ for (i = 0; i < 10; i++) @@ -1500,6 +1504,8 @@ static void do_cmd_wiz_body(s16b bidx) /* Might create problems with equipment slots. For safety, be nude when calling this function */ { + auto const &r_info = game->edit_data.r_info; + p_ptr->body_monster = bidx; p_ptr->disembodied = FALSE; p_ptr->chp = maxroll( (&r_info[bidx])->hdice, (&r_info[bidx])->hside); diff --git a/src/wizard2.hpp b/src/wizard2.hpp index cec515c8..161eb26d 100644 --- a/src/wizard2.hpp +++ b/src/wizard2.hpp @@ -4,5 +4,5 @@ extern void do_cmd_rerate(void); extern void do_cmd_wiz_cure_all(void); -extern void do_cmd_wiz_named_friendly(int r_idx, bool_ slp); +extern void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp); extern void do_cmd_debug(); diff --git a/src/xtra1.cc b/src/xtra1.cc index 2829b2f6..80cbe09e 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1365,10 +1365,12 @@ static void fix_object(void) static void fix_m_list(void) { + auto const &r_info = game->edit_data.r_info; + // Mirror of the r_info array, index by index. We use a // statically allocated value to avoid frequent allocations. static auto r_total_visible = - std::vector(max_r_idx, 0); + std::vector(r_info.size(), 0); /* Scan windows */ for (std::size_t j = 0; j < 8; j++) @@ -1404,7 +1406,7 @@ static void fix_m_list(void) } /* reset visible count */ - for (std::size_t i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < r_info.size(); i++) { r_total_visible[i] = 0; } @@ -1449,7 +1451,7 @@ static void fix_m_list(void) c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0); - for (std::size_t i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < r_info.size(); i++) { auto const r_ptr = &r_info[i]; auto const total_visible = r_total_visible[i]; @@ -1667,6 +1669,8 @@ static void calc_sanity() */ static void calc_mana(void) { + auto const &r_info = game->edit_data.r_info; + int msp, levels, cur_wgt, max_wgt; levels = p_ptr->lev; @@ -1687,7 +1691,8 @@ static void calc_mana(void) /* Possessors mana is different */ if (p_ptr->body_monster && (!p_ptr->disembodied)) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; + int f = 100 / (r_ptr->freq_spell ? r_ptr->freq_spell : 1); msp = 21 - f; @@ -1845,6 +1850,7 @@ static void calc_mana(void) void calc_hitpoints(void) { auto const &player_hp = game->player_hp; + auto const &r_info = game->edit_data.r_info; /* Un-inflate "half-hitpoint bonus per level" value */ int const bonus = ((int)(adj_con_mhp[p_ptr->stat_ind[A_CON]]) - 128); @@ -1884,7 +1890,7 @@ void calc_hitpoints(void) if (p_ptr->body_monster) { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto r_ptr = &r_info[p_ptr->body_monster]; u32b rhp = maxroll(r_ptr->hdice, r_ptr->hside); /* Adjust the hp with the possession skill */ @@ -2061,15 +2067,14 @@ int weight_limit(void) void calc_wield_monster() { - object_type *o_ptr; - monster_race *r_ptr; + auto const &r_info = game->edit_data.r_info; /* Get the carried monster */ - o_ptr = &p_ptr->inventory[INVEN_CARRY]; + auto o_ptr = &p_ptr->inventory[INVEN_CARRY]; if (o_ptr->k_idx) { - r_ptr = &r_info[o_ptr->pval]; + auto r_ptr = &r_info[o_ptr->pval]; if (r_ptr->flags & RF_INVISIBLE) p_ptr->invis += 20; @@ -2090,7 +2095,9 @@ void calc_wield_monster() */ void calc_body() { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[p_ptr->body_monster]; int i, b_weapon, b_legs, b_arms; byte *body_parts, bp[BODY_MAX]; @@ -2209,10 +2216,15 @@ void calc_body() /* Should be called by every calc_bonus call */ void calc_body_bonus() { - monster_race *r_ptr = &r_info[p_ptr->body_monster]; + auto const &r_info = game->edit_data.r_info; + + auto r_ptr = &r_info[p_ptr->body_monster]; /* If in the player body nothing have to be done */ - if (!p_ptr->body_monster) return; + if (!p_ptr->body_monster) + { + return; + } if (p_ptr->disembodied) { @@ -2806,6 +2818,7 @@ static bool_ monk_empty_hands(void) void calc_bonuses(bool_ silent) { auto const &s_descriptors = game->edit_data.s_descriptors; + auto const &r_info = game->edit_data.r_info; auto &s_info = game->s_info; static bool_ monk_notify_aux = FALSE; diff --git a/src/xtra2.cc b/src/xtra2.cc index d9d9746f..482526ef 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3618,6 +3618,8 @@ static cptr look_mon_desc(int m_idx) */ static bool target_able(int m_idx) { + auto const &r_info = game->edit_data.r_info; + monster_type *m_ptr = &m_list[m_idx]; /* Monster must be alive */ @@ -3734,6 +3736,8 @@ static s16b target_pick(point p, int dy, int dx, std::vector const &point */ static bool_ target_set_accept(int y, int x) { + auto const &r_info = game->edit_data.r_info; + /* Player grid is always interesting */ if ((y == p_ptr->py) && (x == p_ptr->px)) return (TRUE); @@ -3746,7 +3750,7 @@ static bool_ target_set_accept(int y, int x) cave_type *c_ptr = &cave[y][x]; /* Visible monsters */ - if (c_ptr->m_idx && c_ptr->m_idx < max_r_idx) + if (c_ptr->m_idx && c_ptr->m_idx < static_cast(r_info.size())) { monster_type *m_ptr = &m_list[c_ptr->m_idx]; @@ -5152,7 +5156,8 @@ static void clean_wish_name(char *buf, char *name) */ void make_wish(void) { - const auto &re_info = game->edit_data.re_info; + auto const &re_info = game->edit_data.re_info; + auto const &r_info = game->edit_data.r_info; char name[200], *mname; int mstatus = MSTATUS_ENEMY; @@ -5216,9 +5221,9 @@ void make_wish(void) mname = name; } - for (std::size_t i = 1; i < max_r_idx; i++) + for (std::size_t i = 1; i < r_info.size(); i++) { - monster_race *r_ptr = &r_info[i]; + auto r_ptr = &r_info[i]; if (!r_ptr->name) continue; -- cgit v1.2.3 From b9fca0267b1d6a32d57e1fb4387f52c19d1c3fa6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move f_info into GameEditData --- lib/edit/misc.txt | 3 -- lib/mods/theme/edit/misc.txt | 3 -- src/cave.cc | 65 +++++++++++++++++++++++--------------------- src/cmd1.cc | 15 ++++++---- src/cmd2.cc | 15 +++++++--- src/cmd4.cc | 13 +++++---- src/dungeon.cc | 21 ++++++-------- src/feature_type_fwd.hpp | 3 -- src/files.cc | 16 +++++++---- src/game_edit_data.hpp | 6 ++++ src/gen_evol.cc | 3 ++ src/generate.cc | 16 ++++++++++- src/init1.cc | 22 +++++---------- src/init2.cc | 2 +- src/melee2.cc | 2 ++ src/object1.cc | 10 +++---- src/object2.cc | 2 ++ src/powers.cc | 3 ++ src/q_dragons.cc | 3 ++ src/q_evil.cc | 3 ++ src/q_fireprof.cc | 3 ++ src/q_god.cc | 2 ++ src/q_haunted.cc | 3 ++ src/q_wolves.cc | 3 ++ src/spells1.cc | 2 ++ src/spells2.cc | 24 ++++++++++++++-- src/spells3.cc | 3 ++ src/traps.cc | 9 ++++++ src/variable.cc | 10 ------- src/variable.hpp | 3 -- src/wild.cc | 4 +++ src/xtra2.cc | 3 ++ 32 files changed, 185 insertions(+), 110 deletions(-) delete mode 100644 src/feature_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 02e286b4..fb7fdbd6 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -15,9 +15,6 @@ M:Y:66 # Maximum number of items in k_info.txt M:K:819 -# Maximum number of terrain features in f_info.txt -M:F:256 - # Maximum number of artifacts in a_info.txt M:A:219 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 19077acb..47587f9e 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -15,9 +15,6 @@ M:Y:66 # Maximum number of items in k_info.txt M:K:886 -# Maximum number of terrain features in f_info.txt -M:F:249 - # Maximum number of artifacts in a_info.txt M:A:257 diff --git a/src/cave.cc b/src/cave.cc index 08482dcc..515a66d3 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -70,15 +70,15 @@ int distance(int y1, int x1, int y2, int x2) */ static bool_ is_wall(cave_type *c_ptr) { - byte feat; - + auto const &f_info = game->edit_data.f_info; /* Handle feature mimics */ - if (c_ptr->mimic) feat = c_ptr->mimic; - else feat = c_ptr->feat; + byte const feat = c_ptr->mimic + ? c_ptr->mimic + : c_ptr->feat; /* Paranoia */ - if (feat >= max_f_idx) return FALSE; + if (feat >= f_info.size()) return FALSE; /* Vanilla floors and doors aren't considered to be walls */ if (feat < FEAT_SECRET) return FALSE; @@ -850,6 +850,7 @@ static void map_info(int y, int x, byte *ap, char *cp) { auto const &st_info = game->edit_data.st_info; auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; byte a; @@ -867,20 +868,13 @@ static void map_info(int y, int x, byte *ap, char *cp) auto info = c_ptr->info; /* Feature code */ - auto feat = c_ptr->feat; - - /* Apply "mimic" field */ - if (c_ptr->mimic) - { - feat = c_ptr->mimic; - } - else - { - feat = f_info[feat].mimic; - } + auto const feat = c_ptr->mimic + ? c_ptr->mimic + : f_info[c_ptr->feat].mimic + ; /* Access floor */ - feature_type *f_ptr = &f_info[feat]; + auto f_ptr = &f_info[feat]; /**** Layer 1 -- Terrain feature ****/ @@ -1286,6 +1280,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) { auto const &st_info = game->edit_data.st_info; auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; byte a; @@ -1306,17 +1301,9 @@ void map_info_default(int y, int x, byte *ap, char *cp) auto info = c_ptr->info; /* Feature code */ - auto feat = c_ptr->feat; - - /* Apply "mimic" field */ - if (c_ptr->mimic) - { - feat = c_ptr->mimic; - } - else - { - feat = f_info[feat].mimic; - } + auto const feat = c_ptr->mimic + ? c_ptr->mimic + : f_info[c_ptr->feat].mimic; /* Access floor */ feature_type const *f_ptr = &f_info[feat]; @@ -2001,9 +1988,9 @@ static byte priority_table[][2] = */ static byte priority(byte a, char c) { - int i, p0, p1; + auto const &f_info = game->edit_data.f_info; - feature_type *f_ptr; + int i, p0, p1; /* Scan the table */ for (i = 0; TRUE; i++) @@ -2018,7 +2005,7 @@ static byte priority(byte a, char c) p0 = priority_table[i][0]; /* Access the feature */ - f_ptr = &f_info[p0]; + auto f_ptr = &f_info[p0]; /* Check character and attribute, accept matches */ if ((f_ptr->x_char == c) && (f_ptr->x_attr == a)) return (p1); @@ -3566,6 +3553,8 @@ void forget_mon_lite(void) */ void update_mon_lite(void) { + auto const &f_info = game->edit_data.f_info; + int i, y, x, d; int fy, fx; @@ -4590,6 +4579,8 @@ bool cave_floor_bold(int y, int x) */ bool cave_floor_grid(cave_type const *c) { + auto const &f_info = game->edit_data.f_info; + return (f_info[c->feat].flags & FF_FLOOR) && (c->feat != FEAT_MON_TRAP); } @@ -4609,6 +4600,8 @@ bool cave_plain_floor_bold(int y, int x) */ bool cave_plain_floor_grid(cave_type const *c) { + auto const &f_info = game->edit_data.f_info; + return (f_info[c->feat].flags & FF_FLOOR) && !(f_info[c->feat].flags & FF_REMEMBER); @@ -4635,6 +4628,8 @@ bool cave_sight_bold(int y, int x) bool cave_sight_grid(cave_type const *c) { + auto const &f_info = game->edit_data.f_info; + return !(f_info[c->feat].flags & FF_NO_VISION); } @@ -4649,6 +4644,8 @@ bool cave_sight_grid(cave_type const *c) */ bool cave_clean_bold(int y, int x) { + auto const &f_info = game->edit_data.f_info; + return (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && @@ -4681,6 +4678,8 @@ bool cave_empty_bold(int y, int x) */ bool cave_naked_bold(int y, int x) { + auto const &f_info = game->edit_data.f_info; + return (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && @@ -4691,6 +4690,8 @@ bool cave_naked_bold(int y, int x) bool cave_naked_bold2(int y, int x) { + auto const &f_info = game->edit_data.f_info; + return (f_info[cave[y][x].feat].flags & FF_FLOOR) && (cave[y][x].feat != FEAT_MON_TRAP) && @@ -4709,6 +4710,8 @@ bool cave_perma_bold(int y, int x) bool cave_perma_grid(cave_type const *c) { + auto const &f_info = game->edit_data.f_info; + return bool(f_info[c->feat].flags & FF_PERMANENT); } diff --git a/src/cmd1.cc b/src/cmd1.cc index 87ef7a6c..726916c4 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -2543,6 +2543,7 @@ void py_attack(int y, int x, int max_blow) bool_ player_can_enter(byte feature) { auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; bool_ pass_wall; @@ -2737,6 +2738,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; int y, x, tmp; @@ -3020,11 +3022,10 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Wall (or secret door) */ else { - int feat; - - if (c_ptr->mimic) feat = c_ptr->mimic; - else - feat = f_info[c_ptr->feat].mimic; + int const feat = c_ptr->mimic + ? c_ptr->mimic + : f_info[c_ptr->feat].mimic + ; msg_format("You feel %s.", f_info[feat].block); c_ptr->info |= (CAVE_MARK); @@ -3271,6 +3272,8 @@ void move_player(int dir, int do_pickup, bool_ disarm) */ static int see_obstacle_grid(cave_type *c_ptr) { + auto const &f_info = game->edit_data.f_info; + /* * Hack -- Avoid hitting detected traps, because we cannot rely on * the CAVE_MARK check below, and traps can be set to nearly @@ -3630,6 +3633,8 @@ static void run_init(int dir) */ static bool_ run_test(void) { + auto const &f_info = game->edit_data.f_info; + int prev_dir, new_dir, check_dir = 0; int row, col; diff --git a/src/cmd2.cc b/src/cmd2.cc index 9afcb7b4..8b409f6b 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -1394,6 +1394,8 @@ void do_cmd_close(void) */ static bool_ do_cmd_tunnel_test(int y, int x) { + auto const &f_info = game->edit_data.f_info; + /* Must have knowledge(execpt on "forget" levels) */ if (!(cave[y][x].info & (CAVE_MARK))) { @@ -1475,11 +1477,12 @@ static bool_ twall(int y, int x, byte feat) static bool_ do_cmd_tunnel_aux(int y, int x, int dir) { auto const &d_info = game->edit_data.d_info; + auto const &f_info = game->edit_data.f_info; int skill_req = 0, skill_req_1pct = 0; cave_type *c_ptr = &cave[y][x]; - feature_type *f_ptr = &f_info[c_ptr->feat]; + auto f_ptr = &f_info[c_ptr->feat]; bool_ more = FALSE; @@ -1920,9 +1923,9 @@ static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) */ static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) { - int i, j, power; + auto const &f_info = game->edit_data.f_info; - cave_type *c_ptr; + int i, j, power; cptr name; @@ -1933,7 +1936,7 @@ static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) energy_use = 100; /* Get grid and contents */ - c_ptr = &cave[y][x]; + auto c_ptr = &cave[y][x]; /* Access trap name */ if (t_info[c_ptr->t_idx].ident) @@ -2353,6 +2356,8 @@ void do_cmd_bash(void) */ void do_cmd_alter(void) { + auto const &f_info = game->edit_data.f_info; + int y, x, dir; cave_type *c_ptr; @@ -2890,6 +2895,8 @@ void do_cmd_stay(int pickup) */ void do_cmd_rest(void) { + auto const &f_info = game->edit_data.f_info; + /* Can't rest on a Void Jumpgate -- too dangerous */ if (cave[p_ptr->py][p_ptr->px].feat == FEAT_BETWEEN) { diff --git a/src/cmd4.cc b/src/cmd4.cc index 85ed490d..e030d452 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -2015,6 +2015,7 @@ void do_cmd_macros(void) void do_cmd_visuals(void) { auto &r_info = game->edit_data.r_info; + auto &f_info = game->edit_data.f_info; int i; @@ -2219,9 +2220,9 @@ void do_cmd_visuals(void) fprintf(fff, "# Feature attr/char definitions\n\n"); /* Dump features */ - for (i = 0; i < max_f_idx; i++) + for (std::size_t f_idx = 0; f_idx < f_info.size(); f_idx++) { - feature_type *f_ptr = &f_info[i]; + auto f_ptr = &f_info[f_idx]; /* Skip non-entries */ if (!f_ptr->name) continue; @@ -2230,7 +2231,7 @@ void do_cmd_visuals(void) fprintf(fff, "# %s\n", f_ptr->name); /* Dump the feature attr/char info */ - fprintf(fff, "F:%d:0x%02X:0x%02X\n\n", i, + fprintf(fff, "F:%zu:0x%02X:0x%02X\n\n", f_idx, (byte)(f_ptr->x_attr), (byte)(f_ptr->x_char)); } @@ -2365,7 +2366,7 @@ void do_cmd_visuals(void) /* Hack -- query until done */ while (1) { - feature_type *f_ptr = &f_info[f]; + auto f_ptr = &f_info[f]; byte da = f_ptr->d_attr; char dc = f_ptr->d_char; @@ -2400,8 +2401,8 @@ void do_cmd_visuals(void) if (i == ESCAPE) break; /* Analyze */ - if (i == 'n') f = (f + max_f_idx + 1) % max_f_idx; - if (i == 'N') f = (f + max_f_idx - 1) % max_f_idx; + if (i == 'n') f = (f + f_info.size() + 1) % f_info.size(); + if (i == 'N') f = (f + f_info.size() - 1) % f_info.size(); if (i == 'a') f_info[f].x_attr = (ca + 1); if (i == 'A') f_info[f].x_attr = (ca - 1); if (i == 'c') f_info[f].x_char = (cc + 1); diff --git a/src/dungeon.cc b/src/dungeon.cc index c044021f..96ac89cb 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -898,9 +898,11 @@ static void check_music() */ static void apply_effect(int y, int x) { + auto const &f_info = game->edit_data.f_info; + cave_type *c_ptr = &cave[y][x]; - feature_type *f_ptr = &f_info[c_ptr->feat]; + auto f_ptr = &f_info[c_ptr->feat]; if (f_ptr->d_frequency[0] != 0) @@ -1219,6 +1221,7 @@ static void process_world(void) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; timer_type *t_ptr; @@ -4186,6 +4189,8 @@ static void process_command(void) */ static void process_player(void) { + auto const &f_info = game->edit_data.f_info; + int i, j; int speed_use; @@ -4530,17 +4535,9 @@ static void process_player(void) for (i = panel_col_min; i <= panel_col_max; i++) { cave_type *c_ptr = &cave[j][i]; - feature_type *f_ptr; - - /* Apply terrain feature mimics */ - if (c_ptr->mimic) - { - f_ptr = &f_info[c_ptr->mimic]; - } - else - { - f_ptr = &f_info[f_info[c_ptr->feat].mimic]; - } + auto f_ptr = c_ptr->mimic + ? &f_info[c_ptr->mimic] + : &f_info[f_info[c_ptr->feat].mimic]; /* Skip normal features */ if (!(f_ptr->flags & FF_ATTR_MULTI)) diff --git a/src/feature_type_fwd.hpp b/src/feature_type_fwd.hpp deleted file mode 100644 index 168ec6c7..00000000 --- a/src/feature_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct feature_type; diff --git a/src/files.cc b/src/files.cc index cfd80362..42d1bed3 100644 --- a/src/files.cc +++ b/src/files.cc @@ -220,6 +220,7 @@ errr process_pref_file_aux(char *buf) auto &st_info = game->edit_data.st_info; auto &re_info = game->edit_data.re_info; auto &r_info = game->edit_data.r_info; + auto &f_info = game->edit_data.f_info; int i, j, n1, n2; @@ -377,13 +378,18 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 2, 3, zz, ':', '/') == 3) { - feature_type *f_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t f_idx = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_f_idx) return (1); - f_ptr = &f_info[i]; - if (n1) f_ptr->x_attr = n1; + + if (f_idx >= f_info.size()) return (1); + + auto f_ptr = &f_info[f_idx]; + + if (n1) + { + f_ptr->x_attr = n1; + } if (n2) { f_ptr->x_char = n2; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 16a97da7..6adb3804 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -2,6 +2,7 @@ #include "ability_type.hpp" #include "dungeon_info_type.hpp" +#include "feature_type.hpp" #include "hist_type.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" @@ -102,6 +103,11 @@ struct GameEditData { */ std::vector re_info; + /* + * Terrain features + */ + std::vector f_info; + /** * Wilderness features */ diff --git a/src/gen_evol.cc b/src/gen_evol.cc index 889e7a01..7dca5b9a 100644 --- a/src/gen_evol.cc +++ b/src/gen_evol.cc @@ -12,6 +12,7 @@ #include "cave_type.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "generate.hpp" #include "levels.hpp" #include "player_type.hpp" @@ -23,6 +24,8 @@ */ void evolve_level(bool_ noise) { + auto const &f_info = game->edit_data.f_info; + int i, j; int cw = 0, cf = 0; diff --git a/src/generate.cc b/src/generate.cc index 9bd01010..6612a888 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -478,6 +478,8 @@ static bool_ is_safe_floor(int y, int x) */ void place_new_way(int *y, int *x) { + auto const &f_info = game->edit_data.f_info; + int xx, yy; int x0, x1, x2; int y0, y1, y2; @@ -784,7 +786,9 @@ bool_ new_player_spot(int branch) */ static int next_to_walls(int y, int x) { - int k = 0; + auto const &f_info = game->edit_data.f_info; + + int k = 0; if (f_info[cave[y + 1][x].feat].flags & FF_WALL) k++; if (f_info[cave[y - 1][x].feat].flags & FF_WALL) k++; @@ -1506,6 +1510,8 @@ static void build_streamer(int feat, int chance) */ static void build_streamer2(int feat, int killwall) { + auto const &f_info = game->edit_data.f_info; + int i, j, mid, tx, ty; int y, x, dir; int poolchance; @@ -1723,6 +1729,8 @@ static void destroy_level(void) */ static bool_ get_is_floor(int x, int y) { + auto const &f_info = game->edit_data.f_info; + /* Out of bounds */ if (!in_bounds(y, x)) return (FALSE); @@ -4298,6 +4306,8 @@ static void fill_hack(int y0, int x0, int y, int x, int xsize, int ysize, bool_ generate_fracave(int y0, int x0, int xsize, int ysize, int cutoff, bool_ light, bool_ room) { + auto const &f_info = game->edit_data.f_info; + int x, y, i, amount, xhsize, yhsize; cave_type *c_ptr; @@ -6467,6 +6477,8 @@ static int next_to_corr(int y1, int x1) */ static bool_ possible_doorway(int y, int x) { + auto const &f_info = game->edit_data.f_info; + /* Count the adjacent corridors */ if (next_to_corr(y, x) >= 2) { @@ -6495,6 +6507,8 @@ static bool_ possible_doorway(int y, int x) */ static void try_doors(int y, int x) { + auto const &f_info = game->edit_data.f_info; + bool_ dir_ok[4]; int i, k, n; int yy, xx; diff --git a/src/init1.cc b/src/init1.cc index 3dcee907..d2fef6a9 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2056,9 +2056,9 @@ static int grab_one_feature_flag(cptr what, feature_flag_set *flags) */ errr init_f_info_txt(FILE *fp) { - int i; + auto &f_info = game->edit_data.f_info; + char buf[1024]; - char *s; /* Current entry */ feature_type *f_ptr = NULL; @@ -2085,7 +2085,7 @@ errr init_f_info_txt(FILE *fp) if (buf[0] == 'N') { /* Find the colon before the name */ - s = strchr(buf + 2, ':'); + char *s = strchr(buf + 2, ':'); /* Verify that colon */ if (!s) return (1); @@ -2097,19 +2097,16 @@ errr init_f_info_txt(FILE *fp) if (!*s) return (1); /* Get the index */ - i = atoi(buf + 2); + int i = atoi(buf + 2); /* Verify information */ if (i <= error_idx) return (4); - /* Verify information */ - if (i >= max_f_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - f_ptr = &f_info[i]; + f_ptr = &expand_to_fit_index(f_info, i); /* Copy name */ assert(!f_ptr->name); @@ -2133,7 +2130,7 @@ errr init_f_info_txt(FILE *fp) if (buf[0] == 'D') { /* Acquire the text */ - s = buf + 4; + const char *s = buf + 4; switch (buf[2]) { @@ -2226,6 +2223,7 @@ errr init_f_info_txt(FILE *fp) { int side, dice, freq, type; cptr tmp; + int i; /* Find the next empty blow slot (if any) */ for (i = 0; i < 4; i++) if ((!f_ptr->d_side[i]) && @@ -6785,12 +6783,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_k_idx = atoi(zz[1]); } - /* Maximum f_idx */ - else if (zz[0][0] == 'F') - { - max_f_idx = atoi(zz[1]); - } - /* Maximum a_idx */ else if (zz[0][0] == 'A') { diff --git a/src/init2.cc b/src/init2.cc index 79b5a0a3..950badc3 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -277,7 +277,7 @@ namespace { static void allocate() { - f_info = new feature_type[max_f_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/melee2.cc b/src/melee2.cc index d1fc3767..415fd478 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -5254,6 +5254,8 @@ static bool_ player_invis(monster_type * m_ptr) */ static void process_monster(int m_idx, bool_ is_frien) { + auto const &f_info = game->edit_data.f_info; + int i, d, oy, ox, ny, nx; int mm[8]; diff --git a/src/object1.cc b/src/object1.cc index 466488fe..c10a52f9 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -637,17 +637,15 @@ void reset_visuals(void) auto &race_mod_info = game->edit_data.race_mod_info; auto &re_info = game->edit_data.re_info; auto &r_info = game->edit_data.r_info; + auto &f_info = game->edit_data.f_info; int i; /* Extract some info about terrain features */ - for (i = 0; i < max_f_idx; i++) + for (auto &f_ref: f_info) { - feature_type *f_ptr = &f_info[i]; - - /* Assume we will use the underlying values */ - f_ptr->x_attr = f_ptr->d_attr; - f_ptr->x_char = f_ptr->d_char; + f_ref.x_attr = f_ref.d_attr; + f_ref.x_char = f_ref.d_char; } /* Extract default attr/char code for stores */ diff --git a/src/object2.cc b/src/object2.cc index eb0a66e8..901bb854 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -5078,6 +5078,8 @@ void place_gold(int y, int x) */ s16b drop_near(object_type *j_ptr, int chance, int y, int x) { + auto const &f_info = game->edit_data.f_info; + int i, k, d, s; int bs, bn; diff --git a/src/powers.cc b/src/powers.cc index 0c01a0e6..88292e21 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -17,6 +17,7 @@ #include "feature_flag.hpp" #include "feature_type.hpp" #include "files.hpp" +#include "game.hpp" #include "hooks.hpp" #include "mimic.hpp" #include "monster2.hpp" @@ -129,6 +130,8 @@ static bool_ power_chance(power_type *x_ptr) static void power_activate(int power) { + auto const &f_info = game->edit_data.f_info; + s16b plev = p_ptr->lev; char ch = 0; int amber_power = 0; diff --git a/src/q_dragons.cc b/src/q_dragons.cc index 2c3faa69..1ed5a97b 100644 --- a/src/q_dragons.cc +++ b/src/q_dragons.cc @@ -5,6 +5,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -20,6 +21,8 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) { + auto const &f_info = game->edit_data.f_info; + int x, y, i; int xstart = 2; int ystart = 2; diff --git a/src/q_evil.cc b/src/q_evil.cc index cadaa171..21d608e7 100644 --- a/src/q_evil.cc +++ b/src/q_evil.cc @@ -5,6 +5,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -20,6 +21,8 @@ static bool_ quest_evil_gen_hook(void *, void *, void *) { + auto const &f_info = game->edit_data.f_info; + int x, y, i; int xstart = 2; int ystart = 2; diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 207f306f..03190889 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -4,6 +4,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_get_in.hpp" #include "hooks.hpp" #include "lua_bind.hpp" @@ -470,6 +471,8 @@ std::string quest_fireproof_describe() static bool_ fireproof_gen_hook(void *, void *, void *) { + auto const &f_info = game->edit_data.f_info; + fireproof_settings const *settings = fireproof_get_settings(); /* Only if player doing this quest */ diff --git a/src/q_god.cc b/src/q_god.cc index 38b911b7..79a25232 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -361,6 +361,8 @@ static void quest_god_place_rand_dung() static void quest_god_generate_relic() { + auto const &f_info = game->edit_data.f_info; + int tries = 1000, x = -1, y = -1; object_type relic; diff --git a/src/q_haunted.cc b/src/q_haunted.cc index 902778fc..df90435c 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -5,6 +5,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -21,6 +22,8 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) { + auto const &f_info = game->edit_data.f_info; + int x, y, i, m_idx; int xstart = 2; int ystart = 2; diff --git a/src/q_wolves.cc b/src/q_wolves.cc index 3d83f414..637003dc 100644 --- a/src/q_wolves.cc +++ b/src/q_wolves.cc @@ -5,6 +5,7 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" #include "init1.hpp" @@ -21,6 +22,8 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) { + auto const &f_info = game->edit_data.f_info; + int x, y, i; int xstart = 2; int ystart = 2; diff --git a/src/spells1.cc b/src/spells1.cc index ed10c525..c11be30b 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -2906,6 +2906,7 @@ static int project_m_y; static bool_ project_f(int who, int r, int y, int x, int dam, int typ) { cave_type *c_ptr = &cave[y][x]; + auto const &f_info = game->edit_data.f_info; bool_ obvious = FALSE; @@ -6913,6 +6914,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0; diff --git a/src/spells2.cc b/src/spells2.cc index 1cd03430..f918a970 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -97,6 +97,8 @@ void grow_things(s16b type, int rad) */ void grow_trees(int rad) { + auto const &f_info = game->edit_data.f_info; + int a, i, j; for (a = 0; a < rad * rad + 11; a++) @@ -119,6 +121,8 @@ void grow_trees(int rad) */ void grow_grass(int rad) { + auto const &f_info = game->edit_data.f_info; + int a, i, j; for (a = 0; a < rad * rad + 11; a++) @@ -5457,6 +5461,8 @@ bool_ trap_creation(void) bool_ wall_stone(int y, int x) { + auto const &f_info = game->edit_data.f_info; + cave_type *c_ptr = &cave[y][x]; int flg = PROJECT_GRID | PROJECT_ITEM; auto const featflags = f_info[c_ptr->feat].flags; @@ -5993,7 +5999,14 @@ bool_ heal_insanity(int val) */ bool_ passwall(int dir, bool_ safe) { - int x = p_ptr->px, y = p_ptr->py, ox = p_ptr->px, oy = p_ptr->py, lx = p_ptr->px, ly = p_ptr->py; + auto const &f_info = game->edit_data.f_info; + + int x = p_ptr->px; + int y = p_ptr->py; + int ox = p_ptr->px; + int oy = p_ptr->py; + int lx = p_ptr->px; + int ly = p_ptr->py; cave_type *c_ptr; bool_ ok = FALSE; @@ -6305,6 +6318,8 @@ bool_ reset_recall(bool_ no_trepas_max_depth) */ void create_between_gate(int dist, int y, int x) { + auto const &f_info = game->edit_data.f_info; + int ii, ij, plev = get_skill(SKILL_CONVEYANCE); if (dungeon_flags & DF_NO_TELEPORT) @@ -6408,6 +6423,8 @@ static int rotate_dir(int dir, int mov) void geomancy_random_wall(int y, int x) { + auto const &f_info = game->edit_data.f_info; + #define TABLE_SIZE 4 cave_type *c_ptr = &cave[y][x]; int feat = -1; @@ -6422,7 +6439,8 @@ void geomancy_random_wall(int y, int x) }; /* Do not destroy permanent things */ - if (f_info[c_ptr->feat].flags & FF_PERMANENT) { + if (f_info[c_ptr->feat].flags & FF_PERMANENT) + { return; } @@ -6437,6 +6455,8 @@ void geomancy_random_wall(int y, int x) void geomancy_random_floor(int y, int x, bool_ kill_wall) { + auto const &f_info = game->edit_data.f_info; + #define TABLE_SIZE 9 cave_type *c_ptr = &cave[y][x]; int feat = -1; diff --git a/src/spells3.cc b/src/spells3.cc index 68b3a2f0..276cfeec 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -5,6 +5,7 @@ #include "cmd5.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" +#include "game.hpp" #include "lua_bind.hpp" #include "mimic.hpp" #include "monster2.hpp" @@ -2726,6 +2727,8 @@ const char *mind_stun_info() casting_result tempo_magelock() { + auto const &f_info = game->edit_data.f_info; + if (get_level_s(MAGELOCK, 50) >= 30) { int x,y; diff --git a/src/traps.cc b/src/traps.cc index 0f6c1f5d..f5abe202 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -104,6 +104,8 @@ bool_ do_player_trap_call_out(void) static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x) { + auto const &f_info = game->edit_data.f_info; + bool_ ident = FALSE; char o_name[80]; @@ -166,6 +168,8 @@ static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x) */ static bool_ player_handle_trap_of_walls(void) { + auto const &f_info = game->edit_data.f_info; + bool_ ident; s16b dx, dy, cx, cy; @@ -1899,6 +1903,8 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) void player_activate_door_trap(s16b y, s16b x) { + auto const &f_info = game->edit_data.f_info; + cave_type *c_ptr; bool_ ident = FALSE; @@ -1936,6 +1942,7 @@ void player_activate_door_trap(s16b y, s16b x) void place_trap(int y, int x) { auto const &d_info = game->edit_data.d_info; + auto const &f_info = game->edit_data.f_info; s16b trap; trap_type *t_ptr; @@ -2055,6 +2062,8 @@ void place_trap_object(object_type *o_ptr) /* Dangerous trap placing function */ void wiz_place_trap(int y, int x, int idx) { + auto const &f_info = game->edit_data.f_info; + cave_type *c_ptr = &cave[y][x]; /* Dangerous enough as it is... */ diff --git a/src/variable.cc b/src/variable.cc index a58191d5..f8be6224 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -428,11 +428,6 @@ player_class const *cp_ptr; player_spec const *spp_ptr; -/* - * The terrain feature arrays - */ -feature_type *f_info; - /* * The object kind arrays */ @@ -578,11 +573,6 @@ s32b get_level_use_stick = -1; */ u16b max_k_idx; -/* - * Maximum number of terrain features in f_info.txt - */ -u16b max_f_idx; - /* * Maximum number of artifacts in a_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 70c381b9..9daaf3d9 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -10,7 +10,6 @@ #include "effect_type.hpp" #include "ego_item_type_fwd.hpp" #include "fate.hpp" -#include "feature_type_fwd.hpp" #include "monster_type_fwd.hpp" #include "object_kind_fwd.hpp" #include "object_type_fwd.hpp" @@ -152,7 +151,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern feature_type *f_info; extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; @@ -169,7 +167,6 @@ extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); extern u16b max_k_idx; -extern u16b max_f_idx; extern u16b max_a_idx; extern u16b max_e_idx; extern u16b max_o_idx; diff --git a/src/wild.cc b/src/wild.cc index 101e06f5..fd9ed6fd 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -376,6 +376,8 @@ namespace { */ void wilderness_gen() { + auto const &f_info = game->edit_data.f_info; + int i, y, x, hack_floor; bool_ daytime; int xstart = 0; @@ -942,6 +944,8 @@ static std::vector get_shops() /* Generate town borders */ static void set_border(int y, int x) { + auto const &f_info = game->edit_data.f_info; + cave_type *c_ptr; /* Paranoia */ diff --git a/src/xtra2.cc b/src/xtra2.cc index 482526ef..af25e906 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2403,6 +2403,7 @@ static void monster_death_gods(int m_idx, monster_type *m_ptr) void monster_death(int m_idx) { auto const &d_info = game->edit_data.d_info; + auto const &f_info = game->edit_data.f_info; monster_type *m_ptr = &m_list[m_idx]; @@ -3737,6 +3738,7 @@ static s16b target_pick(point p, int dy, int dx, std::vector const &point static bool_ target_set_accept(int y, int x) { auto const &r_info = game->edit_data.r_info; + auto const &f_info = game->edit_data.f_info; /* Player grid is always interesting */ if ((y == p_ptr->py) && (x == p_ptr->px)) return (TRUE); @@ -3897,6 +3899,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const &d_info = game->edit_data.d_info; auto const &st_info = game->edit_data.st_info; auto const &wf_info = game->edit_data.wf_info; + auto const &f_info = game->edit_data.f_info; cave_type *c_ptr = &cave[y][x]; -- cgit v1.2.3 From 1bbed63b66c0f69809e698576a51501150f06bba Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move k_info into GameEditData --- lib/edit/misc.txt | 3 -- lib/mods/theme/edit/misc.txt | 3 -- src/birth.cc | 11 +++--- src/cave.cc | 6 +++- src/cmd2.cc | 4 +++ src/cmd3.cc | 2 ++ src/cmd4.cc | 36 ++++++++++--------- src/cmd6.cc | 22 ++++++++---- src/cmd7.cc | 4 +++ src/dungeon.cc | 11 ++++-- src/files.cc | 44 +++++++++++++++-------- src/game_edit_data.hpp | 6 ++++ src/generate.cc | 20 ++++++++--- src/init1.cc | 13 ++----- src/init2.cc | 31 ++++++++--------- src/loadsave.cc | 8 +++-- src/monster2.cc | 8 ++++- src/object1.cc | 70 +++++++++++++++++++++++-------------- src/object2.cc | 83 +++++++++++++++++++++++++++++++++----------- src/object_kind_fwd.hpp | 3 -- src/powers.cc | 1 + src/q_rand.cc | 2 ++ src/spells1.cc | 5 ++- src/spells2.cc | 2 ++ src/spells3.cc | 4 ++- src/squelch/condition.cc | 5 +-- src/squeltch.cc | 3 ++ src/store.cc | 5 ++- src/traps.cc | 3 +- src/util.cc | 18 +++++----- src/variable.cc | 10 ------ src/variable.hpp | 3 -- src/wizard2.cc | 59 ++++++++++++++++--------------- src/xtra1.cc | 5 +-- src/xtra2.cc | 7 ++-- 35 files changed, 323 insertions(+), 197 deletions(-) delete mode 100644 src/object_kind_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index fb7fdbd6..81f2977f 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of items in k_info.txt -M:K:819 - # Maximum number of artifacts in a_info.txt M:A:219 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 47587f9e..bd3d21ef 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of items in k_info.txt -M:K:886 - # Maximum number of artifacts in a_info.txt M:A:257 diff --git a/src/birth.cc b/src/birth.cc index 083fe06c..65f6389e 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -721,6 +721,7 @@ static void player_wipe(void) { auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; + auto &k_info = game->edit_data.k_info; /* Wipe special levels */ wipe_saved(); @@ -790,18 +791,16 @@ static void player_wipe(void) } /* Reset the "objects" */ - for (std::size_t i = 1; i < max_k_idx; i++) + for (auto &k_ref: k_info) { - object_kind *k_ptr = &k_info[i]; - /* Reset "tried" */ - k_ptr->tried = FALSE; + k_ref.tried = FALSE; /* Reset "aware" */ - k_ptr->aware = FALSE; + k_ref.aware = FALSE; /* Reset "artifact" */ - k_ptr->artifact = 0; + k_ref.artifact = 0; } diff --git a/src/cave.cc b/src/cave.cc index 515a66d3..bb15055b 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -437,6 +437,8 @@ static void image_monster(byte *ap, char *cp) */ static void image_object(byte *ap, char *cp) { + auto const &k_info = game->edit_data.k_info; + // Cached state which keeps a list of the "live" object_kind entries. static std::vector *instance = nullptr; @@ -446,7 +448,7 @@ static void image_object(byte *ap, char *cp) // Create the list of "live" indexes instance = new std::vector(); // Filter all the "live" entries - for (size_t i = 0; i < max_k_idx; i++) + for (size_t i = 0; i < k_info.size(); i++) { if (k_info[i].name) { @@ -851,6 +853,7 @@ static void map_info(int y, int x, byte *ap, char *cp) auto const &st_info = game->edit_data.st_info; auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; + auto const &k_info = game->edit_data.k_info; byte a; @@ -1281,6 +1284,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) auto const &st_info = game->edit_data.st_info; auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; + auto const &k_info = game->edit_data.k_info; byte a; diff --git a/src/cmd2.cc b/src/cmd2.cc index 8b409f6b..3bd10c7b 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -3558,6 +3558,8 @@ void do_cmd_fire(void) */ void do_cmd_throw(void) { + auto const &k_info = game->edit_data.k_info; + int dir; s32b special = 0; @@ -3932,6 +3934,8 @@ void do_cmd_throw(void) */ void do_cmd_boomerang(void) { + auto const &k_info = game->edit_data.k_info; + int dir; int j, y, x, ny, nx, ty, tx; diff --git a/src/cmd3.cc b/src/cmd3.cc index d65087f8..0010a6ea 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -557,6 +557,8 @@ void do_cmd_drop(void) */ void do_cmd_destroy(void) { + auto const &k_info = game->edit_data.k_info; + int old_number; bool_ force = FALSE; diff --git a/src/cmd4.cc b/src/cmd4.cc index e030d452..4ebb73d0 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -2016,6 +2016,7 @@ void do_cmd_visuals(void) { auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; + auto &k_info = game->edit_data.k_info; int i; @@ -2166,9 +2167,9 @@ void do_cmd_visuals(void) fprintf(fff, "# Object attr/char definitions\n\n"); /* Dump objects */ - for (i = 0; i < max_k_idx; i++) + for (std::size_t k = 0; k < k_info.size(); k++) { - object_kind *k_ptr = &k_info[i]; + object_kind *k_ptr = &k_info[k]; /* Skip non-entries */ if (!k_ptr->name) continue; @@ -2177,7 +2178,7 @@ void do_cmd_visuals(void) fprintf(fff, "# %s\n", k_ptr->name); /* Dump the object attr/char info */ - fprintf(fff, "K:%d:0x%02X:0x%02X\n\n", i, + fprintf(fff, "K:%zu:0x%02X:0x%02X\n\n", k, (byte)(k_ptr->x_attr), (byte)(k_ptr->x_char)); } @@ -2346,8 +2347,8 @@ void do_cmd_visuals(void) if (i == ESCAPE) break; /* Analyze */ - if (i == 'n') k = (k + max_k_idx + 1) % max_k_idx; - if (i == 'N') k = (k + max_k_idx - 1) % max_k_idx; + if (i == 'n') k = (k + k_info.size() + 1) % k_info.size(); + if (i == 'N') k = (k + k_info.size() - 1) % k_info.size(); if (i == 'a') k_info[k].x_attr = (ca + 1); if (i == 'A') k_info[k].x_attr = (ca - 1); if (i == 'c') k_info[k].x_char = (cc + 1); @@ -3023,13 +3024,15 @@ void do_cmd_save_screen(void) */ void do_cmd_knowledge_artifacts(void) { - int i, k, z, x, y; + auto const &k_info = game->edit_data.k_info; + + int i, z, x, y; char base_name[80]; /* Scan the artifacts */ std::unique_ptr okay(new bool_[max_a_idx]); - for (k = 0; k < max_a_idx; k++) + for (std::size_t k = 0; k < max_a_idx; k++) { artifact_type *a_ptr = &a_info[k]; @@ -3046,13 +3049,10 @@ void do_cmd_knowledge_artifacts(void) okay[k] = TRUE; } - std::unique_ptr okayk(new bool_[max_k_idx]); - for (k = 0; k < max_k_idx; k++) + std::vector okayk(k_info.size(), FALSE); + for (std::size_t k = 0; k < k_info.size(); k++) { - object_kind *k_ptr = &k_info[k]; - - /* Default */ - okayk[k] = FALSE; + auto k_ptr = &k_info[k]; /* Skip "empty" artifacts */ if (!(k_ptr->flags & TR_NORM_ART)) continue; @@ -3163,7 +3163,7 @@ void do_cmd_knowledge_artifacts(void) fmt::MemoryWriter w; /* Scan the artifacts */ - for (k = 0; k < max_a_idx; k++) + for (std::size_t k = 0; k < max_a_idx; k++) { artifact_type *a_ptr = &a_info[k]; @@ -3206,7 +3206,7 @@ void do_cmd_knowledge_artifacts(void) w.write(" The {}\n", base_name); } - for (k = 0; k < max_k_idx; k++) + for (std::size_t k = 0; k < k_info.size(); k++) { /* List "dead" ones */ if (!okayk[k]) continue; @@ -3598,12 +3598,14 @@ static void do_cmd_knowledge_kill_count(void) */ static void do_cmd_knowledge_objects(void) { + auto const &k_info = game->edit_data.k_info; + fmt::MemoryWriter w; /* Scan the object kinds */ - for (int k = 1; k < max_k_idx; k++) + for (std::size_t k = 1; k < k_info.size(); k++) { - object_kind *k_ptr = &k_info[k]; + auto k_ptr = &k_info[k]; /* Hack -- skip artifacts */ if (k_ptr->flags & (TR_INSTA_ART)) continue; diff --git a/src/cmd6.cc b/src/cmd6.cc index 630f1e0e..56dd5cab 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -983,6 +983,7 @@ static object_filter_t const &item_tester_hook_eatable() void do_cmd_eat_food(void) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; int ident, lev, fval = 0; @@ -2497,6 +2498,8 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) */ void do_cmd_quaff_potion(void) { + auto const &k_info = game->edit_data.k_info; + int ident, lev; /* Get an item */ @@ -2653,14 +2656,14 @@ static void do_cmd_fill_bottle(void) */ void do_cmd_drink_fountain(void) { + auto const &k_info = game->edit_data.k_info; + cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px]; bool_ ident; int tval, sval, pval = 0; - int i; - char ch; @@ -2697,9 +2700,9 @@ void do_cmd_drink_fountain(void) sval = c_ptr->special - SV_POTION_LAST; } - for (i = 0; i < max_k_idx; i++) + for (auto const &k_ref: k_info) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_ref; if (k_ptr->tval != tval) continue; if (k_ptr->sval != sval) continue; @@ -2873,6 +2876,7 @@ static object_filter_t const &item_tester_hook_readable() void do_cmd_read_scroll(void) { auto const &d_info = game->edit_data.d_info; + auto const &k_info = game->edit_data.k_info; auto &r_info = game->edit_data.r_info; /* Check some conditions */ @@ -4077,14 +4081,14 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item) */ void do_cmd_zap_rod(void) { + auto const &k_info = game->edit_data.k_info; + int item, ident, chance, dir, lev; int cost; bool_ require_dir; - object_kind *tip_ptr; - /* Hack -- let perception get aborted */ bool_ use_charge = TRUE; @@ -4176,7 +4180,7 @@ void do_cmd_zap_rod(void) ident = FALSE; /* Extract the item level */ - tip_ptr = &k_info[lookup_kind(TV_ROD, o_ptr->pval)]; + auto tip_ptr = &k_info[lookup_kind(TV_ROD, o_ptr->pval)]; lev = k_info[lookup_kind(TV_ROD, o_ptr->pval)].level; /* Base chance of success */ @@ -4846,6 +4850,8 @@ static void activate_valaroma() */ void do_cmd_activate(void) { + auto const &k_info = game->edit_data.k_info; + int item, lev, chance; char ch, spell_choice; @@ -5068,6 +5074,8 @@ void do_cmd_activate(void) const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { + auto const &k_info = game->edit_data.k_info; + int plev = get_skill(SKILL_DEVICE); int i = 0, ii = 0, ij = 0, k, dir, dummy = 0; diff --git a/src/cmd7.cc b/src/cmd7.cc index db496995..85da374c 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -110,6 +110,8 @@ void mindcraft_info(char *p, int power) */ void mimic_info(char *p, int power) { + auto const &k_info = game->edit_data.k_info; + int plev = get_skill(SKILL_MIMICRY); object_type *o_ptr = &p_ptr->inventory[INVEN_OUTER]; @@ -761,6 +763,8 @@ static int get_mimic_chance(int mimic) void do_cmd_mimic_lore() { + auto const &k_info = game->edit_data.k_info; + int fail; object_type *o_ptr; diff --git a/src/dungeon.cc b/src/dungeon.cc index 96ac89cb..1f3f6253 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -134,7 +134,9 @@ static byte value_check_aux1(object_type const *o_ptr) static byte value_check_aux1_magic(object_type const *o_ptr) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[o_ptr->k_idx]; switch (o_ptr->tval) @@ -223,7 +225,9 @@ static byte value_check_aux2(object_type const *o_ptr) static byte value_check_aux2_magic(object_type const *o_ptr) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[o_ptr->k_idx]; switch (o_ptr->tval) @@ -4190,6 +4194,7 @@ static void process_command(void) static void process_player(void) { auto const &f_info = game->edit_data.f_info; + auto const &k_info = game->edit_data.k_info; int i, j; @@ -4501,7 +4506,7 @@ static void process_player(void) { /* Acquire object -- for speed only base items are allowed to shimmer */ object_type *o_ptr = &o_list[i]; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Skip dead or carried objects */ if ((!o_ptr->k_idx) || (!o_ptr->ix)) continue; diff --git a/src/files.cc b/src/files.cc index 42d1bed3..7ccb0508 100644 --- a/src/files.cc +++ b/src/files.cc @@ -221,6 +221,7 @@ errr process_pref_file_aux(char *buf) auto &re_info = game->edit_data.re_info; auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; + auto &k_info = game->edit_data.k_info; int i, j, n1, n2; @@ -357,13 +358,21 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 2, 3, zz, ':', '/') == 3) { - object_kind *k_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t i = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_k_idx) return (1); - k_ptr = &k_info[i]; - if (n1) k_ptr->x_attr = n1; + + if (i >= k_info.size()) + { + return (1); + } + + auto k_ptr = &k_info[i]; + + if (n1) + { + k_ptr->x_attr = n1; + } if (n2) { k_ptr->x_char = n2; @@ -435,16 +444,23 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 2, 3, zz, ':', '/') == 3) { - j = (huge)strtol(zz[0], NULL, 0); + j = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - for (i = 1; i < max_k_idx; i++) + + for (auto &k_ref: k_info) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_ref; if (k_ptr->tval == j) { - if (n1) k_ptr->d_attr = n1; - if (n2) k_ptr->d_char = n2; + if (n1) + { + k_ref.d_attr = n1; + } + if (n2) + { + k_ref.d_char = n2; + } } } return (0); @@ -4058,6 +4074,7 @@ static long total_points(void) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; s16b max_dl = 0; long temp, Total = 0; @@ -4106,11 +4123,10 @@ static long total_points(void) /* Death of a companion is BAD */ temp /= comp_death; - /* The know objects increase the score */ - /* Scan the object kinds */ - for (std::size_t k = 1; k < max_k_idx; k++) + /* The known objects increase the score */ + for (std::size_t k = 1; k < k_info.size(); k++) { - object_kind *k_ptr = &k_info[k]; + auto k_ptr = &k_info[k]; /* Hack -- skip artifacts */ if (k_ptr->flags & TR_INSTA_ART) continue; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 6adb3804..59a74182 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -6,6 +6,7 @@ #include "hist_type.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" +#include "object_kind.hpp" #include "owner_type.hpp" #include "player_class.hpp" #include "player_race.hpp" @@ -53,6 +54,11 @@ struct GameEditData { */ std::vector set_info; + /** + * Object kinds + */ + std::vector k_info; + /** * Building actions. */ diff --git a/src/generate.cc b/src/generate.cc index 6612a888..fb59afe2 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -825,19 +825,28 @@ static void place_altar(int y, int x) */ static void place_fountain(int y, int x) { + auto const &k_info = game->edit_data.k_info; + cave_type *c_ptr = &cave[y][x]; - int svals[SV_POTION_LAST + SV_POTION2_LAST + 1], maxsval = 0, k; + int svals[SV_POTION_LAST + SV_POTION2_LAST + 1]; + int maxsval = 0; /* List of usable svals */ - for (k = 1; k < max_k_idx; k++) + for (auto const &k_ref: k_info) { - object_kind *k_ptr = &k_info[k]; + auto k_ptr = &k_ref; if (((k_ptr->tval == TV_POTION) || (k_ptr->tval == TV_POTION2)) && (k_ptr->level <= dun_level) && (k_ptr->flags & TR_FOUNTAIN)) { - if (k_ptr->tval == TV_POTION2) svals[maxsval] = k_ptr->sval + SV_POTION_LAST; - else svals[maxsval] = k_ptr->sval; + if (k_ptr->tval == TV_POTION2) + { + svals[maxsval] = k_ptr->sval + SV_POTION_LAST; + } + else + { + svals[maxsval] = k_ptr->sval; + } maxsval++; } } @@ -7662,6 +7671,7 @@ static bool_ cave_gen(void) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto &k_info = game->edit_data.k_info; auto d_ptr = &d_info[dungeon_type]; diff --git a/src/init1.cc b/src/init1.cc index d2fef6a9..89149c8f 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2300,6 +2300,8 @@ errr init_f_info_txt(FILE *fp) */ errr init_k_info_txt(FILE *fp) { + auto &k_info = game->edit_data.k_info; + int i; char buf[1024]; char *s, *t; @@ -2349,14 +2351,11 @@ errr init_k_info_txt(FILE *fp) /* Verify information */ if (i <= error_idx) return (4); - /* Verify information */ - if (i >= max_k_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - k_ptr = &k_info[i]; + k_ptr = &expand_to_fit_index(k_info, i); /* Advance and Save the name index */ assert(!k_ptr->name); @@ -6777,12 +6776,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_real_towns = atoi(zz[1]); } - /* Maximum k_idx */ - else if (zz[0][0] == 'K') - { - max_k_idx = atoi(zz[1]); - } - /* Maximum a_idx */ else if (zz[0][0] == 'A') { diff --git a/src/init2.cc b/src/init2.cc index 950badc3..73863842 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -293,7 +293,7 @@ namespace { static void allocate() { - k_info = new object_kind[max_k_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -723,12 +723,13 @@ static errr init_other(void) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; /*** Prepare the "dungeon" information ***/ /* Allocate and Wipe the special gene flags */ m_allow_special = make_array(r_info.size()); - k_allow_special = make_array(max_k_idx); + k_allow_special = make_array(k_info.size()); a_allow_special = make_array(max_a_idx); @@ -804,10 +805,7 @@ static errr init_other(void) static errr init_alloc(void) { auto const &r_info = game->edit_data.r_info; - - int i, j; - - object_kind *k_ptr; + auto const &k_info = game->edit_data.k_info; alloc_entry *table; @@ -827,12 +825,12 @@ static errr init_alloc(void) alloc_kind_size = 0; /* Scan the objects */ - for (i = 1; i < max_k_idx; i++) + for (auto const &k_ref: k_info) { - k_ptr = &k_info[i]; + auto k_ptr = &k_ref; /* Scan allocation pairs */ - for (j = 0; j < ALLOCATION_MAX; j++) + for (std::size_t j = 0; j < ALLOCATION_MAX; j++) { /* Count the "legal" entries */ if (k_ptr->chance[j]) @@ -847,7 +845,7 @@ static errr init_alloc(void) } /* Collect the level indexes */ - for (i = 1; i < MAX_DEPTH_MONSTER; i++) + for (std::size_t i = 1; i < MAX_DEPTH_MONSTER; i++) { /* Group by level */ num[i] += num[i - 1]; @@ -866,12 +864,12 @@ static errr init_alloc(void) table = alloc_kind_table; /* Scan the objects */ - for (i = 1; i < max_k_idx; i++) + for (std::size_t i = 1; i < k_info.size(); i++) { - k_ptr = &k_info[i]; + auto k_ptr = &k_info[i]; /* Scan allocation pairs */ - for (j = 0; j < ALLOCATION_MAX; j++) + for (std::size_t j = 0; j < ALLOCATION_MAX; j++) { /* Count the "legal" entries */ if (k_ptr->chance[j]) @@ -933,7 +931,7 @@ static errr init_alloc(void) } /* Collect the level indexes */ - for (i = 1; i < MAX_DEPTH_MONSTER; i++) + for (std::size_t i = 1; i < MAX_DEPTH_MONSTER; i++) { /* Group by level */ num[i] += num[i - 1]; @@ -952,7 +950,7 @@ static errr init_alloc(void) table = alloc_race_table; /* Scan the monsters */ - for (i = 1; i < r_info.size(); i++) + for (std::size_t i = 1; i < r_info.size(); i++) { /* Get the i'th race */ auto r_ptr = &r_info[i]; @@ -1019,6 +1017,7 @@ static void init_guardians(void) { auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; + auto &k_info = game->edit_data.k_info; /* Scan dungeons */ for (std::size_t i = 0; i < d_info.size(); i++) @@ -1042,7 +1041,7 @@ static void init_guardians(void) /* Mark the final object */ if (d_ptr->final_object) { - object_kind *k_ptr = &k_info[d_ptr->final_object]; + auto k_ptr = &k_info[d_ptr->final_object]; k_ptr->flags |= TR_SPECIAL_GENE; } diff --git a/src/loadsave.cc b/src/loadsave.cc index 8d05cb43..1329827f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1056,6 +1056,8 @@ static bool_ wearable_p(object_type *o_ptr) */ static void do_item(object_type *o_ptr, ls_flag_t flag) { + auto &k_info = game->edit_data.k_info; + byte old_dd; byte old_ds; @@ -2112,11 +2114,13 @@ static bool do_monster_lore(ls_flag_t flag) */ static bool do_object_lore(ls_flag_t flag) { - u16b n_kinds = max_k_idx; + auto &k_info = game->edit_data.k_info; + + u16b n_kinds = k_info.size(); do_u16b(&n_kinds, flag); - if ((flag == ls_flag_t::LOAD) && (n_kinds > max_k_idx)) + if ((flag == ls_flag_t::LOAD) && (n_kinds > k_info.size())) { note("Too many object kinds!"); return false; diff --git a/src/monster2.cc b/src/monster2.cc index dccf47dc..17b5ab9a 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -430,6 +430,8 @@ static cptr funny_comments[MAX_COMMENT] = */ void delete_monster_idx(int i) { + auto &k_info = game->edit_data.k_info; + /* Get location */ monster_type *m_ptr = &m_list[i]; int y = m_ptr->fy; @@ -1887,6 +1889,8 @@ void update_monsters(bool_ full) void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) { + auto &k_info = game->edit_data.k_info; + object_type *o_ptr; /* Get new object */ @@ -1953,8 +1957,10 @@ static int possible_randart[] = bool_ kind_is_randart(int k_idx) { + auto const &k_info = game->edit_data.k_info; + int max; - object_kind *k_ptr = &k_info[k_idx]; + auto k_ptr = &k_info[k_idx]; if (!kind_is_legal(k_idx)) return (FALSE); diff --git a/src/object1.cc b/src/object1.cc index c10a52f9..42c3f9ff 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -331,14 +331,8 @@ static char scroll_adj[MAX_TITLES][16]; static byte scroll_col[MAX_TITLES]; -/* - * Certain items have a flavor - * This function is used only by "flavor_init()" - */ -static byte object_flavor(int k_idx) +static byte object_flavor(object_kind const *k_ptr) { - object_kind *k_ptr = &k_info[k_idx]; - /* Analyze the item */ switch (k_ptr->tval) { @@ -390,7 +384,7 @@ static byte object_flavor(int k_idx) } /* No flavor */ - return (0); + return 0; } @@ -400,10 +394,8 @@ static byte object_flavor(int k_idx) * * XXX XXX XXX Add "EASY_KNOW" flag to "k_info.txt" file */ -static bool_ object_easy_know(int i) +static bool_ object_easy_know(object_kind const *k_ptr) { - object_kind *k_ptr = &k_info[i]; - /* Analyze the "tval" */ switch (k_ptr->tval) { @@ -507,6 +499,8 @@ static void shuffle_flavors(cptr adj[], byte col[]) */ void flavor_init(void) { + auto &k_info = game->edit_data.k_info; + /* Hack -- Induce consistant flavors */ set_quick_rng(seed_flavor()); @@ -599,21 +593,24 @@ void flavor_init(void) set_complex_rng(); /* Analyze every object */ - for (std::size_t i = 1; i < max_k_idx; i++) + for (auto &k_ref: k_info) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_ref; /* Skip "empty" objects */ if (!k_ptr->name) continue; /* Extract "flavor" (if any) */ - k_ptr->flavor = object_flavor(i); + k_ptr->flavor = object_flavor(k_ptr); /* No flavor yields aware */ - if ((!k_ptr->flavor) && (k_ptr->tval != TV_ROD_MAIN)) k_ptr->aware = TRUE; + if ((!k_ptr->flavor) && (k_ptr->tval != TV_ROD_MAIN)) + { + k_ptr->aware = TRUE; + } /* Check for "easily known" */ - k_ptr->easy_know = object_easy_know(i); + k_ptr->easy_know = object_easy_know(k_ptr); } } @@ -638,6 +635,7 @@ void reset_visuals(void) auto &re_info = game->edit_data.re_info; auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; + auto &k_info = game->edit_data.k_info; int i; @@ -657,13 +655,11 @@ void reset_visuals(void) } /* Extract default attr/char code for objects */ - for (i = 0; i < max_k_idx; i++) + for (auto &k_ref: k_info) { - object_kind *k_ptr = &k_info[i]; - /* Default attr/char */ - k_ptr->x_attr = k_ptr->d_attr; - k_ptr->x_char = k_ptr->d_char; + k_ref.x_attr = k_ref.d_attr; + k_ref.x_char = k_ref.d_char; } /* Extract default attr/char code for monsters */ @@ -804,7 +800,9 @@ bool_ object_flags_no_set = FALSE; */ object_flag_set object_flags(object_type const *o_ptr) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[o_ptr->k_idx]; /* Base object */ auto f = k_ptr->flags; @@ -834,7 +832,9 @@ object_flag_set object_flags(object_type const *o_ptr) /* Return object granted power */ int object_power(object_type *o_ptr) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[o_ptr->k_idx]; int power = -1; /* Base object */ @@ -873,7 +873,9 @@ int object_power(object_type *o_ptr) */ object_flag_set object_flags_known(object_type const *o_ptr) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[o_ptr->k_idx]; /* Must be identified */ if (!object_known_p(o_ptr)) @@ -1018,6 +1020,7 @@ static object_flag_set compute_pval_mask() static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -1027,7 +1030,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) bool_ show_weapon = FALSE; bool_ show_armour = FALSE; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Extract some flags */ auto const flags = object_flags(o_ptr); @@ -2104,6 +2107,8 @@ void object_desc(char *buf, object_type const *o_ptr, int pref, int mode) */ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode) { + auto &k_info = game->edit_data.k_info; + /* Save the "aware" flag */ bool_ hack_aware = k_info[o_ptr->k_idx].aware; @@ -2138,6 +2143,8 @@ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode) */ cptr item_activation(object_type *o_ptr, byte num) { + auto const &k_info = game->edit_data.k_info; + /* Needed hacks */ static char rspell[2][80]; @@ -2509,6 +2516,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait { auto const &set_info = game->edit_data.set_info; auto const &st_info = game->edit_data.st_info; + auto const &k_info = game->edit_data.k_info; cptr vp[64]; byte vc[64]; @@ -2553,7 +2561,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait { if (o_ptr->k_idx && (!trim_down)) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; text_out_c(TERM_ORANGE, k_ptr->text); text_out("\n"); @@ -6253,6 +6261,8 @@ static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) byte object_attr(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + if (o_ptr->tval == TV_RANDART) { return random_artifacts[o_ptr->sval].attr; @@ -6269,6 +6279,8 @@ byte object_attr(object_type const *o_ptr) byte object_attr_default(object_type *o_ptr) { + auto const &k_info = game->edit_data.k_info; + if (o_ptr->tval == TV_RANDART) { return random_artifacts[o_ptr->sval].attr; @@ -6291,6 +6303,8 @@ byte object_attr_default(object_type *o_ptr) char object_char(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + if (k_info[o_ptr->k_idx].flavor) { return misc_to_char[k_info[o_ptr->k_idx].flavor]; @@ -6303,6 +6317,8 @@ char object_char(object_type const *o_ptr) char object_char_default(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + if (k_info[o_ptr->k_idx].flavor) { return misc_to_char[k_info[o_ptr->k_idx].flavor]; @@ -6318,6 +6334,8 @@ char object_char_default(object_type const *o_ptr) */ bool artifact_p(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + return (o_ptr->tval == TV_RANDART) || (o_ptr->name1 ? true : false) || diff --git a/src/object2.cc b/src/object2.cc index 901bb854..e812340b 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -240,6 +240,8 @@ static void compact_objects_aux(int i1, int i2) */ void compact_objects(int size) { + auto const &k_info = game->edit_data.k_info; + int i, y, x, num; int cur_lev, cur_dis, chance; @@ -269,7 +271,7 @@ void compact_objects(int size) { object_type *o_ptr = &o_list[i]; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; @@ -377,6 +379,8 @@ void compact_objects(int size) */ void wipe_o_list(void) { + auto &k_info = game->edit_data.k_info; + int i; /* Delete the existing objects */ @@ -554,10 +558,11 @@ errr get_obj_num_prep(void) */ s16b get_obj_num(int level) { + auto const &k_info = game->edit_data.k_info; + int i, j, p; int k_idx; long value, total; - object_kind *k_ptr; alloc_entry *table = alloc_kind_table; @@ -589,7 +594,7 @@ s16b get_obj_num(int level) k_idx = table[i].index; /* Access the actual kind */ - k_ptr = &k_info[k_idx]; + auto k_ptr = &k_info[k_idx]; /* Hack -- prevent embedded chests */ if (opening_chest && (k_ptr->tval == TV_CHEST)) continue; @@ -720,6 +725,8 @@ void object_known(object_type *o_ptr) */ bool object_known_p(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + return ((o_ptr->ident & (IDENT_KNOWN)) || (k_info[o_ptr->k_idx].easy_know && k_info[o_ptr->k_idx].aware)); } @@ -731,6 +738,8 @@ bool object_known_p(object_type const *o_ptr) */ void object_aware(object_type *o_ptr) { + auto &k_info = game->edit_data.k_info; + /* Fully aware of the effects */ k_info[o_ptr->k_idx].aware = TRUE; } @@ -740,6 +749,8 @@ void object_aware(object_type *o_ptr) */ bool object_aware_p(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + return k_info[o_ptr->k_idx].aware; } @@ -749,6 +760,8 @@ bool object_aware_p(object_type const *o_ptr) */ void object_tried(object_type *o_ptr) { + auto &k_info = game->edit_data.k_info; + /* Mark it as tried (even if "aware") */ k_info[o_ptr->k_idx].tried = TRUE; } @@ -759,6 +772,8 @@ void object_tried(object_type *o_ptr) */ bool object_tried_p(object_type const *o_ptr) { + auto const &k_info = game->edit_data.k_info; + return k_info[o_ptr->k_idx].tried; } @@ -770,8 +785,9 @@ bool object_tried_p(object_type const *o_ptr) static s32b object_value_base(object_type const *o_ptr) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Aware item -- use template cost */ if ((object_aware_p(o_ptr)) && (o_ptr->tval != TV_EGG)) return (k_ptr->cost); @@ -1073,10 +1089,11 @@ s32b flag_cost(object_type const *o_ptr, int plusses) s32b object_value_real(object_type const *o_ptr) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; s32b value; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; if (o_ptr->tval == TV_RANDART) { @@ -1801,22 +1818,22 @@ void object_absorb(object_type *o_ptr, object_type *j_ptr) */ s16b lookup_kind(int tval, int sval) { - int k; + auto const &k_info = game->edit_data.k_info; - /* Look for it */ - for (k = 1; k < max_k_idx; k++) + for (std::size_t k = 1; k < k_info.size(); k++) { - object_kind *k_ptr = &k_info[k]; - - /* Found a match */ - if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) return (k); + auto k_ptr = &k_info[k]; + if ((k_ptr->tval == tval) && (k_ptr->sval == sval)) + { + return k; + } } /* Oops */ if (wizard) msg_format("No object (%d,%d)", tval, sval); /* Oops */ - return (0); + return 0; } @@ -1856,7 +1873,9 @@ static void init_obj_exp(object_type *o_ptr, object_kind const *k_ptr) */ void object_prep(object_type *o_ptr, int k_idx) { - object_kind *k_ptr = &k_info[k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[k_idx]; /* Clear the record */ object_wipe(o_ptr); @@ -2173,6 +2192,8 @@ void random_artifact_resistance(object_type * o_ptr) */ static bool_ make_artifact_special(object_type *o_ptr) { + auto const &k_info = game->edit_data.k_info; + /* No artifacts in the town */ if (!dun_level) return (FALSE); @@ -2252,6 +2273,8 @@ static bool_ make_artifact_special(object_type *o_ptr) */ static bool_ make_artifact(object_type *o_ptr) { + auto const &k_info = game->edit_data.k_info; + /* No artifacts in the town */ if (!dun_level) return (FALSE); @@ -2322,8 +2345,10 @@ static bool_ make_artifact(object_type *o_ptr) */ static bool_ make_ego_item(object_type *o_ptr, bool_ good) { + auto const &k_info = game->edit_data.k_info; + bool_ ret = FALSE; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; if (artifact_p(o_ptr) || o_ptr->name2) return (FALSE); @@ -3219,9 +3244,10 @@ static int get_stick_max_level(byte tval, int level, int spl) static void a_m_aux_4(object_type *o_ptr, int level, int power) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; s32b bonus_lvl, max_lvl; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Very good */ if (power > 1) @@ -3937,8 +3963,10 @@ void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *li */ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional force_power) { + auto &k_info = game->edit_data.k_info; + int i, rolls; - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Aply luck */ lev += luck( -7, 7); @@ -4358,9 +4386,11 @@ bool init_match_theme(obj_theme const &theme) */ static bool kind_is_theme(obj_theme const *theme, int k_idx) { + auto const &k_info = game->edit_data.k_info; + assert(theme != nullptr); - object_kind *k_ptr = &k_info[k_idx]; + auto k_ptr = &k_info[k_idx]; s32b prob = 0; @@ -4551,7 +4581,9 @@ static bool kind_is_theme(obj_theme const *theme, int k_idx) */ bool_ kind_is_legal(int k_idx) { - object_kind *k_ptr = &k_info[k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[k_idx]; if (!kind_is_theme(match_theme, k_idx)) return FALSE; @@ -4595,7 +4627,9 @@ bool_ kind_is_legal(int k_idx) */ static bool_ kind_is_good(int k_idx) { - object_kind *k_ptr = &k_info[k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[k_idx]; if (!kind_is_legal(k_idx)) return FALSE; @@ -4692,8 +4726,9 @@ static bool_ kind_is_good(int k_idx) bool_ kind_is_artifactable(int k_idx) { auto const &ra_info = game->edit_data.ra_info; + auto const &k_info = game->edit_data.k_info; - object_kind *k_ptr = &k_info[k_idx]; + auto k_ptr = &k_info[k_idx]; if (kind_is_good(k_idx)) { // Consider the item artifactable if there is at least one @@ -4731,6 +4766,8 @@ bool_ kind_is_artifactable(int k_idx) */ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme) { + auto const &k_info = game->edit_data.k_info; + int invprob, base; @@ -4847,6 +4884,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & void place_object(int y, int x, bool_ good, bool_ great, int where) { auto const &d_info = game->edit_data.d_info; + auto &k_info = game->edit_data.k_info; s16b o_idx; @@ -4955,6 +4993,8 @@ void place_object(int y, int x, bool_ good, bool_ great, int where) */ bool_ make_gold(object_type *j_ptr) { + auto const &k_info = game->edit_data.k_info; + int i; s32b base; @@ -5079,6 +5119,7 @@ void place_gold(int y, int x) s16b drop_near(object_type *j_ptr, int chance, int y, int x) { auto const &f_info = game->edit_data.f_info; + auto &k_info = game->edit_data.k_info; int i, k, d, s; diff --git a/src/object_kind_fwd.hpp b/src/object_kind_fwd.hpp deleted file mode 100644 index 6d26db9f..00000000 --- a/src/object_kind_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct object_kind; diff --git a/src/powers.cc b/src/powers.cc index 88292e21..b92d7731 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -131,6 +131,7 @@ static bool_ power_chance(power_type *x_ptr) static void power_activate(int power) { auto const &f_info = game->edit_data.f_info; + auto const &k_info = game->edit_data.k_info; s16b plev = p_ptr->lev; char ch = 0; diff --git a/src/q_rand.cc b/src/q_rand.cc index 019f4b71..7a1faa87 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -218,6 +218,8 @@ bool_ is_randhero(int level) static void do_get_new_obj(int y, int x) { + auto &k_info = game->edit_data.k_info; + object_type *q_ptr[3], forge[3]; int res, i; diff --git a/src/spells1.cc b/src/spells1.cc index c11be30b..3eaf0303 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1781,6 +1781,8 @@ typedef int (*inven_func)(object_type *); */ static int inven_damage(inven_func typ, int perc) { + auto const &k_info = game->edit_data.k_info; + int i, j, k, amt; object_type *o_ptr; @@ -1827,7 +1829,7 @@ static int inven_damage(inven_func typ, int perc) /* Potions smash open */ if (k_info[o_ptr->k_idx].tval == TV_POTION) - { + { (void)potion_smash_effect(0, p_ptr->py, p_ptr->px, o_ptr->sval); } @@ -3816,6 +3818,7 @@ static int raise_ego[MAX_RAISE] = static bool_ project_o(int who, int r, int y, int x, int dam, int typ) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; cave_type *c_ptr = &cave[y][x]; diff --git a/src/spells2.cc b/src/spells2.cc index f918a970..5c1215d0 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -3483,6 +3483,8 @@ object_filter_t const &item_tester_hook_recharge() */ bool_ recharge(int power) { + auto const &k_info = game->edit_data.k_info; + int recharge_strength, recharge_amount; int lev; bool_ fail = FALSE; diff --git a/src/spells3.cc b/src/spells3.cc index 276cfeec..f64a22bf 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -2975,6 +2975,8 @@ static object_filter_t const &udun_object_is_drainable() casting_result udun_drain() { + auto const &k_info = game->edit_data.k_info; + /* Ask for an item */ int item; if (!get_item(&item, @@ -2994,7 +2996,7 @@ casting_result udun_drain() case TV_STAFF: case TV_WAND: { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; + auto k_ptr = &k_info[o_ptr->k_idx]; /* Generate mana */ increase_mana(o_ptr->pval * k_ptr->level * o_ptr->number); diff --git a/src/squelch/condition.cc b/src/squelch/condition.cc index 8715b364..cd7f879c 100644 --- a/src/squelch/condition.cc +++ b/src/squelch/condition.cc @@ -878,8 +878,9 @@ void StateCondition::to_json(jsoncons::json &j) const bool SymbolCondition::is_match(object_type *o_ptr) const { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - return k_ptr->d_char == m_symbol; + auto const &k_info = game->edit_data.k_info; + + return k_info[o_ptr->k_idx].d_char == m_symbol; } std::shared_ptr SymbolCondition::from_json(jsoncons::json const &j) diff --git a/src/squeltch.cc b/src/squeltch.cc index eed3bf1b..43f566ea 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -11,6 +11,7 @@ #include "cave_type.hpp" #include "files.hpp" +#include "game.hpp" #include "loadsave.hpp" #include "lua_bind.hpp" #include "object1.hpp" @@ -58,6 +59,8 @@ static squelch::Automatizer *automatizer = nullptr; void squeltch_grid(void) { + auto const &k_info = game->edit_data.k_info; + if (!automatizer_enabled) { return; diff --git a/src/store.cc b/src/store.cc index 47d5d943..cdf87d13 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1170,7 +1170,9 @@ static int store_tval = 0, store_level = 0; */ static bool_ kind_is_storeok(int k_idx) { - object_kind *k_ptr = &k_info[k_idx]; + auto const &k_info = game->edit_data.k_info; + + auto k_ptr = &k_info[k_idx]; if (k_info[k_idx].flags & TR_NORM_ART) return ( FALSE ); @@ -1199,6 +1201,7 @@ static bool_ kind_is_storeok(int k_idx) static void store_create(void) { auto const &st_info = game->edit_data.st_info; + auto const &k_info = game->edit_data.k_info; int i = 0, tries, level = 0; diff --git a/src/traps.cc b/src/traps.cc index f5abe202..0f80f8d6 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -2659,6 +2659,7 @@ bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) bool_ mon_hit_trap(int m_idx) { auto const &r_info = game->edit_data.r_info; + auto const &k_info = game->edit_data.k_info; monster_type *m_ptr = &m_list[m_idx]; auto r_ptr = &r_info[m_ptr->r_idx]; @@ -3028,7 +3029,7 @@ bool_ mon_hit_trap(int m_idx) if (load_o_ptr->tval == TV_ROD_MAIN) { /* Extract mana cost of the rod tip */ - object_kind *tip_o_ptr = &k_info[lookup_kind(TV_ROD, load_o_ptr->pval)]; + auto tip_o_ptr = &k_info[lookup_kind(TV_ROD, load_o_ptr->pval)]; auto const tflags = object_flags(load_o_ptr); cost = (tflags & TR_CHEAPNESS) ? tip_o_ptr->pval / 2 : tip_o_ptr->pval; if (cost <= 0) cost = 1; diff --git a/src/util.cc b/src/util.cc index 9351dce1..ccc61143 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3363,18 +3363,20 @@ int test_mego_name(cptr needle) * returned. Case doesn't matter. -DG- */ -int test_item_name(cptr name) +int test_item_name(cptr needle) { - int i; + auto const &k_info = game->edit_data.k_info; - /* Scan the items */ - for (i = 1; i < max_k_idx; i++) + for (std::size_t i = 0; i < k_info.size(); i++) { - object_kind *k_ptr = &k_info[i]; - /* If name matches, give us the number */ - if (k_ptr->name && iequals(name, k_ptr->name)) return (i); + auto const &name = k_info[i].name; + if (name && iequals(needle, name)) + { + return i; + } } - return (0); + + return 0; } /* diff --git a/src/variable.cc b/src/variable.cc index f8be6224..4275f21f 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -428,11 +428,6 @@ player_class const *cp_ptr; player_spec const *spp_ptr; -/* - * The object kind arrays - */ -object_kind *k_info; - /* * The artifact arrays */ @@ -568,11 +563,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum number of items in k_info.txt - */ -u16b max_k_idx; - /* * Maximum number of artifacts in a_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 9daaf3d9..430a1a46 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -11,7 +11,6 @@ #include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "monster_type_fwd.hpp" -#include "object_kind_fwd.hpp" #include "object_type_fwd.hpp" #include "options.hpp" #include "player_class_fwd.hpp" @@ -151,7 +150,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern object_kind *k_info; extern artifact_type *a_info; extern ego_item_type *e_info; extern trap_type *t_info; @@ -166,7 +164,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_k_idx; extern u16b max_a_idx; extern u16b max_e_idx; extern u16b max_o_idx; diff --git a/src/wizard2.cc b/src/wizard2.cc index 575b6e72..6665102e 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -413,6 +413,8 @@ static void do_cmd_wiz_change(void) */ static void wiz_display_item(object_type *o_ptr) { + auto const &k_info = game->edit_data.k_info; + int i, j = 13; char buf[256]; @@ -472,12 +474,8 @@ static void wiz_display_item(object_type *o_ptr) /* * Strip an "object name" into a buffer */ -static void strip_name(char *buf, int k_idx) +static void strip_name(char *buf, const object_kind *k_ptr) { - char *t; - - object_kind *k_ptr = &k_info[k_idx]; - cptr str = k_ptr->name; @@ -485,6 +483,7 @@ static void strip_name(char *buf, int k_idx) while ((*str == ' ') || (*str == '&')) str++; /* Copy useful chars */ + char *t; for (t = buf; *str; str++) { if (*str != '~') *t++ = *str; @@ -534,14 +533,14 @@ static void wci_string(cptr string, int num) */ static int wiz_create_itemtype(void) { - int i, num, max_num; + auto const &k_info = game->edit_data.k_info; + + int num, max_num; int tval; cptr tval_desc2; char ch; - int choice[60]; - char buf[160]; @@ -580,9 +579,12 @@ static int wiz_create_itemtype(void) Term_clear(); /* We have to search the whole itemlist. */ - for (num = 0, i = 1; (num < 60) && (i < max_k_idx); i++) + std::vector choice; + choice.reserve(60); + std::size_t i; + for (num = 0, i = 1; (choice.size() < 60) && (i < k_info.size()); i++) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_info[i]; /* Analyze matching items */ if (k_ptr->tval == tval) @@ -590,19 +592,19 @@ static int wiz_create_itemtype(void) /* Hack -- Skip instant artifacts */ if (k_ptr->flags & TR_INSTA_ART) continue; - /* Acquire the "name" of object "i" */ - strip_name(buf, i); + /* Acquire the "name" of object */ + strip_name(buf, k_ptr); /* Print it */ wci_string(buf, num); /* Remember the object index */ - choice[num++] = i; + choice.push_back(i); } } /* Me need to know the maximal possible remembered object_index */ - max_num = num; + max_num = choice.size(); /* Choose! */ if (!get_com(format("What Kind of %s? ", tval_desc2), &ch)) return (0); @@ -1208,23 +1210,26 @@ static void wiz_create_item(void) */ static void wiz_create_item_2(void) { - object_type forge; - object_type *q_ptr; - int a_idx; + auto const &k_info = game->edit_data.k_info; + cptr p = "Number of the object :"; char out_val[80] = ""; if (!get_string(p, out_val, 4)) return; - a_idx = atoi(out_val); + int k_idx = atoi(out_val); /* Return if failed or out-of-bounds */ - if ((a_idx <= 0) || (a_idx >= max_k_idx)) return; + if ((k_idx <= 0) || (k_idx >= static_cast(k_info.size()))) + { + return; + } /* Get local object */ - q_ptr = &forge; + object_type forge; + auto q_ptr = &forge; /* Create the item */ - object_prep(q_ptr, a_idx); + object_prep(q_ptr, k_idx); /* Apply magic (no messages, no artifacts) */ apply_magic(q_ptr, dun_level, FALSE, FALSE, FALSE); @@ -1354,21 +1359,19 @@ static void do_cmd_wiz_jump(void) */ static void do_cmd_wiz_learn(void) { - int i; - - object_type forge; - object_type *q_ptr; + auto const &k_info = game->edit_data.k_info; /* Scan every object */ - for (i = 1; i < max_k_idx; i++) + for (std::size_t i = 0; i < k_info.size(); i++) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_info[i]; /* Induce awareness */ if (k_ptr->level <= command_arg) { /* Get local object */ - q_ptr = &forge; + object_type forge; + auto q_ptr = &forge; /* Prepare object */ object_prep(q_ptr, i); diff --git a/src/xtra1.cc b/src/xtra1.cc index 80cbe09e..27bdce71 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -4415,6 +4415,8 @@ static int get_artifact_idx(int level) /* Chose a fate */ void gain_fate(byte fate) { + auto const &k_info = game->edit_data.k_info; + int i; int level; @@ -4485,7 +4487,6 @@ void gain_fate(byte fate) { while (TRUE) { - object_kind *k_ptr; obj_theme theme; /* No themes */ @@ -4506,7 +4507,7 @@ void gain_fate(byte fate) /* Invalidate the cached allocation table */ alloc_kind_table_valid = FALSE; - k_ptr = &k_info[fates[i].o_idx]; + auto k_ptr = &k_info[fates[i].o_idx]; if (!(k_ptr->flags & TR_INSTA_ART) && !(k_ptr->flags & TR_NORM_ART)) break; } diff --git a/src/xtra2.cc b/src/xtra2.cc index af25e906..bb757b4f 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3900,6 +3900,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const &st_info = game->edit_data.st_info; auto const &wf_info = game->edit_data.wf_info; auto const &f_info = game->edit_data.f_info; + auto const &k_info = game->edit_data.k_info; cave_type *c_ptr = &cave[y][x]; @@ -5004,13 +5005,15 @@ void set_grace(s32b v) static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge, const char *what) { + auto &k_info = game->edit_data.k_info; + int i, j, jb, save_aware; char buf[200]; /* try all objects, this *IS* a very ugly and slow method :( */ - for (i = 0; i < max_k_idx; i++) + for (i = 0; i < k_info.size(); i++) { - object_kind *k_ptr = &k_info[i]; + auto k_ptr = &k_info[i]; o_ptr = forge; -- cgit v1.2.3 From 57bb453a15034c67d04496360b306a5f3bfd0bf2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move a_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/artifact_type_fwd.hpp | 3 --- src/birth.cc | 6 +++--- src/cmd3.cc | 2 ++ src/cmd4.cc | 14 ++++++-------- src/cmd6.cc | 2 ++ src/game_edit_data.hpp | 6 ++++++ src/generate.cc | 6 ++++-- src/init1.cc | 19 ++++++------------- src/init2.cc | 13 ++++++++----- src/loadsave.cc | 13 ++++++++----- src/monster2.cc | 2 ++ src/object1.cc | 27 +++++++++++++++++++++------ src/object2.cc | 23 +++++++++++++++++------ src/q_one.cc | 3 +++ src/q_rand.cc | 1 + src/q_troll.cc | 3 +++ src/traps.cc | 2 ++ src/variable.cc | 10 ---------- src/variable.hpp | 3 --- src/wizard2.cc | 12 +++++++++--- src/xtra1.cc | 13 +++++++++---- src/xtra2.cc | 3 ++- 24 files changed, 114 insertions(+), 78 deletions(-) delete mode 100644 src/artifact_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 81f2977f..75500706 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of artifacts in a_info.txt -M:A:219 - # Maximum number of ego-items in e_info.txt M:E:200 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index bd3d21ef..51ed2fba 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of artifacts in a_info.txt -M:A:257 - # Maximum number of ego-items in e_info.txt M:E:238 diff --git a/src/artifact_type_fwd.hpp b/src/artifact_type_fwd.hpp deleted file mode 100644 index f3862d5a..00000000 --- a/src/artifact_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct artifact_type; diff --git a/src/birth.cc b/src/birth.cc index 65f6389e..63560757 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -722,6 +722,7 @@ static void player_wipe(void) auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; /* Wipe special levels */ wipe_saved(); @@ -784,10 +785,9 @@ static void player_wipe(void) init_randart(); /* Start with no artifacts made yet */ - for (std::size_t i = 0; i < max_a_idx; i++) + for (auto &a_ref: a_info) { - artifact_type *a_ptr = &a_info[i]; - a_ptr->cur_num = 0; + a_ref.cur_num = 0; } /* Reset the "objects" */ diff --git a/src/cmd3.cc b/src/cmd3.cc index 0010a6ea..259efd67 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -206,6 +206,8 @@ bool_ is_slot_ok(int slot) */ void do_cmd_wield(void) { + auto const &a_info = game->edit_data.a_info; + int item, slot, num = 1; object_type forge; diff --git a/src/cmd4.cc b/src/cmd4.cc index 4ebb73d0..26794840 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3025,19 +3025,17 @@ void do_cmd_save_screen(void) void do_cmd_knowledge_artifacts(void) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; int i, z, x, y; char base_name[80]; /* Scan the artifacts */ - std::unique_ptr okay(new bool_[max_a_idx]); - for (std::size_t k = 0; k < max_a_idx; k++) + std::vector okay(a_info.size(), FALSE); + for (std::size_t k = 0; k < a_info.size(); k++) { - artifact_type *a_ptr = &a_info[k]; - - /* Default */ - okay[k] = FALSE; + auto a_ptr = &a_info[k]; /* Skip "empty" artifacts */ if (!a_ptr->name) continue; @@ -3163,9 +3161,9 @@ void do_cmd_knowledge_artifacts(void) fmt::MemoryWriter w; /* Scan the artifacts */ - for (std::size_t k = 0; k < max_a_idx; k++) + for (std::size_t k = 0; k < a_info.size(); k++) { - artifact_type *a_ptr = &a_info[k]; + auto a_ptr = &a_info[k]; /* List "dead" ones */ if (!okay[k]) continue; diff --git a/src/cmd6.cc b/src/cmd6.cc index 56dd5cab..93df49ad 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -4851,6 +4851,7 @@ static void activate_valaroma() void do_cmd_activate(void) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; int item, lev, chance; @@ -5075,6 +5076,7 @@ void do_cmd_activate(void) const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; int plev = get_skill(SKILL_DEVICE); diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 59a74182..6a6fea9c 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -1,6 +1,7 @@ #pragma once #include "ability_type.hpp" +#include "artifact_type.hpp" #include "dungeon_info_type.hpp" #include "feature_type.hpp" #include "hist_type.hpp" @@ -49,6 +50,11 @@ struct GameEditData { */ std::vector ra_gen; + /** + * Artifacts + */ + std::vector a_info; + /** * Artifact sets */ diff --git a/src/generate.cc b/src/generate.cc index fb59afe2..856b593f 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -7671,6 +7671,7 @@ static bool_ cave_gen(void) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; + auto const &a_info = game->edit_data.a_info; auto &k_info = game->edit_data.k_info; auto d_ptr = &d_info[dungeon_type]; @@ -7924,7 +7925,7 @@ static bool_ cave_gen(void) /* Grant a normal artefact */ else if (a_info[fates[i].a_idx].cur_num == 0) { - artifact_type *a_ptr = &a_info[fates[i].a_idx]; + auto a_ptr = &a_info[fates[i].a_idx]; s16b I_kind; /* Get local object */ @@ -8041,7 +8042,7 @@ static bool_ cave_gen(void) if (m_idx && d_ptr->final_artifact && (a_info[d_ptr->final_artifact].cur_num == 0)) { - artifact_type *a_ptr = &a_info[d_ptr->final_artifact]; + auto a_ptr = &a_info[d_ptr->final_artifact]; object_type *q_ptr, forge, *o_ptr; int I_kind, o_idx; @@ -8358,6 +8359,7 @@ static void generate_grid_mana() void generate_cave(void) { auto const &d_info = game->edit_data.d_info; + auto &a_info = game->edit_data.a_info; auto d_ptr = &d_info[dungeon_type]; int tester_1, tester_2; diff --git a/src/init1.cc b/src/init1.cc index 89149c8f..3912db12 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -2627,6 +2627,8 @@ errr init_k_info_txt(FILE *fp) */ errr init_a_info_txt(FILE *fp) { + auto &a_info = game->edit_data.a_info; + int i; char buf[1024]; char *s; @@ -2675,14 +2677,11 @@ errr init_a_info_txt(FILE *fp) /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_a_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - a_ptr = &a_info[i]; + a_ptr = &expand_to_fit_index(a_info, i); /* Copy name */ assert(!a_ptr->name); @@ -6169,6 +6168,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst { auto &wilderness = game->wilderness; auto &wf_info = game->edit_data.wf_info; + auto &a_info = game->edit_data.a_info; int i; @@ -6557,11 +6557,10 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst { int I_kind = 0; - artifact_type *a_ptr = &a_info[artifact_index]; - - object_type forge; + auto a_ptr = &a_info[artifact_index]; /* Get local object */ + object_type forge; object_type *q_ptr = &forge; a_allow_special[artifact_index] = TRUE; @@ -6776,12 +6775,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_real_towns = atoi(zz[1]); } - /* Maximum a_idx */ - else if (zz[0][0] == 'A') - { - max_a_idx = atoi(zz[1]); - } - /* Maximum e_idx */ else if (zz[0][0] == 'E') { diff --git a/src/init2.cc b/src/init2.cc index 73863842..8181f2d1 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -325,7 +325,7 @@ namespace { static void allocate() { - a_info = new artifact_type[max_a_idx]; + // Nothing to do } static errr parse(FILE *fp) @@ -724,13 +724,14 @@ static errr init_other(void) auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; /*** Prepare the "dungeon" information ***/ /* Allocate and Wipe the special gene flags */ m_allow_special = make_array(r_info.size()); k_allow_special = make_array(k_info.size()); - a_allow_special = make_array(max_a_idx); + a_allow_special = make_array(a_info.size()); /*** Prepare "vinfo" array ***/ @@ -993,10 +994,11 @@ static errr init_alloc(void) static void init_sets_aux() { auto const &set_info = game->edit_data.set_info; + auto &a_info = game->edit_data.a_info; - for (std::size_t i = 0; i < max_a_idx; i++) + for (auto &a_ref: a_info) { - a_info[i].set = -1; + a_ref.set = -1; } for (std::size_t i = 0; i < set_info.size(); i++) @@ -1018,6 +1020,7 @@ static void init_guardians(void) auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; /* Scan dungeons */ for (std::size_t i = 0; i < d_info.size(); i++) @@ -1034,7 +1037,7 @@ static void init_guardians(void) /* Mark the final artifact */ if (d_ptr->final_artifact) { - artifact_type *a_ptr = &a_info[d_ptr->final_artifact]; + auto a_ptr = &a_info[d_ptr->final_artifact]; a_ptr->flags |= TR_SPECIAL_GENE; } diff --git a/src/loadsave.cc b/src/loadsave.cc index 1329827f..c58279a2 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1057,6 +1057,7 @@ static bool_ wearable_p(object_type *o_ptr) static void do_item(object_type *o_ptr, ls_flag_t flag) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; byte old_dd; byte old_ds; @@ -1181,10 +1182,8 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) /* Paranoia */ if (o_ptr->name1) { - artifact_type *a_ptr; - /* Obtain the artifact info */ - a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Verify that artifact */ if (!a_ptr->name) o_ptr->name1 = 0; @@ -1852,6 +1851,8 @@ static void do_options(ls_flag_t flag) */ static bool_ do_inventory(ls_flag_t flag) { + auto const &a_info = game->edit_data.a_info; + if (flag == ls_flag_t::LOAD) { int slot = 0; @@ -2322,16 +2323,18 @@ static bool do_randarts(ls_flag_t flag) static bool do_artifacts(ls_flag_t flag) { + auto &a_info = game->edit_data.a_info; + u16b n_artifacts; if (flag == ls_flag_t::SAVE) { - n_artifacts = max_a_idx; + n_artifacts = a_info.size(); } do_u16b(&n_artifacts, flag); - if ((flag == ls_flag_t::LOAD) && (n_artifacts > max_a_idx)) + if ((flag == ls_flag_t::LOAD) && (n_artifacts > a_info.size())) { note("Too many artifacts!"); return false; diff --git a/src/monster2.cc b/src/monster2.cc index 17b5ab9a..9b82130e 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -431,6 +431,7 @@ static cptr funny_comments[MAX_COMMENT] = void delete_monster_idx(int i) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; /* Get location */ monster_type *m_ptr = &m_list[i]; @@ -1890,6 +1891,7 @@ void update_monsters(bool_ full) void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; object_type *o_ptr; diff --git a/src/object1.cc b/src/object1.cc index 42c3f9ff..8795bdbd 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -801,6 +801,7 @@ bool_ object_flags_no_set = FALSE; object_flag_set object_flags(object_type const *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; auto k_ptr = &k_info[o_ptr->k_idx]; @@ -810,7 +811,7 @@ object_flag_set object_flags(object_type const *o_ptr) /* Artifact */ if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; f = a_ptr->flags; @@ -833,6 +834,7 @@ object_flag_set object_flags(object_type const *o_ptr) int object_power(object_type *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; auto k_ptr = &k_info[o_ptr->k_idx]; int power = -1; @@ -858,9 +860,12 @@ int object_power(object_type *o_ptr) /* Artifact */ if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; - if (power == -1) power = a_ptr->power; + if (power == -1) + { + power = a_ptr->power; + } } return (power); @@ -874,6 +879,7 @@ int object_power(object_type *o_ptr) object_flag_set object_flags_known(object_type const *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; auto k_ptr = &k_info[o_ptr->k_idx]; @@ -892,7 +898,7 @@ object_flag_set object_flags_known(object_type const *o_ptr) /* Artifact */ if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Need full knowledge or spoilers */ if ((o_ptr->ident & IDENT_MENTAL)) @@ -1021,6 +1027,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -1686,7 +1693,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Grab any artifact name */ else if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Unique corpses don't require another name */ if (o_ptr->tval != TV_CORPSE) @@ -2144,6 +2151,7 @@ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode) cptr item_activation(object_type *o_ptr, byte num) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; /* Needed hacks */ static char rspell[2][80]; @@ -2517,6 +2525,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait auto const &set_info = game->edit_data.set_info; auto const &st_info = game->edit_data.st_info; auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; cptr vp[64]; byte vc[64]; @@ -2569,7 +2578,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (o_ptr->name1 && (!trim_down)) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; text_out_c(TERM_YELLOW, a_ptr->text); text_out("\n"); @@ -4065,6 +4074,8 @@ void display_equip(void) /* Get the color of the letter idx */ byte get_item_letter_color(object_type const *o_ptr) { + auto const &a_info = game->edit_data.a_info; + byte color = TERM_WHITE; /* Must have knowlegde */ @@ -6129,6 +6140,7 @@ void object_gain_level(object_type *o_ptr) bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) { auto &set_info = game->edit_data.set_info; + auto const &a_info = game->edit_data.a_info; auto s_ptr = &set_info[set_idx]; @@ -6164,6 +6176,7 @@ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) bool_ takeoff_set(s16b a_idx, s16b set_idx) { auto &set_info = game->edit_data.set_info; + auto const &a_info = game->edit_data.a_info; auto s_ptr = &set_info[set_idx]; @@ -6199,6 +6212,7 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx) void apply_set(s16b a_idx, s16b set_idx) { auto const &set_info = game->edit_data.set_info; + auto const &a_info = game->edit_data.a_info; auto s_ptr = &set_info[set_idx]; @@ -6230,6 +6244,7 @@ void apply_set(s16b a_idx, s16b set_idx) static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) { auto const &set_info = game->edit_data.set_info; + auto const &a_info = game->edit_data.a_info; if ( -1 == a_info[a_idx].set) { diff --git a/src/object2.cc b/src/object2.cc index e812340b..7134308f 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -380,6 +380,7 @@ void compact_objects(int size) void wipe_o_list(void) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; int i; @@ -1090,6 +1091,7 @@ s32b object_value_real(object_type const *o_ptr) { auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; s32b value; @@ -1118,7 +1120,7 @@ s32b object_value_real(object_type const *o_ptr) /* Artifact */ else if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Hack -- "worthless" artifacts */ if (!a_ptr->cost) return (0L); @@ -2136,6 +2138,8 @@ static void random_artifact_power(object_type *o_ptr) void random_artifact_resistance(object_type * o_ptr) { + auto const &a_info = game->edit_data.a_info; + auto const art_flags = a_info[o_ptr->name1].flags; // Check flags of the 'protype' artifact @@ -2193,14 +2197,15 @@ void random_artifact_resistance(object_type * o_ptr) static bool_ make_artifact_special(object_type *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &a_info = game->edit_data.a_info; /* No artifacts in the town */ if (!dun_level) return (FALSE); /* Check the artifact list (just the "specials") */ - for (int i = 0; i < max_a_idx; i++) + for (std::size_t i = 0; i < a_info.size(); i++) { - artifact_type *a_ptr = &a_info[i]; + auto a_ptr = &a_info[i]; /* Skip "empty" artifacts */ if (!a_ptr->name) continue; @@ -2273,6 +2278,7 @@ static bool_ make_artifact_special(object_type *o_ptr) */ static bool_ make_artifact(object_type *o_ptr) { + auto const &a_info = game->edit_data.a_info; auto const &k_info = game->edit_data.k_info; /* No artifacts in the town */ @@ -2282,9 +2288,9 @@ static bool_ make_artifact(object_type *o_ptr) if (o_ptr->number != 1) return (FALSE); /* Check the artifact list (skip the "specials") */ - for (int i = 0; i < max_a_idx; i++) + for (std::size_t i = 0; i < a_info.size(); i++) { - artifact_type *a_ptr = &a_info[i]; + auto a_ptr = &a_info[i]; /* Skip "empty" items */ if (!a_ptr->name) continue; @@ -3964,6 +3970,7 @@ void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *li void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional force_power) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; int i, rolls; auto k_ptr = &k_info[o_ptr->k_idx]; @@ -4102,7 +4109,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea /* Hack -- analyze artifacts */ if (o_ptr->name1) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; + auto a_ptr = &a_info[o_ptr->name1]; /* Hack -- Mark the artifact as "created" */ a_ptr->cur_num = 1; @@ -4885,6 +4892,7 @@ void place_object(int y, int x, bool_ good, bool_ great, int where) { auto const &d_info = game->edit_data.d_info; auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; s16b o_idx; @@ -5120,6 +5128,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) { auto const &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; int i, k, d, s; @@ -5550,6 +5559,8 @@ void inven_item_increase(int item, int num) */ bool_ inven_item_optimize(int item) { + auto const &a_info = game->edit_data.a_info; + object_type *o_ptr = &p_ptr->inventory[item]; /* Only optimize real items */ diff --git a/src/q_one.cc b/src/q_one.cc index 0c2753a0..e982501c 100644 --- a/src/q_one.cc +++ b/src/q_one.cc @@ -3,6 +3,7 @@ #include "artifact_type.hpp" #include "cave.hpp" #include "cave_type.hpp" +#include "game.hpp" #include "gods.hpp" #include "hook_calculate_hp_in.hpp" #include "hook_calculate_hp_out.hpp" @@ -232,6 +233,8 @@ static bool_ quest_one_identify_hook(void *, void *in_, void *) static bool_ quest_one_death_hook(void *, void *in_, void *) { + auto const &a_info = game->edit_data.a_info; + struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; diff --git a/src/q_rand.cc b/src/q_rand.cc index 7a1faa87..7f0b2503 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -219,6 +219,7 @@ bool_ is_randhero(int level) static void do_get_new_obj(int y, int x) { auto &k_info = game->edit_data.k_info; + auto &a_info = game->edit_data.a_info; object_type *q_ptr[3], forge[3]; int res, i; diff --git a/src/q_troll.cc b/src/q_troll.cc index 626897f0..dfb5a867 100644 --- a/src/q_troll.cc +++ b/src/q_troll.cc @@ -3,6 +3,7 @@ #include "artifact_type.hpp" #include "cave.hpp" #include "cave_type.hpp" +#include "game.hpp" #include "hook_monster_death_in.hpp" #include "hook_quest_finish_in.hpp" #include "hooks.hpp" @@ -27,6 +28,8 @@ GENERATE_MONSTER_LOOKUP_FN(get_forest_troll, "Forest troll") static bool_ quest_troll_gen_hook(void *, void *, void *) { + auto &a_info = game->edit_data.a_info; + int x, y; int xstart = 2; int ystart = 2; diff --git a/src/traps.cc b/src/traps.cc index 0f80f8d6..ccc84aea 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -475,6 +475,8 @@ static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap) */ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) { + auto const &a_info = game->edit_data.a_info; + bool_ ident = FALSE; s16b trap; diff --git a/src/variable.cc b/src/variable.cc index 4275f21f..542ba16d 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -428,11 +428,6 @@ player_class const *cp_ptr; player_spec const *spp_ptr; -/* - * The artifact arrays - */ -artifact_type *a_info; - /* * The ego-item arrays */ @@ -563,11 +558,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum number of artifacts in a_info.txt - */ -u16b max_a_idx; - /* * Maximum number of ego-items in e_info.txt */ diff --git a/src/variable.hpp b/src/variable.hpp index 430a1a46..829f0f2b 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -2,7 +2,6 @@ #include "angband.h" #include "alloc_entry_fwd.hpp" -#include "artifact_type_fwd.hpp" #include "birther.hpp" #include "cave_type_fwd.hpp" #include "deity_type.hpp" @@ -150,7 +149,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern artifact_type *a_info; extern ego_item_type *e_info; extern trap_type *t_info; extern int wildc2i[256]; @@ -164,7 +162,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_a_idx; extern u16b max_e_idx; extern u16b max_o_idx; extern u16b max_m_idx; diff --git a/src/wizard2.cc b/src/wizard2.cc index 6665102e..e3e93918 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -150,20 +150,24 @@ void do_cmd_rerate(void) */ static void wiz_create_named_art() { + auto const &a_info = game->edit_data.a_info; + object_type forge; object_type *q_ptr; int i, a_idx; cptr p = "Number of the artifact: "; char out_val[80] = ""; - artifact_type *a_ptr; if (!get_string(p, out_val, 4)) return; a_idx = atoi(out_val); /* Return if out-of-bounds */ - if ((a_idx <= 0) || (a_idx >= max_a_idx)) return; + if ((a_idx <= 0) || (a_idx >= static_cast(a_info.size()))) + { + return; + } - a_ptr = &a_info[a_idx]; + auto a_ptr = &a_info[a_idx]; /* Get local object */ q_ptr = &forge; @@ -821,6 +825,8 @@ static void wiz_reroll_item(object_type *o_ptr) */ static void wiz_statistics(object_type *o_ptr) { + auto &a_info = game->edit_data.a_info; + long i, matches, better, worse, other; char ch; diff --git a/src/xtra1.cc b/src/xtra1.cc index 27bdce71..c64b26ac 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -2820,6 +2820,7 @@ void calc_bonuses(bool_ silent) auto const &s_descriptors = game->edit_data.s_descriptors; auto const &r_info = game->edit_data.r_info; auto &s_info = game->s_info; + auto const &a_info = game->edit_data.a_info; static bool_ monk_notify_aux = FALSE; int i, j, hold; @@ -4384,15 +4385,17 @@ bool_ monk_heavy_armor(void) static int get_artifact_idx(int level) { + auto const &a_info = game->edit_data.a_info; + int count = 0, i; while (count < 1000) { - artifact_type *a_ptr; count++; - i = randint(max_a_idx - 1); - a_ptr = &a_info[i]; + i = rand_int(a_info.size()); + + auto a_ptr = &a_info[i]; if (!a_ptr->tval) continue; /* It is found/lost */ @@ -4561,6 +4564,8 @@ void gain_fate(byte fate) std::string fate_desc(int fate) { + auto const &a_info = game->edit_data.a_info; + fmt::MemoryWriter w; if (fates[fate].serious) @@ -4590,7 +4595,7 @@ std::string fate_desc(int fate) { object_type *q_ptr, forge; char o_name[80]; - artifact_type *a_ptr = &a_info[fates[fate].a_idx]; + auto a_ptr = &a_info[fates[fate].a_idx]; int I_kind; /* Failed artefact allocation XXX XXX XXX */ diff --git a/src/xtra2.cc b/src/xtra2.cc index bb757b4f..25333356 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -2404,6 +2404,7 @@ void monster_death(int m_idx) { auto const &d_info = game->edit_data.d_info; auto const &f_info = game->edit_data.f_info; + auto &a_info = game->edit_data.a_info; monster_type *m_ptr = &m_list[m_idx]; @@ -2715,7 +2716,7 @@ void monster_death(int m_idx) { if (a_info[a_idx].cur_num == 0) { - artifact_type *a_ptr = &a_info[a_idx]; + auto a_ptr = &a_info[a_idx]; /* Get local object */ q_ptr = &forge; -- cgit v1.2.3 From 89e75b855662b1dcc86a6dc3789fa496aafbb0a2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move e_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/cmd6.cc | 1 + src/ego_item_type_fwd.hpp | 3 --- src/game_edit_data.hpp | 6 ++++++ src/init1.cc | 13 +++---------- src/init2.cc | 2 +- src/loadsave.cc | 1 + src/object1.cc | 35 ++++++++++++++++++++++------------- src/object2.cc | 18 ++++++++++-------- src/variable.cc | 10 ---------- src/variable.hpp | 3 --- src/xtra2.cc | 13 +++++++------ 13 files changed, 51 insertions(+), 60 deletions(-) delete mode 100644 src/ego_item_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 75500706..8d4b16e1 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of ego-items in e_info.txt -M:E:200 - # Maximum number of trap types in tr_info.txt M:U:176 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index 51ed2fba..c90546ef 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of ego-items in e_info.txt -M:E:238 - # Maximum number of trap types in tr_info.txt M:U:176 diff --git a/src/cmd6.cc b/src/cmd6.cc index 93df49ad..d6df7570 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -5077,6 +5077,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; int plev = get_skill(SKILL_DEVICE); diff --git a/src/ego_item_type_fwd.hpp b/src/ego_item_type_fwd.hpp deleted file mode 100644 index 795f4403..00000000 --- a/src/ego_item_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct ego_item_type; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index 6a6fea9c..cc3af2dc 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -3,6 +3,7 @@ #include "ability_type.hpp" #include "artifact_type.hpp" #include "dungeon_info_type.hpp" +#include "ego_item_type.hpp" #include "feature_type.hpp" #include "hist_type.hpp" #include "monster_ego.hpp" @@ -55,6 +56,11 @@ struct GameEditData { */ std::vector a_info; + /** + * Ego items + */ + std::vector e_info; + /** * Artifact sets */ diff --git a/src/init1.cc b/src/init1.cc index 3912db12..185548ea 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3499,6 +3499,8 @@ static bool_ grab_one_ego_item_flag(object_flag_set *flags, ego_flag_set *ego, c */ errr init_e_info_txt(FILE *fp) { + auto &e_info = game->edit_data.e_info; + int i, cur_r = -1, cur_t = 0; char buf[1024]; char *s, *t; @@ -3547,9 +3549,6 @@ errr init_e_info_txt(FILE *fp) /* Verify information */ if (i < error_idx) return (4); - /* Verify information */ - if (i >= max_e_idx) return (2); - /* Save the index */ error_idx = i; @@ -3558,7 +3557,7 @@ errr init_e_info_txt(FILE *fp) cur_t = 0; /* Point at the "info" */ - e_ptr = &e_info[i]; + e_ptr = &expand_to_fit_index(e_info, i); /* Copy name */ assert(!e_ptr->name); @@ -6775,12 +6774,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_real_towns = atoi(zz[1]); } - /* Maximum e_idx */ - else if (zz[0][0] == 'E') - { - max_e_idx = atoi(zz[1]); - } - /* Maximum o_idx */ else if (zz[0][0] == 'O') { diff --git a/src/init2.cc b/src/init2.cc index 8181f2d1..ad2bed62 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -373,7 +373,7 @@ namespace { static void allocate() { - e_info = new ego_item_type[max_e_idx]; + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/loadsave.cc b/src/loadsave.cc index c58279a2..d9dfe452 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1058,6 +1058,7 @@ static void do_item(object_type *o_ptr, ls_flag_t flag) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &e_info = game->edit_data.e_info; byte old_dd; byte old_ds; diff --git a/src/object1.cc b/src/object1.cc index 8795bdbd..3c7da36e 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -835,6 +835,7 @@ int object_power(object_type *o_ptr) { auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; auto k_ptr = &k_info[o_ptr->k_idx]; int power = -1; @@ -845,15 +846,21 @@ int object_power(object_type *o_ptr) /* Ego-item */ if (o_ptr->name2) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; + auto e_ptr = &e_info[o_ptr->name2]; - if (power == -1) power = e_ptr->power; + if (power == -1) + { + power = e_ptr->power; + } if (o_ptr->name2b) { - ego_item_type *e_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2b]; - if (power == -1) power = e_ptr->power; + if (power == -1) + { + power = e_ptr->power; + } } } @@ -1028,6 +1035,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -1425,8 +1433,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Grab any ego-item name */ if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - ego_item_type *e2_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2]; + auto e2_ptr = &e_info[o_ptr->name2b]; if (e_ptr->before) { @@ -1509,8 +1517,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Grab any ego-item name */ if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - ego_item_type *e2_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2]; + auto e2_ptr = &e_info[o_ptr->name2b]; if (e_ptr->before) { @@ -1581,8 +1589,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Grab any ego-item name */ if (known && (o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - ego_item_type *e2_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2]; + auto e2_ptr = &e_info[o_ptr->name2b]; if (e_ptr->before) { @@ -1631,7 +1639,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) if (known && o_ptr->name2) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; + auto e_ptr = &e_info[o_ptr->name2]; t += e_ptr->name; } } @@ -1706,8 +1714,8 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) /* Grab any ego-item name */ else if ((o_ptr->name2 || o_ptr->name2b) && (o_ptr->tval != TV_ROD_MAIN)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - ego_item_type *e2_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2]; + auto e2_ptr = &e_info[o_ptr->name2b]; if (o_ptr->name2 && !e_ptr->before) { @@ -2152,6 +2160,7 @@ cptr item_activation(object_type *o_ptr, byte num) { auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; /* Needed hacks */ static char rspell[2][80]; diff --git a/src/object2.cc b/src/object2.cc index 7134308f..7c2bd7db 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -1092,6 +1092,7 @@ s32b object_value_real(object_type const *o_ptr) auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; s32b value; @@ -1132,7 +1133,7 @@ s32b object_value_real(object_type const *o_ptr) /* Ego-Item */ else if (o_ptr->name2) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; + auto e_ptr = &e_info[o_ptr->name2]; /* Hack -- "worthless" ego-items */ if (!e_ptr->cost) return (0L); @@ -1142,7 +1143,7 @@ s32b object_value_real(object_type const *o_ptr) if (o_ptr->name2b) { - ego_item_type *e_ptr = &e_info[o_ptr->name2b]; + auto e_ptr = &e_info[o_ptr->name2b]; /* Hack -- "worthless" ego-items */ if (!e_ptr->cost) return (0L); @@ -2352,6 +2353,7 @@ static bool_ make_artifact(object_type *o_ptr) static bool_ make_ego_item(object_type *o_ptr, bool_ good) { auto const &k_info = game->edit_data.k_info; + auto const &e_info = game->edit_data.e_info; bool_ ret = FALSE; auto k_ptr = &k_info[o_ptr->k_idx]; @@ -2361,9 +2363,9 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good) std::vector ok_ego; /* Grab the ok ego */ - for (size_t i = 0; i < max_e_idx; i++) + for (size_t i = 0; i < e_info.size(); i++) { - ego_item_type *e_ptr = &e_info[i]; + auto e_ptr = &e_info[i]; bool_ ok = FALSE; /* Skip "empty" items */ @@ -2403,7 +2405,7 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good) for (size_t i = 0; i < ok_ego.size() * 10; i++) { size_t j = ok_ego[rand_int(ok_ego.size())]; - ego_item_type *e_ptr = &e_info[j]; + auto e_ptr = &e_info[j]; /* XXX XXX Enforce minimum "depth" (loosely) */ if (e_ptr->level > dun_level) @@ -2442,7 +2444,7 @@ static bool_ make_ego_item(object_type *o_ptr, bool_ good) for (size_t i = 0; i < ok_ego.size() * 10; i++) { int j = ok_ego[rand_int(ok_ego.size())]; // Explicit int conversion to avoid warning - ego_item_type *e_ptr = &e_info[j]; + auto e_ptr = &e_info[j]; /* Cannot be a double ego of the same ego type */ if (j == o_ptr->name2) continue; @@ -3971,6 +3973,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto const &e_info = game->edit_data.e_info; int i, rolls; auto k_ptr = &k_info[o_ptr->k_idx]; @@ -4233,7 +4236,6 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea /* Hack -- analyze ego-items */ else if (o_ptr->name2) { - ego_item_type *e_ptr; int j; bool_ limit_blows = FALSE; s16b e_idx; @@ -4242,7 +4244,7 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea /* Ok now, THAT is truly ugly */ try_an_other_ego: - e_ptr = &e_info[e_idx]; + auto e_ptr = &e_info[e_idx]; /* Hack -- extra powers */ for (j = 0; j < FLAG_RARITY_MAX; j++) diff --git a/src/variable.cc b/src/variable.cc index 542ba16d..cfb1f7bf 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -428,11 +428,6 @@ player_class const *cp_ptr; player_spec const *spp_ptr; -/* - * The ego-item arrays - */ -ego_item_type *e_info; - /* jk */ /* the trap-arrays */ trap_type *t_info; @@ -558,11 +553,6 @@ bool_ (*get_obj_num_hook)(int k_idx); s32b get_level_max_stick = -1; s32b get_level_use_stick = -1; -/* - * Maximum number of ego-items in e_info.txt - */ -u16b max_e_idx; - /* * Maximum number of objects in the level */ diff --git a/src/variable.hpp b/src/variable.hpp index 829f0f2b..5b40a693 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -7,7 +7,6 @@ #include "deity_type.hpp" #include "dungeon_flag_set.hpp" #include "effect_type.hpp" -#include "ego_item_type_fwd.hpp" #include "fate.hpp" #include "monster_type_fwd.hpp" #include "object_type_fwd.hpp" @@ -149,7 +148,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern ego_item_type *e_info; extern trap_type *t_info; extern int wildc2i[256]; extern cptr DEFAULT_FEAT_TEXT; @@ -162,7 +160,6 @@ extern char *ANGBAND_DIR_DNGN; extern bool_ (*get_mon_num_hook)(int r_idx); extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); -extern u16b max_e_idx; extern u16b max_o_idx; extern u16b max_m_idx; extern u16b max_t_idx; diff --git a/src/xtra2.cc b/src/xtra2.cc index 25333356..bf39e8ce 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -5007,12 +5007,13 @@ void set_grace(s32b v) static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge, const char *what) { auto &k_info = game->edit_data.k_info; + auto const &e_info = game->edit_data.e_info; - int i, j, jb, save_aware; + int save_aware; char buf[200]; /* try all objects, this *IS* a very ugly and slow method :( */ - for (i = 0; i < k_info.size(); i++) + for (std::size_t i = 0; i < k_info.size(); i++) { auto k_ptr = &k_info[i]; @@ -5040,9 +5041,9 @@ static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge (o_ptr->tval == TV_ROD_MAIN && strstr(name, "rod of"))) { /* try all ego */ - for (j = max_e_idx - 1; j >= 0; j--) + for (std::size_t j = 0; j < e_info.size(); j++) { - ego_item_type *e_ptr = &e_info[j]; + auto e_ptr = &e_info[j]; bool_ ok = FALSE; if (j && !e_ptr->name) continue; @@ -5068,9 +5069,9 @@ static bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge } /* try all ego */ - for (jb = max_e_idx - 1; jb >= 0; jb--) + for (std::size_t jb = 0; jb < e_info.size(); jb++) { - ego_item_type *eb_ptr = &e_info[jb]; + auto eb_ptr = &e_info[jb]; bool_ ok = FALSE; if (jb && !eb_ptr->name) continue; -- cgit v1.2.3 From c25b265c056a4512b0fb0e1789927e6c4b7b32cf Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Move t_info into GameEditData --- lib/edit/misc.txt | 3 --- lib/mods/theme/edit/misc.txt | 3 --- src/birth.cc | 9 ++++++--- src/cave.cc | 2 ++ src/cmd1.cc | 2 ++ src/cmd2.cc | 7 ++++++- src/cmd4.cc | 6 ++++-- src/files.cc | 19 ++++++++++++++----- src/game_edit_data.hpp | 6 ++++++ src/init1.cc | 13 +++---------- src/init2.cc | 2 +- src/loadsave.cc | 6 ++++-- src/object1.cc | 12 +++++------- src/spells1.cc | 1 + src/trap_type_fwd.hpp | 3 --- src/traps.cc | 20 +++++++++++--------- src/variable.cc | 10 ---------- src/variable.hpp | 3 --- src/xtra2.cc | 1 + 19 files changed, 66 insertions(+), 62 deletions(-) delete mode 100644 src/trap_type_fwd.hpp diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt index 8d4b16e1..06a9fcce 100644 --- a/lib/edit/misc.txt +++ b/lib/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of trap types in tr_info.txt -M:U:176 - # Maximum size for "o_list[]" M:O:1024 diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt index c90546ef..07261ba3 100644 --- a/lib/mods/theme/edit/misc.txt +++ b/lib/mods/theme/edit/misc.txt @@ -12,9 +12,6 @@ M:X:101 # Maximum y size of the wilderness M:Y:66 -# Maximum number of trap types in tr_info.txt -M:U:176 - # Maximum size for "o_list[]" M:O:1024 diff --git a/src/birth.cc b/src/birth.cc index 63560757..b18a4b9a 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -723,6 +723,7 @@ static void player_wipe(void) auto &r_info = game->edit_data.r_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &t_info = game->edit_data.t_info; /* Wipe special levels */ wipe_saved(); @@ -882,10 +883,10 @@ static void player_wipe(void) } /* Wipe the known traps list */ - for (std::size_t i = 0; i < max_t_idx; i++) + for (auto &t_ref: t_info) { - t_info[i].known = 0; - t_info[i].ident = FALSE; + t_ref.known = 0; + t_ref.ident = FALSE; } /* Reset wild_mode to FALSE */ @@ -985,6 +986,8 @@ static void player_outfit_spellbook(cptr spell_name) */ static void player_outfit(void) { + auto &t_info = game->edit_data.t_info; + // Shorthand names for convenience cptr class_name = spp_ptr->title; auto const &subrace_name = rmp_ptr->title; diff --git a/src/cave.cc b/src/cave.cc index bb15055b..14046eb2 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -854,6 +854,7 @@ static void map_info(int y, int x, byte *ap, char *cp) auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; + auto const &t_info = game->edit_data.t_info; byte a; @@ -1285,6 +1286,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; + auto const &t_info = game->edit_data.t_info; byte a; diff --git a/src/cmd1.cc b/src/cmd1.cc index 726916c4..6f8a26e3 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -539,6 +539,8 @@ void carry(int pickup) */ static void hit_trap(void) { + auto &t_info = game->edit_data.t_info; + bool_ ident = FALSE; cave_type *c_ptr; diff --git a/src/cmd2.cc b/src/cmd2.cc index 3bd10c7b..e4378699 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -733,6 +733,8 @@ static void chest_death(int y, int x, s16b o_idx) */ static void chest_trap(int y, int x, s16b o_idx) { + auto &t_info = game->edit_data.t_info; + int trap; object_type *o_ptr = &o_list[o_idx]; @@ -1846,13 +1848,15 @@ void do_cmd_tunnel(void) */ static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) { + auto const &t_info = game->edit_data.t_info; + int i, j; bool_ more = FALSE; object_type *o_ptr = &o_list[o_idx]; - trap_type *t_ptr = &t_info[o_ptr->pval]; + auto t_ptr = &t_info[o_ptr->pval]; /* Take a turn */ @@ -1924,6 +1928,7 @@ static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) { auto const &f_info = game->edit_data.f_info; + auto const &t_info = game->edit_data.t_info; int i, j, power; diff --git a/src/cmd4.cc b/src/cmd4.cc index 26794840..8d1b0079 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3242,12 +3242,14 @@ void do_cmd_knowledge_artifacts(void) */ void do_cmd_knowledge_traps(void) { + auto const &t_info = game->edit_data.t_info; + fmt::MemoryWriter w; /* Scan the traps */ - for (int k = 0; k < max_t_idx; k++) + for (auto const &t_ref: t_info) { /* Get the trap */ - trap_type *t_ptr = &t_info[k]; + auto t_ptr = &t_ref; /* Skip "empty" traps */ if (!t_ptr->name) continue; diff --git a/src/files.cc b/src/files.cc index 7ccb0508..91ead001 100644 --- a/src/files.cc +++ b/src/files.cc @@ -222,6 +222,7 @@ errr process_pref_file_aux(char *buf) auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; + auto &t_info = game->edit_data.t_info; int i, j, n1, n2; @@ -336,13 +337,21 @@ errr process_pref_file_aux(char *buf) { if (tokenize(buf + 4, 3, zz, ':', '/') == 3) { - trap_type *t_ptr; - i = (huge)strtol(zz[0], NULL, 0); + std::size_t i = strtoul(zz[0], NULL, 0); n1 = strtol(zz[1], NULL, 0); n2 = strtol(zz[2], NULL, 0); - if (i >= max_t_idx) return (1); - t_ptr = &t_info[i]; - if (n1) t_ptr->g_attr = n1; + + if (i >= t_info.size()) + { + return 1; + } + + auto t_ptr = &t_info[i]; + + if (n1) + { + t_ptr->g_attr = n1; + } if (n2) { t_ptr->g_char = n2; diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index cc3af2dc..cd0a0b6b 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -19,6 +19,7 @@ #include "skill_descriptor.hpp" #include "store_action_type.hpp" #include "store_info_type.hpp" +#include "trap_type.hpp" #include "vault_type.hpp" #include "wilderness_type_info.hpp" @@ -141,4 +142,9 @@ struct GameEditData { */ std::vector ab_info; + /** + * Traps + */ + std::vector t_info; + }; diff --git a/src/init1.cc b/src/init1.cc index 185548ea..105aadda 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -4836,6 +4836,8 @@ static errr grab_one_trap_type_flag(trap_type *t_ptr, cptr what) */ errr init_t_info_txt(FILE *fp) { + auto &t_info = game->edit_data.t_info; + int i; char buf[1024]; char *s, *t; @@ -4882,14 +4884,11 @@ errr init_t_info_txt(FILE *fp) /* Verify information */ if (i <= error_idx) return (4); - /* Verify information */ - if (i >= max_t_idx) return (2); - /* Save the index */ error_idx = i; /* Point at the "info" */ - t_ptr = &t_info[i]; + t_ptr = &expand_to_fit_index(t_info, i); /* Copy name */ t_ptr->name = my_strdup(s); @@ -6786,12 +6785,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst max_m_idx = atoi(zz[1]); } - /* Maximum tr_idx */ - else if (zz[0][0] == 'U') - { - max_t_idx = atoi(zz[1]); - } - /* Maximum wilderness x size */ else if (zz[0][0] == 'X') { diff --git a/src/init2.cc b/src/init2.cc index ad2bed62..9590633e 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -517,7 +517,7 @@ namespace { static void allocate() { - t_info = make_array(max_t_idx); + // Nothing to do } static errr parse(FILE *fp) diff --git a/src/loadsave.cc b/src/loadsave.cc index d9dfe452..f412cc52 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2382,11 +2382,13 @@ static bool do_fates(ls_flag_t flag) static bool do_traps(ls_flag_t flag) { - u16b n_traps = max_t_idx; + auto &t_info = game->edit_data.t_info; + + u16b n_traps = t_info.size(); do_u16b(&n_traps, flag); - if ((flag == ls_flag_t::LOAD) && (n_traps > max_t_idx)) + if ((flag == ls_flag_t::LOAD) && (n_traps > t_info.size())) { note("Too many traps!"); return false; diff --git a/src/object1.cc b/src/object1.cc index 3c7da36e..d04c7ab2 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -636,8 +636,7 @@ void reset_visuals(void) auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; - - int i; + auto &t_info = game->edit_data.t_info; /* Extract some info about terrain features */ for (auto &f_ref: f_info) @@ -687,13 +686,11 @@ void reset_visuals(void) } /* Reset attr/char code for trap overlay graphics */ - for (i = 0; i < max_t_idx; i++) + for (auto &t_ref: t_info) { - trap_type *t_ptr = &t_info[i]; - /* Default attr/char */ - t_ptr->g_attr = 0; - t_ptr->g_char = 0; + t_ref.g_attr = 0; + t_ref.g_char = 0; } @@ -1036,6 +1033,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; auto const &e_info = game->edit_data.e_info; + auto const &t_info = game->edit_data.t_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; diff --git a/src/spells1.cc b/src/spells1.cc index 3eaf0303..e2a66184 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -6918,6 +6918,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; + auto const &t_info = game->edit_data.t_info; int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0; diff --git a/src/trap_type_fwd.hpp b/src/trap_type_fwd.hpp deleted file mode 100644 index 480edfef..00000000 --- a/src/trap_type_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct trap_type; diff --git a/src/traps.cc b/src/traps.cc index ccc84aea..a646d221 100644 --- a/src/traps.cc +++ b/src/traps.cc @@ -449,7 +449,9 @@ static bool_ player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd, */ static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap) { - trap_type *t_ptr = &t_info[trap]; + auto const &t_info = game->edit_data.t_info; + + auto t_ptr = &t_info[trap]; bool_ ident; s16b my_dd, my_ds, dam; @@ -1906,6 +1908,7 @@ bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) void player_activate_door_trap(s16b y, s16b x) { auto const &f_info = game->edit_data.f_info; + auto &t_info = game->edit_data.t_info; cave_type *c_ptr; bool_ ident = FALSE; @@ -1945,9 +1948,8 @@ void place_trap(int y, int x) { auto const &d_info = game->edit_data.d_info; auto const &f_info = game->edit_data.f_info; + auto const &t_info = game->edit_data.t_info; - s16b trap; - trap_type *t_ptr; int cnt; u32b flags; cave_type *c_ptr = &cave[y][x]; @@ -1975,8 +1977,8 @@ void place_trap(int y, int x) cnt = 100; while (cnt--) { - trap = randint(max_t_idx - 1); - t_ptr = &t_info[trap]; + std::size_t trap = rand_int(t_info.size()); + auto t_ptr = &t_info[trap]; /* No traps below their minlevel */ if (t_ptr->minlevel > dun_level) continue; @@ -2025,8 +2027,8 @@ void place_trap_leveled(int y, int x, int lev) */ void place_trap_object(object_type *o_ptr) { - s16b trap; - trap_type *t_ptr; + auto const &t_info = game->edit_data.t_info; + int cnt; /* No traps in town or on first level */ @@ -2041,8 +2043,8 @@ void place_trap_object(object_type *o_ptr) cnt = 100; while (cnt--) { - trap = randint(max_t_idx - 1); - t_ptr = &t_info[trap]; + std::size_t trap = rand_int(t_info.size()); + auto t_ptr = &t_info[trap]; /* no traps below their minlevel */ if (t_ptr->minlevel > dun_level) continue; diff --git a/src/variable.cc b/src/variable.cc index cfb1f7bf..f1d007ff 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -427,11 +427,6 @@ player_race_mod const *rmp_ptr; player_class const *cp_ptr; player_spec const *spp_ptr; - -/* jk */ -/* the trap-arrays */ -trap_type *t_info; - /* * The wilderness features arrays */ @@ -563,11 +558,6 @@ u16b max_o_idx; */ u16b max_m_idx; -/* - * Maximum number of traps in tr_info.txt - */ -u16b max_t_idx; - /* * Flags for initialization */ diff --git a/src/variable.hpp b/src/variable.hpp index 5b40a693..0fba970d 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -24,7 +24,6 @@ #include "skills_defs.hpp" #include "timer_type_fwd.hpp" #include "town_type_fwd.hpp" -#include "trap_type_fwd.hpp" #include "seed.hpp" extern int max_macrotrigger; @@ -148,7 +147,6 @@ extern player_class const *cp_ptr; extern player_spec const *spp_ptr; extern char player_name[32]; extern char player_base[32]; -extern trap_type *t_info; extern int wildc2i[256]; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; @@ -162,7 +160,6 @@ extern bool_ (*get_mon_num2_hook)(int r_idx); extern bool_ (*get_obj_num_hook)(int k_idx); extern u16b max_o_idx; extern u16b max_m_idx; -extern u16b max_t_idx; extern int init_flags; extern bool_ ambush_flag; extern bool_ fate_flag; diff --git a/src/xtra2.cc b/src/xtra2.cc index bf39e8ce..890ce975 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3902,6 +3902,7 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const &wf_info = game->edit_data.wf_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; + auto const &t_info = game->edit_data.t_info; cave_type *c_ptr = &cave[y][x]; -- cgit v1.2.3 From 551339813797a9b274ccf5f3f0c4f0d0b44cbf64 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:08 +0200 Subject: Remove "allocate" member function from the x_info traits --- src/init2.cc | 93 ------------------------------------------------------------ 1 file changed, 93 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 9590633e..bb909328 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -275,11 +275,6 @@ namespace { static constexpr char const *name = "f_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_f_info_txt(fp); @@ -291,11 +286,6 @@ namespace { static constexpr char const *name = "k_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_k_info_txt(fp); @@ -307,11 +297,6 @@ namespace { static constexpr char const *name = "set_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_set_info_txt(fp); @@ -323,11 +308,6 @@ namespace { static constexpr char const *name = "a_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_a_info_txt(fp); @@ -339,11 +319,6 @@ namespace { static constexpr char const *name = "s_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_s_info_txt(fp); @@ -355,11 +330,6 @@ namespace { static constexpr char const *name = "ab_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_ab_info_txt(fp); @@ -371,11 +341,6 @@ namespace { static constexpr char const *name = "e_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_e_info_txt(fp); @@ -387,11 +352,6 @@ namespace { static constexpr char const *name = "ra_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_ra_info_txt(fp); @@ -403,11 +363,6 @@ namespace { static constexpr char const *name = "r_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_r_info_txt(fp); @@ -419,11 +374,6 @@ namespace { static constexpr char const *name = "re_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_re_info_txt(fp); @@ -435,11 +385,6 @@ namespace { static constexpr char const *name = "d_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_d_info_txt(fp); @@ -451,11 +396,6 @@ namespace { static constexpr char const *name = "st_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_st_info_txt(fp); @@ -467,11 +407,6 @@ namespace { static constexpr char const *name = "ow_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_ow_info_txt(fp); @@ -483,11 +418,6 @@ namespace { static constexpr char const *name = "ba_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_ba_info_txt(fp); @@ -499,11 +429,6 @@ namespace { static constexpr char const *name = "wf_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_wf_info_txt(fp); @@ -515,11 +440,6 @@ namespace { static constexpr char const *name = "tr_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_t_info_txt(fp); @@ -531,11 +451,6 @@ namespace { static constexpr char const *name = "v_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_v_info_txt(fp); @@ -547,11 +462,6 @@ namespace { static constexpr char const *name = "p_info.txt"; - static void allocate() - { - // Nothing to do - } - static errr parse(FILE *fp) { return init_player_info_txt(fp); @@ -563,9 +473,6 @@ namespace { template static errr init_x_info() { - /* Allocate the data array */ - T::allocate(); - /* Build the filename */ boost::filesystem::path path(ANGBAND_DIR_EDIT); path /= T::name; -- cgit v1.2.3 From cbafbc638c2e1d5bb40ee6bc419007062e9615e4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:09 +0200 Subject: Remove traps Credit goes mostly to "miramor" who did most of the actual work. I just did a few minor tweaks and fixes + rebased onto master. --- lib/edit/a_info.txt | 52 - lib/edit/ab_info.txt | 7 - lib/edit/d_info.txt | 1 - lib/edit/e_info.txt | 144 -- lib/edit/k_info.txt | 115 -- lib/edit/p_info.txt | 82 +- lib/edit/r_info.txt | 26 - lib/edit/re_info.txt | 1 - lib/edit/s_info.txt | 27 +- lib/edit/st_info.txt | 1 - lib/help/debug.txt | 9 +- lib/mods/theme/edit/a_info.txt | 47 - lib/mods/theme/edit/ab_info.txt | 7 - lib/mods/theme/edit/d_info.txt | 1 - lib/mods/theme/edit/e_info.txt | 144 -- lib/mods/theme/edit/k_info.txt | 122 -- lib/mods/theme/edit/p_info.txt | 113 +- lib/mods/theme/edit/r_info.txt | 33 - lib/mods/theme/edit/re_info.txt | 1 - lib/mods/theme/edit/s_info.txt | 27 +- lib/mods/theme/edit/st_info.txt | 1 - lib/mods/theme/help/debug.txt | 9 +- src/CMakeLists.txt | 1 - src/birth.cc | 35 - src/cave.cc | 108 +- src/cave_type.hpp | 2 - src/cmd1.cc | 232 +-- src/cmd1.hpp | 4 +- src/cmd2.cc | 499 +------ src/cmd2.hpp | 2 +- src/cmd4.cc | 52 +- src/cmd5.cc | 7 - src/cmd6.cc | 41 +- src/cmd7.cc | 11 +- src/defines.h | 243 --- src/dungeon.cc | 42 +- src/files.cc | 55 +- src/game_edit_data.hpp | 6 - src/generate.cc | 279 +--- src/help.cc | 38 +- src/init1.cc | 219 +-- src/init2.cc | 16 - src/loadsave.cc | 31 - src/melee2.cc | 30 +- src/monster1.cc | 1 - src/monster_spell_flag_list.hpp | 1 - src/object1.cc | 89 -- src/object2.cc | 76 +- src/object2.hpp | 1 - src/object_flag_list.hpp | 10 - src/player_type.hpp | 4 - src/powers.cc | 7 - src/powers.hpp | 1 - src/q_eol.cc | 6 - src/q_fireprof.cc | 46 - src/q_god.cc | 3 +- src/q_haunted.cc | 14 - src/q_library.cc | 1 - src/skills.cc | 4 - src/skills_defs.hpp | 4 +- src/spells1.cc | 109 +- src/spells2.cc | 111 -- src/spells3.cc | 21 +- src/spells4.cc | 1 - src/spells5.cc | 24 - src/store.cc | 1 - src/tables.cc | 9 - src/trap_type.hpp | 24 - src/traps.cc | 3113 --------------------------------------- src/traps.hpp | 13 - src/wizard2.cc | 7 - src/xtra1.cc | 55 - src/xtra2.cc | 33 - 73 files changed, 167 insertions(+), 6545 deletions(-) delete mode 100644 src/trap_type.hpp delete mode 100644 src/traps.cc delete mode 100644 src/traps.hpp diff --git a/lib/edit/a_info.txt b/lib/edit/a_info.txt index 4f52a413..6ab4bf5d 100644 --- a/lib/edit/a_info.txt +++ b/lib/edit/a_info.txt @@ -3708,58 +3708,6 @@ D:This helm, designed by Petty-Dwarves ages ago to act as the brain of a D:long lost project, is made of finest glass. Its light banishes all secrets, D:and makes audible whispers from the deceased. - -### Trapping Kits ### - -### note prices and rarities may have to be adjusted ### - -# The Catapult Trap Set of Ahromarwar - -N:161:of Ahromarwar -I:46:1:3 -W:20:10:40:20000 -P:0:0d0:25:15:30 -F:AUTOMATIC_99 -F:HIDE_TYPE -F:STEALTH -F:XTRA_MIGHT -D:A trap that can almost never be detected. Its missiles may be mere pebbles, -D:but fired at an incredibly high velocity to penetrate even the toughest -D:hide or armour. - - -# The Device Trap Set 'Hanisbroner's Surprise' - -N:162:'Hanisbroner's Surprise' -I:46:6:3 -W:20:20:40:20000 -P:0:0d0:0:0:25 -F:AUTOMATIC_99 -F:HIDE_TYPE -F:STEALTH -F:TELEPORT_TO -F:XTRA_SHOTS -D:A magical trap, armed with a wand. Unaccountably, its victims keep -D:on coming back for more... - - -# The Bolt Trap Set 'Merlion Karc's Demonbane' - -N:163:'Merlion Karc's Demonbane' -I:46:3:2 -W:20:20:200:20000 -P:0:0d0:17:27:37 -F:HIDE_TYPE -F:ONLY_DEMON -F:STEALTH -F:XTRA_MIGHT -F:XTRA_SHOTS -D:A snare set not for animals, or people, but for demons alone, and -D:enchanted so that whenever the demon sets foot or claw into the -D:(hidden) pentagram, its hide is immediately pierced by many magical -D:crossbow bolts. - - # The Broken Sword 'Narsil' N:164:'Narsil' diff --git a/lib/edit/ab_info.txt b/lib/edit/ab_info.txt index ec878c67..579368f4 100644 --- a/lib/edit/ab_info.txt +++ b/lib/edit/ab_info.txt @@ -84,13 +84,6 @@ A:102:Far reaching attack k:15:Combat k:15:Polearm-mastery -N:9:Trapping -D:Ability to set monster traps -D:Prereq: Disarming@15 -I:10 -A:14:Set trap -k:15:Disarming - N:10:Undead Form D:Ability to turn into a weak undead being when you "die". D:You must then kill enough monsters to absorb enough life energy diff --git a/lib/edit/d_info.txt b/lib/edit/d_info.txt index 1029f547..fe20c276 100644 --- a/lib/edit/d_info.txt +++ b/lib/edit/d_info.txt @@ -343,7 +343,6 @@ S:BR_CONF S:CONF S:FORGET S:MULTIPLY -S:TRAPS # The Maze # Levels 25-37 diff --git a/lib/edit/e_info.txt b/lib/edit/e_info.txt index 0116d47c..0b85ce93 100644 --- a/lib/edit/e_info.txt +++ b/lib/edit/e_info.txt @@ -2150,150 +2150,6 @@ R:1 F:PVAL_M3 F:PVAL_M5 - -### Trapping Kits ### - -N:151:of Extra Might -X:A:0:5 -T:46:1:3 -W:0:1:10:1000 -C:20:20:0:2 -R:100 -F:XTRA_MIGHT -f:XTRA_MIGHT - -N:152:of Extra Shots -X:A:0:10 -T:46:0:99 -W:0:1:10:2000 -C:20:20:0:3 -R:100 -F:XTRA_SHOTS -f:XTRA_SHOTS - -N:153:Automatic -X:B:0:15 -T:46:0:99 -W:0:1:10:3000 -C:10:10:0:0 -R:100 -F:AUTOMATIC_5 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -f:AUTOMATIC_5 - -N:154:Fully Automatic -X:B:0:15 -T:46:0:99 -W:0:1:15:5000 -C:10:10:0:0 -R:100 -F:AUTOMATIC_99 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -f:AUTOMATIC_99 - -N:155:Well-hidden -X:B:0:5 -T:46:0:99 -W:0:1:8:1000 -C:15:15:5:12 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -F:STEALTH -f:STEALTH - -N:156:Complicated -X:B:0:10 -T:46:0:99 -W:0:1:12:2000 -C:15:15:30:0 -R:100 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:157:Obvious -X:B:0:0 -T:46:0:99 -W:0:1:1:0 -C:-20:-20:-20:-20 -R:100 -F:CURSED -F:HIDE_TYPE -F:STEALTH -f:STEALTH - -N:158:for Dragons -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_FIRE -F:ONLY_DRAGON -F:STEALTH -F:XTRA_SHOTS - -N:159:for Demons -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_FIRE -F:ONLY_DEMON -F:STEALTH -F:XTRA_SHOTS - -N:160:for Animals -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:ONLY_ANIMAL -F:STEALTH -F:XTRA_SHOTS - -N:161:for Undead -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:KILL_GHOST -F:ONLY_UNDEAD -F:STEALTH -F:XTRA_SHOTS - -N:162:for Evil -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:KILL_GHOST -F:ONLY_EVIL -F:STEALTH -F:XTRA_SHOTS - # Lite ego N:163:of the Magi X:A:0:0 diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 7bc01b5e..e998ac71 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -2015,14 +2015,6 @@ A:0/1 D:This scroll shows nearby objects to you. It only makes you aware of items on the floor, D:however, not those carried by creatures. -N:194:Trap Detection -G:?:d -I:70:28:0 -W:5:0:5:35 -A:5/1:10/1 -D:This scroll is very helpful, because it reveals the locations of nearby snares and traps which you -D:might otherwise blunder into. - ##### Extra ammunition ##### N:195:& Sheaf Arrow~ @@ -2095,22 +2087,6 @@ W:5:0:5:0 A:5/1 D:This nasty scroll will make a loud noise, waking up foes in your vicinity. -N:203:Trap Creation -G:?:d -I:70:7:0 -W:10:0:5:0 -A:10/1 -D:If you read this rather annoying scroll, snares and pitfalls will magically be planted all around -D:you, ready to do nasty things to you once you walk onto them. - -N:204:Trap/Door Destruction -G:?:d -I:70:39:0 -W:10:0:5:50 -A:10/1 -D:A very specifically destructive spell is written on this scroll. It will smash all traps and all -D:doors immediately next to you. - N:205:Artifact Creation G:?:d I:70:52:0 @@ -2982,13 +2958,6 @@ W:30:0:50:100 A:30/1 P:0:1d2:0:0:0 -N:307:Disarm -G:_:d -I:55:8:-1:SPELL=Disarm -W:2:0:50:100 -A:2/1 -P:0:1d2:0:0:0 - N:308:Teleportation G:_:d I:55:9:-1:SPELL=Teleportation @@ -3330,14 +3299,6 @@ A:15/1 P:0:1d1:0:0:0 D:When fuelled with enough ambient mana, this rod can detect nearby passages. -N:352:Trap Location -G:-:d -I:66:29:8 -W:5:0:15:100 -A:5/1:10/1:20/1 -P:0:1d1:0:0:0 -D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares. - N:354:Recall G:-:d I:66:3:80 @@ -3427,14 +3388,6 @@ A:45/2 P:0:1d1:0:0:0 D:This rod of movement will displace its target to another location. -N:365:Disarming -G:-:d -I:66:14:50 -W:35:0:15:2100 -A:35/1 -P:0:1d1:0:0:0 -D:This rod will clear a path for you, triggering and thus rendering harmless all traps on the way. - N:366:Lightning Balls G:-:d I:66:25:50 @@ -4960,27 +4913,6 @@ f:MUST2H D:This is a larger version of the curved oriental blade. D:Runes of war decorate its golden hilt. - -### Trapping Kits - -N:549:Arrow -G:`:r -I:46:2:0 -W:10:0:60:150 -A:10/2:50/2 -F:SHOW_MODS -D:It must be loaded with arrows, which will be -D:fired at the monster who triggers the trap. - -N:550:Bolt -G:`:o -I:46:3:0 -W:20:0:220:300 -A:20/2:50/2 -F:SHOW_MODS -D:It must be loaded with crossbow bolts, which will -D:be fired at the monster who triggers the trap. - N:551:& Fauchard~ G:/:s I:22:6:0 @@ -5028,17 +4960,6 @@ D:This is a two-edged dagger with a long blade. A favourite among travellers D:and warriors alike, it can be worn comfortably with plain clothes D:as well as armour. -### Trapping Kits - -N:555:Catapult -G:`:R -I:46:1:0 -W:1:0:50:40 -A:1/2:20/2 -F:SHOW_MODS -D:It must be loaded with sling bullets, which will -D:be fired at the monster who triggers the trap. - N:556:& Ring Mail~ G:[:s I:37:2:0 @@ -5075,16 +4996,6 @@ P:4:1d1:0:0:0 D:Heavy, multi-layered cloth sewn together to cover the body, D:with extra padding between layers. -### Trapping Kits - -N:560:Fumes -G:`:G -I:46:4:0 -W:2:0:20:50 -A:2/2:30/2 -D:It must be loaded with potions, which will splatter -D:over the monster who triggers the trap. - N:561:& Stone and Hide Armour~ G:(:U I:36:15:0 @@ -5093,32 +5004,6 @@ A:35/7 P:15:1d1:-1:0:0 D:A primitive armour made from a thick hide reinforced by stone shards. -### Trapping Kits - -N:562:Magic -G:`:g -I:46:5:0 -W:5:0:20:50 -A:5/2:40/2 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:It must be loaded with scrolls, which will release -D:their spells at the monster who triggers the trap. - -N:563:Device -G:`:v -I:46:6:0 -W:20:0:20:50 -A:20/2:40/2:60/2 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:It must be loaded with a magic device (wand, staff, or rod), which -D:will fire its spell at the monster who triggers the trap. - N:564:Nothing G:?:d I:70:53:0 diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index 8fdfb96e..dd78db25 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -78,9 +78,7 @@ C:k:+0:+400:Axe-mastery C:k:+0:+400:Hafted-mastery C:k:+0:+400:Polearm-mastery C:k:+1000:+600:Archery -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth -C:k:+1000:+900:Disarming C:k:+1000:+300:Magic C:k:+1000:+400:Spirituality C:k:+0:+550:Antimagic @@ -169,8 +167,6 @@ C:a:k:=0:=0:Axe-mastery C:a:k:=0:=0:Hafted-mastery C:a:k:=0:=0:Polearm-mastery C:a:k:+1000:-200:Archery -C:a:k:+1000:+900:Sneakiness -C:a:k:+1000:+900:Disarming C:a:k:+1000:+400:Magic C:a:k:+1000:+300:Spirituality C:a:k:=0:=0:Antimagic @@ -216,7 +212,6 @@ C:k:+0:+700:Thaumaturgy C:k:+1000:+550:Spirituality C:k:+1000:+200:Combat C:k:+700:+500:Weaponmastery -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth C:b:1:Perfect casting C:g:All Gods @@ -358,9 +353,7 @@ C:k:+0:+300:Crossbow-mastery C:k:+0:+300:Sling-mastery C:k:+0:+300:Boomerang-mastery C:k:+0:%150:Boulder-throwing -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth -C:k:+1000:+900:Disarming C:k:+1000:+300:Magic C:k:+0:+100:Magic-Device C:k:+1000:+400:Spirituality @@ -388,8 +381,6 @@ C:a:k:+0:+400:Magic C:a:k:+0:+500:Nature C:a:k:+0:+500:Divination C:a:k:+0:+500:Conveyance -C:a:k:+0:+700:Disarming -C:a:k:+0:+50:Sneakiness C:a:k:+0:+200:Monster-lore C:a:O:19:12:1d1 C:a:O:17:1:10d3 @@ -401,7 +392,7 @@ C:a:g:Yavanna Kementari C:N:3:2:Rogue C:D:0:Rogues are masters of tricks. They can steal from shops and monsters, -C:D:0:and lure monsters into deadly monster traps. +C:D:0:and excel at stealthily exploring the dungeon. C:D:1:Cutpurse C:D:1:Robber C:D:1:Burglar @@ -460,9 +451,7 @@ C:k:+0:+500:Conveyance C:k:+0:+500:Divination C:k:+0:+500:Temporal C:k:+1000:+700:Spirituality -C:k:+1000:+2000:Sneakiness C:k:+1000:+1500:Stealth -C:k:+1000:+2000:Disarming C:k:+1000:+1000:Backstab C:k:+1000:+2000:Stealing C:k:+1000:+2000:Dodging @@ -472,8 +461,6 @@ C:b:10:Extra Max Blow(1) C:a:N:Rogue C:a:D:Rogues are masters of tricks. They can steal from shops and monsters, C:a:D:and lure monsters into deadly monster traps. -C:a:b:1:Trapping -C:a:O:46:1:1d1 C:a:N:Assassin C:a:D:Assassins are stealthy killers. @@ -487,7 +474,6 @@ C:a:k:+0:-400:Conveyance C:a:k:+0:-400:Divination C:a:k:+0:-300:Temporal C:a:k:+0:+500:Stealth -C:a:k:+0:-1000:Disarming C:a:k:+0:+1000:Backstab C:a:k:+0:-1800:Stealing C:a:k:+0:-800:Magic-Device @@ -513,9 +499,7 @@ C:k:+1000:+700:Weaponmastery C:k:+1000:+700:Archery C:k:+1000:+700:Barehand-combat C:k:+0:+600:Magic -C:k:+1000:+700:Sneakiness C:k:+1000:+700:Stealth -C:k:+1000:+700:Disarming C:k:+1000:+700:Spirituality C:k:+1000:+600:Monster-lore C:k:+0:+500:Possession @@ -544,7 +528,6 @@ C:a:k:+0:-100:Combat C:a:k:+0:-100:Weaponmastery C:a:k:+0:-300:Archery C:a:k:-1000:-700:Barehand-combat -C:a:k:+0:-200:Disarming C:a:k:+0:-200:Spirituality C:a:k:+1000:+300:Possession C:a:k:+0:+200:Corpse-preservation @@ -562,7 +545,6 @@ C:a:k:+0:+100:Combat C:a:k:+0:+100:Weaponmastery C:a:k:+0:-100:Barehand-combat C:a:k:+1000:+100:Magic -C:a:k:+0:+100:Sneakiness C:a:k:+0:+100:Stealth C:a:k:+0:-200:Spirituality C:a:k:+0:-400:Possession @@ -580,7 +562,6 @@ C:a:k:+0:+100:Combat C:a:k:+0:+100:Weaponmastery C:a:k:+0:-100:Barehand-combat C:a:k:+1000:+100:Magic -C:a:k:+0:+100:Sneakiness C:a:k:+0:+100:Stealth C:a:k:+0:-200:Spirituality C:a:k:+0:-400:Possession @@ -599,9 +580,7 @@ C:a:k:+0:-100:Weaponmastery C:a:k:+0:-300:Archery C:a:k:-1000:-700:Barehand-combat C:a:k:+1000:+200:Magic -C:a:k:+0:+0:Sneakiness C:a:k:+0:+0:Stealth -C:a:k:+0:-200:Disarming C:a:k:+0:-200:Spirituality C:a:k:+15000:+100:Monster-lore C:a:k:+0:-500:Possession @@ -620,9 +599,7 @@ C:a:k:-1000:-400:Weaponmastery C:a:k:-1000:-300:Archery C:a:k:+0:+200:Barehand-combat C:a:k:+0:+0:Magic -C:a:k:+0:+200:Sneakiness C:a:k:+0:+200:Stealth -C:a:k:+0:+200:Disarming C:a:k:+0:+200:Spirituality C:a:k:+0:-400:Possession C:a:k:+0:-200:Corpse-preservation @@ -644,7 +621,6 @@ C:a:O:14:59:1d1 C:a:k:+1000:+0:Magic C:a:k:-1000:-700:Archery C:a:k:+0:-100:Barehand-combat -C:a:k:+0:-100:Disarming C:a:k:+0:+100:Spirituality C:a:k:+0:-500:Possession C:a:k:+0:-100:Summoning @@ -679,8 +655,6 @@ C:k:+1000:+1000:Spirituality C:k:+1000:+700:Prayer C:k:+2000:+700:Combat C:k:+1000:+700:Weaponmastery -C:k:+1000:+900:Sneakiness -C:k:+0000:+900:Disarming C:k:+0000:+400:Stealth C:k:+0:+50:Magic-Device C:b:1:Perfect casting @@ -748,7 +722,6 @@ C:a:g:Yavanna Kementari C:a:k:+0:-300:Prayer C:a:k:+0:-200:Necromancy C:a:k:+1000:+300:Mindcraft -C:a:k:+0:+200:Sneakiness C:a:k:+0:+100:Magic-Device @@ -802,11 +775,9 @@ R:C:Priest R:C:Rogue R:C:Warrior R:G:ELF -R:k:+200:+000:Disarming R:k:+300:+000:Magic-Device R:k:+1500:+000:Spirituality R:k:+1000:+000:Stealth -R:k:+600:+000:Sneakiness R:k:-100:+000:Weaponmastery R:k:+500:+000:Archery @@ -825,11 +796,9 @@ R:C:Mage R:C:Priest R:C:Warrior R:G:ELF -R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device R:k:+3000:+000:Spirituality R:k:+2000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:+1500:+000:Archery @@ -850,11 +819,9 @@ R:C:Mage R:C:Rogue R:C:Warrior R:k:+0:+300:Sling-mastery -R:k:+1500:+000:Disarming R:k:+1800:+000:Magic-Device R:k:+9000:+000:Spirituality R:k:+5000:+000:Stealth -R:k:+1200:+000:Sneakiness R:k:-1000:+000:Weaponmastery R:k:+2000:+000:Archery @@ -870,11 +837,9 @@ R:F:FREE_ACT R:C:Mage R:C:Rogue R:C:Warrior -R:k:+1000:+000:Disarming R:k:+1200:+000:Magic-Device R:k:+6000:+000:Spirituality R:k:+3000:+000:Stealth -R:k:+600:+000:Sneakiness R:k:-800:+000:Weaponmastery R:k:+1200:+000:Archery @@ -890,11 +855,9 @@ R:F:RES_BLIND R:C:Priest R:C:Warrior R:k:+0:+200:Axe-mastery -R:k:+200:+000:Disarming R:k:+900:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:-1000:+000:Stealth -R:k:+700:+000:Sneakiness R:k:+1500:+000:Weaponmastery R:k:+500:+000:Archery @@ -910,11 +873,9 @@ R:C:Archer R:C:Priest R:C:Rogue R:C:Warrior -R:k:-300:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality R:k:-1000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+1200:+000:Weaponmastery R:k:-500:+000:Archery @@ -930,11 +891,9 @@ R:F:SUST_STR R:R:15:0 R:F:REGEN R:C:Warrior -R:k:-500:+000:Disarming R:k:-800:+000:Magic-Device R:k:-4000:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2000:+000:Weaponmastery R:k:-1000:+000:Archery @@ -953,11 +912,9 @@ R:C:Mage R:C:Priest R:C:Rogue R:C:Warrior -R:k:+400:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality R:k:+2000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:+1500:+000:Weaponmastery R:k:+1000:+000:Archery @@ -977,11 +934,9 @@ R:C:Loremaster R:C:Mage R:C:Priest R:C:Warrior -R:k:+400:+000:Disarming R:k:+2000:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:+4000:+000:Stealth -R:k:+300:+000:Sneakiness R:k:+1000:+000:Weaponmastery R:k:+2500:+000:Archery @@ -997,11 +952,9 @@ R:F:RES_DARK R:F:SUST_STR R:C:Priest R:C:Warrior -R:k:-300:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1020,11 +973,9 @@ R:C:Loremaster R:C:Rogue R:C:Warrior R:k:+1000:+1000:Bearform-combat -R:k:-600:+000:Disarming R:k:-800:+000:Magic-Device R:k:-3000:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2500:+000:Weaponmastery R:k:+500:+000:Archery @@ -1039,11 +990,9 @@ R:F:RES_POIS R:C:Archer R:C:Rogue R:C:Warrior -R:k:-200:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality R:k:-1000:+000:Stealth -R:k:+100:+000:Sneakiness R:k:+1000:+000:Weaponmastery R:k:-800:+000:Archery @@ -1059,11 +1008,9 @@ R:F:RES_DARK R:F:RES_DISEN R:C:Rogue R:C:Warrior -R:k:+300:+000:Disarming R:k:+500:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:+1000:+000:Stealth -R:k:+500:+000:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1086,11 +1033,9 @@ R:C:Rogue R:C:Warrior R:G:ELF R:k:+0:+200:Magic -R:k:+500:+000:Disarming R:k:+1500:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:+3000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:+1000:+000:Archery @@ -1121,11 +1066,9 @@ R:O:70:32:2d3 R:b:1:Tree walking R:k:+0:+200:Barehand-combat R:k:+0:+600:Boulder-throwing -R:k:+500:+000:Disarming R:k:+500:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:-6000:+000:Stealth -R:k:+500:+000:Sneakiness R:k:-300:+000:Weaponmastery R:k:-200:+000:Archery @@ -1158,14 +1101,11 @@ R:R:45:1 R:F:SPEED R:C:Priest R:C:Warrior -R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality R:k:-8000:+000:Stealth -R:k:+100:+000:Sneakiness R:k:+100:+200:Weaponmastery R:k:+500:+000:Archery - R:N:17:Thunderlord R:D:A thunderlord is a Great Eagle of Manwe, ridden by a Maia of Manwe. R:D:They carry the power of wind and thunder. @@ -1193,11 +1133,9 @@ R:C:Archer R:C:Mage R:C:Priest R:C:Warrior -R:k:+600:+000:Disarming R:k:+000:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:-16000:+000:Stealth -R:k:+3000:+000:Sneakiness R:k:+1500:+000:Weaponmastery R:k:+500:+000:Archery @@ -1217,11 +1155,9 @@ R:F:RES_NEXUS R:C:Mage R:C:Priest R:k:+0:+200:Necromancy -R:k:+1500:+000:Disarming R:k:-500:+000:Magic-Device R:k:+7500:+000:Spirituality R:k:+25000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+2500:+000:Weaponmastery R:k:+2500:+000:Archery @@ -1236,11 +1172,9 @@ R:C:Mage R:C:Priest R:C:Rogue R:C:Warrior -R:k:-500:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality R:k:-5000:+000:Stealth -R:k:-500:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:-500:+000:Archery @@ -1262,11 +1196,9 @@ R:C:Warrior R:G:ELF R:k:+0:+200:Archery R:b:1:Tree walking -R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device R:k:+3000:+000:Spirituality R:k:+5000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:-2500:+000:Weaponmastery R:k:+4000:+000:Archery @@ -1340,12 +1272,10 @@ R:F:WIS R:C:Archer R:C:Mage R:C:Warrior -R:k:+000:+000:Disarming R:k:+000:+000:Magic-Device R:k:+000:+000:Spirituality R:k:=0:=0:Prayer R:k:+000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1465,11 +1395,9 @@ S:F:RES_POIS S:F:SEE_INVIS S:F:SLOW_DIGEST S:O:70:32:2d3 -S:k:+200:+000:Disarming S:k:+800:+000:Magic-Device S:k:+700:+000:Spirituality S:k:+2000:+000:Stealth -S:k:+200:+000:Sneakiness S:k:-500:+000:Weaponmastery S:k:-200:+000:Archery @@ -1509,11 +1437,9 @@ S:F:SEE_INVIS S:R:10:0 S:F:RES_COLD S:O:70:32:2d3 -S:k:-500:+000:Disarming S:k:-500:+000:Magic-Device S:k:+500:+000:Spirituality S:k:-1000:+000:Stealth -S:k:-100:+000:Sneakiness S:k:+800:+000:Weaponmastery S:k:+000:+000:Archery @@ -1552,11 +1478,9 @@ S:F:SLOW_DIGEST S:R:5:0 S:F:RES_COLD S:O:70:32:2d3 -S:k:-200:+000:Disarming S:k:-200:+000:Magic-Device S:k:+500:+000:Spirituality S:k:-1000:+000:Stealth -S:k:-100:+000:Sneakiness S:k:+500:+000:Weaponmastery S:k:+000:+000:Archery @@ -1574,11 +1498,9 @@ S:A:Troll S:C:F:Mage S:R:10:0 S:F:RES_FEAR -S:k:-200:+000:Disarming S:k:-1000:+000:Magic-Device S:k:+200:+000:Spirituality S:k:-2000:+000:Stealth -S:k:+000:+000:Sneakiness S:k:+1200:+000:Weaponmastery S:k:+500:+000:Archery @@ -1607,11 +1529,9 @@ S:A:Wood-Elf S:A:Yeek S:C:F:Archer S:C:F:Warrior -S:k:+500:+000:Disarming S:k:+1000:+000:Magic-Device S:k:+500:+000:Spirituality S:k:+3000:+000:Stealth -S:k:+400:+000:Sneakiness S:k:-500:+000:Weaponmastery S:k:-500:+000:Archery diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 9c9c852e..8af0e634 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -3059,7 +3059,6 @@ S:BA_POIS S:BO_COLD S:HEAL S:SLOW -S:TRAPS D:He's been spying for Saruman. He is a snivelling wretch with no morals. N:138:Robin Hood, the Outlaw @@ -3095,7 +3094,6 @@ F:ZANGBAND S:1_IN_5 S:ARROW_2 S:HEAL -S:TRAPS D:The legendary archer steals from the rich (you qualify). N:139:Nurgling @@ -9384,7 +9382,6 @@ S:S_MONSTER S:S_UNDEAD S:TELE_AWAY S:TELE_TO -S:TRAPS D:Nobody has ever seen It. N:394:Banshee @@ -9802,7 +9799,6 @@ S:SCARE S:SLOW S:S_KIN S:S_UNDEAD -S:TRAPS D:He is out to have revenge on those who have desecrated his tomb. N:410:Gwaihir the Windlord @@ -10264,7 +10260,6 @@ S:CONF S:HASTE S:HOLD S:SHRIEK -S:TRAPS D:This creature look like a pillar of rock. However, a closer D:inspection reveals a glaring eye and powerful tentacles, D:which crush its prey and feed it to the creature's hungry @@ -11824,7 +11819,6 @@ S:HEAL S:SCARE S:SLOW S:S_SPIDER -S:TRAPS D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the D:Unlight. Her poison is legendary, as is her ego. She normally guards the D:pass through Cirith Ungol, but occasionally goes out foraging for food to @@ -12316,7 +12310,6 @@ S:FORGET S:HASTE S:HOLD S:SCARE -S:TRAPS D:An embodiment of all the cardinal vices, he beholds you scornfully. N:498:Chaos master @@ -12932,7 +12925,6 @@ F:TAKE_ITEM S:1_IN_6 S:ARROW_2 S:BLINK -S:TRAPS D:Cool and confident, fast and lithe; protect your possessions quickly! N:517:The Watcher in the Water @@ -15484,7 +15476,6 @@ S:BO_ELEC S:BO_FIRE S:BO_ICEE S:HEAL -S:TRAPS D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and D:evil. @@ -16841,7 +16832,6 @@ S:S_DRAGON S:S_MONSTER S:S_UNDEAD S:TELE_TO -S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spell casting. @@ -19050,7 +19040,6 @@ S:BLINK S:CONF S:TELE_TO S:TPORT -S:TRAPS D:A class of its own: you are already too late to protect your possessions - D:and he seems to have studied magic too, and is a master of setting traps. @@ -20351,7 +20340,6 @@ F:TAKE_ITEM F:UNIQUE S:1_IN_6 S:S_BUG -S:TRAPS D:He may not code worth a dime, but he certainly knows how to make money. N:733:Santa Claus @@ -20402,7 +20390,6 @@ S:S_HI_UNDEAD S:S_UNDEAD S:S_UNIQUE S:TELE_AWAY -S:TRAPS D:Why would anybody want to kill Santa Claus? To get all the presents, D:of course! @@ -20638,7 +20625,6 @@ S:S_HI_DRAGON S:S_MONSTER S:S_UNDEAD S:TELE_TO -S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spell casting. You stagger at the mighty sound of his D:spells as they echo hollowly through the dungeon. @@ -21138,7 +21124,6 @@ S:CAUSE_4 S:MIND_BLAST S:SLOW S:S_UNDEAD -S:TRAPS D:A glowing skull possessed by sorcerous power. It need not move, but D:merely blast you with mighty magic. @@ -22137,7 +22122,6 @@ S:S_HI_DRAGON S:S_UNDEAD S:TELE_AWAY S:TPORT -S:TRAPS D:Originally known as the White, Saruman fell prey to Sauron's wiles. He D:searches forever for the One Ring, to become a mighty Sorcerer-King of the D:world. @@ -22170,7 +22154,6 @@ F:TAKE_ITEM F:UNIQUE S:1_IN_6 S:TELE_TO -S:TRAPS D:He is a master of disguise, an expert of stealth, a genius at traps, and D:moves with blinding speed. Check your pockets! @@ -23511,7 +23494,6 @@ S:S_KIN S:S_MONSTERS S:S_UNDEAD S:TELE_TO -S:TRAPS D:A stench of corruption and decay surrounds this sorcerer, who has clearly D:risen from the dead to continue his foul plots and schemes. @@ -24165,7 +24147,6 @@ S:HOLD S:S_HI_DEMON S:S_HI_UNDEAD S:TELE_TO -S:TRAPS D:The Mouth of Sauron is a mighty spell caster. So old that even he cannot D:remember his own name, his power and evil are undeniable. He believes D:unshakeably that he is unbeatable and laughs as he weaves his awesome @@ -24218,7 +24199,6 @@ S:HAND_DOOM S:HOLD S:S_HI_UNDEAD S:TELE_TO -S:TRAPS D:The dark master of the terrible fortress of southern Mirkwood. It is D:rumoured that this is in fact none other than Sauron in disguise: D:although if this is so, he has yet to reveal his full power - and perhaps @@ -26366,7 +26346,6 @@ S:S_RNG S:S_THUNDERLORD S:TELE_TO S:TPORT -S:TRAPS D:He is the master of coding; none can match his skill. He created the D:Variant Maintainer, the RNGs, and the software bugs. Bull Gates is D:nothing next to him. Do not think that since he loves the novels of @@ -28273,7 +28252,6 @@ S:S_KIN S:S_MONSTERS S:TELE_AWAY S:TPORT -S:TRAPS D:The wizard who opposed Sauron and, in the end, was the only D:one of the Istari to succeed in his task. Gandalf is very D:wise and specialises in fire magic. @@ -29844,7 +29822,6 @@ S:S_ANGEL S:S_UNIQUE S:TELE_TO S:TPORT -S:TRAPS D:A woman of mind-shattering beauty, none can match her beauty. She is perfect, D:and totally evil. She loves nothing but herself and her evil is as D:great as her beauty. No one can stand against her, even DarkGod. @@ -31914,7 +31891,6 @@ S:SCARE S:SHRIEK S:S_KIN S:S_MONSTER -S:TRAPS D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -32364,7 +32340,6 @@ S:HEAL S:SCARE S:SHRIEK S:TELE_AWAY -S:TRAPS D:Hopefully you will kill this spirit before you realise it exists. # Spirit of ickyness @@ -32616,7 +32591,6 @@ S:ARROW_3 S:BLINK S:CONF S:TELE_TO -S:TRAPS D:There is something attractive about this spirit, and it seems D:to have a full purse. diff --git a/lib/edit/re_info.txt b/lib/edit/re_info.txt index 2b111067..9b89f19d 100644 --- a/lib/edit/re_info.txt +++ b/lib/edit/re_info.txt @@ -284,7 +284,6 @@ S:HEAL S:HOLD S:S_MONSTER S:TPORT -S:TRAPS N:10:Archer G:*:W diff --git a/lib/edit/s_info.txt b/lib/edit/s_info.txt index b6c195dc..d708f177 100644 --- a/lib/edit/s_info.txt +++ b/lib/edit/s_info.txt @@ -338,19 +338,10 @@ E:Thaumaturgy:Antimagic ################################## SNEAKINESS SKILLS ############################### -N:35:Sneakiness -D:General ability at the sneakiness skills. -D:It also affects the searching abilities -F:RANDOM_GAIN - N:36:Stealth D:Ability to move unnoticed, silently F:RANDOM_GAIN -N:37:Disarming -D:Ability to disarm the various traps -F:RANDOM_GAIN - N:40:Stealing D:Ability to steal objects A:15:Steal object @@ -359,11 +350,9 @@ N:46:Dodging D:Ability to dodge blows and bolts A:16:Check dodge chance -f:Stealth:Sneakiness%15 -f:Disarming:Sneakiness%10 -f:Backstab:Sneakiness%5 -f:Stealing:Sneakiness%15 -f:Dodging:Sneakiness%10 +f:Backstab:Stealth%5 +f:Stealing:Stealth%15 +f:Dodging:Stealth%10 ################################## MONSTER SKILLS ################################ @@ -426,12 +415,10 @@ T:Combat:Bearform-combat T:Combat:Boulder-throwing T:Combat:Antimagic -T:Main:Sneakiness -T:Sneakiness:Stealth -T:Sneakiness:Disarming -T:Sneakiness:Backstab -T:Sneakiness:Stealing -T:Sneakiness:Dodging +T:Main:Stealth +T:Stealth:Backstab +T:Stealth:Stealing +T:Stealth:Dodging T:Main:Magic T:Magic:Magic-Device diff --git a/lib/edit/st_info.txt b/lib/edit/st_info.txt index f2e6f281..b5ae29cf 100644 --- a/lib/edit/st_info.txt +++ b/lib/edit/st_info.txt @@ -165,7 +165,6 @@ I:100:Monster Confusion I:100:Magic Mapping I:100:Treasure Detection I:100:Object Detection -I:100:Trap Detection I:100:Detect Invisible I:100:Recharging I:100:Satisfy Hunger diff --git a/lib/help/debug.txt b/lib/help/debug.txt index 5328af35..8aea13ee 100644 --- a/lib/help/debug.txt +++ b/lib/help/debug.txt @@ -29,7 +29,7 @@ will not be scored if you use debug commands. *****debug.txt*29[o Edit object attributes] O (unused) *****debug.txt*31[p Phase door] P (unused) *****debug.txt*33[q Get a quest] Q (unused) - r (unused) *****debug.txt*36[R Create a trap] + r (unused) R (unused) *****debug.txt*37[s Summon monster] *****debug.txt*38[S Change the feature of the map] *****debug.txt*39[t Teleport] *****debug.txt*40[T Teleport to a town] *****debug.txt*41[u Complete map] *****debug.txt*42[U Become undead] @@ -105,7 +105,7 @@ maximal legal value. For example : 03^AC will create the Arkenstone of Thrane (+3) ~~~~~7 [[[[[GDetect all (d)] - Sense ways out/monsters/objects/traps. + Sense ways out/monsters/objects. ~~~~~8 [[[[[GTeleport to the wilderness (D)] From a dungeon this will teleport you to the wilderness level @@ -179,11 +179,6 @@ maximal legal value. ~~~~~35 [[[[[GGain reward (r)] Some high being grants you a reward. -~~~~~36 -[[[[[GCreate a trap (R)] - Use the "Command count", aka 0, to specify a number from - tr_info.txt to put a trap on the ground where you are - standing. ~~~~~37 [[[[[GSummon monster (s)] Summon a random monster, next to where you stand. diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt index b822ab60..65e931c1 100644 --- a/lib/mods/theme/edit/a_info.txt +++ b/lib/mods/theme/edit/a_info.txt @@ -3725,53 +3725,6 @@ D:This helm, designed by Petty-Dwarves ages ago to act as the brain of a D:long lost project, is made of finest glass. Its light banishes all secrets, D:and makes audible whispers from the deceased. - -### Trapping Kits ### - -# The Catapult Trap Set of the Edain - -N:161:of the Edain -I:46:3:3 -W:20:10:40:20000 -P:0:0d0:25:15:30 -F:AUTOMATIC_99 -F:HIDE_TYPE -F:STEALTH -F:XTRA_MIGHT -D:A trap that can almost never be detected. Its missiles may be mere pebbles, -D:but fired at an incredibly high velocity to penetrate even the toughest -D:hide or armour. - -# The Device Trap Set of the Noegyth Nibin - -N:162:of the Noegyth Nibin -I:46:6:3 -W:20:20:40:20000 -P:0:0d0:0:0:25 -F:AUTOMATIC_99 -F:HIDE_TYPE -F:STEALTH -F:TELEPORT_TO -F:XTRA_SHOTS -D:A magical trap, armed with a wand. Unaccountably, its victims keep -D:on coming back for more... - -# The Bolt Trap Set of the Naugrim - -N:163:of the Naugrim -I:46:2:2 -W:20:20:200:20000 -P:0:0d0:17:27:37 -F:HIDE_TYPE -F:ONLY_DEMON -F:STEALTH -F:XTRA_MIGHT -F:XTRA_SHOTS -D:A snare set not for animals, or people, but for demons alone, and -D:enchanted so that whenever the demon sets foot or claw into the -D:(hidden) pentagram, its hide is immediately pierced by many magical -D:crossbow bolts. - # The Broken Sword 'Narsil' N:164:'Narsil' diff --git a/lib/mods/theme/edit/ab_info.txt b/lib/mods/theme/edit/ab_info.txt index ec878c67..579368f4 100644 --- a/lib/mods/theme/edit/ab_info.txt +++ b/lib/mods/theme/edit/ab_info.txt @@ -84,13 +84,6 @@ A:102:Far reaching attack k:15:Combat k:15:Polearm-mastery -N:9:Trapping -D:Ability to set monster traps -D:Prereq: Disarming@15 -I:10 -A:14:Set trap -k:15:Disarming - N:10:Undead Form D:Ability to turn into a weak undead being when you "die". D:You must then kill enough monsters to absorb enough life energy diff --git a/lib/mods/theme/edit/d_info.txt b/lib/mods/theme/edit/d_info.txt index 149c2a73..0f8680af 100644 --- a/lib/mods/theme/edit/d_info.txt +++ b/lib/mods/theme/edit/d_info.txt @@ -344,7 +344,6 @@ S:BR_CONF S:CONF S:FORGET S:MULTIPLY -S:TRAPS # The Maze # Levels 25-37 diff --git a/lib/mods/theme/edit/e_info.txt b/lib/mods/theme/edit/e_info.txt index c17a589d..9fe63b5d 100644 --- a/lib/mods/theme/edit/e_info.txt +++ b/lib/mods/theme/edit/e_info.txt @@ -2179,150 +2179,6 @@ R:1 F:PVAL_M3 F:PVAL_M5 - -### Trapping Kits ### - -N:151:of Extra Might -X:A:0:5 -T:46:1:3 -W:0:1:10:1000 -C:20:20:0:2 -R:100 -F:XTRA_MIGHT -f:XTRA_MIGHT - -N:152:of Extra Shots -X:A:0:10 -T:46:0:99 -W:0:1:10:2000 -C:20:20:0:3 -R:100 -F:XTRA_SHOTS -f:XTRA_SHOTS - -N:153:Automatic -X:B:0:15 -T:46:0:99 -W:0:1:10:3000 -C:10:10:0:0 -R:100 -F:AUTOMATIC_5 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -f:AUTOMATIC_5 - -N:154:Fully Automatic -X:B:0:15 -T:46:0:99 -W:0:1:15:5000 -C:10:10:0:0 -R:100 -F:AUTOMATIC_99 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -f:AUTOMATIC_99 - -N:155:Well-hidden -X:B:0:5 -T:46:0:99 -W:0:1:8:1000 -C:15:15:5:12 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -F:STEALTH -f:STEALTH - -N:156:Complicated -X:B:0:10 -T:46:0:99 -W:0:1:12:2000 -C:15:15:30:0 -R:100 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:157:Obvious -X:B:0:0 -T:46:0:99 -W:0:1:1:0 -C:-20:-20:-20:-20 -R:100 -F:CURSED -F:HIDE_TYPE -F:STEALTH -f:STEALTH - -N:158:for Dragons -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_FIRE -F:ONLY_DRAGON -F:STEALTH -F:XTRA_SHOTS - -N:159:for Demons -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:IGNORE_ACID -F:IGNORE_FIRE -F:ONLY_DEMON -F:STEALTH -F:XTRA_SHOTS - -N:160:for Animals -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:ONLY_ANIMAL -F:STEALTH -F:XTRA_SHOTS - -N:161:for Undead -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:KILL_GHOST -F:ONLY_UNDEAD -F:STEALTH -F:XTRA_SHOTS - -N:162:for Evil -X:A:0:5 -T:46:0:99 -W:0:3:10:500 -C:20:20:10:4 -R:100 -F:HIDE_TYPE -F:KILL_GHOST -F:ONLY_EVIL -F:STEALTH -F:XTRA_SHOTS - # Lite ego N:163:of the Magi X:A:0:0 diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index a4c5d2db..30700595 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -1941,14 +1941,6 @@ A:0/1 D:This scroll shows nearby objects to you. It only makes you aware of items on the floor, D:however, not those carried by creatures. -N:194:Trap Detection -G:?:d -I:70:28:0 -W:5:0:5:35 -A:5/1:10/1 -D:This scroll is very helpful, because it reveals the locations of nearby snares and traps which you -D:might otherwise blunder into. - ##### Extra ammunition ##### N:195:& Sheaf Arrow~ @@ -2021,22 +2013,6 @@ W:5:0:5:0 A:5/1 D:This nasty scroll will make a loud noise when read, waking up foes in your vicinity. -N:203:Trap Creation -G:?:d -I:70:7:0 -W:10:0:5:0 -A:10/1 -D:If you read this rather annoying scroll, snares and pitfalls will magically be planted all around -D:you, ready to do nasty things to you once you walk onto them. - -N:204:Trap/Door Destruction -G:?:d -I:70:39:0 -W:10:0:5:50 -A:10/1 -D:A very specifically destructive spell is written on this scroll. It will smash all traps and all -D:doors immediately next to you. - N:205:Artifact Creation G:?:d I:70:52:0 @@ -2908,13 +2884,6 @@ W:30:0:50:100 A:30/1 P:0:1d2:0:0:0 -N:307:Disarm -G:_:d -I:55:8:-1:SPELL=Disarm -W:2:0:50:100 -A:2/1 -P:0:1d2:0:0:0 - N:308:Teleportation G:_:d I:55:9:-1:SPELL=Teleportation @@ -3265,18 +3234,6 @@ F:IGNORE_ELEC F:IGNORE_FIRE D:When fuelled with enough ambient mana, this rod can detect nearby passages. -N:352:Trap Location -G:-:d -I:66:29:8 -W:5:0:15:100 -A:5/1:10/1:20/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares. - N:354:Recall G:-:d I:66:3:80 @@ -3412,18 +3369,6 @@ F:IGNORE_ELEC F:IGNORE_FIRE D:This rod of movement will displace its target to another location. -N:365:Disarming -G:-:d -I:66:14:50 -W:35:0:15:2100 -A:35/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:This rod will clear a path for you, triggering and thus rendering harmless all traps on the way. - N:366:Lightning Balls G:-:d I:66:25:50 @@ -5000,26 +4945,6 @@ D:This is a larger version of the curved oriental blade. D:Runes of war decorate its golden hilt. -### Trapping Kits - -N:549:Arrow -G:`:r -I:46:2:0 -W:10:0:60:150 -A:10/2:50/2 -F:SHOW_MODS -D:It must be loaded with arrows, which will be -D:fired at the monster who triggers the trap. - -N:550:Bolt -G:`:o -I:46:3:0 -W:20:0:220:300 -A:20/2:50/2 -F:SHOW_MODS -D:It must be loaded with crossbow bolts, which will -D:be fired at the monster who triggers the trap. - N:551:& Fauchard~ G:/:s I:22:6:0 @@ -5067,17 +4992,6 @@ D:This is a two-edged dagger with a long blade. A favourite among travellers D:and warriors alike, because it can be worn comfortably with plain clothes D:as well as armour. -### Trapping Kits - -N:555:Catapult -G:`:R -I:46:1:0 -W:1:0:50:40 -A:1/2:20/2 -F:SHOW_MODS -D:It must be loaded with sling bullets, which will -D:be fired at the monster who triggers the trap. - N:556:& Ring Mail~ G:[:s I:37:2:0 @@ -5116,16 +5030,6 @@ P:4:1d1:0:0:0 D:Heavy, multi-layered cloth sewn together to cover the body, D:with extra padding between layers. -### Trapping Kits - -N:560:Fumes -G:`:G -I:46:4:0 -W:2:0:20:50 -A:2/2:30/2 -D:It must be loaded with potions, which will splatter -D:over the monster who triggers the trap. - N:561:& Golden Ring Mail~ G:(:y I:36:15:0 @@ -5135,32 +5039,6 @@ P:8:1d4:-1:0:0 D:A suit of non-overlapping thin golden rings sewn onto a soft leather D:backing. It looks beautiful, and is worn on special occasions. -### Trapping Kits - -N:562:Magic -G:`:g -I:46:5:0 -W:5:0:20:50 -A:5/2:40/2 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:It must be loaded with scrolls, which will release -D:their spells at the monster who triggers the trap. - -N:563:Device -G:`:v -I:46:6:0 -W:20:0:20:50 -A:20/2:40/2:60/2 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:It must be loaded with a magic device (wand, staff, or rod), which -D:will fire its spell at the monster who triggers the trap. - # XXX # XXX # XXX diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index e1b06ca5..5cf09fea 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -78,9 +78,7 @@ C:k:+0:+400:Axe-mastery C:k:+0:+400:Hafted-mastery C:k:+0:+400:Polearm-mastery C:k:+1000:+600:Archery -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth -C:k:+1000:+900:Disarming C:k:+1000:+300:Magic C:k:+1000:+400:Spirituality C:k:+0:+550:Antimagic @@ -178,8 +176,6 @@ C:a:k:=0:=0:Axe-mastery C:a:k:=0:=0:Hafted-mastery C:a:k:=0:=0:Polearm-mastery C:a:k:+1000:-200:Archery -C:a:k:+1000:+900:Sneakiness -C:a:k:+1000:+900:Disarming C:a:k:+1000:+400:Magic C:a:k:+1000:+300:Spirituality C:a:k:=0:=0:Antimagic @@ -241,7 +237,6 @@ C:k:+0:+700:Thaumaturgy C:k:+1000:+550:Spirituality C:k:+1000:+200:Combat C:k:+700:+500:Weaponmastery -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth C:b:1:Perfect casting C:g:All Gods @@ -421,9 +416,7 @@ C:k:+0:+300:Crossbow-mastery C:k:+0:+300:Sling-mastery C:k:+0:+300:Boomerang-mastery C:k:+0:%150:Boulder-throwing -C:k:+1000:+900:Sneakiness C:k:+0000:+400:Stealth -C:k:+1000:+900:Disarming C:k:+1000:+300:Magic C:k:+0:+100:Magic-Device C:k:+1000:+400:Spirituality @@ -451,8 +444,6 @@ C:a:k:+0:+200:Weaponmastery C:a:k:+0:+400:Magic C:a:k:+0:+500:Nature C:a:k:+0:+500:Divination -C:a:k:+0:+700:Disarming -C:a:k:+0:+50:Sneakiness C:a:k:+0:+200:Monster-lore C:a:k:+0:+300:Summoning C:a:O:19:12:1d1 @@ -467,15 +458,12 @@ C:a:g:Varda Elentari C:a:g:Aule the Smith C:a:g:Ulmo C:a:g:Mandos -C:a:b:1:Trapping C:a:N:Sniper C:a:D:Snipers are very stealthy archers without much hand-to-hand combat C:a:D:ability, but with a penchant to disappear when it suits them. C:a:k:+0:-300:Combat -C:a:k:+1000:+100:Sneakiness C:a:k:+1000:+700:Stealth -C:a:k:+0:+100:Disarming C:a:k:+1000:+700:Backstab C:a:k:+0:+300:Magic C:a:k:+1000:+500:Conveyance @@ -485,7 +473,7 @@ C:a:g:All Gods C:N:3:2:Rogue C:D:0:Rogues are masters of tricks. They can steal from shops and monsters, -C:D:0:and lure monsters into deadly monster traps. +C:D:0:and excel at stealthily exploring the dungeon. C:D:1:Cutpurse C:D:1:Robber C:D:1:Burglar @@ -544,9 +532,7 @@ C:k:+0:+500:Conveyance C:k:+0:+500:Divination C:k:+0:+500:Temporal C:k:+1000:+700:Spirituality -C:k:+1000:+2000:Sneakiness C:k:+1000:+1500:Stealth -C:k:+1000:+2000:Disarming C:k:+1000:+1000:Backstab C:k:+1000:+2000:Stealing C:k:+1000:+2000:Dodging @@ -556,7 +542,6 @@ C:b:10:Extra Max Blow(1) C:a:N:Rogue C:a:D:Rogues are masters of tricks. They can steal from shops and monsters, C:a:D:and lure monsters into deadly monster traps. -C:a:b:1:Trapping C:a:O:46:1:1d1 C:a:N:Assassin @@ -571,7 +556,6 @@ C:a:k:+0:-400:Conveyance C:a:k:+0:-400:Divination C:a:k:+0:-300:Temporal C:a:k:+0:+500:Stealth -C:a:k:+0:-1000:Disarming C:a:k:+0:+1000:Backstab C:a:k:+0:-1800:Stealing C:a:k:+0:-550:Magic-Device @@ -610,9 +594,7 @@ C:k:+1000:+700:Weaponmastery C:k:+1000:+700:Archery C:k:+1000:+700:Barehand-combat C:k:+0:+600:Magic -C:k:+1000:+700:Sneakiness C:k:+1000:+700:Stealth -C:k:+1000:+700:Disarming C:k:+1000:+700:Spirituality C:k:+1000:+600:Monster-lore C:k:+0:+500:Possession @@ -641,7 +623,6 @@ C:a:k:+0:-100:Combat C:a:k:+0:-100:Weaponmastery C:a:k:+0:-300:Archery C:a:k:-1000:-700:Barehand-combat -C:a:k:+0:-200:Disarming C:a:k:+0:-200:Spirituality C:a:k:+1000:+300:Possession C:a:k:+0:+200:Corpse-preservation @@ -660,7 +641,6 @@ C:a:k:+0:+100:Combat C:a:k:+0:+100:Weaponmastery C:a:k:+0:-100:Barehand-combat C:a:k:+1000:+100:Magic -C:a:k:+0:+100:Sneakiness C:a:k:+0:+100:Stealth C:a:k:+0:-200:Spirituality C:a:k:+0:-400:Possession @@ -679,7 +659,6 @@ C:a:k:+0:+100:Combat C:a:k:+0:+100:Weaponmastery C:a:k:+0:-100:Barehand-combat C:a:k:+1000:+100:Magic -C:a:k:+0:+100:Sneakiness C:a:k:+0:+100:Stealth C:a:k:+0:-200:Spirituality C:a:k:+0:-400:Possession @@ -699,9 +678,7 @@ C:a:k:+0:-100:Weaponmastery C:a:k:+0:-300:Archery C:a:k:-1000:-700:Barehand-combat C:a:k:+1000:+200:Magic -C:a:k:+0:+0:Sneakiness C:a:k:+0:+0:Stealth -C:a:k:+0:-200:Disarming C:a:k:+0:-200:Spirituality C:a:k:+15000:+100:Monster-lore C:a:k:+0:-500:Possession @@ -721,9 +698,7 @@ C:a:k:-1000:-400:Weaponmastery C:a:k:-1000:-300:Archery C:a:k:+0:+200:Barehand-combat C:a:k:+0:+0:Magic -C:a:k:+0:+200:Sneakiness C:a:k:+0:+200:Stealth -C:a:k:+0:+200:Disarming C:a:k:+0:+200:Spirituality C:a:k:+0:-400:Possession C:a:k:+0:-200:Corpse-preservation @@ -746,7 +721,6 @@ C:a:O:14:59:1d1 C:a:k:+1000:+0:Magic C:a:k:-1000:-700:Archery C:a:k:+0:-100:Barehand-combat -C:a:k:+0:-100:Disarming C:a:k:+0:+100:Spirituality C:a:k:+0:-500:Possession C:a:k:+0:-100:Summoning @@ -762,7 +736,6 @@ C:a:k:+0:+200:Combat C:a:k:=0:=0:Weaponmastery C:a:k:+0:+200:Barehand-combat C:a:k:+1000:+1000:Antimagic -C:a:k:+0:+200:Disarming C:a:k:+0:+300:Stealth C:a:k:+0:+1000:Dodging C:a:k:=0:=0:Magic @@ -807,10 +780,8 @@ C:k:=0:=0:Combat C:k:=0:=0:Weaponmastery C:k:=0:=0:Archery C:k:=0:=0:Barehand-combat -C:k:+0:+600:Sneakiness C:k:+0:+600:Stealth C:k:+1000:+700:Dodging -C:k:+1000:+600:Disarming C:k:+1000:+600:Magic C:k:=0:=0:Magic-Device C:k:+0:+500:Spell-power @@ -824,14 +795,6 @@ C:k:=0:=0:Music C:b:15:Perfect casting C:g:All Gods -C:a:N:Trapper -C:a:D:These pacifists use traps to snare monsters, and -C:a:D:make totems from corpses to summon aid. -C:O:46:1:1d1 -C:a:k:+1000:+600:Summoning -C:a:b:1:Trapping -C:a:b:10:Ammo creation - C:a:N:Peace-mage C:a:D:These pacifists use magic to escape danger, and C:a:D:rely on symbiotic relationships to defend themselves. @@ -869,8 +832,6 @@ C:k:+1000:+1000:Spirituality C:k:+1000:+700:Prayer C:k:+2000:+700:Combat C:k:+1000:+700:Weaponmastery -C:k:+1000:+900:Sneakiness -C:k:+0000:+900:Disarming C:k:+0000:+400:Stealth C:k:+0:+50:Magic-Device C:b:1:Perfect casting @@ -942,7 +903,6 @@ C:a:g:Mandos C:a:k:+0:-300:Prayer C:a:k:+0:-200:Necromancy C:a:k:+1000:+300:Mindcraft -C:a:k:+0:+200:Sneakiness C:a:k:+0:+100:Magic-Device C:a:N:Stonewright @@ -1039,11 +999,9 @@ R:C:Priest R:C:Rogue R:C:Warrior R:G:ELF -R:k:+200:+000:Disarming R:k:+300:+000:Magic-Device R:k:+1500:+000:Spirituality R:k:+1000:+000:Stealth -R:k:+600:+000:Sneakiness R:k:-100:+000:Weaponmastery R:k:+500:+000:Archery @@ -1063,11 +1021,9 @@ R:C:Pacifist R:C:Priest R:C:Warrior R:G:ELF -R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device R:k:+3000:+000:Spirituality R:k:+2000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:+1500:+000:Archery @@ -1089,11 +1045,9 @@ R:C:Pacifist R:C:Rogue R:C:Warrior R:k:+0:+300:Sling-mastery -R:k:+1500:+000:Disarming R:k:+1800:+000:Magic-Device R:k:+9000:+000:Spirituality R:k:+6000:+000:Stealth -R:k:+1200:+000:Sneakiness R:k:-1000:+000:Weaponmastery R:k:+2000:+000:Archery @@ -1110,11 +1064,9 @@ R:C:Mage R:C:Pacifist R:C:Rogue R:C:Warrior -R:k:+1000:+000:Disarming R:k:+1200:+000:Magic-Device R:k:+6000:+000:Spirituality R:k:+3000:+000:Stealth -R:k:+600:+000:Sneakiness R:k:-800:+000:Weaponmastery R:k:+1200:+000:Archery @@ -1132,11 +1084,9 @@ R:C:Pacifist R:C:Priest R:C:Warrior R:k:+0:+200:Axe-mastery -R:k:+200:+000:Disarming R:k:+900:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:-1000:+000:Stealth -R:k:+700:+000:Sneakiness R:k:+1500:+000:Weaponmastery R:k:+500:+000:Archery @@ -1152,11 +1102,9 @@ R:C:Archer R:C:Priest R:C:Rogue R:C:Warrior -R:k:-300:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality R:k:-1000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+1200:+000:Weaponmastery R:k:-500:+000:Archery @@ -1172,11 +1120,9 @@ R:F:SUST_STR R:R:15:0 R:F:REGEN R:C:Warrior -R:k:-500:+000:Disarming R:k:-800:+000:Magic-Device R:k:-4000:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2000:+000:Weaponmastery R:k:+0:+200:Hafted-mastery R:k:-1000:+000:Archery @@ -1197,11 +1143,9 @@ R:C:Pacifist R:C:Priest R:C:Rogue R:C:Warrior -R:k:+400:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality R:k:+2000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:+1500:+000:Weaponmastery R:k:+1000:+000:Archery @@ -1222,11 +1166,9 @@ R:C:Mage R:C:Pacifist R:C:Priest R:C:Warrior -R:k:+400:+000:Disarming R:k:+2000:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:+4000:+000:Stealth -R:k:+300:+000:Sneakiness R:k:+1000:+000:Weaponmastery R:k:+2500:+000:Archery @@ -1243,11 +1185,9 @@ R:F:SUST_STR R:C:Pacifist R:C:Priest R:C:Warrior -R:k:-300:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1266,11 +1206,9 @@ R:C:Loremaster R:C:Rogue R:C:Warrior R:k:+1000:+1000:Bearform-combat -R:k:-600:+000:Disarming R:k:-800:+000:Magic-Device R:k:-3000:+000:Spirituality R:k:-2000:+000:Stealth -R:k:-100:+000:Sneakiness R:k:+2500:+000:Weaponmastery R:k:+500:+000:Archery @@ -1292,11 +1230,9 @@ R:C:Pacifist R:C:Rogue R:C:Warrior R:k:+0:+250:Boomerang-mastery -R:k:-200:+000:Disarming R:k:-300:+000:Magic-Device R:k:-1000:+000:Spirituality R:k:+1000:+000:Stealth -R:k:+100:+000:Sneakiness R:k:+1000:+000:Weaponmastery R:k:+800:+000:Archery @@ -1313,11 +1249,9 @@ R:F:RES_DARK R:F:RES_DISEN R:C:Rogue R:C:Warrior -R:k:+300:+000:Disarming R:k:+500:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:+1000:+000:Stealth -R:k:+500:+000:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1340,11 +1274,9 @@ R:C:Rogue R:C:Warrior R:G:ELF R:k:+0:+200:Magic -R:k:+500:+000:Disarming R:k:+1500:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:+3000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:+1000:+000:Archery @@ -1377,11 +1309,9 @@ R:O:70:32:2d3 R:b:1:Tree walking R:k:+0:+200:Barehand-combat R:k:+0:+600:Boulder-throwing -R:k:+500:+000:Disarming R:k:+500:+000:Magic-Device R:k:+10000:+000:Spirituality R:k:-6000:+000:Stealth -R:k:+500:+000:Sneakiness R:k:-300:+000:Weaponmastery R:k:-200:+000:Archery @@ -1415,11 +1345,9 @@ R:F:SPEED R:C:Pacifist R:C:Priest R:C:Warrior -R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device R:k:+2500:+000:Spirituality R:k:-8000:+000:Stealth -R:k:+100:+000:Sneakiness R:k:+100:+200:Weaponmastery R:k:+500:+000:Archery @@ -1455,11 +1383,9 @@ R:C:Loremaster R:C:Mage R:C:Pacifist R:C:Priest -R:k:+600:+000:Disarming R:k:+000:+000:Magic-Device R:k:+5000:+000:Spirituality R:k:-16000:+000:Stealth -R:k:+3000:+000:Sneakiness ### Base race characteristics tweaked from Annals of Ea for Theme. @@ -1481,11 +1407,9 @@ R:C:Mage R:C:Pacifist R:C:Priest #R:G:EVIL -R:k:+1000:+000:Disarming R:k:+500:+000:Magic-Device R:k:-4000:+000:Spirituality R:k:-10000:+000:Stealth -R:k:+000:+000:Sneakiness R:N:19:Yeek R:D:The weakest of all the races, bad at everything except gaining levels quickly. @@ -1499,11 +1423,9 @@ R:C:Pacifist R:C:Priest R:C:Rogue R:C:Warrior -R:k:-500:+000:Disarming R:k:-500:+000:Magic-Device R:k:-2500:+000:Spirituality R:k:-5000:+000:Stealth -R:k:-500:+000:Sneakiness R:k:-500:+000:Weaponmastery R:k:-500:+000:Archery @@ -1529,11 +1451,9 @@ R:C:Warrior R:G:ELF R:k:+0:+200:Archery R:b:1:Tree walking -R:k:+500:+000:Disarming R:k:+600:+000:Magic-Device R:k:+3000:+000:Spirituality R:k:+5000:+000:Stealth -R:k:+800:+000:Sneakiness R:k:+1000:+000:Weaponmastery R:k:+4000:+000:Archery @@ -1608,12 +1528,10 @@ R:C:Archer R:C:Mage R:C:Pacifist R:C:Warrior -R:k:+000:+000:Disarming R:k:+000:+000:Magic-Device R:k:+000:+000:Spirituality R:k:=0:=0:Prayer R:k:+000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1641,9 +1559,7 @@ R:k:+0:+200:Axe-mastery R:k:+0:+200:Hafted-mastery R:k:+0:+200:Polearm-mastery R:k:+2000:+200:Archery -R:k:+1000:+300:Sneakiness R:k:+1000:+200:Stealth -R:k:+1000:+200:Disarming R:k:=0:=0:Magic R:k:=0:=0:Magic-Device R:k:=0:=0:Spell-power @@ -1672,11 +1588,9 @@ R:F:HOLD_LIFE R:F:RES_DARK R:F:RES_FEAR R:Z:spear of darkness -R:k:+500:+000:Disarming R:k:+050:+000:Magic-Device R:k:-5000:+000:Spirituality R:k:+000:+000:Stealth -R:k:+000:+000:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -1798,11 +1712,9 @@ S:F:RES_POIS S:F:SEE_INVIS S:F:SLOW_DIGEST S:O:70:32:2d3 -S:k:+200:+000:Disarming S:k:+800:+000:Magic-Device S:k:+700:+000:Spirituality S:k:+2000:+000:Stealth -S:k:+200:+000:Sneakiness S:k:-500:+000:Weaponmastery S:k:-200:+000:Archery @@ -1843,11 +1755,9 @@ S:F:SEE_INVIS S:R:10:0 S:F:RES_COLD S:O:70:32:2d3 -S:k:-500:+000:Disarming S:k:-500:+000:Magic-Device S:k:+500:+000:Spirituality S:k:-1000:+000:Stealth -S:k:-100:+000:Sneakiness S:k:+800:+000:Weaponmastery S:k:+000:+000:Archery @@ -1887,11 +1797,9 @@ S:F:SLOW_DIGEST S:R:5:0 S:F:RES_COLD S:O:70:32:2d3 -S:k:-200:+000:Disarming S:k:-200:+000:Magic-Device S:k:+500:+000:Spirituality S:k:-1000:+000:Stealth -S:k:-100:+000:Sneakiness S:k:+500:+000:Weaponmastery S:k:+000:+000:Archery @@ -1911,11 +1819,9 @@ S:A:Troll S:C:F:Mage S:R:10:0 S:F:RES_FEAR -S:k:-200:+000:Disarming S:k:-1000:+000:Magic-Device S:k:+200:+000:Spirituality S:k:-2000:+000:Stealth -S:k:+000:+000:Sneakiness S:k:+1200:+000:Weaponmastery S:k:+500:+000:Archery @@ -1943,11 +1849,9 @@ S:A:Wood-Elf S:A:Yeek S:C:F:Archer S:C:F:Warrior -S:k:+500:+000:Disarming S:k:+1000:+000:Magic-Device S:k:+500:+000:Spirituality S:k:+3000:+000:Stealth -S:k:+400:+000:Sneakiness S:k:-500:+000:Weaponmastery S:k:-500:+000:Archery @@ -2219,8 +2123,6 @@ S:F:SPEED S:Z:poison dart R:k:-200:+000:Weaponmastery R:k:+1000:+300:Archery -R:k:+1000:+000:Sneakiness -R:k:+500:+200:Disarming S:k:+1000:+500:Stealth R:k:+050:+000:Magic-Device S:k:+0:+200:Magic @@ -2251,8 +2153,6 @@ S:R:50:0 S:F:CLIMB R:k:-400:+000:Weaponmastery R:k:+000:+300:Archery -R:k:+1000:+000:Sneakiness -R:k:+500:+100:Disarming S:k:+500:+200:Stealth S:k:+0:+200:Magic S:k:+1000:+300:Mind @@ -2296,7 +2196,6 @@ S:F:SEARCH S:Z:smell monsters S:Z:smell metal R:k:+500:+300:Stealth -R:k:+500:+200:Sneakiness R:k:+000:+000:Weaponmastery R:k:+000:+000:Archery @@ -2336,7 +2235,6 @@ S:F:TUNNEL S:k:+1000:+500:Boulder-throwing S:Z:eat rock R:k:-800:+000:Stealth -R:k:-500:+000:Sneakiness R:k:-500:+000:Archery S:N:20:(Caborrog) @@ -2370,7 +2268,6 @@ S:k:+0:+300:Conveyance S:k:+0:+300:Temporal S:Z:panic hit R:k:-1000:+000:Stealth -R:k:-500:+000:Sneakiness S:N:21:(Draugrog) S:D:A:These doglike demons are of a higher order than the Huroeg, @@ -2416,7 +2313,6 @@ S:k:+0:+200:Magic S:k:+0:+200:Spirituality S:k:+1000:+500:Mindcraft R:k:-10000:+000:Stealth -R:k:-500:+200:Sneakiness R:k:+300:+000:Weaponmastery R:k:+200:+000:Archery @@ -2535,7 +2431,6 @@ S:R:50:1 S:F:LUCK S:F:SPEED R:k:+25000:+500:Stealth -R:k:+2000:+200:Sneakiness R:k:+2000:+300:Magic-Device S:N:23:(Limrog) @@ -2553,8 +2448,6 @@ S:F:WATER_BREATH S:R:50:0 S:F:MAGIC_BREATH R:k:+3000:+300:Stealth -R:k:+500:+200:Sneakiness -R:k:+2000:+200:Disarming S:k:+0:+200:Magic S:k:+0:+500:Conveyance S:k:+0:+500:Temporal @@ -2588,8 +2481,6 @@ S:k:+1000:+100:Combat S:k:+1000:+100:Weaponmastery R:k:+1000:+100:Archery R:k:-300:+000:Stealth -R:k:+500:+200:Sneakiness -R:k:+500:+100:Disarming S:Z:scare monster S:Z:berserk @@ -2615,8 +2506,6 @@ S:Z:turn into a Balrog R:k:+1000:+300:Weaponmastery R:k:+1000:+300:Archery R:k:+1000:+200:Stealth -R:k:+500:+200:Sneakiness -R:k:+1000:+200:Disarming R:k:+500:+200:Magic ############################################################################## diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index 4d53dd1d..4c83746f 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -2513,7 +2513,6 @@ S:ROCKET S:SCARE S:TELE_AWAY S:TPORT -S:TRAPS D:This annoying little gnome won't stop bragging about his great D:magical powers and shiny new equipment--unless someone silences D:him permanently. Unfortunately, your own weapons and spells @@ -3289,7 +3288,6 @@ S:BA_POIS S:BO_COLD S:HEAL S:SLOW -S:TRAPS D:He was once the chief counsellor to King Theoden of Rohan. D:He betrayed king and country by becoming a spy for the D:corrupted Istari Saruman. @@ -3327,7 +3325,6 @@ F:WILD_WOOD S:1_IN_5 S:ARROW_2 S:HEAL -S:TRAPS D:The legendary archer who steals from the rich (you qualify). # New monster added by furiosity for the Theme module @@ -6698,7 +6695,6 @@ F:WILD_TOO S:1_IN_3 S:CONF S:SCARE -S:TRAPS D:The fourth son of Feanor, who turned on his own kind because of the D:Oath of his father. He searches forever for the Silmarils of Feanor. @@ -6755,7 +6751,6 @@ S:BLINK S:TELE_AWAY S:TELE_TO S:TPORT -S:TRAPS D:The fifth son of Feanor, closely associated with his elder D:brother Celegorm. Bound by the Oath of Feanor, he searches D:forever for the Silmarils. @@ -8911,7 +8906,6 @@ S:S_KIN S:S_MONSTERS S:TELE_AWAY S:TPORT -S:TRAPS D:He is dressed in blue from head to toe. He is one of the five Istari D:who came to the northwest of Middle-earth in the Third Age; he D:journeyed into the east with Pallando, and never returned to the western @@ -9122,7 +9116,6 @@ S:S_HI_DRAGON S:S_HI_UNDEAD S:TELE_AWAY S:TPORT -S:TRAPS D:He is dressed in blue from head to toe. He is one of the five Istari D:who came to the northwest of Middle-earth in the Third Age; he D:journeyed into the east with Alatar, and never returned to the western @@ -9950,7 +9943,6 @@ S:S_MONSTER S:S_UNDEAD S:TELE_AWAY S:TELE_TO -S:TRAPS D:Nobody has ever seen It. N:394:Banshee @@ -10868,7 +10860,6 @@ S:S_KIN S:TELE_AWAY S:TELE_TO S:TPORT -S:TRAPS D:The proud former 'king' of Gondor, he has been driven mad D:by his contact with Sauron through the Palantir. You see D:the glint of a terrible fire in his eyes. @@ -10992,7 +10983,6 @@ S:CONF S:HASTE S:HOLD S:SHRIEK -S:TRAPS D:This creature look like a pillar of rock. However, a closer D:inspection reveals a glaring eye and powerful tentacles, D:which crush its prey and feed it to the creature's hungry @@ -12261,7 +12251,6 @@ S:BA_POIS S:BO_COLD S:HEAL S:SLOW -S:TRAPS D:He's a trustworthy man... or is he? Morgoth seem's sending spies in D:disguise, and perhaps this is one of them. @@ -12555,7 +12544,6 @@ S:HEAL S:SCARE S:S_ANIMAL S:TPORT -S:TRAPS D:Sometimes belittled as a bird-loving fool, Radagast is weaker D:mentally and magically than his fellows among the Istari. D:Nonetheless, his knowledge of woodcraft and command over the @@ -12699,7 +12687,6 @@ S:HEAL S:SCARE S:SLOW S:S_SPIDER -S:TRAPS D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the D:Unlight. She normally guards the pass through Cirith Ungol, but D:occasionally goes out foraging for food to feed her voracious appetite. @@ -13960,7 +13947,6 @@ F:TAKE_ITEM S:1_IN_6 S:ARROW_2 S:BLINK -S:TRAPS D:Cool and confident, fast and lithe; protect your possessions quickly! N:517:The Watcher in the Water @@ -15819,7 +15805,6 @@ S:CAUSE_2 S:MIND_BLAST S:SLOW S:S_UNDEAD -S:TRAPS # Spells chez thaumaturgy and having killed Morgy: S:BR_DISI S:BR_MANA @@ -16751,7 +16736,6 @@ S:BO_ELEC S:BO_FIRE S:BO_ICEE S:HEAL -S:TRAPS D:A Black Numenorean who usurped the throne of Gondor, he is treacherous and D:evil. @@ -17986,7 +17970,6 @@ S:S_DRAGON S:S_MONSTER S:S_UNDEAD S:TELE_TO -S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spellcasting. @@ -19881,7 +19864,6 @@ S:BLINK S:CONF S:TELE_TO S:TPORT -S:TRAPS D:A class of its own: you are already too late to protect your possessions - D:and he seems to have studied magic too, and is a master of setting traps. @@ -21310,7 +21292,6 @@ S:S_HI_DRAGON S:S_MONSTER S:S_UNDEAD S:TELE_TO -S:TRAPS D:A human figure in robes, he moves with magically improved speed, and his D:hands are ablur with spellcasting. You stagger at the mighty sound of his D:spells as they echo hollowly through the dungeon. @@ -21746,7 +21727,6 @@ S:CAUSE_4 S:MIND_BLAST S:SLOW S:S_UNDEAD -S:TRAPS D:A glowing skull possessed by sorcerous power. It need not move, but D:merely blast you with mighty magic. @@ -22500,7 +22480,6 @@ S:S_HI_DRAGON S:S_UNDEAD S:TELE_AWAY S:TPORT -S:TRAPS D:Originally known as the White, Saruman fell prey to Sauron's wiles. He D:searches forever for the One Ring, to become a mighty Sorcerer-King of the D:world. @@ -22533,7 +22512,6 @@ F:TAKE_ITEM F:UNIQUE S:1_IN_6 S:TELE_TO -S:TRAPS D:He is a master of disguise, an expert of stealth, a genius at traps, and D:moves with blinding speed. @@ -23793,7 +23771,6 @@ S:S_KIN S:S_MONSTERS S:S_UNDEAD S:TELE_TO -S:TRAPS D:A stench of corruption and decay surrounds this sorcerer, who has D:risen from the dead to continue his foul plots and schemes. @@ -24394,7 +24371,6 @@ S:HOLD S:S_HI_DEMON S:S_HI_UNDEAD S:TELE_TO -S:TRAPS D:The Mouth of Sauron is a mighty spellcaster. So old that even he cannot D:remember his own name, his power and evil are undeniable. He believes D:unshakably that he is unbeatable and laughs as he weaves his awesome @@ -24449,7 +24425,6 @@ S:HAND_DOOM S:HOLD S:S_HI_UNDEAD S:TELE_TO -S:TRAPS D:The dark master of the terrible fortress of southern Mirkwood. It is D:rumoured that this is in fact none other than Sauron in disguise: D:although if this is so, he has yet to reveal his full power - and perhaps @@ -25895,7 +25870,6 @@ S:S_RNG S:S_THUNDERLORD S:TELE_TO S:TPORT -S:TRAPS D:He is the master of coding; none can match his skill. He created the D:Variant Maintainer, the RNGs, and the software bugs. Bull Gates is D:nothing next to him. Do not think that since he loves the novels of @@ -27836,7 +27810,6 @@ S:S_KIN S:S_MONSTERS S:TELE_AWAY S:TPORT -S:TRAPS D:The wizard who opposed Sauron and, in the end, was the only D:one of the Istari to succeed in his task. Gandalf is very D:wise and specialises in fire magic. @@ -29371,7 +29344,6 @@ S:SLOW S:S_UNIQUE S:TELE_TO S:TPORT -S:TRAPS D:A woman of mind-shattering beauty, none can match her beauty. She is perfect, D:and totaly evil. She loves nothing but herself and her evilness is as D:great as her beauty. No one can stand against her, even DarkGod. @@ -29957,7 +29929,6 @@ S:SCARE S:SHRIEK S:SLOW S:S_KIN -S:TRAPS D:A twisted elemental spirit, this creature serves the Dark with D:perversions of the magics of nature. @@ -30316,7 +30287,6 @@ F:TAKE_ITEM S:1_IN_6 S:ARROW_2 S:BLINK -S:TRAPS D:A little gnome, fast and stealthy. He is eyeing your backpack. N:1012:Vermicious Knid @@ -31251,7 +31221,6 @@ S:SCARE S:SHRIEK S:S_KIN S:S_MONSTER -S:TRAPS D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. @@ -31707,7 +31676,6 @@ S:HEAL S:SCARE S:SHRIEK S:TELE_AWAY -S:TRAPS D:Hopefully you will kill this spirit before you realise it exists. # Spirit of ickyness @@ -31959,7 +31927,6 @@ S:ARROW_3 S:BLINK S:CONF S:TELE_TO -S:TRAPS D:There is something attractive about this spirit, and it seems D:to have a full purse. diff --git a/lib/mods/theme/edit/re_info.txt b/lib/mods/theme/edit/re_info.txt index 2b111067..9b89f19d 100644 --- a/lib/mods/theme/edit/re_info.txt +++ b/lib/mods/theme/edit/re_info.txt @@ -284,7 +284,6 @@ S:HEAL S:HOLD S:S_MONSTER S:TPORT -S:TRAPS N:10:Archer G:*:W diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt index 5d57dbe6..b40e20b5 100644 --- a/lib/mods/theme/edit/s_info.txt +++ b/lib/mods/theme/edit/s_info.txt @@ -340,19 +340,10 @@ E:Thaumaturgy:Antimagic ################################## SNEAKINESS SKILLS ############################### -N:35:Sneakiness -D:General ability at the sneakiness skills. -D:It also affects the searching abilities -F:RANDOM_GAIN - N:36:Stealth D:Ability to move unnoticed, silently F:RANDOM_GAIN -N:37:Disarming -D:Ability to disarm the various traps -F:RANDOM_GAIN - N:40:Stealing D:Ability to steal objects A:15:Steal object @@ -361,11 +352,9 @@ N:46:Dodging D:Ability to dodge blows and bolts A:16:Check dodge chance -f:Stealth:Sneakiness%15 -f:Disarming:Sneakiness%10 -f:Backstab:Sneakiness%5 -f:Stealing:Sneakiness%15 -f:Dodging:Sneakiness%10 +f:Backstab:Stealth%5 +f:Stealing:Stealth%15 +f:Dodging:Stealth%10 ################################## MONSTER SKILLS ################################ @@ -428,12 +417,10 @@ T:Combat:Bearform-combat T:Combat:Boulder-throwing T:Combat:Antimagic -T:Main:Sneakiness -T:Sneakiness:Stealth -T:Sneakiness:Disarming -T:Sneakiness:Backstab -T:Sneakiness:Stealing -T:Sneakiness:Dodging +T:Main:Stealth +T:Stealth:Backstab +T:Stealth:Stealing +T:Stealth:Dodging T:Main:Magic T:Magic:Magic-Device diff --git a/lib/mods/theme/edit/st_info.txt b/lib/mods/theme/edit/st_info.txt index d00e3415..6f8514b1 100644 --- a/lib/mods/theme/edit/st_info.txt +++ b/lib/mods/theme/edit/st_info.txt @@ -163,7 +163,6 @@ I:100:Monster Confusion I:100:Magic Mapping I:100:Treasure Detection I:100:Object Detection -I:100:Trap Detection I:100:Detect Invisible I:100:Recharging I:100:Satisfy Hunger diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt index 3cb444f4..a3a90468 100644 --- a/lib/mods/theme/help/debug.txt +++ b/lib/mods/theme/help/debug.txt @@ -29,7 +29,7 @@ will not be scored if you use debug commands. *****debug.txt*29[o Edit object attributes] O (unused) *****debug.txt*31[p Phase door] *****debug.txt*32[P Panic save] *****debug.txt*33[q Get a quest] Q (unused) - r (unused) *****debug.txt*36[R Create a trap] + r (unused) R (unused) *****debug.txt*37[s Summon monster] *****debug.txt*38[S Change the feature of the map] *****debug.txt*39[t Teleport] *****debug.txt*40[T Teleport to a town] *****debug.txt*41[u Complete map] *****debug.txt*42[U Become undead] @@ -105,7 +105,7 @@ maximal legal value. For example : 03^AC will create the Arkenstone of Thrane (+3) ~~~~~7 [[[[[GDetect all (d)] - Sense ways out/monsters/objects/traps. + Sense ways out/monsters/objects. ~~~~~8 [[[[[GTeleport to the wilderness (D)] From a dungeon this will teleport you to the wilderness level @@ -182,11 +182,6 @@ maximal legal value. ~~~~~35 [[[[[GGain reward (r)] Some high being grants you a reward. -~~~~~36 -[[[[[GCreate a trap (R)] - Use the "Command count", aka 0, to specify a number from - tr_info.txt to put a trap on the ground where you are - standing. ~~~~~37 [[[[[GSummon monster (s)] Summon a random monster, next to where you stand. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 035c42d1..3b8189b5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -104,7 +104,6 @@ SET(SRCS_COMMON squeltch.cc store.cc tables.cc - traps.cc util.cc variable.cc wild.cc diff --git a/src/birth.cc b/src/birth.cc index b18a4b9a..c6e1d922 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -48,7 +48,6 @@ #include "store.hpp" #include "tables.hpp" #include "town_type.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -723,7 +722,6 @@ static void player_wipe(void) auto &r_info = game->edit_data.r_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; - auto &t_info = game->edit_data.t_info; /* Wipe special levels */ wipe_saved(); @@ -882,13 +880,6 @@ static void player_wipe(void) inscription_known = false; } - /* Wipe the known traps list */ - for (auto &t_ref: t_info) - { - t_ref.known = 0; - t_ref.ident = FALSE; - } - /* Reset wild_mode to FALSE */ p_ptr->wild_mode = FALSE; p_ptr->old_wild_mode = FALSE; @@ -986,8 +977,6 @@ static void player_outfit_spellbook(cptr spell_name) */ static void player_outfit(void) { - auto &t_info = game->edit_data.t_info; - // Shorthand names for convenience cptr class_name = spp_ptr->title; auto const &subrace_name = rmp_ptr->title; @@ -1152,30 +1141,6 @@ static void player_outfit(void) (void)inven_carry(q_ptr, FALSE); } - /* Rogues have a better knowledge of traps */ - if (p_ptr->has_ability(AB_TRAPPING)) - { - t_info[TRAP_OF_DAGGER_I].known = randint(50) + 50; - t_info[TRAP_OF_POISON_NEEDLE].known = randint(50) + 50; - t_info[TRAP_OF_FIRE_BOLT].known = randint(50) + 50; - t_info[TRAP_OF_DAGGER_I].ident = TRUE; - t_info[TRAP_OF_POISON_NEEDLE].ident = TRUE; - t_info[TRAP_OF_FIRE_BOLT].ident = TRUE; - - /* Hack -- Give the player a some ammo for the traps */ - object_type forge; - object_type *q_ptr = &forge; - object_prep(q_ptr, lookup_kind(TV_SHOT, SV_AMMO_NORMAL)); - q_ptr->number = (byte)rand_range(5, 15); - object_aware(q_ptr); - object_known(q_ptr); - - /* These objects are "storebought" */ - q_ptr->ident |= IDENT_MENTAL; - - (void)inven_carry(q_ptr, FALSE); - } - /* Outfit the player with starting items */ outfit_objs(rp_ptr->object_protos); outfit_objs(rmp_ptr->object_protos); diff --git a/src/cave.cc b/src/cave.cc index 14046eb2..66e274f1 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -20,7 +20,6 @@ #include "spells1.hpp" #include "store_info_type.hpp" #include "tables.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -854,7 +853,6 @@ static void map_info(int y, int x, byte *ap, char *cp) auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; - auto const &t_info = game->edit_data.t_info; byte a; @@ -911,41 +909,6 @@ static void map_info(int y, int x, byte *ap, char *cp) a = TERM_VIOLET; } - /* Mega-Hack 3 -- Traps don't have f_info entries either */ - if ((info & (CAVE_TRDT)) && (feat != FEAT_ILLUS_WALL)) - { - /* Trap index */ - auto t_idx = c_ptr->t_idx; - - /* - * If trap is set on a floor grid that is not - * one of "interesting" features, use a special - * symbol to display it. Check for doors is no longer - * necessary because they have REMEMBER flag now. - * - * Cave macros cannot be used safely here, because of - * c_ptr->mimic XXX XXX - */ - if ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR) - { - c = f_info[FEAT_TRAP].x_char; - } - - /* Add attr XXX XXX XXX */ - a = t_info[t_idx].color; - - /* Get a new color with a strange formula :) XXX XXX XXX */ - if (t_info[t_idx].flags & FTRAP_CHANGE) - { - s32b tmp; - - tmp = dun_level + dungeon_type + feat; - - a = tmp % 16; - } - } - - /**** Step 2 -- Apply special random effects ****/ if (!options->avoid_other && !options->avoid_shimmer) { @@ -969,7 +932,6 @@ static void map_info(int y, int x, byte *ap, char *cp) * Special lighting effects, if specified and applicable * This will never happen for * - any grids in the overhead map - * - traps * - (graphics modes) terrain features without corresponding * "darker" tiles. * @@ -981,7 +943,7 @@ static void map_info(int y, int x, byte *ap, char *cp) if (options->view_special_lite && ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { - if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) + if (!p_ptr->wild_mode) { /* Handle "seen" grids */ if (info & (CAVE_SEEN)) @@ -1021,7 +983,7 @@ static void map_info(int y, int x, byte *ap, char *cp) else if (options->view_granite_lite && (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { - if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) + if (!p_ptr->wild_mode) { /* Handle "seen" grids */ if (info & (CAVE_SEEN)) @@ -1082,7 +1044,6 @@ static void map_info(int y, int x, byte *ap, char *cp) /**** Layer 2 -- Objects ****/ - if (feat != FEAT_MON_TRAP) { for (auto const o_idx: c_ptr->o_idxs) { @@ -1286,7 +1247,6 @@ void map_info_default(int y, int x, byte *ap, char *cp) auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; - auto const &t_info = game->edit_data.t_info; byte a; @@ -1346,41 +1306,6 @@ void map_info_default(int y, int x, byte *ap, char *cp) a = TERM_VIOLET; } - /* Mega-Hack 3 -- Traps don't have f_info entries either */ - if ((info & (CAVE_TRDT)) && (feat != FEAT_ILLUS_WALL)) - { - /* Trap index */ - auto t_idx = c_ptr->t_idx; - - /* - * If trap is set on a floor grid that is not - * one of "interesting" features, use a special - * symbol to display it. Check for doors is no longer - * necessary because they have REMEMBER flag now. - * - * Cave macros cannot be used safely here, because of - * c_ptr->mimic XXX XXX - */ - if ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR) - { - c = f_info[FEAT_TRAP].d_char; - } - - /* Add attr */ - a = t_info[t_idx].color; - - /* Get a new color with a strange formula :) */ - if (t_info[t_idx].flags & FTRAP_CHANGE) - { - s32b tmp; - - tmp = dun_level + dungeon_type + feat; - - a = tmp % 16; - } - } - - /**** Step 2 -- Apply special random effects ****/ if (!avoid_other) { @@ -1404,7 +1329,6 @@ void map_info_default(int y, int x, byte *ap, char *cp) * Special lighting effects, if specified and applicable * This will never happen for * - any grids in the overhead map - * - traps * - (graphics modes) terrain features without corresponding * "darker" tiles. * @@ -1416,7 +1340,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) if (options->view_special_lite && ((f_ptr->flags & (FF_FLOOR | FF_REMEMBER)) == FF_FLOOR)) { - if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) + if (!p_ptr->wild_mode) { /* Handle "seen" grids */ if (info & (CAVE_SEEN)) @@ -1456,7 +1380,7 @@ void map_info_default(int y, int x, byte *ap, char *cp) else if (options->view_granite_lite && (f_ptr->flags & (FF_NO_VISION | FF_DOOR))) { - if (!p_ptr->wild_mode && !(info & (CAVE_TRDT))) + if (!p_ptr->wild_mode) { /* Handle "seen" grids */ if (info & (CAVE_SEEN)) @@ -1512,7 +1436,6 @@ void map_info_default(int y, int x, byte *ap, char *cp) /**** Layer 2 -- Objects ****/ - if (feat != FEAT_MON_TRAP) { for (auto const this_o_idx: c_ptr->o_idxs) { @@ -1813,8 +1736,7 @@ void note_spot(int y, int x) if (cave_plain_floor_grid(c_ptr)) { /* Option -- memorise certain floors */ - if ((info & CAVE_TRDT) || - ((info & CAVE_GLOW) && options->view_perma_grids) || + if (((info & CAVE_GLOW) && options->view_perma_grids) || options->view_torch_grids) { /* Memorize */ @@ -4412,7 +4334,7 @@ void object_track(object_type *o_ptr) * * All disturbance cancels repeated commands, resting, and running. */ -void disturb(int stop_search) +void disturb(int) { /* Cancel auto-commands */ /* command_new = 0; */ @@ -4447,19 +4369,6 @@ void disturb(int stop_search) p_ptr->update |= (PU_TORCH); } - /* Cancel searching if requested */ - if (stop_search && p_ptr->searching) - { - /* Cancel */ - p_ptr->searching = FALSE; - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Redraw the state */ - p_ptr->redraw |= (PR_FRAME); - } - /* Flush the input if requested */ if (options->flush_disturb) { @@ -4587,7 +4496,7 @@ bool cave_floor_grid(cave_type const *c) { auto const &f_info = game->edit_data.f_info; - return (f_info[c->feat].flags & FF_FLOOR) && (c->feat != FEAT_MON_TRAP); + return bool(f_info[c->feat].flags & FF_FLOOR); } @@ -4654,7 +4563,6 @@ bool cave_clean_bold(int y, int x) return (f_info[cave[y][x].feat].flags & FF_FLOOR) && - (cave[y][x].feat != FEAT_MON_TRAP) && (cave[y][x].o_idxs.empty()) && !(f_info[cave[y][x].feat].flags & FF_PERMANENT); } @@ -4688,7 +4596,6 @@ bool cave_naked_bold(int y, int x) return (f_info[cave[y][x].feat].flags & FF_FLOOR) && - (cave[y][x].feat != FEAT_MON_TRAP) && !(f_info[cave[y][x].feat].flags & FF_PERMANENT) && (cave[y][x].o_idxs.empty()) && (cave[y][x].m_idx == 0); @@ -4700,7 +4607,6 @@ bool cave_naked_bold2(int y, int x) return (f_info[cave[y][x].feat].flags & FF_FLOOR) && - (cave[y][x].feat != FEAT_MON_TRAP) && (cave[y][x].o_idxs.empty()) && (cave[y][x].m_idx == 0); } diff --git a/src/cave_type.hpp b/src/cave_type.hpp index 958ace1d..08e6002f 100644 --- a/src/cave_type.hpp +++ b/src/cave_type.hpp @@ -38,8 +38,6 @@ struct cave_type s16b m_idx = 0; /* Monster in this grid */ - s16b t_idx = 0; /* trap index (in t_list) or zero */ - s16b special = 0; /* Special cave info */ s16b special2 = 0; /* Special cave info */ diff --git a/src/cmd1.cc b/src/cmd1.cc index 6f8a26e3..b2843327 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -41,8 +41,6 @@ #include "spells2.hpp" #include "spells3.hpp" #include "tables.hpp" -#include "traps.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -437,89 +435,6 @@ s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, } -/* - * Search for hidden things - */ -void search(void) -{ - /* Start with base search ability */ - int chance = p_ptr->skill_srh; - - /* Penalize various conditions */ - if (p_ptr->blind || no_lite()) chance = chance / 10; - if (p_ptr->confused || p_ptr->image) chance = chance / 10; - - /* Search the nearby grids, which are always in bounds */ - for (int y = (p_ptr->py - 1); y <= (p_ptr->py + 1); y++) - { - for (int x = (p_ptr->px - 1); x <= (p_ptr->px + 1); x++) - { - /* Sometimes, notice things */ - if (rand_int(100) < chance) - { - /* Access the grid */ - cave_type *c_ptr = &cave[y][x]; - - /* Invisible trap */ - if ((c_ptr->t_idx != 0) && !(c_ptr->info & CAVE_TRDT)) - { - /* Pick a trap */ - pick_trap(y, x); - - /* Message */ - msg_print("You have found a trap."); - - /* Disturb */ - disturb(0); - } - - /* Secret door */ - if (c_ptr->feat == FEAT_SECRET) - { - /* Message */ - msg_print("You have found a secret door."); - - /* Pick a door XXX XXX XXX */ - cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00); - cave[y][x].mimic = 0; - lite_spot(y, x); - - /* Disturb */ - disturb(0); - } - - /* Scan all objects in the grid */ - for (auto const o_idx: c_ptr->o_idxs) - { - object_type * o_ptr = &o_list[o_idx]; - - /* Skip non-chests */ - if (o_ptr->tval != TV_CHEST) continue; - - /* Skip non-trapped chests */ - if (!o_ptr->pval) continue; - - /* Identify once */ - if (!object_known_p(o_ptr)) - { - /* Message */ - msg_print("You have discovered a trap on the chest!"); - - /* Know the trap */ - object_known(o_ptr); - - /* Notice it */ - disturb(0); - } - } - } - } - } -} - - - - /* * Player "wants" to pick up an object or gold. * Note that we ONLY handle things that can be picked up. @@ -534,36 +449,6 @@ void carry(int pickup) } -/* - * Handle player hitting a real trap - */ -static void hit_trap(void) -{ - auto &t_info = game->edit_data.t_info; - - bool_ ident = FALSE; - - cave_type *c_ptr; - - - /* Disturb the player */ - disturb(0); - - /* Get the cave grid */ - c_ptr = &cave[p_ptr->py][p_ptr->px]; - if (c_ptr->t_idx != 0) - { - ident = player_activate_trap_type(p_ptr->py, p_ptr->px, NULL, -1); - if (ident) - { - t_info[c_ptr->t_idx].ident = TRUE; - msg_format("You identified the trap as %s.", - t_info[c_ptr->t_idx].name); - } - } -} - - void touch_zap_player(monster_type *m_ptr) { auto r_ptr = m_ptr->race(); @@ -2665,7 +2550,7 @@ static bool_ easy_open_door(int y, int x) else if (c_ptr->feat >= FEAT_DOOR_HEAD + 0x01) { /* Disarm factor */ - i = p_ptr->skill_dis; + i = 100; /* Penalize some conditions */ if (p_ptr->blind || no_lite()) i = i / 10; @@ -2686,9 +2571,6 @@ static bool_ easy_open_door(int y, int x) /* Message */ msg_print("You have picked the lock."); - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - /* Open the door */ cave_set_feat(y, x, FEAT_OPEN); @@ -2713,9 +2595,6 @@ static bool_ easy_open_door(int y, int x) /* Closed door */ else { - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - /* Open the door */ cave_set_feat(y, x, FEAT_OPEN); @@ -2736,7 +2615,7 @@ static bool_ easy_open_door(int y, int x) * any monster which might be in the destination grid. Previously, * moving into walls was "free" and did NOT hit invisible monsters. */ -void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) +void move_player_aux(int dir, int do_pickup, int run) { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; @@ -2752,8 +2631,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) char m_name[80]; - bool_ old_dtrap, new_dtrap; - bool_ oktomove = TRUE; @@ -2981,14 +2858,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) oktomove = FALSE; } - /* Don't step on known traps. */ - else if (disarm && (c_ptr->info & (CAVE_TRDT)) && !(p_ptr->confused || p_ptr->stun || p_ptr->image)) - { - msg_print("You stop to avoid triggering the trap."); - energy_use = 0; - oktomove = FALSE; - } - /* Player can't enter ? soo bad for him/her ... */ else if (!player_can_enter(c_ptr->feat)) { @@ -3074,37 +2943,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) } } - /* - * Check trap detection status -- retrieve them here - * because they are used by the movement code as well - */ - old_dtrap = ((cave[p_ptr->py][p_ptr->px].info & CAVE_DETECT) != 0); - new_dtrap = ((cave[y][x].info & CAVE_DETECT) != 0); - - /* Normal movement */ - if (oktomove && running && options->disturb_detect) - { - /* - * Disturb the player when about to leave the trap detected - * area - */ - if (old_dtrap && !new_dtrap) - { - /* Disturb player */ - disturb(0); - - /* but don't take a turn */ - energy_use = 0; - - /* Tell player why */ - cmsg_print(TERM_VIOLET, "You are about to leave a trap detected zone."); - /* Flush */ - /* msg_print(NULL); */ - - oktomove = FALSE; - } - } - /* Normal movement */ if (oktomove) { @@ -3138,20 +2976,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) /* Check for new panel (redraw map) */ verify_panel(); - /* Check detection status */ - if (old_dtrap && !new_dtrap) - { - cmsg_print(TERM_VIOLET, "You leave a trap detected zone."); - if (running) msg_print(NULL); - p_ptr->redraw |= (PR_FRAME); - } - else if (!old_dtrap && new_dtrap) - { - cmsg_print(TERM_L_BLUE, "You enter a trap detected zone."); - if (running) msg_print(NULL); - p_ptr->redraw |= (PR_FRAME); - } - /* Update stuff */ p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE); @@ -3178,18 +3002,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) if (running) msg_print(NULL); } - /* Spontaneous Searching */ - if ((p_ptr->skill_fos >= 50) || (0 == rand_int(50 - p_ptr->skill_fos))) - { - search(); - } - - /* Continuous Searching */ - if (p_ptr->searching) - { - search(); - } - /* Handle "objects" */ carry(do_pickup); @@ -3215,26 +3027,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) if (running) msg_print(NULL); } - /* Discover invisible traps */ - else if ((c_ptr->t_idx != 0) && - !(f_info[cave[y][x].feat].flags & FF_DOOR)) - { - /* Disturb */ - disturb(0); - - if (!(c_ptr->info & (CAVE_TRDT))) - { - /* Message */ - msg_print("You found a trap!"); - - /* Pick a trap */ - pick_trap(p_ptr->py, p_ptr->px); - } - - /* Hit the trap */ - hit_trap(); - } - /* Execute the inscription */ else if (c_ptr->inscription) { @@ -3263,9 +3055,9 @@ void move_player_aux(int dir, int do_pickup, int run, bool_ disarm) } } -void move_player(int dir, int do_pickup, bool_ disarm) +void move_player(int dir, int do_pickup) { - move_player_aux(dir, do_pickup, 0, disarm); + move_player_aux(dir, do_pickup, 0); } @@ -3276,14 +3068,6 @@ static int see_obstacle_grid(cave_type *c_ptr) { auto const &f_info = game->edit_data.f_info; - /* - * Hack -- Avoid hitting detected traps, because we cannot rely on - * the CAVE_MARK check below, and traps can be set to nearly - * everything the player can move on to XXX XXX XXX - */ - if (c_ptr->info & (CAVE_TRDT)) return (TRUE); - - /* Hack -- Handle special cases XXX XXX */ switch (c_ptr->feat) { @@ -3765,9 +3549,6 @@ static bool_ run_test(void) notice = FALSE; } - /* A detected trap is interesting */ - if (c_ptr->info & (CAVE_TRDT)) notice = TRUE; - /* Interesting feature */ if (notice) return (TRUE); @@ -3775,9 +3556,6 @@ static bool_ run_test(void) inv = FALSE; } - /* Mega-Hack -- Maze code removes CAVE_MARK XXX XXX XXX */ - if (c_ptr->info & (CAVE_TRDT)) return (TRUE); - /* Analyze unknown grids and floors */ if (inv || cave_floor_bold(row, col)) { @@ -4050,7 +3828,7 @@ void run_step(int dir) /* Move the player, using the "pickup" flag */ - move_player_aux(find_current, options->always_pickup, 1, TRUE); + move_player_aux(find_current, options->always_pickup, 1); } diff --git a/src/cmd1.hpp b/src/cmd1.hpp index 3ae44ed2..c7c4f064 100644 --- a/src/cmd1.hpp +++ b/src/cmd1.hpp @@ -14,8 +14,8 @@ extern void search(void); extern void carry(int pickup); extern void py_attack(int y, int x, int max_blow); extern bool_ player_can_enter(byte feature); -extern void move_player(int dir, int do_pickup, bool_ disarm); -extern void move_player_aux(int dir, int do_pickup, int run, bool_ disarm); +extern void move_player(int dir, int do_pickup); +extern void move_player_aux(int dir, int do_pickup, int run); extern void run_step(int dir); extern void do_cmd_pet(void); extern void do_cmd_integrate_body(); diff --git a/src/cmd2.cc b/src/cmd2.cc index e4378699..dce9273d 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -44,8 +44,6 @@ #include "spells3.hpp" #include "stats.hpp" #include "tables.hpp" -#include "trap_type.hpp" -#include "traps.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -368,8 +366,6 @@ void do_cmd_go_down(void) bool_ go_down = FALSE, go_down_many = FALSE, prob_traveling = FALSE; - bool_ fall_trap = FALSE; - char i; int old_dun = dun_level; @@ -385,8 +381,6 @@ void do_cmd_go_down(void) if (p_ptr->astral && (dun_level == 98)) return; - if (c_ptr->t_idx == TRAP_OF_SINKING) fall_trap = TRUE; - /* test if on special level */ if (dungeon_flags & DF_ASK_LEAVE) { @@ -475,7 +469,7 @@ void do_cmd_go_down(void) } } - else if (!(fall_trap)) + else { msg_print("I see no down staircase here."); return; @@ -485,15 +479,10 @@ void do_cmd_go_down(void) { energy_use = 0; - if (fall_trap) - msg_print("You deliberately jump through the trap door."); + if (c_ptr->feat == FEAT_WAY_MORE) + msg_print("You enter the next area."); else - { - if (c_ptr->feat == FEAT_WAY_MORE) - msg_print("You enter the next area."); - else - msg_print("You enter a maze of down staircases."); - } + msg_print("You enter a maze of down staircases."); autosave_checkpoint(); @@ -563,58 +552,9 @@ void do_cmd_go_down(void) /* Leaving */ p_ptr->leaving = TRUE; - - if (!fall_trap) - { - /* Create a way back */ - if (go_down_many) - create_up_shaft = TRUE; - else - create_up_stair = TRUE; - } - } -} - - - -/* - * Simple command to "search" for one turn - */ -void do_cmd_search(void) -{ - /* Allow repeated command */ - if (command_arg) - { - /* Set repeat count */ - command_rep = command_arg - 1; - - /* Redraw the state */ - p_ptr->redraw |= (PR_FRAME); - - /* Cancel the arg */ - command_arg = 0; } - - /* Take a turn */ - energy_use = 100; - - /* Search */ - search(); -} - - -/* - * Hack -- toggle search mode - */ -void do_cmd_toggle_search(void) -{ - p_ptr->update |= (PU_BONUS); - p_ptr->redraw |= (PR_FRAME); - p_ptr->searching = !p_ptr->searching; } - - /* * Determine if a grid contains a chest */ @@ -725,43 +665,6 @@ static void chest_death(int y, int x, s16b o_idx) } -/* - * Chests have traps too. - * - * Exploding chest destroys contents (and traps). - * Note that the chest itself is never destroyed. - */ -static void chest_trap(int y, int x, s16b o_idx) -{ - auto &t_info = game->edit_data.t_info; - - int trap; - - object_type *o_ptr = &o_list[o_idx]; - - bool_ ident = FALSE; - - - /* Ignore disarmed chests */ - if (o_ptr->pval <= 0) return; - - /* Obtain the trap */ - trap = o_ptr->pval; - - /* Message */ - msg_print("You found a trap!"); - - /* Set off trap */ - ident = player_activate_trap_type(y, x, o_ptr, o_idx); - if (ident) - { - t_info[o_ptr->pval].ident = TRUE; - msg_format("You identified the trap as %s.", - t_info[trap].name); - } -} - - /* * Attempt to open the given chest at the given location * @@ -801,7 +704,7 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) flag = FALSE; /* Get the "disarm" factor */ - i = p_ptr->skill_dis; + i = 100; /* Penalize some conditions */ if (p_ptr->blind || no_lite()) i = i / 10; @@ -836,9 +739,6 @@ static bool_ do_cmd_open_chest(int y, int x, s16b o_idx) /* Allowed to open */ if (flag) { - /* Apply chest traps, if any */ - chest_trap(y, x, o_idx); - /* Let the Chest drop items */ chest_death(y, x, o_idx); } @@ -875,16 +775,6 @@ static bool_ is_closed(cave_type *c_ptr) return ((feat >= FEAT_DOOR_HEAD) && (feat <= FEAT_DOOR_TAIL)); } - -/* - * Return TRUE if the given grid has a trap - */ -static bool_ is_trap(cave_type *c_ptr) -{ - return ((c_ptr->info & (CAVE_TRDT)) != 0); -} - - /* * Return the number of doors/traps around (or under) * the character using the filter function 'test' @@ -966,9 +856,6 @@ static int count_chests(int *y, int *x, bool_ trapped) /* Already open */ if (o_ptr->pval == 0) continue; - /* No (known) traps here */ - if (trapped && (!object_known_p(o_ptr) || !o_ptr->pval)) continue; - /* OK */ ++count; @@ -1052,7 +939,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) else if (c_ptr->feat >= FEAT_DOOR_HEAD + 0x01) { /* Disarm factor */ - i = p_ptr->skill_dis; + i = 100; /* Penalize some conditions */ if (p_ptr->blind || no_lite()) i = i / 10; @@ -1073,9 +960,6 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) /* Message */ msg_print("You have picked the lock."); - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - /* Open the door */ cave_set_feat(y, x, FEAT_OPEN); @@ -1103,9 +987,6 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) /* Closed door */ else { - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - /* Open the door */ cave_set_feat(y, x, FEAT_OPEN); @@ -1274,9 +1155,6 @@ static bool_ do_cmd_close_aux(int y, int x, int dir) /* Get grid and contents */ c_ptr = &cave[y][x]; - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - /* Broken door */ if (c_ptr->feat == FEAT_BROKEN) { @@ -1532,9 +1410,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) /* We may continue chopping */ msg_print(f_ptr->tunnel); more = TRUE; - - /* Occasional Search XXX XXX */ - if (rand_int(100) < 25) search(); } } @@ -1685,9 +1560,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) msg_print("You have finished the tunnel."); c_ptr->mimic = 0; lite_spot(y, x); - - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); } /* Keep trying */ @@ -1702,9 +1574,6 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) /* We may continue tunelling */ msg_print(f_info[feat].tunnel); more = TRUE; - - /* Occasional Search XXX XXX */ - if (rand_int(100) < 25) search(); } } @@ -1796,16 +1665,8 @@ void do_cmd_tunnel(void) /* Get grid */ c_ptr = &cave[y][x]; - /* No tunnelling through doors */ - if (((c_ptr->feat >= FEAT_DOOR_HEAD) && - (c_ptr->feat <= FEAT_DOOR_TAIL)) || (c_ptr->feat == FEAT_SHOP)) - { - /* Message */ - msg_print("You cannot tunnel through doors."); - } - /* No tunnelling through air */ - else if (cave_floor_grid(c_ptr)) + if (cave_floor_grid(c_ptr)) { /* Message */ msg_print("You cannot tunnel through air."); @@ -1836,308 +1697,6 @@ void do_cmd_tunnel(void) if (!more) disturb(0); } - -/* - * Perform the basic "disarm" command - * - * Assume destination is a visible trap - * - * Assume there is no monster blocking the destination - * - * Returns TRUE if repeated commands may continue - */ -static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx) -{ - auto const &t_info = game->edit_data.t_info; - - int i, j; - - bool_ more = FALSE; - - object_type *o_ptr = &o_list[o_idx]; - - auto t_ptr = &t_info[o_ptr->pval]; - - - /* Take a turn */ - energy_use = 100; - - /* Get the "disarm" factor */ - i = p_ptr->skill_dis; - - /* Penalize some conditions */ - if (p_ptr->blind || no_lite()) i = i / 10; - if (p_ptr->confused || p_ptr->image) i = i / 10; - - /* Extract the difficulty */ - j = i - t_ptr->difficulty * 3; - - /* Always have a small chance of success */ - if (j < 2) j = 2; - - /* Must find the trap first. */ - if (!object_known_p(o_ptr)) - { - msg_print("I don't see any traps."); - } - - /* Already disarmed/unlocked */ - else if (o_ptr->pval <= 0) - { - msg_print("The chest is not trapped."); - } - - /* Success (get a lot of experience) */ - else if (rand_int(100) < j) - { - msg_print("You have disarmed the chest."); - gain_exp(t_ptr->difficulty * 3); - o_ptr->pval = (0 - o_ptr->pval); - } - - /* Failure -- Keep trying */ - else if ((i > 5) && (randint(i) > 5)) - { - /* We may keep trying */ - more = TRUE; - flush_on_failure(); - msg_print("You failed to disarm the chest."); - } - - /* Failure -- Set off the trap */ - else - { - msg_print("You set off a trap!"); - chest_trap(y, x, o_idx); - } - - /* Result */ - return (more); -} - - -/* - * Perform the basic "disarm" command - * - * Assume destination is a visible trap - * - * Assume there is no monster blocking the destination - * - * Returns TRUE if repeated commands may continue - */ -static bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup) -{ - auto const &f_info = game->edit_data.f_info; - auto const &t_info = game->edit_data.t_info; - - int i, j, power; - - cptr name; - - bool_ more = FALSE; - - - /* Take a turn */ - energy_use = 100; - - /* Get grid and contents */ - auto c_ptr = &cave[y][x]; - - /* Access trap name */ - if (t_info[c_ptr->t_idx].ident) - { - name = t_info[c_ptr->t_idx].name; - } - else - { - name = "unknown trap"; - } - - /* Get the "disarm" factor */ - i = p_ptr->skill_dis; - - /* Penalize some conditions */ - if (p_ptr->blind || no_lite()) i = i / 10; - if (p_ptr->confused || p_ptr->image) i = i / 10; - - /* XXX XXX XXX Variable power? */ - - /* Extract trap "power" */ - power = t_info[c_ptr->t_idx].difficulty; - - /* Extract the difficulty */ - j = i - power; - - /* Always have a small chance of success */ - if (j < 2) j = 2; - - /* Success */ - if (rand_int(100) < j) - { - /* Message */ - msg_format("You have disarmed the %s.", name); - - /* Reward */ - gain_exp(power); - - /* Forget the trap */ - c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT); - - /* Remove the trap */ - c_ptr->t_idx = 0; - - /* Move the player onto the trap */ - if (!(f_info[c_ptr->feat].flags & FF_DOOR)) - move_player_aux(dir, do_pickup, 0, TRUE); - - /* Remove trap attr from grid */ - note_spot(y, x); - lite_spot(y, x); - } - - /* Failure -- Keep trying */ - else if ((i > 5) && (randint(i) > 5)) - { - /* Failure */ - flush_on_failure(); - - /* Message */ - msg_format("You failed to disarm the %s.", name); - - /* We may keep trying */ - more = TRUE; - } - - /* Failure -- Set off the trap */ - else - { - /* Message */ - msg_format("You set off the %s!", name); - - /* Move the player onto the trap */ - if (!(f_info[c_ptr->feat].flags & FF_DOOR)) - move_player_aux(dir, do_pickup, 0, FALSE); - } - - /* Result */ - return (more); -} - - -/* - * Disamrs the monster traps(no failure) - */ -void do_cmd_disarm_mon_trap(int y, int x) -{ - msg_print("You disarm the monster trap."); - - place_floor_convert_glass(y, x); - cave[p_ptr->py][p_ptr->px].special = cave[p_ptr->py][p_ptr->px].special2 = 0; -} - - -/* - * Disarms a trap, or chest - */ -void do_cmd_disarm(void) -{ - int y, x, dir; - - s16b o_idx; - - cave_type *c_ptr; - - bool_ more = FALSE; - - - /* Pick a direction if there's an obvious choice */ - { - int num_traps, num_chests; - - /* Count visible traps */ - num_traps = count_feats(&y, &x, is_trap, TRUE); - - /* Count chests (trapped) */ - num_chests = count_chests(&y, &x, TRUE); - - /* See if only one target */ - if (num_traps || num_chests) - { - if (num_traps + num_chests <= 1) - command_dir = coords_to_dir(y, x); - } - } - - /* Allow repeated command */ - if (command_arg) - { - /* Set repeat count */ - command_rep = command_arg - 1; - - /* Redraw the state */ - p_ptr->redraw |= (PR_FRAME); - - /* Cancel the arg */ - command_arg = 0; - } - - /* Get a direction (or abort) */ - if (get_rep_dir(&dir)) - { - /* Get location */ - y = p_ptr->py + ddy[dir]; - x = p_ptr->px + ddx[dir]; - - /* Get grid and contents */ - c_ptr = &cave[y][x]; - - /* Check for chests */ - o_idx = chest_check(y, x); - - /* Disarm a trap */ - if (((c_ptr->t_idx == 0) || (!(c_ptr->info & CAVE_TRDT))) && - !o_idx && (c_ptr->feat != FEAT_MON_TRAP)) - { - /* Message */ - msg_print("You see nothing there to disarm."); - } - - /* Monster in the way */ - else if (c_ptr->m_idx) - { - /* Message */ - msg_print("There is a monster in the way!"); - - /* Attack */ - py_attack(y, x, -1); - } - - /* Disarm chest */ - else if (o_idx) - { - /* Disarm the chest */ - more = do_cmd_disarm_chest(y, x, o_idx); - } - - /* Disarm trap */ - else - { - /* Disarm the trap */ - if (c_ptr->feat == FEAT_MON_TRAP) - { - do_cmd_disarm_mon_trap(y, x); - more = FALSE; - } - else - more = do_cmd_disarm_aux(y, x, dir, options->always_pickup); - } - } - - /* Cancel repeat unless told not to */ - if (!more) disturb(0); -} - - /* * Perform the basic "bash" command * @@ -2198,23 +1757,17 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) /* Break down the door */ if (rand_int(100) < 50) { - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - cave_set_feat(y, x, FEAT_BROKEN); } /* Open the door */ else { - /* Set off trap */ - if (c_ptr->t_idx != 0) player_activate_door_trap(y, x); - cave_set_feat(y, x, FEAT_OPEN); } /* Hack -- Fall through the door. Can't disarm while falling. */ - move_player_aux(dir, options->always_pickup, 0, FALSE); + move_player_aux(dir, options->always_pickup, 0); /* Update some things */ p_ptr->update |= (PU_VIEW | PU_MON_LITE); @@ -2418,13 +1971,6 @@ void do_cmd_alter(void) more = do_cmd_tunnel_aux(y, x, dir); } - /* Disarm traps */ - else if (c_ptr->t_idx != 0) - { - /* Tunnel */ - more = do_cmd_disarm_aux(y, x, dir, options->always_pickup); - } - /* Oops */ else { @@ -2545,7 +2091,7 @@ void do_cmd_spike(void) } -static void do_cmd_walk_jump(int pickup, bool_ disarm) +static void do_cmd_walk_jump(int pickup) { auto const &wf_info = game->edit_data.wf_info; @@ -2574,7 +2120,7 @@ static void do_cmd_walk_jump(int pickup, bool_ disarm) energy_use = 100; /* Actually move the character */ - move_player(dir, pickup, disarm); + move_player(dir, pickup); /* Allow more walking */ more = TRUE; @@ -2749,7 +2295,7 @@ static void do_cmd_unwalk() else if (((feat >= FEAT_QUEST_ENTER) && (feat <= FEAT_QUEST_UP)) || ((feat >= FEAT_LESS) && (feat <= FEAT_MORE))) { - move_player(dir, options->always_pickup, TRUE); + move_player(dir, options->always_pickup); more = FALSE; } @@ -2766,7 +2312,7 @@ static void do_cmd_unwalk() while (dir == 5); } - move_player(dir, options->always_pickup, TRUE); + move_player(dir, options->always_pickup); } /* Walking semantics */ @@ -2783,7 +2329,7 @@ static void do_cmd_unwalk() /* * Support code for the "Walk" and "Jump" commands */ -void do_cmd_walk(int pickup, bool_ disarm) +void do_cmd_walk(int pickup) { /* Move (usually pickup) */ @@ -2793,7 +2339,7 @@ void do_cmd_walk(int pickup, bool_ disarm) } else { - do_cmd_walk_jump(pickup, disarm); + do_cmd_walk_jump(pickup); } } @@ -2866,20 +2412,6 @@ void do_cmd_stay(int pickup) /* Take a turn */ energy_use = 100; - - /* Spontaneous Searching */ - if ((p_ptr->skill_fos >= 50) || (0 == rand_int(50 - p_ptr->skill_fos))) - { - search(); - } - - /* Continuous Searching */ - if (p_ptr->searching) - { - search(); - } - - /* Handle "objects" */ carry(pickup); @@ -2973,9 +2505,6 @@ void do_cmd_rest(void) /* Save the rest code */ resting = command_arg; - /* Cancel searching */ - p_ptr->searching = FALSE; - /* Recalculate bonuses */ p_ptr->update |= (PU_BONUS); diff --git a/src/cmd2.hpp b/src/cmd2.hpp index 142238ab..f811cf45 100644 --- a/src/cmd2.hpp +++ b/src/cmd2.hpp @@ -19,7 +19,7 @@ extern void do_cmd_disarm(void); extern void do_cmd_bash(void); extern void do_cmd_alter(void); extern void do_cmd_spike(void); -extern void do_cmd_walk(int pickup, bool_ disarm); +extern void do_cmd_walk(int pickup); extern void do_cmd_stay(int pickup); extern void do_cmd_run(void); extern void do_cmd_rest(void); diff --git a/src/cmd4.cc b/src/cmd4.cc index 8d1b0079..2dcb0beb 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -34,7 +34,6 @@ #include "squeltch.hpp" #include "tables.hpp" #include "town_type.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -3237,35 +3236,6 @@ void do_cmd_knowledge_artifacts(void) } -/* - * Check the status of traps - */ -void do_cmd_knowledge_traps(void) -{ - auto const &t_info = game->edit_data.t_info; - - fmt::MemoryWriter w; - /* Scan the traps */ - for (auto const &t_ref: t_info) - { - /* Get the trap */ - auto t_ptr = &t_ref; - - /* Skip "empty" traps */ - if (!t_ptr->name) continue; - - /* Skip unidentified traps */ - if (!t_ptr->ident) continue; - - /* Hack -- Build the trap name */ - w.write(" {}\n", t_ptr->name); - } - - /* Display the file contents */ - show_string(w.c_str(), "Traps known"); -} - - static int monster_get_race_level(int r_idx) { auto const &r_info = game->edit_data.r_info; @@ -3822,12 +3792,11 @@ void do_cmd_knowledge(void) prt("(7) Display current pets", 10, 5); prt("(8) Display current quests", 11, 5); prt("(9) Display current fates", 12, 5); - prt("(0) Display known traps", 13, 5); - prt("(A) Display known dungeon towns", 14, 5); - prt("(B) Display notes", 15, 5); + prt("(0) Display known dungeon towns", 13, 5); + prt("(A) Display notes", 14, 5); /* Prompt */ - prt("Command: ", 17, 0); + prt("Command: ", 16, 0); /* Prompt */ i = inkey(); @@ -3909,17 +3878,8 @@ void do_cmd_knowledge(void) break; } - /* Traps */ - case '0': - { - do_cmd_knowledge_traps(); - - break; - } - /* Dungeon towns */ - case 'A': - case 'a': + case '0': { do_cmd_knowledge_towns(); @@ -3927,8 +3887,8 @@ void do_cmd_knowledge(void) } /* Notes */ - case 'B': - case 'b': + case 'A': + case 'a': { do_cmd_knowledge_notes(); diff --git a/src/cmd5.cc b/src/cmd5.cc index a94f925a..91c12e83 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -1570,13 +1570,6 @@ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_s break; } - case SF_TRAPS_IDX: - { - trap_creation(); - - break; - } - case SF_S_THUNDERLORD_IDX: { for (int k = 0; k < 1; k++) diff --git a/src/cmd6.cc b/src/cmd6.cc index d6df7570..70f35bd0 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -2296,7 +2296,6 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) wiz_lite_extra(); (void)do_inc_stat(A_INT); (void)do_inc_stat(A_WIS); - (void)detect_traps(DEFAULT_RADIUS); (void)detect_doors(DEFAULT_RADIUS); (void)detect_stairs(DEFAULT_RADIUS); (void)detect_treasure(DEFAULT_RADIUS); @@ -3094,13 +3093,6 @@ void do_cmd_read_scroll(void) break; } - case SV_SCROLL_TRAP_CREATION: - { - if (trap_creation()) ident = TRUE; - - break; - } - case SV_SCROLL_PHASE_DOOR: { teleport_player(10); @@ -3278,13 +3270,6 @@ void do_cmd_read_scroll(void) break; } - case SV_SCROLL_DETECT_TRAP: - { - if (detect_traps(DEFAULT_RADIUS)) ident = TRUE; - - break; - } - case SV_SCROLL_DETECT_DOOR: { if (detect_doors(DEFAULT_RADIUS)) ident = TRUE; @@ -3360,13 +3345,6 @@ void do_cmd_read_scroll(void) break; } - case SV_SCROLL_TRAP_DOOR_DESTRUCTION: - { - if (destroy_doors_touch()) ident = TRUE; - - break; - } - case SV_SCROLL_STAR_DESTRUCTION: { /* Prevent destruction of quest levels and town */ @@ -4142,7 +4120,6 @@ void do_cmd_zap_rod(void) { switch (o_ptr->pval) { - case SV_ROD_DETECT_TRAP: case SV_ROD_HAVOC: case SV_ROD_HOME: { @@ -4254,13 +4231,6 @@ void do_cmd_zap_rod(void) break; } - case SV_ROD_DETECT_TRAP: - { - if (detect_traps(DEFAULT_RADIUS)) ident = TRUE; - - break; - } - case SV_ROD_DETECT_DOOR: { if (detect_doors(DEFAULT_RADIUS)) ident = TRUE; @@ -4374,13 +4344,6 @@ void do_cmd_zap_rod(void) break; } - case SV_ROD_DISARMING: - { - if (disarm_trap(dir)) ident = TRUE; - - break; - } - case SV_ROD_LITE: { msg_print("A line of blue shimmering light appears."); @@ -5670,7 +5633,6 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return "clairvoyance every 100+d100 turns"; msg_print("The stone glows a deep green..."); wiz_lite_extra(); - (void)detect_traps(DEFAULT_RADIUS); (void)detect_doors(DEFAULT_RADIUS); (void)detect_stairs(DEFAULT_RADIUS); @@ -7282,8 +7244,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) c_ptr->info &= ~(CAVE_GLOW); /* Hack -- Forget "boring" grids */ - if (cave_plain_floor_grid(c_ptr) && - !(c_ptr->info & (CAVE_TRDT))) + if (cave_plain_floor_grid(c_ptr)) { /* Forget the grid */ c_ptr->info &= ~(CAVE_MARK); diff --git a/src/cmd7.cc b/src/cmd7.cc index 85da374c..48747cfb 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -484,7 +484,6 @@ void do_cmd_mindcraft(void) { b = detect_monsters_normal(DEFAULT_RADIUS); if (plev > 14) b |= detect_monsters_invis(DEFAULT_RADIUS); - if (plev > 4) b |= detect_traps(DEFAULT_RADIUS); } else { @@ -3508,7 +3507,7 @@ void do_cmd_unbeliever() /* Select what to do */ while (TRUE) { - if (!get_com("Disrupt [C]ontinuum or [D]etect Traps", &ch)) + if (!get_com("Disrupt [C]ontinuum or [D]estroy Doors", &ch)) { ext = 0; break; @@ -3534,20 +3533,18 @@ void do_cmd_unbeliever() break; } - /* Detect Traps */ + /* Destroy Doors */ case 2: { s16b skill = get_skill(SKILL_ANTIMAGIC); if (skill < 25) { - msg_print("You cannot use your detection abilities yet."); + msg_print("You cannot use your door destruction abilities yet."); break; } - detect_traps(DEFAULT_RADIUS); - - if (skill >= 35) destroy_doors_touch(); + destroy_doors_touch(); break; } diff --git a/src/defines.h b/src/defines.h index 082fb291..7da8e038 100644 --- a/src/defines.h +++ b/src/defines.h @@ -114,13 +114,6 @@ */ #define DEFAULT_RADIUS 25 - -#define CHANCE_TRAP_JAMMED_DOOR 2500 -#define CHANCE_TRAP_SECRET_DOOR 1500 -#define CHANCE_TRAP_LOCKED_DOOR 1000 -#define CHANCE_TRAP_DOOR 500 /* in 10000 */ -#define CHANCE_TRAP_FLOOR 4 /* in 10000 chance of placing a trap */ - #define MAX_SPELLS 100 #define MAX_RUNES 100 @@ -383,7 +376,6 @@ #define MAX_STACK_SIZE 100 -/* XXX */ #define MKEY_MINDCRAFT 2 #define MKEY_ANTIMAGIC 3 #define MKEY_MIMIC 6 @@ -393,7 +385,6 @@ #define MKEY_FORGING 10 #define MKEY_INCARNATION 11 #define MKEY_SUMMON 13 -#define MKEY_TRAP 14 #define MKEY_STEAL 15 #define MKEY_DODGE 16 #define MKEY_SCHOOL 17 @@ -489,9 +480,6 @@ /* Feature 0x10 -- web */ -/* Traps */ -#define FEAT_TRAP 0x11 - /* Features 0x12 - 0x1F -- unused */ /* Doors */ @@ -575,7 +563,6 @@ #define FEAT_MARKER 0xAC /* 172 */ /* Feature 0xAD -- Underground Tunnel */ #define FEAT_TAINTED_WATER 0xAE /* 174 */ -#define FEAT_MON_TRAP 0xAF /* 175 */ #define FEAT_BETWEEN2 0xB0 /* 176 */ #define FEAT_LAVA_WALL 0xB1 /* 177 */ #define FEAT_GREAT_FIRE 0xB2 /* 178 */ @@ -972,7 +959,6 @@ #define TV_LITE 39 /* Lites (including Specials) */ #define TV_AMULET 40 /* Amulets (including Specials) */ #define TV_RING 45 /* Rings (including Specials) */ -#define TV_TRAPKIT 46 /* Trapkits */ #define TV_TOTEM 54 /* Summoner totems */ #define TV_STAFF 55 #define TV_WAND 65 @@ -1016,14 +1002,6 @@ #define SV_HARP 59 #define SV_HORN 60 -/* The "sval" codes for TV_TRAPKIT */ -#define SV_TRAPKIT_SLING 1 -#define SV_TRAPKIT_BOW 2 -#define SV_TRAPKIT_XBOW 3 -#define SV_TRAPKIT_POTION 4 -#define SV_TRAPKIT_SCROLL 5 -#define SV_TRAPKIT_DEVICE 6 - /* The "sval" codes for TV_BOOMERANG */ #define SV_BOOM_S_WOOD 1 /* 1d4 */ #define SV_BOOM_WOOD 2 /* 1d8 */ @@ -1387,7 +1365,6 @@ #define SV_ROD_RESTORATION 10 #define SV_ROD_SPEED 11 #define SV_ROD_TELEPORT_AWAY 13 -#define SV_ROD_DISARMING 14 #define SV_ROD_LITE 15 #define SV_ROD_SLEEP_MONSTER 16 #define SV_ROD_SLOW_MONSTER 17 @@ -1402,7 +1379,6 @@ #define SV_ROD_FIRE_BALL 26 #define SV_ROD_COLD_BALL 27 #define SV_ROD_HAVOC 28 -#define SV_ROD_DETECT_TRAP 29 #define SV_ROD_HOME 30 @@ -1428,7 +1404,6 @@ #define SV_SCROLL_SUMMON_MONSTER 4 #define SV_SCROLL_SUMMON_UNDEAD 5 #define SV_SCROLL_SUMMON_MINE 6 -#define SV_SCROLL_TRAP_CREATION 7 #define SV_SCROLL_PHASE_DOOR 8 #define SV_SCROLL_TELEPORT 9 #define SV_SCROLL_TELEPORT_LEVEL 10 @@ -1449,7 +1424,6 @@ #define SV_SCROLL_MAPPING 25 #define SV_SCROLL_DETECT_GOLD 26 #define SV_SCROLL_DETECT_ITEM 27 -#define SV_SCROLL_DETECT_TRAP 28 #define SV_SCROLL_DETECT_DOOR 29 #define SV_SCROLL_DETECT_INVIS 30 #define SV_SCROLL_DIVINATION 31 @@ -1460,7 +1434,6 @@ #define SV_SCROLL_MONSTER_CONFUSION 36 #define SV_SCROLL_PROTECTION_FROM_EVIL 37 #define SV_SCROLL_RUNE_OF_PROTECTION 38 -#define SV_SCROLL_TRAP_DOOR_DESTRUCTION 39 #define SV_SCROLL_DEINCARNATION 40 #define SV_SCROLL_STAR_DESTRUCTION 41 #define SV_SCROLL_DISPEL_UNDEAD 42 @@ -1492,7 +1465,6 @@ #define SV_POTION_SLEEP 11 #define SV_POTION_LEARNING 12 #define SV_POTION_LOSE_MEMORIES 13 -/* xxx */ #define SV_POTION_RUINATION 15 #define SV_POTION_DEC_STR 16 #define SV_POTION_DEC_INT 17 @@ -1532,7 +1504,6 @@ #define SV_POTION_INC_DEX 51 #define SV_POTION_INC_CON 52 #define SV_POTION_INC_CHR 53 -/* xxx */ #define SV_POTION_AUGMENTATION 55 #define SV_POTION_ENLIGHTENMENT 56 #define SV_POTION_STAR_ENLIGHTENMENT 57 @@ -1620,13 +1591,6 @@ */ #define SV_BOOK_MAX_GOOD 49 -/* flags for operation in get_random_trap in object3.c */ - -#define TRAP_EXISTS 0x00000001L -#define TRAP_FOUND 0x00000002L -#define TRAP_NOTFOUND 0x00000004L -#define TRAP_IDENTIFIED 0x00000008L - /*** General flag values ***/ @@ -1641,11 +1605,9 @@ #define CAVE_VIEW 0x0020 /* view flag */ #define CAVE_TEMP 0x0040 /* temp flag */ #define CAVE_WALL 0x0080 /* wall flag */ -#define CAVE_TRDT 0x0100 /* trap detected */ #define CAVE_IDNT 0x0200 /* grid identified (fountains) */ #define CAVE_SPEC 0x0400 /* special mark(quests) */ #define CAVE_FREE 0x0800 /* no random generation on it */ -#define CAVE_DETECT 0x1000 /* Traps detected here */ #define CAVE_PLIT 0x2000 /* Player lit grid */ #define CAVE_MLIT 0x4000 /* Monster lit grid */ @@ -1728,7 +1690,6 @@ #define SM_OPP_POIS 0x00100000 #define SM_OPP_XXX1 0x00200000 #define SM_CLONED 0x00400000 -#define SM_NOTE_TRAP 0x00800000 #define SM_IMM_ACID 0x01000000 #define SM_IMM_ELEC 0x02000000 #define SM_IMM_FIRE 0x04000000 @@ -1775,17 +1736,12 @@ #define PU_MANA 0x00000020L /* Calculate csp and msp */ #define PU_SPELLS 0x00000040L /* Calculate spells */ #define PU_POWERS 0x00000080L /* Calculate powers */ -/* xxx (many) */ #define PU_UN_VIEW 0x00010000L /* Forget view */ -/* xxx (many) */ #define PU_VIEW 0x00100000L /* Update view */ #define PU_MON_LITE 0x00200000L /* Update monster light */ -/* xxx */ #define PU_MONSTERS 0x01000000L /* Update monsters */ #define PU_DISTANCE 0x02000000L /* Update distances */ -/* xxx */ #define PU_FLOW 0x10000000L /* Update flow */ -/* xxx (many) */ /* @@ -1800,215 +1756,20 @@ */ #define PW_INVEN 0x00000001L /* Display inven/equip */ #define PW_EQUIP 0x00000002L /* Display equip/inven */ -/* xxx */ #define PW_PLAYER 0x00000008L /* Display character */ #define PW_M_LIST 0x00000010L /* Show monster list */ -/* xxx */ #define PW_MESSAGE 0x00000040L /* Display messages */ #define PW_OVERHEAD 0x00000080L /* Display overhead view */ #define PW_MONSTER 0x00000100L /* Display monster recall */ #define PW_OBJECT 0x00000200L /* Display object recall */ -/* xxx */ #define PW_SNAPSHOT 0x00000800L /* Display snap-shot */ -/* xxx */ -/* jk */ -#define FTRAP_CHEST 0x000000001 /* may appear on chests */ -#define FTRAP_DOOR 0x000000002 /* may appear on doors/floors */ -#define FTRAP_FLOOR 0x000000004 /* may appear on floor */ -#define FTRAP_CHANGE 0x000000008 /* Color changing */ -#define FTRAP_XXX5 0x000000010 -#define FTRAP_XXX6 0x000000020 -#define FTRAP_XXX7 0x000000040 -#define FTRAP_XXX8 0x000000080 -#define FTRAP_XXX9 0x000000100 -#define FTRAP_XXX10 0x000000200 -#define FTRAP_XXX11 0x000000400 -#define FTRAP_XXX12 0x000000800 -#define FTRAP_XXX13 0x000001000 -#define FTRAP_XXX14 0x000002000 -#define FTRAP_XXX15 0x000004000 -#define FTRAP_XXX16 0x000008000 -#define FTRAP_LEVEL1 0x000010000 /* low level ball/bolt trap */ -#define FTRAP_LEVEL2 0x000020000 /* medium level ball/bolt trap */ -#define FTRAP_LEVEL3 0x000040000 /* high level ball/bolt trap */ -#define FTRAP_LEVEL4 0x000080000 /* oops level ball/bolt trap */ -#define FTRAP_XXX21 0x000100000 -#define FTRAP_XXX22 0x000200000 -#define FTRAP_XXX23 0x000400000 -#define FTRAP_XXX24 0x000800000 -#define FTRAP_XXX25 0x001000000 -#define FTRAP_XXX26 0x002000000 -#define FTRAP_XXX27 0x004000000 -#define FTRAP_XXX28 0x008000000 -#define FTRAP_XXX29 0x010000000 -#define FTRAP_XXX30 0x020000000 -#define FTRAP_XXX31 0x040000000 -#define FTRAP_XXX32 0x080000000 - /* jk */ #define STAT_DEC_TEMPORARY 1 #define STAT_DEC_NORMAL 2 #define STAT_DEC_PERMANENT 3 -/* jk - which trap is which number */ -#define TRAP_OF_WEAKNESS_I 1 -#define TRAP_OF_WEAKNESS_II 2 -#define TRAP_OF_WEAKNESS_III 3 -#define TRAP_OF_INTELLIGENCE_I 4 -#define TRAP_OF_INTELLIGENCE_II 5 -#define TRAP_OF_INTELLIGENCE_III 6 -#define TRAP_OF_WISDOM_I 7 -#define TRAP_OF_WISDOM_II 8 -#define TRAP_OF_WISDOM_III 9 -#define TRAP_OF_FUMBLING_I 10 -#define TRAP_OF_FUMBLING_II 11 -#define TRAP_OF_FUMBLING_III 12 -#define TRAP_OF_WASTING_I 13 -#define TRAP_OF_WASTING_II 14 -#define TRAP_OF_WASTING_III 15 -#define TRAP_OF_BEAUTY_I 16 -#define TRAP_OF_BEAUTY_II 17 -#define TRAP_OF_BEAUTY_III 18 - -#define TRAP_OF_CURSE_WEAPON 20 -#define TRAP_OF_CURSE_ARMOR 21 -#define TRAP_OF_EARTHQUAKE 22 -#define TRAP_OF_POISON_NEEDLE 23 -#define TRAP_OF_SUMMON_MONSTER 24 -#define TRAP_OF_SUMMON_UNDEAD 25 -#define TRAP_OF_SUMMON_GREATER_UNDEAD 26 -#define TRAP_OF_TELEPORT 27 -#define TRAP_OF_PARALYZING 28 -#define TRAP_OF_EXPLOSIVE_DEVICE 29 -#define TRAP_OF_TELEPORT_AWAY 30 -#define TRAP_OF_LOSE_MEMORY 31 -#define TRAP_OF_BITTER_REGRET 32 -#define TRAP_OF_BOWEL_CRAMPS 33 -#define TRAP_OF_BLINDNESS_CONFUSION 34 -#define TRAP_OF_AGGRAVATION 35 -#define TRAP_OF_MULTIPLICATION 36 -#define TRAP_OF_STEAL_ITEM 37 -#define TRAP_OF_SUMMON_FAST_QUYLTHULGS 38 -#define TRAP_OF_SINKING 39 -#define TRAP_OF_MANA_DRAIN 40 -#define TRAP_OF_MISSING_MONEY 41 -#define TRAP_OF_NO_RETURN 42 -#define TRAP_OF_SILENT_SWITCHING 43 -#define TRAP_OF_WALLS 44 -#define TRAP_OF_CALLING_OUT 45 -#define TRAP_OF_SLIDING 46 -#define TRAP_OF_CHARGES_DRAIN 47 -#define TRAP_OF_STAIR_MOVEMENT 48 -#define TRAP_OF_NEW 49 -#define TRAP_OF_SCATTER_ITEMS 50 -#define TRAP_OF_DECAY 51 -#define TRAP_OF_WASTING_WANDS 52 -#define TRAP_OF_FILLING 53 -#define TRAP_OF_DRAIN_SPEED 54 - -#define TRAP_OF_ELEC_BOLT 60 -#define TRAP_OF_POIS_BOLT 61 -#define TRAP_OF_ACID_BOLT 62 -#define TRAP_OF_COLD_BOLT 63 -#define TRAP_OF_FIRE_BOLT 64 -#define TRAP_OF_PLASMA_BOLT 65 -#define TRAP_OF_WATER_BOLT 66 -#define TRAP_OF_LITE_BOLT 67 -#define TRAP_OF_DARK_BOLT 68 -#define TRAP_OF_SHARDS_BOLT 69 -#define TRAP_OF_SOUND_BOLT 70 -#define TRAP_OF_CONFUSION_BOLT 71 -#define TRAP_OF_FORCE_BOLT 72 -#define TRAP_OF_INERTIA_BOLT 73 -#define TRAP_OF_MANA_BOLT 74 -#define TRAP_OF_ICE_BOLT 75 -#define TRAP_OF_CHAOS_BOLT 76 -#define TRAP_OF_NETHER_BOLT 77 -#define TRAP_OF_DISENCHANT_BOLT 78 -#define TRAP_OF_NEXUS_BOLT 79 -#define TRAP_OF_TIME_BOLT 80 -#define TRAP_OF_GRAVITY_BOLT 81 - -#define TRAP_OF_ELEC_BALL 82 -#define TRAP_OF_POIS_BALL 83 -#define TRAP_OF_ACID_BALL 84 -#define TRAP_OF_COLD_BALL 85 -#define TRAP_OF_FIRE_BALL 86 -#define TRAP_OF_PLASMA_BALL 87 -#define TRAP_OF_WATER_BALL 88 -#define TRAP_OF_LITE_BALL 89 -#define TRAP_OF_DARK_BALL 90 -#define TRAP_OF_SHARDS_BALL 91 -#define TRAP_OF_SOUND_BALL 92 -#define TRAP_OF_CONFUSION_BALL 93 -#define TRAP_OF_FORCE_BALL 94 -#define TRAP_OF_INERTIA_BALL 95 -#define TRAP_OF_MANA_BALL 96 -#define TRAP_OF_ICE_BALL 97 -#define TRAP_OF_CHAOS_BALL 98 -#define TRAP_OF_NETHER_BALL 99 -#define TRAP_OF_DISENCHANT_BALL 100 -#define TRAP_OF_NEXUS_BALL 101 -#define TRAP_OF_TIME_BALL 102 -#define TRAP_OF_GRAVITY_BALL 103 - -#define TRAP_OF_ARROW_I 110 -#define TRAP_OF_ARROW_II 111 -#define TRAP_OF_ARROW_III 112 -#define TRAP_OF_ARROW_IV 113 -#define TRAP_OF_POISON_ARROW_I 114 -#define TRAP_OF_POISON_ARROW_II 115 -#define TRAP_OF_POISON_ARROW_III 116 -#define TRAP_OF_POISON_ARROW_IV 117 -#define TRAP_OF_DAGGER_I 118 -#define TRAP_OF_DAGGER_II 119 -#define TRAP_OF_POISON_DAGGER_I 120 -#define TRAP_OF_POISON_DAGGER_II 121 -#define TRAP_OF_ARROWS_I 122 -#define TRAP_OF_ARROWS_II 123 -#define TRAP_OF_ARROWS_III 124 -#define TRAP_OF_ARROWS_IV 125 -#define TRAP_OF_POISON_ARROWS_I 126 -#define TRAP_OF_POISON_ARROWS_II 127 -#define TRAP_OF_POISON_ARROWS_III 128 -#define TRAP_OF_POISON_ARROWS_IV 129 -#define TRAP_OF_DAGGERS_I 130 -#define TRAP_OF_DAGGERS_II 131 -#define TRAP_OF_POISON_DAGGERS_I 132 -#define TRAP_OF_POISON_DAGGERS_II 133 - -#define TRAP_OF_DROP_ITEMS 140 -#define TRAP_OF_DROP_ALL_ITEMS 141 -#define TRAP_OF_DROP_EVERYTHING 142 - -#define TRAP_OF_ELDRITCH_HORROR 156 - -#define TRAP_OF_DIVINE_ANGER 158 -#define TRAP_OF_DIVINE_WRATH 159 -#define TRAP_OF_HALLUCINATION 160 - -#define TRAP_OF_ROCKET 161 -#define TRAP_OF_NUKE_BOLT 162 -#define TRAP_OF_DEATH_RAY 163 -#define TRAP_OF_HOLY_FIRE 164 -#define TRAP_OF_HELL_FIRE 165 -#define TRAP_OF_PSI_BOLT 166 -#define TRAP_OF_PSI_DRAIN 167 -#define TRAP_OF_NUKE_BALL 168 -#define TRAP_OF_PSI_BALL 169 - -/* DG */ -#define TRAP_OF_ACQUIREMENT 170 - -/* Runescrye */ -#define TRAP_G_ELEC_BOLT 171 -#define TRAP_G_POIS_BOLT 172 -#define TRAP_G_ACID_BOLT 173 -#define TRAP_G_COLD_BOLT 174 -#define TRAP_G_FIRE_BOLT 175 - /*** General index values ***/ @@ -2089,10 +1850,8 @@ #define GF_GRAVITY 35 #define GF_KILL_WALL 40 #define GF_KILL_DOOR 41 -#define GF_KILL_TRAP 42 #define GF_MAKE_WALL 45 #define GF_MAKE_DOOR 46 -#define GF_MAKE_TRAP 47 #define GF_OLD_CLONE 51 #define GF_OLD_POLY 52 #define GF_OLD_HEAL 53 @@ -2768,7 +2527,6 @@ #define CMD_DUMP_HTML -8186 #define CMD_MACRO -8185 #define CMD_QUEST -8184 -#define CMD_BLUNDER -8183 #define CMD_SHOW_ABILITY -8182 #define CLI_MAX 128 @@ -2791,7 +2549,6 @@ #define AB_AMMO_CREATION 5 #define AB_DEATH_TOUCH 6 #define AB_FAR_REACHING 8 -#define AB_TRAPPING 9 #define AB_UNDEAD_FORM 10 /** diff --git a/src/dungeon.cc b/src/dungeon.cc index 1f3f6253..e73c9ac5 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -329,7 +329,6 @@ static sense_function_t select_sense(object_type *o_ptr, sense_function_t combat case TV_HARD_ARMOR: case TV_DRAG_ARMOR: case TV_BOOMERANG: - case TV_TRAPKIT: { return combat; } @@ -1674,8 +1673,8 @@ static void process_world(void) } - /* Searching or Resting */ - if (p_ptr->searching || resting) + /* Resting boosts regeneration */ + if (resting) { regen_amount = regen_amount * 2; } @@ -3387,7 +3386,7 @@ static void process_command(void) { if (do_control_walk()) break; - do_cmd_walk(options->always_pickup, TRUE); + do_cmd_walk(options->always_pickup); break; } @@ -3397,7 +3396,7 @@ static void process_command(void) { if (do_control_walk()) break; - do_cmd_walk(!options->always_pickup, TRUE); + do_cmd_walk(!options->always_pickup); break; } @@ -3437,23 +3436,6 @@ static void process_command(void) break; } - /* Search for traps/doors */ - case 's': - { - if (p_ptr->control) break; - do_cmd_search(); - break; - } - - /* Toggle search mode */ - case 'S': - { - if (p_ptr->control) break; - do_cmd_toggle_search(); - break; - } - - /*** Stairs and Doors and Chests and Traps ***/ /* Enter store */ @@ -3618,15 +3600,6 @@ static void process_command(void) break; } - /* Disarm a trap or chest */ - case 'D': - { - if (p_ptr->control) break; - if (!p_ptr->wild_mode) do_cmd_disarm(); - break; - } - - /*** Magic and Prayers ***/ /* Interact with skills */ @@ -4154,12 +4127,7 @@ static void process_command(void) do_cmd_macro_recorder(); break; } - case CMD_BLUNDER: - { - if (do_control_walk()) break; - do_cmd_walk(options->always_pickup, FALSE); - break; - } + /* Hack -- Unknown command */ default: { diff --git a/src/files.cc b/src/files.cc index 91ead001..d073f7fc 100644 --- a/src/files.cc +++ b/src/files.cc @@ -50,7 +50,6 @@ #include "store_type.hpp" #include "tables.hpp" #include "town_type.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -222,7 +221,6 @@ errr process_pref_file_aux(char *buf) auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; - auto &t_info = game->edit_data.t_info; int i, j, n1, n2; @@ -331,34 +329,6 @@ errr process_pref_file_aux(char *buf) return (0); } } - - /* Process "G:T::/" -- attr/char for traps */ - if (buf[2] == 'T') - { - if (tokenize(buf + 4, 3, zz, ':', '/') == 3) - { - std::size_t i = strtoul(zz[0], NULL, 0); - n1 = strtol(zz[1], NULL, 0); - n2 = strtol(zz[2], NULL, 0); - - if (i >= t_info.size()) - { - return 1; - } - - auto t_ptr = &t_info[i]; - - if (n1) - { - t_ptr->g_attr = n1; - } - if (n2) - { - t_ptr->g_char = n2; - } - return (0); - } - } } @@ -1310,8 +1280,6 @@ static void display_player_middle(void) put_str("Speed ", 13, 52); speed = p_ptr->pspeed; - /* Hack -- Visually "undo" the Search Mode Slowdown */ - if (p_ptr->searching) speed += 10; if (speed > 110) { char s[11]; @@ -1429,8 +1397,8 @@ static void display_player_various(void) auto const &r_info = game->edit_data.r_info; int tmp, tmp2, damdice, damsides, dambonus, blows; - int xthn, xthb, xfos, xsrh; - int xdis, xdev, xsav, xstl; + int xthn, xthb; + int xdev, xsav, xstl; cptr desc; int i; @@ -1452,12 +1420,9 @@ static void display_player_various(void) blows = p_ptr->num_blow; /* Basic abilities */ - xdis = p_ptr->skill_dis; xdev = p_ptr->skill_dev; xsav = p_ptr->skill_sav; xstl = p_ptr->skill_stl; - xsrh = p_ptr->skill_srh; - xfos = p_ptr->skill_fos; put_str("Fighting :", 16, 1); @@ -1477,21 +1442,9 @@ static void display_player_various(void) c_put_str(likert_color, desc, 19, 15); - put_str("Perception :", 16, 28); - desc = likert(xfos, 6); - c_put_str(likert_color, desc, 16, 42); - - put_str("Searching :", 17, 28); - desc = likert(xsrh, 6); - c_put_str(likert_color, desc, 17, 42); - - put_str("Disarming :", 18, 28); - desc = likert(xdis, 8); - c_put_str(likert_color, desc, 18, 42); - - put_str("Magic Device:", 19, 28); + put_str("Magic Device:", 20, 1); desc = likert(xdev, 6); - c_put_str(likert_color, desc, 19, 42); + c_put_str(likert_color, desc, 20, 15); put_str("Blows/Round:", 16, 55); diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index cd0a0b6b..cc3af2dc 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -19,7 +19,6 @@ #include "skill_descriptor.hpp" #include "store_action_type.hpp" #include "store_info_type.hpp" -#include "trap_type.hpp" #include "vault_type.hpp" #include "wilderness_type_info.hpp" @@ -142,9 +141,4 @@ struct GameEditData { */ std::vector ab_info; - /** - * Traps - */ - std::vector t_info; - }; diff --git a/src/generate.cc b/src/generate.cc index 856b593f..714238a8 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -35,7 +35,6 @@ #include "spells1.hpp" #include "tables.hpp" #include "town_type.hpp" -#include "traps.hpp" #include "util.hpp" #include "variable.hpp" #include "vault_type.hpp" @@ -198,7 +197,6 @@ * Hack -- Dungeon allocation "types" */ #define ALLOC_TYP_RUBBLE 1 /* Rubble */ -#define ALLOC_TYP_TRAP 3 /* Trap */ #define ALLOC_TYP_GOLD 4 /* Gold */ #define ALLOC_TYP_OBJECT 5 /* Object */ #define ALLOC_TYP_ALTAR 6 /* Altar */ @@ -942,45 +940,6 @@ static void place_locked_door(int y, int x) } -/* - * Place a secret door at the given location - */ -static void place_secret_door(int y, int x) -{ - cave_type *c_ptr = &cave[y][x]; - - /* Vaults */ - if (c_ptr->info & CAVE_ICKY) - { - c_ptr->mimic = FEAT_WALL_INNER; - } - - /* Ordinary room -- use current outer or inner wall */ - else if (c_ptr->info & CAVE_ROOM) - { - /* Determine if it's inner or outer XXX XXX XXX */ - if ((cave[y - 1][x].info & CAVE_ROOM) && - (cave[y + 1][x].info & CAVE_ROOM) && - (cave[y][x - 1].info & CAVE_ROOM) && - (cave[y][x + 1].info & CAVE_ROOM)) - { - c_ptr->mimic = feat_wall_inner; - } - else - { - c_ptr->mimic = feat_wall_outer; - } - } - else - { - c_ptr->mimic = fill_type[rand_int(100)]; - } - - /* Create secret door */ - cave_set_feat(y, x, FEAT_SECRET); -} - - /* * Place a random type of door at the given location */ @@ -1005,11 +964,11 @@ static void place_random_door(int y, int x) cave_set_feat(y, x, FEAT_BROKEN); } - /* Secret doors (200/1000) */ + /* Secret doors (200/1000) - now locked instead */ else if (tmp < 600) { - /* Create secret door */ - place_secret_door(y, x); + /* Create locked door */ + place_locked_door(y, x); } /* Closed doors (300/1000) */ @@ -1188,12 +1147,6 @@ static void alloc_object(int set, int typ, int num) break; } - case ALLOC_TYP_TRAP: - { - place_trap(y, x); - break; - } - case ALLOC_TYP_GOLD: { place_gold(y, x); @@ -1889,61 +1842,6 @@ static void vault_objects(int y, int x, int num) } -/* - * Place a trap with a given displacement of point - */ -static void vault_trap_aux(int y, int x, int yd, int xd) -{ - int count = 0, y1 = y, x1 = x; - int dummy = 0; - - /* Place traps */ - for (count = 0; count <= 5; count++) - { - /* Get a location */ - while (dummy < SAFE_MAX_ATTEMPTS) - { - y1 = rand_spread(y, yd); - x1 = rand_spread(x, xd); - dummy++; - if (in_bounds(y1, x1)) break; - } - - if (dummy >= SAFE_MAX_ATTEMPTS) - { - if (options->cheat_room) - { - msg_print("Warning! Could not place vault trap!"); - } - } - - - /* Require "naked" floor grids */ - if (!cave_naked_bold(y1, x1)) continue; - - /* Place the trap */ - place_trap(y1, x1); - - /* Done */ - break; - } -} - - -/* - * Place some traps with a given displacement of given location - */ -static void vault_traps(int y, int x, int yd, int xd, int num) -{ - int i; - - for (i = 0; i < num; i++) - { - vault_trap_aux(y, x, yd, xd); - } -} - - /* * Hack -- Place some sleeping monsters near the given location */ @@ -2290,20 +2188,20 @@ static void build_type3(int by0, int bx0) /* Build the vault */ build_rectangle(y1b, x1a, y2b, x2a, feat_wall_inner, info); - /* Place a secret door on the inner room */ + /* Place a locked door on the inner room */ switch (rand_int(4)) { case 0: - place_secret_door(y1b, xval); + place_locked_door(y1b, xval); break; case 1: - place_secret_door(y2b, xval); + place_locked_door(y2b, xval); break; case 2: - place_secret_door(yval, x1a); + place_locked_door(yval, x1a); break; case 3: - place_secret_door(yval, x2a); + place_locked_door(yval, x2a); break; } @@ -2313,9 +2211,6 @@ static void build_type3(int by0, int bx0) /* Let's guard the treasure well */ vault_monsters(yval, xval, rand_int(2) + 3); - /* Traps naturally */ - vault_traps(yval, xval, 4, 4, rand_int(3) + 2); - break; } @@ -2341,13 +2236,13 @@ static void build_type3(int by0, int bx0) cave_set_feat(y2b + 1, x, feat_wall_inner); } - /* Sometimes shut using secret doors */ + /* Sometimes shut using locked doors */ if (rand_int(3) == 0) { - place_secret_door(yval, x1a - 1); - place_secret_door(yval, x2a + 1); - place_secret_door(y1b - 1, xval); - place_secret_door(y2b + 1, xval); + place_locked_door(yval, x1a - 1); + place_locked_door(yval, x2a + 1); + place_locked_door(y1b - 1, xval); + place_locked_door(y2b + 1, xval); } } @@ -2427,20 +2322,20 @@ static void build_type4(int by0, int bx0) /* Just an inner room with a monster */ case 1: { - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -2453,20 +2348,20 @@ static void build_type4(int by0, int bx0) /* Treasure Vault (with a door) */ case 2: { - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -2506,29 +2401,26 @@ static void build_type4(int by0, int bx0) place_random_stairs(yval, xval); } - /* Traps to protect the treasure */ - vault_traps(yval, xval, 4, 10, 2 + randint(3)); - break; } /* Inner pillar(s). */ case 3: { - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -2572,9 +2464,9 @@ static void build_type4(int by0, int bx0) cave_set_feat(yval, xval - 5, feat_wall_inner); cave_set_feat(yval, xval + 5, feat_wall_inner); - /* Secret doors (random top/bottom) */ - place_secret_door(yval - 3 + (randint(2) * 2), xval - 3); - place_secret_door(yval - 3 + (randint(2) * 2), xval + 3); + /* Locked doors (random top/bottom) */ + place_locked_door(yval - 3 + (randint(2) * 2), xval - 3); + place_locked_door(yval - 3 + (randint(2) * 2), xval + 3); /* Monsters */ vault_monsters(yval, xval - 2, randint(2)); @@ -2591,20 +2483,20 @@ static void build_type4(int by0, int bx0) /* Maze inside. */ case 4: { - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -2624,10 +2516,6 @@ static void build_type4(int by0, int bx0) vault_monsters(yval, xval - 5, randint(3)); vault_monsters(yval, xval + 5, randint(3)); - /* Traps make them entertaining. */ - vault_traps(yval, xval - 3, 2, 8, randint(3)); - vault_traps(yval, xval + 3, 2, 8, randint(3)); - /* Mazes should have some treasure too. */ vault_objects(yval, xval, 3); @@ -2652,18 +2540,18 @@ static void build_type4(int by0, int bx0) if (rand_int(100) < 50) { int i = randint(10); - place_secret_door(y1 - 1, xval - i); - place_secret_door(y1 - 1, xval + i); - place_secret_door(y2 + 1, xval - i); - place_secret_door(y2 + 1, xval + i); + place_locked_door(y1 - 1, xval - i); + place_locked_door(y1 - 1, xval + i); + place_locked_door(y2 + 1, xval - i); + place_locked_door(y2 + 1, xval + i); } else { int i = randint(3); - place_secret_door(yval + i, x1 - 1); - place_secret_door(yval - i, x1 - 1); - place_secret_door(yval + i, x2 + 1); - place_secret_door(yval - i, x2 + 1); + place_locked_door(yval + i, x1 - 1); + place_locked_door(yval - i, x1 - 1); + place_locked_door(yval + i, x2 + 1); + place_locked_door(yval - i, x2 + 1); } /* Treasure, centered at the center of the cross */ @@ -2994,20 +2882,20 @@ static void build_type5(int by0, int bx0) /* The inner walls */ build_rectangle(y1 - 1, x1 - 1, y2 + 1, x2 + 1, feat_wall_inner, CAVE_ROOM); - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -3233,20 +3121,20 @@ static void build_type6(int by0, int bx0) /* The inner walls */ build_rectangle(y1 - 1, x1 - 1, y2 + 1, x2 + 1, feat_wall_outer, CAVE_ROOM); - /* Place a secret door */ + /* Place a locked door */ switch (randint(4)) { case 1: - place_secret_door(y1 - 1, xval); + place_locked_door(y1 - 1, xval); break; case 2: - place_secret_door(y2 + 1, xval); + place_locked_door(y2 + 1, xval); break; case 3: - place_secret_door(yval, x1 - 1); + place_locked_door(yval, x1 - 1); break; case 4: - place_secret_door(yval, x2 + 1); + place_locked_door(yval, x2 + 1); break; } @@ -3592,22 +3480,22 @@ static void build_vault(int yval, int xval, int ymax, int xmax, std::string cons } else { - place_trap(y, x); + /* Do nothing */ } break; } - /* Secret doors */ + /* locked doors */ case '+': { - place_secret_door(y, x); + place_locked_door(y, x); break; } /* Trap */ case '^': { - place_trap(y, x); + /* Do nothing */ break; } @@ -4647,30 +4535,30 @@ static void build_small_room(int x0, int y0) { build_rectangle(y0 - 1, x0 - 1, y0 + 1, x0 + 1, feat_wall_inner, CAVE_ROOM); - /* Place a secret door on one side */ + /* Place a locked door on one side */ switch (rand_int(4)) { case 0: { - place_secret_door(y0, x0 - 1); + place_locked_door(y0, x0 - 1); break; } case 1: { - place_secret_door(y0, x0 + 1); + place_locked_door(y0, x0 + 1); break; } case 2: { - place_secret_door(y0 - 1, x0); + place_locked_door(y0 - 1, x0); break; } case 3: { - place_secret_door(y0 + 1, x0); + place_locked_door(y0 + 1, x0); break; } } @@ -4706,8 +4594,8 @@ static void add_door(int x, int y) (cave[y][x - 1].feat == feat_wall_outer) && (cave[y][x + 1].feat == feat_wall_outer)) { - /* secret door */ - place_secret_door(y, x); + /* locked door */ + place_locked_door(y, x); /* set boundarys so don't get wide doors */ place_filler(y, x - 1); @@ -4728,8 +4616,8 @@ static void add_door(int x, int y) (cave[y + 1][x].feat == feat_wall_outer) && get_is_floor(x - 1, y) && get_is_floor(x + 1, y)) { - /* secret door */ - place_secret_door(y, x); + /* locked door */ + place_locked_door(y, x); /* set boundarys so don't get wide doors */ place_filler(y - 1, x); @@ -4818,18 +4706,13 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty) { place_object(y, x, FALSE, FALSE, OBJ_FOUND_FLOOR); } - else - { - place_trap(y, x); - } } else if (value < 30) { - /* Monster and trap */ + /* Monster */ monster_level = dun_level + 5; place_monster(y, x, TRUE, TRUE); monster_level = dun_level; - place_trap(y, x); } else if (value < 40) { @@ -4849,8 +4732,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty) } else if (value < 50) { - /* Trap */ - place_trap(y, x); + /* Do nothing */ } else { @@ -4863,7 +4745,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty) } else if (rand_int(100) < 50) { - place_trap(y, x); + /* Do nothing */ } else if (rand_int(100) < 50) { @@ -6140,9 +6022,6 @@ static void build_type12(int by0, int bx0) /* Let's guard the treasure well */ vault_monsters(y0, x0, rand_int(2) + 3); - - /* Traps naturally */ - vault_traps(y0, x0, 4, 4, rand_int(3) + 2); } } @@ -6590,7 +6469,7 @@ static void try_doors(int y, int x) /* Clear OK flags XXX */ for (i = 0; i < 4; i++) dir_ok[i] = FALSE; - /* Put one or two secret doors */ + /* Put one or two locked doors */ dir_ok[rand_int(4)] = TRUE; dir_ok[rand_int(4)] = TRUE; } @@ -6608,7 +6487,7 @@ static void try_doors(int y, int x) } } - /* Place secret door(s) */ + /* Place locked door(s) */ for (i = 0; i < 4; i++) { /* Bad location */ @@ -6618,8 +6497,8 @@ static void try_doors(int y, int x) yy = y + ddy_ddd[i]; xx = x + ddx_ddd[i]; - /* Place a secret door */ - place_secret_door(yy, xx); + /* Place a locked door */ + place_locked_door(yy, xx); } } } @@ -7973,14 +7852,8 @@ static bool_ cave_gen(void) } } - /* Place traps and rubble */ - { - /* Place some traps in the dungeon */ - alloc_object(ALLOC_SET_BOTH, ALLOC_TYP_TRAP, randint(k * 2)); - - /* Put some rubble in corridors */ - alloc_object(ALLOC_SET_CORR, ALLOC_TYP_RUBBLE, randint(k)); - } + /* Put some rubble in corridors */ + alloc_object(ALLOC_SET_CORR, ALLOC_TYP_RUBBLE, randint(k)); /* Place objects and treasure */ { diff --git a/src/help.cc b/src/help.cc index e5014b45..7af521a9 100644 --- a/src/help.cc +++ b/src/help.cc @@ -24,7 +24,7 @@ #include "variable.hpp" #define DESC_MAX 14 -#define TRIGGERED_HELP_MAX 18 +#define TRIGGERED_HELP_MAX 17 #define HELP_VOID_JUMPGATE 0 #define HELP_FOUNTAIN 1 @@ -34,16 +34,15 @@ #define HELP_GET_RUNE 5 #define HELP_GET_ROD 6 #define HELP_GET_ROD_TIP 7 -#define HELP_GET_TRAP_KIT 8 -#define HELP_GET_DEVICE 9 -#define HELP_WILDERNESS 10 -#define HELP_GAME_TOME 11 -#define HELP_GAME_THEME 12 -#define HELP_1ST_LEVEL 13 -#define HELP_20TH_LEVEL 14 -#define HELP_ID_SPELL_ITM 15 -#define HELP_MELEE_SKILLS 16 -#define HELP_MON_ASK_HELP 17 +#define HELP_GET_DEVICE 8 +#define HELP_WILDERNESS 9 +#define HELP_GAME_TOME 10 +#define HELP_GAME_THEME 11 +#define HELP_1ST_LEVEL 12 +#define HELP_20TH_LEVEL 13 +#define HELP_ID_SPELL_ITM 14 +#define HELP_MELEE_SKILLS 15 +#define HELP_MON_ASK_HELP 16 /** * Game started? @@ -200,7 +199,6 @@ context_help_type class_table[] = { "Priest(Varda)", "c_pr_varda.txt", 0 }, { "Sniper", "c_sniper.txt", 0 }, { "Stonewright", "c_stonewr.txt", 0 }, - { "Trapper", "c_trapper.txt", 0 }, { "Wainrider", "c_wainrid.txt", 0 }, { "War-mage", "c_warmage.txt", 0 }, /* End of list */ @@ -302,7 +300,6 @@ context_help_type ability_table[] = { "Ammo creation", "ability.txt", 7 }, { "Touch of death", "ability.txt", 8 }, { "Far reaching attack", "ability.txt", 10 }, - { "Trapping", "ability.txt", 11 }, { "Undead Form", "ability.txt", 12 }, { NULL, NULL, 0 }, }; @@ -352,11 +349,6 @@ static bool_ trigger_get_rod_tip(void *in, void *out) { return (g->o_ptr->tval == TV_ROD); } -static bool_ trigger_get_trap_kit(void *in, void *out) { - hook_get_in *g = (hook_get_in *) in; - return (g->o_ptr->tval == TV_TRAPKIT); -} - static bool_ trigger_get_magic_device(void *in, void *out) { hook_get_in *g = (hook_get_in *) in; return ((g->o_ptr->tval == TV_WAND) || @@ -479,16 +471,6 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] = NULL } }, - { HELP_GET_TRAP_KIT, - HOOK_GET, - trigger_get_trap_kit, - { "Ooooh, a trapping kit. If you have ability in the trapping skill,", - "you can lay this trap (via the 'm' key) to harm unsuspecting foes.", - "You'll generally need either some ammo or magic device depending", - "on the exact type of trap kit.", - NULL - } - }, { HELP_GET_DEVICE, HOOK_GET, trigger_get_magic_device, diff --git a/src/init1.cc b/src/init1.cc index 105aadda..6fd08ed2 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -40,8 +40,6 @@ #include "store_info_type.hpp" #include "tables.hpp" #include "town_type.hpp" -#include "trap_type.hpp" -#include "traps.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -169,46 +167,6 @@ static cptr r_info_blow_effect[] = }; -/* - * Trap flags - */ -static cptr t_info_flags[] = -{ - "CHEST", - "DOOR", - "FLOOR", - "XXX4", - "XXX5", - "XXX6", - "XXX7", - "XXX8", - "XXX9", - "XXX10", - "XXX11", - "XXX12", - "XXX13", - "XXX14", - "XXX15", - "XXX16", - "LEVEL1", - "LEVEL2", - "LEVEL3", - "LEVEL4", - "XXX21", - "XXX22", - "XXX23", - "XXX24", - "XXX25", - "XXX26", - "XXX27", - "XXX28", - "XXX29", - "XXX30", - "XXX31", - "XXX32" -}; - - /* * Helpers for looking up flags in the above arrays * and extracting "bitmasks" from them. @@ -1370,7 +1328,6 @@ errr init_player_info_txt(FILE *fp) return (1); } - /* Next... */ continue; } @@ -4814,177 +4771,8 @@ errr init_re_info_txt(FILE *fp) /* - * Grab one flag in an trap_type from a textual string - */ -static errr grab_one_trap_type_flag(trap_type *t_ptr, cptr what) -{ - if (lookup_flags(what, flag_tie(&t_ptr->flags, t_info_flags))) - { - return (0); - } - - /* Oops */ - msg_format("Unknown trap_type flag '%s'.", what); - - /* Error */ - return (1); -} - - -/* - * Initialize the "tr_info" array, by parsing an ascii "template" file + * Grab one flag for a dungeon type from a textual string */ -errr init_t_info_txt(FILE *fp) -{ - auto &t_info = game->edit_data.t_info; - - int i; - char buf[1024]; - char *s, *t; - - /* Current entry */ - trap_type *t_ptr = NULL; - - /* Just before the first record */ - error_idx = -1; - - /* Just before the first line */ - error_line = -1; - - /* Parse */ - while (0 == my_fgets(fp, buf, 1024)) - { - /* Advance the line number */ - error_line++; - - /* Skip comments and blank lines */ - if (!buf[0] || (buf[0] == '#')) continue; - - /* Verify correct "colon" format */ - if (buf[1] != ':') return (1); - - /* Process 'N' for "New/Number/Name" */ - if (buf[0] == 'N') - { - /* Find the colon before the name */ - s = strchr(buf + 2, ':'); - - /* Verify that colon */ - if (!s) return (1); - - /* Nuke the colon, advance to the name */ - *s++ = '\0'; - - /* Paranoia -- require a name */ - if (!*s) return (1); - - /* Get the index */ - i = atoi(buf + 2); - - /* Verify information */ - if (i <= error_idx) return (4); - - /* Save the index */ - error_idx = i; - - /* Point at the "info" */ - t_ptr = &expand_to_fit_index(t_info, i); - - /* Copy name */ - t_ptr->name = my_strdup(s); - - /* Initialize */ - t_ptr->text = my_strdup(""); - - /* Next... */ - continue; - } - - /* There better be a current t_ptr */ - if (!t_ptr) return (3); - - - /* Process 'I' for "Information" */ - if (buf[0] == 'I') - { - int probability, another, p1valinc, difficulty; - int minlevel; - int dd, ds; - char color; - - /* Scan for the values */ - if (8 != sscanf(buf + 2, "%d:%d:%d:%d:%d:%dd%d:%c", - &difficulty, &probability, &another, - &p1valinc, &minlevel, &dd, &ds, - &color)) return (1); - - t_ptr->difficulty = (byte)difficulty; - t_ptr->probability = (s16b)probability; - t_ptr->another = (s16b)another; - t_ptr->p1valinc = (s16b)p1valinc; - t_ptr->minlevel = (byte)minlevel; - t_ptr->dd = (s16b)dd; - t_ptr->ds = (s16b)ds; - t_ptr->color = color_char_to_attr(color); - - /* Next... */ - continue; - } - - - /* Process 'D' for "Description" */ - if (buf[0] == 'D') - { - /* Acquire the text */ - s = buf + 2; - - /* Append chars to the name */ - strappend(&t_ptr->text, s); - - /* Next... */ - continue; - } - - - /* Hack -- Process 'F' for flags */ - if (buf[0] == 'F') - { - - t_ptr->flags = 0; - - /* Parse every entry textually */ - for (s = buf + 2; *s; ) - { - /* Find the end of this entry */ - for (t = s; *t && (*t != ' ') && (*t != '|'); ++t) /* loop */; - - /* Nuke and skip any dividers */ - if (*t) - { - *t++ = '\0'; - while (*t == ' ' || *t == '|') t++; - } - - /* Parse this entry */ - if (0 != grab_one_trap_type_flag(t_ptr, s)) return (5); - - /* Start the next entry */ - s = t; - } - - /* Next... */ - continue; - } - - - /* Oops */ - return (6); - } - - /* Success */ - return (0); -} - errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str) { #define DF(tier, index, name) \ @@ -6490,7 +6278,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst } else { - place_trap(y, x); + /* No traps - do nothing */ } object_level = level; @@ -6525,10 +6313,9 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst place_object(y, x, TRUE, TRUE, OBJ_FOUND_SPECIAL); } } - /* Random trap */ else if (random & RANDOM_TRAP) { - place_trap(y, x); + /* Do nothing */ } else if (object_index) { diff --git a/src/init2.cc b/src/init2.cc index bb909328..1b83851e 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -45,7 +45,6 @@ #include "store_info_type.hpp" #include "store_type.hpp" #include "tables.hpp" -#include "trap_type.hpp" #include "tome/make_array.hpp" #include "town_type.hpp" #include "util.hpp" @@ -436,17 +435,6 @@ namespace { }; - struct tr_info_traits { - - static constexpr char const *name = "tr_info.txt"; - - static errr parse(FILE *fp) - { - return init_t_info_txt(fp); - } - - }; - struct v_info_traits { static constexpr char const *name = "v_info.txt"; @@ -1254,10 +1242,6 @@ void init_angband(void) note("[Initialising arrays... (towns)]"); if (init_towns()) quit("Cannot initialise towns"); - /* Initialise trap info */ - note("[Initialising arrays... (traps)]"); - if (init_x_info()) quit("Cannot initialise traps"); - /* Initialise some other arrays */ note("[Initialising arrays... (other)]"); if (init_other()) quit("Cannot initialise other stuff"); diff --git a/src/loadsave.cc b/src/loadsave.cc index f412cc52..e91e8993 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -30,7 +30,6 @@ #include "tables.hpp" #include "timer_type.hpp" #include "town_type.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "wilderness_map.hpp" @@ -851,7 +850,6 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->confusing, flag); do_bool(&p_ptr->black_breath, flag); do_bool(&fate_flag, flag); - do_byte(&p_ptr->searching, flag); do_bool(&ambush_flag, flag); do_byte(&p_ptr->allow_one_death, flag); @@ -1039,7 +1037,6 @@ static bool_ wearable_p(object_type *o_ptr) case TV_HYPNOS: case TV_INSTRUMENT: case TV_DAEMON_BOOK: - case TV_TRAPKIT: case TV_TOOL: { return (TRUE); @@ -1246,7 +1243,6 @@ static void do_cave_type(cave_type *c_ptr, ls_flag_t flag) do_byte(&c_ptr->mimic, flag); do_s16b(&c_ptr->special, flag); do_s16b(&c_ptr->special2, flag); - do_s16b(&c_ptr->t_idx, flag); do_s16b(&c_ptr->inscription, flag); do_byte(&c_ptr->mana, flag); do_s16b(&c_ptr->effect, flag); @@ -2380,28 +2376,6 @@ static bool do_fates(ls_flag_t flag) return true; } -static bool do_traps(ls_flag_t flag) -{ - auto &t_info = game->edit_data.t_info; - - u16b n_traps = t_info.size(); - - do_u16b(&n_traps, flag); - - if ((flag == ls_flag_t::LOAD) && (n_traps > t_info.size())) - { - note("Too many traps!"); - return false; - } - - for (std::size_t i = 0; i < n_traps; i++) - { - do_bool(&t_info[i].ident, flag); - } - - return true; -} - static bool do_floor_inscriptions(ls_flag_t flag) { u16b n_inscriptions = MAX_INSCRIPTIONS; @@ -2553,11 +2527,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } - if (!do_traps(flag)) - { - return FALSE; - } - if (!do_floor_inscriptions(flag)) { return FALSE; diff --git a/src/melee2.cc b/src/melee2.cc index 415fd478..df9ee6d3 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -44,7 +44,6 @@ #include "spells2.hpp" #include "stats.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "variable.hpp" #include "xtra2.hpp" @@ -2126,12 +2125,6 @@ static bool_ monst_spell_monst(int m_idx) break; } - case SF_TRAPS_IDX: - { - /* Not implemented */ - break; - } - case SF_FORGET_IDX: { /* Not implemented */ @@ -3628,15 +3621,6 @@ static bool_ make_attack_spell(int m_idx) break; } - case SF_TRAPS_IDX: - { - disturb(1); - if (blind) msg_format("%^s mumbles, and then cackles evilly.", m_name); - else msg_format("%^s casts a spell and cackles evilly.", m_name); - (void)trap_creation(); - break; - } - case SF_FORGET_IDX: { disturb(1); @@ -5683,13 +5667,6 @@ static void process_monster(int m_idx, bool_ is_frien) do_move = TRUE; } - /* Floor is trapped? */ - else if (c_ptr->feat == FEAT_MON_TRAP) - { - /* Go ahead and move */ - do_move = TRUE; - } - /* Hack -- check for Glyph of Warding */ if ((c_ptr->feat == FEAT_GLYPH) && !(r_ptr->flags & RF_NEVER_BLOW)) @@ -6158,12 +6135,7 @@ static void process_monster(int m_idx, bool_ is_frien) disturb(0); } - /* Check for monster trap */ - if (c_ptr->feat == FEAT_MON_TRAP) - { - if (mon_hit_trap(m_idx)) return; - } - else + { /* Copy list of objects; we need a copy because we're mutating the list. */ auto const object_idxs(c_ptr->o_idxs); diff --git a/src/monster1.cc b/src/monster1.cc index 5ad3c696..244fbf94 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -478,7 +478,6 @@ static void roff_aux(std::shared_ptr r_ptr) if (spells & SF_TELE_LEVEL) vp[vn++] = "teleport level"; if (spells & SF_S_THUNDERLORD) vp[vn++] = "summon a Thunderlord"; if (spells & SF_DARKNESS) vp[vn++] = "create darkness"; - if (spells & SF_TRAPS) vp[vn++] = "create traps"; if (spells & SF_FORGET) vp[vn++] = "cause amnesia"; if (spells & SF_RAISE_DEAD) vp[vn++] = "raise dead"; if (spells & SF_S_MONSTER) vp[vn++] = "summon a monster"; diff --git a/src/monster_spell_flag_list.hpp b/src/monster_spell_flag_list.hpp index 4a201db5..42d8a5e9 100644 --- a/src/monster_spell_flag_list.hpp +++ b/src/monster_spell_flag_list.hpp @@ -78,7 +78,6 @@ SF(3, 6, TELE_TO , false, true , false, false, false, false, false, false, SF(3, 7, TELE_AWAY , false, false, false, false, true , false, true , false, false, false) SF(3, 8, TELE_LEVEL , false, false, false, false, true , false, true , false, false, false) SF(3, 9, DARKNESS , false, true , false, false, false, false, false, false, false, false) -SF(3, 10, TRAPS , false, true , false, false, true , false, false, false, false, false) SF(3, 11, FORGET , false, true , false, false, false, false, false, false, false, false) SF(3, 12, RAISE_DEAD , false, false, false, false, false, false, false, false, false, false) SF(3, 13, S_BUG , true , false, false, false, true , false, false, false, false, false) diff --git a/src/object1.cc b/src/object1.cc index d04c7ab2..e81c5742 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -47,7 +47,6 @@ #include "stats.hpp" #include "store_info_type.hpp" #include "tables.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -636,7 +635,6 @@ void reset_visuals(void) auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; - auto &t_info = game->edit_data.t_info; /* Extract some info about terrain features */ for (auto &f_ref: f_info) @@ -685,15 +683,6 @@ void reset_visuals(void) rmp.g_char = 0; } - /* Reset attr/char code for trap overlay graphics */ - for (auto &t_ref: t_info) - { - /* Default attr/char */ - t_ref.g_attr = 0; - t_ref.g_char = 0; - } - - /* Normal symbols */ process_pref_file("font.prf"); } @@ -1033,7 +1022,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; auto const &e_info = game->edit_data.e_info; - auto const &t_info = game->edit_data.t_info; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -1097,14 +1085,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) break; } - /* Trapping Kits */ - case TV_TRAPKIT: - { - modstr = basenm; - basenm = "& # Trap Set~"; - break; - } - /* Armour */ case TV_BOOTS: case TV_GLOVES: @@ -1769,23 +1749,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) { t += " (empty)"; } - - /* May be "disarmed" */ - else if (o_ptr->pval < 0) - { - t += " (disarmed)"; - } - - /* Describe the traps, if any */ - else - { - /* Describe the traps */ - auto trap_name = (t_info[o_ptr->pval].ident) - ? t_info[o_ptr->pval].name - : "trapped"; - - t += fmt::format(" ({})", trap_name); - } } @@ -2704,7 +2667,6 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (flags & TR_DEX) vp[vn++] = "dexterity"; if (flags & TR_CON) vp[vn++] = "constitution"; if (flags & TR_CHR) vp[vn++] = "charisma"; - if ((o_ptr->tval != TV_TRAPKIT) && (flags & TR_STEALTH)) vp[vn++] = "stealth"; if (flags & TR_SEARCH) vp[vn++] = "searching"; if (flags & TR_INFRA) vp[vn++] = "infravision"; if (flags & TR_TUNNEL) vp[vn++] = "ability to tunnel"; @@ -2781,11 +2743,6 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } - if ((o_ptr->tval == TV_TRAPKIT) && (flags & TR_STEALTH)) - { - text_out("It is well-hidden. "); - } - vn = 0; if (flags & TR_BRAND_ACID) { @@ -2919,7 +2876,6 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out("It makes you invisible. "); } - if (o_ptr->tval != TV_TRAPKIT) { vn = 0; if (flags & TR_SUST_STR) @@ -3016,45 +2972,6 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out(". "); } } - else - { - if (flags & TR_AUTOMATIC_5) - { - text_out("It can rearm itself. "); - } - if (flags & TR_AUTOMATIC_99) - { - text_out("It rearms itself. "); - } - if (flags & TR_KILL_GHOST) - { - text_out("It is effective against Ghosts. "); - } - if (flags & TR_TELEPORT_TO) - { - text_out("It can teleport monsters to you. "); - } - if (flags & TR_ONLY_DRAGON) - { - text_out("It can only be set off by dragons. "); - } - if (flags & TR_ONLY_DEMON) - { - text_out("It can only be set off by demons. "); - } - if (flags & TR_ONLY_UNDEAD) - { - text_out("It can only be set off by undead. "); - } - if (flags & TR_ONLY_ANIMAL) - { - text_out("It can only be set off by animals. "); - } - if (flags & TR_ONLY_EVIL) - { - text_out("It can only be set off by evil creatures. "); - } - } if (flags & TR_FREE_ACT) { @@ -5861,12 +5778,6 @@ void py_pickup_floor(int pickup) /* Get the tile */ auto c_ptr = &cave[p_ptr->py][p_ptr->px]; - /* Hack -- ignore monster traps */ - if (c_ptr->feat == FEAT_MON_TRAP) - { - return; - } - /* Try to grab ammo */ pickup_ammo(); diff --git a/src/object2.cc b/src/object2.cc index 7c2bd7db..6a584ffc 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -40,7 +40,6 @@ #include "spells3.hpp" #include "spells5.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "variable.hpp" #include "wilderness_map.hpp" @@ -1185,7 +1184,6 @@ s32b object_value_real(object_type const *o_ptr) case TV_AMULET: case TV_RING: case TV_MSTAFF: - case TV_TRAPKIT: case TV_INSTRUMENT: { /* No pval */ @@ -1345,7 +1343,6 @@ s32b object_value_real(object_type const *o_ptr) case TV_DAEMON_BOOK: case TV_AXE: case TV_POLEARM: - case TV_TRAPKIT: { /* Hack -- negative hit/damage bonuses */ if (o_ptr->to_h + o_ptr->to_d < 0 && !value) return (0L); @@ -1660,7 +1657,6 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) case TV_SOFT_ARMOR: case TV_HARD_ARMOR: case TV_DRAG_ARMOR: - case TV_TRAPKIT: case TV_DAEMON_BOOK: { /* Fall through */ @@ -2516,7 +2512,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) if (power > 1) { /* Make ego item */ - if ((rand_int(RANDART_WEAPON) == 1) && (o_ptr->tval != TV_TRAPKIT)) create_artifact(o_ptr, FALSE, TRUE); + if (rand_int(RANDART_WEAPON) == 1) create_artifact(o_ptr, FALSE, TRUE); else make_ego_item(o_ptr, TRUE); } else if (power < -1) @@ -2563,22 +2559,6 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) /* Some special cases */ switch (o_ptr->tval) { - case TV_TRAPKIT: - { - /* Good */ - if (power > 0) o_ptr->to_a += randint(5); - - /* Very good */ - if (power > 1) o_ptr->to_a += randint(5); - - /* Bad */ - if (power < 0) o_ptr->to_a -= randint(5); - - /* Very bad */ - if (power < -1) o_ptr->to_a -= randint(5); - - break; - } case TV_MSTAFF: { if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) @@ -3452,9 +3432,6 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) /* Hack -- skip ruined chests */ if (k_info[o_ptr->k_idx].level <= 0) break; - /* Pick a trap */ - place_trap_object(o_ptr); - /* Hack - set pval2 to the number of objects in it */ if (o_ptr->pval) o_ptr->pval2 = (o_ptr->sval % SV_CHEST_MIN_LARGE) * 2; @@ -3517,22 +3494,6 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power) } } -void trap_hack(object_type *o_ptr) -{ - if (o_ptr->tval != TV_TRAPKIT) return; - - switch (o_ptr->sval) - { - case SV_TRAPKIT_POTION: - case SV_TRAPKIT_SCROLL: - case SV_TRAPKIT_DEVICE: - o_ptr->to_h = 0; - o_ptr->to_d = 0; - default: - return; - } -} - /* Add a random glag to the ego item */ void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows) { @@ -4179,7 +4140,6 @@ void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ grea case TV_SHOT: case TV_ARROW: case TV_BOLT: - case TV_TRAPKIT: { if (power) a_m_aux_1(o_ptr, lev, power); break; @@ -4358,9 +4318,6 @@ try_an_other_ego: o_ptr->timeout = o_ptr->pval2; } - - /* Remove some unnecessary stuff hack */ - if (o_ptr->tval == TV_TRAPKIT) trap_hack(o_ptr); } } @@ -4573,9 +4530,6 @@ static bool kind_is_theme(obj_theme const *theme, int k_idx) case TV_INSTRUMENT: prob = theme->tools; break; - case TV_TRAPKIT: - prob = theme->tools; - break; } /* Roll to see if it can be made */ @@ -4667,7 +4621,6 @@ static bool_ kind_is_good(int k_idx) case TV_HAFTED: case TV_POLEARM: case TV_DIGGING: - case TV_TRAPKIT: case TV_MSTAFF: case TV_BOOMERANG: { @@ -5211,9 +5164,6 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) /* Require floor space (or shallow terrain) -KMW- */ if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) continue; - /* No traps */ - if (c_ptr->t_idx) continue; - /* No objects */ k = 0; @@ -5449,30 +5399,6 @@ void acquirement(int y1, int x1, int num, bool_ great, bool_ known) } - -/* - * Hack -- instantiate a trap - * - * XXX XXX XXX This routine should be redone to reflect trap "level". - * That is, it does not make sense to have spiked pits at 50 feet. - * Actually, it is not this routine, but the "trap instantiation" - * code, which should also check for "trap doors" on quest levels. - */ -void pick_trap(int y, int x) -{ - cave_type *c_ptr = &cave[y][x]; - - /* Paranoia */ - if ((c_ptr->t_idx == 0) || (c_ptr->info & CAVE_TRDT)) return; - - /* Activate the trap */ - c_ptr->info |= (CAVE_TRDT); - - /* Notice and redraw */ - note_spot(y, x); - lite_spot(y, x); -} - /* * Describe the charges on an item in the inventory. */ diff --git a/src/object2.hpp b/src/object2.hpp index 8a99753d..7c16be85 100644 --- a/src/object2.hpp +++ b/src/object2.hpp @@ -59,7 +59,6 @@ extern bool_ make_gold(object_type *j_ptr); extern void place_gold(int y, int x); extern s16b drop_near(object_type *o_ptr, int chance, int y, int x); extern void acquirement(int y1, int x1, int num, bool_ great, bool_ known); -extern void pick_trap(int y, int x); extern void combine_pack(void); extern void reorder_pack(void); extern void random_artifact_resistance (object_type * o_ptr); diff --git a/src/object_flag_list.hpp b/src/object_flag_list.hpp index 56cf1b88..05dbb3be 100644 --- a/src/object_flag_list.hpp +++ b/src/object_flag_list.hpp @@ -170,16 +170,6 @@ TR(5, 17, TR_RANDOM_RESIST , RANDOM_RESIST , nullptr , -1, -1, -1, TR(5, 18, TR_RANDOM_POWER , RANDOM_POWER , nullptr , -1, -1, -1, BINARY , 0, false, false) TR(5, 19, TR_RANDOM_RES_OR_POWER, RANDOM_RES_OR_POWER, nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 0, TR_AUTOMATIC_5 , AUTOMATIC_5 , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 1, TR_AUTOMATIC_99 , AUTOMATIC_99 , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 2, TR_KILL_GHOST , KILL_GHOST , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 3, TR_TELEPORT_TO , TELEPORT_TO , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 4, TR_ONLY_DRAGON , ONLY_DRAGON , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 5, TR_ONLY_DEMON , ONLY_DEMON , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 8, TR_ONLY_ANIMAL , ONLY_ANIMAL , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 9, TR_ONLY_UNDEAD , ONLY_UNDEAD , nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(6, 10, TR_ONLY_EVIL , ONLY_EVIL , nullptr , -1, -1, -1, BINARY , 0, false, false) - TR(7, 0, ESP_ORC , ESP_ORC , "Orc.ESP" , 3, 1, 0, BINARY , 0, false, true ) TR(7, 1, ESP_TROLL , ESP_TROLL , "Troll.ESP" , 3, 1, 1, BINARY , 0, false, true ) TR(7, 2, ESP_DRAGON , ESP_DRAGON , "Dragon.ESP", 3, 1, 2, BINARY , 0, false, true ) diff --git a/src/player_type.hpp b/src/player_type.hpp index 680c3df0..0015eaef 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -177,7 +177,6 @@ struct player_type s16b food = 0; /* Current nutrition */ byte confusing = 0; /* Glowing hands */ - byte searching = 0; /* Currently searching */ bool_ old_cumber_armor = FALSE; bool_ old_cumber_glove = FALSE; @@ -304,12 +303,9 @@ struct player_type s16b see_infra; /* Infravision range */ - s16b skill_dis = 0; /* Skill: Disarming */ s16b skill_dev = 0; /* Skill: Magic Devices */ s16b skill_sav = 0; /* Skill: Saving throw */ s16b skill_stl = 0; /* Skill: Stealth factor */ - s16b skill_srh = 0; /* Skill: Searching ability */ - s16b skill_fos = 0; /* Skill: Searching frequency */ s16b skill_thn = 0; /* Skill: To hit (normal) */ s16b skill_thb = 0; /* Skill: To hit (shooting) */ s16b skill_tht = 0; /* Skill: To hit (throwing) */ diff --git a/src/powers.cc b/src/powers.cc index b92d7731..5d26b7dd 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -34,7 +34,6 @@ #include "spells2.hpp" #include "stats.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -201,11 +200,6 @@ static void power_activate(int power) } } break; - case PWR_LAY_TRAP: - { - do_cmd_set_trap(); - } - break; case PWR_MAGIC_MAP: { msg_print("You sense the world around you."); @@ -334,7 +328,6 @@ static void power_activate(int power) case PWR_DETECT_TD: { msg_print("You examine your surroundings."); - (void)detect_traps(DEFAULT_RADIUS); (void)detect_doors(DEFAULT_RADIUS); (void)detect_stairs(DEFAULT_RADIUS); } diff --git a/src/powers.hpp b/src/powers.hpp index 35d317b0..fcb39ef3 100644 --- a/src/powers.hpp +++ b/src/powers.hpp @@ -64,7 +64,6 @@ extern void do_cmd_power(); #define PWR_UNHYPNO 53 #define PWR_INCARNATE 54 #define PWR_MAGIC_MAP 55 -#define PWR_LAY_TRAP 56 #define PWR_COMPANION 58 #define PWR_BEAR 59 #define PWR_DODGE 60 diff --git a/src/q_eol.cc b/src/q_eol.cc index 4392b001..24825da3 100644 --- a/src/q_eol.cc +++ b/src/q_eol.cc @@ -15,7 +15,6 @@ #include "object2.hpp" #include "player_type.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "variable.hpp" #include "z-rand.hpp" @@ -96,11 +95,6 @@ static bool_ quest_eol_gen_hook(void *, void *, void *) if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; } - if (magik(18)) - { - place_trap(y, x); - } - /* Place player at one end */ p_ptr->py = y; p_ptr->px = x; diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 03190889..693248e3 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -4,7 +4,6 @@ #include "dungeon_flag.hpp" #include "feature_flag.hpp" #include "feature_type.hpp" -#include "game.hpp" #include "hook_get_in.hpp" #include "hooks.hpp" #include "lua_bind.hpp" @@ -14,7 +13,6 @@ #include "object_type.hpp" #include "player_type.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "variable.hpp" #include "z-rand.hpp" @@ -471,8 +469,6 @@ std::string quest_fireproof_describe() static bool_ fireproof_gen_hook(void *, void *, void *) { - auto const &f_info = game->edit_data.f_info; - fireproof_settings const *settings = fireproof_get_settings(); /* Only if player doing this quest */ @@ -483,8 +479,6 @@ static bool_ fireproof_gen_hook(void *, void *, void *) /* Go ahead */ { - int traps, trap_y, trap_x; - /* load the map */ { int x0 = 2; @@ -515,46 +509,6 @@ static bool_ fireproof_gen_hook(void *, void *, void *) drop_near(&forge, -1, y, x); } - /* how many traps to generate */ - traps = rand_range(10, 30); - - /* generate the traps */ - while (traps > 0) - { - int tries = 0, trap_level = 0; - - /* make sure it's a safe place */ - while (tries == 0) - { - /* get grid coordinates */ - trap_y = randint(19) + 2; - trap_x = randint(45) + 2; - cave_type *c_ptr = &cave[trap_y][trap_x]; - - /* are the coordinates on a stair, or a wall? */ - if (bool(f_info[c_ptr->feat].flags & FF_PERMANENT) || - (f_info[c_ptr->feat].flags & FF_FLOOR).empty()) - { - /* try again */ - tries = 0; - } - else - { - /* not a stair, then stop this 'while' */ - tries = 1; - } - } - - /* randomise level of trap */ - trap_level = rand_range(20, 40); - - /* put the trap there */ - place_trap_leveled(trap_y, trap_x, trap_level); - - /* that's one less trap to place */ - traps = traps - 1; - } - return TRUE; } } diff --git a/src/q_god.cc b/src/q_god.cc index 79a25232..14052fe4 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -381,8 +381,7 @@ static void quest_god_generate_relic() /* are the coordinates on a floor, not on a permanent feature (eg stairs), and not on a trap ? */ if ((f_info[c_ptr->feat].flags & FF_FLOOR) && - (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) && - (c_ptr->t_idx == 0)) + (!(f_info[c_ptr->feat].flags & FF_PERMANENT))) { break; } diff --git a/src/q_haunted.cc b/src/q_haunted.cc index df90435c..f3725830 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -12,7 +12,6 @@ #include "monster2.hpp" #include "monster_type.hpp" #include "player_type.hpp" -#include "traps.hpp" #include "tables.hpp" #include "util.hpp" #include "variable.hpp" @@ -86,19 +85,6 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) } } - /* Place some random traps */ - for (i = 10 + damroll(4, 4); i > 0; ) - { - y = rand_int(21) + 3; - x = rand_int(31) + 3; - auto const flags = f_info[cave[y][x].feat].flags; - if (!(flags & FF_PERMANENT) && (flags & FF_FLOOR)) - { - --i; - place_trap(y, x); - } - } - process_hooks_restart = TRUE; return TRUE; diff --git a/src/q_library.cc b/src/q_library.cc index 96c93980..8d2e8a54 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -58,7 +58,6 @@ void initialize_bookable_spells() push_spell(RECHARGE); push_spell(DISPERSEMAGIC); push_spell(BLINK); - push_spell(DISARM); push_spell(TELEPORT); push_spell(SENSEMONSTERS); push_spell(SENSEHIDDEN); diff --git a/src/skills.cc b/src/skills.cc index 96d34e06..652f925e 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -33,7 +33,6 @@ #include "spells1.hpp" #include "spells4.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -1146,9 +1145,6 @@ void do_cmd_activate_skill() case MKEY_SYMBIOTIC: do_cmd_symbiotic(); break; - case MKEY_TRAP: - do_cmd_set_trap(); - break; case MKEY_STEAL: do_cmd_steal(); break; diff --git a/src/skills_defs.hpp b/src/skills_defs.hpp index a39fd027..b21ea0fb 100644 --- a/src/skills_defs.hpp +++ b/src/skills_defs.hpp @@ -37,9 +37,9 @@ #define SKILL_MIMICRY 32 #define SKILL_ANTIMAGIC 33 #define SKILL_RUNECRAFT 34 -#define SKILL_SNEAK 35 +/* XXX */ #define SKILL_STEALTH 36 -#define SKILL_DISARMING 37 +/* XXX */ #define SKILL_STEALING 40 #define SKILL_SORCERY 41 #define SKILL_HAND 42 diff --git a/src/spells1.cc b/src/spells1.cc index e2a66184..7f03703d 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -41,8 +41,6 @@ #include "squeltch.hpp" #include "stats.hpp" #include "tables.hpp" -#include "traps.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.hpp" @@ -622,8 +620,6 @@ void teleport_player(int dis) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); @@ -846,9 +842,6 @@ void teleport_player_to(int ny, int nx) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); @@ -3224,71 +3217,12 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) break; } - /* Destroy Traps (and Locks) */ - case GF_KILL_TRAP: - { - /* Destroy normal traps and disarm monster traps */ - if ((c_ptr->t_idx != 0) || (c_ptr->feat == FEAT_MON_TRAP)) - { - /* Check line of sight */ - if (player_has_los_bold(y, x)) - { - msg_print("There is a bright flash of light!"); - obvious = TRUE; - } - - /* Forget the trap */ - c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT); - - /* Destroy normal traps */ - c_ptr->t_idx = 0; - - /* Disarm monster traps */ - if (c_ptr->feat == FEAT_MON_TRAP) - { - c_ptr->special = c_ptr->special2 = 0; - - /* Remove the feature */ - if (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) - place_floor_convert_glass(y, x); - } - - /* Hack -- Force redraw */ - note_spot(y, x); - lite_spot(y, x); - } - - /* Secret / Locked doors are found and unlocked */ - else if ((c_ptr->feat == FEAT_SECRET) || - ((c_ptr->feat >= FEAT_DOOR_HEAD + 0x01) && - (c_ptr->feat <= FEAT_DOOR_HEAD + 0x07))) - { - - /* Check line of sound */ - if (player_has_los_bold(y, x)) - { - msg_print("Click!"); - obvious = TRUE; - } - - /* Remove feature mimic */ - cave[y][x].mimic = 0; - - /* Unlock the door */ - cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00); - } - - break; - } - - /* Destroy Doors (and traps) */ + /* Destroy Doors */ case GF_KILL_DOOR: { - /* Destroy all doors and traps, and disarm monster traps */ + /* Destroy all doors */ if ((c_ptr->feat == FEAT_OPEN) || (c_ptr->feat == FEAT_BROKEN) || - (c_ptr->t_idx != 0) || - (c_ptr->feat == FEAT_MON_TRAP) || ((c_ptr->feat >= FEAT_DOOR_HEAD) && (c_ptr->feat <= FEAT_DOOR_TAIL))) { @@ -3309,14 +3243,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) } /* Forget the door */ - c_ptr->info &= ~(CAVE_MARK | CAVE_TRDT); - - /* Remove normal traps */ - c_ptr->t_idx = 0; - - /* Disarm monster traps */ - if (c_ptr->feat == FEAT_MON_TRAP) - c_ptr->special = c_ptr->special2 = 0; + c_ptr->info &= ~(CAVE_MARK); /* Remove the feature */ if (!(f_info[c_ptr->feat].flags & FF_PERMANENT)) @@ -3502,19 +3429,6 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) break; } - /* Make traps */ - case GF_MAKE_TRAP: - { - /* Require a "naked" floor grid */ - if (!cave_clean_bold(y, x)) break; - - /* Place a trap */ - place_trap(y, x); - - break; - } - - case GF_MAKE_GLYPH: { /* Require a "naked" floor grid */ @@ -4030,7 +3944,6 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) } /* Unlock chests */ - case GF_KILL_TRAP: case GF_KILL_DOOR: { /* Chests are noticed only if trapped or locked */ @@ -6918,7 +6831,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; - auto const &t_info = game->edit_data.t_info; int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0; @@ -7004,9 +6916,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad /* If the player is blind, be more descriptive */ if (blind) fuzzy = TRUE; - /* If the player is hit by a trap, be more descritive */ - if (who == -2) fuzzy = TRUE; - /* Did ``God'' do it? */ if (who == -99) { @@ -7041,12 +6950,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad monster_desc(killer, m_ptr, 0x88); } - if (who == -2) - { - sprintf(killer, "%s", - t_info[cave[p_ptr->py][p_ptr->px].t_idx].name); - } - /* Analyze the damage */ switch (typ) { @@ -8875,18 +8778,12 @@ static void describe_attack_fully(int type, char* r) case GF_KILL_DOOR: strcpy(r, "door destruction"); break; - case GF_KILL_TRAP: - strcpy(r, "trap destruction"); - break; case GF_STONE_WALL: strcpy(r, "wall creation"); break; case GF_MAKE_DOOR: strcpy(r, "door creation"); break; - case GF_MAKE_TRAP: - strcpy(r, "trap creation"); - break; case GF_DESTRUCTION: strcpy(r, "destruction"); break; diff --git a/src/spells2.cc b/src/spells2.cc index 5c1215d0..ab872dc6 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -1108,8 +1108,6 @@ void self_knowledge(FILE *fff) info[i++] = "You can teleport level."; if (r_ptr->spells & SF_DARKNESS) info[i++] = "You can create darkness."; - if (r_ptr->spells & SF_TRAPS) - info[i++] = "You can create traps."; if (r_ptr->spells & SF_FORGET) info[i++] = "You can fade memories."; if (r_ptr->spells & SF_RAISE_DEAD) @@ -1276,10 +1274,6 @@ void self_knowledge(FILE *fff) { info[i++] = "Your hands are glowing dull red."; } - if (p_ptr->searching) - { - info[i++] = "You are looking around very carefully."; - } if (p_ptr->word_recall) { info[i++] = "You will soon be recalled."; @@ -2024,76 +2018,6 @@ bool_ lose_all_info(void) } - - -/* - * Detect all traps on current panel - */ -bool_ detect_traps(int rad) -{ - int x, y; - bool_ detect = FALSE; - cave_type *c_ptr; - - - /* Scan the current panel */ - for (y = p_ptr->py - rad; y <= p_ptr->py + rad; y++) - { - for (x = p_ptr->px - rad; x <= p_ptr->px + rad; x++) - { - /* Reject locations outside of dungeon */ - if (!in_bounds(y, x)) continue; - - /* Reject those out of radius */ - if (distance(p_ptr->py, p_ptr->px, y, x) > rad) continue; - - /* Access the grid */ - c_ptr = &cave[y][x]; - - /* mark as detected */ - c_ptr->info |= CAVE_DETECT; - - /* Detect invisible traps */ - if (c_ptr->t_idx != 0) - { - /* Hack -- Remember detected traps */ - c_ptr->info |= (CAVE_MARK); - - /* Pick a trap */ - pick_trap(y, x); - - /* Obvious */ - detect = TRUE; - } - } - } - - /* Describe */ - if (detect) - { - msg_print("You sense the presence of traps!"); - } - - /* - * This reveals un-identified trap detection items, - * but so does leaving/entering trap-detected areas... - * There are a couple of possible solutions: - * (1) Immediately self-id such items (i.e. always returns TRUE) - * (2) add another parameter to function which tells if unaware - * item is used for trap detection, and if it is the case, - * do two-pass scanning, first scanning for traps if an unaware - * item is used and return FALSE there are none, - * followed by current implementation --pelpel - */ - p_ptr->redraw |= (PR_FRAME); - - /* Result -- see my comment above -- pelpel */ - /* return (detect); */ - return (TRUE); -} - - - /* * Detect all doors on current panel */ @@ -2540,7 +2464,6 @@ bool_ detect_all(int rad) bool_ detect = FALSE; /* Detect everything */ - if (detect_traps(rad)) detect = TRUE; if (detect_doors(rad)) detect = TRUE; if (detect_stairs(rad)) detect = TRUE; if (detect_treasure(rad)) detect = TRUE; @@ -5191,9 +5114,6 @@ void teleport_swap(int dir) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); @@ -5242,9 +5162,6 @@ void swap_position(int lty, int ltx) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); @@ -5289,9 +5206,6 @@ void swap_position(int lty, int ltx) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); @@ -5397,14 +5311,6 @@ bool_ wizard_lock(int dir) return (project_hook(GF_JAM_DOOR, dir, 20 + randint(30), flg)); } - -bool_ disarm_trap(int dir) -{ - int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM; - return (project_hook(GF_KILL_TRAP, dir, 0, flg)); -} - - bool_ slow_monster(int dir) { int flg = PROJECT_STOP | PROJECT_KILL; @@ -5453,14 +5359,6 @@ bool_ teleport_monster(int dir) return (project_hook(GF_AWAY_ALL, dir, MAX_SIGHT * 5, flg)); } - -bool_ trap_creation(void) -{ - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; - return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_MAKE_TRAP, flg)); -} - - bool_ wall_stone(int y, int x) { auto const &f_info = game->edit_data.f_info; @@ -5496,12 +5394,6 @@ bool_ destroy_doors_touch(void) return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_DOOR, flg)); } -bool_ destroy_traps_touch(void) -{ - int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; - return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_TRAP, flg)); -} - bool_ sleep_monsters_touch(void) { int flg = PROJECT_KILL | PROJECT_HIDE; @@ -6085,9 +5977,6 @@ bool_ passwall(int dir, bool_ safe) /* Update the monsters */ p_ptr->update |= (PU_DISTANCE); - /* Redraw trap detection status */ - p_ptr->redraw |= (PR_FRAME); - /* Window stuff */ p_ptr->window |= (PW_OVERHEAD); diff --git a/src/spells3.cc b/src/spells3.cc index f64a22bf..95357ba0 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -44,7 +44,6 @@ s32b THUNDERSTORM; s32b STERILIZE; s32b BLINK; -s32b DISARM; s32b TELEPORT; s32b TELEAWAY; s32b RECALL; @@ -401,19 +400,6 @@ const char *convey_blink_info() return buf; } -casting_result convey_disarm() -{ - casting_result result = NO_CAST; - - result = cplus(result, destroy_doors_touch()); - if (get_level_s(DISARM, 50) >= 10) - { - result = cplus(result, destroy_traps_touch()); - } - - return result; -} - casting_result convey_teleport() { p_ptr->energy -= (25 - get_level_s(TELEPORT, 50)); @@ -960,12 +946,7 @@ casting_result divination_vision() casting_result divination_sense_hidden() { casting_result result = NO_CAST; - - result = cplus(result, detect_traps(15 + get_level(SENSEHIDDEN, 40))); - if (get_level_s(SENSEHIDDEN, 50) >= 15) - { - result = cplus(result, set_tim_invis(10 + randint(20) + get_level_s(SENSEHIDDEN, 40))); - } + result = cplus(result, set_tim_invis(10 + randint(20) + get_level_s(SENSEHIDDEN, 40))); return result; } diff --git a/src/spells4.cc b/src/spells4.cc index 199aea98..97c3d523 100644 --- a/src/spells4.cc +++ b/src/spells4.cc @@ -210,7 +210,6 @@ void init_school_books() push_spell(TOME_TRANSLOCATION, RECALL); push_spell(TOME_TRANSLOCATION, TELEAWAY); push_spell(TOME_TRANSLOCATION, TELEPORT); - push_spell(TOME_TRANSLOCATION, DISARM); push_spell(TOME_TRANSLOCATION, BLINK); /* Create the book of the tree */ diff --git a/src/spells5.cc b/src/spells5.cc index dc237382..ba2e6d05 100644 --- a/src/spells5.cc +++ b/src/spells5.cc @@ -918,30 +918,6 @@ void school_spells_init() convey_blink); } - { - spell_type *spell = spell_new(&DISARM, "Disarm"); - spell_type_describe(spell, "Destroys doors and traps"); - spell_type_describe(spell, "At level 10 it destroys doors and traps, then reveals and unlocks any secret"); - spell_type_describe(spell, "doors"); - spell_type_set_mana(spell, 2, 4); - spell_type_set_difficulty(spell, 3, 15); - spell_type_init_mage(spell, - RANDOM, - SCHOOL_CONVEYANCE, - no_info, - convey_disarm); - - spell_type_set_device_charges(spell, "10+d15"); - - { - device_allocation *device_allocation = device_allocation_new(TV_STAFF); - device_allocation->rarity = 4; - range_init(&device_allocation->base_level, 1, 10); - range_init(&device_allocation->max_level, 10, 50); - spell_type_add_device_allocation(spell, device_allocation); - } - } - { spell_type *spell = spell_new(&TELEPORT, "Teleportation"); spell_type_describe(spell, "Teleports you around the level. The casting time decreases with level"); diff --git a/src/store.cc b/src/store.cc index cdf87d13..8771fcd4 100644 --- a/src/store.cc +++ b/src/store.cc @@ -810,7 +810,6 @@ static bool store_will_buy(object_type const *o_ptr) { switch (o_ptr->tval) { - case TV_TRAPKIT: case TV_BOOMERANG: case TV_SHOT: case TV_BOLT: diff --git a/src/tables.cc b/src/tables.cc index 8853b938..0662da0f 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -3750,7 +3750,6 @@ monster_power monster_powers[] = { SF_TELE_AWAY_IDX, "Teleport Away", 20, FALSE }, { SF_TELE_LEVEL_IDX, "Teleport Level", 20, TRUE }, { SF_DARKNESS_IDX, "Darkness", 3, FALSE }, - { SF_TRAPS_IDX, "Create Traps", 10, TRUE }, { SF_RAISE_DEAD_IDX, "Raise the Dead", 400, TRUE }, { SF_S_THUNDERLORD_IDX, "Summon Thunderlords", 90, TRUE }, { SF_S_KIN_IDX, "Summon Kin", 80, FALSE }, @@ -3820,7 +3819,6 @@ tval_desc tvals[] = { TV_RUNE1, "Rune 1" }, { TV_RUNE2, "Rune 2" }, { TV_JUNK, "Junk" }, - { TV_TRAPKIT, "Trapping Kit" }, { 0, NULL } }; @@ -3923,11 +3921,6 @@ tval_desc tval_descs[] = "Rings are fine pieces of jewelry, usually imbued with " "arcane magics." }, - { - TV_TRAPKIT, - "Trapping kits are used with the trapping ability to set " - "deadly monster traps." - }, { TV_STAFF, "Staves are objects imbued with mystical powers." @@ -4158,10 +4151,8 @@ gf_name_type gf_names[] = { GF_GRAVITY, "gravity" }, { GF_KILL_WALL, "wall destruction" }, { GF_KILL_DOOR, "door destruction" }, - { GF_KILL_TRAP, "trap destruction" }, { GF_MAKE_WALL, "wall creation" }, { GF_MAKE_DOOR, "door creation" }, - { GF_MAKE_TRAP, "trap creation" }, { GF_OLD_CLONE, "clone" }, { GF_OLD_POLY, "polymorph" }, { GF_OLD_HEAL, "healing" }, diff --git a/src/trap_type.hpp b/src/trap_type.hpp deleted file mode 100644 index d82c925b..00000000 --- a/src/trap_type.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "h-basic.h" - -/** - * Trap descriptor. - */ -struct trap_type -{ - s16b probability; /* probability of existence */ - s16b another; /* does this trap easily combine */ - s16b p1valinc; /* how much does this trap attribute to p1val */ - byte difficulty; /* how difficult to disarm */ - byte minlevel; /* what is the minimum level on which the traps should be */ - byte color; /* what is the color on screen */ - u32b flags; /* where can these traps go - and perhaps other flags */ - bool_ ident; /* do we know the name */ - s16b known; /* how well is this trap known */ - const char *name; /* normal name like weakness */ - s16b dd, ds; /* base damage */ - char *text; /* longer description once you've met this trap */ - byte g_attr; /* Overlay graphic attribute */ - char g_char; /* Overlay graphic character */ -}; diff --git a/src/traps.cc b/src/traps.cc deleted file mode 100644 index a646d221..00000000 --- a/src/traps.cc +++ /dev/null @@ -1,3113 +0,0 @@ -/* the below copyright probably still applies, but it is heavily changed - * copied, adapted & re-engineered by JK. - * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke - * - * This software may be copied and distributed for educational, research, and - * not for profit purposes provided that this copyright and statement are - * included in all such copies. - */ - -#include "traps.hpp" - -#include "artifact_type.hpp" -#include "cave.hpp" -#include "cave_type.hpp" -#include "cmd1.hpp" -#include "cmd2.hpp" -#include "dungeon_flag.hpp" -#include "dungeon_info_type.hpp" -#include "feature_flag.hpp" -#include "feature_type.hpp" -#include "files.hpp" -#include "game.hpp" -#include "gods.hpp" -#include "monster2.hpp" -#include "monster_race.hpp" -#include "monster_race_flag.hpp" -#include "monster_type.hpp" -#include "object1.hpp" -#include "object2.hpp" -#include "object_flag.hpp" -#include "object_kind.hpp" -#include "player_race.hpp" -#include "player_race_mod.hpp" -#include "player_spec.hpp" -#include "player_type.hpp" -#include "spells1.hpp" -#include "spells2.hpp" -#include "stats.hpp" -#include "tables.hpp" -#include "trap_type.hpp" -#include "util.hpp" -#include "variable.hpp" -#include "xtra1.hpp" -#include "xtra2.hpp" -#include "z-rand.hpp" - -bool_ do_player_trap_call_out(void) -{ - s16b i, sn, cx, cy; - s16b h_index = 0; - s16b h_level = 0; - monster_type *m_ptr; - char m_name[80]; - bool_ ident = FALSE; - - for (i = 1; i < m_max; i++) - { - m_ptr = &m_list[i]; - - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; - - if (m_ptr->level >= h_level) - { - h_level = m_ptr->level; - h_index = i; - } - } - - /* if the level is empty of monsters, h_index will be 0 */ - if (!h_index) return (FALSE); - - m_ptr = &m_list[h_index]; - - sn = 0; - for (i = 0; i < 8; i++) - { - cx = p_ptr->px + ddx[i]; - cy = p_ptr->py + ddy[i]; - - /* Skip non-empty grids */ - if (!cave_valid_bold(cy, cx)) continue; - if (cave[cy][cx].feat == FEAT_GLYPH) continue; - if ((cx == p_ptr->px) && (cy == p_ptr->py)) continue; - sn++; - - /* Randomize choice */ - if (rand_int(sn) > 0) continue; - cave[cy][cx].m_idx = h_index; - cave[m_ptr->fy][m_ptr->fx].m_idx = 0; - m_ptr->fx = cx; - m_ptr->fy = cy; - - /* we do not change the sublevel! */ - ident = TRUE; - update_mon(h_index, TRUE); - monster_desc(m_name, m_ptr, 0x08); - msg_format("You hear a rapid-shifting wail, and %s appears!", m_name); - break; - } - - return (ident); -} - -static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x) -{ - auto const &f_info = game->edit_data.f_info; - - bool_ ident = FALSE; - char o_name[80]; - - s16b o_idx = 0; - object_type *o_ptr; - cave_type *c_ptr; - - s16b x1; - s16b y1; - - if (i_ptr == NULL) return (FALSE); - - if (i_ptr->name1 == ART_POWER) return (FALSE); - - while (o_idx == 0) - { - x1 = rand_int(cur_wid); - y1 = rand_int(cur_hgt); - - /* Obtain grid */ - c_ptr = &cave[y1][x1]; - - /* Require floor space (or shallow terrain) -KMW- */ - if (!(f_info[c_ptr->feat].flags & FF_FLOOR)) continue; - - o_idx = drop_near(i_ptr, 0, y1, x1); - } - - o_ptr = &o_list[o_idx]; - - x1 = o_ptr->ix; - y1 = o_ptr->iy; - - if (!p_ptr->blind) - { - note_spot(y, x); - lite_spot(y, x); - ident = TRUE; - object_desc(o_name, i_ptr, FALSE, 0); - if (player_has_los_bold(y1, x1)) - { - lite_spot(y1, x1); - msg_format("The %s suddenly stands elsewhere.", o_name); - - } - else - { - msg_format("You suddenly don't see the %s any more!", o_name); - } - } - else - { - msg_print("You hear something move."); - } - return (ident); -} - -/* - * this handles a trap that places walls around the player - */ -static bool_ player_handle_trap_of_walls(void) -{ - auto const &f_info = game->edit_data.f_info; - - bool_ ident; - - s16b dx, dy, cx, cy; - s16b sx = 0, sy = 0, sn, i; - cave_type *cv_ptr; - bool_ map[5][5] = - { - {FALSE, FALSE, FALSE, FALSE, FALSE}, - {FALSE, FALSE, FALSE, FALSE, FALSE}, - {FALSE, FALSE, FALSE, FALSE, FALSE}, - {FALSE, FALSE, FALSE, FALSE, FALSE}, - {FALSE, FALSE, FALSE, FALSE, FALSE} - }; - - for (dy = -2; dy <= 2; dy++) - for (dx = -2; dx <= 2; dx++) - { - /* Extract the location */ - cx = p_ptr->px + dx; - cy = p_ptr->py + dy; - - if (!in_bounds(cy, cx)) continue; - - cv_ptr = &cave[cy][cx]; - - if (cv_ptr->m_idx) continue; - - /* Lose room and vault */ - cv_ptr->info &= ~(CAVE_ROOM | CAVE_ICKY); - /* Lose light and knowledge */ - cv_ptr->info &= ~(CAVE_GLOW | CAVE_MARK); - - /* Skip the center */ - if (!dx && !dy) continue; - - /* test for dungeon level */ - if (randint(100) > 10 + max_dlv[dungeon_type]) continue; - - /* Damage this grid */ - map[2 + dx][2 + dy] = TRUE; - } - - for (dy = -2; dy <= 2; dy++) - for (dx = -2; dx <= 2; dx++) - { - /* Extract the location */ - cx = p_ptr->px + dx; - cy = p_ptr->py + dy; - - /* Skip unaffected grids */ - if (!map[2 + dx][2 + dy]) continue; - - cv_ptr = &cave[cy][cx]; - - if (cv_ptr->m_idx) - { - monster_type *m_ptr = &m_list[cv_ptr->m_idx]; - auto const r_ptr = m_ptr->race(); - - /* Most monsters cannot co-exist with rock */ - if ((!(r_ptr->flags & RF_KILL_WALL)) && - (!(r_ptr->flags & RF_PASS_WALL))) - { - char m_name[80]; - - /* Assume not safe */ - sn = 0; - - /* Monster can move to escape the wall */ - if (!(r_ptr->flags & RF_NEVER_MOVE)) - { - /* Look for safety */ - for (i = 0; i < 8; i++) - { - /* Access the grid */ - cy = p_ptr->py + ddy[i]; - cx = p_ptr->px + ddx[i]; - - /* Skip non-empty grids */ - if (!cave_clean_bold(cy, cx)) continue; - - /* Hack -- no safety on glyph of warding */ - if (cave[cy][cx].feat == FEAT_GLYPH) continue; - - /* Important -- Skip "quake" grids */ - if (map[2 + (cx - p_ptr->px)][2 + (cy - p_ptr->py)]) continue; - - /* Count "safe" grids */ - sn++; - - /* Randomize choice */ - if (rand_int(sn) > 0) continue; - - /* Save the safe grid */ - sx = cx; - sy = cy; - - ident = TRUE; - - break; /* discontinue for loop - safe grid found */ - } - } - - /* Describe the monster */ - monster_desc(m_name, m_ptr, 0); - - /* Scream in pain */ - msg_format("%^s wails out in pain!", m_name); - - /* Monster is certainly awake */ - m_ptr->csleep = 0; - - /* Apply damage directly */ - m_ptr->hp -= (sn ? damroll(4, 8) : 200); - - /* Delete (not kill) "dead" monsters */ - if (m_ptr->hp < 0) - { - /* Message */ - msg_format("%^s is entombed in the rock!", m_name); - - /* Delete the monster */ - delete_monster_idx(cave[cy][cx].m_idx); - - /* No longer safe */ - sn = 0; - } - - /* Hack -- Escape from the rock */ - if (sn) - { - s16b m_idx = cave[cy][cx].m_idx; - - /* Update the new location */ - cave[sy][sx].m_idx = m_idx; - - /* Update the old location */ - cave[cy][cx].m_idx = 0; - - /* Move the monster */ - m_ptr->fy = sy; - m_ptr->fx = sx; - - /* do not change fz */ - /* don't make rock on that square! */ - if ((sx >= (p_ptr->px - 2)) && (sx <= (p_ptr->px + 2)) && - (sy >= (p_ptr->py - 2)) && (sy <= (p_ptr->py + 2))) - { - map[2 + (sx - p_ptr->px)][2 + (sy - p_ptr->py)] = FALSE; - } - - /* Update the monster (new location) */ - update_mon(m_idx, TRUE); - - /* Redraw the old grid */ - lite_spot(cy, cx); - - /* Redraw the new grid */ - lite_spot(sy, sx); - } /* if sn */ - } /* if monster can co-exist with rock */ - } /* if monster on square */ - } - - /* Examine the quaked region */ - for (dy = -2; dy <= 2; dy++) - for (dx = -2; dx <= 2; dx++) - { - /* Extract the location */ - cx = p_ptr->px + dx; - cy = p_ptr->py + dy; - - /* Skip unaffected grids */ - if (!map[2 + dx][2 + dy]) continue; - - /* Access the cave grid */ - cv_ptr = &cave[cy][cx]; - - /* Paranoia -- never affect player */ - if (!dy && !dx) continue; - - /* Destroy location (if valid) */ - if ((cx < cur_wid) && (cy < cur_hgt) && cave_valid_bold(cy, cx)) - { - bool floor = bool(f_info[cave[cy][cx].feat].flags & FF_FLOOR); - - /* Delete any object that is still there */ - delete_object(cy, cx); - - if (floor) - { - cave_set_feat(cy, cx, FEAT_WALL_OUTER); - } - else - { - /* Clear previous contents, add floor */ - cave_set_feat(cy, cx, FEAT_FLOOR); - } - } - } - - /* Mega-Hack -- Forget the view and lite */ - p_ptr->update |= PU_UN_VIEW; - - /* Update stuff */ - p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE); - - /* Update the monsters */ - p_ptr->update |= (PU_DISTANCE); - - /* Update the health bar */ - p_ptr->redraw |= (PR_FRAME); - - /* Redraw map */ - p_ptr->redraw |= (PR_MAP); - - /* Window stuff */ - p_ptr->window |= (PW_OVERHEAD); - handle_stuff(); - - msg_print("Suddenly the cave shifts around you. The air is getting stale!"); - - ident = TRUE; - - return (ident); -} - - -/* - * this function handles arrow & dagger traps, in various types. - * num = number of missiles - * tval, sval = kind of missiles - * dd,ds = damage roll for missiles - * poison_dam = additional poison damage - * name = name given if you should die from it... - * - * return value = ident (always TRUE) - */ -static bool_ player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd, s16b ds, - s16b pdam, cptr name) -{ - object_type *o_ptr, forge; - s16b i, k_idx = lookup_kind(tval, sval); - char i_name[80]; - - o_ptr = &forge; - object_prep(o_ptr, k_idx); - o_ptr->number = num; - apply_magic(o_ptr, max_dlv[dungeon_type], FALSE, FALSE, FALSE); - object_desc(i_name, o_ptr, TRUE, 0); - - msg_format("Suddenly %s hit%s you!", i_name, - ((num == 1) ? "" : "s")); - - for (i = 0; i < num; i++) - { - take_hit(damroll(dd, ds), name); - - redraw_stuff(); - - if (pdam > 0) - { - if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) - { - (void)set_poisoned(p_ptr->poisoned + pdam); - } - } - } - - drop_near(o_ptr, -1, p_ptr->py, p_ptr->px); - - return TRUE; -} - -/* - * this function handles a "breath" type trap - acid bolt, lightning balls etc. - */ -static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap) -{ - auto const &t_info = game->edit_data.t_info; - - auto t_ptr = &t_info[trap]; - bool_ ident; - s16b my_dd, my_ds, dam; - - my_dd = t_ptr->dd; - my_ds = t_ptr->ds; - - /* these traps gets nastier as levels progress */ - if (max_dlv[dungeon_type] > (2 * t_ptr->minlevel)) - { - my_dd += (max_dlv[dungeon_type] / 15); - my_ds += (max_dlv[dungeon_type] / 15); - } - dam = damroll(my_dd, my_ds); - - ident = project( -2, rad, p_ptr->py, p_ptr->px, dam, type, PROJECT_KILL | PROJECT_JUMP); - - return (ident); -} - -/* - * this function activates one trap type, and returns - * a bool_ indicating if this trap is now identified - */ -bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item) -{ - auto const &a_info = game->edit_data.a_info; - - bool_ ident = FALSE; - s16b trap; - - s16b k, l; - - trap = cave[y][x].t_idx; - - if (i_ptr != NULL) - { - trap = i_ptr->pval; - } - - switch (trap) - { - /* stat traps */ - case TRAP_OF_WEAKNESS_I: - ident = do_dec_stat(A_STR, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_WEAKNESS_II: - ident = do_dec_stat(A_STR, STAT_DEC_NORMAL); - break; - case TRAP_OF_WEAKNESS_III: - ident = do_dec_stat(A_STR, STAT_DEC_PERMANENT); - break; - case TRAP_OF_INTELLIGENCE_I: - ident = do_dec_stat(A_INT, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_INTELLIGENCE_II: - ident = do_dec_stat(A_INT, STAT_DEC_NORMAL); - break; - case TRAP_OF_INTELLIGENCE_III: - ident = do_dec_stat(A_INT, STAT_DEC_PERMANENT); - break; - case TRAP_OF_WISDOM_I: - ident = do_dec_stat(A_WIS, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_WISDOM_II: - ident = do_dec_stat(A_WIS, STAT_DEC_NORMAL); - break; - case TRAP_OF_WISDOM_III: - ident = do_dec_stat(A_WIS, STAT_DEC_PERMANENT); - break; - case TRAP_OF_FUMBLING_I: - ident = do_dec_stat(A_DEX, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_FUMBLING_II: - ident = do_dec_stat(A_DEX, STAT_DEC_NORMAL); - break; - case TRAP_OF_FUMBLING_III: - ident = do_dec_stat(A_DEX, STAT_DEC_PERMANENT); - break; - case TRAP_OF_WASTING_I: - ident = do_dec_stat(A_CON, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_WASTING_II: - ident = do_dec_stat(A_CON, STAT_DEC_NORMAL); - break; - case TRAP_OF_WASTING_III: - ident = do_dec_stat(A_CON, STAT_DEC_PERMANENT); - break; - case TRAP_OF_BEAUTY_I: - ident = do_dec_stat(A_CHR, STAT_DEC_TEMPORARY); - break; - case TRAP_OF_BEAUTY_II: - ident = do_dec_stat(A_CHR, STAT_DEC_NORMAL); - break; - case TRAP_OF_BEAUTY_III: - ident = do_dec_stat(A_CHR, STAT_DEC_PERMANENT); - break; - - /* Trap of Curse Weapon */ - case TRAP_OF_CURSE_WEAPON: - { - ident = curse_weapon(); - break; - } - - /* Trap of Curse Armor */ - case TRAP_OF_CURSE_ARMOR: - { - ident = curse_armor(); - break; - } - - /* Earthquake Trap */ - case TRAP_OF_EARTHQUAKE: - { - msg_print("As you touch the trap, the ground starts to shake."); - earthquake(y, x, 10); - ident = TRUE; - break; - } - - /* Poison Needle Trap */ - case TRAP_OF_POISON_NEEDLE: - { - if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) - { - msg_print("You prick yourself on a poisoned needle."); - (void)set_poisoned(p_ptr->poisoned + rand_int(15) + 10); - ident = TRUE; - } - else - { - msg_print("You prick yourself on a needle."); - } - break; - } - - /* Summon Monster Trap */ - case TRAP_OF_SUMMON_MONSTER: - { - msg_print("A spell hangs in the air."); - for (k = 0; k < randint(3); k++) - { - ident |= summon_specific(y, x, max_dlv[dungeon_type], 0); - } - break; - } - - /* Summon Undead Trap */ - case TRAP_OF_SUMMON_UNDEAD: - { - msg_print("A mighty spell hangs in the air."); - for (k = 0; k < randint(3); k++) - { - ident |= summon_specific(y, x, max_dlv[dungeon_type], - SUMMON_UNDEAD); - } - break; - } - - /* Summon Greater Undead Trap */ - case TRAP_OF_SUMMON_GREATER_UNDEAD: - { - msg_print("An old and evil spell hangs in the air."); - for (k = 0; k < randint(3); k++) - { - ident |= summon_specific(y, x, max_dlv[dungeon_type], - SUMMON_HI_UNDEAD); - } - break; - } - - /* Teleport Trap */ - case TRAP_OF_TELEPORT: - { - msg_print("The world whirls around you."); - teleport_player(RATIO * 67); - ident = TRUE; - break; - } - - /* Paralyzing Trap */ - case TRAP_OF_PARALYZING: - { - if (!p_ptr->free_act) - { - msg_print("You touch a poisoned part and can't move."); - (void)set_paralyzed(rand_int(10) + 10); - ident = TRUE; - } - else - { - msg_print("You prick yourself on a needle."); - } - break; - } - - /* Explosive Device */ - case TRAP_OF_EXPLOSIVE_DEVICE: - { - msg_print("A hidden explosive device explodes in your face."); - take_hit(damroll(5, 8), "an explosion"); - ident = TRUE; - break; - } - - /* Teleport Away Trap */ - case TRAP_OF_TELEPORT_AWAY: - { - /* teleport away all items */ - while (!cave[y][x].o_idxs.empty()) - { - auto item = cave[y][x].o_idxs.front(); - - object_type *o_ptr = &o_list[item]; - - int amt = o_ptr->number; - - ident = do_trap_teleport_away(o_ptr, y, x); - - floor_item_increase(item, -amt); - floor_item_optimize(item); - } - break; - } - - /* Lose Memory Trap */ - case TRAP_OF_LOSE_MEMORY: - { - lose_exp(p_ptr->exp / 4); - - ident |= dec_stat(A_WIS, rand_int(20) + 10, STAT_DEC_NORMAL); - ident |= dec_stat(A_INT, rand_int(20) + 10, STAT_DEC_NORMAL); - - if (!p_ptr->resist_conf) - { - ident |= set_confused(p_ptr->confused + rand_int(100) + 50); - } - - if (ident) - { - msg_print("You suddenly don't remember what you were doing."); - } - else - { - msg_print("You feel an alien force probing your mind."); - } - break; - } - /* Bitter Regret Trap */ - case TRAP_OF_BITTER_REGRET: - { - msg_print("An age-old and hideous-sounding spell reverberates off the walls."); - - ident |= dec_stat(A_DEX, 25, TRUE); - ident |= dec_stat(A_WIS, 25, TRUE); - ident |= dec_stat(A_CON, 25, TRUE); - ident |= dec_stat(A_STR, 25, TRUE); - ident |= dec_stat(A_CHR, 25, TRUE); - ident |= dec_stat(A_INT, 25, TRUE); - break; - } - - /* Bowel Cramps Trap */ - case TRAP_OF_BOWEL_CRAMPS: - { - msg_print("A wretched-smelling gas cloud upsets your stomach."); - - (void)set_food(PY_FOOD_STARVE - 1); - (void)set_poisoned(0); - - if (!p_ptr->free_act) - { - (void)set_paralyzed(rand_int(dun_level) + 6); - } - ident = TRUE; - break; - } - - /* Blindness/Confusion Trap */ - case TRAP_OF_BLINDNESS_CONFUSION: - { - msg_print("A powerful magic protected this."); - - if (!p_ptr->resist_blind) - { - ident |= set_blind(p_ptr->blind + rand_int(100) + 100); - } - if (!p_ptr->resist_conf) - { - ident |= set_confused(p_ptr->confused + rand_int(20) + 15); - } - break; - } - - /* Aggravation Trap */ - case TRAP_OF_AGGRAVATION: - { - msg_print("You hear a hollow noise echoing through the dungeons."); - aggravate_monsters(1); - break; - } - - /* Multiplication Trap */ - case TRAP_OF_MULTIPLICATION: - { - msg_print("You hear a loud click."); - for (k = -1; k <= 1; k++) - for (l = -1; l <= 1; l++) - { - if ((in_bounds(p_ptr->py + l, p_ptr->px + k)) && - (!cave[p_ptr->py + l][p_ptr->px + k].t_idx)) - { - place_trap(p_ptr->py + l, p_ptr->px + k); - } - } - ident = TRUE; - break; - } - - /* Steal Item Trap */ - case TRAP_OF_STEAL_ITEM: - { - /* - * please note that magical stealing is not so - * easily circumvented - */ - if (!p_ptr->paralyzed && - (rand_int(160) < (adj_dex_safe[p_ptr->stat_ind[A_DEX]] + - p_ptr->lev))) - { - /* Saving throw message */ - msg_print("Your backpack seems to vibrate strangely!"); - break; - } - - /* Find an item */ - for (k = 0; k < rand_int(10); k++) - { - char i_name[80]; - object_type *j_ptr, *q_ptr, forge; - - /* Pick an item */ - s16b i = rand_int(INVEN_PACK); - - /* Obtain the item */ - j_ptr = &p_ptr->inventory[i]; - - /* Accept real items */ - if (!j_ptr->k_idx) continue; - - /* Don't steal artifacts -CFT */ - if (artifact_p(j_ptr)) continue; - - /* Get a description */ - object_desc(i_name, j_ptr, FALSE, 3); - - /* Message */ - msg_format("%sour %s (%c) was stolen!", - ((j_ptr->number > 1) ? "One of y" : "Y"), - i_name, index_to_label(i)); - - /* Create the item */ - q_ptr = &forge; - object_copy(q_ptr, j_ptr); - q_ptr->number = 1; - - /* Drop it somewhere */ - do_trap_teleport_away(q_ptr, y, x); - - inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE); - - ident = TRUE; - } - break; - } - - /* Summon Fast Quylthulgs Trap */ - case TRAP_OF_SUMMON_FAST_QUYLTHULGS: - { - for (k = 0; k < randint(3); k++) - { - ident |= summon_specific(y, x, max_dlv[dungeon_type], SUMMON_QUYLTHULG); - } - - if (ident) - { - msg_print("You suddenly have company."); - (void)set_slow(p_ptr->slow + randint(25) + 15); - } - break; - } - - /* Trap of Sinking */ - case TRAP_OF_SINKING: - { - msg_print("You fell through a trap door!"); - - if (p_ptr->ffall) - { - if (dungeon_flags & DF_TOWER) - { - msg_print("You float gently down to the previous level."); - } - else - { - msg_print("You float gently down to the next level."); - } - } - else - { - take_hit(damroll(2, 8), "a trap door"); - } - - /* Still alive and autosave enabled */ - if (p_ptr->chp >= 0) - { - autosave_checkpoint(); - } - - if (dungeon_flags & DF_TOWER) dun_level--; - else dun_level++; - - /* Leaving */ - p_ptr->leaving = TRUE; - break; - } - - /* Trap of Mana Drain */ - case TRAP_OF_MANA_DRAIN: - { - if (p_ptr->csp > 0) - { - p_ptr->csp = 0; - p_ptr->csp_frac = 0; - p_ptr->redraw |= (PR_FRAME); - msg_print("You sense a great loss."); - ident = TRUE; - } - else if (p_ptr->msp == 0) - { - /* no sense saying this unless you never have mana */ - msg_format("Suddenly you feel glad you're a mere %s", - spp_ptr->title); - } - else - { - msg_print("Your head feels dizzy for a moment."); - } - break; - } - /* Trap of Missing Money */ - case TRAP_OF_MISSING_MONEY: - { - s32b gold = (p_ptr->au / 10) + randint(25); - - if (gold < 2) gold = 2; - if (gold > 5000) gold = (p_ptr->au / 20) + randint(3000); - if (gold > p_ptr->au) gold = p_ptr->au; - - p_ptr->au -= gold; - if (gold <= 0) - { - msg_print("You feel something touching you."); - } - else if (p_ptr->au) - { - msg_print("Your purse feels lighter."); - msg_format("%ld coins were stolen!", (long)gold); - ident = TRUE; - } - else - { - msg_print("Your purse feels empty."); - msg_print("All of your coins were stolen!"); - ident = TRUE; - } - p_ptr->redraw |= (PR_FRAME); - break; - } - - /* Trap of No Return */ - case TRAP_OF_NO_RETURN: - { - object_type *j_ptr; - s16b j; - - for (j = 0; j < INVEN_WIELD; j++) - { - if (!p_ptr->inventory[j].k_idx) continue; - - j_ptr = &p_ptr->inventory[j]; - - if ((j_ptr->tval == TV_SCROLL) && - (j_ptr->sval == SV_SCROLL_WORD_OF_RECALL)) - { - inc_stack_size_ex(j, -j_ptr->number, OPTIMIZE, NO_DESCRIBE); - - combine_pack(); - reorder_pack(); - - if (!ident) - { - msg_print("A small fire works its way through your backpack. " - "Some scrolls are burnt."); - } - else - { - msg_print("The fire hasn't finished."); - } - ident = TRUE; - } - else if ((j_ptr->tval == TV_ROD_MAIN) && - (j_ptr->pval == SV_ROD_RECALL)) - { - j_ptr->timeout = 0; /* a long time */ - if (!ident) msg_print("You feel the air stabilise around you."); - ident = TRUE; - } - } - if ((!ident) && (p_ptr->word_recall)) - { - msg_print("You feel like staying around."); - p_ptr->word_recall = 0; - ident = TRUE; - } - break; - } - - /* Trap of Silent Switching */ - case TRAP_OF_SILENT_SWITCHING: - { - s16b i, j, slot1, slot2; - object_type *j_ptr, *k_ptr; - - for (i = INVEN_WIELD; i < INVEN_TOTAL; i++) - { - j_ptr = &p_ptr->inventory[i]; - - if (!j_ptr->k_idx) continue; - - /* Do not allow this trap to touch the One Ring */ - auto const j_flags = object_flags(j_ptr); - if(j_flags & TR_PERMA_CURSE) continue; - - slot1 = wield_slot(j_ptr); - - for (j = 0; j < INVEN_WIELD; j++) - { - k_ptr = &p_ptr->inventory[j]; - - if (!k_ptr->k_idx) continue; - - /* Do not allow this trap to touch the One Ring */ - auto const k_flags = object_flags(k_ptr); - if(k_flags & TR_PERMA_CURSE) continue; - - /* this is a crude hack, but it prevent wielding 6 torches... */ - if (k_ptr->number > 1) continue; - - slot2 = wield_slot(k_ptr); - - /* a chance of 4 in 5 of switching something, then 2 in 5 to do it again */ - if ((slot1 == slot2) && - (rand_int(100) < (80 - (ident * 40)))) - { - object_type tmp_obj; - - if (p_ptr->inventory[j].name1) - wield_set(p_ptr->inventory[j].name1, a_info[p_ptr->inventory[j].name1].set, FALSE); - if (p_ptr->inventory[i].name1) - takeoff_set(p_ptr->inventory[i].name1, a_info[p_ptr->inventory[i].name1].set); - - tmp_obj = p_ptr->inventory[j]; - p_ptr->inventory[j] = p_ptr->inventory[i]; - p_ptr->inventory[i] = tmp_obj; - ident = TRUE; - } - } - } - - if (ident) - { - p_ptr->update |= (PU_BONUS); - p_ptr->update |= (PU_TORCH); - p_ptr->update |= (PU_MANA); - msg_print("You somehow feel like another person."); - } - else - { - msg_print("You feel a lack of useful items."); - } - break; - } - - /* Trap of Walls */ - case TRAP_OF_WALLS: - { - ident = player_handle_trap_of_walls(); - break; - } - - /* Trap of Calling Out */ - case TRAP_OF_CALLING_OUT: - { - ident = do_player_trap_call_out(); - - if (!ident) - { - /* Increase "afraid" */ - if (p_ptr->resist_fear) - { - msg_print("You feel as if you had a nightmare!"); - } - else if (rand_int(100) < p_ptr->skill_sav) - { - msg_print("You remember having a nightmare!"); - } - else - { - if (set_afraid(p_ptr->afraid + 3 + randint(40))) - { - msg_print("You have a vision of a powerful enemy."); - } - } - } - break; - } - - /* Trap of Sliding */ - case TRAP_OF_SLIDING: - break; - - /* Trap of Charges Drain */ - case TRAP_OF_CHARGES_DRAIN: - { - /* Find an item */ - for (k = 0; k < 10; k++) - { - s16b i = rand_int(INVEN_PACK); - - object_type *j_ptr = &p_ptr->inventory[i]; - - /* Drain charged wands/staffs - Hack -- don't let artifacts get drained */ - if (((j_ptr->tval == TV_STAFF) || - (j_ptr->tval == TV_WAND)) && - (j_ptr->pval) && - !artifact_p(j_ptr)) - { - ident = TRUE; - j_ptr->pval = j_ptr->pval / (randint(4) + 1); - - /* 60% chance of only 1 */ - if (randint(10) > 3) break; - } - } - - if (ident) - { - /* Window stuff */ - p_ptr->window |= PW_INVEN; - /* Combine / Reorder the pack */ - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - msg_print("Your backpack seems to be turned upside down."); - } - else - { - msg_print("You hear a wail of great disappointment."); - } - break; - } - - /* Trap of Stair Movement */ - case TRAP_OF_STAIR_MOVEMENT: - { - s16b cx, cy, i, j; - s16b cnt = 0; - s16b cnt_seen = 0; - s16b tmps, tmpx; - s16b tmpspecial, tmpspecial2; - u32b tmpf; - bool_ seen = FALSE; - s16b index_x[20], index_y[20]; /* 20 stairs per level is enough? */ - cave_type *cv_ptr; - - if (max_dlv[dungeon_type] == 99) - { - /* no sense in relocating that stair! */ - msg_print("You have a feeling that this trap could be dangerous."); - break; - } - - for (cx = 0; cx < cur_wid; cx++) - for (cy = 0; cy < cur_hgt; cy++) - { - cv_ptr = &cave[cy][cx]; - - if ((cv_ptr->feat != FEAT_LESS) && - (cv_ptr->feat != FEAT_MORE) && - (cv_ptr->feat != FEAT_SHAFT_UP) && - (cv_ptr->feat != FEAT_SHAFT_DOWN)) continue; - - index_x[cnt] = cx; - index_y[cnt] = cy; - cnt++; - } - - if (cnt == 0) - { - if (wizard) msg_print("Executing moving stairs trap on level with no stairs!"); - break; - } - - for (i = 0; i < cnt; i++) - { - seen = FALSE; - - for (j = 0; j < 10; j++) /* try 10 times to relocate */ - { - cave_type *cv_ptr = &cave[index_y[i]][index_x[i]]; - cave_type *cv_ptr2; - - cx = rand_int(cur_wid); - cy = rand_int(cur_hgt); - - if ((cx == index_x[i]) || (cy == index_y[i])) continue; - - cv_ptr2 = &cave[cy][cx]; - - if (!cave_valid_bold(cy, cx) || (!cv_ptr2->o_idxs.empty())) continue; - - /* don't put anything in vaults */ - if (cv_ptr2->info & CAVE_ICKY) continue; - - tmpx = cv_ptr2->mimic; - tmps = cv_ptr2->info; - tmpf = cv_ptr2->feat; - tmpspecial = cv_ptr2->special; - tmpspecial2 = cv_ptr2->special2; - cave[cy][cx].mimic = cv_ptr->mimic; - cave[cy][cx].info = cv_ptr->info; - cave[cy][cx].special = cv_ptr->special; - cave[cy][cx].special2 = cv_ptr->special2; - cave_set_feat(cy, cx, cv_ptr->feat); - cv_ptr->mimic = tmpx; - cv_ptr->info = tmps; - cv_ptr->special = tmpspecial; - cv_ptr->special2 = tmpspecial2; - cave_set_feat(index_y[i], index_x[i], tmpf); - - /* if we are placing walls in rooms, make them rubble instead */ - if ((cv_ptr->info & CAVE_ROOM) && - (cv_ptr->feat >= FEAT_WALL_EXTRA) && - (cv_ptr->feat <= FEAT_PERM_SOLID)) - { - cave_set_feat(index_y[i], index_x[i], FEAT_RUBBLE); - } - - if (player_has_los_bold(cy, cx)) - { - note_spot(cy, cx); - lite_spot(cy, cx); - seen = TRUE; - } - else - { - cv_ptr2->info &= ~CAVE_MARK; - } - - if (player_has_los_bold(index_y[i], index_x[i])) - { - note_spot(index_y[i], index_x[i]); - lite_spot(index_y[i], index_x[i]); - seen = TRUE; - } - else - { - cv_ptr->info &= ~CAVE_MARK; - } - break; - } - - if (seen) cnt_seen++; - } - - ident = (cnt_seen > 0); - - if ((ident) && (cnt_seen > 1)) - { - msg_print("You see some stairs move."); - } - else if (ident) - { - msg_print("You see a stair move."); - } - else - { - msg_print("You hear distant scraping noises."); - } - p_ptr->redraw |= PR_MAP; - break; - } - - /* Trap of New Trap */ - case TRAP_OF_NEW: - { - /* if we're on a floor or on a door, place a new trap */ - if ((item == -1) || (item == -2)) - { - place_trap(y, x); - if (player_has_los_bold(y, x)) - { - note_spot(y, x); - lite_spot(y, x); - } - } - else - { - /* re-trap the chest */ - place_trap(y, x); - } - msg_print("You hear a noise, and then its echo."); - ident = FALSE; - break; - } - - /* Trap of Acquirement */ - case TRAP_OF_ACQUIREMENT: - { - /* Get a nice thing */ - msg_print("You notice something falling off the trap."); - acquirement(y, x, 1, TRUE, FALSE); - - /* If we're on a floor or on a door, place a new trap */ - if ((item == -1) || (item == -2)) - { - place_trap(y, x); - if (player_has_los_bold(y, x)) - { - note_spot(y, x); - lite_spot(y, x); - } - } - else - { - /* Re-trap the chest */ - place_trap(y, x); - } - msg_print("You hear a noise, and then its echo."); - - /* Never known */ - ident = FALSE; - } - break; - - /* Trap of Scatter Items */ - case TRAP_OF_SCATTER_ITEMS: - { - s16b i, j; - bool_ message = FALSE; - - for (i = 0; i < INVEN_PACK; i++) - { - - if (!p_ptr->inventory[i].k_idx) continue; - - if (rand_int(10) < 3) continue; - - for (j = 0; j < 10; j++) - { - object_type tmp_obj, *j_ptr = &tmp_obj; - s16b cx = x + 15 - rand_int(30); - s16b cy = y + 15 - rand_int(30); - - if (!in_bounds(cy, cx)) continue; - - if (!cave_floor_bold(cy, cx)) continue; - - object_copy(j_ptr, &p_ptr->inventory[i]); - - inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE); - - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - (void)floor_carry(cy, cx, j_ptr); - - if (!message) - { - msg_print("You feel light-footed."); - message = TRUE; - } - - if (player_has_los_bold(cy, cx)) - { - char i_name[80]; - - object_desc(i_name, &tmp_obj, TRUE, 3); - note_spot(cy, cx); - lite_spot(cy, cx); - ident = TRUE; - msg_format("Suddenly %s appear%s!", i_name, - (j_ptr->number > 1) ? "" : "s"); - } - break; - } - } - ident = message; - break; - } - - /* Trap of Decay */ - case TRAP_OF_DECAY: - break; - - /* Trap of Wasting Wands */ - case TRAP_OF_WASTING_WANDS: - { - s16b i; - object_type *j_ptr; - - for (i = 0; i < INVEN_PACK; i++) - { - if (!p_ptr->inventory[i].k_idx) continue; - - j_ptr = &p_ptr->inventory[i]; - - if ((j_ptr->tval == TV_WAND) && (rand_int(5) == 1)) - { - if (object_known_p(j_ptr)) ident = TRUE; - - /* Create a Wand of Nothing */ - object_prep(j_ptr, lookup_kind(TV_WAND, SV_WAND_NOTHING)); - apply_magic(j_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0)); - j_ptr->ident &= ~IDENT_KNOWN; - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - } - else if ((j_ptr->tval == TV_STAFF) && (rand_int(5) == 1)) - { - if (object_known_p(j_ptr)) ident = TRUE; - - /* Create a Staff of Nothing */ - object_prep(j_ptr, lookup_kind(TV_STAFF, SV_STAFF_NOTHING)); - apply_magic(j_ptr, 0, FALSE, FALSE, FALSE, boost::make_optional(0)); - j_ptr->ident &= ~IDENT_KNOWN; - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - } - } - if (ident) - { - msg_print("You have lost trust in your backpack!"); - } - else - { - msg_print("You hear an echoing cry of rage."); - } - break; - } - - /* Trap of Filling */ - case TRAP_OF_FILLING: - { - s16b nx, ny; - - for (nx = x - 8; nx <= x + 8; nx++) - for (ny = y - 8; ny <= y + 8; ny++) - { - if (!in_bounds (ny, nx)) continue; - - if (rand_int(distance(ny, nx, y, x)) > 3) - { - place_trap(ny, nx); - } - } - - msg_print("The floor vibrates in a strange way."); - ident = FALSE; - break; - } - - case TRAP_OF_DRAIN_SPEED: - { - s16b j, chance = 75; - - for (j = 0; j < INVEN_TOTAL; j++) - { - /* don't bother the overflow slot */ - if (j == INVEN_PACK) continue; - - if (!p_ptr->inventory[j].k_idx) continue; - - auto j_ptr = &p_ptr->inventory[j]; - auto const flags = object_flags(j_ptr); - - /* is it a non-artifact speed item? */ - if ((!j_ptr->name1) && (flags & TR_SPEED)) - { - if (randint(100) < chance) - { - j_ptr->pval = j_ptr->pval / 2; - if (j_ptr->pval == 0) - { - j_ptr->pval--; - } - chance /= 2; - ident = TRUE; - } - inven_item_optimize(j); - } - } - if (!ident) - { - msg_print("You feel some things in your pack vibrating."); - } - else - { - combine_pack(); - reorder_pack(); - msg_print("You suddenly feel you have time for self-reflection."); - - /* Recalculate bonuses */ - p_ptr->update |= (PU_BONUS); - - /* Recalculate mana */ - p_ptr->update |= (PU_MANA); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER); - } - break; - } - - /* - * single missile traps - */ - case TRAP_OF_ARROW_I: - ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_NORMAL, 4, 8, 0, "Arrow Trap"); - break; - case TRAP_OF_ARROW_II: - ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_NORMAL, 5, 8, 0, "Bolt Trap"); - break; - case TRAP_OF_ARROW_III: - ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_HEAVY, 6, 8, 0, "Seeker Arrow Trap"); - break; - case TRAP_OF_ARROW_IV: - ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_HEAVY, 8, 10, 0, "Seeker Bolt Trap"); - break; - case TRAP_OF_POISON_ARROW_I: - ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_NORMAL, 4, 8, 10 + randint(20), "Poison Arrow Trap"); - break; - case TRAP_OF_POISON_ARROW_II: - ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_NORMAL, 5, 8, 15 + randint(30), "Poison Bolt Trap"); - break; - case TRAP_OF_POISON_ARROW_III: - ident = player_handle_missile_trap(1, TV_ARROW, SV_AMMO_HEAVY, 6, 8, 30 + randint(50), "Poison Seeker Arrow Trap"); - break; - case TRAP_OF_POISON_ARROW_IV: - ident = player_handle_missile_trap(1, TV_BOLT, SV_AMMO_HEAVY, 8, 10, 40 + randint(70), "Poison Seeker Bolt Trap"); - break; - case TRAP_OF_DAGGER_I: - ident = player_handle_missile_trap(1, TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 0, "Dagger Trap"); - break; - case TRAP_OF_DAGGER_II: - ident = player_handle_missile_trap(1, TV_SWORD, SV_DAGGER, 3, 8, 0, "Dagger Trap"); - break; - case TRAP_OF_POISON_DAGGER_I: - ident = player_handle_missile_trap(1, TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 15 + randint(20), "Poison Dagger Trap"); - break; - case TRAP_OF_POISON_DAGGER_II: - ident = player_handle_missile_trap(1, TV_SWORD, SV_DAGGER, 3, 8, 20 + randint(30), "Poison Dagger Trap"); - break; - - /* - * multiple missile traps - * numbers range from 2 (level 0 to 14) to 10 (level 120 and up) - */ - case TRAP_OF_ARROWS_I: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_NORMAL, 4, 8, 0, "Arrow Trap"); - break; - case TRAP_OF_ARROWS_II: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_NORMAL, 5, 8, 0, "Bolt Trap"); - break; - case TRAP_OF_ARROWS_III: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_HEAVY, 6, 8, 0, "Seeker Arrow Trap"); - break; - case TRAP_OF_ARROWS_IV: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_HEAVY, 8, 10, 0, "Seeker Bolt Trap"); - break; - case TRAP_OF_POISON_ARROWS_I: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_NORMAL, 4, 8, 10 + randint(20), "Poison Arrow Trap"); - break; - case TRAP_OF_POISON_ARROWS_II: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_NORMAL, 5, 8, 15 + randint(30), "Poison Bolt Trap"); - break; - case TRAP_OF_POISON_ARROWS_III: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_ARROW, SV_AMMO_HEAVY, 6, 8, 30 + randint(50), "Poison Seeker Arrow Trap"); - break; - case TRAP_OF_POISON_ARROWS_IV: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_BOLT, SV_AMMO_HEAVY, 8, 10, 40 + randint(70), "Poison Seeker Bolt Trap"); - break; - case TRAP_OF_DAGGERS_I: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 0, "Dagger Trap"); - break; - case TRAP_OF_DAGGERS_II: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_DAGGER, 3, 8, 0, "Dagger Trap"); - break; - case TRAP_OF_POISON_DAGGERS_I: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_BROKEN_DAGGER, 2, 8, 15 + randint(20), "Poison Dagger Trap"); - break; - case TRAP_OF_POISON_DAGGERS_II: - ident = player_handle_missile_trap(2 + (max_dlv[dungeon_type] / 15), TV_SWORD, SV_DAGGER, 3, 8, 20 + randint(30), "Poison Dagger Trap"); - break; - - case TRAP_OF_DROP_ITEMS: - { - s16b i; - bool_ message = FALSE; - - for (i = 0; i < INVEN_PACK; i++) - { - object_type tmp_obj; - - if (!p_ptr->inventory[i].k_idx) continue; - if (randint(100) < 80) continue; - if (p_ptr->inventory[i].name1 == ART_POWER) continue; - - tmp_obj = p_ptr->inventory[i]; - - /* drop carefully */ - drop_near(&tmp_obj, 0, y, x); - - inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE); - - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - if (!message) - { - msg_print("You are startled by a sudden sound."); - message = TRUE; - } - ident = TRUE; - } - if (!ident) - { - msg_print("You hear a sudden, strange sound."); - } - break; - } - - case TRAP_OF_DROP_ALL_ITEMS: - { - s16b i; - bool_ message = FALSE; - - for (i = 0; i < INVEN_PACK; i++) - { - object_type tmp_obj; - - if (!p_ptr->inventory[i].k_idx) continue; - if (randint(100) < 10) continue; - if (p_ptr->inventory[i].name1 == ART_POWER) continue; - - tmp_obj = p_ptr->inventory[i]; - - /* drop carefully */ - drop_near(&tmp_obj, 0, y, x); - - inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE); - - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - if (!message) - { - msg_print("You are greatly startled by a sudden sound."); - message = TRUE; - } - ident = TRUE; - } - if (!ident) - { - msg_print("You hear a sudden, strange sound."); - } - break; - } - - case TRAP_OF_DROP_EVERYTHING: - { - s16b i; - bool_ message = FALSE; - - for (i = 0; i < INVEN_TOTAL; i++) - { - object_type tmp_obj; - if (!p_ptr->inventory[i].k_idx) continue; - if (randint(100) < 30) continue; - if (p_ptr->inventory[i].name1 == ART_POWER) continue; - - tmp_obj = p_ptr->inventory[i]; - /* drop carefully */ - - drop_near(&tmp_obj, 0, y, x); - - inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE); - - p_ptr->notice |= (PN_COMBINE | PN_REORDER); - - if (!message) - { - msg_print("You are completely startled by a sudden sound."); - message = TRUE; - } - ident = TRUE; - } - if (!ident) - { - msg_print("You hear a sudden, strange sound."); - } - break; - } - - /* Bolt Trap */ - case TRAP_G_ELEC_BOLT: - ident = player_handle_breath_trap(1, GF_ELEC, TRAP_G_ELEC_BOLT); - break; - case TRAP_G_POIS_BOLT: - ident = player_handle_breath_trap(1, GF_POIS, TRAP_G_POIS_BOLT); - break; - case TRAP_G_ACID_BOLT: - ident = player_handle_breath_trap(1, GF_ACID, TRAP_G_ACID_BOLT); - break; - case TRAP_G_COLD_BOLT: - ident = player_handle_breath_trap(1, GF_COLD, TRAP_G_COLD_BOLT); - break; - case TRAP_G_FIRE_BOLT: - ident = player_handle_breath_trap(1, GF_FIRE, TRAP_G_FIRE_BOLT); - break; - case TRAP_OF_ELEC_BOLT: - ident = player_handle_breath_trap(1, GF_ELEC, TRAP_OF_ELEC_BOLT); - break; - case TRAP_OF_POIS_BOLT: - ident = player_handle_breath_trap(1, GF_POIS, TRAP_OF_POIS_BOLT); - break; - case TRAP_OF_ACID_BOLT: - ident = player_handle_breath_trap(1, GF_ACID, TRAP_OF_ACID_BOLT); - break; - case TRAP_OF_COLD_BOLT: - ident = player_handle_breath_trap(1, GF_COLD, TRAP_OF_COLD_BOLT); - break; - case TRAP_OF_FIRE_BOLT: - ident = player_handle_breath_trap(1, GF_FIRE, TRAP_OF_FIRE_BOLT); - break; - case TRAP_OF_PLASMA_BOLT: - ident = player_handle_breath_trap(1, GF_PLASMA, TRAP_OF_PLASMA_BOLT); - break; - case TRAP_OF_WATER_BOLT: - ident = player_handle_breath_trap(1, GF_WATER, TRAP_OF_WATER_BOLT); - break; - case TRAP_OF_LITE_BOLT: - ident = player_handle_breath_trap(1, GF_LITE, TRAP_OF_LITE_BOLT); - break; - case TRAP_OF_DARK_BOLT: - ident = player_handle_breath_trap(1, GF_DARK, TRAP_OF_DARK_BOLT); - break; - case TRAP_OF_SHARDS_BOLT: - ident = player_handle_breath_trap(1, GF_SHARDS, TRAP_OF_SHARDS_BOLT); - break; - case TRAP_OF_SOUND_BOLT: - ident = player_handle_breath_trap(1, GF_SOUND, TRAP_OF_SOUND_BOLT); - break; - case TRAP_OF_CONFUSION_BOLT: - ident = player_handle_breath_trap(1, GF_CONFUSION, TRAP_OF_CONFUSION_BOLT); - break; - case TRAP_OF_FORCE_BOLT: - ident = player_handle_breath_trap(1, GF_FORCE, TRAP_OF_FORCE_BOLT); - break; - case TRAP_OF_INERTIA_BOLT: - ident = player_handle_breath_trap(1, GF_INERTIA, TRAP_OF_INERTIA_BOLT); - break; - case TRAP_OF_MANA_BOLT: - ident = player_handle_breath_trap(1, GF_MANA, TRAP_OF_MANA_BOLT); - break; - case TRAP_OF_ICE_BOLT: - ident = player_handle_breath_trap(1, GF_ICE, TRAP_OF_ICE_BOLT); - break; - case TRAP_OF_CHAOS_BOLT: - ident = player_handle_breath_trap(1, GF_CHAOS, TRAP_OF_CHAOS_BOLT); - break; - case TRAP_OF_NETHER_BOLT: - ident = player_handle_breath_trap(1, GF_NETHER, TRAP_OF_NETHER_BOLT); - break; - case TRAP_OF_DISENCHANT_BOLT: - ident = player_handle_breath_trap(1, GF_DISENCHANT, TRAP_OF_DISENCHANT_BOLT); - break; - case TRAP_OF_NEXUS_BOLT: - ident = player_handle_breath_trap(1, GF_NEXUS, TRAP_OF_NEXUS_BOLT); - break; - case TRAP_OF_TIME_BOLT: - ident = player_handle_breath_trap(1, GF_TIME, TRAP_OF_TIME_BOLT); - break; - case TRAP_OF_GRAVITY_BOLT: - ident = player_handle_breath_trap(1, GF_GRAVITY, TRAP_OF_GRAVITY_BOLT); - break; - - /* Ball Trap */ - case TRAP_OF_ELEC_BALL: - ident = player_handle_breath_trap(3, GF_ELEC, TRAP_OF_ELEC_BALL); - break; - case TRAP_OF_POIS_BALL: - ident = player_handle_breath_trap(3, GF_POIS, TRAP_OF_POIS_BALL); - break; - case TRAP_OF_ACID_BALL: - ident = player_handle_breath_trap(3, GF_ACID, TRAP_OF_ACID_BALL); - break; - case TRAP_OF_COLD_BALL: - ident = player_handle_breath_trap(3, GF_COLD, TRAP_OF_COLD_BALL); - break; - case TRAP_OF_FIRE_BALL: - ident = player_handle_breath_trap(3, GF_FIRE, TRAP_OF_FIRE_BALL); - break; - case TRAP_OF_PLASMA_BALL: - ident = player_handle_breath_trap(3, GF_PLASMA, TRAP_OF_PLASMA_BALL); - break; - case TRAP_OF_WATER_BALL: - ident = player_handle_breath_trap(3, GF_WATER, TRAP_OF_WATER_BALL); - break; - case TRAP_OF_LITE_BALL: - ident = player_handle_breath_trap(3, GF_LITE, TRAP_OF_LITE_BALL); - break; - case TRAP_OF_DARK_BALL: - ident = player_handle_breath_trap(3, GF_DARK, TRAP_OF_DARK_BALL); - break; - case TRAP_OF_SHARDS_BALL: - ident = player_handle_breath_trap(3, GF_SHARDS, TRAP_OF_SHARDS_BALL); - break; - case TRAP_OF_SOUND_BALL: - ident = player_handle_breath_trap(3, GF_SOUND, TRAP_OF_SOUND_BALL); - break; - case TRAP_OF_CONFUSION_BALL: - ident = player_handle_breath_trap(3, GF_CONFUSION, TRAP_OF_CONFUSION_BALL); - break; - case TRAP_OF_FORCE_BALL: - ident = player_handle_breath_trap(3, GF_FORCE, TRAP_OF_FORCE_BALL); - break; - case TRAP_OF_INERTIA_BALL: - ident = player_handle_breath_trap(3, GF_INERTIA, TRAP_OF_INERTIA_BALL); - break; - case TRAP_OF_MANA_BALL: - ident = player_handle_breath_trap(3, GF_MANA, TRAP_OF_MANA_BALL); - break; - case TRAP_OF_ICE_BALL: - ident = player_handle_breath_trap(3, GF_ICE, TRAP_OF_ICE_BALL); - break; - case TRAP_OF_CHAOS_BALL: - ident = player_handle_breath_trap(3, GF_CHAOS, TRAP_OF_CHAOS_BALL); - break; - case TRAP_OF_NETHER_BALL: - ident = player_handle_breath_trap(3, GF_NETHER, TRAP_OF_NETHER_BALL); - break; - case TRAP_OF_DISENCHANT_BALL: - ident = player_handle_breath_trap(3, GF_DISENCHANT, TRAP_OF_DISENCHANT_BALL); - break; - case TRAP_OF_NEXUS_BALL: - ident = player_handle_breath_trap(3, GF_NEXUS, TRAP_OF_NEXUS_BALL); - break; - case TRAP_OF_TIME_BALL: - ident = player_handle_breath_trap(3, GF_TIME, TRAP_OF_TIME_BALL); - break; - case TRAP_OF_GRAVITY_BALL: - ident = player_handle_breath_trap(3, GF_GRAVITY, TRAP_OF_GRAVITY_BALL); - break; - - /* Trap of Divine Anger */ - case TRAP_OF_DIVINE_ANGER: - { - if (p_ptr->pgod == 0) - { - msg_format("Suddenly you feel glad you're a mere %s", spp_ptr->title); - } - else - { - cptr name; - - name = deity_info[p_ptr->pgod].name; - msg_format("You feel you have angered %s.", name); - inc_piety(p_ptr->pgod, -3000); - } - break; - } - - /* Trap of Divine Wrath */ - case TRAP_OF_DIVINE_WRATH: - { - if (p_ptr->pgod == 0) - { - msg_format("Suddenly you feel glad you're a mere %s", spp_ptr->title); - } - else - { - cptr name; - - name = deity_info[p_ptr->pgod].name; - - msg_format("%s quakes in rage: ``Thou art supremely insolent, mortal!!''", name); - inc_piety(p_ptr->pgod, -500 * p_ptr->lev); - } - break; - } - - /* Trap of hallucination */ - case TRAP_OF_HALLUCINATION: - { - msg_print("Scintillating colors hypnotise you for a moment."); - - set_image(80); - } - break; - - /* Bolt Trap */ - case TRAP_OF_ROCKET: - ident = player_handle_breath_trap(1, GF_ROCKET, trap); - break; - case TRAP_OF_NUKE_BOLT: - ident = player_handle_breath_trap(1, GF_NUKE, trap); - break; - case TRAP_OF_HOLY_FIRE: - ident = player_handle_breath_trap(1, GF_HOLY_FIRE, trap); - break; - case TRAP_OF_HELL_FIRE: - ident = player_handle_breath_trap(1, GF_HELL_FIRE, trap); - break; - case TRAP_OF_PSI_BOLT: - ident = player_handle_breath_trap(1, GF_PSI, trap); - break; - case TRAP_OF_PSI_DRAIN: - ident = player_handle_breath_trap(1, GF_PSI_DRAIN, trap); - break; - - /* Ball Trap */ - case TRAP_OF_NUKE_BALL: - ident = player_handle_breath_trap(3, GF_NUKE, TRAP_OF_NUKE_BALL); - break; - case TRAP_OF_PSI_BALL: - ident = player_handle_breath_trap(3, GF_PSI, TRAP_OF_NUKE_BALL); - break; - - default: - { - msg_print(format("Executing unknown trap %d", trap)); - } - } - return ident; -} - -void player_activate_door_trap(s16b y, s16b x) -{ - auto const &f_info = game->edit_data.f_info; - auto &t_info = game->edit_data.t_info; - - cave_type *c_ptr; - bool_ ident = FALSE; - - c_ptr = &cave[y][x]; - - /* Return if trap or door not found */ - if ((c_ptr->t_idx == 0) || - !(f_info[c_ptr->feat].flags & FF_DOOR)) return; - - /* Disturb */ - disturb(0); - - /* Message */ - msg_print("You found a trap!"); - - /* Pick a trap */ - pick_trap(y, x); - - /* Hit the trap */ - ident = player_activate_trap_type(y, x, NULL, -1); - if (ident) - { - t_info[c_ptr->t_idx].ident = TRUE; - msg_format("You identified that trap as %s.", - t_info[c_ptr->t_idx].name); - } -} - - -/* - * Places a random trap at the given location. - * - * The location must be a valid, empty, clean, floor grid. - */ -void place_trap(int y, int x) -{ - auto const &d_info = game->edit_data.d_info; - auto const &f_info = game->edit_data.f_info; - auto const &t_info = game->edit_data.t_info; - - int cnt; - u32b flags; - cave_type *c_ptr = &cave[y][x]; - auto d_ptr = &d_info[dungeon_type]; - - /* No traps in town or on first level */ - if (dun_level <= 1) return; - - /* - * Avoid open doors -- because DOOR flag is added to make much more - * important processing faster - */ - if (c_ptr->feat == FEAT_OPEN) return; - if (c_ptr->feat == FEAT_BROKEN) return; - - /* Traps only appears on empty floor */ - if (!cave_floor_grid(c_ptr) && - !(f_info[c_ptr->feat].flags & FF_DOOR)) return; - - /* Set flags */ - if (f_info[c_ptr->feat].flags & FF_DOOR) flags = FTRAP_DOOR; - else flags = FTRAP_FLOOR; - - /* Try 100 times */ - cnt = 100; - while (cnt--) - { - std::size_t trap = rand_int(t_info.size()); - auto t_ptr = &t_info[trap]; - - /* No traps below their minlevel */ - if (t_ptr->minlevel > dun_level) continue; - - /* is this a correct trap now? */ - if (!(t_ptr->flags & flags)) continue; - - /* - * Hack -- No trap door at the bottom of dungeon or in flat - * (non dungeon) places or on quest levels - */ - if ((trap == TRAP_OF_SINKING) && - ((d_ptr->maxdepth == dun_level) || - (dungeon_flags & DF_FLAT) || is_quest(dun_level)) ) - { - continue; - } - - /* How probable is this trap */ - if (rand_int(100) < t_ptr->probability) - { - c_ptr->t_idx = trap; - break; - } - } - - return; -} - - -/* - * Place a leveled trap at given position - */ -void place_trap_leveled(int y, int x, int lev) -{ - int prev_dun_level = dun_level; - dun_level = lev; - place_trap(y,x); - dun_level = prev_dun_level; -} - -/* - * Places a random trap on the given chest. - * - * The object must be a valid chest. - */ -void place_trap_object(object_type *o_ptr) -{ - auto const &t_info = game->edit_data.t_info; - - int cnt; - - /* No traps in town or on first level */ - if (dun_level <= 1) - { - /* empty chest were already looted, therefore known */ - o_ptr->ident |= IDENT_KNOWN; - return; - } - - /* Try 100 times */ - cnt = 100; - while (cnt--) - { - std::size_t trap = rand_int(t_info.size()); - auto t_ptr = &t_info[trap]; - - /* no traps below their minlevel */ - if (t_ptr->minlevel > dun_level) continue; - - /* Is this a correct trap now? */ - if (!(t_ptr->flags & FTRAP_CHEST)) continue; - - /* How probable is this trap */ - if (rand_int(100) < t_ptr->probability) - { - o_ptr->pval = trap; - break; - } - } - - return; -} - -/* Dangerous trap placing function */ -void wiz_place_trap(int y, int x, int idx) -{ - auto const &f_info = game->edit_data.f_info; - - cave_type *c_ptr = &cave[y][x]; - - /* Dangerous enough as it is... */ - if (!cave_floor_grid(c_ptr) && (!(f_info[c_ptr->feat].flags & FF_DOOR))) return; - - c_ptr->t_idx = idx; -} - -/* - * Here begin monster traps code - */ - -/* - * Hook to determine if an object is a device - */ -static bool item_tester_hook_device(object_type const *o_ptr) -{ - return (((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->pval != 0)) || - (o_ptr->tval == TV_STAFF) || - (o_ptr->tval == TV_WAND)); -} - -/* - * The trap setting code for rogues -MWK- - * - * Also, it will fail or give weird results if the tvals are resorted! - */ -void do_cmd_set_trap(void) -{ - int item_kit, item_load, i; - int num; - - object_type *o_ptr, *j_ptr, *i_ptr; - - cptr q, s, c; - - object_type object_type_body; - - /* Check some conditions */ - if (p_ptr->blind) - { - msg_print("You can't see anything."); - return; - } - if (no_lite()) - { - msg_print("You don't dare to set a trap in the darkness."); - return; - } - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - /* Only set traps on clean floor grids */ - if (!cave_clean_bold(p_ptr->py, p_ptr->px)) - { - msg_print("You cannot set a trap on this."); - return; - } - - /* Get an item */ - q = "Use which trapping kit? "; - s = "You have no trapping kits."; - if (!get_item(&item_kit, - q, s, - USE_INVEN, - object_filter::TVal(TV_TRAPKIT))) - { - return; - } - - o_ptr = &p_ptr->inventory[item_kit]; - - /* Trap kits need a second object */ - object_filter_t object_filter = object_filter::Or( - object_filter::And( - object_filter::SVal(SV_TRAPKIT_BOW), - object_filter::TVal(TV_ARROW)), - object_filter::And( - object_filter::SVal(SV_TRAPKIT_XBOW), - object_filter::TVal(TV_BOLT)), - object_filter::And( - object_filter::SVal(SV_TRAPKIT_SLING), - object_filter::TVal(TV_SHOT)), - object_filter::And( - object_filter::SVal(SV_TRAPKIT_POTION), - object_filter::Or( - object_filter::TVal(TV_POTION), - object_filter::TVal(TV_POTION2))), - object_filter::And( - object_filter::SVal(SV_TRAPKIT_SCROLL), - object_filter::TVal(TV_SCROLL)), - object_filter::And( - object_filter::SVal(SV_TRAPKIT_DEVICE), - &item_tester_hook_device)); - - /* Get the second item */ - q = "Load with what? "; - s = "You have nothing to load that trap with."; - if (!get_item(&item_load, q, s, USE_INVEN, object_filter)) return; - - /* Get the second object */ - j_ptr = &p_ptr->inventory[item_load]; - - /* Assume a single object */ - num = 1; - - /* In some cases, take multiple objects to load */ - if (o_ptr->sval != SV_TRAPKIT_DEVICE) - { - auto const flags = object_flags(o_ptr); - - if ((flags & TR_XTRA_SHOTS) && (o_ptr->pval > 0)) num += o_ptr->pval; - - if (flags & (TR_AUTOMATIC_5 | TR_AUTOMATIC_99)) num = 99; - - if (num > j_ptr->number) num = j_ptr->number; - - c = format("How many (1-%d)? ", num); - - /* Ask for number of items to use */ - num = get_quantity(c, num); - } - - /* Canceled */ - if (!num) return; - - /* Take a turn */ - energy_use = 100; - - /* Get local object */ - i_ptr = &object_type_body; - - /* Obtain local object for trap content */ - object_copy(i_ptr, j_ptr); - - /* Set number */ - i_ptr->number = num; - - /* Drop it here */ - cave[p_ptr->py][p_ptr->px].special = floor_carry(p_ptr->py, p_ptr->px, i_ptr); - - /* Obtain local object for trap trigger kit */ - object_copy(i_ptr, o_ptr); - - /* Set number */ - i_ptr->number = 1; - - /* Drop it here */ - cave[p_ptr->py][p_ptr->px].special2 = floor_carry(p_ptr->py, p_ptr->px, i_ptr); - - /* Modify, Describe, Optimize */ - inc_stack_size_ex(item_kit, -1, NO_OPTIMIZE, DESCRIBE); - inc_stack_size_ex(item_load, -num, NO_OPTIMIZE, DESCRIBE); - - for (i = 0; i < INVEN_WIELD; i++) - { - if (inven_item_optimize(i)) break; - } - for (i = 0; i < INVEN_WIELD; i++) - { - inven_item_optimize(i); - } - - /* Actually set the trap */ - cave_set_feat(p_ptr->py, p_ptr->px, FEAT_MON_TRAP); -} - -/* - * Monster hitting a rod trap -MWK- - * - * Return TRUE if the monster died - */ -bool_ mon_hit_trap_aux_rod(int m_idx, object_type *o_ptr) -{ - int dam = 0, typ = 0; - int rad = 0; - monster_type *m_ptr = &m_list[m_idx]; - int y = m_ptr->fy; - int x = m_ptr->fx; - - /* Depend on rod type */ - switch (o_ptr->pval) - { - case SV_ROD_DETECT_TRAP: - m_ptr->smart |= SM_NOTE_TRAP; - break; - case SV_ROD_DETECTION: - m_ptr->smart |= SM_NOTE_TRAP; - break; - case SV_ROD_ILLUMINATION: - typ = GF_LITE_WEAK; - dam = damroll(2, 15); - rad = 3; - lite_room(y, x); - break; - case SV_ROD_CURING: - typ = GF_OLD_HEAL; - dam = damroll(3, 4); /* and heal conf? */ - break; - case SV_ROD_HEALING: - typ = GF_OLD_HEAL; - dam = 300; - break; - case SV_ROD_SPEED: - typ = GF_OLD_SPEED; - dam = 50; - break; - case SV_ROD_TELEPORT_AWAY: - typ = GF_AWAY_ALL; - dam = MAX_SIGHT * 5; - break; - case SV_ROD_DISARMING: - break; - case SV_ROD_LITE: - typ = GF_LITE_WEAK; - dam = damroll(6, 8); - break; - case SV_ROD_SLEEP_MONSTER: - typ = GF_OLD_SLEEP; - dam = 50; - break; - case SV_ROD_SLOW_MONSTER: - typ = GF_OLD_SLOW; - dam = 50; - break; - case SV_ROD_DRAIN_LIFE: - typ = GF_OLD_DRAIN; - dam = 75; - break; - case SV_ROD_POLYMORPH: - typ = GF_OLD_POLY; - dam = 50; - break; - case SV_ROD_ACID_BOLT: - typ = GF_ACID; - dam = damroll(6, 8); - break; - case SV_ROD_ELEC_BOLT: - typ = GF_ELEC; - dam = damroll(3, 8); - break; - case SV_ROD_FIRE_BOLT: - typ = GF_FIRE; - dam = damroll(8, 8); - break; - case SV_ROD_COLD_BOLT: - typ = GF_COLD; - dam = damroll(5, 8); - break; - case SV_ROD_ACID_BALL: - typ = GF_ACID; - dam = 60; - rad = 2; - break; - case SV_ROD_ELEC_BALL: - typ = GF_ELEC; - dam = 32; - rad = 2; - break; - case SV_ROD_FIRE_BALL: - typ = GF_FIRE; - dam = 72; - rad = 2; - break; - case SV_ROD_COLD_BALL: - typ = GF_COLD; - dam = 48; - rad = 2; - break; - default: - return (FALSE); - } - - /* Actually hit the monster */ - if (typ) (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP); - return (cave[y][x].m_idx == 0 ? TRUE : FALSE); -} - -/* - * Monster hitting a staff trap -MWK- - * - * Return TRUE if the monster died - */ -bool_ mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr) -{ - return (FALSE); -} - -/* - * Monster hitting a scroll trap -MWK- - * - * Return TRUE if the monster died - */ -bool_ mon_hit_trap_aux_scroll(int m_idx, int sval) -{ - auto const &r_info = game->edit_data.r_info; - - monster_type *m_ptr = &m_list[m_idx]; - int dam = 0, typ = 0; - int rad = 0; - int y = m_ptr->fy; - int x = m_ptr->fx; - int k; - - /* Depend on scroll type */ - switch (sval) - { - case SV_SCROLL_CURSE_ARMOR: - case SV_SCROLL_CURSE_WEAPON: - case SV_SCROLL_TRAP_CREATION: /* these don't work :-( */ - case SV_SCROLL_WORD_OF_RECALL: /* should these? */ - case SV_SCROLL_IDENTIFY: - case SV_SCROLL_STAR_IDENTIFY: - case SV_SCROLL_MAPPING: - case SV_SCROLL_DETECT_GOLD: - case SV_SCROLL_DETECT_ITEM: - case SV_SCROLL_REMOVE_CURSE: - case SV_SCROLL_STAR_REMOVE_CURSE: - case SV_SCROLL_ENCHANT_ARMOR: - case SV_SCROLL_ENCHANT_WEAPON_TO_HIT: - case SV_SCROLL_ENCHANT_WEAPON_TO_DAM: - case SV_SCROLL_STAR_ENCHANT_ARMOR: - case SV_SCROLL_STAR_ENCHANT_WEAPON: - case SV_SCROLL_RECHARGING: - case SV_SCROLL_DETECT_DOOR: - case SV_SCROLL_DETECT_INVIS: - case SV_SCROLL_SATISFY_HUNGER: - case SV_SCROLL_RUNE_OF_PROTECTION: - case SV_SCROLL_TRAP_DOOR_DESTRUCTION: - case SV_SCROLL_PROTECTION_FROM_EVIL: - return (FALSE); - case SV_SCROLL_DARKNESS: - unlite_room(y, x); - typ = GF_DARK_WEAK; - dam = 10; - rad = 3; - break; - case SV_SCROLL_AGGRAVATE_MONSTER: - aggravate_monsters(m_idx); - return (FALSE); - case SV_SCROLL_SUMMON_MONSTER: - for (k = 0; k < randint(3) ; k++) summon_specific(y, x, dun_level, 0); - return (FALSE); - case SV_SCROLL_SUMMON_UNDEAD: - for (k = 0; k < randint(3) ; k++) summon_specific(y, x, dun_level, SUMMON_UNDEAD); - return (FALSE); - case SV_SCROLL_PHASE_DOOR: - typ = GF_AWAY_ALL; - dam = 10; - break; - case SV_SCROLL_TELEPORT: - typ = GF_AWAY_ALL; - dam = 100; - break; - case SV_SCROLL_TELEPORT_LEVEL: - delete_monster(y, x); - return (TRUE); - case SV_SCROLL_LIGHT: - lite_room(y, x); - typ = GF_LITE_WEAK; - dam = damroll(2, 8); - rad = 2; - break; - case SV_SCROLL_DETECT_TRAP: - m_ptr->smart |= SM_NOTE_TRAP; - return (FALSE); - case SV_SCROLL_BLESSING: - typ = GF_HOLY_FIRE; - dam = damroll(1, 4); - break; - case SV_SCROLL_HOLY_CHANT: - typ = GF_HOLY_FIRE; - dam = damroll(2, 4); - break; - case SV_SCROLL_HOLY_PRAYER: - typ = GF_HOLY_FIRE; - dam = damroll(4, 4); - break; - case SV_SCROLL_MONSTER_CONFUSION: - typ = GF_OLD_CONF; - dam = damroll(5, 10); - break; - case SV_SCROLL_STAR_DESTRUCTION: - destroy_area(y, x, 15); - return (FALSE); - case SV_SCROLL_DISPEL_UNDEAD: - typ = GF_DISP_UNDEAD; - rad = 5; - dam = 60; - break; - case SV_SCROLL_GENOCIDE: - { - auto r_ptr = &r_info[m_ptr->r_idx]; - genocide_aux(FALSE, r_ptr->d_char); - /* although there's no point in a multiple genocide trap... */ - return (!(r_ptr->flags & RF_UNIQUE)); - } - case SV_SCROLL_MASS_GENOCIDE: - for (k = 0; k < 8; k++) - delete_monster(y + ddy[k], x + ddx[k]); - delete_monster(y, x); - return (TRUE); - case SV_SCROLL_ACQUIREMENT: - acquirement(y, x, 1, TRUE, FALSE); - return (FALSE); - case SV_SCROLL_STAR_ACQUIREMENT: - acquirement(y, x, randint(2) + 1, TRUE, FALSE); - return (FALSE); - default: - return (FALSE); - } - - /* Actually hit the monster */ - (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP); - return (cave[y][x].m_idx == 0 ? TRUE : FALSE); -} - -/* - * Monster hitting a wand trap -MWK- - * - * Return TRUE if the monster died - */ -bool_ mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr) -{ - return (FALSE); -} - -/* - * Monster hitting a potions trap -MWK- - * - * Return TRUE if the monster died - */ -bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr) -{ - auto const &r_info = game->edit_data.r_info; - - monster_type *m_ptr = &m_list[m_idx]; - int dam = 0, typ = 0; - int y = m_ptr->fy; - int x = m_ptr->fx; - int sval = o_ptr->sval; - - /* Depend on potion type */ - if (o_ptr->tval == TV_POTION) - { - switch (sval) - { - /* Nothing happens */ - case SV_POTION_WATER: - case SV_POTION_APPLE_JUICE: - case SV_POTION_SLIME_MOLD: - case SV_POTION_SALT_WATER: - case SV_POTION_DEC_STR: - case SV_POTION_DEC_INT: - case SV_POTION_DEC_WIS: - case SV_POTION_DEC_DEX: - case SV_POTION_DEC_CON: - case SV_POTION_DEC_CHR: - case SV_POTION_INFRAVISION: - case SV_POTION_DETECT_INVIS: - case SV_POTION_SLOW_POISON: - case SV_POTION_CURE_POISON: - case SV_POTION_RESIST_HEAT: - case SV_POTION_RESIST_COLD: - case SV_POTION_RESTORE_MANA: - case SV_POTION_RESTORE_EXP: - case SV_POTION_RES_STR: - case SV_POTION_RES_INT: - case SV_POTION_RES_WIS: - case SV_POTION_RES_DEX: - case SV_POTION_RES_CON: - case SV_POTION_RES_CHR: - case SV_POTION_INC_STR: - case SV_POTION_INC_INT: - case SV_POTION_INC_WIS: - case SV_POTION_INC_DEX: - case SV_POTION_INC_CON: - case SV_POTION_INC_CHR: - case SV_POTION_AUGMENTATION: - case SV_POTION_RUINATION: /* ??? */ - case SV_POTION_ENLIGHTENMENT: - case SV_POTION_STAR_ENLIGHTENMENT: - case SV_POTION_SELF_KNOWLEDGE: - return (FALSE); - - case SV_POTION_EXPERIENCE: - if (m_ptr->level < MONSTER_LEVEL_MAX) - { - m_ptr->exp = monster_exp(m_ptr->level + 1); - monster_check_experience(m_idx, FALSE); - } - return (FALSE); - case SV_POTION_SLOWNESS: - typ = GF_OLD_SLOW; - dam = damroll(4, 6); - break; - case SV_POTION_POISON: - typ = GF_POIS; - dam = damroll(8, 6); - break; - case SV_POTION_CONFUSION: - typ = GF_CONFUSION; - dam = damroll(4, 6); - break; - case SV_POTION_BLINDNESS: - typ = GF_DARK; - dam = 10; - break; - case SV_POTION_SLEEP: - typ = GF_OLD_SLEEP; - dam = damroll (4, 6); - break; - case SV_POTION_LOSE_MEMORIES: - typ = GF_OLD_CONF; - dam = damroll(10, 10); - break; - case SV_POTION_DETONATIONS: - typ = GF_DISINTEGRATE; - dam = damroll(20, 20); - break; - case SV_POTION_DEATH: - typ = GF_NETHER; - dam = damroll(100, 20); - break; - case SV_POTION_BOLDNESS: - m_ptr->monfear = 0; - return (FALSE); - case SV_POTION_SPEED: - typ = GF_OLD_SPEED; - dam = damroll(5, 10); - break; - case SV_POTION_HEROISM: - case SV_POTION_BESERK_STRENGTH: - m_ptr->monfear = 0; - typ = GF_OLD_HEAL; - dam = damroll(2, 10); - break; - case SV_POTION_CURE_LIGHT: - typ = GF_OLD_HEAL; - dam = damroll(3, 4); - break; - case SV_POTION_CURE_SERIOUS: - typ = GF_OLD_HEAL; - dam = damroll(4, 6); - break; - case SV_POTION_CURE_CRITICAL: - typ = GF_OLD_HEAL; - dam = damroll(6, 8); - break; - case SV_POTION_HEALING: - typ = GF_OLD_HEAL; - dam = 300; - break; - case SV_POTION_STAR_HEALING: - typ = GF_OLD_HEAL; - dam = 1000; - break; - case SV_POTION_LIFE: - { - auto r_ptr = &r_info[m_ptr->r_idx]; - if (r_ptr->flags & RF_UNDEAD) - { - typ = GF_HOLY_FIRE; - dam = damroll(20, 20); - } - else - { - typ = GF_OLD_HEAL; - dam = 5000; - } - break; - } - default: - return (FALSE); - - } - } - else - {} - - /* Actually hit the monster */ - (void) project_m( -2, 0, y, x, dam, typ); - return (cave[y][x].m_idx == 0 ? TRUE : FALSE); -} - -/* - * Monster hitting a monster trap -MWK- - * Returns True if the monster died, false otherwise - */ -bool_ mon_hit_trap(int m_idx) -{ - auto const &r_info = game->edit_data.r_info; - auto const &k_info = game->edit_data.k_info; - - monster_type *m_ptr = &m_list[m_idx]; - auto r_ptr = &r_info[m_ptr->r_idx]; - - object_type object_type_body; - - int mx = m_ptr->fx; - int my = m_ptr->fy; - - int difficulty; - int smartness; - - char m_name[80]; - - bool_ notice = FALSE; - bool_ disarm = FALSE; - bool_ remove = FALSE; - bool_ dead = FALSE; - bool_ fear = FALSE; - s32b special = 0; - - int dam, chance, shots; - int mul = 0; - int breakage = -1; - - int cost = 0; - - /* Get the trap objects */ - auto kit_o_idx = cave[my][mx].special2; - auto kit_o_ptr = &o_list[kit_o_idx]; - auto load_o_ptr = &o_list[cave[my][mx].special]; - auto j_ptr = &object_type_body; - - /* Get trap properties */ - auto const flags = object_flags(kit_o_ptr); - - /* Can set off check */ - /* Ghosts only set off Ghost traps */ - if ((r_ptr->flags & RF_PASS_WALL) && !(flags & TR_KILL_GHOST)) return (FALSE); - - /* Some traps are specialized to some creatures */ - if (flags & (TR_ONLY_DRAGON | TR_ONLY_DEMON | TR_ONLY_ANIMAL | TR_ONLY_UNDEAD | TR_ONLY_EVIL)) - { - bool_ affect = FALSE; - if ((flags & TR_ONLY_DRAGON) && (r_ptr->flags & RF_DRAGON)) affect = TRUE; - if ((flags & TR_ONLY_DEMON) && (r_ptr->flags & RF_DEMON)) affect = TRUE; - if ((flags & TR_ONLY_UNDEAD) && (r_ptr->flags & RF_UNDEAD)) affect = TRUE; - if ((flags & TR_ONLY_EVIL) && (r_ptr->flags & RF_EVIL)) affect = TRUE; - if ((flags & TR_ONLY_ANIMAL) && (r_ptr->flags & RF_ANIMAL)) affect = TRUE; - - /* Don't set it off if forbidden */ - if (!affect) return (FALSE); - } - - /* Get detection difficulty */ - difficulty = 25; - - /* Some traps are well-hidden */ - if (flags & TR_STEALTH) - { - difficulty += 10 * (kit_o_ptr->pval); - } - - /* Get monster smartness for trap detection */ - /* Higher level monsters are smarter */ - smartness = r_ptr->level; - - /* Smart monsters are better at detecting traps */ - if (r_ptr->flags & RF_SMART) smartness += 10; - - /* Some monsters have already noticed one of out traps */ - if (m_ptr->smart & SM_NOTE_TRAP) smartness += 20; - - /* Stupid monsters are no good at detecting traps */ - if (r_ptr->flags & (RF_STUPID | RF_EMPTY_MIND)) smartness = -150; - - /* Check if the monster notices the trap */ - if (randint(300) > (difficulty - smartness + 150)) notice = TRUE; - - /* Disarm check */ - if (notice) - { - /* The next traps will be easier to spot! */ - m_ptr->smart |= SM_NOTE_TRAP; - - /* Get trap disarming difficulty */ - difficulty = (kit_o_ptr->ac + kit_o_ptr->to_a); - - /* Get monster disarming ability */ - /* Higher level monsters are better */ - smartness = r_ptr->level / 5; - - /* Smart monsters are better at disarming */ - if (r_ptr->flags & RF_SMART) smartness *= 2; - - /* Stupid monsters never disarm traps */ - if (r_ptr->flags & RF_STUPID) smartness = -150; - - /* Nonsmart animals never disarm traps */ - if ((r_ptr->flags & RF_ANIMAL) && !(r_ptr->flags & RF_SMART)) smartness = -150; - - /* Check if the monster disarms the trap */ - if (randint(120) > (difficulty - smartness + 80)) disarm = TRUE; - } - - /* If disarmed, remove the trap and print a message */ - if (disarm) - { - remove = TRUE; - - if (m_ptr->ml) - { - /* Get the name */ - monster_desc(m_name, m_ptr, 0); - - /* Print a message */ - msg_format("%^s disarms a trap!", m_name); - } - } - - /* Otherwise, activate the trap! */ - else - { - /* Message for visible monster */ - if (m_ptr->ml) - { - /* Get the name */ - monster_desc(m_name, m_ptr, 0); - - /* Print a message */ - msg_format("%^s sets off a trap!", m_name); - } - else - { - /* No message if monster isn't visible ? */ - } - - /* Next time be more careful */ - if (randint(100) < 80) m_ptr->smart |= SM_NOTE_TRAP; - - /* Actually activate the trap */ - switch (kit_o_ptr->sval) - { - case SV_TRAPKIT_BOW: - case SV_TRAPKIT_XBOW: - case SV_TRAPKIT_SLING: - { - /* Get number of shots */ - shots = 1; - if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; - if (shots <= 0) shots = 1; - if (shots > load_o_ptr->number) shots = load_o_ptr->number; - - while (shots-- && !dead) - { - /* Total base damage */ - dam = damroll(load_o_ptr->dd, load_o_ptr->ds) + load_o_ptr->to_d + kit_o_ptr->to_d; - - /* Total hit probability */ - chance = (kit_o_ptr->to_h + load_o_ptr->to_h + 20) * BTH_PLUS_ADJ; - - /* Damage multiplier */ - if (kit_o_ptr->sval == SV_TRAPKIT_BOW) mul = 3; - if (kit_o_ptr->sval == SV_TRAPKIT_XBOW) mul = 4; - if (kit_o_ptr->sval == SV_TRAPKIT_SLING) mul = 2; - if (flags & TR_XTRA_MIGHT) mul += kit_o_ptr->pval; - if (mul < 0) mul = 0; - - /* Multiply damage */ - dam *= mul; - - /* Check if we hit the monster */ - if (test_hit_fire(chance, r_ptr->ac, TRUE)) - { - /* Assume a default death */ - cptr note_dies = " dies."; - - /* Some monsters get "destroyed" */ - if ((r_ptr->flags & RF_DEMON) || - (r_ptr->flags & RF_UNDEAD) || - (r_ptr->flags & RF_STUPID) || - (strchr("Evg", r_ptr->d_char))) - { - /* Special note at death */ - note_dies = " is destroyed."; - } - - /* Message if visible */ - if (m_ptr->ml) - { - /* describe the monster (again, just in case :-) */ - monster_desc(m_name, m_ptr, 0); - - /* Print a message */ - msg_format("%^s is hit by a missile.", m_name); - } - - /* Apply slays, brand, critical hits */ - dam = tot_dam_aux(load_o_ptr, dam, m_ptr, &special); - dam = critical_shot(load_o_ptr->weight, load_o_ptr->to_h, dam, SKILL_ARCHERY); - - /* No negative damage */ - if (dam < 0) dam = 0; - - /* Hit the monster, check for death */ - if (mon_take_hit(m_idx, dam, &fear, note_dies)) - { - /* Dead monster */ - dead = TRUE; - } - - /* No death */ - else - { - /* Message */ - message_pain(m_idx, dam); - - if (special) attack_special(m_ptr, special, dam); - - /* Take note */ - if (fear && m_ptr->ml) - { - /* Message */ - msg_format("%^s flees in terror!", m_name); - } - } - - } - - /* Exploding ammo */ - if (load_o_ptr->pval2 != 0) - { - int rad = 0; - int dam = (damroll(load_o_ptr->dd, load_o_ptr->ds) + load_o_ptr->to_d)*2; - int flag = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL | - PROJECT_JUMP; - - switch (load_o_ptr->sval) - { - case SV_AMMO_LIGHT: - rad = 2; - dam /= 2; - break; - case SV_AMMO_NORMAL: - rad = 3; - break; - case SV_AMMO_HEAVY: - rad = 4; - dam *= 2; - break; - } - - project(0, rad, my, mx, dam, load_o_ptr->pval2, flag); - - breakage = 100; - } - else - { - breakage = breakage_chance(load_o_ptr); - } - - /* Copy and decrease ammo */ - object_copy(j_ptr, load_o_ptr); - - j_ptr->number = 1; - - load_o_ptr->number--; - - if (load_o_ptr->number <= 0) - { - remove = TRUE; - delete_object_idx(kit_o_idx); - } - - /* Drop (or break) near that location */ - drop_near(j_ptr, breakage, my, mx); - - } - - break; - } - - case SV_TRAPKIT_POTION: - { - /* Get number of shots */ - shots = 1; - if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; - if (shots <= 0) shots = 1; - if (shots > load_o_ptr->number) shots = load_o_ptr->number; - - while (shots-- && !dead) - { - - /* Message if visible */ - if (m_ptr->ml) - { - /* describe the monster (again, just in case :-) */ - monster_desc(m_name, m_ptr, 0); - - /* Print a message */ - msg_format("%^s is hit by fumes.", m_name); - } - - /* Get the potion effect */ - dead = mon_hit_trap_aux_potion(m_idx, load_o_ptr); - - /* Copy and decrease ammo */ - object_copy(j_ptr, load_o_ptr); - - j_ptr->number = 1; - - load_o_ptr->number--; - - if (load_o_ptr->number <= 0) - { - remove = TRUE; - delete_object_idx(kit_o_idx); - } - } - - break; - } - - case SV_TRAPKIT_SCROLL: - { - /* Get number of shots */ - shots = 1; - if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; - if (shots <= 0) shots = 1; - if (shots > load_o_ptr->number) shots = load_o_ptr->number; - - while (shots-- && !dead) - { - - /* Message if visible */ - if (m_ptr->ml) - { - /* describe the monster (again, just in case :-) */ - monster_desc(m_name, m_ptr, 0); - - /* Print a message */ - msg_format("%^s activates a spell!", m_name); - } - - /* Get the potion effect */ - dead = mon_hit_trap_aux_scroll(m_idx, load_o_ptr->sval); - - /* Copy and decrease ammo */ - object_copy(j_ptr, load_o_ptr); - - j_ptr->number = 1; - - load_o_ptr->number--; - - if (load_o_ptr->number <= 0) - { - remove = TRUE; - delete_object_idx(kit_o_idx); - } - } - - break; - } - - case SV_TRAPKIT_DEVICE: - { - if (load_o_ptr->tval == TV_ROD_MAIN) - { - /* Extract mana cost of the rod tip */ - auto tip_o_ptr = &k_info[lookup_kind(TV_ROD, load_o_ptr->pval)]; - auto const tflags = object_flags(load_o_ptr); - cost = (tflags & TR_CHEAPNESS) ? tip_o_ptr->pval / 2 : tip_o_ptr->pval; - if (cost <= 0) cost = 1; - } - - /* Get number of shots */ - shots = 1; - if (flags & TR_XTRA_SHOTS) shots += kit_o_ptr->pval; - if (shots <= 0) shots = 1; - - if (load_o_ptr->tval == TV_ROD_MAIN) - { - if (shots > load_o_ptr->timeout / cost) shots = load_o_ptr->timeout / cost; - } - else - { - if (shots > load_o_ptr->pval) shots = load_o_ptr->pval; - } - - while (shots-- && !dead) - { - /* Get the effect effect */ - switch (load_o_ptr->tval) - { - case TV_ROD_MAIN: - dead = mon_hit_trap_aux_rod(m_idx, load_o_ptr); - break; - case TV_WAND: - dead = mon_hit_trap_aux_wand(m_idx, load_o_ptr); - break; - case TV_STAFF: - dead = mon_hit_trap_aux_staff(m_idx, load_o_ptr); - break; - } - - if (load_o_ptr->tval == TV_ROD_MAIN) - { - /* decrease stored mana (timeout) for rods */ - load_o_ptr->timeout -= cost; - } - else - { - /* decrease charges for wands and staves */ - load_o_ptr->pval--; - } - } - - break; - } - - default: - msg_print("oops! nonexistant trap!"); - - } - - /* Non-automatic traps are removed */ - if (!(flags & (TR_AUTOMATIC_5 | TR_AUTOMATIC_99))) - { - remove = TRUE; - } - else if (flags & TR_AUTOMATIC_5) remove = (randint(5) == 1); - - } - - /* Special trap effect -- teleport to */ - if ((flags & TR_TELEPORT_TO) && (!disarm) && (!dead)) - { - teleport_monster_to(m_idx, p_ptr->py, p_ptr->px); - } - - /* Remove the trap if inactive now */ - if (remove) place_floor_convert_glass(my, mx); - - /* did it die? */ - return (dead); -} - diff --git a/src/traps.hpp b/src/traps.hpp deleted file mode 100644 index 3df1e430..00000000 --- a/src/traps.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "h-basic.h" -#include "object_type_fwd.hpp" - -extern bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item); -extern void player_activate_door_trap(s16b y, s16b x); -extern void place_trap(int y, int x); -extern void place_trap_leveled(int y, int x, int lev); -extern void place_trap_object(object_type *o_ptr); -extern void wiz_place_trap(int y, int x, int idx); -extern void do_cmd_set_trap(void); -extern bool_ mon_hit_trap(int); diff --git a/src/wizard2.cc b/src/wizard2.cc index e3e93918..0c431066 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -32,7 +32,6 @@ #include "spells2.hpp" #include "stats.hpp" #include "tables.hpp" -#include "traps.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -1659,11 +1658,6 @@ void do_cmd_debug() gain_random_corruption(); break; - /* Create a trap */ - case 'R': - wiz_place_trap(p_ptr->py, p_ptr->px, command_arg); - break; - /* Summon _friendly_ named monster */ case 'N': do_cmd_wiz_named_friendly(command_arg, TRUE); @@ -1807,7 +1801,6 @@ void do_cmd_debug() /* Change the feature of the map */ case 'F': - msg_format("Trap: %d", cave[p_ptr->py][p_ptr->px].t_idx); msg_format("Old feature: %d", cave[p_ptr->py][p_ptr->px].feat); msg_format("Special: %d", cave[p_ptr->py][p_ptr->px].special); cave_set_feat(p_ptr->py, p_ptr->px, command_arg); diff --git a/src/xtra1.cc b/src/xtra1.cc index c64b26ac..3ed902dd 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -701,12 +701,6 @@ static void prt_state(int row, int col) } } - /* Searching */ - else if (p_ptr->searching) - { - strcpy(text, "Searching "); - } - /* Nothing interesting */ else { @@ -728,9 +722,6 @@ static void prt_speed(int row, int col) byte attr = TERM_WHITE; char buf[32] = ""; - /* Hack -- Visually "undo" the Search Mode Slowdown */ - if (p_ptr->searching) i += 10; - /* Fast */ if (i > 110) { @@ -831,17 +822,6 @@ static void prt_status_line(void) put_str(" ", row, col); } - /* Dtrap */ - col = 32; - if (cave[p_ptr->py][p_ptr->px].info & CAVE_DETECT) - { - c_put_str(TERM_L_GREEN, "DTrap", row, col); - } - else - { - put_str(" ", row, col); - } - /* State */ col = 38; prt_state(row, col); @@ -2622,12 +2602,6 @@ void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b /* Affect stealth */ if (f & TR_STEALTH) p_ptr->skill_stl += pval; - /* Affect searching ability (factor of five) */ - if (f & TR_SEARCH) p_ptr->skill_srh += (pval * 5); - - /* Affect searching frequency (factor of five) */ - if (f & TR_SEARCH) p_ptr->skill_fos += (pval * 5); - /* Affect infravision */ if (f & TR_INFRA) p_ptr->see_infra += pval; @@ -2960,10 +2934,6 @@ void calc_bonuses(bool_ silent) /* Base infravision (purely racial) */ p_ptr->see_infra = rp_ptr->infra + rmp_ptr->infra; - - /* Base skill -- disarming */ - p_ptr->skill_dis = 0; - /* Base skill -- magic devices */ p_ptr->skill_dev = 0; @@ -2973,12 +2943,6 @@ void calc_bonuses(bool_ silent) /* Base skill -- stealth */ p_ptr->skill_stl = 0; - /* Base skill -- searching ability */ - p_ptr->skill_srh = 0; - - /* Base skill -- searching frequency */ - p_ptr->skill_fos = 0; - /* Base skill -- combat (normal) */ p_ptr->skill_thn = 0; @@ -3296,12 +3260,9 @@ void calc_bonuses(bool_ silent) p_ptr->to_a += tactic_info[(byte)p_ptr->tactic].to_ac; p_ptr->skill_stl += tactic_info[(byte)p_ptr->tactic].to_stealth; - p_ptr->skill_dis += tactic_info[(byte)p_ptr->tactic].to_disarm; p_ptr->skill_sav += tactic_info[(byte)p_ptr->tactic].to_saving; p_ptr->pspeed += move_info[(byte)p_ptr->movement].to_speed; - p_ptr->skill_srh += move_info[(byte)p_ptr->movement].to_search; - p_ptr->skill_fos += move_info[(byte)p_ptr->movement].to_percep; p_ptr->skill_stl += move_info[(byte)p_ptr->movement].to_stealth; /* Apply temporary "stun" */ @@ -3535,9 +3496,6 @@ void calc_bonuses(bool_ silent) /* Bloating slows the player down (a little) */ if (p_ptr->food >= PY_FOOD_MAX) p_ptr->pspeed -= 10; - /* Searching slows the player down */ - if (p_ptr->searching) p_ptr->pspeed -= 10; - /* Display the speed (if needed) */ if (p_ptr->pspeed != old_speed) p_ptr->redraw |= (PR_FRAME); @@ -3930,10 +3888,6 @@ void calc_bonuses(bool_ silent) /* Affect Skill -- stealth (bonus one) */ p_ptr->skill_stl += 1; - /* Affect Skill -- disarming (DEX and INT) */ - p_ptr->skill_dis += adj_dex_dis[p_ptr->stat_ind[A_DEX]]; - p_ptr->skill_dis += adj_int_dis[p_ptr->stat_ind[A_INT]]; - /* Affect Skill -- magic devices (INT) */ p_ptr->skill_dev += get_skill_scale(SKILL_DEVICE, 20); @@ -3943,9 +3897,6 @@ void calc_bonuses(bool_ silent) /* Affect Skill -- digging (STR) */ p_ptr->skill_dig += adj_str_dig[p_ptr->stat_ind[A_STR]]; - /* Affect Skill -- disarming (skill) */ - p_ptr->skill_dis += (get_skill_scale(SKILL_DISARMING, 75)); - /* Affect Skill -- magic devices (skill) */ p_ptr->skill_dev += (get_skill_scale(SKILL_DEVICE, 150)); @@ -3955,12 +3906,6 @@ void calc_bonuses(bool_ silent) /* Affect Skill -- stealth (skill) */ p_ptr->skill_stl += (get_skill_scale(SKILL_STEALTH, 25)); - /* Affect Skill -- search ability (Sneakiness skill) */ - p_ptr->skill_srh += (get_skill_scale(SKILL_SNEAK, 35)); - - /* Affect Skill -- search frequency (Sneakiness skill) */ - p_ptr->skill_fos += (get_skill_scale(SKILL_SNEAK, 25)); - /* Affect Skill -- combat (Combat skill + mastery) */ p_ptr->skill_thn += (50 * (((7 * get_skill(p_ptr->melee_style)) + (3 * get_skill(SKILL_COMBAT))) / 10) / 10); diff --git a/src/xtra2.cc b/src/xtra2.cc index 890ce975..8e859f14 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -51,7 +51,6 @@ #include "stats.hpp" #include "store_info_type.hpp" #include "tables.hpp" -#include "trap_type.hpp" #include "util.hpp" #include "util.h" #include "variable.h" @@ -3777,9 +3776,6 @@ static bool_ target_set_accept(int y, int x) /* Interesting memorized features */ if (c_ptr->info & (CAVE_MARK)) { - /* Traps are interesting */ - if (c_ptr->info & (CAVE_TRDT)) return (TRUE); - /* Hack -- Doors are boring */ if (c_ptr->feat == FEAT_OPEN) return (FALSE); if (c_ptr->feat == FEAT_BROKEN) return (FALSE); @@ -3902,7 +3898,6 @@ static int target_set_aux(int y, int x, int mode, cptr info) auto const &wf_info = game->edit_data.wf_info; auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; - auto const &t_info = game->edit_data.t_info; cave_type *c_ptr = &cave[y][x]; @@ -4166,34 +4161,6 @@ static int target_set_aux(int y, int x, int mode, cptr info) } } - /* Actual traps */ - if ((c_ptr->info & (CAVE_TRDT)) && c_ptr->t_idx) - { - cptr name = "a trap", s4; - - /* Name trap */ - if (t_info[c_ptr->t_idx].ident) - { - s4 = format("(%s)", t_info[c_ptr->t_idx].name); - } - else - { - s4 = "an unknown trap"; - } - - /* Display a message */ - sprintf(out_val, "%s%s%s%s [%s]", s1, s2, s3, name, s4); - prt(out_val, 0, 0); - move_cursor_relative(y, x); - query = inkey(); - - /* Stop on everything but "return" */ - if ((query != '\r') && (query != '\n')) break; - - /* Repeat forever */ - continue; - } - /* Feature (apply "mimic") */ if (c_ptr->mimic) { -- cgit v1.2.3 From e5f00458bdd1389cfabe45991b04104e415bf125 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 18:45:09 +0200 Subject: Reduce #object_flag tiers --- src/object_flag_list.hpp | 28 ++++++++++++++-------------- src/object_flag_set.hpp | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/object_flag_list.hpp b/src/object_flag_list.hpp index 05dbb3be..696b590c 100644 --- a/src/object_flag_list.hpp +++ b/src/object_flag_list.hpp @@ -170,17 +170,17 @@ TR(5, 17, TR_RANDOM_RESIST , RANDOM_RESIST , nullptr , -1, -1, -1, TR(5, 18, TR_RANDOM_POWER , RANDOM_POWER , nullptr , -1, -1, -1, BINARY , 0, false, false) TR(5, 19, TR_RANDOM_RES_OR_POWER, RANDOM_RES_OR_POWER, nullptr , -1, -1, -1, BINARY , 0, false, false) -TR(7, 0, ESP_ORC , ESP_ORC , "Orc.ESP" , 3, 1, 0, BINARY , 0, false, true ) -TR(7, 1, ESP_TROLL , ESP_TROLL , "Troll.ESP" , 3, 1, 1, BINARY , 0, false, true ) -TR(7, 2, ESP_DRAGON , ESP_DRAGON , "Dragon.ESP", 3, 1, 2, BINARY , 0, false, true ) -TR(7, 3, ESP_GIANT , ESP_GIANT , "Giant.ESP" , 3, 1, 3, BINARY , 0, false, true ) -TR(7, 4, ESP_DEMON , ESP_DEMON , "Demon.ESP" , 3, 1, 4, BINARY , 0, false, true ) -TR(7, 5, ESP_UNDEAD , ESP_UNDEAD , "Undead.ESP", 3, 1, 5, BINARY , 0, false, true ) -TR(7, 6, ESP_EVIL , ESP_EVIL , "Evil.ESP" , 3, 1, 6, BINARY , 0, false, true ) -TR(7, 7, ESP_ANIMAL , ESP_ANIMAL , "Animal.ESP", 3, 1, 7, BINARY , 0, false, true ) -TR(7, 8, ESP_THUNDERLORD , ESP_THUNDERLORD , "TLord.ESP" , 3, 1, 8, BINARY , 0, false, true ) -TR(7, 9, ESP_GOOD , ESP_GOOD , "Good.ESP" , 3, 1, 9, BINARY , 0, false, true ) -TR(7, 10, ESP_NONLIVING , ESP_NONLIVING , "Nlive.ESP" , 3, 1, 10, BINARY , 0, false, true ) -TR(7, 11, ESP_UNIQUE , ESP_UNIQUE , "Unique.ESP", 3, 1, 11, BINARY , 0, false, true ) -TR(7, 12, ESP_SPIDER , ESP_SPIDER , "Spider ESP", 3, 1, 12, BINARY , 0, false, true ) -TR(7, 31, ESP_ALL , ESP_ALL , "Full ESP" , 3, 1, 15, BINARY , 0, false, true ) +TR(6, 0, ESP_ORC , ESP_ORC , "Orc.ESP" , 3, 1, 0, BINARY , 0, false, true ) +TR(6, 1, ESP_TROLL , ESP_TROLL , "Troll.ESP" , 3, 1, 1, BINARY , 0, false, true ) +TR(6, 2, ESP_DRAGON , ESP_DRAGON , "Dragon.ESP", 3, 1, 2, BINARY , 0, false, true ) +TR(6, 3, ESP_GIANT , ESP_GIANT , "Giant.ESP" , 3, 1, 3, BINARY , 0, false, true ) +TR(6, 4, ESP_DEMON , ESP_DEMON , "Demon.ESP" , 3, 1, 4, BINARY , 0, false, true ) +TR(6, 5, ESP_UNDEAD , ESP_UNDEAD , "Undead.ESP", 3, 1, 5, BINARY , 0, false, true ) +TR(6, 6, ESP_EVIL , ESP_EVIL , "Evil.ESP" , 3, 1, 6, BINARY , 0, false, true ) +TR(6, 7, ESP_ANIMAL , ESP_ANIMAL , "Animal.ESP", 3, 1, 7, BINARY , 0, false, true ) +TR(6, 8, ESP_THUNDERLORD , ESP_THUNDERLORD , "TLord.ESP" , 3, 1, 8, BINARY , 0, false, true ) +TR(6, 9, ESP_GOOD , ESP_GOOD , "Good.ESP" , 3, 1, 9, BINARY , 0, false, true ) +TR(6, 10, ESP_NONLIVING , ESP_NONLIVING , "Nlive.ESP" , 3, 1, 10, BINARY , 0, false, true ) +TR(6, 11, ESP_UNIQUE , ESP_UNIQUE , "Unique.ESP", 3, 1, 11, BINARY , 0, false, true ) +TR(6, 12, ESP_SPIDER , ESP_SPIDER , "Spider ESP", 3, 1, 12, BINARY , 0, false, true ) +TR(6, 31, ESP_ALL , ESP_ALL , "Full ESP" , 3, 1, 15, BINARY , 0, false, true ) diff --git a/src/object_flag_set.hpp b/src/object_flag_set.hpp index 478b6c03..a4e8f874 100644 --- a/src/object_flag_set.hpp +++ b/src/object_flag_set.hpp @@ -2,6 +2,6 @@ #include "flag_set.hpp" -constexpr std::size_t TR_MAX_TIERS = 7; +constexpr std::size_t TR_MAX_TIERS = 6; typedef flag_set object_flag_set; -- cgit v1.2.3 From cb4f2b62b8b257c98f8306217213e93db65bc115 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 19:51:43 +0200 Subject: Bring Theme/debug.txt up to date with the T2 one --- lib/mods/theme/help/debug.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt index a3a90468..8aea13ee 100644 --- a/lib/mods/theme/help/debug.txt +++ b/lib/mods/theme/help/debug.txt @@ -27,7 +27,7 @@ will not be scored if you use debug commands. *****debug.txt*25[m Magic Mapping] *****debug.txt*26[M Gain corruption] *****debug.txt*27[n Summon named monster] *****debug.txt*28[N Summon _friendly_ named monster] *****debug.txt*29[o Edit object attributes] O (unused) - *****debug.txt*31[p Phase door] *****debug.txt*32[P Panic save] + *****debug.txt*31[p Phase door] P (unused) *****debug.txt*33[q Get a quest] Q (unused) r (unused) R (unused) *****debug.txt*37[s Summon monster] *****debug.txt*38[S Change the feature of the map] @@ -170,9 +170,6 @@ maximal legal value. ~~~~~31 [[[[[GPhase door (p)] Like a Scroll of Phase Door. -~~~~~32 -[[[[[GPanic save (P)] - Save and quit the game, which is the same as doing a ^X. ~~~~~33 [[[[[GGet a quest (q)] Get a quest. -- cgit v1.2.3 From ae6230f01dcdc8176be28fee00a3c36f8f281ec0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 19:55:38 +0200 Subject: Update command.txt to account for trap removal --- lib/help/command.txt | 32 ++++++++++++-------------------- lib/mods/theme/help/command.txt | 32 ++++++++++++-------------------- 2 files changed, 24 insertions(+), 40 deletions(-) diff --git a/lib/help/command.txt b/lib/help/command.txt index d39cc861..11ed1df4 100644 --- a/lib/help/command.txt +++ b/lib/help/command.txt @@ -29,7 +29,7 @@ the game that you wish to do the command multiple times, unless you press a key or are otherwise disturbed. To enter a "repeat count", type '0', followed by the numerical count, followed by the command. You must type "space" before entering certain commands. Skipping the numerical count yields a count of 99. -An option allows certain commands (open, disarm, tunnel, etc) to auto-repeat. +An option allows certain commands (open, tunnel, etc) to auto-repeat. Some commands will prompt for extra information, such as a direction, an inventory or equipment item, a spell, a textual inscription, the symbol of a @@ -88,7 +88,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*1[a Aim a wand] *****command.txt*2[A Activate an artifact] *****command.txt*3[b Browse a book] *****command.txt*4[B Bash a door] *****command.txt*5[c Close a door] *****command.txt*6[C Character description] - *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap] + *****command.txt*7[d Drop an item] D (unused) *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food] *****command.txt*11[f Fire (shoot) an item] *****command.txt*12[F Fuel your lantern/torch] *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills] @@ -149,7 +149,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*45[a Zap a rod (Activate)] *****command.txt*2[A Activate an artifact] *****command.txt*95[b (walk - south west)] *****command.txt*95[B (run - south west)] *****command.txt*5[c Close a door] *****command.txt*6[C Character description] - *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap or chest] + *****command.txt*7[d Drop an item] D (unused) *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food] *****command.txt*4[f Bash a door (force)] *****command.txt*12[F Fuel your lantern/torch] *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills] @@ -265,8 +265,8 @@ ESCAPE which are always ignored as commands in case you type the command just after the count expires. You can tell ToME to automatically use a repeat count of 99 -with commands you normally want to repeat (open, disarm, tunnel, bash, -alter, etc) by setting the "always_repeat" option. +with commands you normally want to repeat (open, tunnel, bash, alter, +etc) by setting the "always_repeat" option. #####R=== Selection of Objects === @@ -471,7 +471,7 @@ plus the "underlying command" key. This is followed by the command name and "roguelike" keyset key, if different from the underlying command key. Then comes a brief description of the command, including information about alternative methods of specifying the command in each keyset, when needed. -Several commands (tunnel, disarm, bash, open) are repeated 99 times if the +Several commands (tunnel, bash, open) are repeated 99 times if the "always_repeat" option is set and no repeat count is given. Some commands use the "repeat count" to automatically repeat the command several times, while others use the "repeat count" as an "argument", for example, commands @@ -651,11 +651,10 @@ for a quantity will convert any "letters" into the maximal legal value. [[[[[GOpen a door or chest (o)] To open an object such as a door or chest, you must use this command. If the object is locked, you will attempt to pick the - lock based on your disarming ability. If you open a trapped chest - without disarming the traps first, the trap will be set off. Some - doors will be jammed shut and may have to be forced open. You may - need several tries to open a door or chest. Open can take a count, - requires a direction, and is affected by the "always_repeat" option. + lock based. Some doors will be jammed shut and may have to be + forced open. You may need several tries to open a door or chest. + Open can take a count, requires a direction, and is affected by + the "always_repeat" option. ~~~~~5 [[[[[GClose a door (c)] Non-intelligent and some other creatures cannot open doors, so @@ -681,19 +680,12 @@ for a quantity will convert any "letters" into the maximal legal value. may permanently break it so that it can never be closed. Bash or Force can take a count, requires a direction, and is affected by the "always_repeat" option. -~~~~~8 -[[[[[GDisarm a trap or chest (D)] - You can attempt to disarm traps on the floor or on chests. If you - fail, there is a chance that you will blunder and set it off. You - can only disarm a trap after you have found it (usually with the - Search command). Disarm can take a count, requires a direction, - and is affected by the "always_repeat" option. ~~~~~63 [[[[[GAlter (+)] This special command allows the use of a single keypress to select any of the "obvious" commands above (attack, tunnel, bash, open, - disarm, close), and, by using macros or keymaps, to combine this - keypress with directions. In general, this allows the use of the + close), and, by using macros or keymaps, to combine this keypress + with directions. In general, this allows the use of the "control" key plus the appropriate "direction" key (including the roguelike direction keys in roguelike mode) as a kind of generic "alter the terrain feature of an adjacent grid" command. Alter diff --git a/lib/mods/theme/help/command.txt b/lib/mods/theme/help/command.txt index d39cc861..11ed1df4 100644 --- a/lib/mods/theme/help/command.txt +++ b/lib/mods/theme/help/command.txt @@ -29,7 +29,7 @@ the game that you wish to do the command multiple times, unless you press a key or are otherwise disturbed. To enter a "repeat count", type '0', followed by the numerical count, followed by the command. You must type "space" before entering certain commands. Skipping the numerical count yields a count of 99. -An option allows certain commands (open, disarm, tunnel, etc) to auto-repeat. +An option allows certain commands (open, tunnel, etc) to auto-repeat. Some commands will prompt for extra information, such as a direction, an inventory or equipment item, a spell, a textual inscription, the symbol of a @@ -88,7 +88,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*1[a Aim a wand] *****command.txt*2[A Activate an artifact] *****command.txt*3[b Browse a book] *****command.txt*4[B Bash a door] *****command.txt*5[c Close a door] *****command.txt*6[C Character description] - *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap] + *****command.txt*7[d Drop an item] D (unused) *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food] *****command.txt*11[f Fire (shoot) an item] *****command.txt*12[F Fuel your lantern/torch] *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills] @@ -149,7 +149,7 @@ that you can always, for example, use "\" + "." + "6", to specify "run east". *****command.txt*45[a Zap a rod (Activate)] *****command.txt*2[A Activate an artifact] *****command.txt*95[b (walk - south west)] *****command.txt*95[B (run - south west)] *****command.txt*5[c Close a door] *****command.txt*6[C Character description] - *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap or chest] + *****command.txt*7[d Drop an item] D (unused) *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food] *****command.txt*4[f Bash a door (force)] *****command.txt*12[F Fuel your lantern/torch] *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills] @@ -265,8 +265,8 @@ ESCAPE which are always ignored as commands in case you type the command just after the count expires. You can tell ToME to automatically use a repeat count of 99 -with commands you normally want to repeat (open, disarm, tunnel, bash, -alter, etc) by setting the "always_repeat" option. +with commands you normally want to repeat (open, tunnel, bash, alter, +etc) by setting the "always_repeat" option. #####R=== Selection of Objects === @@ -471,7 +471,7 @@ plus the "underlying command" key. This is followed by the command name and "roguelike" keyset key, if different from the underlying command key. Then comes a brief description of the command, including information about alternative methods of specifying the command in each keyset, when needed. -Several commands (tunnel, disarm, bash, open) are repeated 99 times if the +Several commands (tunnel, bash, open) are repeated 99 times if the "always_repeat" option is set and no repeat count is given. Some commands use the "repeat count" to automatically repeat the command several times, while others use the "repeat count" as an "argument", for example, commands @@ -651,11 +651,10 @@ for a quantity will convert any "letters" into the maximal legal value. [[[[[GOpen a door or chest (o)] To open an object such as a door or chest, you must use this command. If the object is locked, you will attempt to pick the - lock based on your disarming ability. If you open a trapped chest - without disarming the traps first, the trap will be set off. Some - doors will be jammed shut and may have to be forced open. You may - need several tries to open a door or chest. Open can take a count, - requires a direction, and is affected by the "always_repeat" option. + lock based. Some doors will be jammed shut and may have to be + forced open. You may need several tries to open a door or chest. + Open can take a count, requires a direction, and is affected by + the "always_repeat" option. ~~~~~5 [[[[[GClose a door (c)] Non-intelligent and some other creatures cannot open doors, so @@ -681,19 +680,12 @@ for a quantity will convert any "letters" into the maximal legal value. may permanently break it so that it can never be closed. Bash or Force can take a count, requires a direction, and is affected by the "always_repeat" option. -~~~~~8 -[[[[[GDisarm a trap or chest (D)] - You can attempt to disarm traps on the floor or on chests. If you - fail, there is a chance that you will blunder and set it off. You - can only disarm a trap after you have found it (usually with the - Search command). Disarm can take a count, requires a direction, - and is affected by the "always_repeat" option. ~~~~~63 [[[[[GAlter (+)] This special command allows the use of a single keypress to select any of the "obvious" commands above (attack, tunnel, bash, open, - disarm, close), and, by using macros or keymaps, to combine this - keypress with directions. In general, this allows the use of the + close), and, by using macros or keymaps, to combine this keypress + with directions. In general, this allows the use of the "control" key plus the appropriate "direction" key (including the roguelike direction keys in roguelike mode) as a kind of generic "alter the terrain feature of an adjacent grid" command. Alter -- cgit v1.2.3 From 6f43a6183752fed5dda1e5adebb23d0845cbd8c4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 19:59:07 +0200 Subject: Add missing 'static' --- src/cmd1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd1.cc b/src/cmd1.cc index b2843327..564fa055 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -449,7 +449,7 @@ void carry(int pickup) } -void touch_zap_player(monster_type *m_ptr) +static void touch_zap_player(monster_type *m_ptr) { auto r_ptr = m_ptr->race(); -- cgit v1.2.3 From b3d136333c1b516123cc83e3dc96d4bd79dd52ca Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Oct 2016 20:01:12 +0200 Subject: Fix indentation --- src/cave.cc | 80 +++++++++++++------------- src/melee2.cc | 174 ++++++++++++++++++++++++++++----------------------------- src/object1.cc | 168 +++++++++++++++++++++++++++---------------------------- 3 files changed, 207 insertions(+), 215 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 66e274f1..1ef32839 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -1044,33 +1044,31 @@ static void map_info(int y, int x, byte *ap, char *cp) /**** Layer 2 -- Objects ****/ + for (auto const o_idx: c_ptr->o_idxs) { - for (auto const o_idx: c_ptr->o_idxs) - { - /* Acquire object */ - object_type *o_ptr = &o_list[o_idx]; + /* Acquire object */ + object_type *o_ptr = &o_list[o_idx]; - /* Memorized objects */ - if (o_ptr->marked) - { - /* Normal char */ - *cp = object_char(o_ptr); + /* Memorized objects */ + if (o_ptr->marked) + { + /* Normal char */ + *cp = object_char(o_ptr); - /* Normal attr */ - *ap = object_attr(o_ptr); + /* Normal attr */ + *ap = object_attr(o_ptr); - /* Multi-hued attr */ - if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) - { - *ap = get_shimmer_color(); - } + /* Multi-hued attr */ + if (!options->avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) + { + *ap = get_shimmer_color(); + } - /* Hack -- hallucination */ - if (p_ptr->image) image_object(ap, cp); + /* Hack -- hallucination */ + if (p_ptr->image) image_object(ap, cp); - /* Done */ - break; - } + /* Done */ + break; } } @@ -1436,33 +1434,31 @@ void map_info_default(int y, int x, byte *ap, char *cp) /**** Layer 2 -- Objects ****/ + for (auto const this_o_idx: c_ptr->o_idxs) { - for (auto const this_o_idx: c_ptr->o_idxs) - { - /* Acquire object */ - object_type *o_ptr = &o_list[this_o_idx]; + /* Acquire object */ + object_type *o_ptr = &o_list[this_o_idx]; - /* Memorized objects */ - if (o_ptr->marked) - { - /* Normal char */ - *cp = object_char_default(o_ptr); + /* Memorized objects */ + if (o_ptr->marked) + { + /* Normal char */ + *cp = object_char_default(o_ptr); - /* Normal attr */ - *ap = object_attr_default(o_ptr); + /* Normal attr */ + *ap = object_attr_default(o_ptr); - /* Multi-hued attr */ - if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) - { - *ap = get_shimmer_color(); - } + /* Multi-hued attr */ + if (!avoid_other && (k_info[o_ptr->k_idx].flags & TR_ATTR_MULTI)) + { + *ap = get_shimmer_color(); + } - /* Hack -- hallucination */ - if (p_ptr->image) image_object(ap, cp); + /* Hack -- hallucination */ + if (p_ptr->image) image_object(ap, cp); - /* Done */ - break; - } + /* Done */ + break; } } diff --git a/src/melee2.cc b/src/melee2.cc index df9ee6d3..691021a5 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -6136,116 +6136,114 @@ static void process_monster(int m_idx, bool_ is_frien) } + /* Copy list of objects; we need a copy because we're mutating the list. */ + auto const object_idxs(c_ptr->o_idxs); + + /* Scan all objects in the grid */ + for (auto const this_o_idx: object_idxs) { - /* Copy list of objects; we need a copy because we're mutating the list. */ - auto const object_idxs(c_ptr->o_idxs); + /* Acquire object */ + object_type * o_ptr = &o_list[this_o_idx]; + + /* Skip gold */ + if (o_ptr->tval == TV_GOLD) continue; + + /* Incarnate ? */ + if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_POSSESSOR) && + ((o_ptr->sval == SV_CORPSE_CORPSE) || (o_ptr->sval == SV_CORPSE_SKELETON))) + { + if (ai_possessor(m_idx, this_o_idx)) return; + } - /* Scan all objects in the grid */ - for (auto const this_o_idx: object_idxs) + /* Take or Kill objects on the floor */ + /* rr9: Pets will no longer pick up/destroy items */ + if ((((r_ptr->flags & RF_TAKE_ITEM) && + ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) || + (r_ptr->flags & RF_KILL_ITEM)) && + (is_friend(m_ptr) <= 0)) { - /* Acquire object */ - object_type * o_ptr = &o_list[this_o_idx]; + char m_name[80]; + char o_name[80]; - /* Skip gold */ - if (o_ptr->tval == TV_GOLD) continue; + /* Extract some flags */ + auto const flags = object_flags(o_ptr); - /* Incarnate ? */ - if ((o_ptr->tval == TV_CORPSE) && (r_ptr->flags & RF_POSSESSOR) && - ((o_ptr->sval == SV_CORPSE_CORPSE) || (o_ptr->sval == SV_CORPSE_SKELETON))) - { - if (ai_possessor(m_idx, this_o_idx)) return; - } + /* Acquire the object name */ + object_desc(o_name, o_ptr, TRUE, 3); - /* Take or Kill objects on the floor */ - /* rr9: Pets will no longer pick up/destroy items */ - if ((((r_ptr->flags & RF_TAKE_ITEM) && - ((is_friend(m_ptr) <= 0) || p_ptr->pet_pickup_items)) || - (r_ptr->flags & RF_KILL_ITEM)) && - (is_friend(m_ptr) <= 0)) + /* Acquire the monster name */ + monster_desc(m_name, m_ptr, 0x04); + + /* React to objects that hurt the monster */ + monster_race_flag_set flg; + if (flags & TR_KILL_DEMON) flg |= RF_DEMON; + if (flags & TR_KILL_UNDEAD) flg |= RF_UNDEAD; + if (flags & TR_SLAY_DRAGON) flg |= RF_DRAGON; + if (flags & TR_SLAY_TROLL) flg |= RF_TROLL; + if (flags & TR_SLAY_GIANT) flg |= RF_GIANT; + if (flags & TR_SLAY_ORC) flg |= RF_ORC; + if (flags & TR_SLAY_DEMON) flg |= RF_DEMON; + if (flags & TR_SLAY_UNDEAD) flg |= RF_UNDEAD; + if (flags & TR_SLAY_ANIMAL) flg |= RF_ANIMAL; + if (flags & TR_SLAY_EVIL) flg |= RF_EVIL; + + /* The object cannot be picked up by the monster */ + if (artifact_p(o_ptr) || (r_ptr->flags & flg)) { - char m_name[80]; - char o_name[80]; - - /* Extract some flags */ - auto const flags = object_flags(o_ptr); - - /* Acquire the object name */ - object_desc(o_name, o_ptr, TRUE, 3); - - /* Acquire the monster name */ - monster_desc(m_name, m_ptr, 0x04); - - /* React to objects that hurt the monster */ - monster_race_flag_set flg; - if (flags & TR_KILL_DEMON) flg |= RF_DEMON; - if (flags & TR_KILL_UNDEAD) flg |= RF_UNDEAD; - if (flags & TR_SLAY_DRAGON) flg |= RF_DRAGON; - if (flags & TR_SLAY_TROLL) flg |= RF_TROLL; - if (flags & TR_SLAY_GIANT) flg |= RF_GIANT; - if (flags & TR_SLAY_ORC) flg |= RF_ORC; - if (flags & TR_SLAY_DEMON) flg |= RF_DEMON; - if (flags & TR_SLAY_UNDEAD) flg |= RF_UNDEAD; - if (flags & TR_SLAY_ANIMAL) flg |= RF_ANIMAL; - if (flags & TR_SLAY_EVIL) flg |= RF_EVIL; - - /* The object cannot be picked up by the monster */ - if (artifact_p(o_ptr) || (r_ptr->flags & flg)) + /* Only give a message for "take_item" */ + if (r_ptr->flags & RF_TAKE_ITEM) { - /* Only give a message for "take_item" */ - if (r_ptr->flags & RF_TAKE_ITEM) + /* Describe observable situations */ + if (m_ptr->ml && player_has_los_bold(ny, nx)) { - /* Describe observable situations */ - if (m_ptr->ml && player_has_los_bold(ny, nx)) - { - /* Dump a message */ - msg_format("%^s tries to pick up %s, but fails.", - m_name, o_name); - } + /* Dump a message */ + msg_format("%^s tries to pick up %s, but fails.", + m_name, o_name); } } + } - /* Pick up the item */ - else if (r_ptr->flags & RF_TAKE_ITEM) + /* Pick up the item */ + else if (r_ptr->flags & RF_TAKE_ITEM) + { + /* Describe observable situations */ + if (player_has_los_bold(ny, nx)) { - /* Describe observable situations */ - if (player_has_los_bold(ny, nx)) - { - /* Dump a message */ - msg_format("%^s picks up %s.", m_name, o_name); - } + /* Dump a message */ + msg_format("%^s picks up %s.", m_name, o_name); + } - /* Put into inventory of monster */ - { - /* Excise the object */ - excise_object_idx(this_o_idx); + /* Put into inventory of monster */ + { + /* Excise the object */ + excise_object_idx(this_o_idx); - /* Forget mark */ - o_ptr->marked = FALSE; + /* Forget mark */ + o_ptr->marked = FALSE; - /* Forget location */ - o_ptr->iy = o_ptr->ix = 0; + /* Forget location */ + o_ptr->iy = o_ptr->ix = 0; - /* Memorize monster */ - o_ptr->held_m_idx = m_idx; + /* Memorize monster */ + o_ptr->held_m_idx = m_idx; - /* Carry object */ - m_ptr->hold_o_idxs.push_back(this_o_idx); - } + /* Carry object */ + m_ptr->hold_o_idxs.push_back(this_o_idx); } + } - /* Destroy the item */ - else + /* Destroy the item */ + else + { + /* Describe observable situations */ + if (player_has_los_bold(ny, nx)) { - /* Describe observable situations */ - if (player_has_los_bold(ny, nx)) - { - /* Dump a message */ - msg_format("%^s crushes %s.", m_name, o_name); - } - - /* Delete the object */ - delete_object_idx(this_o_idx); + /* Dump a message */ + msg_format("%^s crushes %s.", m_name, o_name); } + + /* Delete the object */ + delete_object_idx(this_o_idx); } } } diff --git a/src/object1.cc b/src/object1.cc index e81c5742..7a9f7543 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2876,101 +2876,99 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait text_out("It makes you invisible. "); } + vn = 0; + if (flags & TR_SUST_STR) { - vn = 0; - if (flags & TR_SUST_STR) - { - vp[vn++] = "strength"; - } - if (flags & TR_SUST_INT) - { - vp[vn++] = "intelligence"; - } - if (flags & TR_SUST_WIS) - { - vp[vn++] = "wisdom"; - } - if (flags & TR_SUST_DEX) - { - vp[vn++] = "dexterity"; - } - if (flags & TR_SUST_CON) - { - vp[vn++] = "constitution"; - } - if (flags & TR_SUST_CHR) - { - vp[vn++] = "charisma"; - } - /* Describe */ - if (vn) - { - int i; + vp[vn++] = "strength"; + } + if (flags & TR_SUST_INT) + { + vp[vn++] = "intelligence"; + } + if (flags & TR_SUST_WIS) + { + vp[vn++] = "wisdom"; + } + if (flags & TR_SUST_DEX) + { + vp[vn++] = "dexterity"; + } + if (flags & TR_SUST_CON) + { + vp[vn++] = "constitution"; + } + if (flags & TR_SUST_CHR) + { + vp[vn++] = "charisma"; + } + /* Describe */ + if (vn) + { + int i; - /* Intro */ - text_out("It sustains "); + /* Intro */ + text_out("It sustains "); - /* List */ - for (i = 0; i < vn; i++) - { - /* Connectives */ - if (i == 0) text_out("your "); - else if (i < (vn - 1)) text_out(", "); - else text_out(" and "); + /* List */ + for (i = 0; i < vn; i++) + { + /* Connectives */ + if (i == 0) text_out("your "); + else if (i < (vn - 1)) text_out(", "); + else text_out(" and "); - /* Dump the stat */ - text_out(vp[i]); - } - text_out(". "); + /* Dump the stat */ + text_out(vp[i]); } + text_out(". "); + } - vn = 0; - if (flags & TR_IM_ACID) - { - vc[vn] = TERM_GREEN; - vp[vn++] = "acid"; - } - if (flags & TR_IM_ELEC) - { - vc[vn] = TERM_L_BLUE; - vp[vn++] = "electricity"; - } - if (flags & TR_IM_FIRE) - { - vc[vn] = TERM_RED; - vp[vn++] = "fire"; - } - if (flags & TR_IM_COLD) - { - vc[vn] = TERM_L_WHITE; - vp[vn++] = "cold"; - } - if (flags & TR_IM_NETHER) - { - vc[vn] = TERM_L_GREEN; - vp[vn++] = "nether"; - } - /* Describe */ - if (vn) - { - int i; + vn = 0; + if (flags & TR_IM_ACID) + { + vc[vn] = TERM_GREEN; + vp[vn++] = "acid"; + } + if (flags & TR_IM_ELEC) + { + vc[vn] = TERM_L_BLUE; + vp[vn++] = "electricity"; + } + if (flags & TR_IM_FIRE) + { + vc[vn] = TERM_RED; + vp[vn++] = "fire"; + } + if (flags & TR_IM_COLD) + { + vc[vn] = TERM_L_WHITE; + vp[vn++] = "cold"; + } + if (flags & TR_IM_NETHER) + { + vc[vn] = TERM_L_GREEN; + vp[vn++] = "nether"; + } + /* Describe */ + if (vn) + { + int i; - /* Intro */ - text_out("It provides immunity "); + /* Intro */ + text_out("It provides immunity "); - /* List */ - for (i = 0; i < vn; i++) - { - /* Connectives */ - if (i == 0) text_out("to "); - else if (i < (vn - 1)) text_out(", "); - else text_out(" and "); + /* List */ + for (i = 0; i < vn; i++) + { + /* Connectives */ + if (i == 0) text_out("to "); + else if (i < (vn - 1)) text_out(", "); + else text_out(" and "); - /* Dump the stat */ - text_out_c(vc[i], vp[i]); - } - text_out(". "); + /* Dump the stat */ + text_out_c(vc[i], vp[i]); } + text_out(". "); } if (flags & TR_FREE_ACT) -- cgit v1.2.3 From 1bbec92ffb269156c2a3e32b25072eab572502ef Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 6 Oct 2016 07:47:56 +0200 Subject: Fix out-of-bounds accesses to set_info --- src/object1.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/object1.cc b/src/object1.cc index 7a9f7543..8f1e5905 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -6058,10 +6058,10 @@ bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent) auto &set_info = game->edit_data.set_info; auto const &a_info = game->edit_data.a_info; - auto s_ptr = &set_info[set_idx]; - if ( -1 == a_info[a_idx].set) return (FALSE); + auto s_ptr = &set_info[set_idx]; + int i; for (i = 0; i < s_ptr->num; i++) { @@ -6094,10 +6094,10 @@ bool_ takeoff_set(s16b a_idx, s16b set_idx) auto &set_info = game->edit_data.set_info; auto const &a_info = game->edit_data.a_info; - auto s_ptr = &set_info[set_idx]; - if ( -1 == a_info[a_idx].set) return (FALSE); + auto s_ptr = &set_info[set_idx]; + int i; for (i = 0; i < s_ptr->num; i++) { @@ -6130,13 +6130,13 @@ void apply_set(s16b a_idx, s16b set_idx) auto const &set_info = game->edit_data.set_info; auto const &a_info = game->edit_data.a_info; - auto s_ptr = &set_info[set_idx]; - if ( -1 == a_info[a_idx].set) { return; } + auto s_ptr = &set_info[set_idx]; + int i; for (i = 0; i < s_ptr->num; i++) { -- cgit v1.2.3 From 098474f6bf60cd0743c9c942324521f672c0eb10 Mon Sep 17 00:00:00 2001 From: Elmo Todurov Date: Thu, 6 Oct 2016 03:02:11 +0300 Subject: Fixed reading character history --- src/birth.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/birth.cc b/src/birth.cc index c6e1d922..75d533ab 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -556,6 +556,7 @@ static void get_history(void) /* Acquire the textual history */ strcat(buf, bg[i].info.c_str()); + strcat(buf, " "); /* Enter the next chart */ chart = bg[i].next; -- cgit v1.2.3 From ec9527e2f0c4394f8c2acede78c81e90421b4b09 Mon Sep 17 00:00:00 2001 From: Elmo Todurov Date: Thu, 6 Oct 2016 03:02:30 +0300 Subject: Added missing #includes --- src/dungeon_info_type.hpp | 1 + src/skills.hpp | 2 ++ src/wizard2.hpp | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/dungeon_info_type.hpp b/src/dungeon_info_type.hpp index 324a32bd..2f8fefde 100644 --- a/src/dungeon_info_type.hpp +++ b/src/dungeon_info_type.hpp @@ -6,6 +6,7 @@ #include "dungeon_flag_set.hpp" #include +#include /** * Maximum number of towns per dungeon diff --git a/src/skills.hpp b/src/skills.hpp index 694b29e9..4872d448 100644 --- a/src/skills.hpp +++ b/src/skills.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include + /* Skill functions */ extern void dump_skills(FILE *fff); extern s16b find_skill(cptr name); diff --git a/src/wizard2.hpp b/src/wizard2.hpp index 161eb26d..d1061d45 100644 --- a/src/wizard2.hpp +++ b/src/wizard2.hpp @@ -2,6 +2,8 @@ #include "h-basic.h" +#include + extern void do_cmd_rerate(void); extern void do_cmd_wiz_cure_all(void); extern void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp); -- cgit v1.2.3 From 9b927dc7e085c22c5e54c4c03be9ff0d32d04622 Mon Sep 17 00:00:00 2001 From: Elmo Todurov Date: Thu, 6 Oct 2016 03:02:48 +0300 Subject: Removed a spurious __cxx11 --- src/help.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/help.cc b/src/help.cc index 7af521a9..2c5da549 100644 --- a/src/help.cc +++ b/src/help.cc @@ -711,7 +711,7 @@ void help_god(cptr god) } } -void help_skill(const std::__cxx11::string &skill) +void help_skill(const std::string &skill) { show_context_help(find_context_help(skill_table, skill.c_str())); } -- cgit v1.2.3 From 9682d1dacbb60b81721cd943703fa485a50172ac Mon Sep 17 00:00:00 2001 From: Elmo Todurov Date: Thu, 6 Oct 2016 15:30:36 +0300 Subject: Add Vim swap files to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3870f443..bcdff3c7 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ compile_commands.json /nbproject /build tome2.cbp +*.swp -- cgit v1.2.3 From d7b410ad837f6d5965c8309b2d55362812d37fa9 Mon Sep 17 00:00:00 2001 From: Elmo Todurov Date: Thu, 6 Oct 2016 15:30:58 +0300 Subject: Fix debug item creation menu --- src/wizard2.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wizard2.cc b/src/wizard2.cc index 0c431066..e5b5d3d3 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -585,7 +585,7 @@ static int wiz_create_itemtype(void) std::vector choice; choice.reserve(60); std::size_t i; - for (num = 0, i = 1; (choice.size() < 60) && (i < k_info.size()); i++) + for (i = 1; (choice.size() < 60) && (i < k_info.size()); i++) { auto k_ptr = &k_info[i]; @@ -599,7 +599,7 @@ static int wiz_create_itemtype(void) strip_name(buf, k_ptr); /* Print it */ - wci_string(buf, num); + wci_string(buf, choice.size()); /* Remember the object index */ choice.push_back(i); -- cgit v1.2.3 From e2f33131dfed23435a7915daa57b1ddf05c5f898 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove traps from maps and levels --- lib/edit/between.map | 8 ++-- lib/edit/evil.map | 6 +-- lib/edit/maeglin.map | 4 +- lib/edit/nirnaeth.map | 16 ++++---- lib/edit/numenor.txt | 2 +- lib/edit/qrand1.map | 3 -- lib/edit/qrand10.map | 13 +++---- lib/edit/qrand11.map | 3 -- lib/edit/qrand12.map | 3 -- lib/edit/qrand14.map | 3 -- lib/edit/qrand6.map | 3 -- lib/edit/qrand7.map | 13 +++---- lib/edit/s_crypt.map | 36 +++++++++--------- lib/edit/s_doom.map | 40 +++++++++----------- lib/edit/s_factory.map | 67 ++++++++++++++++----------------- lib/edit/s_gates.map | 44 +++++++++++----------- lib/edit/s_name.map | 78 +++++++++++++++++++-------------------- lib/edit/s_ship.map | 73 ++++++++++++++++-------------------- lib/edit/special.txt | 23 +++++------- lib/edit/spiders.map | 4 +- lib/edit/t_bree.txt | 20 +++++----- lib/edit/t_gondol.txt | 44 +++++++++++----------- lib/edit/t_khazad.txt | 14 +++---- lib/edit/t_lorien.txt | 32 ++++++++-------- lib/edit/t_minas.txt | 34 ++++++++--------- lib/edit/t_pref.txt | 30 +++++++-------- lib/edit/thieves.map | 10 ++--- lib/edit/thrain.map | 17 ++++----- lib/edit/trolls.map | 10 ++--- lib/edit/volcano.txt | 4 +- lib/edit/wights.map | 24 ++++++------ lib/mods/theme/edit/between.map | 8 ++-- lib/mods/theme/edit/evil.map | 6 +-- lib/mods/theme/edit/maeglin.map | 4 +- lib/mods/theme/edit/nirnaeth.map | 16 ++++---- lib/mods/theme/edit/numenor.txt | 2 +- lib/mods/theme/edit/qrand1.map | 3 -- lib/mods/theme/edit/qrand10.map | 13 +++---- lib/mods/theme/edit/qrand11.map | 3 -- lib/mods/theme/edit/qrand12.map | 3 -- lib/mods/theme/edit/qrand14.map | 3 -- lib/mods/theme/edit/qrand6.map | 3 -- lib/mods/theme/edit/qrand7.map | 13 +++---- lib/mods/theme/edit/s_bilbo.map | 37 +++++++++---------- lib/mods/theme/edit/s_crypt.map | 36 +++++++++--------- lib/mods/theme/edit/s_doom.map | 40 +++++++++----------- lib/mods/theme/edit/s_factory.map | 67 ++++++++++++++++----------------- lib/mods/theme/edit/s_gates.map | 44 +++++++++++----------- lib/mods/theme/edit/s_name.map | 78 +++++++++++++++++++-------------------- lib/mods/theme/edit/s_orthanc.map | 78 +++++++++++++++++++-------------------- lib/mods/theme/edit/s_ship.map | 73 ++++++++++++++++-------------------- lib/mods/theme/edit/special.txt | 23 +++++------- lib/mods/theme/edit/spiders.map | 4 +- lib/mods/theme/edit/t_beorn.txt | 6 +-- lib/mods/theme/edit/t_bree.txt | 26 ++++++------- lib/mods/theme/edit/t_dale.txt | 6 +-- lib/mods/theme/edit/t_edoras.txt | 24 ++++++------ lib/mods/theme/edit/t_esga.txt | 10 ++--- lib/mods/theme/edit/t_gondol.txt | 44 +++++++++++----------- lib/mods/theme/edit/t_helm.txt | 2 +- lib/mods/theme/edit/t_henn.txt | 6 +-- lib/mods/theme/edit/t_hobb.txt | 8 ++-- lib/mods/theme/edit/t_imlad.txt | 6 +-- lib/mods/theme/edit/t_khazad.txt | 20 +++++----- lib/mods/theme/edit/t_lorien.txt | 38 +++++++++---------- lib/mods/theme/edit/t_minas.txt | 34 ++++++++--------- lib/mods/theme/edit/t_osgili.txt | 24 ++++++------ lib/mods/theme/edit/t_pelar.txt | 16 ++++---- lib/mods/theme/edit/t_pref.txt | 30 +++++++-------- lib/mods/theme/edit/t_thrand.txt | 12 +++--- lib/mods/theme/edit/thieves.map | 6 +-- lib/mods/theme/edit/thrain.map | 17 ++++----- lib/mods/theme/edit/trolls.map | 10 ++--- lib/mods/theme/edit/volcano.txt | 4 +- lib/mods/theme/edit/wights.map | 24 ++++++------ src/init1.cc | 71 +++++++---------------------------- 76 files changed, 770 insertions(+), 912 deletions(-) diff --git a/lib/edit/between.map b/lib/edit/between.map index 1458cdb7..d522799f 100644 --- a/lib/edit/between.map +++ b/lib/edit/between.map @@ -23,16 +23,16 @@ F:G:89:5:955 F:L:89:5:956 # Floor with grass with a brown thunderlord -F:B:89:5:957:0:0:0:0:0:0:2 +F:B:89:5:957:0:0:0:0:0:2 # Floor with grass with a bronze thunderlord -F:z:89:5:958:0:0:0:0:0:0:2 +F:z:89:5:958:0:0:0:0:0:2 # Floor with dirt with a bronze thunderlord -F:Z:88:5:958:0:0:0:0:0:0:2 +F:Z:88:5:958:0:0:0:0:0:2 # Floor with dirt with a gold thunderlord -F:D:88:5:959:0:0:0:0:0:0:2 +F:D:88:5:959:0:0:0:0:0:2 D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:X..T.TT..T...T...T...T.....T....T......T...T.,,.....T......T....T...T.T..T..TT...T..T.TT.T.TT.TX diff --git a/lib/edit/evil.map b/lib/edit/evil.map index a2f00914..aff2de9b 100644 --- a/lib/edit/evil.map +++ b/lib/edit/evil.map @@ -14,13 +14,13 @@ F:<:6:0 F:.:88:0 # Lesser Balrog -F:b:88:0:996:0:0:0:0:0:0:2 +F:b:88:0:996:0:0:0:0:0:2 # Greater Balrog -F:B:88:0:807:0:0:0:0:0:0:2 +F:B:88:0:807:0:0:0:0:0:2 # Pit Fiend -F:P:88:0:812:0:0:0:0:0:0:2 +F:P:88:0:812:0:0:0:0:0:2 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/edit/maeglin.map b/lib/edit/maeglin.map index e3be9972..7916fd9b 100644 --- a/lib/edit/maeglin.map +++ b/lib/edit/maeglin.map @@ -11,7 +11,7 @@ F:X:63:3 F:<:172:3 # up stairs with maeglin -F:{:6:3:825:0:0:0:0:0:0:2 +F:{:6:3:825:0:0:0:0:0:2 # Floor with dirt F:.:88:5 @@ -56,7 +56,7 @@ F:R:88:5:644 F:O:88:5:645 # Floor with dirt with a Lesser Balrog -F:U:88:5:996:0:0:0:0:0:0:2 +F:U:88:5:996:0:0:0:0:0:2 # Granite wall F:#:56:5 diff --git a/lib/edit/nirnaeth.map b/lib/edit/nirnaeth.map index a8c06999..3ad0789c 100644 --- a/lib/edit/nirnaeth.map +++ b/lib/edit/nirnaeth.map @@ -14,28 +14,28 @@ F:s:88:5 F:V:84:5 # Dirt with Olog -F:a:88:5:538:0:0:0:0:0:0:2 +F:a:88:5:538:0:0:0:0:0:2 # Dirt with Cave Troll -F:b:88:5:496:0:0:0:0:0:0:2 +F:b:88:5:496:0:0:0:0:0:2 # Dirt with with Eldrak -F:c:88:1:620:0:0:0:0:0:0:2 +F:c:88:1:620:0:0:0:0:0:2 # Dirt with with Ettin -F:e:88:1:621:0:0:0:0:0:0:2 +F:e:88:1:621:0:0:0:0:0:2 # Dirt with with War troll -F:f:88:1:631:0:0:0:0:0:0:2 +F:f:88:1:631:0:0:0:0:0:2 # Dirt with with Hru -F:g:88:1:709:0:0:0:0:0:0:2 +F:g:88:1:709:0:0:0:0:0:2 # Dirt with Ulik the Troll -F:h:88:5:729:0:0:0:0:0:0:2 +F:h:88:5:729:0:0:0:0:0:2 # Dirt with Ancient green dragon -F:i:88:5:618:0:0:0:0:0:0:2 +F:i:88:5:618:0:0:0:0:0:2 # Dungeon D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/edit/numenor.txt b/lib/edit/numenor.txt index ec8621b1..0ca52738 100644 --- a/lib/edit/numenor.txt +++ b/lib/edit/numenor.txt @@ -1,7 +1,7 @@ # File: numenor.txt # Way to the lost land of Numenor -F:>:7:3:0:0:0:0:0:7 +F:>:7:3:0:0:0:0:7 ############### Town Layout ############### diff --git a/lib/edit/qrand1.map b/lib/edit/qrand1.map index f42cbf1c..041e221c 100644 --- a/lib/edit/qrand1.map +++ b/lib/edit/qrand1.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep lava F:F:85:12 diff --git a/lib/edit/qrand10.map b/lib/edit/qrand10.map index ae45b9cb..cfe57e16 100644 --- a/lib/edit/qrand10.map +++ b/lib/edit/qrand10.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:2056:0:0:0:0:* - # Deep lava F:F:85:12 @@ -26,11 +23,11 @@ F:F:85:12 D: D: xxxxxxx D: xFFFFFx -D: xxxxxx,t.ttxxxx -D: xFFG,t....t,,,xxx -D: xFpG.......t.t.DD -D: xFFG,t....t,,,xxx -D: xxxxxx,t.ttxxxx +D: xxxxxx,....xxxx +D: xFFG,......,,,xxx +D: xFpG...........DD +D: xFFG,......,,,xxx +D: xxxxxx,....xxxx D: xFFFFFx D: xxxxxxx D: diff --git a/lib/edit/qrand11.map b/lib/edit/qrand11.map index 4af3c266..67d5258a 100644 --- a/lib/edit/qrand11.map +++ b/lib/edit/qrand11.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep lava F:L:85:6 diff --git a/lib/edit/qrand12.map b/lib/edit/qrand12.map index 4621ef0b..f24a7927 100644 --- a/lib/edit/qrand12.map +++ b/lib/edit/qrand12.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:187:6 diff --git a/lib/edit/qrand14.map b/lib/edit/qrand14.map index 9f339db0..ee6e8975 100644 --- a/lib/edit/qrand14.map +++ b/lib/edit/qrand14.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 diff --git a/lib/edit/qrand6.map b/lib/edit/qrand6.map index 3b55e985..407a9083 100644 --- a/lib/edit/qrand6.map +++ b/lib/edit/qrand6.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 diff --git a/lib/edit/qrand7.map b/lib/edit/qrand7.map index a7c0607f..4da79778 100644 --- a/lib/edit/qrand7.map +++ b/lib/edit/qrand7.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 @@ -26,10 +23,10 @@ F:W:84:6 F:w:187:6 # Dungeon wayout -D:ttttt -D:tGGGt ,x, -D:tGpGt x,x -D:tGGGt ,x, -D:ttttt +D: +D: GGG ,x, +D: GpG x,x +D: GGG ,x, +D: D: ,x, D: diff --git a/lib/edit/s_crypt.map b/lib/edit/s_crypt.map index 3d6ce71c..e6600cd6 100644 --- a/lib/edit/s_crypt.map +++ b/lib/edit/s_crypt.map @@ -67,30 +67,30 @@ D:X.%%@=-=-X99X.....X..XLL..X%X..LLX..XhVV..X99X=-=-..GGX D:X%%@@...XXX9XX....XX.XX...X.X...XX.XXVVVVXX9XXX=-=.XGGX D:X@@@....X8X-=XgggggX..X..dX4Xd..X..XWWWWWX-=X8X-=-.XGGX D:X......XX%XX=XXgddgXX.XX8GXXXG8XX.XXWWWWXX-XX%XX...XGGX -D:XIXIXXIX*X=X-=XgddggX..X8G^.^G8X..XWWWWWX-=X.X.X&&&XGGX -D:XXXIXIXX*X-XX=XXggggXX.XXG^.^GXX.XXWWWWXX-XX.X.XX&&XGGX -D:XXXXXIX**X=-X=-XIIXXXX..XG^.^GX..XVWWWVX=-XX.XddX@@XGGX -D:X^^^^XX**X=-XX=XXIXIIXX.XX^.^XX.XXVVVVXX-XX%.XedXX@XGGX -D:X^^f^Xe**X%%.X=-XXIXXIXbbX^.^XbbX.VV.XX=-XbX.XXXIX@IIGX -D:X^^^XXe..X...XX=-XXXIXXXbXX.XXbXX...XX=-XXbX.XaaaXXXIGX -D:X^^XXbbb.XGGG.XX=-XXIIXXbbXDXbbX...XX=-XXbbX.XaaaaXXIGX -D:X^XXcbab.XVdG.cXX=-XXXIXXabXbaXX.XXX=-XXbbbX.XaaaaaXXfX +D:XIXIXXIX*X=X-=XgddggX..X8G...G8X..XWWWWWX-=X.X.X&&&XGGX +D:XXXIXIXX*X-XX=XXggggXX.XXG...GXX.XXWWWWXX-XX.X.XX&&XGGX +D:XXXXXIX**X=-X=-XIIXXXX..XG...GX..XVWWWVX=-XX.XddX@@XGGX +D:X....XX**X=-XX=XXIXIIXX.XX...XX.XXVVVVXX-XX%.XedXX@XGGX +D:X..f.Xe**X%%.X=-XXIXXIXbbX...XbbX.VV.XX=-XbX.XXXIX@IIGX +D:X...XXe..X...XX=-XXXIXXXbXX.XXbXX...XX=-XXbX.XaaaXXXIGX +D:X..XXbbb.XGGG.XX=-XXIIXXbbXDXbbX...XX=-XXbbX.XaaaaXXIGX +D:X.XXcbab.XVdG.cXX=-XXXIXXabXbaXX.XXX=-XXbbbX.XaaaaaXXfX D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X D:XX.bababa%eWG.%.BXXXbcbbbbX.XbbbbcbXXXC...fX.%.......XX D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X D:X8XXcbab.XVdG.cXX=-XXX.XXabXbaXXLXXX=-XXbbbX.XaaaaaXX.X D:X88XXbbb.XGGG.XX=-XX...XbbXDXbbXLLLXX=-XXbbX.XaaaaXXX.X D:XXXIXXe..X...XX=-XX.GGXXbXX.XXbXXILIXX=-XXbX.XaaaXXXX.X -D:X9889Xe**X%%.X=-XXG.GdXbbX^.^XbbXILLIXX=-XbX.XXXIXhGG.X -D:XXIXXXX**X=-XX=XXdG.GXX.XX^.^XX.XXILIIXX-XX%.XedXXXXX.X -D:X99999X**X=-X=-XGGG..X..XI^a^IX..XILLIIX=-XX.XddX..eeeX -D:XXXXIXXX*X=XX-XX....XX.XXI^a^IXX.XXILLIXX=XX.X.XX.GGGGX -D:X^^^^^cX*X-X=-X.....X..X.I^a^I.X..XIILLIX=-X.X.Xdddd..X -D:XllllX^XX%XX=XXG.GGXX.XX.IXXXI.XX.XXIILIXX-XX%XXXXXXX.X -D:X^^^cl^=X8X-=XeG.GeX..X...X4X...X..XILLLIX-=X8X.aaaaaaX -D:XLLX^l^-XXX9XXGG.GXX.XX...X.X...XX.XXLLLLXX9XXX.GGGGGGX -D:X..L^l^=-X99X.....X..XWW..X%X..WWX..XLLLL.X99XXbbbbb..X -D:X7.L^l^=-X8XX5...XX.XXWWW..c..WWWXX.XXLL.AXX8XXbbbbb.6X +D:X9889Xe**X%%.X=-XXG.GdXbbX...XbbXILLIXX=-XbX.XXXIXhGG.X +D:XXIXXXX**X=-XX=XXdG.GXX.XX...XX.XXILIIXX-XX%.XedXXXXX.X +D:X99999X**X=-X=-XGGG..X..XI.a.IX..XILLIIX=-XX.XddX..eeeX +D:XXXXIXXX*X=XX-XX....XX.XXI.a.IXX.XXILLIXX=XX.X.XX.GGGGX +D:X.....cX*X-X=-X.....X..X.I.a.I.X..XIILLIX=-X.X.Xdddd..X +D:XllllX.XX%XX=XXG.GGXX.XX.IXXXI.XX.XXIILIXX-XX%XXXXXXX.X +D:X...cl.=X8X-=XeG.GeX..X...X4X...X..XILLLIX-=X8X.aaaaaaX +D:XLLX.l.-XXX9XXGG.GXX.XX...X.X...XX.XXLLLLXX9XXX.GGGGGGX +D:X..L.l.=-X99X.....X..XWW..X%X..WWX..XLLLL.X99XXbbbbb..X +D:X7.L.l.=-X8XX5...XX.XXWWW..c..WWWXX.XXLL.AXX8XXbbbbb.6X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXIIIIXIIIIXXIIIXIIIIXXIIIXXXXggggXc..cXaaaaXbb.CX D:XIIIIIXIXXIIIXXIIXIXIXIXXIXXIXIXXXXgddg%....%aaaa%bb..X diff --git a/lib/edit/s_doom.map b/lib/edit/s_doom.map index 5be3b67d..12ff7d06 100644 --- a/lib/edit/s_doom.map +++ b/lib/edit/s_doom.map @@ -15,7 +15,7 @@ F:$:178:0 F:%:205:0 # Hidden Door -F:+:48:0:0:0:0:0:0:0:177 +F:+:48:0:0:0:0:0:0:177 # Normal Door F:D:32:0 @@ -29,12 +29,6 @@ F:L:85:0 # Treasure (random) on shallow lava F:*:86:0:0:* -# Trap (random) on deep lava -F:^:85:0:0:0:0:0:* - -# Trap (random) on shallow lava -F:t:86:0:0:0:0:0:* - # up staircase F:<:6:0 @@ -194,28 +188,28 @@ D:X #%%NNLL...JJJ....LL# D:X ##### #NNNN...Ljjjjj..LLL# #############################################..1!!!!...L### X D:X##.LL## #nNNN...LLJJj.LLLLL# #L....&!&!&....L%%%%%%%L..mRR%R%%M%MML%LL...DL...!1&..@L%%# X D:X#LL<..# #nn.LL.LLLL...%%%LL# #..##########################################LLL....LLL%%%# X -D:X##%LL## #....LLL%%LLL..^LLL# #.L# #LL2.t..q.LLL## X +D:X##%LL## #....LLL%%LLL..LLLL# #.L# #LL2....q.LLL## X D:X ###+# #D##############+#######.L# ##%%.LLLL&L...# X -D:X #!# #.# #.......L%%# ##%%LL..2...t.## X -D:X #^# #.############ ##########+# XXXXXXXXXX ##.9.t.LLLLL## X +D:X #!# #.# #.......L%%# ##%%LL..2.....## X +D:X #L# #.############ ##########+# XXXXXXXXXX ##.9...LLLLL## X D:X #.# #LL%%%%LL...p# #11111# X########X ###############.2..LQ#+# X -D:X ##.# ############D## #11211# X#9....9#X #o.....t...# ###^L..#(# X +D:X ##.# ############D## #11211# X#9....9#X #o.........# ###LL..#(# X D:X #L## ##%%V## #12221# XXXXXX#..$$..#XXXXXX#LLLLKkk...# ###D#### X -D:X ##!# ##.VH^%## #12221# X######t....m######X#LLLLkkk.LL# #.# X -D:X #.# ##.iH%%hv## #11211### X#sSSSrrt%.mVVVLLe#X#.LL.kkk...# ##.# X -D:X ###D######### #tiI%HHhvL# #11111+9# X#rRssRr.%.mVvvm..#X#%...LLL...# ##Lo###### X -D:X #.^t^LLL...L## #.LIH%Hc..# ######### X#.MmmM..%..MMLLL.#X#%%......L&# ##.L##EBBB# X -D:X #.jJ%%%L....L# ##..ICCL.## X#.L..L..%ttL.....#X########D### #.####LAAB## X +D:X ##!# ##.VHL%## #12221# X######.....m######X#LLLLkkk.LL# #.# X +D:X #.# ##.iH%%hv## #11211### X#sSSSrr.%.mVVVLLe#X#.LL.kkk...# ##.# X +D:X ###D######### #.iI%HHhvL# #11111+9# X#rRssRr.%.mVvvm..#X#%...LLL...# ##Lo###### X +D:X #.L.LLLL...L## #.LIH%Hc..# ######### X#.MmmM..%..MMLLL.#X#%%......L&# ##.L##EBBB# X +D:X #.jJ%%%L....L# ##..ICCL.## X#.L..L..%..L.....#X########D### #.####LAAB## X D:X #JJJJL%LLL&..# ##..L.L## X#9LLL...%..LL(LLq#X #..L..# #.LL..LB%%L# X -D:X #J%J..LLL%%LL## ##.t.## X######......######X #L.#### ###..LL%%%L## X -D:X #jJJ^..bL%LL..## ##D################# XXXXXX#.LUUL.#XXXXXX #.L# #.PL%%%@(L# X -D:X ##....BABLL..L.## #.uLL^L..L%^^..L%%# X#.L%%LL#X #L.#### ###.L%LL..##X -D:X ##....B%%L.....## #################L# X#LLL..t#X #..twW# #L..LL...+pX +D:X #J%J..LLL%%LL## ##...## X######......######X #L.#### ###..LL%%%L## X +D:X #jJJL..bL%LL..## ##D################# XXXXXX#.LUUL.#XXXXXX #.L# #.PL%%%@(L# X +D:X ##....BABLL..L.## #.uLLLL..L%LL..L%%# X#.L%%LL#X #L.#### ###.L%LL..##X +D:X ##....B%%L.....## #################L# X#LLL...#X #...wW# #L..LL...+pX D:X ###....LLL...LLL####################.# X#%L..7.#X #####L# ###LL...1###oX -D:X #9+L%%L...LLL....D.+..%%oF.%%^..%%LL.# X#LLLLt.#X #p# #%%%!@..## #tX -D:X ##################L###.L###..###.L#### X#7tt.LL#X #.# ######### #EX +D:X #9+L%%L...LLL....D.+..%%oF.%%L..%%LL.# X#LLLL..#X #p# #%%%!@..## #.X +D:X ##################L###.L###..###.L#### X#7...LL#X #.# ######### #EX D:X ##################.# ############## X#.LLLL.#X ######D###################LX -D:X ##11!!!&LL.+(#L# X#LL%%LL#X #G..LLL.LL...D..LL....^LLL%X +D:X ##11!!!&LL.+(#L# X#LL%%LL#X #G..LLL.LL...D..LL....LLLL%X D:X ##1!!!%%%%Lp###L# X#L%%%%Q#X #..LF....K...##############X D:X ##!!%%%%%LLL..#.# XXXXDDXXXX########.LLLL..KKK..#### X D:X ##.LLLLLLL...+.# #%%%%%%%%%%%%%+LL7..LL.k..L+o7# X diff --git a/lib/edit/s_factory.map b/lib/edit/s_factory.map index 111829f1..f7432f83 100755 --- a/lib/edit/s_factory.map +++ b/lib/edit/s_factory.map @@ -83,65 +83,62 @@ F:<:6:0 F:>:7:0 # between gate 1 -F:1:160:6:0:0:0:0:0:845 +F:1:160:6:0:0:0:0:845 # between gate 2 -F:2:160:6:0:0:0:0:0:846 +F:2:160:6:0:0:0:0:846 # between gate 3 -F:3:160:6:0:0:0:0:0:4370 +F:3:160:6:0:0:0:0:4370 # between gate 4 -F:4:160:6:0:0:0:0:0:3339 +F:4:160:6:0:0:0:0:3339 # between gate 5 -F:5:160:6:0:0:0:0:0:4119 +F:5:160:6:0:0:0:0:4119 # between gate 6 -F:6:160:6:0:0:0:0:0:6659 +F:6:160:6:0:0:0:0:6659 # between gate 7 -F:7:160:6:0:0:0:0:0:9257 +F:7:160:6:0:0:0:0:9257 # between gate 8 -F:8:160:6:0:0:0:0:0:8018 +F:8:160:6:0:0:0:0:8018 # between gate 9 -F:9:160:6:0:0:0:0:0:9298 +F:9:160:6:0:0:0:0:9298 # between gate A -F:A:160:6:0:0:0:0:0:805 +F:A:160:6:0:0:0:0:805 # between gate B -F:B:160:6:0:0:0:0:0:831 +F:B:160:6:0:0:0:0:831 # between gate D -F:D:160:6:0:0:0:0:0:809 +F:D:160:6:0:0:0:0:809 # between gate E -F:E:160:6:0:0:0:0:0:2826 +F:E:160:6:0:0:0:0:2826 # between gate F -F:F:160:6:0:0:0:0:0:2831 +F:F:160:6:0:0:0:0:2831 # between gate H -F:H:160:6:0:0:0:0:0:4631 +F:H:160:6:0:0:0:0:4631 # between gate J -F:J:160:6:0:0:0:0:0:7198 +F:J:160:6:0:0:0:0:7198 # between gate K -F:K:160:6:0:0:0:0:0:7990 +F:K:160:6:0:0:0:0:7990 # between gate N -F:N:160:6:0:0:0:0:0:9253 +F:N:160:6:0:0:0:0:9253 # Treasure on floor F:$:1:0:0:*65 -# Trap (random) on floor -F:^:1:0:0:0:0:0:* - ### Monsters @@ -203,9 +200,9 @@ D:X&XXXe.XX~XXeeeXX~XXe..XX~~~~~~ttttXX.....X,,,,Ll,ll,X..XII.X.X.i.XXG_XXXXL%%L D:X..&..XX~~~XXeXX~?~XX.&X~~~~t~ttttttX.;.;.X,lllll,ll,XX_..XX.XX#X..X#XXf.X_GG_X.fX D:XGXGXGX?~~~~_c_~~~~~X.&XX~~~~t~ttttXX.....X,L,,,,,lL,.X.#XXi..G.XXiX..XX.........X D:X.....XX~~?XXcXX~~~XXa..XXX__XX__XXXX.;.;.X,L,.XXX%L%XXXXcXX.XXX.X.X.X.XX.X.ff.X.X -D:XXgXgXgXX~XXcccXX?XXXXX.a^^a.^^a...bXXXGXXX%L%XX.XX%XXa.aXIX.Xi#.XiXI.X.X........X -D:XgXgXgXgXXX^^^^^XXX,ccXXXXXXXXXXXb.XX#...#XX%XX.XI_XX....X.X.#XXXIX.#GX.X.X....X.X -D:X.......4X.^^5^^.X.c.c..c..c.c..c.XX.#...#.XXXIXX.X.a.c..XXi..I.X._.X.XXX...&&...X +D:XXgXgXgXX~XXcccXX?XXXXX.a..a...a...bXXXGXXX%L%XX.XX%XXa.aXIX.Xi#.XiXI.X.X........X +D:XgXgXgXgXXX.....XXX,ccXXXXXXXXXXXb.XX#...#XX%XX.XI_XX....X.X.#XXXIX.#GX.X.X....X.X +D:X.......4X...5...X.c.c..c..c.c..c.XX.#...#.XXXIXX.X.a.c..XXi..I.X._.X.XXX...&&...X D:X..&&...XXXXXXXXXXc,c,c.XX_XX..ccXX..#...#..XX#iiX.X.a..a.XX.#XX._X.XX.XX.X....X.X D:X......XXEX,,,c,c,cc,ccXXMRMXXc.XX...#...#...XXX#iXXXXXc..IXGX.XXiX.....X........X D:XXXXXXXX..X,,,,,,,,,,,XXM..RMXXXX$$XXX...XXX$$XX..XX_GXXXXXX.Ii.X_X.X#XXX.X....X.X @@ -217,20 +214,20 @@ D:Xs.s._..&.&.XlX_._XlX..gg....X$$$#....%%%....#$$$X.IIX.X..XIXX.X.G#X..dXLl#_._ D:X.s.s_g....XXlXXGXXlXX.g..d&.XX$$XXXXX...XXXXX$$XXXX._XG#X.XX.X_X.XX.c.XXXX...XXXX D:XXXXXXXXXXIXLLLXGXLLLXgg.g.d..XX$$$XXX...XXX$$$XX<...XiXX.X.Xi.X.X.Xd..X.........X D:Xgg.gXg.gXIXL%LXGXL%LXGXXX__XXXXX$$XXX...XXX$$XXXXXXIXXiX#XX#XX#X_XX...XXXXXXXIXXX -D:X^^X^X^X^X^XX_XXGXX_XXGXXg..g.%.XX...X...X...XX.GI.X._iXXG...I..I.GX..dIX#I#I#I#IX -D:X^^X^X^X^X^Xhl,&c.a&g.l.XX.g.g%RRXX..X###X..XX..#_X..XXX_iXXIXiXi_.Xc..X.IX.XXXIXX -D:X^^X^X^X^X^X&,,,l&,lac.&.__.g.%.R.XX...>...XX#X.X..XX#.._X.X.X.#.XGX.X.XX_XX.X#i.X +D:X..X.X.X.X.XX_XXGXX_XXGXXg..g.%.XX...X...X...XX.GI.X._iXXG...I..I.GX..dIX#I#I#I#IX +D:X..X.X.X.X.Xhl,&c.a&g.l.XX.g.g%RRXX..X###X..XX..#_X..XXX_iXXIXiXi_.Xc..X.IX.XXXIXX +D:X..X.X.X.X.X&,,,l&,lac.&.__.g.%.R.XX...>...XX#X.X..XX#.._X.X.X.#.XGX.X.XX_XX.X#i.X D:XH.Xg.gXg.gXla,ca&,f.fl.leXX..%R.RRXX.....XX.G.XX#XXI.XX.#.XGXXXiX.#X.XX.i._X.XGX# D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGXXXXXXXG.X..X#XXX.XX.XXI._XIX.XIXXI#.XXX.X D:X,.,G,&&,ee,ff,hgg,&&,,,.,,I7XXXc..aX.;.;.X&..XXXG#XX.G.XXX..XG######.G.#..##..iXX -D:X^X,G.&&.ee,ff..gg,&&,.,,,,XXX..MRM.X.....X.....XXX.IIX.XGI.XX..IXXXXXXXXXXX._.X._ -D:X^X,XXXXXXXXXXX.XXXXXX,,.XXX..$.....X.;.;.Xh..&...GXXXGXi#IXX.IXX..#.....#.XX##XXX -D:X^X,llL,LlLL,LXXXlll,XXXXX..aMR..$.cX.....X.....XXXX8XXXXXXXX#IX###..##.#..#XI.XKX -D:X^XlLCCCCCCCCLllll%%l.R.R.R.R..M.R..X.;.;.X&..XXX.#X#.i.#.XXX#X...###.#.##.#.X#IXX -D:X^X,lL,llL,Ll,XXX,lllXXXXXc.M..R.c..X.....XXXXX#.#.XIX#Xi.X...X###.#####.#...X#XXX -D:X^X,XXXXXXXXXXX.XXXXXX,.,XXX...$.M..X.;.;.Xh.##i#.#XX_IX.#X.##I....#.#.###.##X#I.X -D:X^X.G,&&,,gg.&.,ee,ff,,.,.,XXXa..R..X.....X..#.###.XIXX.X.X.##XX####..#..###II.X.X -D:X,,,G,&&,,gg.&h.ee,ff,..,.,I^XXXM..9X.;J;.Xh.##.###..iiX#.X....II.....#....IX..XNX +D:X.X,G.&&.ee,ff..gg,&&,.,,,,XXX..MRM.X.....X.....XXX.IIX.XGI.XX..IXXXXXXXXXXX._.X._ +D:X.X,XXXXXXXXXXX.XXXXXX,,.XXX..$.....X.;.;.Xh..&...GXXXGXi#IXX.IXX..#.....#.XX##XXX +D:X.X,llL,LlLL,LXXXlll,XXXXX..aMR..$.cX.....X.....XXXX8XXXXXXXX#IX###..##.#..#XI.XKX +D:X.XlLCCCCCCCCLllll%%l.R.R.R.R..M.R..X.;.;.X&..XXX.#X#.i.#.XXX#X...###.#.##.#.X#IXX +D:X.X,lL,llL,Ll,XXX,lllXXXXXc.M..R.c..X.....XXXXX#.#.XIX#Xi.X...X###.#####.#...X#XXX +D:X.X,XXXXXXXXXXX.XXXXXX,.,XXX...$.M..X.;.;.Xh.##i#.#XX_IX.#X.##I....#.#.###.##X#I.X +D:X.X.G,&&,,gg.&.,ee,ff,,.,.,XXXa..R..X.....X..#.###.XIXX.X.X.##XX####..#..###II.X.X +D:X,,,G,&&,,gg.&h.ee,ff,..,.,I.XXXM..9X.;J;.Xh.##.###..iiX#.X....II.....#....IX..XNX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/edit/s_gates.map b/lib/edit/s_gates.map index 3ac7ccbf..37d39f22 100644 --- a/lib/edit/s_gates.map +++ b/lib/edit/s_gates.map @@ -55,35 +55,35 @@ F:1:1:0:0:0:0:10 ### Level design D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -D:X*****...@%...aX.X9@********%%%%%%X9.VV....Xd.............A^^.......dX -D:X*****...@%...aX.X@@********%%%%%%X.VVVV.X.XX.............B^^........X -D:X*****...@%...aX.X99*XXX****%%88%%XVVWWVVX..XX.............^^.......9X -D:X*****...@%...aX.X@@XXdXX***%%88%%XVVWWVVX...XX............^^.......CX -D:X*****...@%...aX.X@XX...XX**%%%%%%X.VVVV.X.X..XX..........5^^........X -D:X........@%...aX.XXX.....XX*%%%%%%X9.VV..X.XX..XX.........F^^.......dX +D:X*****...@%...aX.X9@********%%%%%%X9.VV....Xd.............A.........dX +D:X*****...@%...aX.X@@********%%%%%%X.VVVV.X.XX.............B..........X +D:X*****...@%...aX.X99*XXX****%%88%%XVVWWVVX..XX......................9X +D:X*****...@%...aX.X@@XXdXX***%%88%%XVVWWVVX...XX.....................CX +D:X*****...@%...aX.X@XX...XX**%%%%%%X.VVVV.X.X..XX..........5..........X +D:X........@%...aX.XXX.....XX*%%%%%%X9.VV..X.XX..XX.........F.........dX D:X%X......@%...aX.X........XIXXXXXXXXXXX..X..XX..XXXXIXXXXXXXXXXXXXXXXX D:X.XXX....@%...aX.X..........XXX..>X...X..X...XX..XXXaXaXaXaXaXaXaXaXaX D:X...XXX..@%...aI.X..........XXX7..X...D..X.X..XX..XX.................X D:X.....XXX@%...aX.X..........XXXXXXXXXXX..X.XX..XX..XX................X D:X.......XXX...aX.X..........XXXXXXXaG....X..XX..XX..XX...............X -D:X..X......XXX.XX%XX^^^^^X...XXXXXXXaG....X...XX..XX..XX..............X -D:X^^XX.......XXX***X^^^^^X...XIIII7XXXXXXXXXX..XX..XX..XXXXXXXXXXXX+X8X -D:X^^XX.........X.6.X^^^^^X...XIXXXXX&&&&&&&&XX..XX..XX...........cX.XXX -D:X..XXX........X***X^^^^^X...XIXXXXX.........XX..XX..XXXXXXXXXXXXXX..XX -D:X^^X8X........XXXXX^^^^^X...XIIIIIXVVV.......XX..XX.............bXX..X +D:X..X......XXX.XX%XX.....X...XXXXXXXaG....X...XX..XX..XX..............X +D:X..XX.......XXX***X.....X...XIIII7XXXXXXXXXX..XX..XX..XXXXXXXXXXXX+X8X +D:X..XX.........X.6.X.....X...XIXXXXX&&&&&&&&XX..XX..XX...........cX.XXX +D:X..XXX........X***X.....X...XIXXXXX.........XX..XX..XXXXXXXXXXXXXX..XX +D:X..X8X........XXXXX.....X...XIIIIIXVVV.......XX..XX.............bXX..X D:X..X8XX................XX...XXXXXIXVVVV.......XX..XXXXXXXXXXXXXXXXXX+X -D:X^^X88X................XX...XIIIIIXVVVVVV..@...XX.^^^^^^^^^^^^^a.....X -D:X^^X99XX...............XX...XIXXXXX4..VVVV......XXXXXXXXXXXXXXXXXXXXXX +D:X..X88X................XX...XIIIIIXVVVVVV..@...XX..............a.....X +D:X..X99XX...............XX...XIXXXXX4..VVVV......XXXXXXXXXXXXXXXXXXXXXX D:X..X999X...............XX...XIXXXXXXXXX.VVVV....***********.........bX -D:X^^XIIIXX..............XX...XIX...5..fX...VVVVV.@....................X +D:X..XIIIXX..............XX...XIX...5..fX...VVVVV.@....................X D:X..X....X........d.....XX...XIXf......X...VVVVVVV...............@....X -D:X^^X....XX............XXX...XIXXXXXXXXX.......VVVVVVV................X -D:X^^X&&&&&X............XXX...XIIIIIXe...........VVVVVVVVVVVV..........X +D:X..X....XX............XXX...XIXXXXXXXXX.......VVVVVVV................X +D:X..X&&&&&X............XXX...XIIIIIXe...........VVVVVVVVVVVV..........X D:X..X%%%.%XX..........XXX....XXXXXIX.............@VVVVVVVVVVVV@.......X -D:X^^X88%.%8X.........XXX.....XXXXXIX...................VVVVVVVVVV.....X +D:X..X88%.%8X.........XXX.....XXXXXIX...................VVVVVVVVVV.....X D:X..X%%%.%%XX........XX......XXXXXIX@.....................VVVVVVVVVVVVX -D:X^^X......cX......XXXX......XXXXXIX........@..........@....VVVVVVVVVVX -D:X^^^......cXX888XXXXX......dIIIIIIX.........................b.VVV...6X +D:X..X......cX......XXXX......XXXXXIX........@..........@....VVVVVVVVVVX +D:X.........cXX888XXXXX......dIIIIIIX.........................b.VVV...6X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @@ -97,9 +97,9 @@ D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXLgXXXXXXXXXXXXXXXXXXXXXXXXLLLLXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXfXXXXXXXXLXXXXXXXXXXXXXXXXXXXXXXXXXgLLLLXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXX.XXXXXXXghgXXXXbXXXXXXXXaXXXXXXXXXXXXXXLLLLgXXXXXXX D:XXXXXXXXXXXXXXXXXXX.XXXXXXXg1gXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXgLLXXXXXXX -D:XXXXXXXXXXXXXXXXXXX^XXXXXXXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXXLXXXXXXX -D:XXXXXXXXXXXXXXX4..^^^..^^^.......^^^......^^^.........EXXXXXXXLXXXXXXX -D:XXXXXXXXXXXXXXXXXXXXXXXX^XXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXLLXXXXXXX +D:XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXXXLXXXXXXX +D:XXXXXXXXXXXXXXX4......................................EXXXXXXXLXXXXXXX +D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXXLLXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXLLLXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXcXXXXXXXXaXXXXXXXXXXXXXXXLLXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgLLLXXXXXXXXXX diff --git a/lib/edit/s_name.map b/lib/edit/s_name.map index 795d8786..e1a352ef 100644 --- a/lib/edit/s_name.map +++ b/lib/edit/s_name.map @@ -62,46 +62,46 @@ F:1:1:0:0:0:0:16 ### Level Design D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -D:X.....LLLLLLLLL.....XXX.G=-&&=-G^.........>X -D:X.LLL...........LLLXX...G=-&.=-G^........1.X -D:X.L9L.LLLLLLLLLLLLX%...EGE.=&.FG^..........X -D:X.L99.L&..........X%....G..&-..G^....j.....X -D:X.LLLLL&LLLLLLLLL.LXX...G=-=&-=G^..........X -D:X....&&&L.......L.L*XXX.G-=&&-=G^^^^^^^^^^^X +D:X.....LLLLLLLLL.....XXX.G=-&&=-G..........>X +D:X.LLL...........LLLXX...G=-&.=-G.........1.X +D:X.L9L.LLLLLLLLLLLLX%...EGE.=&.FG...........X +D:X.L99.L&..........X%....G..&-..G.....j.....X +D:X.LLLLL&LLLLLLLLL.LXX...G=-=&-=G...........X +D:X....&&&L.......L.L*XXX.G-=&&-=G...........X D:XLLLLLLLL.LLLLL..&L**XXXXXXXGGGG%XXXXXXXXXXX -D:XXXXXXLL..L***LLLLLLLX^^^^8Xi....%@@^^.^^@@X -D:X5..8X.&.XXXXXX......D^^^^8XIIIIIXbb^^.^^ccX -D:X...8X...XA...X.LLLLLX^^^^8X.....X..^^.^^..X -D:X...8X.XXXC...X.LL...XXXIXXX^^^^^X..^^.^^..X -D:XGXXXX.LfX7...X&LL.L.Xa^^^aXf...fX..^^.^^..X -D:X.X5XL.L*XB...X&&..L.X^b^b^X^^^^^X..^^.^^..X -D:X.X^XL.L*XXXXXXLLLLL.X^^7^^X.....X..^^.^^..X -D:X.X^XL.L***fXL.....&&X^b^b^XIIIIIX..^^.^^..X -D:X.X^XL.LLLLLXL.LLLLLLXa^^^aXi....X..^^.^^..X -D:X.X^XL.........XXXXXXXXX%XXXXXXXXX..^^.^^..X -D:X.X^XXXXXXXXXXLX^...^Xe-^=dX^^..&X..^^.^^..X -D:X.X^^^^^^^^^^XLX.^^^.X-^^^=X^^..&X..^^.^^..X -D:X.XXXXXXXXXX^X8Xf^B^.%^^6^^%^^C.&X..^^.^^..X -D:X.LLLLLLLLL+^XXX.^^^.X-^^^=X^^..&X..^^.^^..X -D:X.XXXXXXXXXXXXXX^...^Xd-^=eX^^..&X..^^.^^..X -D:X.Xbbbbb......XXXXXXXXXX%XXXXXXXXX..^^.^^..X -D:X.XbbbbXXXX^^^^XX....X^^^^^X...h.X..^^.^^..X -D:X.XbbbXX^^XXX^^^XX...X^ccc^X....0X..^^.^^..X -D:X.XbbXX.^X%bXX^^^XX..X^.A.^X.....X..^^0^^..X -D:X.IbXX..XXbbbXX^^^XX.X^ccc^XIXXXXXXXXXXXXXXX -D:X.XXX..XX.....X%^^^XXX^^^^^XlllllllllllllllX -D:X.X99.XXW......XX^^^XXXXXXXXlllllllllllllllX -D:X.X99XXWWW...a..XX^^.XXllllllLLLLLlXXXX%XXXX -D:X.XXXX..WWW.....cXX^.XXXXXlllllllllXVVVVVVVX -D:X.X8.....WWW....ccX^.X^^^XLLLlLLLLLXVVVVVVVX -D:X.X%XXXXXXXWW...cXXX.X+X^XlllllllllXV%%%%%VX -D:X.X.......XWWW..X%^X.XLX^XlLLLLLLLLXV%8^8%VX -D:X.XXXXXX%.X.WWWXX^^X.XLX^XlllllllllXV%^a^%VX -D:X.X.IIIIX.X..WXX..XXcXLX^XLLLlLLLLlXV%^^^%VX -D:X.X%XXXIX.X..XX..XXccXLX^XlglllLgllXV%^^^%VX -D:X.Xa.6XIX.X.XX..XXcccXLX^XlllllXXXXXV%^a^%VX -D:X+XXX.XIX.X.X99XXccccXLX^XXXXXXX888XV%8^8%VX -D:X%%%Xa%.X.%8X99XcccccXLX^^^^^^4X...XV%%%%%VX +D:XXXXXXLL..L***LLLLLLLX....8Xi....%@@.....@@X +D:X5..8X.&.XXXXXX......D....8XIIIIIXbb.....ccX +D:X...8X...XA...X.LLLLLX....8X.....X.........X +D:X...8X.XXXC...X.LL...XXXIXXX.....X.........X +D:XGXXXX.LfX7...X&LL.L.Xa...aXf...fX.........X +D:X.X5XL.L*XB...X&&..L.X.b.b.X.....X.........X +D:X.X.XL.L*XXXXXXLLLLL.X..7..X.....X.........X +D:X.X.XL.L***fXL.....&&X.b.b.XIIIIIX.........X +D:X.X.XL.LLLLLXL.LLLLLLXa...aXi....X.........X +D:X.X.XL.........XXXXXXXXX%XXXXXXXXX.........X +D:X.X.XXXXXXXXXXLX.....Xe-.=dX....&X.........X +D:X.X..........XLX.....X-...=X....&X.........X +D:X.XXXXXXXXXX.X8Xf.B..%..6..%..C.&X.........X +D:X.LLLLLLLLL+.XXX.....X-...=X....&X.........X +D:X.XXXXXXXXXXXXXX.....Xd-.=eX....&X.........X +D:X.Xbbbbb......XXXXXXXXXX%XXXXXXXXX.........X +D:X.XbbbbXXXX....XX....X.....X...h.X.........X +D:X.XbbbXX..XXX...XX...X.ccc.X....0X.........X +D:X.XbbXX..X%bXX...XX..X..A..X.....X....0....X +D:X.IbXX..XXbbbXX...XX.X.ccc.XIXXXXXXXXXXXXXXX +D:X.XXX..XX.....X%...XXX.....XlllllllllllllllX +D:X.X99.XXW......XX...XXXXXXXXlllllllllllllllX +D:X.X99XXWWW...a..XX...XXllllllLLLLLlXXXX%XXXX +D:X.XXXX..WWW.....cXX..XXXXXlllllllllXVVVVVVVX +D:X.X8.....WWW....ccX..X...XLLLlLLLLLXVVVVVVVX +D:X.X%XXXXXXXWW...cXXX.X+X.XlllllllllXV%%%%%VX +D:X.X.......XWWW..X%.X.XLX.XlLLLLLLLLXV%8.8%VX +D:X.XXXXXX%.X.WWWXX..X.XLX.XlllllllllXV%.a.%VX +D:X.X.IIIIX.X..WXX..XXcXLX.XLLLlLLLLlXV%...%VX +D:X.X%XXXIX.X..XX..XXccXLX.XlglllLgllXV%...%VX +D:X.Xa.6XIX.X.XX..XXcccXLX.XlllllXXXXXV%.a.%VX +D:X+XXX.XIX.X.X99XXccccXLX.XXXXXXX888XV%8.8%VX +D:X%%%Xa%.X.%8X99XcccccXLX......4X...XV%%%%%VX D:X%.%XXXXXXXXXXXXIXXXXXLXXXXXXXXX...XVVVVVVVX D:X.%%+..........................G..4X...F...X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/edit/s_ship.map b/lib/edit/s_ship.map index f429d4ec..69a94fa3 100755 --- a/lib/edit/s_ship.map +++ b/lib/edit/s_ship.map @@ -19,8 +19,6 @@ # I'm not sure esp. about the correct exit of gate #3. -#%:special.txt - ### Terrain Features @@ -157,15 +155,6 @@ F:$:90:0:0:*47 # Treasure (good) on ice F:%:90:0:0:*60 -# Trap (random) on ice -F:^:90:0:0:0:0:0:* - -# Trap (random) on shallow water -F:t:84:0:0:0:0:0:* - -# Trap (random) on fog -F:@:210:0:0:0:0:0:* - # Human skeleton on ice F:x:90:0:0:395 @@ -173,16 +162,16 @@ F:x:90:0:0:395 ### Between Gates # between gate 3: was 711 -F:3:160:6:0:0:0:0:0:1136 +F:3:160:6:0:0:0:0:1136 # between gate A: was 6247 -F:A:160:6:0:0:0:0:0:6761 +F:A:160:6:0:0:0:0:6761 # between gate 4: was 3339 -F:4:160:6:0:0:0:0:0:3853 +F:4:160:6:0:0:0:0:3853 # between gate B: was 3085 -F:B:160:6:0:0:0:0:0:3599 +F:B:160:6:0:0:0:0:3599 ### Guaranteed Items @@ -197,33 +186,33 @@ D:XXXXXXXXXXXXXXXX XXXXXXXXXXXX D:X###############..~ .#. k w ~.#XX######### .~~ s G..#####.. w .###.######X##~~ .GX.### D:X####%####...~ ~.~ s .#.X#~~.##### .~ s w G..#.##.#.XGG~XXk~.####A####.~X ~~.X... D:X##%#$#######...~ w wXXXXXX#XXXX###XXX #~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX....~.XX X#xX.#..#.#G. w ~X G~~ -D:X##$#########.... s XXXTT^...~.~#####w~###~~~~8....**.tE.&E ^^.M^.xx.....x..ZZ..^XTTTT M...GG.~.. w G.###~XX~~#XX . s X -D:X#########...~ w XXXTTTT.^..x~.H#### ###~~D....8**.~M~.E..M^.MM^..xh.h...ZZZZ^~M.,.,.,.~~ .G...~~ ~###. w . w M.d. -D:X#####.x.x~~~ XXXTTTXXXMxx.H.####### ~##~~~8...#.**.~tE&EE^^~%M^.h.x.E.xh.ZZ..^X.,.^....~ ...G.~ s ~# XX ~~ w X -D:X######...~~ MM~ w XXX^^XXX.MMMxx...G#####w ~#~.~..&...**E.MEt.^^.MM^~..i.....ZZZZ^~M.,.,,.gM.~.,~.,G.G~~ G~. G~.MM XX..~ -D:X##.....~~ XXX^E=^XX$b.MMMMxH..HG#.## w ~#~##~8....*E~.&EM^^.M^h..i..x.x..ZZ..^XTTTTX.,.,~........~.G~~..w . G~...G~X -D:X...~~~ K XXX^^EXXXX$$$..MMXXXXXXX#### #####XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..,.X..M~.........~G..G ~~.G...G~ -D: ~~~ w XXX^^EXXXdX%d$$b$$XXd~~~~##### s ###.,.W.**,.x.,.,.,.,.,.***,,....,x....,,.SX.,.,.,..,o.,.,.~~.G..~.G..G..~X k -D: w MMM. w XXX^E^XXX.,*XDDd$$$XXd$..~~~~#### ###.,.,.,.**..,.,i.,.,W,.,**..z.,.,.q...g.,......~.,.,.,.,.~.~..F.~M~......~ -D: MM. XXX4EEXXXi^**.XX%%$dXX$d$.H#####~G~~####.~.,~..,.h*,,~,.,.,.,~,.,.,.H.,.~.,..~,.,,,.~,.,.~.,.,.X.~,g.~~..~.~..,..,X -D: s XXXBXXXXX^.**.W.,XDD%XXb$$b####..G~~~G###~.,,.,.,.,...,,.x,.~.,.,~..,.~.,.,~,.,.,,.,.,~,.,.,.~,.,..,X.,.***.~***,W.,X -D: XXX.o..X.g***i.*.,.XX%XX######^^^^t ##ttt^^^^^t^^^^^^t^^^^^t^^^^^^^t^^^^^^t^^^^t^^tt^^^tt^^^^t^tXo..x************X -D: k XXX^E..o.XX8.****,.g..XXX..#........~~~~~ttt###~~.,.G~.......XXXXX..~,..,,..,,.~.,..,.,..,,..,.,x..,.ooX******W***g.*.g*X -D: XXX%S^^E..ooX,*****,..,.X.....h........XXX~~~tt#tt w ~~G~...XXXXXXX.,**.,..D.**.G.,~,..XXX...~~~.....o8X***.~.,.****$$..X -D: XX%%%^mm.E..oXH**.^.*i.....#.....i..*..XXXXX~~ G~~.XXXXXXXXX~.*..,.,*..~,..,.,XXXXX...~..,.XXXXXo.W.$$.g.x....o.X -D: XXX%S^^E..ooX8.*~~...,~~##...,..,.***,.XXX~G~ k ~~~~XXXXXXX.,.*. g...*..x..W.~.XXX.***.,,o..oO8X.o.,.o.xx$$$XXXXX -D: XXX^E..o.XXH.###....###~~~.,h..,.*.,..~~.~~ s ~~.XXXXX.~..**...i~**.....~.,,.,,.***~,,,.oXXXXXXXXXXXXXXXX.!.X -D: s XXX.o..X&..w~##..##~~~X~^^^^^^^^^^t^ttt^tt w tt^tttt^^tt^^^^^ttt^^^^ttt@@^^^^ttt^^^^^ttt@^^ttXXXW ^^.M*.t^oo.^^...X s -D: ~~~ XXX>XXH~G..#####~G~~Gt..,.,..,.,xx..x ~~~ i~~xx.~...x....~.~..~..,~..***..~..~...,~.~*.~.XXXE.^^H..SM.~^.oo....JX -D: ~~....~~ XXX$8w~.^####G~G ~i.XX.,,.,...........G~~~s~~ iiF~...........~.......x.,.**~....,~....~.*XXX.EE.W.^^.M*.~^^^o^O^..X -D: ~.#..#..~~ XXX8##t..##~#.G.t..XX..,H...,.W...,...,~~...,...*,,.x...,.i.....g.....**.........XXXXXXX...EE.^^H..SM.~.^oo...^JX -D: ~.##.##..~ XXX###GG~~~*h~.^..XX.....,....,.W...,.G....W.***...,...,...,....,...,**..q....SX3tttW#...EE.W.^^.M*.t.oo.^.^.XX -D: ~~.###..~~ X##.##~~G^~~~~i*^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~ -D: ~~...###.~ k ~###X.G~~@Gh~x*~^..^i.zX8~i.~..h....zzzXiX..^$.T.t$......F.t..XX..^TTT*..M..Y....^.Y.^*.^..~....X.x..x~.XXH~G..#####~G~~G~..,.,..,.,xx..x ~~~ i~~xx.~...x....~.~..~..,~..***..~..~...,~.~*.~.XXXE...H..SM.~..oo....JX +D: ~~....~~ XXX$8w~..####G~G ~i.XX.,,.,...........G~~~s~~ iiF~...........~.......x.,.**~....,~....~.*XXX.EE.W....M*.~...o.O...X +D: ~.#..#..~~ XXX8##~..##~#.G.~..XX..,H...,.W...,...,~~...,...*,,.x...,.i.....g.....**.........XXXXXXX...EE...H..SM.~..oo....JX +D: ~.##.##..~ XXX###GG~~~*h~....XX.....,....,.W...,.G....W.***...,...,...,....,...,**..q....SX3~~~W#...EE.W....M*.~.oo.....XX +D: ~~.###..~~ X##.##~~G.~~~~i*.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~ +D: ~~...###.~ k ~###X.G~~*Gh~x*~....i.zX8~i.~..h....zzzXiX...$.T.~$......F.~..XX...TTT*..M..Y......Y..*....~....X.x..x~.:7:0 # between gates -F:4:160:0:0:0:0:0:0:-1 -F:5:160:0:0:0:0:0:0:-1 -F:6:160:0:0:0:0:0:0:-1 -F:7:160:0:0:0:0:0:0:-1 -F:A:160:0:0:0:0:0:0:-1 -F:B:160:0:0:0:0:0:0:-1 -F:C:160:0:0:0:0:0:0:-1 -F:E:160:0:0:0:0:0:0:-1 -F:F:160:0:0:0:0:0:0:-1 -F:0:160:0:0:0:0:0:0:-1 +F:4:160:0:0:0:0:0:-1 +F:5:160:0:0:0:0:0:-1 +F:6:160:0:0:0:0:0:-1 +F:7:160:0:0:0:0:0:-1 +F:A:160:0:0:0:0:0:-1 +F:B:160:0:0:0:0:0:-1 +F:C:160:0:0:0:0:0:-1 +F:E:160:0:0:0:0:0:-1 +F:F:160:0:0:0:0:0:-1 +F:0:160:0:0:0:0:0:-1 diff --git a/lib/edit/spiders.map b/lib/edit/spiders.map index 146c152c..f473cc31 100644 --- a/lib/edit/spiders.map +++ b/lib/edit/spiders.map @@ -20,10 +20,10 @@ F:b:89:3:275 F:c:89:3:277 # Grass with Aranea -F:d:89:3:963:0:0:0:0:0:0:2 +F:d:89:3:963:0:0:0:0:0:2 # Grass with Elder aranea -F:e:89:3:964:0:0:0:0:0:0:2 +F:e:89:3:964:0:0:0:0:0:2 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/edit/t_bree.txt b/lib/edit/t_bree.txt index 3ea29922..3d19b888 100644 --- a/lib/edit/t_bree.txt +++ b/lib/edit/t_bree.txt @@ -5,7 +5,7 @@ ############### Additional default terrain settings ############### # Default for Quest 1 = entrance is quest entrance -F:z:8:3:0:0:0:0:0:4 +F:z:8:3:0:0:0:0:4 # Default for Quest 18 = entrance is tree F:y:96:3 @@ -15,37 +15,37 @@ F:x:96:3 ############### Quest 4 - Thieves Hideout finished = house ############### ?:[EQU $QUEST4 2] -F:z:74:3:0:0:0:0:0:7 +F:z:74:3:0:0:0:0:7 ?:[EQU $QUEST4 5] -F:z:74:3:0:0:0:0:0:7 +F:z:74:3:0:0:0:0:7 ?:1 ############### Quest 8 - Troll Glade ############### ?:[AND [EQU $QUEST8 1] [EQU $DAYTIME 0] ] -F:y:8:3:0:0:0:0:0:8 +F:y:8:3:0:0:0:0:8 ?:1 ############### Quest 9 - Wights Grave ############### ?:[EQU $QUEST9 1] -F:x:8:3:0:0:0:0:0:9 +F:x:8:3:0:0:0:0:9 ?:1 ###### Additionnal buildings ####### # Castle: Plot Bree -F:B:75:3:0:0:0:0:0:1 +F:B:75:3:0:0:0:0:1 # Mayor's house -F:b:74:3:0:0:0:0:0:10 +F:b:74:3:0:0:0:0:10 # The Prancing Pony -F:a:74:3:0:0:0:0:0:58 +F:a:74:3:0:0:0:0:58 # Soothsayer -F:c:74:3:0:0:0:0:0:12 +F:c:74:3:0:0:0:0:12 # The Mathom-house -F:e:74:3:0:0:0:0:0:57 +F:e:74:3:0:0:0:0:57 ############### Town Layout ############### diff --git a/lib/edit/t_gondol.txt b/lib/edit/t_gondol.txt index 51cf4b39..63f78d6c 100644 --- a/lib/edit/t_gondol.txt +++ b/lib/edit/t_gondol.txt @@ -15,7 +15,7 @@ F:y:1:3 F:x:1:3 # Default for Quest 23 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:23 +F:w:8:3:0:0:0:0:23 # Decoration = Straight Road (B) F:":66:3 @@ -33,7 +33,7 @@ F:Z:63:3 # Quest 13 assigned, entrance is quest entrance ?:[EQU $QUEST13 1] -F:z:8:3:0:0:0:0:0:13 +F:z:8:3:0:0:0:0:13 ?:1 @@ -41,11 +41,11 @@ F:z:8:3:0:0:0:0:0:13 # Quest 14 assigned, entrance is quest entrance ?:[EQU $QUEST14 1] -F:y:8:3:0:0:0:0:0:14 +F:y:8:3:0:0:0:0:14 # Quest 14 finished, reward is a rare jewelry shop ?:[EQU $QUEST14 5] -F:!:74:3:0:0:0:0:0:42 +F:!:74:3:0:0:0:0:42 ?:1 @@ -53,7 +53,7 @@ F:!:74:3:0:0:0:0:0:42 # Quest 15 assigned, entrance is quest entrance ?:[EQU $QUEST15 1] -F:x:8:3:0:0:0:0:0:15 +F:x:8:3:0:0:0:0:15 ?:1 @@ -61,15 +61,15 @@ F:x:8:3:0:0:0:0:0:15 # Quest 16 finished, reward is a between gate ?:[EQU $QUEST16 5] -F:Z:176:3:0:0:0:0:0:1 +F:Z:176:3:0:0:0:0:1 ?:1 ############### Quest 23 - Wolves hut finished = house ############### ?:[EQU $QUEST23 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST23 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 #################### Buildings #################### @@ -82,46 +82,46 @@ F:w:74:3:0:0:0:0:0:7 # m: White (Paladin) # Tower of the King -F:a:74:3:0:0:0:0:0:27 +F:a:74:3:0:0:0:0:27 # Library -F:b:74:3:0:0:0:0:0:28 +F:b:74:3:0:0:0:0:28 # Castle: Gondolin Plot -F:B:75:3:0:0:0:0:0:4 +F:B:75:3:0:0:0:0:4 # The White Tree:Aerandir:High-Elf -F:c:74:3:0:0:0:0:0:29 +F:c:74:3:0:0:0:0:29 # Craftsmaster -F:d:74:3:0:0:0:0:0:30 +F:d:74:3:0:0:0:0:30 # Earth-Dome -F:e:74:3:0:0:0:0:0:31 +F:e:74:3:0:0:0:0:31 # Prophet -F:f:74:3:0:0:0:0:0:12 +F:f:74:3:0:0:0:0:12 # Minstrels Haven -F:h:74:3:0:0:0:0:0:32 +F:h:74:3:0:0:0:0:32 # Star-Dome:Sulraen:High-Elf -F:i:74:3:0:0:0:0:0:33 +F:i:74:3:0:0:0:0:33 # Valarin Temple -F:j:74:3:0:0:0:0:0:34 +F:j:74:3:0:0:0:0:34 # Sea-Dome -F:k:74:3:0:0:0:0:0:35 +F:k:74:3:0:0:0:0:35 # The Golden Flower -F:l:74:3:0:0:0:0:0:36 +F:l:74:3:0:0:0:0:36 # The Fountain -F:m:74:3:0:0:0:0:0:37 +F:m:74:3:0:0:0:0:37 # Thunderlord's Hide -F:n:74:3:0:0:0:0:0:22 +F:n:74:3:0:0:0:0:22 # Force elven monsters f:ELVEN diff --git a/lib/edit/t_khazad.txt b/lib/edit/t_khazad.txt index 0139fa40..d2d6b6ac 100644 --- a/lib/edit/t_khazad.txt +++ b/lib/edit/t_khazad.txt @@ -8,28 +8,28 @@ F:o:207:3 ###################### Buildings ######################## # Fighters Hall -F:f:74:3:0:0:0:0:0:17 +F:f:74:3:0:0:0:0:17 # Paladins Guild -F:g:74:3:0:0:0:0:0:20 +F:g:74:3:0:0:0:0:20 # Inner Temple -F:h:74:3:0:0:0:0:0:19 +F:h:74:3:0:0:0:0:19 # Mining Supplies -F:i:74:3:0:0:0:0:0:59 +F:i:74:3:0:0:0:0:59 # Default for Quest 25 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:25 +F:w:8:3:0:0:0:0:25 # Force dwarven monsters f:DWARVEN ############### Quest 25 - Evil cave finished = house ############### ?:[EQU $QUEST25 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST25 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 # Town Layout diff --git a/lib/edit/t_lorien.txt b/lib/edit/t_lorien.txt index 9c8c8ad3..b8ecaac4 100644 --- a/lib/edit/t_lorien.txt +++ b/lib/edit/t_lorien.txt @@ -16,63 +16,63 @@ F:x:96:3 F:v:88:3 # Default for Quest 22 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:22 +F:w:8:3:0:0:0:0:22 ############### Quest 22 - Wolves hut finished = house ############### ?:[EQU $QUEST22 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST22 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 ############### Entrance to the Void ############### ?:[EQU $QUEST20 1] -F:v:7:3:0:0:0:0:0:11 +F:v:7:3:0:0:0:0:11 ?:1 ############### Quest 10 - Spiders of Mirkwood ############### # Quest 10 taken, entrance is quest entrance ?:[EQU $QUEST10 1] -F:y:8:3:0:0:0:0:0:10 +F:y:8:3:0:0:0:0:10 ?:1 ############### Quest - Mage/Fireroof quest ############### # Mage/Fireproof Quest taken, entrance is quest entrance ?:[EQU $QUEST"Old Mages quest" 1] -F:z:8:3:0:0:0:0:0:"Old Mages quest" +F:z:8:3:0:0:0:0:"Old Mages quest" ?:1 ###################### Buildings ######################## # The Mirror -F:a:74:3:0:0:0:0:0:23 +F:a:74:3:0:0:0:0:23 # Castle: Plot Lorien -F:B:75:3:0:0:0:0:0:2 +F:B:75:3:0:0:0:0:2 # Seat of Ruling -F:b:74:3:0:0:0:0:0:24 +F:b:74:3:0:0:0:0:24 # Inn -F:c:74:3:0:0:0:0:0:11 +F:c:74:3:0:0:0:0:11 # Beastmaster Shanty -F:d:74:3:0:0:0:0:0:16 +F:d:74:3:0:0:0:0:16 # Fighters Hall -F:f:74:3:0:0:0:0:0:17 +F:f:74:3:0:0:0:0:17 # Wizards Spire -F:g:74:3:0:0:0:0:0:25 +F:g:74:3:0:0:0:0:25 # Priests Circle -F:h:74:3:0:0:0:0:0:26 +F:h:74:3:0:0:0:0:26 # Rangers Guild allows Ranger -F:i:74:3:0:0:0:0:0:21 +F:i:74:3:0:0:0:0:21 # Nest -F:j:74:3:0:0:0:0:0:22 +F:j:74:3:0:0:0:0:22 # Altars F:k:161:3 diff --git a/lib/edit/t_minas.txt b/lib/edit/t_minas.txt index 9f6ae669..b6e78672 100644 --- a/lib/edit/t_minas.txt +++ b/lib/edit/t_minas.txt @@ -9,66 +9,66 @@ F:Z:63:3 # Default for Quest 24 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:24 +F:w:8:3:0:0:0:0:24 #################### Quest 16 - The last Alliance #################### # Quest 16 finished, reward is a between gate ?:[EQU $QUEST16 5] -F:Z:176:3:0:0:0:0:0:0 +F:Z:176:3:0:0:0:0:0 ?:1 ############### Quest 24 - Haunted House finished = house ############### ?:[EQU $QUEST24 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST24 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 #################### Buildings #################### # Library -F:a:74:3:0:0:0:0:0:60 +F:a:74:3:0:0:0:0:60 # Castle -F:b:74:3:0:0:0:0:0:14 +F:b:74:3:0:0:0:0:14 # Casino -F:d:74:3:0:0:0:0:0:15 +F:d:74:3:0:0:0:0:15 # Inn -F:e:74:3:0:0:0:0:0:11 +F:e:74:3:0:0:0:0:11 # Beastmaster Shanty -F:f:74:3:0:0:0:0:0:16 +F:f:74:3:0:0:0:0:16 # Fighters hall -F:g:74:3:0:0:0:0:0:17 +F:g:74:3:0:0:0:0:17 # Tower of Magery -F:h:74:3:0:0:0:0:0:18 +F:h:74:3:0:0:0:0:18 # Inner temple -F:i:74:3:0:0:0:0:0:19 +F:i:74:3:0:0:0:0:19 # Paladin guild -F:j:74:3:0:0:0:0:0:20 +F:j:74:3:0:0:0:0:20 # Ranger guild -F:k:74:3:0:0:0:0:0:21 +F:k:74:3:0:0:0:0:21 # Thunderlord's Hide -F:l:74:3:0:0:0:0:0:22 +F:l:74:3:0:0:0:0:22 # Castle: Plot Minas Anor -F:B:75:3:0:0:0:0:0:5 +F:B:75:3:0:0:0:0:5 # Library Quest F:x:63:3 ?:[EQU $QUEST"Library quest" 1] -F:x:8:3:0:0:0:0:0:"Library quest" +F:x:8:3:0:0:0:0:"Library quest" ?:1 ############### Town Layout ############### diff --git a/lib/edit/t_pref.txt b/lib/edit/t_pref.txt index 84ff947d..454d6a00 100644 --- a/lib/edit/t_pref.txt +++ b/lib/edit/t_pref.txt @@ -1,19 +1,19 @@ # File: t_pref.txt # Defines the preferences for the town features -# letter:feature:cave_info:monster:object:ego:artifact:trap:special +# letter:feature:cave_info:monster:object:ego:artifact:special # Barrow-Downs entrance -F:{:7:3:0:0:0:0:0:4 +F:{:7:3:0:0:0:0:4 # Mirkwood Forest entrance -F:~:7:3:0:0:0:0:0:1 +F:~:7:3:0:0:0:0:1 # Land of Mordor entrance -F:|:7:3:0:0:0:0:0:2 +F:|:7:3:0:0:0:0:2 # Angband Dungeon entrance -F:>:7:3:0:0:0:0:0:3 +F:>:7:3:0:0:0:0:3 # Mountain chain F:^:97:3 @@ -72,34 +72,34 @@ F:Y:192:3 F:O:200:3 # General Store -F:1:74:3:0:0:0:0:0:0 +F:1:74:3:0:0:0:0:0 # Armoury -F:2:74:3:0:0:0:0:0:1 +F:2:74:3:0:0:0:0:1 # Weapons Smith -F:3:74:3:0:0:0:0:0:2 +F:3:74:3:0:0:0:0:2 # Temple -F:4:74:3:0:0:0:0:0:3 +F:4:74:3:0:0:0:0:3 # Alchemy Shop -F:5:74:3:0:0:0:0:0:4 +F:5:74:3:0:0:0:0:4 # Magic Shop -F:6:74:3:0:0:0:0:0:5 +F:6:74:3:0:0:0:0:5 # Black Market -F:7:74:3:0:0:0:0:0:6 +F:7:74:3:0:0:0:0:6 # Home -F:8:74:3:0:0:0:0:0:7 +F:8:74:3:0:0:0:0:7 # Bookstore -F:9:74:3:0:0:0:0:0:8 +F:9:74:3:0:0:0:0:8 # Pet Shop -F:0:74:3:0:0:0:0:0:9 +F:0:74:3:0:0:0:0:9 # Underground Tunnels -- used for tunnels in towns F:I:173:3 diff --git a/lib/edit/thieves.map b/lib/edit/thieves.map index a2cdb442..bab5721e 100644 --- a/lib/edit/thieves.map +++ b/lib/edit/thieves.map @@ -23,19 +23,19 @@ F:d:4:6 F:<:6:8 # Floor with Novice rogue -F:a:1:6:44:0:0:0:0:0:0:2 +F:a:1:6:44:0:0:0:0:0:2 # Floor with Bandit -F:b:1:6:150:43:*:0:0:0:0:2 +F:b:1:6:150:43:*:0:0:0:2 # Floor with novice warrior -F:c:1:6:43:0:0:0:0:0:0:2 +F:c:1:6:43:0:0:0:0:0:2 # Floor with novice mage -F:e:1:6:46:0:0:0:0:0:0:2 +F:e:1:6:46:0:0:0:0:0:2 # Dark floor with novice warrior -F:f:1:4:43:0:0:0:0:0:0:2 +F:f:1:4:43:0:0:0:0:0:2 # Floor with human skeleton F:z:1:6:0:395 diff --git a/lib/edit/thrain.map b/lib/edit/thrain.map index 8adc41be..7c60a839 100644 --- a/lib/edit/thrain.map +++ b/lib/edit/thrain.map @@ -1,25 +1,22 @@ # Floor -F:.:1:0:0:0:0:0:0:0:61 +F:.:1:0:0:0:0:0:0:61 # Some Nazguls -F:1:1:0:951:0:0:0:0:0:61:2 -F:2:1:0:952:0:0:0:0:0:61:2 -F:o:1:0:866:0:0:0:0:0:61 +F:1:1:0:951:0:0:0:0:61:2 +F:2:1:0:952:0:0:0:0:61:2 +F:o:1:0:866:0:0:0:0:61 # Marker -F:,:172:6:0:0:0:0:0:0:61 +F:,:172:6:0:0:0:0:0:61 # Lit permanent wall F:x:61:6 # Door -F:D:48:0:0:0:0:0:0:0:61 - -# Floor with Trap -F:t:1:8:0:0:0:0:* +F:D:48:0:0:0:0:0:0:61 # Deep lava -F:l:85:0:0:0:0:0:0:0:61 +F:l:85:0:0:0:0:0:0:61 # Dungeon layout D: diff --git a/lib/edit/trolls.map b/lib/edit/trolls.map index e5d104fd..c54a5418 100644 --- a/lib/edit/trolls.map +++ b/lib/edit/trolls.map @@ -17,19 +17,19 @@ F:.:88:3 F:;:89:3 # Floor with forest troll -F:f:89:3:297:0:0:0:0:0:0:2 +F:f:89:3:297:0:0:0:0:0:2 # Floor with stone troll -F:s:89:3:401:0:0:0:0:0:0:2 +F:s:89:3:401:0:0:0:0:0:2 # Floor with algroth -F:a:89:3:424:0:0:0:0:0:0:2 +F:a:89:3:424:0:0:0:0:0:2 # Floor with Bert -F:b:89:3:493:0:0:0:0:0:0:2 +F:b:89:3:493:0:0:0:0:0:2 # Floor with Bill -F:i:89:3:494:0:0:0:0:0:0:2 +F:i:89:3:494:0:0:0:0:0:2 # Floor with a Dwarven skeleton F:k:89:8:0:396 diff --git a/lib/edit/volcano.txt b/lib/edit/volcano.txt index 1b89cf3d..c7e64dee 100644 --- a/lib/edit/volcano.txt +++ b/lib/edit/volcano.txt @@ -1,10 +1,10 @@ # File: volcano.txt # Stairway to the Hell -F:$:7:3:0:0:0:0:0:6 +F:$:7:3:0:0:0:0:6 # Hole to the center of the Volcano -F:>:7:3:0:0:0:0:0:5 +F:>:7:3:0:0:0:0:5 ############### Town Layout ############### diff --git a/lib/edit/wights.map b/lib/edit/wights.map index d35c20ee..9e2ea0ce 100644 --- a/lib/edit/wights.map +++ b/lib/edit/wights.map @@ -17,13 +17,13 @@ F:;:88:3 F:f:88:3:381 # Floor with grave wight -F:g:88:3:470:0:0:0:0:0:0:2 +F:g:88:3:470:0:0:0:0:0:2 # Floor with barrow wight -F:b:88:3:499:0:0:0:0:0:0:2 +F:b:88:3:499:0:0:0:0:0:2 # Floor with Emperor Wight -F:e:88:3:604:0:0:0:0:0:0:2 +F:e:88:3:604:0:0:0:0:0:2 # Floor with a Human Skeleton F:k:88:8:0:395 @@ -32,31 +32,31 @@ F:k:88:8:0:395 F:,:172:6 # between gate 1 -F:1:160:6:0:0:0:0:0:2057 +F:1:160:6:0:0:0:0:2057 # between gate 2 -F:2:160:6:0:0:0:0:0:1036 +F:2:160:6:0:0:0:0:1036 # between gate 3 -F:3:160:6:0:0:0:0:0:3847 +F:3:160:6:0:0:0:0:3847 # between gate 4 -F:4:160:6:0:0:0:0:0:2321 +F:4:160:6:0:0:0:0:2321 # between gate 5 -F:5:160:6:0:0:0:0:0:1043 +F:5:160:6:0:0:0:0:1043 # between gate 6 -F:6:160:6:0:0:0:0:0:3599 +F:6:160:6:0:0:0:0:3599 # between gate 7 -F:7:160:6:0:0:0:0:0:2071 +F:7:160:6:0:0:0:0:2071 # between gate 8 -F:8:160:6:0:0:0:0:0:3350 +F:8:160:6:0:0:0:0:3350 # between gate 9 -F:9:160:6:0:0:0:0:0:771 +F:9:160:6:0:0:0:0:771 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/between.map b/lib/mods/theme/edit/between.map index 4fed5c95..375d1ef2 100644 --- a/lib/mods/theme/edit/between.map +++ b/lib/mods/theme/edit/between.map @@ -23,16 +23,16 @@ F:G:89:5:955 F:L:89:5:956 # Floor with grass with a brown thunderlord -F:B:89:5:957:0:0:0:0:0:0:2 +F:B:89:5:957:0:0:0:0:0:2 # Floor with grass with a bronze thunderlord -F:z:89:5:958:0:0:0:0:0:0:2 +F:z:89:5:958:0:0:0:0:0:2 # Floor with dirt with a bronze thunderlord -F:Z:88:5:958:0:0:0:0:0:0:2 +F:Z:88:5:958:0:0:0:0:0:2 # Floor with grass with a gold thunderlord -F:D:88:5:959:0:0:0:0:0:0:2 +F:D:88:5:959:0:0:0:0:0:2 D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:X..T.TT..T...T...T...T.....T....T......T...T.,,.....T......T....T...T.T..T..TT...T..T.TT.T.TT.TX diff --git a/lib/mods/theme/edit/evil.map b/lib/mods/theme/edit/evil.map index a2f00914..aff2de9b 100644 --- a/lib/mods/theme/edit/evil.map +++ b/lib/mods/theme/edit/evil.map @@ -14,13 +14,13 @@ F:<:6:0 F:.:88:0 # Lesser Balrog -F:b:88:0:996:0:0:0:0:0:0:2 +F:b:88:0:996:0:0:0:0:0:2 # Greater Balrog -F:B:88:0:807:0:0:0:0:0:0:2 +F:B:88:0:807:0:0:0:0:0:2 # Pit Fiend -F:P:88:0:812:0:0:0:0:0:0:2 +F:P:88:0:812:0:0:0:0:0:2 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/maeglin.map b/lib/mods/theme/edit/maeglin.map index e3be9972..7916fd9b 100644 --- a/lib/mods/theme/edit/maeglin.map +++ b/lib/mods/theme/edit/maeglin.map @@ -11,7 +11,7 @@ F:X:63:3 F:<:172:3 # up stairs with maeglin -F:{:6:3:825:0:0:0:0:0:0:2 +F:{:6:3:825:0:0:0:0:0:2 # Floor with dirt F:.:88:5 @@ -56,7 +56,7 @@ F:R:88:5:644 F:O:88:5:645 # Floor with dirt with a Lesser Balrog -F:U:88:5:996:0:0:0:0:0:0:2 +F:U:88:5:996:0:0:0:0:0:2 # Granite wall F:#:56:5 diff --git a/lib/mods/theme/edit/nirnaeth.map b/lib/mods/theme/edit/nirnaeth.map index a8c06999..3ad0789c 100644 --- a/lib/mods/theme/edit/nirnaeth.map +++ b/lib/mods/theme/edit/nirnaeth.map @@ -14,28 +14,28 @@ F:s:88:5 F:V:84:5 # Dirt with Olog -F:a:88:5:538:0:0:0:0:0:0:2 +F:a:88:5:538:0:0:0:0:0:2 # Dirt with Cave Troll -F:b:88:5:496:0:0:0:0:0:0:2 +F:b:88:5:496:0:0:0:0:0:2 # Dirt with with Eldrak -F:c:88:1:620:0:0:0:0:0:0:2 +F:c:88:1:620:0:0:0:0:0:2 # Dirt with with Ettin -F:e:88:1:621:0:0:0:0:0:0:2 +F:e:88:1:621:0:0:0:0:0:2 # Dirt with with War troll -F:f:88:1:631:0:0:0:0:0:0:2 +F:f:88:1:631:0:0:0:0:0:2 # Dirt with with Hru -F:g:88:1:709:0:0:0:0:0:0:2 +F:g:88:1:709:0:0:0:0:0:2 # Dirt with Ulik the Troll -F:h:88:5:729:0:0:0:0:0:0:2 +F:h:88:5:729:0:0:0:0:0:2 # Dirt with Ancient green dragon -F:i:88:5:618:0:0:0:0:0:0:2 +F:i:88:5:618:0:0:0:0:0:2 # Dungeon D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/numenor.txt b/lib/mods/theme/edit/numenor.txt index ec8621b1..0ca52738 100644 --- a/lib/mods/theme/edit/numenor.txt +++ b/lib/mods/theme/edit/numenor.txt @@ -1,7 +1,7 @@ # File: numenor.txt # Way to the lost land of Numenor -F:>:7:3:0:0:0:0:0:7 +F:>:7:3:0:0:0:0:7 ############### Town Layout ############### diff --git a/lib/mods/theme/edit/qrand1.map b/lib/mods/theme/edit/qrand1.map index f42cbf1c..041e221c 100644 --- a/lib/mods/theme/edit/qrand1.map +++ b/lib/mods/theme/edit/qrand1.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep lava F:F:85:12 diff --git a/lib/mods/theme/edit/qrand10.map b/lib/mods/theme/edit/qrand10.map index ae45b9cb..cfe57e16 100644 --- a/lib/mods/theme/edit/qrand10.map +++ b/lib/mods/theme/edit/qrand10.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:2056:0:0:0:0:* - # Deep lava F:F:85:12 @@ -26,11 +23,11 @@ F:F:85:12 D: D: xxxxxxx D: xFFFFFx -D: xxxxxx,t.ttxxxx -D: xFFG,t....t,,,xxx -D: xFpG.......t.t.DD -D: xFFG,t....t,,,xxx -D: xxxxxx,t.ttxxxx +D: xxxxxx,....xxxx +D: xFFG,......,,,xxx +D: xFpG...........DD +D: xFFG,......,,,xxx +D: xxxxxx,....xxxx D: xFFFFFx D: xxxxxxx D: diff --git a/lib/mods/theme/edit/qrand11.map b/lib/mods/theme/edit/qrand11.map index 4af3c266..67d5258a 100644 --- a/lib/mods/theme/edit/qrand11.map +++ b/lib/mods/theme/edit/qrand11.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep lava F:L:85:6 diff --git a/lib/mods/theme/edit/qrand12.map b/lib/mods/theme/edit/qrand12.map index 4621ef0b..f24a7927 100644 --- a/lib/mods/theme/edit/qrand12.map +++ b/lib/mods/theme/edit/qrand12.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:187:6 diff --git a/lib/mods/theme/edit/qrand14.map b/lib/mods/theme/edit/qrand14.map index 9f339db0..ee6e8975 100644 --- a/lib/mods/theme/edit/qrand14.map +++ b/lib/mods/theme/edit/qrand14.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 diff --git a/lib/mods/theme/edit/qrand6.map b/lib/mods/theme/edit/qrand6.map index 3b55e985..407a9083 100644 --- a/lib/mods/theme/edit/qrand6.map +++ b/lib/mods/theme/edit/qrand6.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 diff --git a/lib/mods/theme/edit/qrand7.map b/lib/mods/theme/edit/qrand7.map index a7c0607f..4da79778 100644 --- a/lib/mods/theme/edit/qrand7.map +++ b/lib/mods/theme/edit/qrand7.map @@ -16,9 +16,6 @@ F:G:188:6 # Door F:D:38:6 -# Floor with Trap -F:t:1:8:0:0:0:0:* - # Deep water F:W:84:6 @@ -26,10 +23,10 @@ F:W:84:6 F:w:187:6 # Dungeon wayout -D:ttttt -D:tGGGt ,x, -D:tGpGt x,x -D:tGGGt ,x, -D:ttttt +D: +D: GGG ,x, +D: GpG x,x +D: GGG ,x, +D: D: ,x, D: diff --git a/lib/mods/theme/edit/s_bilbo.map b/lib/mods/theme/edit/s_bilbo.map index 12c857e2..4f080de0 100644 --- a/lib/mods/theme/edit/s_bilbo.map +++ b/lib/mods/theme/edit/s_bilbo.map @@ -16,9 +16,6 @@ F:1:89:0:0:0:0:209 # Random monster and random object on grass F:2:89:0:*13:*15 -# Random trap on grass -F:3:89:0:0:0:0:0:* - ### Previous adventurers F:a:89:0:0:391 F:b:89:0:0:392 @@ -33,26 +30,26 @@ F:h:89:0:0:398 D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX -D:XMMMM,g*,,,,,,MMM2,,,,,,,,MMM,,3TMMM,,M,3,M,3,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,T,MX +D:XMMMM,g*,,,,,,MMM2,,,,,,,,MMM,,,TMMM,,M,,,M,,,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,T,MX D:XMM,,,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,M,,M,M,M,M,M,M,,MMMMMMMMMMMMM,,MM,,MMMMMMMMMMMMMMMMMMTMX -D:XM,,MMM,,,MMM,,3MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM,3MM,,,,,a,,,,,,,c,,,*M,MX -D:XMMMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,M,,M,M,M,M,M,M,,,,M,a,b,c,,,,M,,,M,,,,,,,,,,3,3,,,,,M,MX -D:XMM,,,MMM,3,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,33,,,,,MM,,MMMM,,,,,,,,,2,,,,,,M,MX -D:XM,,MMM,3,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,3,M,3,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,3,3,,,,,M,MX -D:XM,MM,,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,33,MMM,MMMMMM,,MMM,,,,,,,,,,,,M,MX -D:XM,,3,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,3,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,b,,,,,*M,MX -D:XMMMM,MMMMMMMMMMMMM,,,,,,,3,,,,M,h,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,h,,MMM,,,MMMMMMMMMMMMM,MX -D:XM>1M,,,,,,3,,,,,,MMM,*g,323,,,M,23T,,,,,3h,,MMMMM,,,,MMT,,MMT,,,,*3,,MMM,,+,,,,,,,,,,,+,MX -D:XMM,MMMMMMMMMMMM,MM,,,,,,,3,,,,M,*,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,2,,MMM,,,MMMMMMMMMMMMM,MX -D:XM,,,,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,3,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,e,,,,,*M,MX -D:XM,MMM,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,33,MMM,MMMMMM,,MMM,,,,3,3,,,,,M,MX -D:XM,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,3,M,3,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,,2,,,,,,M,MX -D:XMM,3,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,33,,,,,MM,,MMMM,,,,,,,,3,3,,,,,M,MX +D:XM,,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM,,MM,,,,,a,,,,,,,c,,,*M,MX +D:XMMMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,M,,M,M,M,M,M,M,,,,M,a,b,c,,,,M,,,M,,,,,,,,,,,,,,,,,,M,MX +D:XMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,,,,,,,,MM,,MMMM,,,,,,,,,2,,,,,,M,MX +D:XM,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,,,M,,,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,,,,,,,,,M,MX +D:XM,MM,,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,,,,MMM,MMMMMM,,MMM,,,,,,,,,,,,M,MX +D:XM,,,,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,,,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,b,,,,,*M,MX +D:XMMMM,MMMMMMMMMMMMM,,,,,,,,,,,,M,h,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,h,,MMM,,,MMMMMMMMMMMMM,MX +D:XM>1M,,,,,,,,,,,,,MMM,*g,,2,,,,M,2,T,,,,,,h,,MMMMM,,,,MMT,,MMT,,,,*,,,MMM,,+,,,,,,,,,,,+,MX +D:XMM,MMMMMMMMMMMM,MM,,,,,,,,,,,,M,*,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,2,,MMM,,,MMMMMMMMMMMMM,MX +D:XM,,,,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,,,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,e,,,,,*M,MX +D:XM,MMM,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,,,,MMM,MMMMMM,,MMM,,,,,,,,,,,,M,MX +D:XM,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,,,M,,,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,,2,,,,,,M,MX +D:XMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,,,,,,,,MM,,MMMM,,,,,,,,,,,,,,,,M,MX D:XMMMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,M,,M,M,M,M,M,M,,,,M,d,e,f,,,,M,,,+,,,,,,,,,,,,,,,,,,M,MX -D:XMg3MMM,3,MMM,,,MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM3,MM,,,,d,,,,,,,f,,,,*M,MX +D:XMg,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM,,MM,,,,d,,,,,,,f,,,,*M,MX D:XMM*,,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,M,,M,M,M,M,M,M,,MMMMMMMMMMMMM,,MM,,MMMMMMMMMMMMMMMMMM,MX -D:XMMMM2,,,,3,,,MMM,,,,,,,,,MMM,,3MMMM,,M,3,M,3,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,M,MX +D:XMMMM2,,,,,,,,MMM,,,,,,,,,MMM,,,MMMM,,M,,,M,,,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,M,MX D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -P:22:90 \ No newline at end of file +P:22:90 diff --git a/lib/mods/theme/edit/s_crypt.map b/lib/mods/theme/edit/s_crypt.map index 3d6ce71c..e6600cd6 100644 --- a/lib/mods/theme/edit/s_crypt.map +++ b/lib/mods/theme/edit/s_crypt.map @@ -67,30 +67,30 @@ D:X.%%@=-=-X99X.....X..XLL..X%X..LLX..XhVV..X99X=-=-..GGX D:X%%@@...XXX9XX....XX.XX...X.X...XX.XXVVVVXX9XXX=-=.XGGX D:X@@@....X8X-=XgggggX..X..dX4Xd..X..XWWWWWX-=X8X-=-.XGGX D:X......XX%XX=XXgddgXX.XX8GXXXG8XX.XXWWWWXX-XX%XX...XGGX -D:XIXIXXIX*X=X-=XgddggX..X8G^.^G8X..XWWWWWX-=X.X.X&&&XGGX -D:XXXIXIXX*X-XX=XXggggXX.XXG^.^GXX.XXWWWWXX-XX.X.XX&&XGGX -D:XXXXXIX**X=-X=-XIIXXXX..XG^.^GX..XVWWWVX=-XX.XddX@@XGGX -D:X^^^^XX**X=-XX=XXIXIIXX.XX^.^XX.XXVVVVXX-XX%.XedXX@XGGX -D:X^^f^Xe**X%%.X=-XXIXXIXbbX^.^XbbX.VV.XX=-XbX.XXXIX@IIGX -D:X^^^XXe..X...XX=-XXXIXXXbXX.XXbXX...XX=-XXbX.XaaaXXXIGX -D:X^^XXbbb.XGGG.XX=-XXIIXXbbXDXbbX...XX=-XXbbX.XaaaaXXIGX -D:X^XXcbab.XVdG.cXX=-XXXIXXabXbaXX.XXX=-XXbbbX.XaaaaaXXfX +D:XIXIXXIX*X=X-=XgddggX..X8G...G8X..XWWWWWX-=X.X.X&&&XGGX +D:XXXIXIXX*X-XX=XXggggXX.XXG...GXX.XXWWWWXX-XX.X.XX&&XGGX +D:XXXXXIX**X=-X=-XIIXXXX..XG...GX..XVWWWVX=-XX.XddX@@XGGX +D:X....XX**X=-XX=XXIXIIXX.XX...XX.XXVVVVXX-XX%.XedXX@XGGX +D:X..f.Xe**X%%.X=-XXIXXIXbbX...XbbX.VV.XX=-XbX.XXXIX@IIGX +D:X...XXe..X...XX=-XXXIXXXbXX.XXbXX...XX=-XXbX.XaaaXXXIGX +D:X..XXbbb.XGGG.XX=-XXIIXXbbXDXbbX...XX=-XXbbX.XaaaaXXIGX +D:X.XXcbab.XVdG.cXX=-XXXIXXabXbaXX.XXX=-XXbbbX.XaaaaaXXfX D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X D:XX.bababa%eWG.%.BXXXbcbbbbX.XbbbbcbXXXC...fX.%.......XX D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X D:X8XXcbab.XVdG.cXX=-XXX.XXabXbaXXLXXX=-XXbbbX.XaaaaaXX.X D:X88XXbbb.XGGG.XX=-XX...XbbXDXbbXLLLXX=-XXbbX.XaaaaXXX.X D:XXXIXXe..X...XX=-XX.GGXXbXX.XXbXXILIXX=-XXbX.XaaaXXXX.X -D:X9889Xe**X%%.X=-XXG.GdXbbX^.^XbbXILLIXX=-XbX.XXXIXhGG.X -D:XXIXXXX**X=-XX=XXdG.GXX.XX^.^XX.XXILIIXX-XX%.XedXXXXX.X -D:X99999X**X=-X=-XGGG..X..XI^a^IX..XILLIIX=-XX.XddX..eeeX -D:XXXXIXXX*X=XX-XX....XX.XXI^a^IXX.XXILLIXX=XX.X.XX.GGGGX -D:X^^^^^cX*X-X=-X.....X..X.I^a^I.X..XIILLIX=-X.X.Xdddd..X -D:XllllX^XX%XX=XXG.GGXX.XX.IXXXI.XX.XXIILIXX-XX%XXXXXXX.X -D:X^^^cl^=X8X-=XeG.GeX..X...X4X...X..XILLLIX-=X8X.aaaaaaX -D:XLLX^l^-XXX9XXGG.GXX.XX...X.X...XX.XXLLLLXX9XXX.GGGGGGX -D:X..L^l^=-X99X.....X..XWW..X%X..WWX..XLLLL.X99XXbbbbb..X -D:X7.L^l^=-X8XX5...XX.XXWWW..c..WWWXX.XXLL.AXX8XXbbbbb.6X +D:X9889Xe**X%%.X=-XXG.GdXbbX...XbbXILLIXX=-XbX.XXXIXhGG.X +D:XXIXXXX**X=-XX=XXdG.GXX.XX...XX.XXILIIXX-XX%.XedXXXXX.X +D:X99999X**X=-X=-XGGG..X..XI.a.IX..XILLIIX=-XX.XddX..eeeX +D:XXXXIXXX*X=XX-XX....XX.XXI.a.IXX.XXILLIXX=XX.X.XX.GGGGX +D:X.....cX*X-X=-X.....X..X.I.a.I.X..XIILLIX=-X.X.Xdddd..X +D:XllllX.XX%XX=XXG.GGXX.XX.IXXXI.XX.XXIILIXX-XX%XXXXXXX.X +D:X...cl.=X8X-=XeG.GeX..X...X4X...X..XILLLIX-=X8X.aaaaaaX +D:XLLX.l.-XXX9XXGG.GXX.XX...X.X...XX.XXLLLLXX9XXX.GGGGGGX +D:X..L.l.=-X99X.....X..XWW..X%X..WWX..XLLLL.X99XXbbbbb..X +D:X7.L.l.=-X8XX5...XX.XXWWW..c..WWWXX.XXLL.AXX8XXbbbbb.6X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXIIIIXIIIIXXIIIXIIIIXXIIIXXXXggggXc..cXaaaaXbb.CX D:XIIIIIXIXXIIIXXIIXIXIXIXXIXXIXIXXXXgddg%....%aaaa%bb..X diff --git a/lib/mods/theme/edit/s_doom.map b/lib/mods/theme/edit/s_doom.map index 5be3b67d..12ff7d06 100644 --- a/lib/mods/theme/edit/s_doom.map +++ b/lib/mods/theme/edit/s_doom.map @@ -15,7 +15,7 @@ F:$:178:0 F:%:205:0 # Hidden Door -F:+:48:0:0:0:0:0:0:0:177 +F:+:48:0:0:0:0:0:0:177 # Normal Door F:D:32:0 @@ -29,12 +29,6 @@ F:L:85:0 # Treasure (random) on shallow lava F:*:86:0:0:* -# Trap (random) on deep lava -F:^:85:0:0:0:0:0:* - -# Trap (random) on shallow lava -F:t:86:0:0:0:0:0:* - # up staircase F:<:6:0 @@ -194,28 +188,28 @@ D:X #%%NNLL...JJJ....LL# D:X ##### #NNNN...Ljjjjj..LLL# #############################################..1!!!!...L### X D:X##.LL## #nNNN...LLJJj.LLLLL# #L....&!&!&....L%%%%%%%L..mRR%R%%M%MML%LL...DL...!1&..@L%%# X D:X#LL<..# #nn.LL.LLLL...%%%LL# #..##########################################LLL....LLL%%%# X -D:X##%LL## #....LLL%%LLL..^LLL# #.L# #LL2.t..q.LLL## X +D:X##%LL## #....LLL%%LLL..LLLL# #.L# #LL2....q.LLL## X D:X ###+# #D##############+#######.L# ##%%.LLLL&L...# X -D:X #!# #.# #.......L%%# ##%%LL..2...t.## X -D:X #^# #.############ ##########+# XXXXXXXXXX ##.9.t.LLLLL## X +D:X #!# #.# #.......L%%# ##%%LL..2.....## X +D:X #L# #.############ ##########+# XXXXXXXXXX ##.9...LLLLL## X D:X #.# #LL%%%%LL...p# #11111# X########X ###############.2..LQ#+# X -D:X ##.# ############D## #11211# X#9....9#X #o.....t...# ###^L..#(# X +D:X ##.# ############D## #11211# X#9....9#X #o.........# ###LL..#(# X D:X #L## ##%%V## #12221# XXXXXX#..$$..#XXXXXX#LLLLKkk...# ###D#### X -D:X ##!# ##.VH^%## #12221# X######t....m######X#LLLLkkk.LL# #.# X -D:X #.# ##.iH%%hv## #11211### X#sSSSrrt%.mVVVLLe#X#.LL.kkk...# ##.# X -D:X ###D######### #tiI%HHhvL# #11111+9# X#rRssRr.%.mVvvm..#X#%...LLL...# ##Lo###### X -D:X #.^t^LLL...L## #.LIH%Hc..# ######### X#.MmmM..%..MMLLL.#X#%%......L&# ##.L##EBBB# X -D:X #.jJ%%%L....L# ##..ICCL.## X#.L..L..%ttL.....#X########D### #.####LAAB## X +D:X ##!# ##.VHL%## #12221# X######.....m######X#LLLLkkk.LL# #.# X +D:X #.# ##.iH%%hv## #11211### X#sSSSrr.%.mVVVLLe#X#.LL.kkk...# ##.# X +D:X ###D######### #.iI%HHhvL# #11111+9# X#rRssRr.%.mVvvm..#X#%...LLL...# ##Lo###### X +D:X #.L.LLLL...L## #.LIH%Hc..# ######### X#.MmmM..%..MMLLL.#X#%%......L&# ##.L##EBBB# X +D:X #.jJ%%%L....L# ##..ICCL.## X#.L..L..%..L.....#X########D### #.####LAAB## X D:X #JJJJL%LLL&..# ##..L.L## X#9LLL...%..LL(LLq#X #..L..# #.LL..LB%%L# X -D:X #J%J..LLL%%LL## ##.t.## X######......######X #L.#### ###..LL%%%L## X -D:X #jJJ^..bL%LL..## ##D################# XXXXXX#.LUUL.#XXXXXX #.L# #.PL%%%@(L# X -D:X ##....BABLL..L.## #.uLL^L..L%^^..L%%# X#.L%%LL#X #L.#### ###.L%LL..##X -D:X ##....B%%L.....## #################L# X#LLL..t#X #..twW# #L..LL...+pX +D:X #J%J..LLL%%LL## ##...## X######......######X #L.#### ###..LL%%%L## X +D:X #jJJL..bL%LL..## ##D################# XXXXXX#.LUUL.#XXXXXX #.L# #.PL%%%@(L# X +D:X ##....BABLL..L.## #.uLLLL..L%LL..L%%# X#.L%%LL#X #L.#### ###.L%LL..##X +D:X ##....B%%L.....## #################L# X#LLL...#X #...wW# #L..LL...+pX D:X ###....LLL...LLL####################.# X#%L..7.#X #####L# ###LL...1###oX -D:X #9+L%%L...LLL....D.+..%%oF.%%^..%%LL.# X#LLLLt.#X #p# #%%%!@..## #tX -D:X ##################L###.L###..###.L#### X#7tt.LL#X #.# ######### #EX +D:X #9+L%%L...LLL....D.+..%%oF.%%L..%%LL.# X#LLLL..#X #p# #%%%!@..## #.X +D:X ##################L###.L###..###.L#### X#7...LL#X #.# ######### #EX D:X ##################.# ############## X#.LLLL.#X ######D###################LX -D:X ##11!!!&LL.+(#L# X#LL%%LL#X #G..LLL.LL...D..LL....^LLL%X +D:X ##11!!!&LL.+(#L# X#LL%%LL#X #G..LLL.LL...D..LL....LLLL%X D:X ##1!!!%%%%Lp###L# X#L%%%%Q#X #..LF....K...##############X D:X ##!!%%%%%LLL..#.# XXXXDDXXXX########.LLLL..KKK..#### X D:X ##.LLLLLLL...+.# #%%%%%%%%%%%%%+LL7..LL.k..L+o7# X diff --git a/lib/mods/theme/edit/s_factory.map b/lib/mods/theme/edit/s_factory.map index 0cc3de1b..02d3e5f9 100644 --- a/lib/mods/theme/edit/s_factory.map +++ b/lib/mods/theme/edit/s_factory.map @@ -83,65 +83,62 @@ F:<:6:0 F:>:7:0 # between gate 1 -F:1:160:6:0:0:0:0:0:845 +F:1:160:6:0:0:0:0:845 # between gate 2 -F:2:160:6:0:0:0:0:0:846 +F:2:160:6:0:0:0:0:846 # between gate 3 -F:3:160:6:0:0:0:0:0:4370 +F:3:160:6:0:0:0:0:4370 # between gate 4 -F:4:160:6:0:0:0:0:0:3339 +F:4:160:6:0:0:0:0:3339 # between gate 5 -F:5:160:6:0:0:0:0:0:4119 +F:5:160:6:0:0:0:0:4119 # between gate 6 -F:6:160:6:0:0:0:0:0:6659 +F:6:160:6:0:0:0:0:6659 # between gate 7 -F:7:160:6:0:0:0:0:0:9257 +F:7:160:6:0:0:0:0:9257 # between gate 8 -F:8:160:6:0:0:0:0:0:8018 +F:8:160:6:0:0:0:0:8018 # between gate 9 -F:9:160:6:0:0:0:0:0:9298 +F:9:160:6:0:0:0:0:9298 # between gate A -F:A:160:6:0:0:0:0:0:805 +F:A:160:6:0:0:0:0:805 # between gate B -F:B:160:6:0:0:0:0:0:831 +F:B:160:6:0:0:0:0:831 # between gate D -F:D:160:6:0:0:0:0:0:809 +F:D:160:6:0:0:0:0:809 # between gate E -F:E:160:6:0:0:0:0:0:2826 +F:E:160:6:0:0:0:0:2826 # between gate F -F:F:160:6:0:0:0:0:0:2831 +F:F:160:6:0:0:0:0:2831 # between gate H -F:H:160:6:0:0:0:0:0:4631 +F:H:160:6:0:0:0:0:4631 # between gate J -F:J:160:6:0:0:0:0:0:7198 +F:J:160:6:0:0:0:0:7198 # between gate K -F:K:160:6:0:0:0:0:0:7990 +F:K:160:6:0:0:0:0:7990 # between gate N -F:N:160:6:0:0:0:0:0:9253 +F:N:160:6:0:0:0:0:9253 # Treasure on floor F:$:1:0:0:*65 -# Trap (random) on floor -F:^:1:0:0:0:0:0:* - ### Monsters @@ -203,9 +200,9 @@ D:X&XXXe.XX~XXeeeXX~XXe..XX~~~~~~ttttXX.....X,,,,Ll,ll,X..XII.X.X.i.XXG_XXXXL%%L D:X..&..XX~~~XXeXX~?~XX.&X~~~~t~ttttttX.;.;.X,lllll,ll,XX_..XX.XX#X..X#XXf.X_GG_X.fX D:XGXGXGX?~~~~_c_~~~~~X.&XX~~~~t~ttttXX.....X,L,,,,,lL,.X.#XXi..G.XXiX..XX.........X D:X.....XX~~?XXcXX~~~XXa..XXX__XX__XXXX.;.;.X,L,.XXX%L%XXXXcXX.XXX.X.X.X.XX.X.ff.X.X -D:XXgXgXgXX~XXcccXX?XXXXX.a^^a.^^a...bXXXGXXX%L%XX.XX%XXa.aXIX.Xi#.XiXI.X.X........X -D:XgXgXgXgXXX^^^^^XXX,ccXXXXXXXXXXXb.XX#...#XX%XX.XI_XX....X.X.#XXXIX.#GX.X.X....X.X -D:X.......4X.^^5^^.X.c.c..c..c.c..c.XX.#...#.XXXIXX.X.a.c..XXi..I.X._.X.XXX...&&...X +D:XXgXgXgXX~XXcccXX?XXXXX.a..a...a...bXXXGXXX%L%XX.XX%XXa.aXIX.Xi#.XiXI.X.X........X +D:XgXgXgXgXXX.....XXX,ccXXXXXXXXXXXb.XX#...#XX%XX.XI_XX....X.X.#XXXIX.#GX.X.X....X.X +D:X.......4X...5...X.c.c..c..c.c..c.XX.#...#.XXXIXX.X.a.c..XXi..I.X._.X.XXX...&&...X D:X..&&...XXXXXXXXXXc,c,c.XX_XX..ccXX..#...#..XX#iiX.X.a..a.XX.#XX._X.XX.XX.X....X.X D:X......XXEX,,,c,c,cc,ccXXMRMXXc.XX...#...#...XXX#iXXXXXc..IXGX.XXiX.....X........X D:XXXXXXXX..X,,,,,,,,,,,XXM..RMXXXX$$XXX...XXX$$XX..XX_GXXXXXX.Ii.X_X.X#XXX.X....X.X @@ -217,20 +214,20 @@ D:Xs.s._..&.&.XlX_._XlX..gg....X$$$#....%%%....#$$$X.IIX.X..XIXX.X.G#X..dXLl#_._ D:X.s.s_g....XXlXXGXXlXX.g..d&.XX$$XXXXX...XXXXX$$XXXX._XG#X.XX.X_X.XX.c.XXXX...XXXX D:XXXXXXXXXXIXLLLXGXLLLXgg.g.d..XX$$$XXX...XXX$$$XX<...XiXX.X.Xi.X.X.Xd..X.........X D:Xgg.gXg.gXIXL%LXGXL%LXGXXX__XXXXX$$XXX...XXX$$XXXXXXIXXiX#XX#XX#X_XX...XXXXXXXIXXX -D:X^^X^X^X^X^XX_XXGXX_XXGXXg..g.%.XX...X...X...XX.GI.X._iXXG...I..I.GX..dIX#I#I#I#IX -D:X^^X^X^X^X^Xhl,&c.a&g.l.XX.g.g%RRXX..X###X..XX..#_X..XXX_iXXIXiXi_.Xc..X.IX.XXXIXX -D:X^^X^X^X^X^X&,,,l&,lac.&.__.g.%.R.XX...>...XX#X.X..XX#.._X.X.X.#.XGX.X.XX_XX.X#i.X +D:X..X.X.X.X.XX_XXGXX_XXGXXg..g.%.XX...X...X...XX.GI.X._iXXG...I..I.GX..dIX#I#I#I#IX +D:X..X.X.X.X.Xhl,&c.a&g.l.XX.g.g%RRXX..X###X..XX..#_X..XXX_iXXIXiXi_.Xc..X.IX.XXXIXX +D:X..X.X.X.X.X&,,,l&,lac.&.__.g.%.R.XX...>...XX#X.X..XX#.._X.X.X.#.XGX.X.XX_XX.X#i.X D:XH.Xg.gXg.gXla,ca&,f.fl.leXX..%R.RRXX.....XX.G.XX#XXI.XX.#.XGXXXiX.#X.XX.i._X.XGX# D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGXXXXXXXG.X..X#XXX.XX.XXI._XIX.XIXXI#.XXX.X D:X,.,G,&&,ee,ff,hgg,&&,,,.,,I7XXXc..aX.;.;.X&..XXXG#XX.G.XXX..XG######.G.#..##..iXX -D:X^X,G.&&.ee,ff..gg,&&,.,,,,XXX..MRM.X.....X.....XXX.IIX.XGI.XX..IXXXXXXXXXXX._.X._ -D:X^X,XXXXXXXXXXX.XXXXXX,,.XXX..$.....X.;.;.Xh..&...GXXXGXi#IXX.IXX..#.....#.XX##XXX -D:X^X,llL,LlLL,LXXXlll,XXXXX..aMR..$.cX.....X.....XXXX8XXXXXXXX#IX###..##.#..#XI.XKX -D:X^XlLCCCCCCCCLllll%%l.R.R.R.R..M.R..X.;.;.X&..XXX.#X#.i.#.XXX#X...###.#.##.#.X#IXX -D:X^X,lL,llL,Ll,XXX,lllXXXXXc.M..R.c..X.....XXXXX#.#.XIX#Xi.X...X###.#####.#...X#XXX -D:X^X,XXXXXXXXXXX.XXXXXX,.,XXX...$.M..X.;.;.Xh.##i#.#XX_IX.#X.##I....#.#.###.##X#I.X -D:X^X.G,&&,,gg.&.,ee,ff,,.,.,XXXa..R..X.....X..#.###.XIXX.X.X.##XX####..#..###II.X.X -D:X,,,G,&&,,gg.&h.ee,ff,..,.,I^XXXM..9X.;J;.Xh.##.###..iiX#.X....II.....#....IX..XNX +D:X.X,G.&&.ee,ff..gg,&&,.,,,,XXX..MRM.X.....X.....XXX.IIX.XGI.XX..IXXXXXXXXXXX._.X._ +D:X.X,XXXXXXXXXXX.XXXXXX,,.XXX..$.....X.;.;.Xh..&...GXXXGXi#IXX.IXX..#.....#.XX##XXX +D:X.X,llL,LlLL,LXXXlll,XXXXX..aMR..$.cX.....X.....XXXX8XXXXXXXX#IX###..##.#..#XI.XKX +D:X.XlLCCCCCCCCLllll%%l.R.R.R.R..M.R..X.;.;.X&..XXX.#X#.i.#.XXX#X...###.#.##.#.X#IXX +D:X.X,lL,llL,Ll,XXX,lllXXXXXc.M..R.c..X.....XXXXX#.#.XIX#Xi.X...X###.#####.#...X#XXX +D:X.X,XXXXXXXXXXX.XXXXXX,.,XXX...$.M..X.;.;.Xh.##i#.#XX_IX.#X.##I....#.#.###.##X#I.X +D:X.X.G,&&,,gg.&.,ee,ff,,.,.,XXXa..R..X.....X..#.###.XIXX.X.X.##XX####..#..###II.X.X +D:X,,,G,&&,,gg.&h.ee,ff,..,.,I.XXXM..9X.;J;.Xh.##.###..iiX#.X....II.....#....IX..XNX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/s_gates.map b/lib/mods/theme/edit/s_gates.map index 3ac7ccbf..37d39f22 100644 --- a/lib/mods/theme/edit/s_gates.map +++ b/lib/mods/theme/edit/s_gates.map @@ -55,35 +55,35 @@ F:1:1:0:0:0:0:10 ### Level design D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -D:X*****...@%...aX.X9@********%%%%%%X9.VV....Xd.............A^^.......dX -D:X*****...@%...aX.X@@********%%%%%%X.VVVV.X.XX.............B^^........X -D:X*****...@%...aX.X99*XXX****%%88%%XVVWWVVX..XX.............^^.......9X -D:X*****...@%...aX.X@@XXdXX***%%88%%XVVWWVVX...XX............^^.......CX -D:X*****...@%...aX.X@XX...XX**%%%%%%X.VVVV.X.X..XX..........5^^........X -D:X........@%...aX.XXX.....XX*%%%%%%X9.VV..X.XX..XX.........F^^.......dX +D:X*****...@%...aX.X9@********%%%%%%X9.VV....Xd.............A.........dX +D:X*****...@%...aX.X@@********%%%%%%X.VVVV.X.XX.............B..........X +D:X*****...@%...aX.X99*XXX****%%88%%XVVWWVVX..XX......................9X +D:X*****...@%...aX.X@@XXdXX***%%88%%XVVWWVVX...XX.....................CX +D:X*****...@%...aX.X@XX...XX**%%%%%%X.VVVV.X.X..XX..........5..........X +D:X........@%...aX.XXX.....XX*%%%%%%X9.VV..X.XX..XX.........F.........dX D:X%X......@%...aX.X........XIXXXXXXXXXXX..X..XX..XXXXIXXXXXXXXXXXXXXXXX D:X.XXX....@%...aX.X..........XXX..>X...X..X...XX..XXXaXaXaXaXaXaXaXaXaX D:X...XXX..@%...aI.X..........XXX7..X...D..X.X..XX..XX.................X D:X.....XXX@%...aX.X..........XXXXXXXXXXX..X.XX..XX..XX................X D:X.......XXX...aX.X..........XXXXXXXaG....X..XX..XX..XX...............X -D:X..X......XXX.XX%XX^^^^^X...XXXXXXXaG....X...XX..XX..XX..............X -D:X^^XX.......XXX***X^^^^^X...XIIII7XXXXXXXXXX..XX..XX..XXXXXXXXXXXX+X8X -D:X^^XX.........X.6.X^^^^^X...XIXXXXX&&&&&&&&XX..XX..XX...........cX.XXX -D:X..XXX........X***X^^^^^X...XIXXXXX.........XX..XX..XXXXXXXXXXXXXX..XX -D:X^^X8X........XXXXX^^^^^X...XIIIIIXVVV.......XX..XX.............bXX..X +D:X..X......XXX.XX%XX.....X...XXXXXXXaG....X...XX..XX..XX..............X +D:X..XX.......XXX***X.....X...XIIII7XXXXXXXXXX..XX..XX..XXXXXXXXXXXX+X8X +D:X..XX.........X.6.X.....X...XIXXXXX&&&&&&&&XX..XX..XX...........cX.XXX +D:X..XXX........X***X.....X...XIXXXXX.........XX..XX..XXXXXXXXXXXXXX..XX +D:X..X8X........XXXXX.....X...XIIIIIXVVV.......XX..XX.............bXX..X D:X..X8XX................XX...XXXXXIXVVVV.......XX..XXXXXXXXXXXXXXXXXX+X -D:X^^X88X................XX...XIIIIIXVVVVVV..@...XX.^^^^^^^^^^^^^a.....X -D:X^^X99XX...............XX...XIXXXXX4..VVVV......XXXXXXXXXXXXXXXXXXXXXX +D:X..X88X................XX...XIIIIIXVVVVVV..@...XX..............a.....X +D:X..X99XX...............XX...XIXXXXX4..VVVV......XXXXXXXXXXXXXXXXXXXXXX D:X..X999X...............XX...XIXXXXXXXXX.VVVV....***********.........bX -D:X^^XIIIXX..............XX...XIX...5..fX...VVVVV.@....................X +D:X..XIIIXX..............XX...XIX...5..fX...VVVVV.@....................X D:X..X....X........d.....XX...XIXf......X...VVVVVVV...............@....X -D:X^^X....XX............XXX...XIXXXXXXXXX.......VVVVVVV................X -D:X^^X&&&&&X............XXX...XIIIIIXe...........VVVVVVVVVVVV..........X +D:X..X....XX............XXX...XIXXXXXXXXX.......VVVVVVV................X +D:X..X&&&&&X............XXX...XIIIIIXe...........VVVVVVVVVVVV..........X D:X..X%%%.%XX..........XXX....XXXXXIX.............@VVVVVVVVVVVV@.......X -D:X^^X88%.%8X.........XXX.....XXXXXIX...................VVVVVVVVVV.....X +D:X..X88%.%8X.........XXX.....XXXXXIX...................VVVVVVVVVV.....X D:X..X%%%.%%XX........XX......XXXXXIX@.....................VVVVVVVVVVVVX -D:X^^X......cX......XXXX......XXXXXIX........@..........@....VVVVVVVVVVX -D:X^^^......cXX888XXXXX......dIIIIIIX.........................b.VVV...6X +D:X..X......cX......XXXX......XXXXXIX........@..........@....VVVVVVVVVVX +D:X.........cXX888XXXXX......dIIIIIIX.........................b.VVV...6X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @@ -97,9 +97,9 @@ D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXLgXXXXXXXXXXXXXXXXXXXXXXXXLLLLXXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXfXXXXXXXXLXXXXXXXXXXXXXXXXXXXXXXXXXgLLLLXXXXXXXXXXX D:XXXXXXXXXXXXXXXXXXX.XXXXXXXghgXXXXbXXXXXXXXaXXXXXXXXXXXXXXLLLLgXXXXXXX D:XXXXXXXXXXXXXXXXXXX.XXXXXXXg1gXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXgLLXXXXXXX -D:XXXXXXXXXXXXXXXXXXX^XXXXXXXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXXLXXXXXXX -D:XXXXXXXXXXXXXXX4..^^^..^^^.......^^^......^^^.........EXXXXXXXLXXXXXXX -D:XXXXXXXXXXXXXXXXXXXXXXXX^XXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXLLXXXXXXX +D:XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXXXLXXXXXXX +D:XXXXXXXXXXXXXXX4......................................EXXXXXXXLXXXXXXX +D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXXLLXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXLLLXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXcXXXXXXXXaXXXXXXXXXXXXXXXLLXXXXXXXXX D:XXXXXXXXXXXXXXXXXXXXXXXXeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgLLLXXXXXXXXXX diff --git a/lib/mods/theme/edit/s_name.map b/lib/mods/theme/edit/s_name.map index 795d8786..e1a352ef 100644 --- a/lib/mods/theme/edit/s_name.map +++ b/lib/mods/theme/edit/s_name.map @@ -62,46 +62,46 @@ F:1:1:0:0:0:0:16 ### Level Design D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -D:X.....LLLLLLLLL.....XXX.G=-&&=-G^.........>X -D:X.LLL...........LLLXX...G=-&.=-G^........1.X -D:X.L9L.LLLLLLLLLLLLX%...EGE.=&.FG^..........X -D:X.L99.L&..........X%....G..&-..G^....j.....X -D:X.LLLLL&LLLLLLLLL.LXX...G=-=&-=G^..........X -D:X....&&&L.......L.L*XXX.G-=&&-=G^^^^^^^^^^^X +D:X.....LLLLLLLLL.....XXX.G=-&&=-G..........>X +D:X.LLL...........LLLXX...G=-&.=-G.........1.X +D:X.L9L.LLLLLLLLLLLLX%...EGE.=&.FG...........X +D:X.L99.L&..........X%....G..&-..G.....j.....X +D:X.LLLLL&LLLLLLLLL.LXX...G=-=&-=G...........X +D:X....&&&L.......L.L*XXX.G-=&&-=G...........X D:XLLLLLLLL.LLLLL..&L**XXXXXXXGGGG%XXXXXXXXXXX -D:XXXXXXLL..L***LLLLLLLX^^^^8Xi....%@@^^.^^@@X -D:X5..8X.&.XXXXXX......D^^^^8XIIIIIXbb^^.^^ccX -D:X...8X...XA...X.LLLLLX^^^^8X.....X..^^.^^..X -D:X...8X.XXXC...X.LL...XXXIXXX^^^^^X..^^.^^..X -D:XGXXXX.LfX7...X&LL.L.Xa^^^aXf...fX..^^.^^..X -D:X.X5XL.L*XB...X&&..L.X^b^b^X^^^^^X..^^.^^..X -D:X.X^XL.L*XXXXXXLLLLL.X^^7^^X.....X..^^.^^..X -D:X.X^XL.L***fXL.....&&X^b^b^XIIIIIX..^^.^^..X -D:X.X^XL.LLLLLXL.LLLLLLXa^^^aXi....X..^^.^^..X -D:X.X^XL.........XXXXXXXXX%XXXXXXXXX..^^.^^..X -D:X.X^XXXXXXXXXXLX^...^Xe-^=dX^^..&X..^^.^^..X -D:X.X^^^^^^^^^^XLX.^^^.X-^^^=X^^..&X..^^.^^..X -D:X.XXXXXXXXXX^X8Xf^B^.%^^6^^%^^C.&X..^^.^^..X -D:X.LLLLLLLLL+^XXX.^^^.X-^^^=X^^..&X..^^.^^..X -D:X.XXXXXXXXXXXXXX^...^Xd-^=eX^^..&X..^^.^^..X -D:X.Xbbbbb......XXXXXXXXXX%XXXXXXXXX..^^.^^..X -D:X.XbbbbXXXX^^^^XX....X^^^^^X...h.X..^^.^^..X -D:X.XbbbXX^^XXX^^^XX...X^ccc^X....0X..^^.^^..X -D:X.XbbXX.^X%bXX^^^XX..X^.A.^X.....X..^^0^^..X -D:X.IbXX..XXbbbXX^^^XX.X^ccc^XIXXXXXXXXXXXXXXX -D:X.XXX..XX.....X%^^^XXX^^^^^XlllllllllllllllX -D:X.X99.XXW......XX^^^XXXXXXXXlllllllllllllllX -D:X.X99XXWWW...a..XX^^.XXllllllLLLLLlXXXX%XXXX -D:X.XXXX..WWW.....cXX^.XXXXXlllllllllXVVVVVVVX -D:X.X8.....WWW....ccX^.X^^^XLLLlLLLLLXVVVVVVVX -D:X.X%XXXXXXXWW...cXXX.X+X^XlllllllllXV%%%%%VX -D:X.X.......XWWW..X%^X.XLX^XlLLLLLLLLXV%8^8%VX -D:X.XXXXXX%.X.WWWXX^^X.XLX^XlllllllllXV%^a^%VX -D:X.X.IIIIX.X..WXX..XXcXLX^XLLLlLLLLlXV%^^^%VX -D:X.X%XXXIX.X..XX..XXccXLX^XlglllLgllXV%^^^%VX -D:X.Xa.6XIX.X.XX..XXcccXLX^XlllllXXXXXV%^a^%VX -D:X+XXX.XIX.X.X99XXccccXLX^XXXXXXX888XV%8^8%VX -D:X%%%Xa%.X.%8X99XcccccXLX^^^^^^4X...XV%%%%%VX +D:XXXXXXLL..L***LLLLLLLX....8Xi....%@@.....@@X +D:X5..8X.&.XXXXXX......D....8XIIIIIXbb.....ccX +D:X...8X...XA...X.LLLLLX....8X.....X.........X +D:X...8X.XXXC...X.LL...XXXIXXX.....X.........X +D:XGXXXX.LfX7...X&LL.L.Xa...aXf...fX.........X +D:X.X5XL.L*XB...X&&..L.X.b.b.X.....X.........X +D:X.X.XL.L*XXXXXXLLLLL.X..7..X.....X.........X +D:X.X.XL.L***fXL.....&&X.b.b.XIIIIIX.........X +D:X.X.XL.LLLLLXL.LLLLLLXa...aXi....X.........X +D:X.X.XL.........XXXXXXXXX%XXXXXXXXX.........X +D:X.X.XXXXXXXXXXLX.....Xe-.=dX....&X.........X +D:X.X..........XLX.....X-...=X....&X.........X +D:X.XXXXXXXXXX.X8Xf.B..%..6..%..C.&X.........X +D:X.LLLLLLLLL+.XXX.....X-...=X....&X.........X +D:X.XXXXXXXXXXXXXX.....Xd-.=eX....&X.........X +D:X.Xbbbbb......XXXXXXXXXX%XXXXXXXXX.........X +D:X.XbbbbXXXX....XX....X.....X...h.X.........X +D:X.XbbbXX..XXX...XX...X.ccc.X....0X.........X +D:X.XbbXX..X%bXX...XX..X..A..X.....X....0....X +D:X.IbXX..XXbbbXX...XX.X.ccc.XIXXXXXXXXXXXXXXX +D:X.XXX..XX.....X%...XXX.....XlllllllllllllllX +D:X.X99.XXW......XX...XXXXXXXXlllllllllllllllX +D:X.X99XXWWW...a..XX...XXllllllLLLLLlXXXX%XXXX +D:X.XXXX..WWW.....cXX..XXXXXlllllllllXVVVVVVVX +D:X.X8.....WWW....ccX..X...XLLLlLLLLLXVVVVVVVX +D:X.X%XXXXXXXWW...cXXX.X+X.XlllllllllXV%%%%%VX +D:X.X.......XWWW..X%.X.XLX.XlLLLLLLLLXV%8.8%VX +D:X.XXXXXX%.X.WWWXX..X.XLX.XlllllllllXV%.a.%VX +D:X.X.IIIIX.X..WXX..XXcXLX.XLLLlLLLLlXV%...%VX +D:X.X%XXXIX.X..XX..XXccXLX.XlglllLgllXV%...%VX +D:X.Xa.6XIX.X.XX..XXcccXLX.XlllllXXXXXV%.a.%VX +D:X+XXX.XIX.X.X99XXccccXLX.XXXXXXX888XV%8.8%VX +D:X%%%Xa%.X.%8X99XcccccXLX......4X...XV%%%%%VX D:X%.%XXXXXXXXXXXXIXXXXXLXXXXXXXXX...XVVVVVVVX D:X.%%+..........................G..4X...F...X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/s_orthanc.map b/lib/mods/theme/edit/s_orthanc.map index fd14d3d4..9b357c2d 100644 --- a/lib/mods/theme/edit/s_orthanc.map +++ b/lib/mods/theme/edit/s_orthanc.map @@ -52,48 +52,48 @@ D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX D:X;;;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,a,4,a,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a;&,a,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,X D:X;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,a,a,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;,,,a,a,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,X D:X;;;;;;;;;;;;;;;,,,,,,,,XXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,X -D:X;;;;;;;;;;;;;,,,,,,XXXXX2^b^.^.^b^.^.^b^.^.^b^.2XXXXX,,,,,,,,,,,,,,,,,,;;;,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,X -D:X;;;;;;;;;;,,,,,,XXXX2.^.^.^.XX^.^.^.^.^.^.XX^.^.^.^2XXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,X -D:X;;;;;;;a,a,,,,XXX2.^.^.^b^.^XX.^.^.^b^.^.^XX.^.^b^.^.^2XXX,,,,,,,,,,,,,a,a,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,X -D:X;;;;;;a,7,a,XXX2^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.2XXX~~~~~,,,,,a,&,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,X -D:X;;;;;;,a,aXXX2.^.^XXXXXXXXXXXXXXXXXXDDDXXXXXXXXXXXXXXXGGGGGXXX~~~~,,,,,a,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,X -D:X;;;;;;,,XXX2^.^.XXX.^.^.^.^.^.XX^.^.^2^.^.^XX.^b^.^.^XXX.^.^.XXX~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,X -D:X;;;;;,,XX2.^.^bXX^.^b^.^.^.^.^XX.^!^.!^.!^.XX^.^.^.^b^.XX.^b^.^XX~~~~,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,;;;;;,,,,,,,X -D:X;;;;;,XX2.^.^.XX^.^.^.GGGG^.^.XX^.^.^.^.^.^XX.^.^GGGG.^.XX.^.^.^XX~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,;;;;;,,,,,,,,,X -D:X;;;;,,XX.^b^.XX^.^.^.^G$$G.^.^XX.^.^b^.^b^.XX^.^.G$$G^.^.XX.^b^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,;;;;,,,,,,,,,,,X -D:X;;;,,XX2^.^.XX^.^.^.^.G$$G^b^.XX^.^.^.^.^.^XX.^b^G$$G.^b^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,;;;;;,,,,,,,,,,,,X -D:X;;;,,XX^.^.^XX.^.^b^.^GGGG.^.^XX^b!^.!b^!^.XX^.^.GGGG^.^.^XX^.^b^XX.~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,a,a,,,,,,;;;;;;,,,,,,,,,,,,X -D:X;;,,XX2.^b^XX.^.^.^.^.^.^.^.^.XX^.^.^.^.^.^DD.^.^.^.^.^.^.^XX^.^.^XX,,~~~~~~~~~~~~~~~~~~,,,,,a,a,a,&,a,,,,;;;;;;;;,,,,,,,,,,,X -D:X;;,,XX^.!.^XX^.^.^.^.^.^.^XXXXXXXXXXXXXXXXXXXXX^.^b^.^.^b^.XX.^!^.XX,,,~~~~~~~~~~~~~~~~~~~,,a,a,&,a,a,,,,,;;;;;;;;;,,,,,,,,,,X -D:X;,,,XX.^.^.XX.^b^.^.^b^.^XG.^.^.^.^.^.^.^.^.^.XX^.^.^.^.^.^XX^.^b^XX,,,,~~~~~~~~~~~~~~~~~~~a,a,&,&,a,,,,,,;;;;;;;;;;,,,,,,,,,X -D:X;,,,XX^b!.^XX^.^.^.^.^.^XG.^.lllllll2lllllll.^.XX^.^GGGGG^.GG.^!^.[[,,a,,~~~~~~~~~~~~~~~~~~,a,a,a,a,,,,,,;;;;;;;;;;;;,,,,,,,,X -D:X;;,,XX.^.^.XX.^.!.^!^.^XG.^.l!^.^.^l^l^.^.^!l.^.XX^.G$$$G.^GG^.^b^[[,,,,,,~~~~~~~~~~~~~~~~~~,a,a,a,,,,,,;;;;;;;;;;;;;;,,,,,,,X -D:X;;,,XX^.!b^XX^.^.^b^.!.XX^.ll^.^.^.^.^.^.^.^ll.^XX.^G$$$G^.XX.^!^.[[,,,a,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,X -D:X;;,,XX.^.^.XX.^.^2^!^.2GG.^l$$ll.GGG^GGG.ll$$l^.XX^.G$$$G.^XX^.^b^[[,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,X -D:X;;,,XX^.4.^XX^.^.^.^.^.DD^.ll^.^GG^$@$^GG^.^ll.^XX.^G$$$G^.XX.^.^.[[,,,a,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X -D:X;;,,XX.^5^.XX.^b^2^.^b^DD.^ll.^.GG^$1$^GG.^.ll^.XX^.G$$$G.^XX^.^b^[[,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,,,X -D:X;;,,XX^.^.^XX^.^.^.!.^2GG^.l$$ll2GGG>GGG2ll$$l.^XX.^G$$$G^.XX.^.^.[[,,,a,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X -D:X;;,,XX.^!^.XX.^.^2^.^!^XX.^ll.^.^.^GGG^.^.^.ll^.XX^.G$$$G.^XX^.!b^[[,,,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,;;;;;;;;;;;,,,,,,,,,,,,X -D:X;,,,XX^b^.^XX^.^.^b^.^.XG^.^l!.^.^.lll.^.^.!l^.^XX.^G$$$G^.GG.^.^.[[,a,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X -D:X;;,,XX.^!^.XX.^.!.^!^.^.XG^.^lllllll$lllllll^.^XX.^.GGGGG.^GG^.!b^[[,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X -D:X;;,,XX^.^b^XX^.^.^.^.^.^.XG^.^.^.^.^.^.^.^.^.^XX.^b^.^.^b^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,X -D:X;;,,XX.^!^.XX.^b^.^.^b^.^.XXXXXXXXXXXXXXXXXXXXX.^.^.^.^.^.^XX^.!b^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,;;;;;;;;;;;,,,,,,,,;X -D:X;,,,XX2.^.^XX^.^.^.^.^.^.^.^.^XX.^.^.^.^.^.XX6.^.^.^.^.^.^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;,,,,,,,,,;X -D:X;;,,,XX^b^.^XX^.^.^.^.GGGG^.^.XX^.!.^!^.!.^XX7^b^GGGG.^b^.XX.^b^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,;;;;;;;;;;;,,,,,,,;;X -D:X;;;,,XX2^.^.XX.^.^b^.^G$$G.^.^XX.^A2.^.26^.XXA.^.G$$G^.^.^XX^.^.^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,,,;;X -D:X;;;,,,XX.^.^.XX.^.^.^.G$$G^.^FXX^2^.^C^.^2^XXB^.^G$$G.^.^XX^b^.^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,;;;X -D:X;;;;,,XX2.^b^.XX.^.^.^GGGG.^.^XX.^52.^.2B^.XXC.^.GGGG^b^XX^.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;;;;;;X -D:X;;;;,,,XX2.^.^.XX.^.^b^.^.^b^.XX^.!.^!^.!.^XXE^.^.^.^.^XX^b^.^.XX~~~~~~~~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~~~~,,,,a,a;;;;;;;;;;;;;X -D:X;;;;,,,,XXX2^.^.XXX^.^.^.^.^.^XX.^.^.^.^.^.XXF.^b^.^.XXX^.^.^XXX~~~~~~~~~,,,,,a,a,,,,,,,~~~~~~~~~~~~~~~~~~,,a,&,a;;;;;;;;;;;;X -D:X;;;;;,,,,,XXX2^b^.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.^b^.XXX~~~~~~~~~a,a,,,a,&,a,,,,,~~~~~~~~~~~~~~~~~~~~,,a,a,,,,,;;;;;;;;X -D:X;;;;;;,,,,,,XXX2^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.2XXX~~~~~~~~,,a,&,a,,;a;a,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;X -D:X;;;;;;;;,,,a,aXXX2.^b^.^b^.^XX.^.^b^.^b^.^XX.^b^.^b^.^2XXX~~~~~~~~,,,,,a,a,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;X -D:X;;;;;;;;;;a,&,a,XXXX2.^.^.^.XX^.^.^.^.^.^.XX^.^.^.^2XXXX~~~~~~~~~~~~,,,,,,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,a,a,X -D:X;;;;;;;;;;;a,a,,,,,XXXXX2^.^b^.^b^.^b^.^b^.^.^.2XXXXX~~~~~~~~~~~~~~~~~,,,;;;;;,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,a,&,aX +D:X;;;;;;;;;;;;;,,,,,,XXXXX2.b.....b.....b.....b..2XXXXX,,,,,,,,,,,,,,,,,,;;;,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,X +D:X;;;;;;;;;;,,,,,,XXXX2.......XX............XX.......2XXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,X +D:X;;;;;;;a,a,,,,XXX2......b...XX......b.....XX....b.....2XXX,,,,,,,,,,,,,a,a,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,X +D:X;;;;;;a,7,a,XXX2........................................2XXX~~~~~,,,,,a,&,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,X +D:X;;;;;;,a,aXXX2....XXXXXXXXXXXXXXXXXXDDDXXXXXXXXXXXXXXXGGGGGXXX~~~~,,,,,a,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,X +D:X;;;;;;,,XXX2....XXX...........XX.....2.....XX..b.....XXX.....XXX~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,X +D:X;;;;;,,XX2....bXX...b.........XX..!..!..!..XX.......b..XX..b...XX~~~~,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,;;;;;,,,,,,,X +D:X;;;;;,XX2.....XX......GGGG....XX...........XX....GGGG...XX......XX~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,;;;;;,,,,,,,,,X +D:X;;;;,,XX..b..XX.......G$$G....XX....b...b..XX....G$$G....XX..b..XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,;;;;,,,,,,,,,,,X +D:X;;;,,XX2....XX........G$$G.b..XX...........XX..b.G$$G..b..XX.....XX~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,;;;;;,,,,,,,,,,,,X +D:X;;;,,XX.....XX....b...GGGG....XX.b!..!b.!..XX....GGGG.....XX...b.XX.~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,a,a,,,,,,;;;;;;,,,,,,,,,,,,X +D:X;;,,XX2..b.XX.................XX...........DD..............XX.....XX,,~~~~~~~~~~~~~~~~~~,,,,,a,a,a,&,a,,,,;;;;;;;;,,,,,,,,,,,X +D:X;;,,XX..!..XX.............XXXXXXXXXXXXXXXXXXXXX...b.....b..XX..!..XX,,,~~~~~~~~~~~~~~~~~~~,,a,a,&,a,a,,,,,;;;;;;;;;,,,,,,,,,,X +D:X;,,,XX.....XX..b.....b...XG...................XX...........XX...b.XX,,,,~~~~~~~~~~~~~~~~~~~a,a,&,&,a,,,,,,;;;;;;;;;;,,,,,,,,,X +D:X;,,,XX.b!..XX...........XG...lllllll2lllllll...XX...GGGGG..GG..!..[[,,a,,~~~~~~~~~~~~~~~~~~,a,a,a,a,,,,,,;;;;;;;;;;;;,,,,,,,,X +D:X;;,,XX.....XX...!..!...XG...l!.....l.l.....!l...XX..G$$$G..GG...b.[[,,,,,,~~~~~~~~~~~~~~~~~~,a,a,a,,,,,,;;;;;;;;;;;;;;,,,,,,,X +D:X;;,,XX..!b.XX.....b..!.XX..ll...............ll..XX..G$$$G..XX..!..[[,,,a,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,X +D:X;;,,XX.....XX....2.!..2GG..l$$ll.GGG.GGG.ll$$l..XX..G$$$G..XX...b.[[,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,X +D:X;;,,XX..4..XX..........DD..ll...GG.$@$.GG...ll..XX..G$$$G..XX.....[[,,,a,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X +D:X;;,,XX..5..XX..b.2...b.DD..ll...GG.$1$.GG...ll..XX..G$$$G..XX...b.[[,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,,,X +D:X;;,,XX.....XX......!..2GG..l$$ll2GGG>GGG2ll$$l..XX..G$$$G..XX.....[[,,,a,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X +D:X;;,,XX..!..XX....2...!.XX..ll......GGG......ll..XX..G$$$G..XX..!b.[[,,,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,;;;;;;;;;;;,,,,,,,,,,,,X +D:X;,,,XX.b...XX.....b....XG...l!.....lll.....!l...XX..G$$$G..GG.....[[,a,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X +D:X;;,,XX..!..XX...!..!....XG...lllllll$lllllll...XX...GGGGG..GG..!b.[[,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X +D:X;;,,XX...b.XX............XG...................XX..b.....b..XX.....XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,X +D:X;;,,XX..!..XX..b.....b....XXXXXXXXXXXXXXXXXXXXX............XX..!b.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,;;;;;;;;;;;,,,,,,,,;X +D:X;,,,XX2....XX.................XX...........XX6.............XX.....XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;,,,,,,,,,;X +D:X;;,,,XX.b...XX........GGGG....XX..!..!..!..XX7.b.GGGG..b..XX..b..XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,;;;;;;;;;;;,,,,,,,;;X +D:X;;;,,XX2....XX....b...G$$G....XX..A2...26..XXA...G$$G.....XX.....XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,,,;;X +D:X;;;,,,XX.....XX.......G$$G...FXX.2...C...2.XXB...G$$G....XX.b...XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,;;;X +D:X;;;;,,XX2..b..XX......GGGG....XX..52...2B..XXC...GGGG.b.XX......XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;;;;;;X +D:X;;;;,,,XX2.....XX....b.....b..XX..!..!..!..XXE.........XX.b....XX~~~~~~~~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~~~~,,,,a,a;;;;;;;;;;;;;X +D:X;;;;,,,,XXX2....XXX...........XX...........XXF..b....XXX.....XXX~~~~~~~~~,,,,,a,a,,,,,,,~~~~~~~~~~~~~~~~~~,,a,&,a;;;;;;;;;;;;X +D:X;;;;;,,,,,XXX2.b..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..b..XXX~~~~~~~~~a,a,,,a,&,a,,,,,~~~~~~~~~~~~~~~~~~~~,,a,a,,,,,;;;;;;;;X +D:X;;;;;;,,,,,,XXX2........................................2XXX~~~~~~~~,,a,&,a,,;a;a,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;X +D:X;;;;;;;;,,,a,aXXX2..b...b...XX....b...b...XX..b...b...2XXX~~~~~~~~,,,,,a,a,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;X +D:X;;;;;;;;;;a,&,a,XXXX2.......XX............XX.......2XXXX~~~~~~~~~~~~,,,,,,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,a,a,X +D:X;;;;;;;;;;;a,a,,,,,XXXXX2...b...b...b...b......2XXXXX~~~~~~~~~~~~~~~~~,,,;;;;;,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,a,&,aX D:X;;;;;;;;;;;;;;,,,,,,,,,XXXXXXXXXXXXXXXXXXXXXXXXXX,,~~~~~~~~~~~~~~~~,,,,;;;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,a,a,X D:X;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,a,a,,,,,,,,,,~~~~~~~~~~~~~~~,,,,;;;;;;;;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,X D:X;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,,,a,E,a,,,,,~~~~~~~~~~~~~~~~~,,;;;;;;;;;;;;;;;;;,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,X D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ### Starting Location -P:31:125 \ No newline at end of file +P:31:125 diff --git a/lib/mods/theme/edit/s_ship.map b/lib/mods/theme/edit/s_ship.map index dbbbe50d..6dcb239d 100644 --- a/lib/mods/theme/edit/s_ship.map +++ b/lib/mods/theme/edit/s_ship.map @@ -19,8 +19,6 @@ # I'm not sure esp. about the correct exit of gate #3. -#%:special.txt - ### Terrain Features @@ -157,15 +155,6 @@ F:$:90:0:0:*47 # Treasure (good) on ice F:%:90:0:0:*60 -# Trap (random) on ice -F:^:90:0:0:0:0:0:* - -# Trap (random) on shallow water -F:t:84:0:0:0:0:0:* - -# Trap (random) on fog -F:@:210:0:0:0:0:0:* - # Human skeleton on ice F:x:90:0:0:395 @@ -173,16 +162,16 @@ F:x:90:0:0:395 ### Between Gates # between gate 3: was 711 -F:3:160:6:0:0:0:0:0:1136 +F:3:160:6:0:0:0:0:1136 # between gate A: was 6247 -F:A:160:6:0:0:0:0:0:6761 +F:A:160:6:0:0:0:0:6761 # between gate 4: was 3339 -F:4:160:6:0:0:0:0:0:3853 +F:4:160:6:0:0:0:0:3853 # between gate B: was 3085 -F:B:160:6:0:0:0:0:0:3599 +F:B:160:6:0:0:0:0:3599 ### Guaranteed Items @@ -197,33 +186,33 @@ D:XXXXXXXXXXXXXXXX XXXXXXXXXXXX D:X###############..~ .#. k w ~.#XX######### .~~ s G..#####.. w .###.######X##~~ .GX.### D:X####%####...~ ~.~ s .#.X#~~.##### .~ s w G..#.##.#.XGG~XXk~.####A####.~X ~~.X... D:X##%#$#######...~ w wXXXXXX#XXXX###XXX #~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX....~.XX X#xX.#..#.#G. w ~X G~~ -D:X##$#########.... s XXXTT^...~.~#####w~###~~~~8....**.tE.&E ^^.M^.xx.....x..ZZ..^XTTTT M...GG.~.. w G.###~XX~~#XX . s X -D:X#########...~ w XXXTTTT.^..x~.H#### ###~~D....8**.~M~.E..M^.MM^..xh.h...ZZZZ^~M.,.,.,.~~ .G...~~ ~###. w . w M.d. -D:X#####.x.x~~~ XXXTTTXXXMxx.H.####### ~##~~~8...#.**.~tE&EE^^~%M^.h.x.E.xh.ZZ..^X.,.^....~ ...G.~ s ~# XX ~~ w X -D:X######...~~ MM~ w XXX^^XXX.MMMxx...G#####w ~#~.~..&...**E.MEt.^^.MM^~..i.....ZZZZ^~M.,.,,.gM.~.,~.,G.G~~ G~. G~.MM XX..~ -D:X##.....~~ XXX^E=^XX$b.MMMMxH..HG#.## w ~#~##~8....*E~.&EM^^.M^h..i..x.x..ZZ..^XTTTTX.,.,~........~.G~~..w . G~...G~X -D:X...~~~ K XXX^^EXXXX$$$..MMXXXXXXX#### #####XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..,.X..M~.........~G..G ~~.G...G~ -D: ~~~ w XXX^^EXXXdX%d$$b$$XXd~~~~##### s ###.,.W.**,.x.,.,.,.,.,.***,,....,x....,,.SX.,.,.,..,o.,.,.~~.G..~.G..G..~X k -D: w MMM. w XXX^E^XXX.,*XDDd$$$XXd$..~~~~#### ###.,.,.,.**..,.,i.,.,W,.,**..z.,.,.q...g.,......~.,.,.,.,.~.~..F.~M~......~ -D: MM. XXX4EEXXXi^**.XX%%$dXX$d$.H#####~G~~####.~.,~..,.h*,,~,.,.,.,~,.,.,.H.,.~.,..~,.,,,.~,.,.~.,.,.X.~,g.~~..~.~..,..,X -D: s XXXBXXXXX^.**.W.,XDD%XXb$$b####..G~~~G###~.,,.,.,.,...,,.x,.~.,.,~..,.~.,.,~,.,.,,.,.,~,.,.,.~,.,..,X.,.***.~***,W.,X -D: XXX.o..X.g***i.*.,.XX%XX######^^^^t ##ttt^^^^^t^^^^^^t^^^^^t^^^^^^^t^^^^^^t^^^^t^^tt^^^tt^^^^t^tXo..x************X -D: k XXX^E..o.XX8.****,.g..XXX..#........~~~~~ttt###~~.,.G~.......XXXXX..~,..,,..,,.~.,..,.,..,,..,.,x..,.ooX******W***g.*.g*X -D: XXX%S^^E..ooX,*****,..,.X.....h........XXX~~~tt#tt w ~~G~...XXXXXXX.,**.,..D.**.G.,~,..XXX...~~~.....o8X***.~.,.****$$..X -D: XX%%%^mm.E..oXH**.^.*i.....#.....i..*..XXXXX~~ G~~.XXXXXXXXX~.*..,.,*..~,..,.,XXXXX...~..,.XXXXXo.W.$$.g.x....o.X -D: XXX%S^^E..ooX8.*~~...,~~##...,..,.***,.XXX~G~ k ~~~~XXXXXXX.,.*. g...*..x..W.~.XXX.***.,,o..oO8X.o.,.o.xx$$$XXXXX -D: XXX^E..o.XXH.###....###~~~.,h..,.*.,..~~.~~ s ~~.XXXXX.~..**...i~**.....~.,,.,,.***~,,,.oXXXXXXXXXXXXXXXX.!.X -D: s XXX.o..X&..w~##..##~~~X~^^^^^^^^^^t^ttt^tt w tt^tttt^^tt^^^^^ttt^^^^ttt@@^^^^ttt^^^^^ttt@^^ttXXXW ^^.M*.t^oo.^^...X s -D: ~~~ XXX>XXH~G..#####~G~~Gt..,.,..,.,xx..x ~~~ i~~xx.~...x....~.~..~..,~..***..~..~...,~.~*.~.XXXE.^^H..SM.~^.oo....JX -D: ~~....~~ XXX$8w~.^####G~G ~i.XX.,,.,...........G~~~s~~ iiF~...........~.......x.,.**~....,~....~.*XXX.EE.W.^^.M*.~^^^o^O^..X -D: ~.#..#..~~ XXX8##t..##~#.G.t..XX..,H...,.W...,...,~~...,...*,,.x...,.i.....g.....**.........XXXXXXX...EE.^^H..SM.~.^oo...^JX -D: ~.##.##..~ XXX###GG~~~*h~.^..XX.....,....,.W...,.G....W.***...,...,...,....,...,**..q....SX3tttW#...EE.W.^^.M*.t.oo.^.^.XX -D: ~~.###..~~ X##.##~~G^~~~~i*^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~ -D: ~~...###.~ k ~###X.G~~@Gh~x*~^..^i.zX8~i.~..h....zzzXiX..^$.T.t$......F.t..XX..^TTT*..M..Y....^.Y.^*.^..~....X.x..x~.XXH~G..#####~G~~G~..,.,..,.,xx..x ~~~ i~~xx.~...x....~.~..~..,~..***..~..~...,~.~*.~.XXXE...H..SM.~..oo....JX +D: ~~....~~ XXX$8w~..####G~G ~i.XX.,,.,...........G~~~s~~ iiF~...........~.......x.,.**~....,~....~.*XXX.EE.W....M*.~...o.O...X +D: ~.#..#..~~ XXX8##~..##~#.G.~..XX..,H...,.W...,...,~~...,...*,,.x...,.i.....g.....**.........XXXXXXX...EE...H..SM.~..oo....JX +D: ~.##.##..~ XXX###GG~~~*h~....XX.....,....,.W...,.G....W.***...,...,...,....,...,**..q....SX3~~~W#...EE.W....M*.~.oo.....XX +D: ~~.###..~~ X##.##~~G.~~~~i*.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~ +D: ~~...###.~ k ~###X.G~~*Gh~x*~....i.zX8~i.~..h....zzzXiX...$.T.~$......F.~..XX...TTT*..M..Y......Y..*....~....X.x..x~.:7:0 # between gates -F:4:160:0:0:0:0:0:0:-1 -F:5:160:0:0:0:0:0:0:-1 -F:6:160:0:0:0:0:0:0:-1 -F:7:160:0:0:0:0:0:0:-1 -F:A:160:0:0:0:0:0:0:-1 -F:B:160:0:0:0:0:0:0:-1 -F:C:160:0:0:0:0:0:0:-1 -F:E:160:0:0:0:0:0:0:-1 -F:F:160:0:0:0:0:0:0:-1 -F:0:160:0:0:0:0:0:0:-1 +F:4:160:0:0:0:0:0:-1 +F:5:160:0:0:0:0:0:-1 +F:6:160:0:0:0:0:0:-1 +F:7:160:0:0:0:0:0:-1 +F:A:160:0:0:0:0:0:-1 +F:B:160:0:0:0:0:0:-1 +F:C:160:0:0:0:0:0:-1 +F:E:160:0:0:0:0:0:-1 +F:F:160:0:0:0:0:0:-1 +F:0:160:0:0:0:0:0:-1 diff --git a/lib/mods/theme/edit/spiders.map b/lib/mods/theme/edit/spiders.map index 146c152c..f473cc31 100644 --- a/lib/mods/theme/edit/spiders.map +++ b/lib/mods/theme/edit/spiders.map @@ -20,10 +20,10 @@ F:b:89:3:275 F:c:89:3:277 # Grass with Aranea -F:d:89:3:963:0:0:0:0:0:0:2 +F:d:89:3:963:0:0:0:0:0:2 # Grass with Elder aranea -F:e:89:3:964:0:0:0:0:0:0:2 +F:e:89:3:964:0:0:0:0:0:2 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/lib/mods/theme/edit/t_beorn.txt b/lib/mods/theme/edit/t_beorn.txt index e60c5d29..57a15b01 100644 --- a/lib/mods/theme/edit/t_beorn.txt +++ b/lib/mods/theme/edit/t_beorn.txt @@ -32,13 +32,13 @@ F:]:236:3 ### Buildings ### #The House of Beorn -F:a:74:3:0:0:0:0:0:76 +F:a:74:3:0:0:0:0:76 #The Farm -F:f:74:3:0:0:0:0:0:67 +F:f:74:3:0:0:0:0:67 #The Beastmaster -F:r:74:3:0:0:0:0:0:16 +F:r:74:3:0:0:0:0:16 D:###################################################################################################################################################################################################### D:# ------TT-TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT--T-TTT------------------ # diff --git a/lib/mods/theme/edit/t_bree.txt b/lib/mods/theme/edit/t_bree.txt index e5fe559a..c6b50340 100644 --- a/lib/mods/theme/edit/t_bree.txt +++ b/lib/mods/theme/edit/t_bree.txt @@ -5,7 +5,7 @@ ############### Additional default terrain settings ############### # Default for Quest 1 = entrance is quest entrance -F:z:8:3:0:0:0:0:0:4 +F:z:8:3:0:0:0:0:4 # Default for Quest 18 = entrance is tree F:y:96:3 @@ -15,46 +15,46 @@ F:x:96:3 ############### Quest 4 - Thieves Hideout finished = house ############### ?:[EQU $QUEST4 2] -F:z:74:3:0:0:0:0:0:7 +F:z:74:3:0:0:0:0:7 ?:[EQU $QUEST4 5] -F:z:74:3:0:0:0:0:0:7 +F:z:74:3:0:0:0:0:7 ?:1 ############### Quest 8 - Troll Glade ############### ?:[AND [EQU $QUEST8 1] [EQU $DAYTIME 0] ] -F:y:8:3:0:0:0:0:0:8 +F:y:8:3:0:0:0:0:8 ?:1 ############### Quest 9 - Wights Grave ############### ?:[EQU $QUEST9 1] -F:x:8:3:0:0:0:0:0:9 +F:x:8:3:0:0:0:0:9 ?:1 ###### Additionnal buildings ####### # Castle: Plot Bree -F:B:75:3:0:0:0:0:0:1 +F:B:75:3:0:0:0:0:1 # Mayor's house -F:b:74:3:0:0:0:0:0:10 +F:b:74:3:0:0:0:0:10 # The Prancing Pony -F:a:74:3:0:0:0:0:0:58 +F:a:74:3:0:0:0:0:58 # Soothsayer -F:c:74:3:0:0:0:0:0:12 +F:c:74:3:0:0:0:0:12 # Music Store -F:d:74:3:0:0:0:0:0:64 +F:d:74:3:0:0:0:0:64 # The Museum -F:e:74:3:0:0:0:0:0:57 +F:e:74:3:0:0:0:0:57 # Map store -F:f:74:3:0:0:0:0:0:66 +F:f:74:3:0:0:0:0:66 # The Library -F:g:74:3:0:0:0:0:0:13 +F:g:74:3:0:0:0:0:13 ############### Town Layout ############### diff --git a/lib/mods/theme/edit/t_dale.txt b/lib/mods/theme/edit/t_dale.txt index 5c2dcf6c..23d483cf 100644 --- a/lib/mods/theme/edit/t_dale.txt +++ b/lib/mods/theme/edit/t_dale.txt @@ -20,13 +20,13 @@ F:]:236:3 ### Buildings ### # Bard's Hut -F:b:74:3:0:0:0:0:0:77 +F:b:74:3:0:0:0:0:77 # Construction Supply Store -F:c:74:3:0:0:0:0:0:63 +F:c:74:3:0:0:0:0:63 # Builder Barracks -F:i:74:3:0:0:0:0:0:71 +F:i:74:3:0:0:0:0:71 D:###################################################################################################################################################################################################### D:# # diff --git a/lib/mods/theme/edit/t_edoras.txt b/lib/mods/theme/edit/t_edoras.txt index a4257661..9ab17db6 100644 --- a/lib/mods/theme/edit/t_edoras.txt +++ b/lib/mods/theme/edit/t_edoras.txt @@ -14,40 +14,40 @@ F:m:240:3 ### Buildings ### #Meduseld -F:k:74:3:0:0:0:0:0:82 +F:k:74:3:0:0:0:0:82 #Inn -F:i:74:3:0:0:0:0:0:72 +F:i:74:3:0:0:0:0:72 #Map store -F:a:74:3:0:0:0:0:0:66 +F:a:74:3:0:0:0:0:66 #Music store -F:c:74:3:0:0:0:0:0:64 +F:c:74:3:0:0:0:0:64 #The Library -F:g:74:3:0:0:0:0:0:13 +F:g:74:3:0:0:0:0:13 #Rune shop -F:r:74:3:0:0:0:0:0:62 +F:r:74:3:0:0:0:0:62 #The Beastmaster -F:b:74:3:0:0:0:0:0:16 +F:b:74:3:0:0:0:0:16 #Fighters Hall -F:d:74:3:0:0:0:0:0:17 +F:d:74:3:0:0:0:0:17 #Tower of Magery -F:h:74:3:0:0:0:0:0:18 +F:h:74:3:0:0:0:0:18 #Inner Temple -F:j:74:3:0:0:0:0:0:19 +F:j:74:3:0:0:0:0:19 #Paladins Guild -F:l:74:3:0:0:0:0:0:20 +F:l:74:3:0:0:0:0:20 #Rangers Guild -F:n:74:3:0:0:0:0:0:21 +F:n:74:3:0:0:0:0:21 D:###################################################################################################################################################################################################### D:#-----------------------------------------------------------------------------------------#####OOOOOOO#####,,,,,,,,----------------------------------------------------------------------------------# diff --git a/lib/mods/theme/edit/t_esga.txt b/lib/mods/theme/edit/t_esga.txt index 6665e914..36b97429 100644 --- a/lib/mods/theme/edit/t_esga.txt +++ b/lib/mods/theme/edit/t_esga.txt @@ -23,19 +23,19 @@ F:e:241 ### Buildings ### #The Dancing Dragon -F:i:74:3:0:0:0:0:0:73 +F:i:74:3:0:0:0:0:73 #The Master's House -F:k:74:3:0:0:0:0:0:83 +F:k:74:3:0:0:0:0:83 #The Library -F:l:74:3:0:0:0:0:0:13 +F:l:74:3:0:0:0:0:13 #The Music Store -F:m:74:3:0:0:0:0:0:64 +F:m:74:3:0:0:0:0:64 #The Hunter store -F:n:74:3:0:0:0:0:0:61 +F:n:74:3:0:0:0:0:61 D:###################################################################################################################################################################################################### D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW# diff --git a/lib/mods/theme/edit/t_gondol.txt b/lib/mods/theme/edit/t_gondol.txt index 66807868..50f0d271 100644 --- a/lib/mods/theme/edit/t_gondol.txt +++ b/lib/mods/theme/edit/t_gondol.txt @@ -15,7 +15,7 @@ F:y:1:3 F:x:1:3 # Default for Quest 23 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:23 +F:w:8:3:0:0:0:0:23 # Decoration = Straight Road (B) F:":66:3 @@ -33,7 +33,7 @@ F:Z:63:3 # Quest 13 assigned, entrance is quest entrance ?:[EQU $QUEST13 1] -F:z:8:3:0:0:0:0:0:13 +F:z:8:3:0:0:0:0:13 ?:1 @@ -41,11 +41,11 @@ F:z:8:3:0:0:0:0:0:13 # Quest 14 assigned, entrance is quest entrance ?:[EQU $QUEST14 1] -F:y:8:3:0:0:0:0:0:14 +F:y:8:3:0:0:0:0:14 # Quest 14 finished, reward is a rare jewelry shop ?:[EQU $QUEST14 5] -F:!:74:3:0:0:0:0:0:42 +F:!:74:3:0:0:0:0:42 ?:1 @@ -53,7 +53,7 @@ F:!:74:3:0:0:0:0:0:42 # Quest 15 assigned, entrance is quest entrance ?:[EQU $QUEST15 1] -F:x:8:3:0:0:0:0:0:15 +F:x:8:3:0:0:0:0:15 ?:1 @@ -61,15 +61,15 @@ F:x:8:3:0:0:0:0:0:15 # Quest 16 finished, reward is a between gate ?:[EQU $QUEST16 5] -F:Z:176:3:0:0:0:0:0:1 +F:Z:176:3:0:0:0:0:1 ?:1 ############### Quest 23 - Wolves hut finished = house ############### ?:[EQU $QUEST23 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST23 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 #################### Buildings #################### @@ -82,46 +82,46 @@ F:w:74:3:0:0:0:0:0:7 # m: White (Paladin) # Tower of the King -F:a:74:3:0:0:0:0:0:27 +F:a:74:3:0:0:0:0:27 # Library -F:b:74:3:0:0:0:0:0:28 +F:b:74:3:0:0:0:0:28 # Castle: Gondolin Plot -F:B:75:3:0:0:0:0:0:4 +F:B:75:3:0:0:0:0:4 # The White Tree:Aerandir:High-Elf -F:c:74:3:0:0:0:0:0:29 +F:c:74:3:0:0:0:0:29 # Craftsmaster -F:d:74:3:0:0:0:0:0:30 +F:d:74:3:0:0:0:0:30 # Earth-Dome -F:e:74:3:0:0:0:0:0:31 +F:e:74:3:0:0:0:0:31 # Prophet -F:f:74:3:0:0:0:0:0:12 +F:f:74:3:0:0:0:0:12 # Minstrels Haven -F:h:74:3:0:0:0:0:0:32 +F:h:74:3:0:0:0:0:32 # Star-Dome:Sulraen:High-Elf -F:i:74:3:0:0:0:0:0:33 +F:i:74:3:0:0:0:0:33 # Valarin Temple -F:j:74:3:0:0:0:0:0:34 +F:j:74:3:0:0:0:0:34 # Sea-Dome -F:k:74:3:0:0:0:0:0:35 +F:k:74:3:0:0:0:0:35 # The Golden Flower -F:l:74:3:0:0:0:0:0:36 +F:l:74:3:0:0:0:0:36 # The Fountain -F:m:74:3:0:0:0:0:0:37 +F:m:74:3:0:0:0:0:37 # Thunderlord's Hide -F:n:74:3:0:0:0:0:0:22 +F:n:74:3:0:0:0:0:22 # Force elven monsters f:ELVEN diff --git a/lib/mods/theme/edit/t_helm.txt b/lib/mods/theme/edit/t_helm.txt index 0ecaf913..d2ff3536 100644 --- a/lib/mods/theme/edit/t_helm.txt +++ b/lib/mods/theme/edit/t_helm.txt @@ -3,7 +3,7 @@ # Helm's Deep map by furiosity #The Hornburg -F:k:74:3:0:0:0:0:0:80 +F:k:74:3:0:0:0:0:80 D:###################################################################################################################################################################################################### D:#TT,,,,TTTTTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^# diff --git a/lib/mods/theme/edit/t_henn.txt b/lib/mods/theme/edit/t_henn.txt index 49e91867..a98de034 100644 --- a/lib/mods/theme/edit/t_henn.txt +++ b/lib/mods/theme/edit/t_henn.txt @@ -20,13 +20,13 @@ F:l:239:3 ### Buildings ### # Ranger Conclave -F:k:74:3:0:0:0:0:0:78 +F:k:74:3:0:0:0:0:78 # Fighters Hall -F:a:74:3:0:0:0:0:0:17 +F:a:74:3:0:0:0:0:17 # Rangers Guild -F:b:74:3:0:0:0:0:0:21 +F:b:74:3:0:0:0:0:21 D:###################################################################################################################################################################################################### D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWWWWWWWWWWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh# diff --git a/lib/mods/theme/edit/t_hobb.txt b/lib/mods/theme/edit/t_hobb.txt index 6043f188..6de1143e 100644 --- a/lib/mods/theme/edit/t_hobb.txt +++ b/lib/mods/theme/edit/t_hobb.txt @@ -29,16 +29,16 @@ F:m:243:3 ### Buildings ### # Farm -F:f:74:3:0:0:0:0:0:67 +F:f:74:3:0:0:0:0:67 # Green Dragon -F:g:74:3:0:0:0:0:0:74 +F:g:74:3:0:0:0:0:74 # Bag End -F:i:74:3:0:0:0:0:0:84 +F:i:74:3:0:0:0:0:84 # Beastmaster -F:j:74:3:0:0:0:0:0:16 +F:j:74:3:0:0:0:0:16 D:###################################################################################################################################################################################################### D:#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhihhhhhhhccccchhOOhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh# diff --git a/lib/mods/theme/edit/t_imlad.txt b/lib/mods/theme/edit/t_imlad.txt index af06a709..35270534 100644 --- a/lib/mods/theme/edit/t_imlad.txt +++ b/lib/mods/theme/edit/t_imlad.txt @@ -14,13 +14,13 @@ F:f:238:3 ### Buildings ### # Imladris -F:a:74:3:0:0:0:0:0:79 +F:a:74:3:0:0:0:0:79 # Forge -F:b:74:3:0:0:0:0:0:88 +F:b:74:3:0:0:0:0:88 # Stable (Beastmaster) -F:c:74:3:0:0:0:0:0:16 +F:c:74:3:0:0:0:0:16 D:###################################################################################################################################################################################################### D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^WWW^# diff --git a/lib/mods/theme/edit/t_khazad.txt b/lib/mods/theme/edit/t_khazad.txt index 73e93956..a707afbd 100644 --- a/lib/mods/theme/edit/t_khazad.txt +++ b/lib/mods/theme/edit/t_khazad.txt @@ -8,37 +8,37 @@ F:o:207:3 ###################### Buildings ######################## # Fighters Hall -F:f:74:3:0:0:0:0:0:17 +F:f:74:3:0:0:0:0:17 # Paladins Guild -F:g:74:3:0:0:0:0:0:20 +F:g:74:3:0:0:0:0:20 # Inner Temple -F:h:74:3:0:0:0:0:0:19 +F:h:74:3:0:0:0:0:19 # Mining Supplies -F:i:74:3:0:0:0:0:0:59 +F:i:74:3:0:0:0:0:59 # Default for Quest 25 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:25 +F:w:8:3:0:0:0:0:25 # Seat of Durin -F:k:74:3:0:0:0:0:0:87 +F:k:74:3:0:0:0:0:87 # Inn -F:n:74:3:0:0:0:0:0:70 +F:n:74:3:0:0:0:0:70 # Eagles -F:p:74:3:0:0:0:0:0:22 +F:p:74:3:0:0:0:0:22 # Force dwarven monsters f:DWARVEN ############### Quest 25 - Evil cave finished = house ############### ?:[EQU $QUEST25 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST25 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 # Town Layout diff --git a/lib/mods/theme/edit/t_lorien.txt b/lib/mods/theme/edit/t_lorien.txt index a4a63172..efe4a4af 100644 --- a/lib/mods/theme/edit/t_lorien.txt +++ b/lib/mods/theme/edit/t_lorien.txt @@ -21,30 +21,30 @@ F:x:96:3 F:v:88:3 # Default for Quest 22 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:22 +F:w:8:3:0:0:0:0:22 ############### Quest 22 - Wolves hut finished = house ############### ?:[EQU $QUEST22 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST22 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 ############### Entrance to the Void ############### ?:[EQU $QUEST20 1] -F:v:7:3:0:0:0:0:0:11 +F:v:7:3:0:0:0:0:11 ?:1 ############### Quest 10 - Spiders of Mirkwood ############### # Quest 10 taken, entrance is quest entrance ?:[EQU $QUEST10 1] -F:y:8:3:0:0:0:0:0:10 +F:y:8:3:0:0:0:0:10 ?:1 ############### Quest - Mage/Fireroof quest ############### # Mage/Fireproof Quest taken, entrance is quest entrance ?:[EQU $QUEST"Old Mages quest" 1] -F:z:8:3:0:0:0:0:0:"Old Mages quest" +F:z:8:3:0:0:0:0:"Old Mages quest" ?:1 ### Additional terrain features ### @@ -64,43 +64,43 @@ F:l:202:3 ###################### Buildings ######################## # The Mirror -F:a:74:3:0:0:0:0:0:23 +F:a:74:3:0:0:0:0:23 # Castle: Plot Lorien -F:B:75:3:0:0:0:0:0:2 +F:B:75:3:0:0:0:0:2 # Seat of Ruling -F:b:74:3:0:0:0:0:0:24 +F:b:74:3:0:0:0:0:24 # Inn -F:c:74:3:0:0:0:0:0:69 +F:c:74:3:0:0:0:0:69 # Beastmaster Shanty -F:d:74:3:0:0:0:0:0:16 +F:d:74:3:0:0:0:0:16 # Fighters Hall -F:f:74:3:0:0:0:0:0:17 +F:f:74:3:0:0:0:0:17 # Wizards Spire -F:g:74:3:0:0:0:0:0:25 +F:g:74:3:0:0:0:0:25 # Priests Circle -F:h:74:3:0:0:0:0:0:26 +F:h:74:3:0:0:0:0:26 # Rangers Guild -F:i:74:3:0:0:0:0:0:21 +F:i:74:3:0:0:0:0:21 # Nest -F:j:74:3:0:0:0:0:0:22 +F:j:74:3:0:0:0:0:22 # Hunter store -F:k:74:3:0:0:0:0:0:61 +F:k:74:3:0:0:0:0:61 # Museum -F:q:74:3:0:0:0:0:0:57 +F:q:74:3:0:0:0:0:57 # Music shop -F:r:74:3:0:0:0:0:0:64 +F:r:74:3:0:0:0:0:64 # Force elven monsters f:ELVEN diff --git a/lib/mods/theme/edit/t_minas.txt b/lib/mods/theme/edit/t_minas.txt index cea53634..ea5c0fe5 100644 --- a/lib/mods/theme/edit/t_minas.txt +++ b/lib/mods/theme/edit/t_minas.txt @@ -9,66 +9,66 @@ F:Z:63:3 # Default for Quest 24 = entrance is quest entrance -F:w:8:3:0:0:0:0:0:24 +F:w:8:3:0:0:0:0:24 #################### Quest 16 - The last Alliance #################### # Quest 16 finished, reward is a between gate ?:[EQU $QUEST16 5] -F:Z:176:3:0:0:0:0:0:2 +F:Z:176:3:0:0:0:0:2 ?:1 ############### Quest 24 - Haunted House finished = house ############### ?:[EQU $QUEST24 2] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:[EQU $QUEST24 5] -F:w:74:3:0:0:0:0:0:7 +F:w:74:3:0:0:0:0:7 ?:1 #################### Buildings #################### # Library -F:a:74:3:0:0:0:0:0:60 +F:a:74:3:0:0:0:0:60 # Castle -F:b:74:3:0:0:0:0:0:14 +F:b:74:3:0:0:0:0:14 # Casino -F:d:74:3:0:0:0:0:0:15 +F:d:74:3:0:0:0:0:15 # Inn -F:e:74:3:0:0:0:0:0:11 +F:e:74:3:0:0:0:0:11 # Beastmaster Shanty -F:f:74:3:0:0:0:0:0:16 +F:f:74:3:0:0:0:0:16 # Fighters hall -F:g:74:3:0:0:0:0:0:17 +F:g:74:3:0:0:0:0:17 # Tower of Magery -F:h:74:3:0:0:0:0:0:18 +F:h:74:3:0:0:0:0:18 # Inner temple -F:i:74:3:0:0:0:0:0:19 +F:i:74:3:0:0:0:0:19 # Paladin guild -F:j:74:3:0:0:0:0:0:20 +F:j:74:3:0:0:0:0:20 # Ranger guild -F:k:74:3:0:0:0:0:0:21 +F:k:74:3:0:0:0:0:21 # Thunderlord's Hide -F:l:74:3:0:0:0:0:0:22 +F:l:74:3:0:0:0:0:22 # Castle: Plot Minas Anor -F:B:75:3:0:0:0:0:0:5 +F:B:75:3:0:0:0:0:5 # Library Quest F:x:63:3 ?:[EQU $QUEST"Library quest" 1] -F:x:8:3:0:0:0:0:0:"Library quest" +F:x:8:3:0:0:0:0:"Library quest" ?:1 ############### Town Layout ############### diff --git a/lib/mods/theme/edit/t_osgili.txt b/lib/mods/theme/edit/t_osgili.txt index ea74d660..7011cd16 100644 --- a/lib/mods/theme/edit/t_osgili.txt +++ b/lib/mods/theme/edit/t_osgili.txt @@ -33,40 +33,40 @@ F:z:169:3 ### Buildings ### # The Twinkling Star inn -F:e:74:3:0:0:0:0:0:68 +F:e:74:3:0:0:0:0:68 # The Castle of Stars -F:f:74:3:0:0:0:0:0:85 +F:f:74:3:0:0:0:0:85 # Map store -F:g:74:3:0:0:0:0:0:66 +F:g:74:3:0:0:0:0:66 # Museum -F:h:74:3:0:0:0:0:0:57 +F:h:74:3:0:0:0:0:57 # Soothsayer -F:i:74:3:0:0:0:0:0:12 +F:i:74:3:0:0:0:0:12 # Library -F:j:74:3:0:0:0:0:0:13 +F:j:74:3:0:0:0:0:13 # Casino -F:o:74:3:0:0:0:0:0:15 +F:o:74:3:0:0:0:0:15 # Fighters Hall -F:p:74:3:0:0:0:0:0:17 +F:p:74:3:0:0:0:0:17 # Tower of Magery -F:q:74:3:0:0:0:0:0:18 +F:q:74:3:0:0:0:0:18 # Inner Temple -F:r:74:3:0:0:0:0:0:19 +F:r:74:3:0:0:0:0:19 # Paladins Guild -F:u:74:3:0:0:0:0:0:20 +F:u:74:3:0:0:0:0:20 # Rangers Guild -F:v:74:3:0:0:0:0:0:21 +F:v:74:3:0:0:0:0:21 D:###################################################################################################################################################################################################### D:#---------------------------------------------------------#################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##########################---------------------------------------------------------# diff --git a/lib/mods/theme/edit/t_pelar.txt b/lib/mods/theme/edit/t_pelar.txt index 0057518b..fcc31244 100644 --- a/lib/mods/theme/edit/t_pelar.txt +++ b/lib/mods/theme/edit/t_pelar.txt @@ -14,28 +14,28 @@ F:a:227:3 ### Buildings ### # The Grey Swan inn -F:b:74:3:0:0:0:0:0:68 +F:b:74:3:0:0:0:0:68 # The Prince's Tower -F:c:74:3:0:0:0:0:0:86 +F:c:74:3:0:0:0:0:86 # Music store -F:d:74:3:0:0:0:0:0:64 +F:d:74:3:0:0:0:0:64 # Rune Shop -F:e:74:3:0:0:0:0:0:62 +F:e:74:3:0:0:0:0:62 # Hunting Store -F:f:74:3:0:0:0:0:0:61 +F:f:74:3:0:0:0:0:61 # Library -F:i:74:3:0:0:0:0:0:13 +F:i:74:3:0:0:0:0:13 # Casino -F:j:74:3:0:0:0:0:0:15 +F:j:74:3:0:0:0:0:15 # Beastmaster -F:k:74:3:0:0:0:0:0:16 +F:k:74:3:0:0:0:0:16 D:###################################################################################################################################################################################################### D:#-------------------------------------------------@VVVVV@##VVVVV@@-----------------------------------------------------------------------------------------------------------------------------------# # diff --git a/lib/mods/theme/edit/t_pref.txt b/lib/mods/theme/edit/t_pref.txt index 1159e817..e8a601bb 100644 --- a/lib/mods/theme/edit/t_pref.txt +++ b/lib/mods/theme/edit/t_pref.txt @@ -1,19 +1,19 @@ # File: t_pref.txt # Defines the preferences for the town features -# letter:feature:cave_info:monster:object:ego:artifact:trap:special +# letter:feature:cave_info:monster:object:ego:artifact:special # Barrow-Downs entrance -F:{:7:3:0:0:0:0:0:4 +F:{:7:3:0:0:0:0:4 # Mirkwood Forest entrance -F:~:7:3:0:0:0:0:0:1 +F:~:7:3:0:0:0:0:1 # Land of Mordor entrance -F:|:7:3:0:0:0:0:0:2 +F:|:7:3:0:0:0:0:2 # Angband Dungeon entrance -F:>:7:3:0:0:0:0:0:3 +F:>:7:3:0:0:0:0:3 # Mountain chain F:^:97:3 @@ -72,34 +72,34 @@ F:Y:192:3 F:O:200:3 # General Store -F:1:74:3:0:0:0:0:0:0 +F:1:74:3:0:0:0:0:0 # Armoury -F:2:74:3:0:0:0:0:0:1 +F:2:74:3:0:0:0:0:1 # Weapons Smith -F:3:74:3:0:0:0:0:0:2 +F:3:74:3:0:0:0:0:2 # Temple -F:4:74:3:0:0:0:0:0:3 +F:4:74:3:0:0:0:0:3 # Alchemy Shop -F:5:74:3:0:0:0:0:0:4 +F:5:74:3:0:0:0:0:4 # Magic Shop -F:6:74:3:0:0:0:0:0:5 +F:6:74:3:0:0:0:0:5 # Black Market -F:7:74:3:0:0:0:0:0:6 +F:7:74:3:0:0:0:0:6 # Home -F:8:74:3:0:0:0:0:0:7 +F:8:74:3:0:0:0:0:7 # Bookstore -F:9:74:3:0:0:0:0:0:8 +F:9:74:3:0:0:0:0:8 # Pet Shop -F:0:74:3:0:0:0:0:0:9 +F:0:74:3:0:0:0:0:9 # Underground Tunnels -- used for tunnels in towns F:I:173:3 diff --git a/lib/mods/theme/edit/t_thrand.txt b/lib/mods/theme/edit/t_thrand.txt index cce9d684..f8c17f9b 100644 --- a/lib/mods/theme/edit/t_thrand.txt +++ b/lib/mods/theme/edit/t_thrand.txt @@ -18,22 +18,22 @@ f:ELVEN ### Buildings ### # Thranduil's Hall -F:b:74:3:0:0:0:0:0:81 +F:b:74:3:0:0:0:0:81 # Beastmaster -F:d:74:3:0:0:0:0:0:16 +F:d:74:3:0:0:0:0:16 # Hunter -F:e:74:3:0:0:0:0:0:61 +F:e:74:3:0:0:0:0:61 # Music Store -F:f:74:3:0:0:0:0:0:64 +F:f:74:3:0:0:0:0:64 # Map store -F:g:74:3:0:0:0:0:0:66 +F:g:74:3:0:0:0:0:66 #The Library -F:h:74:3:0:0:0:0:0:13 +F:h:74:3:0:0:0:0:13 D:###################################################################################################################################################################################################### D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^# diff --git a/lib/mods/theme/edit/thieves.map b/lib/mods/theme/edit/thieves.map index ba025ff6..43b1a299 100644 --- a/lib/mods/theme/edit/thieves.map +++ b/lib/mods/theme/edit/thieves.map @@ -23,13 +23,13 @@ F:d:4:6 F:<:6:8 # Floor with Novice rogue -F:a:1:6:44:0:0:0:0:0:0:2 +F:a:1:6:44:0:0:0:0:0:2 # Floor with Bandit -F:b:1:6:150:43:*:0:0:0:0:2 +F:b:1:6:150:43:*:0:0:0:2 # Dark floor with novice rogue -F:f:1:4:44:0:0:0:0:0:0:2 +F:f:1:4:44:0:0:0:0:0:2 # Floor with human skeleton F:z:1:6:0:395 diff --git a/lib/mods/theme/edit/thrain.map b/lib/mods/theme/edit/thrain.map index 8adc41be..7c60a839 100644 --- a/lib/mods/theme/edit/thrain.map +++ b/lib/mods/theme/edit/thrain.map @@ -1,25 +1,22 @@ # Floor -F:.:1:0:0:0:0:0:0:0:61 +F:.:1:0:0:0:0:0:0:61 # Some Nazguls -F:1:1:0:951:0:0:0:0:0:61:2 -F:2:1:0:952:0:0:0:0:0:61:2 -F:o:1:0:866:0:0:0:0:0:61 +F:1:1:0:951:0:0:0:0:61:2 +F:2:1:0:952:0:0:0:0:61:2 +F:o:1:0:866:0:0:0:0:61 # Marker -F:,:172:6:0:0:0:0:0:0:61 +F:,:172:6:0:0:0:0:0:61 # Lit permanent wall F:x:61:6 # Door -F:D:48:0:0:0:0:0:0:0:61 - -# Floor with Trap -F:t:1:8:0:0:0:0:* +F:D:48:0:0:0:0:0:0:61 # Deep lava -F:l:85:0:0:0:0:0:0:0:61 +F:l:85:0:0:0:0:0:0:61 # Dungeon layout D: diff --git a/lib/mods/theme/edit/trolls.map b/lib/mods/theme/edit/trolls.map index e5d104fd..c54a5418 100644 --- a/lib/mods/theme/edit/trolls.map +++ b/lib/mods/theme/edit/trolls.map @@ -17,19 +17,19 @@ F:.:88:3 F:;:89:3 # Floor with forest troll -F:f:89:3:297:0:0:0:0:0:0:2 +F:f:89:3:297:0:0:0:0:0:2 # Floor with stone troll -F:s:89:3:401:0:0:0:0:0:0:2 +F:s:89:3:401:0:0:0:0:0:2 # Floor with algroth -F:a:89:3:424:0:0:0:0:0:0:2 +F:a:89:3:424:0:0:0:0:0:2 # Floor with Bert -F:b:89:3:493:0:0:0:0:0:0:2 +F:b:89:3:493:0:0:0:0:0:2 # Floor with Bill -F:i:89:3:494:0:0:0:0:0:0:2 +F:i:89:3:494:0:0:0:0:0:2 # Floor with a Dwarven skeleton F:k:89:8:0:396 diff --git a/lib/mods/theme/edit/volcano.txt b/lib/mods/theme/edit/volcano.txt index 1b89cf3d..c7e64dee 100644 --- a/lib/mods/theme/edit/volcano.txt +++ b/lib/mods/theme/edit/volcano.txt @@ -1,10 +1,10 @@ # File: volcano.txt # Stairway to the Hell -F:$:7:3:0:0:0:0:0:6 +F:$:7:3:0:0:0:0:6 # Hole to the center of the Volcano -F:>:7:3:0:0:0:0:0:5 +F:>:7:3:0:0:0:0:5 ############### Town Layout ############### diff --git a/lib/mods/theme/edit/wights.map b/lib/mods/theme/edit/wights.map index b67963ac..cc4bae88 100644 --- a/lib/mods/theme/edit/wights.map +++ b/lib/mods/theme/edit/wights.map @@ -17,13 +17,13 @@ F:;:88:3 F:f:88:3:381 # Floor with grave wight -F:g:88:3:470:0:0:0:0:0:0:2 +F:g:88:3:470:0:0:0:0:0:2 # Floor with barrow wight -F:b:88:3:499:0:0:0:0:0:0:2 +F:b:88:3:499:0:0:0:0:0:2 # Floor with Emperor Wight -F:e:88:3:604:0:0:0:0:0:0:2 +F:e:88:3:604:0:0:0:0:0:2 # Floor with a Human Skeleton F:k:88:8:0:395 @@ -32,31 +32,31 @@ F:k:88:8:0:395 F:,:172:6 # between gate 1 -F:1:160:6:0:0:0:0:0:2057 +F:1:160:6:0:0:0:0:2057 # between gate 2 -F:2:160:6:0:0:0:0:0:1036 +F:2:160:6:0:0:0:0:1036 # between gate 3 -F:3:160:6:0:0:0:0:0:3847 +F:3:160:6:0:0:0:0:3847 # between gate 4 -F:4:160:6:0:0:0:0:0:2321 +F:4:160:6:0:0:0:0:2321 # between gate 5 -F:5:160:6:0:0:0:0:0:1043 +F:5:160:6:0:0:0:0:1043 # between gate 6 -F:6:160:6:0:0:0:0:0:3599 +F:6:160:6:0:0:0:0:3599 # between gate 7 -F:7:160:6:0:0:0:0:0:2071 +F:7:160:6:0:0:0:0:2071 # between gate 8 -F:8:160:6:0:0:0:0:0:3350 +F:8:160:6:0:0:0:0:3350 # between gate 9 -F:9:160:6:0:0:0:0:0:771 +F:9:160:6:0:0:0:0:771 # Dungeon layout D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX diff --git a/src/init1.cc b/src/init1.cc index 6fd08ed2..c77f28eb 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -5921,7 +5921,6 @@ errr init_wf_info_txt(FILE *fp) #define RANDOM_OBJECT 0x04 #define RANDOM_EGO 0x08 #define RANDOM_ARTIFACT 0x10 -#define RANDOM_TRAP 0x20 typedef struct dungeon_grid dungeon_grid; @@ -5933,7 +5932,6 @@ struct dungeon_grid int object; /* Object */ int ego; /* Ego-Item */ int artifact; /* Artifact */ - int trap; /* Trap */ int cave_info; /* Flags for CAVE_MARK, CAVE_GLOW, CAVE_ICKY, CAVE_ROOM */ int special; /* Reserved for special terrain info */ int random; /* Number of the random effect */ @@ -5994,12 +5992,12 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst return (0); } - /* Process "F:::::::::::" -- info for dungeon grid */ + /* Process "F::::::::::" -- info for dungeon grid */ if (buf[0] == 'F') { int num; - if ((num = tokenize(buf + 2, 11, zz, ':', '/')) > 1) + if ((num = tokenize(buf + 2, 10, zz, ':', '/')) > 1) { int index = zz[0][0]; @@ -6009,7 +6007,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst letter[index].object = 0; letter[index].ego = 0; letter[index].artifact = 0; - letter[index].trap = 0; letter[index].cave_info = 0; letter[index].special = 0; letter[index].random = 0; @@ -6115,34 +6112,17 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst if (num > 7) { - if (zz[7][0] == '*') - { - letter[index].random |= RANDOM_TRAP; - - if (zz[7][1]) - { - zz[7]++; - letter[index].trap = atoi(zz[7]); - } - } - else - letter[index].trap = atoi(zz[7]); - } - - if (num > 8) - { + char *field = zz[7]; /* Quests can be defined by name only */ - if (zz[8][0] == '"') + if (field[0] == '"') { - int i; - /* Hunt & shoot the ending " */ - i = strlen(zz[8]) - 1; - if (zz[8][i] == '"') zz[8][i] = '\0'; + int i = strlen(field) - 1; + if (field[i] == '"') field[i] = '\0'; letter[index].special = 0; for (i = 0; i < MAX_Q_IDX; i++) { - if (!strcmp(&zz[8][1], quest[i].name)) + if (!strcmp(&field[1], quest[i].name)) { letter[index].special = i; break; @@ -6150,17 +6130,17 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst } } else - letter[index].special = atoi(zz[8]); + letter[index].special = atoi(field); } - if (num > 9) + if (num > 8) { - letter[index].mimic = atoi(zz[9]); + letter[index].mimic = atoi(zz[8]); } - if (num > 10) + if (num > 9) { - letter[index].mflag = atoi(zz[10]); + letter[index].mflag = atoi(zz[9]); } return (0); @@ -6262,28 +6242,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst if (m_idx) m_list[m_idx].mflag |= letter[idx].mflag; /* Object (and possible trap) */ - if ((random & RANDOM_OBJECT) && (random & RANDOM_TRAP)) - { - int level = object_level; - - object_level = quest[p_ptr->inside_quest].level; - - /* - * Random trap and random treasure defined - * 25% chance for trap and 75% chance for object - */ - if (rand_int(100) < 75) - { - place_object(y, x, FALSE, FALSE, OBJ_FOUND_SPECIAL); - } - else - { - /* No traps - do nothing */ - } - - object_level = level; - } - else if (random & RANDOM_OBJECT) + if (random & RANDOM_OBJECT) { /* Create an out of deep object */ if (object_index) @@ -6313,10 +6272,6 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst place_object(y, x, TRUE, TRUE, OBJ_FOUND_SPECIAL); } } - else if (random & RANDOM_TRAP) - { - /* Do nothing */ - } else if (object_index) { /* Get local object */ -- cgit v1.2.3 From 71a820e7298a670c13bd68cb3e6f2274a4dc3ba9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove unused parameter from disturb() --- src/cave.cc | 6 ++-- src/cave.hpp | 2 +- src/cmd1.cc | 20 +++++------ src/cmd2.cc | 16 ++++----- src/dungeon.cc | 32 ++++++++--------- src/files.cc | 2 +- src/melee1.cc | 8 ++--- src/melee2.cc | 110 ++++++++++++++++++++++++++++---------------------------- src/monster2.cc | 8 ++--- src/object1.cc | 2 +- src/spells1.cc | 10 +++--- src/xtra2.cc | 2 +- 12 files changed, 109 insertions(+), 109 deletions(-) diff --git a/src/cave.cc b/src/cave.cc index 1ef32839..4e804d81 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -4330,7 +4330,7 @@ void object_track(object_type *o_ptr) * * All disturbance cancels repeated commands, resting, and running. */ -void disturb(int) +void disturb() { /* Cancel auto-commands */ /* command_new = 0; */ @@ -4381,7 +4381,7 @@ void disturb_on_state() { if (options->disturb_state) { - disturb(0); + disturb(); } } @@ -4394,7 +4394,7 @@ void disturb_on_other() { if (options->disturb_other) { - disturb(1); + disturb(); } } diff --git a/src/cave.hpp b/src/cave.hpp index 66b16d82..5eade816 100644 --- a/src/cave.hpp +++ b/src/cave.hpp @@ -36,7 +36,7 @@ extern void scatter(int *yp, int *xp, int y, int x, int d); extern void health_track(int m_idx); extern void monster_race_track(int r_idx, int ego); extern void object_track(object_type *o_ptr); -extern void disturb(int stop_search); +extern void disturb(); extern void disturb_on_state(); extern void disturb_on_other(); extern int is_quest(int level); diff --git a/src/cmd1.cc b/src/cmd1.cc index 564fa055..6b2214c3 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -585,7 +585,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, if (!effect || check_hit2(power, rlev, ac)) { /* Always disturbing */ - disturb(1); + disturb(); /* Describe the attack method */ switch (method) @@ -974,7 +974,7 @@ static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, case RBM_CHARGE: { /* Disturb */ - disturb(1); + disturb(); /* Message */ msg_format("%s misses %s.", symbiote_name(true).c_str(), t_name); @@ -1079,7 +1079,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, if (!effect || check_hit2(power, rlev, ac)) { /* Always disturbing */ - disturb(1); + disturb(); /* Describe the attack method */ switch (method) @@ -1465,7 +1465,7 @@ static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath, case RBM_CHARGE: { /* Disturb */ - disturb(1); + disturb(); /* Message */ msg_format("You miss %s.", t_name); @@ -1899,7 +1899,7 @@ void py_attack(int y, int x, int max_blow) int weap; /* Disturb the player */ - disturb(0); + disturb(); if (r_info[p_ptr->body_monster].flags & RF_NEVER_BLOW) { @@ -2864,7 +2864,7 @@ void move_player_aux(int dir, int do_pickup, int run) oktomove = FALSE; /* Disturb the player */ - disturb(0); + disturb(); if (p_ptr->prob_travel) { @@ -3009,7 +3009,7 @@ void move_player_aux(int dir, int do_pickup, int run) if (c_ptr->feat == FEAT_SHOP) { /* Disturb */ - disturb(0); + disturb(); /* Hack -- Enter store */ command_new = '_'; @@ -3031,7 +3031,7 @@ void move_player_aux(int dir, int do_pickup, int run) else if (c_ptr->inscription) { /* Disturb */ - disturb(0); + disturb(); msg_format("There is an inscription here: %s", inscription_info[c_ptr->inscription].text); @@ -3793,7 +3793,7 @@ void run_step(int dir) msg_print("You cannot run in that direction."); /* Disturb */ - disturb(0); + disturb(); /* Done */ return; @@ -3813,7 +3813,7 @@ void run_step(int dir) if (run_test()) { /* Disturb */ - disturb(0); + disturb(); /* Done */ return; diff --git a/src/cmd2.cc b/src/cmd2.cc index dce9273d..11e70583 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -1117,7 +1117,7 @@ void do_cmd_open(void) } /* Cancel repeat unless we may continue */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -1265,7 +1265,7 @@ void do_cmd_close(void) } /* Cancel repeat unless we may continue */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -1694,7 +1694,7 @@ void do_cmd_tunnel(void) } /* Cancel repetition unless we can continue */ - if (!more) disturb(0); + if (!more) disturb(); } /* @@ -1897,7 +1897,7 @@ void do_cmd_bash(void) } /* Unless valid action taken, cancel bash */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -1980,7 +1980,7 @@ void do_cmd_alter(void) } /* Cancel repetition unless we can continue */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -2150,7 +2150,7 @@ static void do_cmd_walk_jump(int pickup) } /* Cancel repeat unless we may continue */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -2322,7 +2322,7 @@ static void do_cmd_unwalk() } /* Cancel repetition unless we can continue */ - if (!more) disturb(0); + if (!more) disturb(); } @@ -2420,7 +2420,7 @@ void do_cmd_stay(int pickup) if (c_ptr->feat == FEAT_SHOP) { /* Disturb */ - disturb(0); + disturb(); /* Hack -- enter store */ command_new = '_'; diff --git a/src/dungeon.cc b/src/dungeon.cc index e73c9ac5..e4946959 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -966,7 +966,7 @@ static void process_world_corruptions() } else { - disturb(0); + disturb(); msg_print("Your corruption takes over you, you teleport!"); teleport_player(50); } @@ -1650,7 +1650,7 @@ static void process_world(void) { /* Message */ msg_print("You faint from the lack of food."); - disturb(1); + disturb(); /* Hack -- faint (bypass free action) */ (void)set_paralyzed(1 + rand_int(5)); @@ -2577,7 +2577,7 @@ static void process_world(void) if (!be_silent) { cmsg_print(TERM_L_DARK, "The Black Breath saps your soul!"); - disturb(0); + disturb(); } } @@ -2616,7 +2616,7 @@ static void process_world(void) /* The light is now out */ else if (o_ptr->timeout < 1) { - disturb(0); + disturb(); cmsg_print(TERM_YELLOW, "Your light has gone out!"); } @@ -2625,7 +2625,7 @@ static void process_world(void) { if (options->disturb_minor) { - disturb(0); + disturb(); } cmsg_print(TERM_YELLOW, "Your light is growing faint."); } @@ -2669,7 +2669,7 @@ static void process_world(void) if (p_ptr->csp < 0) { p_ptr->csp = 0; - disturb(0); + disturb(); } /* Redraw */ @@ -2688,7 +2688,7 @@ static void process_world(void) if (p_ptr->csp < 0) { p_ptr->csp = 0; - disturb(0); + disturb(); p_ptr->maintain_sum = 0; } @@ -2715,7 +2715,7 @@ static void process_world(void) if (p_ptr->chp == 0) { - disturb(0); + disturb(); } /* Redraw */ @@ -2776,7 +2776,7 @@ static void process_world(void) { if ((o_ptr->ident & IDENT_CURSED) && !p_ptr->anti_tele) { - disturb(0); + disturb(); /* Teleport player */ teleport_player(40); @@ -2789,7 +2789,7 @@ static void process_world(void) } else if (get_check("Teleport? ")) { - disturb(0); + disturb(); teleport_player(50); } } @@ -3122,7 +3122,7 @@ static void process_world(void) if (p_ptr->word_recall == 0) { /* Disturbing! */ - disturb(0); + disturb(); /* Determine the level */ if (p_ptr->inside_quest) @@ -4204,7 +4204,7 @@ static void process_player(void) /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) && (p_ptr->csp >= p_ptr->msp)) { - disturb(0); + disturb(); } } @@ -4235,7 +4235,7 @@ static void process_player(void) if (stop) { - disturb(0); + disturb(); } p_ptr->redraw |= (PR_FRAME); } @@ -4254,7 +4254,7 @@ static void process_player(void) flush(); /* Disturb */ - disturb(0); + disturb(); /* Hack -- Show a Message */ msg_print("Cancelled."); @@ -4307,7 +4307,7 @@ static void process_player(void) o_ptr = &p_ptr->inventory[item]; /* Disturbing */ - disturb(0); + disturb(); /* Warning */ msg_print("Your pack overflows!"); @@ -4645,7 +4645,7 @@ static void dungeon(void) /* Disturb */ - disturb(1); + disturb(); /* Track maximum player level */ if (p_ptr->max_plv < p_ptr->lev) diff --git a/src/files.cc b/src/files.cc index d073f7fc..9f1262b0 100644 --- a/src/files.cc +++ b/src/files.cc @@ -3976,7 +3976,7 @@ void do_cmd_save_game(void) if (!is_autosave) { /* Disturb the player */ - disturb(1); + disturb(); } /* Clear messages */ diff --git a/src/melee1.cc b/src/melee1.cc index 458e2fd3..1b20588a 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -280,7 +280,7 @@ bool_ carried_make_attack_normal(int r_idx) if (!effect || check_hit(power, rlev)) { /* Always disturbing */ - disturb(1); + disturb(); /* Hack -- Apply "protection from evil" */ if ((p_ptr->protevil > 0) && @@ -1165,7 +1165,7 @@ bool_ carried_make_attack_normal(int r_idx) case RBM_CHARGE: /* Disturbing */ - disturb(1); + disturb(); /* Message */ msg_format("%s misses you.", sym_name.c_str()); @@ -1388,7 +1388,7 @@ bool_ make_attack_normal(int m_idx, byte divis) int chance = p_ptr->dodge_chance - ((rlev * 5) / 6); /* Always disturbing */ - disturb(1); + disturb(); if ((chance > 0) && magik(chance)) { @@ -2681,7 +2681,7 @@ bool_ make_attack_normal(int m_idx, byte divis) if (m_ptr->ml) { /* Disturbing */ - disturb(1); + disturb(); /* Message */ msg_format("%^s misses you.", m_name); diff --git a/src/melee2.cc b/src/melee2.cc index 691021a5..0988d2af 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -2647,7 +2647,7 @@ static bool_ make_attack_spell(int m_idx) /* Do a breath */ auto do_breath = [&](char const *element, int gf, s32b max, int divisor, int smart_learn) -> void { // Interrupt - disturb(1); + disturb(); // Message if (blind) { @@ -2678,7 +2678,7 @@ static bool_ make_attack_spell(int m_idx) /* Do a summoning spell */ auto do_summon = [&](char const *action, int n, int type, summon_messages const &blind_msg) -> void { // Interrupt - disturb(1); + disturb(); // Message if (blind) { @@ -2713,7 +2713,7 @@ static bool_ make_attack_spell(int m_idx) { case SF_SHRIEK_IDX: { - disturb(1); + disturb(); msg_format("%^s makes a high pitched shriek.", m_name); aggravate_monsters(m_idx); break; @@ -2726,7 +2726,7 @@ static bool_ make_attack_spell(int m_idx) case SF_ROCKET_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s shoots something.", m_name); else msg_format("%^s fires a rocket.", m_name); breath(m_idx, GF_ROCKET, @@ -2737,7 +2737,7 @@ static bool_ make_attack_spell(int m_idx) case SF_ARROW_1_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s makes a strange noise.", m_name); else msg_format("%^s fires an arrow.", m_name); bolt(m_idx, GF_ARROW, damroll(1, 6)); @@ -2747,7 +2747,7 @@ static bool_ make_attack_spell(int m_idx) case SF_ARROW_2_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s makes a strange noise.", m_name); else msg_format("%^s fires an arrow!", m_name); bolt(m_idx, GF_ARROW, damroll(3, 6)); @@ -2757,7 +2757,7 @@ static bool_ make_attack_spell(int m_idx) case SF_ARROW_3_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s makes a strange noise.", m_name); else msg_format("%^s fires a missile.", m_name); bolt(m_idx, GF_ARROW, damroll(5, 6)); @@ -2767,7 +2767,7 @@ static bool_ make_attack_spell(int m_idx) case SF_ARROW_4_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s makes a strange noise.", m_name); else msg_format("%^s fires a missile!", m_name); bolt(m_idx, GF_ARROW, damroll(7, 6)); @@ -2897,7 +2897,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_NUKE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a ball of radiation.", m_name); breath(m_idx, GF_NUKE, (rlev + damroll(10, 6)), 2); @@ -2913,7 +2913,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_CHAO_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles frighteningly.", m_name); else msg_format("%^s invokes a raw chaos.", m_name); breath(m_idx, GF_CHAOS, (rlev * 2) + damroll(10, 10), 4); @@ -2929,7 +2929,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_ACID_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts an acid ball.", m_name); breath(m_idx, GF_ACID, @@ -2940,7 +2940,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_ELEC_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a lightning ball.", m_name); breath(m_idx, GF_ELEC, @@ -2951,7 +2951,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_FIRE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a fire ball.", m_name); breath(m_idx, GF_FIRE, @@ -2962,7 +2962,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_COLD_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a frost ball.", m_name); breath(m_idx, GF_COLD, @@ -2973,7 +2973,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_POIS_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a stinking cloud.", m_name); breath(m_idx, GF_POIS, @@ -2984,7 +2984,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_NETH_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a nether ball.", m_name); breath(m_idx, GF_NETHER, @@ -2995,7 +2995,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_WATE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s gestures fluidly.", m_name); msg_print("You are engulfed in a whirlpool."); @@ -3006,7 +3006,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_MANA_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles powerfully.", m_name); else msg_format("%^s invokes a mana storm.", m_name); breath(m_idx, GF_MANA, @@ -3016,7 +3016,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BA_DARK_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles powerfully.", m_name); else msg_format("%^s invokes a darkness storm.", m_name); breath(m_idx, GF_DARK, @@ -3032,7 +3032,7 @@ static bool_ make_attack_spell(int m_idx) int r1; /* Disturb if legal */ - disturb(1); + disturb(); /* Basic message */ msg_format("%^s draws psychic energy from you!", m_name); @@ -3083,7 +3083,7 @@ static bool_ make_attack_spell(int m_idx) case SF_MIND_BLAST_IDX: { - disturb(1); + disturb(); if (!seen) { msg_print("You feel something focusing on your mind."); @@ -3118,7 +3118,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BRAIN_SMASH_IDX: { - disturb(1); + disturb(); if (!seen) { msg_print("You feel something focusing on your mind."); @@ -3165,7 +3165,7 @@ static bool_ make_attack_spell(int m_idx) case SF_CAUSE_1_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s points at you and curses.", m_name); if (rand_int(100) < p_ptr->skill_sav) @@ -3182,7 +3182,7 @@ static bool_ make_attack_spell(int m_idx) case SF_CAUSE_2_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s points at you and curses horribly.", m_name); if (rand_int(100) < p_ptr->skill_sav) @@ -3199,7 +3199,7 @@ static bool_ make_attack_spell(int m_idx) case SF_CAUSE_3_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles loudly.", m_name); else msg_format("%^s points at you, incanting terribly!", m_name); if (rand_int(100) < p_ptr->skill_sav) @@ -3216,7 +3216,7 @@ static bool_ make_attack_spell(int m_idx) case SF_CAUSE_4_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s screams the word 'DIE!'", m_name); else msg_format("%^s points at you, screaming the word DIE!", m_name); if (rand_int(100) < p_ptr->skill_sav) @@ -3233,7 +3233,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_ACID_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a acid bolt.", m_name); bolt(m_idx, GF_ACID, damroll(7, 8) + (rlev / 3)); @@ -3244,7 +3244,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_ELEC_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a lightning bolt.", m_name); bolt(m_idx, GF_ELEC, damroll(4, 8) + (rlev / 3)); @@ -3255,7 +3255,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_FIRE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a fire bolt.", m_name); bolt(m_idx, GF_FIRE, damroll(9, 8) + (rlev / 3)); @@ -3266,7 +3266,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_COLD_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a frost bolt.", m_name); bolt(m_idx, GF_COLD, damroll(6, 8) + (rlev / 3)); @@ -3283,7 +3283,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_NETH_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a nether bolt.", m_name); bolt(m_idx, GF_NETHER, 30 + damroll(5, 5) + (rlev * 3) / 2); @@ -3294,7 +3294,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_WATE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a water bolt.", m_name); bolt(m_idx, GF_WATER, damroll(10, 10) + (rlev)); @@ -3304,7 +3304,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_MANA_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a mana bolt.", m_name); bolt(m_idx, GF_MANA, randint(rlev * 7 / 2) + 50); @@ -3314,7 +3314,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_PLAS_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a plasma bolt.", m_name); bolt(m_idx, GF_PLASMA, 10 + damroll(8, 7) + (rlev)); @@ -3324,7 +3324,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BO_ICEE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts an ice bolt.", m_name); bolt(m_idx, GF_ICE, damroll(6, 6) + (rlev)); @@ -3335,7 +3335,7 @@ static bool_ make_attack_spell(int m_idx) case SF_MISSILE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a magic missile.", m_name); bolt(m_idx, GF_MISSILE, damroll(2, 6) + (rlev / 3)); @@ -3345,7 +3345,7 @@ static bool_ make_attack_spell(int m_idx) case SF_SCARE_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles, and you hear scary noises.", m_name); else msg_format("%^s casts a fearful illusion.", m_name); if (p_ptr->resist_fear) @@ -3366,7 +3366,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BLIND_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s casts a spell, burning your eyes!", m_name); if (p_ptr->resist_blind) @@ -3387,7 +3387,7 @@ static bool_ make_attack_spell(int m_idx) case SF_CONF_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles, and you hear puzzling noises.", m_name); else msg_format("%^s creates a mesmerizing illusion.", m_name); if (p_ptr->resist_conf) @@ -3408,7 +3408,7 @@ static bool_ make_attack_spell(int m_idx) case SF_SLOW_IDX: { - disturb(1); + disturb(); msg_format("%^s drains power from your muscles!", m_name); if (p_ptr->free_act) { @@ -3428,7 +3428,7 @@ static bool_ make_attack_spell(int m_idx) case SF_HOLD_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s stares deep into your eyes!", m_name); if (p_ptr->free_act) @@ -3449,7 +3449,7 @@ static bool_ make_attack_spell(int m_idx) case SF_HASTE_IDX: { - disturb(1); + disturb(); if (blind) { msg_format("%^s mumbles.", m_name); @@ -3478,7 +3478,7 @@ static bool_ make_attack_spell(int m_idx) case SF_HAND_DOOM_IDX: { - disturb(1); + disturb(); msg_format("%^s invokes the Hand of Doom!", m_name); if (rand_int(100) < p_ptr->skill_sav) { @@ -3498,7 +3498,7 @@ static bool_ make_attack_spell(int m_idx) case SF_HEAL_IDX: { - disturb(1); + disturb(); /* Message */ if (blind) @@ -3561,7 +3561,7 @@ static bool_ make_attack_spell(int m_idx) case SF_BLINK_IDX: { - disturb(1); + disturb(); msg_format("%^s blinks away.", m_name); teleport_away(m_idx, 10); break; @@ -3569,7 +3569,7 @@ static bool_ make_attack_spell(int m_idx) case SF_TPORT_IDX: { - disturb(1); + disturb(); msg_format("%^s teleports away.", m_name); teleport_away(m_idx, MAX_SIGHT * 2 + 5); break; @@ -3577,7 +3577,7 @@ static bool_ make_attack_spell(int m_idx) case SF_TELE_TO_IDX: { - disturb(1); + disturb(); msg_format("%^s commands you to return.", m_name); teleport_player_to(m_ptr->fy, m_ptr->fx); break; @@ -3585,7 +3585,7 @@ static bool_ make_attack_spell(int m_idx) case SF_TELE_AWAY_IDX: { - disturb(1); + disturb(); msg_format("%^s teleports you away.", m_name); teleport_player(100); break; @@ -3593,7 +3593,7 @@ static bool_ make_attack_spell(int m_idx) case SF_TELE_LEVEL_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles strangely.", m_name); else msg_format("%^s gestures at your feet.", m_name); if (p_ptr->resist_nexus) @@ -3614,7 +3614,7 @@ static bool_ make_attack_spell(int m_idx) case SF_DARKNESS_IDX: { - disturb(1); + disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s gestures in shadow.", m_name); (void)unlite_area(0, 3); @@ -3623,7 +3623,7 @@ static bool_ make_attack_spell(int m_idx) case SF_FORGET_IDX: { - disturb(1); + disturb(); msg_format("%^s tries to blank your mind.", m_name); if (rand_int(100) < p_ptr->skill_sav) @@ -3781,7 +3781,7 @@ static bool_ make_attack_spell(int m_idx) case SF_S_UNIQUE_IDX: { // Interrupt - disturb(1); + disturb(); // Message if (blind) { @@ -5130,7 +5130,7 @@ static bool_ monst_attack_monst(int m_idx, int t_idx) if (m_ptr->ml) { /* Disturbing */ - disturb(1); + disturb(); /* Message */ monster_msg("%^s misses %s.", m_name, t_name); @@ -5844,7 +5844,7 @@ static void process_monster(int m_idx, bool_ is_frien) /* Disturb (sometimes) */ if (options->disturb_minor) { - disturb(0); + disturb(); } /* The door was bashed open */ @@ -6132,7 +6132,7 @@ static void process_monster(int m_idx, bool_ is_frien) { /* Disturb */ if ((is_friend(m_ptr) < 0) || options->disturb_pets) - disturb(0); + disturb(); } diff --git a/src/monster2.cc b/src/monster2.cc index 9b82130e..9fee393e 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1774,7 +1774,7 @@ void update_mon(int m_idx, bool_ full) { if (options->disturb_pets || (is_friend(m_ptr) <= 0)) { - disturb(1); + disturb(); } } } @@ -1803,7 +1803,7 @@ void update_mon(int m_idx, bool_ full) { if (options->disturb_pets || (is_friend(m_ptr) <= 0)) { - disturb(1); + disturb(); } } } @@ -1833,7 +1833,7 @@ void update_mon(int m_idx, bool_ full) { if (options->disturb_pets || (is_friend(m_ptr) <= 0)) { - disturb(1); + disturb(); } } @@ -1857,7 +1857,7 @@ void update_mon(int m_idx, bool_ full) { if (options->disturb_pets || (is_friend(m_ptr) <= 0)) { - disturb(1); + disturb(); } } } diff --git a/src/object1.cc b/src/object1.cc index 8f1e5905..1eb9b484 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -5712,7 +5712,7 @@ static void absorb_gold(cave_type const *c_ptr) object_type *o_ptr = &o_list[this_o_idx]; /* Hack -- disturb */ - disturb(0); + disturb(); /* Pick up gold */ if (o_ptr->tval == TV_GOLD) diff --git a/src/spells1.cc b/src/spells1.cc index 7f03703d..05373942 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -233,7 +233,7 @@ void teleport_player_directed(int rad, int dir) if (c_ptr->feat == FEAT_SHOP) { /* Disturb */ - disturb(0); + disturb(); /* Hack -- enter store */ command_new = '_'; @@ -1240,7 +1240,7 @@ void take_hit(int damage, cptr hit_from) if (death) return; /* Disturb */ - disturb(1); + disturb(); /* Apply "invulnerability" */ if (p_ptr->invuln && (damage < 9000)) @@ -1478,7 +1478,7 @@ void take_sanity_hit(int damage, cptr hit_from) if (death) return; /* Disturb */ - disturb(1); + disturb(); /* Hurt the player */ @@ -6901,7 +6901,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad project(0, 0, t_y, t_x, dam, typ, (PROJECT_STOP | PROJECT_KILL)); - disturb(1); + disturb(); return TRUE; } @@ -7792,7 +7792,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad /* Disturb */ - disturb(1); + disturb(); /* Return "Anything seen?" */ diff --git a/src/xtra2.cc b/src/xtra2.cc index 8e859f14..bbc82c68 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -3453,7 +3453,7 @@ void verify_panel(void) /* Hack -- optional disturb on "panel change" */ if (options->disturb_panel && !options->center_player) { - disturb(0); + disturb(); } /* Recalculate the boundaries */ -- cgit v1.2.3 From b79748d8a9e10919a169fd682baf6e339d4e7a19 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove disturb_detect option It serves no purpose now that traps are gone. --- lib/help/option.txt | 4 - lib/mods/theme/help/option.txt | 4 - lib/mods/theme/pref/trap-xxx.prf | 419 --------------------------------------- lib/mods/theme/user/all.prf | 3 - lib/pref/trap-xxx.prf | 419 --------------------------------------- src/options.hpp | 2 - 6 files changed, 851 deletions(-) delete mode 100644 lib/mods/theme/pref/trap-xxx.prf delete mode 100644 lib/pref/trap-xxx.prf diff --git a/lib/help/option.txt b/lib/help/option.txt index 636fe2d1..a27e8def 100644 --- a/lib/help/option.txt +++ b/lib/help/option.txt @@ -150,10 +150,6 @@ off at will during the course of the game. This option causes you to be disturbed (stop running) when the screen scrolls, as it does when you get close to the edge of the visible screen. -#####GDisturb whenever leaving trap-detected area [disturb_detect] - This option causes you to be disturbed whenever you are leaving - a trap-detected area. This option is strongly recommended. - #####GDisturb whenever player state changes [disturb_state] This option causes you to be disturbed whenever the player state changes, including changes in hunger, resistance, confusion, etc. diff --git a/lib/mods/theme/help/option.txt b/lib/mods/theme/help/option.txt index 96d84b86..040f8c30 100644 --- a/lib/mods/theme/help/option.txt +++ b/lib/mods/theme/help/option.txt @@ -150,10 +150,6 @@ off at will during the course of the game. This option causes you to be disturbed (stop running) when the screen scrolls, as it does when you get close to the edge of the visible screen. -#####GDisturb whenever leaving trap-detected area [disturb_detect] - This option causes you to be disturbed whenever you are leaving - a trap-detected area. This option is strongly recommended. - #####GDisturb whenever player state changes [disturb_state] This option causes you to be disturbed whenever the player state changes, including changes in hunger, resistance, confusion, etc. diff --git a/lib/mods/theme/pref/trap-xxx.prf b/lib/mods/theme/pref/trap-xxx.prf deleted file mode 100644 index 7fb0c9c8..00000000 --- a/lib/mods/theme/pref/trap-xxx.prf +++ /dev/null @@ -1,419 +0,0 @@ -# Prf file for use with the 8x8 tiles to define -# trap image locations. Separated out from main -# graphics definitions due to the G:T:num:y:x -# instead of T:num:y:x (major problems if this -# file is opened in the TileAssigner) - -# Weakness Traps -G:T:1:0x82:0x9E -G:T:2:0x82:0x9E -G:T:3:0x82:0x9E - -# Intelligence Traps -G:T:4:0x82:0x9E -G:T:5:0x82:0x9E -G:T:6:0x82:0x9E - -# Wisdom Traps -G:T:7:0x82:0x9E -G:T:8:0x82:0x9E -G:T:9:0x82:0x9E - -# Fumbling Fingers Traps -G:T:10:0x82:0x9E -G:T:11:0x82:0x9E -G:T:12:0x82:0x9E - -# Wasting Traps -G:T:13:0x82:0x9E -G:T:14:0x82:0x9E -G:T:15:0x82:0x9E - -# Beauty Traps -G:T:16:0x82:0x9E -G:T:17:0x82:0x9E -G:T:18:0x82:0x9E - -# Trap of Curse Weapon -G:T:20:0xA2:0x92 - -# Trap of Curse Armor -G:T:21:0xA2:0x92 - -# Earthquake Trap -G:T:22:0xA2:0x87 - -# Poison Needle Trap -G:T:23:0xA2:0x8B - -# Summon Monster Trap -G:T:24:0xA2:0x89 - -# Summon Undead Trap -G:T:25:0xA2:0x89 - -# Summon Greater Undead Trap -G:T:26:0xA2:0x89 - -# Teleport Trap -G:T:27:0x8A:0x9C - -# Paralyzing Trap -G:T:28:0xA2:0x8B - -# Explosive Device -G:T:29:0xA2:0x8B - -# Teleport Item Trap -G:T:30:0x8A:0x9C - -# Lose Memory Trap -G:T:31:0xA2:0x8B - -# Bitter Regret Trap -G:T:32:0xA2:0x8B - -# Bowel Cramps Trap -G:T:33:0xA2:0x8B - -# Blindness/Confusion Trap -G:T:34:0xA2:0x8B - -# Aggravation Trap -G:T:35:0xA2:0x87 - -# Multiplication Trap -G:T:36:0xA2:0x87 - -# Steal Item Trap -G:T:37:0xA2:0x92 - -# Summon Fast Quylthulgs Trap -G:T:38:0xA2:0x89 - -# Trap of Sinking -G:T:39:0x8A:0x9C - -# Trap of Mana Drain -G:T:40:0xA2:0x8B - -# Trap of Missing Money -G:T:41:0xA2:0x92 - -# Trap of No Return -G:T:42:0xA2:0x92 - -# Trap of Silent Switching -G:T:43:0xA2:0x92 - -# Trap of Walls -G:T:44:0xA2:0x87 - -# Trap of Calling Out -G:T:45:0xA2:0x89 - -# Trap of Sliding -G:T:46:0xA2:0x8B - -# Trap of Charges Drain -G:T:47:0xA2:0x92 - -# Trap of Stair Movement -G:T:48:0xA2:0x87 - -# Trap of New Trap -G:T:49:0xA2:0x87 - -# Trap of Scatter Items -G:T:50:0x8A:0x9C - -# Trap of Decay -G:T:51:0xA2:0x8B - -# Trap of Wasting Wands -G:T:52:0xA2:0x92 - -# Trap of Filling -G:T:53:0xA2:0x87 - -# Trap of Drain Speed -G:T:54:0xA2:0x92 - -# Lightning Bolt Trap -G:T:60:0xA2:0x8C - -# Poison Bolt Trap -G:T:61:0xA2:0x8C - -# Acid Bolt Trap -G:T:62:0xA2:0x8C - -# Cold Bolt Trap -G:T:63:0xA2:0x8C - -# Fire Bolt Trap -G:T:64:0xA2:0x8C - -# Plasma Bolt Trap -G:T:65:0xA2:0x8C - -# Water Bolt Trap -G:T:66:0xA2:0x8C - -# Lite Bolt Trap -G:T:67:0xA2:0x8C - -# Dark Bolt Trap -G:T:68:0xA2:0x8C - -# Shards Bolt Trap -G:T:69:0xA2:0x8C - -# Sound Bolt Trap -G:T:70:0xA2:0x8C - -# Confusion Bolt Trap -G:T:71:0xA2:0x8C - -# Force Bolt Trap -G:T:72:0xA2:0x8C - -# Inertia Bolt Trap -G:T:73:0xA2:0x8C - -# Mana Bolt Trap -G:T:74:0xA2:0x8C - -# Ice Bolt Trap -G:T:75:0xA2:0x8C - -# Chaos Bolt Trap -G:T:76:0xA2:0x8C - -# Nether Bolt Trap -G:T:77:0xA2:0x8C - -# Disenchantment Bolt Trap -G:T:78:0xA2:0x8C - -# Nexus Bolt Trap -G:T:79:0xA2:0x8C - -# Time Bolt Trap -G:T:80:0xA2:0x8C - -# Gravity Bolt Trap -G:T:81:0xA2:0x8C - -# Lightning Ball Trap -G:T:82:0xA2:0x8D - -# Poison Ball Trap -G:T:83:0xA2:0x8D - -# Acid Ball Trap -G:T:84:0xA2:0x8D - -# Cold Ball Trap -G:T:85:0xA2:0x8D - -# Fire Ball Trap -G:T:86:0xA2:0x8D - -# Plasma Ball Trap -G:T:87:0xA2:0x8D - -# Water Ball Trap -G:T:88:0xA2:0x8D - -# Light Ball Trap -G:T:89:0xA2:0x8D - -# Darkness Ball Trap -G:T:90:0xA2:0x8D - -# Shards Ball Trap -G:T:91:0xA2:0x8D - -# Sound Ball Trap -G:T:92:0xA2:0x8D - -# Confusion Ball Trap -G:T:93:0xA2:0x8D - -# Force Ball Trap -G:T:94:0xA2:0x8D - -# Inertia Ball Trap -G:T:95:0xA2:0x8D - -# Mana Ball Trap -G:T:96:0xA2:0x8D - -# Ice Ball Trap -G:T:97:0xA2:0x8D - -# Chaos Ball Trap -G:T:98:0xA2:0x8D - -# Nether Ball Trap -G:T:99:0xA2:0x8D - -# Disenchantment Ball Trap -G:T:100:0xA2:0x8D - -# Nexus Ball Trap -G:T:101:0xA2:0x8D - -# Time Ball Trap -G:T:102:0xA2:0x8D - -# Gravity Ball Trap -G:T:103:0xA2:0x8D - -# Arrow Trap -G:T:110:0xA2:0x8E - -# Bolt Trap -G:T:111:0xA2:0x8E - -# Seeker Arrow Trap -G:T:112:0xA2:0x8E - -# Seeker Bolt Trap -G:T:113:0xA2:0x8E - -# Poison Arrow Trap -G:T:114:0xA2:0x8E - -# Poison Bolt Trap -G:T:115:0xA2:0x8E - -# Poison Seeker Arrow Trap -G:T:116:0xA2:0x8E - -# Poison Seeker Bolt Trap -G:T:117:0xA2:0x8E - -# Broken Dagger Trap -G:T:118:0xA2:0x8E - -# Dagger Trap -G:T:119:0xA2:0x8E - -# Poison Broken Dagger Trap -G:T:120:0xA2:0x8E - -# Poison Dagger Trap -G:T:121:0xA2:0x8E - -# Arrows Trap -G:T:122:0xA2:0x8E - -# Bolts Trap -G:T:123:0xA2:0x8E - -# Seeker Arrow Trap -G:T:124:0xA2:0x8E - -# Seeker Bolt Trap -G:T:125:0xA2:0x8E - -# Poison Arrows Trap -G:T:126:0xA2:0x8E - -# Poison Bolt Trap -G:T:127:0xA2:0x8E - -# Poison Seeker Arrows Trap -G:T:128:0xA2:0x8E - -# Poison Seeker Bolts Trap -G:T:129:0xA2:0x8E - -# Broken Daggers Trap -G:T:130:0xA2:0x8E - -# Dagger Trap -G:T:131:0xA2:0x8E - -# Poison Broken Daggers Trap -G:T:132:0xA2:0x8E - -# Poison Daggers Trap -G:T:133:0xA2:0x8E - -# Trap of Drop Item -G:T:140:0xA2:0x92 - -# Trap of Drop Items -G:T:141:0xA2:0x92 - -# Trap of Drop Everything -G:T:142:0xA2:0x92 - -# Trap of Aging -G:T:153:0xA2:0x8B - -# Trap of Growing -G:T:154:0xA2:0x8B - -# Trap of Shrinking -G:T:155:0xA2:0x8B - -# Trap of Tanker Drain -G:T:157:0xA2:0x8B - -# Trap of Divine Anger -G:T:158:0xA2:0x88 - -# Trap of Divine Wrath -G:T:159:0xA2:0x88 - -# Hallucination Trap -G:T:160:0xA2:0x8B - -# Greater Magic Missile Trap -G:T:161:0xA2:0x8C - -# Foulness Trap -G:T:162:0xA2:0x8C - -# Trap of Death Ray -G:T:163:0xA2:0x8C - -# Trap of Holy Fire -G:T:164:0xA2:0x8C - -# Trap of Hell Fire -G:T:165:0xA2:0x8C - -# Psi Bolt Trap -G:T:166:0xA2:0x8C - -# Psi Drain Trap -G:T:167:0xA2:0x8B - -# Plasma (Nuke) Ball Trap -G:T:168:0xA2:0x8D - -# Psi Ball Trap -G:T:169:0xA2:0x8D - -# Aquirement Trap -G:T:170:0xA2:0x89 - -# Greater Lightning Bolt Trap -G:T:171:0xA2:0x8C - -# Greater Poison Bolt Trap -G:T:172:0xA2:0x8C - -# Greater Acid Bolt Trap -G:T:173:0xA2:0x8C - -# Greater Cold Bolt Trap -G:T:174:0xA2:0x8C - -# Greater Fire Bolt Trap -G:T:175:0xA2:0x8C \ No newline at end of file diff --git a/lib/mods/theme/user/all.prf b/lib/mods/theme/user/all.prf index 98b22fc5..7376494a 100644 --- a/lib/mods/theme/user/all.prf +++ b/lib/mods/theme/user/all.prf @@ -50,9 +50,6 @@ Y:disturb_near # Option 'Disturb whenever map panel changes' Y:disturb_panel -# Option 'Disturb whenever leaving trap-detected area' -Y:disturb_detect - # Option 'Disturb whenever player state changes' Y:disturb_state diff --git a/lib/pref/trap-xxx.prf b/lib/pref/trap-xxx.prf deleted file mode 100644 index 7fb0c9c8..00000000 --- a/lib/pref/trap-xxx.prf +++ /dev/null @@ -1,419 +0,0 @@ -# Prf file for use with the 8x8 tiles to define -# trap image locations. Separated out from main -# graphics definitions due to the G:T:num:y:x -# instead of T:num:y:x (major problems if this -# file is opened in the TileAssigner) - -# Weakness Traps -G:T:1:0x82:0x9E -G:T:2:0x82:0x9E -G:T:3:0x82:0x9E - -# Intelligence Traps -G:T:4:0x82:0x9E -G:T:5:0x82:0x9E -G:T:6:0x82:0x9E - -# Wisdom Traps -G:T:7:0x82:0x9E -G:T:8:0x82:0x9E -G:T:9:0x82:0x9E - -# Fumbling Fingers Traps -G:T:10:0x82:0x9E -G:T:11:0x82:0x9E -G:T:12:0x82:0x9E - -# Wasting Traps -G:T:13:0x82:0x9E -G:T:14:0x82:0x9E -G:T:15:0x82:0x9E - -# Beauty Traps -G:T:16:0x82:0x9E -G:T:17:0x82:0x9E -G:T:18:0x82:0x9E - -# Trap of Curse Weapon -G:T:20:0xA2:0x92 - -# Trap of Curse Armor -G:T:21:0xA2:0x92 - -# Earthquake Trap -G:T:22:0xA2:0x87 - -# Poison Needle Trap -G:T:23:0xA2:0x8B - -# Summon Monster Trap -G:T:24:0xA2:0x89 - -# Summon Undead Trap -G:T:25:0xA2:0x89 - -# Summon Greater Undead Trap -G:T:26:0xA2:0x89 - -# Teleport Trap -G:T:27:0x8A:0x9C - -# Paralyzing Trap -G:T:28:0xA2:0x8B - -# Explosive Device -G:T:29:0xA2:0x8B - -# Teleport Item Trap -G:T:30:0x8A:0x9C - -# Lose Memory Trap -G:T:31:0xA2:0x8B - -# Bitter Regret Trap -G:T:32:0xA2:0x8B - -# Bowel Cramps Trap -G:T:33:0xA2:0x8B - -# Blindness/Confusion Trap -G:T:34:0xA2:0x8B - -# Aggravation Trap -G:T:35:0xA2:0x87 - -# Multiplication Trap -G:T:36:0xA2:0x87 - -# Steal Item Trap -G:T:37:0xA2:0x92 - -# Summon Fast Quylthulgs Trap -G:T:38:0xA2:0x89 - -# Trap of Sinking -G:T:39:0x8A:0x9C - -# Trap of Mana Drain -G:T:40:0xA2:0x8B - -# Trap of Missing Money -G:T:41:0xA2:0x92 - -# Trap of No Return -G:T:42:0xA2:0x92 - -# Trap of Silent Switching -G:T:43:0xA2:0x92 - -# Trap of Walls -G:T:44:0xA2:0x87 - -# Trap of Calling Out -G:T:45:0xA2:0x89 - -# Trap of Sliding -G:T:46:0xA2:0x8B - -# Trap of Charges Drain -G:T:47:0xA2:0x92 - -# Trap of Stair Movement -G:T:48:0xA2:0x87 - -# Trap of New Trap -G:T:49:0xA2:0x87 - -# Trap of Scatter Items -G:T:50:0x8A:0x9C - -# Trap of Decay -G:T:51:0xA2:0x8B - -# Trap of Wasting Wands -G:T:52:0xA2:0x92 - -# Trap of Filling -G:T:53:0xA2:0x87 - -# Trap of Drain Speed -G:T:54:0xA2:0x92 - -# Lightning Bolt Trap -G:T:60:0xA2:0x8C - -# Poison Bolt Trap -G:T:61:0xA2:0x8C - -# Acid Bolt Trap -G:T:62:0xA2:0x8C - -# Cold Bolt Trap -G:T:63:0xA2:0x8C - -# Fire Bolt Trap -G:T:64:0xA2:0x8C - -# Plasma Bolt Trap -G:T:65:0xA2:0x8C - -# Water Bolt Trap -G:T:66:0xA2:0x8C - -# Lite Bolt Trap -G:T:67:0xA2:0x8C - -# Dark Bolt Trap -G:T:68:0xA2:0x8C - -# Shards Bolt Trap -G:T:69:0xA2:0x8C - -# Sound Bolt Trap -G:T:70:0xA2:0x8C - -# Confusion Bolt Trap -G:T:71:0xA2:0x8C - -# Force Bolt Trap -G:T:72:0xA2:0x8C - -# Inertia Bolt Trap -G:T:73:0xA2:0x8C - -# Mana Bolt Trap -G:T:74:0xA2:0x8C - -# Ice Bolt Trap -G:T:75:0xA2:0x8C - -# Chaos Bolt Trap -G:T:76:0xA2:0x8C - -# Nether Bolt Trap -G:T:77:0xA2:0x8C - -# Disenchantment Bolt Trap -G:T:78:0xA2:0x8C - -# Nexus Bolt Trap -G:T:79:0xA2:0x8C - -# Time Bolt Trap -G:T:80:0xA2:0x8C - -# Gravity Bolt Trap -G:T:81:0xA2:0x8C - -# Lightning Ball Trap -G:T:82:0xA2:0x8D - -# Poison Ball Trap -G:T:83:0xA2:0x8D - -# Acid Ball Trap -G:T:84:0xA2:0x8D - -# Cold Ball Trap -G:T:85:0xA2:0x8D - -# Fire Ball Trap -G:T:86:0xA2:0x8D - -# Plasma Ball Trap -G:T:87:0xA2:0x8D - -# Water Ball Trap -G:T:88:0xA2:0x8D - -# Light Ball Trap -G:T:89:0xA2:0x8D - -# Darkness Ball Trap -G:T:90:0xA2:0x8D - -# Shards Ball Trap -G:T:91:0xA2:0x8D - -# Sound Ball Trap -G:T:92:0xA2:0x8D - -# Confusion Ball Trap -G:T:93:0xA2:0x8D - -# Force Ball Trap -G:T:94:0xA2:0x8D - -# Inertia Ball Trap -G:T:95:0xA2:0x8D - -# Mana Ball Trap -G:T:96:0xA2:0x8D - -# Ice Ball Trap -G:T:97:0xA2:0x8D - -# Chaos Ball Trap -G:T:98:0xA2:0x8D - -# Nether Ball Trap -G:T:99:0xA2:0x8D - -# Disenchantment Ball Trap -G:T:100:0xA2:0x8D - -# Nexus Ball Trap -G:T:101:0xA2:0x8D - -# Time Ball Trap -G:T:102:0xA2:0x8D - -# Gravity Ball Trap -G:T:103:0xA2:0x8D - -# Arrow Trap -G:T:110:0xA2:0x8E - -# Bolt Trap -G:T:111:0xA2:0x8E - -# Seeker Arrow Trap -G:T:112:0xA2:0x8E - -# Seeker Bolt Trap -G:T:113:0xA2:0x8E - -# Poison Arrow Trap -G:T:114:0xA2:0x8E - -# Poison Bolt Trap -G:T:115:0xA2:0x8E - -# Poison Seeker Arrow Trap -G:T:116:0xA2:0x8E - -# Poison Seeker Bolt Trap -G:T:117:0xA2:0x8E - -# Broken Dagger Trap -G:T:118:0xA2:0x8E - -# Dagger Trap -G:T:119:0xA2:0x8E - -# Poison Broken Dagger Trap -G:T:120:0xA2:0x8E - -# Poison Dagger Trap -G:T:121:0xA2:0x8E - -# Arrows Trap -G:T:122:0xA2:0x8E - -# Bolts Trap -G:T:123:0xA2:0x8E - -# Seeker Arrow Trap -G:T:124:0xA2:0x8E - -# Seeker Bolt Trap -G:T:125:0xA2:0x8E - -# Poison Arrows Trap -G:T:126:0xA2:0x8E - -# Poison Bolt Trap -G:T:127:0xA2:0x8E - -# Poison Seeker Arrows Trap -G:T:128:0xA2:0x8E - -# Poison Seeker Bolts Trap -G:T:129:0xA2:0x8E - -# Broken Daggers Trap -G:T:130:0xA2:0x8E - -# Dagger Trap -G:T:131:0xA2:0x8E - -# Poison Broken Daggers Trap -G:T:132:0xA2:0x8E - -# Poison Daggers Trap -G:T:133:0xA2:0x8E - -# Trap of Drop Item -G:T:140:0xA2:0x92 - -# Trap of Drop Items -G:T:141:0xA2:0x92 - -# Trap of Drop Everything -G:T:142:0xA2:0x92 - -# Trap of Aging -G:T:153:0xA2:0x8B - -# Trap of Growing -G:T:154:0xA2:0x8B - -# Trap of Shrinking -G:T:155:0xA2:0x8B - -# Trap of Tanker Drain -G:T:157:0xA2:0x8B - -# Trap of Divine Anger -G:T:158:0xA2:0x88 - -# Trap of Divine Wrath -G:T:159:0xA2:0x88 - -# Hallucination Trap -G:T:160:0xA2:0x8B - -# Greater Magic Missile Trap -G:T:161:0xA2:0x8C - -# Foulness Trap -G:T:162:0xA2:0x8C - -# Trap of Death Ray -G:T:163:0xA2:0x8C - -# Trap of Holy Fire -G:T:164:0xA2:0x8C - -# Trap of Hell Fire -G:T:165:0xA2:0x8C - -# Psi Bolt Trap -G:T:166:0xA2:0x8C - -# Psi Drain Trap -G:T:167:0xA2:0x8B - -# Plasma (Nuke) Ball Trap -G:T:168:0xA2:0x8D - -# Psi Ball Trap -G:T:169:0xA2:0x8D - -# Aquirement Trap -G:T:170:0xA2:0x89 - -# Greater Lightning Bolt Trap -G:T:171:0xA2:0x8C - -# Greater Poison Bolt Trap -G:T:172:0xA2:0x8C - -# Greater Acid Bolt Trap -G:T:173:0xA2:0x8C - -# Greater Cold Bolt Trap -G:T:174:0xA2:0x8C - -# Greater Fire Bolt Trap -G:T:175:0xA2:0x8C \ No newline at end of file diff --git a/src/options.hpp b/src/options.hpp index 421a11f3..c1ac35a9 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -31,7 +31,6 @@ struct options { bool_ disturb_move = FALSE; /* Disturb whenever any monster moves */ bool_ disturb_near = TRUE; /* Disturb whenever viewable monster moves */ bool_ disturb_panel = TRUE; /* Disturb whenever map panel changes */ - bool_ disturb_detect = TRUE; /* Disturb whenever leaving trap-detected area */ bool_ disturb_state = TRUE; /* Disturn whenever player state changes */ bool_ disturb_minor = TRUE; /* Disturb whenever boring things happen */ bool_ disturb_other = FALSE; /* Disturb whenever various things happen */ @@ -131,7 +130,6 @@ struct options { { &disturb_move , 2, 4, "disturb_move" , "Disturb whenever any monster moves" }, { &disturb_near , 2, 5, "disturb_near" , "Disturb whenever viewable monster moves" }, { &disturb_panel , 2, 6, "disturb_panel" , "Disturb whenever map panel changes" }, - { &disturb_detect , 2, 21, "disturb_detect" , "Disturb whenever leaving trap-detected area" }, { &disturb_state , 2, 7, "disturb_state" , "Disturb whenever player state changes" }, { &disturb_minor , 2, 8, "disturb_minor" , "Disturb whenever boring things happen" }, { &disturb_other , 2, 9, "disturb_other" , "Disturb whenever random things happen" }, -- cgit v1.2.3 From c93a58ef36d9b54ea2b61141e63c716e071b99f9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove tr_info.txt --- lib/edit/readme.txt | 5 - lib/edit/tr_info.txt | 1109 --------------------------------------- lib/mods/theme/edit/readme.txt | 5 - lib/mods/theme/edit/tr_info.txt | 1109 --------------------------------------- 4 files changed, 2228 deletions(-) delete mode 100644 lib/edit/tr_info.txt delete mode 100644 lib/mods/theme/edit/tr_info.txt diff --git a/lib/edit/readme.txt b/lib/edit/readme.txt index 4c0ecbe7..70cf126e 100644 --- a/lib/edit/readme.txt +++ b/lib/edit/readme.txt @@ -77,11 +77,6 @@ # Defines the preferences for the town features # You will find there entries as in f_info.txt -# File: tr_info.txt -# This file comes from Angband64 written by Jurriaan Kalkman -# and describes the traps items can have -# You will find traps like 'Summon Fast Quylthulgs Trap' , 'Wisdom Trap' etc. - # File: v_info.txt # This file is used to initialize the "vault template" information for the Angband game. # You will find vaults like 'The I in the Storm' , 'Greater vault (mortuary temple of sety)' , diff --git a/lib/edit/tr_info.txt b/lib/edit/tr_info.txt deleted file mode 100644 index a0c2bb6b..00000000 --- a/lib/edit/tr_info.txt +++ /dev/null @@ -1,1109 +0,0 @@ -# This file comes from Angband64 written by Jurriaan Kalkman -# and describes the traps items can have -# -# byte type; /* this goes into sval */ -# s16b probability; /* probability of existence in 1000 */ -# s16b another; /* does this trap easily combine in 1000 */ -# s16b pvalinc; /* how much does this trap attribute to pval */ -# byte difficulty; /* how difficult to disarm */ -# byte level; /* minimum level - disenchantment trap at 200' is */ -# /* not so nice */ -# byte color; -# cptr name; /* what name does this trap have */ -# -# d TERM_DARK |r TERM_RED |D TERM_L_DARK |R TERM_L_RED -# w TERM_WHITE |g TERM_GREEN|W TERM_L_WHITE|G TERM_L_GREEN -# s TERM_SLATE |b TERM_BLUE |v TERM_VIOLET |B TERM_L_BLUE -# o TERM_ORANGE|u TERM_UMBER|y TERM_YELLOW |U TERM_L_UMBER -# -# b blue for stat traps -# w white for teleport traps -# o orange for dungeon rearrangement traps -# v violet for summoning traps -# y yellow for stealing/equipment traps -# r red for other character affecting traps -# g green for elemental bolt trap -# B umber for elemental ball trap -# R l red for arrow/dagger traps -# W for compound trap!!! -# don't use U or you'll get trapped doors that are indistinguishable from untrapped doors! -# -# an unknown character is multi-hued! -# -# N:type:name -# I:diff:prob:another:pval:minlevel:damage:color -# I:diff:prob: :minlevel: :color -# D:description - -# -# stat traps -# - -N:1:Weakness Trap -I:2:100:5:5:2:0d0:b -D:A poisoned needle weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:2:Weakness Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle seriously weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:3:Weakness Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle permanently weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:4:Intelligence Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:5:Intelligence Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:6:Intelligence Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:7:Wisdom Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel naive! -F:CHEST -F:DOOR -F:FLOOR - -N:8:Wisdom Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very naive! -F:CHEST -F:DOOR -F:FLOOR - -N:9:Wisdom Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently naive! -F:CHEST -F:DOOR -F:FLOOR - -N:10:Fumbling Fingers Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:11:Fumbling Fingers Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:12:Fumbling Fingers Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:13:Wasting Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:14:Wasting Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:15:Wasting Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:16:Beauty Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle scars you! -F:CHEST -F:DOOR -F:FLOOR - -N:17:Beauty Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle scars you horribly! -F:CHEST -F:DOOR -F:FLOOR - -N:18:Beauty Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle scars you permanently! -F:CHEST -F:DOOR -F:FLOOR - -# -# miscellaneous traps -# - -N:20:Trap of Curse Weapon -I:5:10:0:12:20:0d0:y -D:Your weapon will never be the same... -F:CHEST -F:DOOR -F:FLOOR - -N:21:Trap of Curse Armour -I:5:15:0:12:20:0d0:y -D:Your armour doesn't exactly get better by setting off this trap... -F:CHEST -F:DOOR -F:FLOOR - -N:22:Earthquake Trap -I:5:20:0:10:10:0d0:o -D:The ceiling collapses around you! -F:CHEST -F:DOOR -F:FLOOR - -N:23:Poison Needle Trap -I:1:50:50:3:2:0d0:r -D:A poisoned needle pricks you! -F:CHEST -F:DOOR -F:FLOOR - -N:24:Summon Monster Trap -I:2:50:40:4:2:0d0:v -D:Monsters defend the memory of the owner... -F:CHEST -F:DOOR -F:FLOOR - -N:25:Summon Undead Trap -I:4:25:40:6:10:0d0:v -D:Undead rise from the grave to defend this! -F:CHEST -F:DOOR -F:FLOOR - -N:26:Summon Greater Undead Trap -I:8:10:50:20:20:0d0:v -D:Greater undead defend this! -F:CHEST -F:DOOR -F:FLOOR - -N:27:Teleport Trap -I:3:100:50:3:2:0d0:w -D:Now you know why nobody ever got close enough to disarm this trap... -F:CHEST -F:DOOR -F:FLOOR - -N:28:Paralysing Trap -I:1:100:20:2:2:0d0:r -D:You suddenly cannot move! -F:CHEST -F:DOOR -F:FLOOR - -N:29:Explosive Device -I:3:100:80:0:3:3d8:r -D:Ha! It explodes before your hands can illegally touch it! -F:CHEST -F:DOOR -F:FLOOR - -N:30:Teleport Item Trap -I:3:50:50:3:5:0d0:w -D:The item magically disappears from your greedy hands! -F:CHEST -F:FLOOR - -N:31:Lose Memory Trap -I:6:30:30:6:10:0d0:r -D:You suddenly can't remember what you were doing here... -F:CHEST -F:DOOR -F:FLOOR - -N:32:Bitter Regret Trap -I:9:15:20:9:20:0d0:r -D:You already regret trying this... -F:CHEST -F:DOOR -F:FLOOR - -N:33:Bowel Cramps Trap -I:1:90:20:1:6:0d0:r -D:Your stomach twists with a sharp pang! -F:CHEST -F:DOOR -F:FLOOR - -N:34:Blindness/Confusion Trap -I:4:100:50:4:6:0d0:r -D:You suddenly can't see, and thinking is difficult too.... -F:CHEST -F:DOOR -F:FLOOR - -N:35:Aggravation Trap -I:2:100:50:2:3:0d0:o -D:Your hear a high-pitched humming noise... -F:CHEST -F:DOOR -F:FLOOR - -N:36:Multiplication Trap -I:3:90:0:3:5:0d0:o -D:The floor around you doesn't seem the same... -F:CHEST -F:DOOR -F:FLOOR - -N:37:Steal Item Trap -I:3:100:50:3:6:0d0:y -D:The chest seems to swell, while your backpack feels lighter.. -F:CHEST -F:FLOOR - -N:38:Summon Fast Quylthulgs Trap -I:8:50:10:10:25:0d0:v -D:Parts of the owner seem to return from somewhere else, as you slow in awe. -F:CHEST -F:DOOR -F:FLOOR - -N:39:Trap of Sinking -I:2:50:0:0:3:0d0:w -D:A trapdoor opens up under you! -F:DOOR -F:FLOOR - -N:40:Trap of Mana Drain -I:4:100:50:3:4:0d0:r -D:You suddenly can't think so clearly any more... -F:CHEST -F:DOOR -F:FLOOR - -N:41:Trap of Missing Money -I:2:100:50:2:2:0d0:y -D:Money isn't everything, they say... -F:CHEST -F:DOOR -F:FLOOR - -N:42:Trap of No Return -I:5:20:10:4:8:0d0:y -D:Do stay a while! -F:CHEST -F:DOOR -F:FLOOR - -N:43:Trap of Silent Switching -I:4:100:50:3:6:0d0:y -D:You suddenly are a different person! -F:CHEST -F:DOOR -F:FLOOR - -N:44:Trap of Walls -I:6:100:50:2:10:0d0:o -D:The room seems to shrink! -F:CHEST -F:DOOR -F:FLOOR - -N:45:Trap of Calling Out -I:10:100:100:5:15:0d0:v -D:You hear something coming closer, much closer. -F:CHEST -F:DOOR -F:FLOOR - -N:46:Trap of Sliding -I:8:50:50:4:8:0d0:r -D:Your feet seem to have a life of their own! -F:CHEST -F:DOOR -F:FLOOR - -N:47:Trap of Charges Drain -I:6:100:70:2:3:0d0:y -D:You feel as if you've just lost something... -F:CHEST -F:DOOR -F:FLOOR - -N:48:Trap of Stair Movement -I:6:0:50:3:4:0d0:o -D:The dungeon seems different... -F:CHEST -F:DOOR -F:FLOOR - -N:49:Trap of New Trap -I:5:100:5:0:4:0d0:o -D:Somehow, disarming isn't over, you feel... -F:CHEST -F:DOOR -F:FLOOR - -N:50:Trap of Scatter Items -I:10:50:50:6:12:0d0:w -D:You hear crashing sounds from all over the dungeon! -F:CHEST -F:DOOR -F:FLOOR - -N:51:Trap of Decay -I:4:100:50:4:4:0d0:r -D:Your stomach isn't empty, but suddenly you think of food. -F:CHEST -F:DOOR -F:FLOOR - -N:52:Trap of Wasting Wands -I:6:100:40:4:5:0d0:y -D:Your wands seem different... -F:CHEST -F:DOOR -F:FLOOR - -N:53:Trap of Filling -I:10:100:0:10:25:0d0:o -D:The whole room vibrates in a strange way... -F:CHEST -F:DOOR -F:FLOOR - -N:54:Trap of Drain Speed -I:8:50:10:25:80:0d0:y -D:You suddenly seem to have more time to self-reflect... -F:CHEST -F:DOOR -F:FLOOR - -# -# bolt traps -# - -N:60:Lightning Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are jolted with electricity! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:61:Poison Bolt Trap -I:2:80:5:3:2:2d8:g -D:A blast of poison gas hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:62:Acid Bolt Trap -I:2:80:5:3:2:2d8:g -D:A jet of acid shoots out at you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:63:Cold Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are suddenly very cold! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:64:Fire Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are suddenly very hot! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:65:Plasma Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of plasma hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:66:Water Bolt Trap -I:4:80:5:5:8:5d10:g -D:A gush of water hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:67:Light Bolt Trap -I:4:80:5:5:8:5d10:g -D:There is a sudden flash of light around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:68:Dark Bolt Trap -I:4:80:5:5:8:5d10:g -D:A bolt of pure elemental darkness hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:69:Shards Bolt Trap -I:6:80:5:6:15:6d10:g -D:A blast of crystal shards hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:70:Sound Bolt Trap -I:6:80:5:6:15:10d12:g -D:A sudden roar of sound hurts your eardrums! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:71:Confusion Bolt Trap -I:4:80:5:5:8:6d10:g -D:A blast of confusion gas engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:72:Force Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of pure force hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:73:Inertia Bolt Trap -I:6:80:5:6:15:10d12:g -D:Your feet feel like lead! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:74:Mana Bolt Trap -I:8:80:5:9:25:15d16:g -D:A bolt of pure magic hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:75:Ice Bolt Trap -I:4:80:5:5:8:5d10:g -D:A bolt of ice hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:76:Chaos Bolt Trap -I:6:80:5:6:15:10d12:g -D:A blast of raw chaos hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:77:Nether Bolt Trap -I:8:80:5:9:25:15d16:g -D:A bolt of negative energy hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:78:Disenchantment Bolt Trap -I:8:80:5:9:25:15d16:g -D:There is a static feeling in the air... -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:79:Nexus Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of nexus hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:80:Time Bolt Trap -I:8:80:5:9:25:15d16:g -D:Suddenly, several months pass by in a second! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:81:Gravity Bolt Trap -I:6:80:5:6:15:10d12:g -D:Gravity suddenly warps around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# -# ball traps -# - -N:82:Lightning Ball Trap -I:3:60:5:5:8:3d10:B -D:A massive electrical charge shoots through you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:83:Poison Ball Trap -I:3:60:5:5:8:3d10:B -D:A large cloud of poison gas envelops you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:84:Acid Ball Trap -I:3:60:5:5:8:3d10:B -D:You are suddenly drenched in acid! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:85:Cold Ball Trap -I:3:60:5:5:8:3d10:B -D:A blast of hideously cold air envelops you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:86:Fire Ball Trap -I:3:60:5:5:8:3d10:B -D:You are suddenly in the centre of a raging inferno! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:87:Plasma Ball Trap -I:8:60:5:8:20:12d18:B -D:You are engulfed in plasma! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:88:Water Ball Trap -I:5:60:5:6:15:8d12:B -D:A whirlpool engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:89:Light Ball Trap -I:5:60:5:6:15:8d12:B -D:A massive flash of light erupts around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:90:Darkness Ball Trap -I:5:60:5:6:15:8d12:B -D:A large patch of darkness erupts around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:91:Shards Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of crystal shards hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:92:Sound Ball Trap -I:8:60:5:8:20:12d18:B -D:BOOM! Your eardrums nearly explode! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:93:Confusion Ball Trap -I:5:60:5:6:15:8d12:B -D:You are enveloped in a cloud of confusion gas! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:94:Force Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of pure force smashes down around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:95:Inertia Ball Trap -I:8:60:5:8:20:12d18:B -D:Suddenly, your entire body feels like lead! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:96:Mana Ball Trap -I:10:60:5:10:30:16d20:B -D:You are hit by a blast of pure magic! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:97:Ice Ball Trap -I:5:60:5:6:15:8d12:B -D:A massive blast of ice crystals engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:98:Chaos Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of raw chaos engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:99:Nether Ball Trap -I:10:60:5:10:30:16d20:g -D:A blast of energy from the netherworld engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -# N:type:name -# I:diff:prob:another:pval:minlevel:color -# D:description - -N:100:Disenchantment Ball Trap -I:10:60:5:10:30:16d20:B -D:You are hit by a blast of pure anti-magic! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:101:Nexus Ball Trap -I:8:60:5:8:20:12d18:B -D:A ball of nexus hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:102:Time Ball Trap -I:10:60:5:10:30:16d20:B -D:Suddenly, several years pass by in a second! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:103:Gravity Ball Trap -I:8:60:5:8:20:12d18:B -D:You suddenly feel gravity warp violently around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:110:Arrow Trap -I:2:100:0:5:2:0d0:R -D:An arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:111:Bolt Trap -I:2:100:0:5:5:0d0:R -D:A bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:112:Seeker Arrow Trap -I:2:100:0:6:10:0d0:R -D:A seeker arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:113:Seeker Bolt Trap -I:2:100:0:6:12:0d0:R -D:A seeker bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:114:Poison Arrow Trap -I:2:100:0:5:4:0d0:R -D:A poisoned arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:115:Poison Bolt Trap -I:2:100:0:6:6:0d0:R -D:A poisoned bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:116:Poison Seeker Arrow Trap -I:2:100:0:7:12:0d0:R -D:A poisoned seeker arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:117:Poison Seeker Bolt Trap -I:2:100:0:7:15:0d0:R -D:A poisoned seeker bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:118:Broken Dagger Trap -I:2:100:0:5:2:0d0:R -D:An broken dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:119:Dagger Trap -I:2:100:0:5:5:0d0:R -D:A dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:120:Poison Broken Dagger Trap -I:2:100:0:5:4:0d0:R -D:A poisoned broken dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:121:Poison Dagger Trap -I:2:100:0:6:6:0d0:R -D:A poisoned dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -# -# multiple arrows/daggers traps -# - -N:122:Arrows Trap -I:4:100:0:7:16:0d0:R -D:Some arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:123:Bolts Trap -I:4:100:0:7:18:0d0:R -D:Some bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:124:Seeker Arrow Trap -I:5:100:0:8:20:0d0:R -D:Some seeker arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:125:Seeker Bolt Trap -I:5:100:0:8:24:0d0:R -D:Some seeker bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:126:Poison Arrows Trap -I:5:100:0:8:18:0d0:R -D:Some poisoned arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:127:Poison Bolt Trap -I:6:100:0:8:20:0d0:R -D:Some poisoned bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:128:Poison Seeker Arrows Trap -I:7:100:0:9:27:0d0:R -D:Some poisoned seeker arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:129:Poison Seeker Bolts Trap -I:9:100:0:9:30:0d0:R -D:Some poisoned seeker bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:130:Broken Daggers Trap -I:4:100:0:6:12:0d0:R -D:Some broken daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:131:Dagger Trap -I:4:100:0:6:15:0d0:R -D:Some daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:132:Poison Broken Daggers Trap -I:5:100:0:7:18:0d0:R -D:Some poisoned broken daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:133:Poison Daggers Trap -I:6:100:0:7:23:0d0:R -D:Some poisoned daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:140:Trap of Drop Item -I:3:50:0:2:5:0d0:y -D:A sudden sound startles you and you drop something! -F:CHEST -F:DOOR -F:FLOOR - -N:141:Trap of Drop Items -I:5:50:0:5:12:0d0:y -D:A sudden sound startles you and you drop several things! -F:CHEST -F:DOOR -F:FLOOR - -N:142:Trap of Drop Everything -I:8:50:0:8:20:0d0:y -D:A sudden sound startles you and you drop everything! -F:CHEST -F:DOOR -F:FLOOR - -N:158:Trap of Divine Anger -I:6:100:5:0:15:0d0:G -D:A voice booms out "Have a care, mortal!" -F:CHEST -F:DOOR -F:FLOOR - -N:159:Trap of Divine Wrath -I:9:50:5:0:30:0d0:G -D:A voice booms out "Sacrilege!" -F:CHEST -F:DOOR -F:FLOOR - -N:160:Hallucination Trap -I:3:100:10:0:4:0d0:r -D:Your vision is clouded by a blast of kaleidoscopic light! -F:CHEST -F:DOOR -F:FLOOR - -# Bolt traps -N:161:Greater Magic Missile Trap -I:6:80:5:6:75:25d20:g -D:A greater magic missile hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -#N:162:Foulness Trap -#I:6:80:5:6:15:10d12:g -#D:You feel foul! -#F:FLOOR | CHEST | DOOR | LEVEL3 - -#N:163:Trap of Death Ray -#I:8:80:5:9:25:15d16:g -#D:A Ray of Death hits you! -#F:FLOOR | CHEST | DOOR | LEVEL4 - -N:164:Trap of Holy Fire -I:6:80:5:6:15:10d12:g -D:Holy fire rises around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:165:Trap of Hell Fire -I:6:80:5:6:15:10d12:g -D:Hellfire rises around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:166:Psi Bolt Trap -I:6:80:5:6:15:10d12:g -D:Your mind is suddenly blasted! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:167:Psi Drain Trap -I:6:80:5:6:15:8d10:r -D:You suddenly can't think clearly any more... -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# Ball Traps - -### this one *ought* to be a Nuke Ball trap, not plasma ball, as trap 87 -### is also plasma ball. I've put the description right in advance. - -#N:168:Plasma Ball Trap -#I:8:60:5:8:20:12d18:B -#D:A blast of radiation engulfs you! -#F:FLOOR | CHEST | DOOR | LEVEL3 - -N:169:Psi Ball Trap -I:8:60:5:8:20:12d18:B -D:Your brain is suddenly blasted! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# Useful traps - -N:170:Acquirement Trap -I:1:40:5:5:18:0d0:v -D:Whoa! -F:DOOR -F:FLOOR - -# More bolt traps - -N:171:Greater Lightning Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are jolted with electricity! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:172:Greater Poison Bolt Trap -I:3:60:5:3:6:6d6:g -D:A blast of deadly poison gas hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:173:Greater Acid Bolt Trap -I:3:60:5:3:6:6d6:g -D:A jet of acid shoots out at you! It burns severely! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:174:Greater Cold Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are suddenly extremely cold! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:175:Greater Fire Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are suddenly extremely hot! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 diff --git a/lib/mods/theme/edit/readme.txt b/lib/mods/theme/edit/readme.txt index 4c0ecbe7..70cf126e 100644 --- a/lib/mods/theme/edit/readme.txt +++ b/lib/mods/theme/edit/readme.txt @@ -77,11 +77,6 @@ # Defines the preferences for the town features # You will find there entries as in f_info.txt -# File: tr_info.txt -# This file comes from Angband64 written by Jurriaan Kalkman -# and describes the traps items can have -# You will find traps like 'Summon Fast Quylthulgs Trap' , 'Wisdom Trap' etc. - # File: v_info.txt # This file is used to initialize the "vault template" information for the Angband game. # You will find vaults like 'The I in the Storm' , 'Greater vault (mortuary temple of sety)' , diff --git a/lib/mods/theme/edit/tr_info.txt b/lib/mods/theme/edit/tr_info.txt deleted file mode 100644 index aa3cdc3f..00000000 --- a/lib/mods/theme/edit/tr_info.txt +++ /dev/null @@ -1,1109 +0,0 @@ -# This file comes from Angband64 written by Jurriaan Kalkman -# and describes the traps items can have -# -# byte type; /* this goes into sval */ -# s16b probability; /* probability of existence in 1000 */ -# s16b another; /* does this trap easily combine in 1000 */ -# s16b pvalinc; /* how much does this trap attribute to pval */ -# byte difficulty; /* how difficult to disarm */ -# byte level; /* minimum level - disenchantment trap at 200' is */ -# /* not so nice */ -# byte color; -# cptr name; /* what name does this trap have */ -# -# d TERM_DARK |r TERM_RED |D TERM_L_DARK |R TERM_L_RED -# w TERM_WHITE |g TERM_GREEN|W TERM_L_WHITE|G TERM_L_GREEN -# s TERM_SLATE |b TERM_BLUE |v TERM_VIOLET |B TERM_L_BLUE -# o TERM_ORANGE|u TERM_UMBER|y TERM_YELLOW |U TERM_L_UMBER -# -# b blue for stat traps -# w white for teleport traps -# o orange for dungeon rearrangement traps -# v violet for summoning traps -# y yellow for stealing/equipment traps -# r red for other character affecting traps -# g green for elemental bolt trap -# B umber for elemental ball trap -# R l red for arrow/dagger traps -# W for compound trap!!! -# don't use U or you'll get trapped doors that are indistinguishable from untrapped doors! -# -# an unknown character is multi-hued! -# -# N:type:name -# I:diff:prob:another:pval:minlevel:damage:color -# I:diff:prob: :minlevel: :color -# D:description - -# -# stat traps -# - -N:1:Weakness Trap -I:2:100:5:5:2:0d0:b -D:A poisoned needle weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:2:Weakness Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle seriously weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:3:Weakness Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle permanently weakens you! -F:CHEST -F:DOOR -F:FLOOR - -N:4:Intelligence Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:5:Intelligence Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:6:Intelligence Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently stupid! -F:CHEST -F:DOOR -F:FLOOR - -N:7:Wisdom Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel naive! -F:CHEST -F:DOOR -F:FLOOR - -N:8:Wisdom Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very naive! -F:CHEST -F:DOOR -F:FLOOR - -N:9:Wisdom Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently naive! -F:CHEST -F:DOOR -F:FLOOR - -N:10:Fumbling Fingers Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:11:Fumbling Fingers Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:12:Fumbling Fingers Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently clumsy! -F:CHEST -F:DOOR -F:FLOOR - -N:13:Wasting Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle makes you feel sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:14:Wasting Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle makes you feel very sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:15:Wasting Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle makes you feel permanently sickly! -F:CHEST -F:DOOR -F:FLOOR - -N:16:Beauty Trap -I:2:100:5:2:2:0d0:b -D:A poisoned needle scars you! -F:CHEST -F:DOOR -F:FLOOR - -N:17:Beauty Trap -I:5:100:5:5:20:0d0:b -D:A poisoned needle scars you horribly! -F:CHEST -F:DOOR -F:FLOOR - -N:18:Beauty Trap -I:7:100:5:8:40:0d0:b -D:A poisoned needle scars you permanently! -F:CHEST -F:DOOR -F:FLOOR - -# -# miscellaneous traps -# - -N:20:Trap of Curse Weapon -I:5:10:0:12:20:0d0:y -D:Your weapon will never be the same... -F:CHEST -F:DOOR -F:FLOOR - -N:21:Trap of Curse Armour -I:5:15:0:12:20:0d0:y -D:Your armour doesn't exactly get better by setting off this trap... -F:CHEST -F:DOOR -F:FLOOR - -N:22:Earthquake Trap -I:5:20:0:10:10:0d0:o -D:The ceiling collapses around you! -F:CHEST -F:DOOR -F:FLOOR - -N:23:Poison Needle Trap -I:1:50:50:3:2:0d0:r -D:A poisoned needle pricks you! -F:CHEST -F:DOOR -F:FLOOR - -N:24:Summon Monster Trap -I:2:50:40:4:2:0d0:v -D:Monsters defend the memory of the owner... -F:CHEST -F:DOOR -F:FLOOR - -N:25:Summon Undead Trap -I:4:25:40:6:10:0d0:v -D:Undead rise from the grave to defend this! -F:CHEST -F:DOOR -F:FLOOR - -N:26:Summon Greater Undead Trap -I:8:10:50:20:20:0d0:v -D:Greater undead defend this! -F:CHEST -F:DOOR -F:FLOOR - -N:27:Teleport Trap -I:3:100:50:3:2:0d0:w -D:Now you know why nobody ever got close enough to disarm this trap... -F:CHEST -F:DOOR -F:FLOOR - -N:28:Paralysing Trap -I:1:100:20:2:2:0d0:r -D:You suddenly cannot move! -F:CHEST -F:DOOR -F:FLOOR - -N:29:Explosive Device -I:3:100:80:0:3:3d8:r -D:Ha! It explodes before your hands can illegally touch it! -F:CHEST -F:DOOR -F:FLOOR - -N:30:Teleport Item Trap -I:3:50:50:3:5:0d0:w -D:The item magically disappears from your greedy hands! -F:CHEST -F:FLOOR - -N:31:Lose Memory Trap -I:6:30:30:6:10:0d0:r -D:You suddenly can't remember what you were doing here... -F:CHEST -F:DOOR -F:FLOOR - -N:32:Bitter Regret Trap -I:9:15:20:9:20:0d0:r -D:You already regret trying this... -F:CHEST -F:DOOR -F:FLOOR - -N:33:Bowel Cramps Trap -I:1:90:20:1:6:0d0:r -D:Your stomach twists with a sharp pang! -F:CHEST -F:DOOR -F:FLOOR - -N:34:Blindness/Confusion Trap -I:4:100:50:4:6:0d0:r -D:You suddenly can't see, and thinking is difficult too.... -F:CHEST -F:DOOR -F:FLOOR - -N:35:Aggravation Trap -I:2:100:50:2:3:0d0:o -D:Your hear a high-pitched humming noise... -F:CHEST -F:DOOR -F:FLOOR - -N:36:Multiplication Trap -I:3:90:0:3:5:0d0:o -D:The floor around you doesn't seem the same... -F:CHEST -F:DOOR -F:FLOOR - -N:37:Steal Item Trap -I:3:100:50:3:6:0d0:y -D:The chest seems to swell, while your backpack feels lighter.. -F:CHEST -F:FLOOR - -N:38:Summon Fast Quylthulgs Trap -I:8:50:10:10:25:0d0:v -D:Parts of the owner seem to return from somewhere else, as you slow in awe. -F:CHEST -F:DOOR -F:FLOOR - -N:39:Trap of Sinking -I:2:50:0:0:3:0d0:w -D:A trapdoor opens up under you! -F:DOOR -F:FLOOR - -N:40:Trap of Mana Drain -I:4:100:50:3:4:0d0:r -D:You suddenly can't think so clearly any more... -F:CHEST -F:DOOR -F:FLOOR - -N:41:Trap of Missing Money -I:2:100:50:2:2:0d0:y -D:Money isn't everything, they say... -F:CHEST -F:DOOR -F:FLOOR - -N:42:Trap of No Return -I:5:20:10:4:8:0d0:y -D:Do stay a while! -F:CHEST -F:DOOR -F:FLOOR - -N:43:Trap of Silent Switching -I:4:100:50:3:6:0d0:y -D:You suddenly are a different person! -F:CHEST -F:DOOR -F:FLOOR - -N:44:Trap of Walls -I:6:100:50:2:10:0d0:o -D:The room seems to shrink! -F:CHEST -F:DOOR -F:FLOOR - -N:45:Trap of Calling Out -I:10:100:100:5:15:0d0:v -D:You hear something coming closer, much closer. -F:CHEST -F:DOOR -F:FLOOR - -N:46:Trap of Sliding -I:8:50:50:4:8:0d0:r -D:Your feet seem to have a life of their own! -F:CHEST -F:DOOR -F:FLOOR - -N:47:Trap of Charges Drain -I:6:100:70:2:3:0d0:y -D:You feel as if you've just lost something... -F:CHEST -F:DOOR -F:FLOOR - -N:48:Trap of Stair Movement -I:6:100:50:3:4:0d0:o -D:The dungeon seems different... -F:CHEST -F:DOOR -F:FLOOR - -N:49:Trap of New Trap -I:5:100:5:0:4:0d0:o -D:Somehow, disarming isn't over, you feel... -F:CHEST -F:DOOR -F:FLOOR - -N:50:Trap of Scatter Items -I:10:50:50:6:12:0d0:w -D:You hear crashing sounds from all over the dungeon! -F:CHEST -F:DOOR -F:FLOOR - -N:51:Trap of Decay -I:4:100:50:4:4:0d0:r -D:Your stomach isn't empty, but suddenly you think of food. -F:CHEST -F:DOOR -F:FLOOR - -N:52:Trap of Wasting Wands -I:6:100:40:4:5:0d0:y -D:Your wands seem different... -F:CHEST -F:DOOR -F:FLOOR - -N:53:Trap of Filling -I:10:100:0:10:25:0d0:o -D:The whole room vibrates in a strange way... -F:CHEST -F:DOOR -F:FLOOR - -N:54:Trap of Drain Speed -I:8:50:10:25:80:0d0:y -D:You suddenly seem to have more time to self-reflect... -F:CHEST -F:DOOR -F:FLOOR - -# -# bolt traps -# - -N:60:Lightning Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are jolted with electricity! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:61:Poison Bolt Trap -I:2:80:5:3:2:2d8:g -D:A blast of poison gas hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:62:Acid Bolt Trap -I:2:80:5:3:2:2d8:g -D:A jet of acid shoots out at you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:63:Cold Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are suddenly very cold! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:64:Fire Bolt Trap -I:2:80:5:3:2:2d8:g -D:You are suddenly very hot! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:65:Plasma Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of plasma hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:66:Water Bolt Trap -I:4:80:5:5:8:5d10:g -D:A gush of water hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:67:Light Bolt Trap -I:4:80:5:5:8:5d10:g -D:There is a sudden flash of light around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:68:Dark Bolt Trap -I:4:80:5:5:8:5d10:g -D:A bolt of pure elemental darkness hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:69:Shards Bolt Trap -I:6:80:5:6:15:6d10:g -D:A blast of crystal shards hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:70:Sound Bolt Trap -I:6:80:5:6:15:10d12:g -D:A sudden roar of sound hurts your eardrums! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:71:Confusion Bolt Trap -I:4:80:5:5:8:6d10:g -D:A blast of confusion gas engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:72:Force Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of pure force hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:73:Inertia Bolt Trap -I:6:80:5:6:15:10d12:g -D:Your feet feel like lead! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:74:Mana Bolt Trap -I:8:80:5:9:25:15d16:g -D:A bolt of pure magic hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:75:Ice Bolt Trap -I:4:80:5:5:8:5d10:g -D:A bolt of ice hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:76:Chaos Bolt Trap -I:6:80:5:6:15:10d12:g -D:A blast of raw chaos hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:77:Nether Bolt Trap -I:8:80:5:9:25:15d16:g -D:A bolt of negative energy hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:78:Disenchantment Bolt Trap -I:8:80:5:9:25:15d16:g -D:There is a static feeling in the air... -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:79:Nexus Bolt Trap -I:6:80:5:6:15:10d12:g -D:A bolt of nexus hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:80:Time Bolt Trap -I:8:80:5:9:25:15d16:g -D:Suddenly, several months pass by in a second! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:81:Gravity Bolt Trap -I:6:80:5:6:15:10d12:g -D:Gravity suddenly warps around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# -# ball traps -# - -N:82:Lightning Ball Trap -I:3:60:5:5:8:3d10:B -D:A massive electrical charge shoots through you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:83:Poison Ball Trap -I:3:60:5:5:8:3d10:B -D:A large cloud of poison gas envelops you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:84:Acid Ball Trap -I:3:60:5:5:8:3d10:B -D:You are suddenly drenched in acid! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:85:Cold Ball Trap -I:3:60:5:5:8:3d10:B -D:A blast of hideously cold air envelops you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:86:Fire Ball Trap -I:3:60:5:5:8:3d10:B -D:You are suddenly in the centre of a raging inferno! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:87:Plasma Ball Trap -I:8:60:5:8:20:12d18:B -D:You are engulfed in plasma! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:88:Water Ball Trap -I:5:60:5:6:15:8d12:B -D:A whirlpool engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:89:Light Ball Trap -I:5:60:5:6:15:8d12:B -D:A massive flash of light erupts around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:90:Darkness Ball Trap -I:5:60:5:6:15:8d12:B -D:A large patch of darkness erupts around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:91:Shards Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of crystal shards hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:92:Sound Ball Trap -I:8:60:5:8:20:12d18:B -D:BOOM! Your eardrums nearly explode! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:93:Confusion Ball Trap -I:5:60:5:6:15:8d12:B -D:You are enveloped in a cloud of confusion gas! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:94:Force Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of pure force smashes down around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:95:Inertia Ball Trap -I:8:60:5:8:20:12d18:B -D:Suddenly, your entire body feels like lead! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:96:Mana Ball Trap -I:10:60:5:10:30:16d20:B -D:You are hit by a blast of pure magic! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:97:Ice Ball Trap -I:5:60:5:6:15:8d12:B -D:A massive blast of ice crystals engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL2 - -N:98:Chaos Ball Trap -I:8:60:5:8:20:12d18:B -D:A violent blast of raw chaos engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:99:Nether Ball Trap -I:10:60:5:10:30:16d20:g -D:A blast of energy from the netherworld engulfs you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -# N:type:name -# I:diff:prob:another:pval:minlevel:color -# D:description - -N:100:Disenchantment Ball Trap -I:10:60:5:10:30:16d20:B -D:You are hit by a blast of pure anti-magic! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:101:Nexus Ball Trap -I:8:60:5:8:20:12d18:B -D:A ball of nexus hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:102:Time Ball Trap -I:10:60:5:10:30:16d20:B -D:Suddenly, several years pass by in a second! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL4 - -N:103:Gravity Ball Trap -I:8:60:5:8:20:12d18:B -D:You suddenly feel gravity warp violently around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:110:Arrow Trap -I:2:100:0:5:2:0d0:R -D:An arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:111:Bolt Trap -I:2:100:0:5:5:0d0:R -D:A bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:112:Seeker Arrow Trap -I:2:100:0:6:10:0d0:R -D:A seeker arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:113:Seeker Bolt Trap -I:2:100:0:6:12:0d0:R -D:A seeker bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:114:Poison Arrow Trap -I:2:100:0:5:4:0d0:R -D:A poisoned arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:115:Poison Bolt Trap -I:2:100:0:6:6:0d0:R -D:A poisoned bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:116:Poison Seeker Arrow Trap -I:2:100:0:7:12:0d0:R -D:A poisoned seeker arrow shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:117:Poison Seeker Bolt Trap -I:2:100:0:7:15:0d0:R -D:A poisoned seeker bolt shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:118:Broken Dagger Trap -I:2:100:0:5:2:0d0:R -D:An broken dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:119:Dagger Trap -I:2:100:0:5:5:0d0:R -D:A dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:120:Poison Broken Dagger Trap -I:2:100:0:5:4:0d0:R -D:A poisoned broken dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:121:Poison Dagger Trap -I:2:100:0:6:6:0d0:R -D:A poisoned dagger shoots out at you. -F:CHEST -F:DOOR -F:FLOOR - -# -# multiple arrows/daggers traps -# - -N:122:Arrows Trap -I:4:100:0:7:16:0d0:R -D:Some arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:123:Bolts Trap -I:4:100:0:7:18:0d0:R -D:Some bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:124:Seeker Arrow Trap -I:5:100:0:8:20:0d0:R -D:Some seeker arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:125:Seeker Bolt Trap -I:5:100:0:8:24:0d0:R -D:Some seeker bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:126:Poison Arrows Trap -I:5:100:0:8:18:0d0:R -D:Some poisoned arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:127:Poison Bolt Trap -I:6:100:0:8:20:0d0:R -D:Some poisoned bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:128:Poison Seeker Arrows Trap -I:7:100:0:9:27:0d0:R -D:Some poisoned seeker arrows shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:129:Poison Seeker Bolts Trap -I:9:100:0:9:30:0d0:R -D:Some poisoned seeker bolts shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:130:Broken Daggers Trap -I:4:100:0:6:12:0d0:R -D:Some broken daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:131:Dagger Trap -I:4:100:0:6:15:0d0:R -D:Some daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:132:Poison Broken Daggers Trap -I:5:100:0:7:18:0d0:R -D:Some poisoned broken daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:133:Poison Daggers Trap -I:6:100:0:7:23:0d0:R -D:Some poisoned daggers shoot out at you. -F:CHEST -F:DOOR -F:FLOOR - -N:140:Trap of Drop Item -I:3:50:0:2:5:0d0:y -D:A sudden sound startles you and you drop something! -F:CHEST -F:DOOR -F:FLOOR - -N:141:Trap of Drop Items -I:5:50:0:5:12:0d0:y -D:A sudden sound startles you and you drop several things! -F:CHEST -F:DOOR -F:FLOOR - -N:142:Trap of Drop Everything -I:8:50:0:8:20:0d0:y -D:A sudden sound startles you and you drop everything! -F:CHEST -F:DOOR -F:FLOOR - -N:158:Trap of Divine Anger -I:6:100:5:0:15:0d0:G -D:A voice booms out "Have a care, mortal!" -F:CHEST -F:DOOR -F:FLOOR - -N:159:Trap of Divine Wrath -I:9:50:5:0:30:0d0:G -D:A voice booms out "Sacrilege!" -F:CHEST -F:DOOR -F:FLOOR - -N:160:Hallucination Trap -I:3:100:10:0:4:0d0:r -D:Your vision is clouded by a blast of kaleidoscopic light! -F:CHEST -F:DOOR -F:FLOOR - -# Bolt traps -N:161:Greater Magic Missile Trap -I:6:80:5:6:75:25d20:g -D:A greater magic missile hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -#N:162:Foulness Trap -#I:6:80:5:6:15:10d12:g -#D:You feel foul! -#F:FLOOR | CHEST | DOOR | LEVEL3 - -#N:163:Trap of Death Ray -#I:8:80:5:9:25:15d16:g -#D:A Ray of Death hits you! -#F:FLOOR | CHEST | DOOR | LEVEL4 - -N:164:Trap of Holy Fire -I:6:80:5:6:15:10d12:g -D:Holy fire rises around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:165:Trap of Hell Fire -I:6:80:5:6:15:10d12:g -D:Hellfire rises around you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:166:Psi Bolt Trap -I:6:80:5:6:15:10d12:g -D:Your mind is suddenly blasted! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -N:167:Psi Drain Trap -I:6:80:5:6:15:8d10:r -D:You suddenly can't think clearly any more... -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# Ball Traps - -### this one *ought* to be a Nuke Ball trap, not plasma ball, as trap 87 -### is also plasma ball. I've put the description right in advance. - -#N:168:Plasma Ball Trap -#I:8:60:5:8:20:12d18:B -#D:A blast of radiation engulfs you! -#F:FLOOR | CHEST | DOOR | LEVEL3 - -N:169:Psi Ball Trap -I:8:60:5:8:20:12d18:B -D:Your brain is suddenly blasted! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL3 - -# Useful traps - -N:170:Acquirement Trap -I:1:40:5:5:18:0d0:v -D:Whoa! -F:DOOR -F:FLOOR - -# More bolt traps - -N:171:Greater Lightning Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are jolted with electricity! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:172:Greater Poison Bolt Trap -I:3:60:5:3:6:6d6:g -D:A blast of deadly poison gas hits you! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:173:Greater Acid Bolt Trap -I:3:60:5:3:6:6d6:g -D:A jet of acid shoots out at you! It burns severely! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:174:Greater Cold Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are suddenly extremely cold! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 - -N:175:Greater Fire Bolt Trap -I:3:60:5:3:6:6d6:g -D:You are suddenly extremely hot! -F:CHEST -F:DOOR -F:FLOOR -F:LEVEL1 -- cgit v1.2.3 From a14983ca7feb5df1a6a2dee33de79cfd63bdc481 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove more documentation mentions of traps --- lib/help/option.txt | 11 ++--------- lib/mods/theme/help/option.txt | 14 ++++---------- lib/mods/theme/user/all.prf | 3 --- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/lib/help/option.txt b/lib/help/option.txt index a27e8def..f1d485db 100644 --- a/lib/help/option.txt +++ b/lib/help/option.txt @@ -110,8 +110,8 @@ off at will during the course of the game. #####GRepeat obvious commands [always_repeat] Tells the game that when you attempt to open a door or chest, bash - a door, tunnel through walls, or disarm traps or chests, that you - wish to repeat the command 99 times (see *****command.txt*0["command.txt"]). + a door, or tunnel through walls, that you wish to repeat the command + 99 times (see *****command.txt*0["command.txt"]). #####GAudible bell (on errors, etc) [ring_bell] Attempt to make a "bell" noise when various errors occur. @@ -200,13 +200,6 @@ off at will during the course of the game. to only one known door, using the "o"pen command will not prompt you for a direction. -#####GAutomatically disarm traps [easy_disarm] - Attempts to disarm traps by walking into/over them. Also, if you are - adjacent to only one known trap, using the "D"isarm command will not - prompt you for a direction. If your disarming ability is particularly - low, you should probably not enable this option, because you will often - fail to disarm the traps, and sometimes trigger them. - #####GAutomatically tunnel walls [easy_tunnel] Automatically tunnels into walls by walking into them. diff --git a/lib/mods/theme/help/option.txt b/lib/mods/theme/help/option.txt index 040f8c30..f1d485db 100644 --- a/lib/mods/theme/help/option.txt +++ b/lib/mods/theme/help/option.txt @@ -67,7 +67,7 @@ can also be viewed from the option menu while playing, but not changed then. Allows the player to turn off ToME's *****fatespoi.txt*0[fates] for that character. #####GItems always sell for 0 gold [no_selling] - Disables selling items back to shops for money. The value of gold found in the + Disables selling items back to shops for money. The value of gold found in the dungeon is increased to compensate. ~~~~~07|Options|Ingame @@ -110,8 +110,8 @@ off at will during the course of the game. #####GRepeat obvious commands [always_repeat] Tells the game that when you attempt to open a door or chest, bash - a door, tunnel through walls, or disarm traps or chests, that you - wish to repeat the command 99 times (see *****command.txt*0["command.txt"]). + a door, or tunnel through walls, that you wish to repeat the command + 99 times (see *****command.txt*0["command.txt"]). #####GAudible bell (on errors, etc) [ring_bell] Attempt to make a "bell" noise when various errors occur. @@ -200,13 +200,6 @@ off at will during the course of the game. to only one known door, using the "o"pen command will not prompt you for a direction. -#####GAutomatically disarm traps [easy_disarm] - Attempts to disarm traps by walking into/over them. Also, if you are - adjacent to only one known trap, using the "D"isarm command will not - prompt you for a direction. If your disarming ability is particularly - low, you should probably not enable this option, because you will often - fail to disarm the traps, and sometimes trigger them. - #####GAutomatically tunnel walls [easy_tunnel] Automatically tunnels into walls by walking into them. @@ -370,6 +363,7 @@ off at will during the course of the game. This option forces the game to flush all output after every message displayed by the game. This will give you maximal information, but may slow down the game somewhat. + ~~~~~2 #####GHilite the player with the cursor [hilite_player] Place the visible cursor on the player. This looks fine on some Unix diff --git a/lib/mods/theme/user/all.prf b/lib/mods/theme/user/all.prf index 7376494a..b9554238 100644 --- a/lib/mods/theme/user/all.prf +++ b/lib/mods/theme/user/all.prf @@ -77,9 +77,6 @@ X:disturb_pets # Option 'Automatically open doors' Y:easy_open -# Option 'Automatically disarm traps' -Y:easy_disarm - # Option 'Automatically tunnel walls' Y:easy_tunnel -- cgit v1.2.3 From 80b2d971574cca927d31b3298e32bc5510aa942f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove dead trap code --- src/spells2.hpp | 1 - src/tables.cc | 92 --------------------------------------------------------- src/tables.hpp | 2 -- 3 files changed, 95 deletions(-) diff --git a/src/spells2.hpp b/src/spells2.hpp index 09d5ea68..3fcab116 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -70,7 +70,6 @@ extern bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam); extern bool_ lite_line(int dir); extern bool_ drain_life(int dir, int dam); extern bool_ wall_to_mud(int dir); -extern bool_ disarm_trap(int dir); extern bool_ wizard_lock(int dir); extern bool_ slow_monster(int dir); extern bool_ sleep_monster(int dir); diff --git a/src/tables.cc b/src/tables.cc index 0662da0f..8b05ddf6 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -313,98 +313,6 @@ byte adj_wis_sav[] = }; -/* - * Stat Table (DEX) -- disarming - */ -byte adj_dex_dis[] = -{ - 0 /* 3 */, - 0 /* 4 */, - 0 /* 5 */, - 0 /* 6 */, - 0 /* 7 */, - 0 /* 8 */, - 0 /* 9 */, - 0 /* 10 */, - 0 /* 11 */, - 0 /* 12 */, - 1 /* 13 */, - 1 /* 14 */, - 1 /* 15 */, - 2 /* 16 */, - 2 /* 17 */, - 4 /* 18/00-18/09 */, - 4 /* 18/10-18/19 */, - 4 /* 18/20-18/29 */, - 4 /* 18/30-18/39 */, - 5 /* 18/40-18/49 */, - 5 /* 18/50-18/59 */, - 5 /* 18/60-18/69 */, - 6 /* 18/70-18/79 */, - 6 /* 18/80-18/89 */, - 7 /* 18/90-18/99 */, - 8 /* 18/100-18/109 */, - 8 /* 18/110-18/119 */, - 8 /* 18/120-18/129 */, - 8 /* 18/130-18/139 */, - 8 /* 18/140-18/149 */, - 9 /* 18/150-18/159 */, - 9 /* 18/160-18/169 */, - 9 /* 18/170-18/179 */, - 9 /* 18/180-18/189 */, - 9 /* 18/190-18/199 */, - 10 /* 18/200-18/209 */, - 10 /* 18/210-18/219 */, - 10 /* 18/220+ */ -}; - - -/* - * Stat Table (INT) -- disarming - */ -byte adj_int_dis[] = -{ - 0 /* 3 */, - 0 /* 4 */, - 0 /* 5 */, - 0 /* 6 */, - 0 /* 7 */, - 1 /* 8 */, - 1 /* 9 */, - 1 /* 10 */, - 1 /* 11 */, - 1 /* 12 */, - 1 /* 13 */, - 1 /* 14 */, - 2 /* 15 */, - 2 /* 16 */, - 2 /* 17 */, - 3 /* 18/00-18/09 */, - 3 /* 18/10-18/19 */, - 3 /* 18/20-18/29 */, - 4 /* 18/30-18/39 */, - 4 /* 18/40-18/49 */, - 5 /* 18/50-18/59 */, - 6 /* 18/60-18/69 */, - 7 /* 18/70-18/79 */, - 8 /* 18/80-18/89 */, - 9 /* 18/90-18/99 */, - 10 /* 18/100-18/109 */, - 10 /* 18/110-18/119 */, - 11 /* 18/120-18/129 */, - 12 /* 18/130-18/139 */, - 13 /* 18/140-18/149 */, - 14 /* 18/150-18/159 */, - 15 /* 18/160-18/169 */, - 16 /* 18/170-18/179 */, - 17 /* 18/180-18/189 */, - 18 /* 18/190-18/199 */, - 19 /* 18/200-18/209 */, - 19 /* 18/210-18/219 */, - 20 /* 18/220+ */ -}; - - /* * Stat Table (DEX) -- bonus to ac (plus 128) */ diff --git a/src/tables.hpp b/src/tables.hpp index 6b9d59b2..58dfaae2 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -33,8 +33,6 @@ extern byte adj_mag_fail[]; extern byte adj_mag_stat[]; extern byte adj_chr_gold[]; extern byte adj_wis_sav[]; -extern byte adj_dex_dis[]; -extern byte adj_int_dis[]; extern byte adj_dex_ta[]; extern byte adj_str_td[]; extern byte adj_dex_th[]; -- cgit v1.2.3 From 48c827fcfec1b0bce6885ff7b431765528be638a Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Fix formatting of tactic_info table --- src/tables.cc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/tables.cc b/src/tables.cc index 8b05ddf6..4d6e87a3 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2169,16 +2169,16 @@ deity_type deity_info[MAX_GODS] = /* as far as I know. */ tactic_info_type tactic_info[9] = { - /* hit dam ac stl dis sav */ - { -10, -10, + 15, + 3, + 15, + 14, "coward"}, /* 4-4 */ - { -8, -8, + 10, + 2, + 9, + 9, "meek"}, /* 4-3 */ - { -4, -4, + 5, + 1, + 5, + 5, "wary"}, /* 4-2 */ - { -2, -2, + 2, + 1, + 2, + 2, "careful"}, /* 4-1 */ - { 0, 0, 0, 0, 0, 0, "normal"}, /* 4+0 */ - { 2, 2, -2, -1, -2, -3, "confident"}, /* 4+1 */ - { 4, 4, -5, -2, -5, -7, "aggressive"}, /* 4+2 */ - { 6, 6, -10, -3, -11, -12, "furious"}, /* 4+3 */ - { 8, 12, -25, -5, -18, -18, "berserker"} /* 4+4 */ + /* hit dam ac stl dis sav */ + { -10, -10, +15, +3, +15, +14, "coward" }, + { -8, -8, +10, +2, +9, +9, "meek" }, + { -4, -4, +5, +1, +5, +5, "wary" }, + { -2, -2, +2, +1, +2, +2, "careful" }, + { 0, 0, 0, 0, 0, 0, "normal" }, + { 2, 2, -2, -1, -2, -3, "confident" }, + { 4, 4, -5, -2, -5, -7, "aggressive" }, + { 6, 6, -10, -3, -11, -12, "furious" }, + { 8, 12, -25, -5, -18, -18, "berserker" } }; /* -- cgit v1.2.3 From 7d918f0df60e38c2c069976e4f82b790b770b894 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove unused tactic_info_type.to_disarm field --- src/tables.cc | 20 ++++++++++---------- src/tactic_info_type.hpp | 1 - 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/tables.cc b/src/tables.cc index 4d6e87a3..e2eb5ff1 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2169,16 +2169,16 @@ deity_type deity_info[MAX_GODS] = /* as far as I know. */ tactic_info_type tactic_info[9] = { - /* hit dam ac stl dis sav */ - { -10, -10, +15, +3, +15, +14, "coward" }, - { -8, -8, +10, +2, +9, +9, "meek" }, - { -4, -4, +5, +1, +5, +5, "wary" }, - { -2, -2, +2, +1, +2, +2, "careful" }, - { 0, 0, 0, 0, 0, 0, "normal" }, - { 2, 2, -2, -1, -2, -3, "confident" }, - { 4, 4, -5, -2, -5, -7, "aggressive" }, - { 6, 6, -10, -3, -11, -12, "furious" }, - { 8, 12, -25, -5, -18, -18, "berserker" } + /* hit dam ac stl sav */ + { -10, -10, +15, +3, +14, "coward" }, + { -8, -8, +10, +2, +9, "meek" }, + { -4, -4, +5, +1, +5, "wary" }, + { -2, -2, +2, +1, +2, "careful" }, + { 0, 0, 0, 0, 0, "normal" }, + { 2, 2, -2, -1, -3, "confident" }, + { 4, 4, -5, -2, -7, "aggressive" }, + { 6, 6, -10, -3, -12, "furious" }, + { 8, 12, -25, -5, -18, "berserker" } }; /* diff --git a/src/tactic_info_type.hpp b/src/tactic_info_type.hpp index da94767d..4cb330f4 100644 --- a/src/tactic_info_type.hpp +++ b/src/tactic_info_type.hpp @@ -11,7 +11,6 @@ struct tactic_info_type s16b to_dam; s16b to_ac; s16b to_stealth; - s16b to_disarm; s16b to_saving; cptr name; }; -- cgit v1.2.3 From 7de323212dd365c6a51f3c3cb6b4403e5bf49ca1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 11:38:29 +0200 Subject: Remove dead declarations --- src/cmd2.hpp | 1 - src/spells3.hpp | 1 - 2 files changed, 2 deletions(-) diff --git a/src/cmd2.hpp b/src/cmd2.hpp index f811cf45..b5390c2a 100644 --- a/src/cmd2.hpp +++ b/src/cmd2.hpp @@ -15,7 +15,6 @@ extern void do_cmd_close(void); extern void do_cmd_chat(void); extern void do_cmd_give(void); extern void do_cmd_tunnel(void); -extern void do_cmd_disarm(void); extern void do_cmd_bash(void); extern void do_cmd_alter(void); extern void do_cmd_spike(void); diff --git a/src/spells3.hpp b/src/spells3.hpp index 3380203a..12e6a78f 100644 --- a/src/spells3.hpp +++ b/src/spells3.hpp @@ -33,7 +33,6 @@ extern s32b PROBABILITY_TRAVEL; casting_result convey_blink(); const char *convey_blink_info(); -casting_result convey_disarm(); casting_result convey_teleport(); const char *convey_teleport_info(); casting_result convey_teleport_away(); -- cgit v1.2.3 From f40b4894a8410c1277aaabbf5ac47536810b65aa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 8 Oct 2016 14:57:33 +0200 Subject: Work around bad strchr() declaration Fixes #11 --- src/init1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init1.cc b/src/init1.cc index c77f28eb..427e2d86 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -3142,7 +3142,7 @@ errr init_s_info_txt(FILE *fp) char *txt; /* Acquire the text */ - char const *s = buf + 2; + char *s = buf + 2; if (NULL == (txt = strchr(s, ':'))) return (1); *txt = '\0'; -- cgit v1.2.3 From 42d27cacb1e835923e068c4d4ce43283c8c17884 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 16 Oct 2016 12:28:53 +0200 Subject: De-duplicate code for curse-breaking --- src/spells2.cc | 87 ++++++++++++++++++++-------------------------------------- 1 file changed, 30 insertions(+), 57 deletions(-) diff --git a/src/spells2.cc b/src/spells2.cc index ab872dc6..fdf8cd27 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -2627,10 +2627,27 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) bool_ res = FALSE; auto const a = artifact_p(o_ptr); - /* Extract the flags */ auto const flags = object_flags(o_ptr); + /* Break curse if item is cursed the curse isn't permanent */ + auto maybe_break_curse = [o_ptr, &flags]() + { + if (cursed_p(o_ptr) && (!(flags & TR_PERMA_CURSE))) + { + msg_print("The curse is broken!"); + o_ptr->ident &= ~(IDENT_CURSED); + o_ptr->ident |= (IDENT_SENSE); + + if (o_ptr->art_flags & TR_CURSED) + o_ptr->art_flags &= ~TR_CURSED; + if (o_ptr->art_flags & TR_HEAVY_CURSE) + o_ptr->art_flags &= ~TR_HEAVY_CURSE; + + o_ptr->sense = SENSE_UNCURSED; + } + }; + /* Large piles resist enchantment */ prob = o_ptr->number * 100; @@ -2660,21 +2677,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) o_ptr->to_h++; res = TRUE; - /* only when you get it above -1 -CFT */ - if (cursed_p(o_ptr) && - (!(flags & TR_PERMA_CURSE)) && - (o_ptr->to_h >= 0) && (rand_int(100) < 25)) + /* break curse? */ + if ((o_ptr->to_h >= 0) && (rand_int(100) < 25)) { - msg_print("The curse is broken!"); - o_ptr->ident &= ~(IDENT_CURSED); - o_ptr->ident |= (IDENT_SENSE); - - if (o_ptr->art_flags & TR_CURSED) - o_ptr->art_flags &= ~TR_CURSED; - if (o_ptr->art_flags & TR_HEAVY_CURSE) - o_ptr->art_flags &= ~TR_HEAVY_CURSE; - - o_ptr->sense = SENSE_UNCURSED; + maybe_break_curse(); } } } @@ -2691,21 +2697,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) o_ptr->to_d++; res = TRUE; - /* only when you get it above -1 -CFT */ - if (cursed_p(o_ptr) && - (!(flags & TR_PERMA_CURSE)) && - (o_ptr->to_d >= 0) && (rand_int(100) < 25)) + /* break curse? */ + if ((o_ptr->to_d >= 0) && (rand_int(100) < 25)) { - msg_print("The curse is broken!"); - o_ptr->ident &= ~(IDENT_CURSED); - o_ptr->ident |= (IDENT_SENSE); - - if (o_ptr->art_flags & TR_CURSED) - o_ptr->art_flags &= ~TR_CURSED; - if (o_ptr->art_flags & TR_HEAVY_CURSE) - o_ptr->art_flags &= ~TR_HEAVY_CURSE; - - o_ptr->sense = SENSE_UNCURSED; + maybe_break_curse(); } } } @@ -2723,21 +2718,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) o_ptr->pval++; res = TRUE; - /* only when you get it above -1 -CFT */ - if (cursed_p(o_ptr) && - (!(flags & TR_PERMA_CURSE)) && - (o_ptr->pval >= 0) && (rand_int(100) < 25)) + /* break curse? */ + if ((o_ptr->pval >= 0) && (rand_int(100) < 25)) { - msg_print("The curse is broken!"); - o_ptr->ident &= ~(IDENT_CURSED); - o_ptr->ident |= (IDENT_SENSE); - - if (o_ptr->art_flags & TR_CURSED) - o_ptr->art_flags &= ~TR_CURSED; - if (o_ptr->art_flags & TR_HEAVY_CURSE) - o_ptr->art_flags &= ~TR_HEAVY_CURSE; - - o_ptr->sense = SENSE_UNCURSED; + maybe_break_curse(); } } } @@ -2754,21 +2738,10 @@ bool_ enchant(object_type *o_ptr, int n, int eflag) o_ptr->to_a++; res = TRUE; - /* only when you get it above -1 -CFT */ - if (cursed_p(o_ptr) && - (!(flags & TR_PERMA_CURSE)) && - (o_ptr->to_a >= 0) && (rand_int(100) < 25)) + /* break curse? */ + if ((o_ptr->to_a >= 0) && (rand_int(100) < 25)) { - msg_print("The curse is broken!"); - o_ptr->ident &= ~(IDENT_CURSED); - o_ptr->ident |= (IDENT_SENSE); - - if (o_ptr->art_flags & TR_CURSED) - o_ptr->art_flags &= ~TR_CURSED; - if (o_ptr->art_flags & TR_HEAVY_CURSE) - o_ptr->art_flags &= ~TR_HEAVY_CURSE; - - o_ptr->sense = SENSE_UNCURSED; + maybe_break_curse(); } } } -- cgit v1.2.3 From 5144951fc78046fb91445c1ffb2b9a157b59f488 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 16 Oct 2016 12:28:53 +0200 Subject: Remove Sneakiness from the skills.txt help --- lib/help/skills.txt | 14 ++++---------- lib/mods/theme/help/skills.txt | 14 ++++---------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/lib/help/skills.txt b/lib/help/skills.txt index fe68da6e..32e9df04 100644 --- a/lib/help/skills.txt +++ b/lib/help/skills.txt @@ -118,10 +118,10 @@ The skills are: *****skills.txt*47[Mimicry] *****skills.txt*33[Mind] *****skills.txt*41[Mindcraft] *****skills.txt*42[Monster-lore] *****skills.txt*59[Music] *****skills.txt*34[Nature] *****skills.txt*35[Necromancy] *****skills.txt*07[Polearm-mastery] *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*36[Runecraft] *****skills.txt*09[Sling-mastery] - *****skills.txt*14[Sneakiness] *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] - *****skills.txt*19[Stealing] *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] - *****skills.txt*03[Sword-mastery] *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] - *****skills.txt*48[Udun] *****skills.txt*26[Water] *****skills.txt*02[Weaponmastery] + *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] *****skills.txt*19[Stealing] + *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] *****skills.txt*03[Sword-mastery] + *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] *****skills.txt*48[Udun] + *****skills.txt*26[Water] *****skills.txt*02[Weaponmastery] ~~~~~01|Skills|Combat @@ -257,12 +257,6 @@ spirituality sub-skills. This skill does not affect your ability to use scrolls and potions, but other items that require [Self]Magic-Device are affected. At higher levels you gain the ability to detect traps and disrupt all teleportation. -~~~~~14|Skills|Sneakiness -[[[[[BSneakiness] -The sneakiness skill affects your searching and perception abilities. - -Sub-skills of Sneakiness include Stealth, Disarming, Trapping, Backstab, -Stealing and Dodging. ~~~~~15|Skills|Stealth [[[[[BStealth] This skill is a sub-skill of the Sneakiness skill. It affects your ability diff --git a/lib/mods/theme/help/skills.txt b/lib/mods/theme/help/skills.txt index fe68da6e..32e9df04 100644 --- a/lib/mods/theme/help/skills.txt +++ b/lib/mods/theme/help/skills.txt @@ -118,10 +118,10 @@ The skills are: *****skills.txt*47[Mimicry] *****skills.txt*33[Mind] *****skills.txt*41[Mindcraft] *****skills.txt*42[Monster-lore] *****skills.txt*59[Music] *****skills.txt*34[Nature] *****skills.txt*35[Necromancy] *****skills.txt*07[Polearm-mastery] *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*36[Runecraft] *****skills.txt*09[Sling-mastery] - *****skills.txt*14[Sneakiness] *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] - *****skills.txt*19[Stealing] *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] - *****skills.txt*03[Sword-mastery] *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] - *****skills.txt*48[Udun] *****skills.txt*26[Water] *****skills.txt*02[Weaponmastery] + *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] *****skills.txt*19[Stealing] + *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] *****skills.txt*03[Sword-mastery] + *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] *****skills.txt*48[Udun] + *****skills.txt*26[Water] *****skills.txt*02[Weaponmastery] ~~~~~01|Skills|Combat @@ -257,12 +257,6 @@ spirituality sub-skills. This skill does not affect your ability to use scrolls and potions, but other items that require [Self]Magic-Device are affected. At higher levels you gain the ability to detect traps and disrupt all teleportation. -~~~~~14|Skills|Sneakiness -[[[[[BSneakiness] -The sneakiness skill affects your searching and perception abilities. - -Sub-skills of Sneakiness include Stealth, Disarming, Trapping, Backstab, -Stealing and Dodging. ~~~~~15|Skills|Stealth [[[[[BStealth] This skill is a sub-skill of the Sneakiness skill. It affects your ability -- cgit v1.2.3 From 54bd76ebab55ed5e090407747e6c7af402acf82b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 16 Oct 2016 12:28:53 +0200 Subject: Remove TR_SEARCH object flag Since the removal of traps its only effect was diluting the list of flags "available" for randarts and sentient items. --- lib/edit/a_info.txt | 26 --------------------- lib/edit/e_info.txt | 4 ---- lib/edit/k_info.txt | 22 ------------------ lib/edit/ra_info.txt | 2 -- lib/mods/theme/edit/a_info.txt | 32 ------------------------- lib/mods/theme/edit/e_info.txt | 6 ----- lib/mods/theme/edit/k_info.txt | 22 ------------------ lib/mods/theme/edit/p_info.txt | 10 -------- lib/mods/theme/edit/ra_info.txt | 2 -- lib/mods/theme/edit/set_info.txt | 1 - src/defines.h | 2 -- src/object1.cc | 7 ------ src/object2.cc | 50 ++++------------------------------------ src/object_flag_list.hpp | 13 +++++------ src/q_wight.cc | 1 - src/spells2.cc | 4 ---- src/tables.cc | 2 +- 17 files changed, 11 insertions(+), 195 deletions(-) diff --git a/lib/edit/a_info.txt b/lib/edit/a_info.txt index 6ab4bf5d..c1ab7fa1 100644 --- a/lib/edit/a_info.txt +++ b/lib/edit/a_info.txt @@ -37,7 +37,6 @@ F:HIDE_TYPE F:INSTA_ART F:LITE3 F:LUCK -F:SEARCH a:LIGHT D:A small crystal phial, with the light of Earendil's Star contained inside. D:Its light is imperishable, and near it darkness cannot endure. @@ -116,7 +115,6 @@ F:INT F:RES_ACID F:RES_COLD F:RES_ELEC -F:SEARCH F:SEE_INVIS F:WIS a:DISP_EVIL @@ -160,7 +158,6 @@ F:FLY F:HIDE_TYPE F:IM_FIRE F:INSTA_ART -F:SEARCH F:SEE_INVIS F:STR a:DIM_DOOR @@ -185,7 +182,6 @@ F:INSTA_ART F:INT F:RES_DARK F:RES_POIS -F:SEARCH F:SEE_INVIS F:STEALTH F:STR @@ -742,7 +738,6 @@ F:HIDE_TYPE F:INT F:RES_DARK F:RES_LITE -F:SEARCH F:SPEED F:STEALTH Z:panic hit @@ -991,7 +986,6 @@ F:ACTIVATE F:HIDE_TYPE F:INT F:RES_BLIND -F:SEARCH F:SEE_INVIS F:WIS a:DETECT_ALL @@ -1019,7 +1013,6 @@ F:RES_DISEN F:RES_FEAR F:RES_FIRE F:RES_POIS -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:TELEPORT @@ -1080,7 +1073,6 @@ F:RES_DARK F:RES_LITE F:RES_SHARDS F:RES_SOUND -F:SEARCH F:SEE_INVIS F:SPEED D:A crown of massive gold, set with wondrous jewels of thought and warding, @@ -1497,7 +1489,6 @@ F:DEX F:FREE_ACT F:HIDE_TYPE F:RES_DARK -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_EVIL @@ -1673,7 +1664,6 @@ F:LITE1 F:RANDOM_RES_OR_POWER F:RES_FIRE F:RES_LITE -F:SEARCH F:SHOW_MODS F:SLAY_DEMON F:SLAY_EVIL @@ -1701,7 +1691,6 @@ F:RES_BLIND F:RES_ELEC F:RES_FEAR F:RES_FIRE -F:SEARCH F:SHOW_MODS F:SLAY_GIANT F:SLAY_ORC @@ -1727,7 +1716,6 @@ F:RANDOM_RES_OR_POWER F:RES_COLD F:RES_COLD F:RES_DARK -F:SEARCH F:SHOW_MODS F:SLAY_DRAGON F:SLAY_EVIL @@ -2301,7 +2289,6 @@ F:INT F:RES_FEAR F:RES_FIRE F:RES_LITE -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_DEMON @@ -2485,7 +2472,6 @@ F:RES_COLD F:RES_ELEC F:RES_FEAR F:RES_FIRE -F:SEARCH F:SHOW_MODS F:SLAY_EVIL F:SLAY_GIANT @@ -2850,7 +2836,6 @@ F:INT F:RANDOM_POWER F:RES_FIRE F:RES_NETHER -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_EVIL @@ -3098,7 +3083,6 @@ F:RES_ACID F:RES_COLD F:RES_ELEC F:RES_FIRE -F:SEARCH F:SEE_INVIS F:SPELL_CONTAIN F:SUST_INT @@ -3283,7 +3267,6 @@ F:ACTIVATE F:INFRA F:RES_DARK F:RES_POIS -F:SEARCH F:STEALTH F:WIELD_CAST a:DRUEDAIN @@ -3448,7 +3431,6 @@ P:0:0d0:20:0:0 F:ACTIVATE F:HIDE_TYPE F:INFRA -F:SEARCH F:SHOW_MODS F:SPECIAL_GENE F:XTRA_SHOTS @@ -3622,7 +3604,6 @@ F:ACTIVATE F:COULD2H F:DEX F:HIDE_TYPE -F:SEARCH F:SHOW_MODS F:SLAY_ORC f:COULD2H @@ -3792,7 +3773,6 @@ F:RES_COLD F:RES_DARK F:RES_ELEC F:RES_FIRE -F:SEARCH F:STEALTH D:Familiar with the secret ways hidden in darkness, this leather cuirass is D:truly more than it appears. @@ -3814,7 +3794,6 @@ F:RES_ACID F:RES_DARK F:RES_DISEN F:RES_ELEC -F:SEARCH F:SUST_CHR F:SUST_DEX F:SUST_WIS @@ -3838,7 +3817,6 @@ F:RES_ACID F:RES_DISEN F:RES_FIRE F:RES_SHARDS -F:SEARCH F:SPELL a:CELEBRIMBOR D:This once belonged to Celebrimbor, maker of the Rings of Power. One who @@ -3928,7 +3906,6 @@ F:INFRA F:RES_ACID F:RES_DARK F:RES_DISEN -F:SEARCH F:SLAY_DRAGON F:SLAY_GIANT F:SLAY_ORC @@ -4064,7 +4041,6 @@ P:4:1d1:5:5:10 F:CLIMB F:HIDE_TYPE F:INFRA -F:SEARCH F:TUNNEL Z:magic map D:A set of iron-shod boots stamped by Gimli's combat prowess, a peerless @@ -4199,7 +4175,6 @@ F:INSTA_ART F:INT F:LITE2 F:RES_BLIND -F:SEARCH F:SEE_INVIS F:WIS a:PALANTIR @@ -4406,7 +4381,6 @@ F:ESP_ORC F:ESP_TROLL F:INFRA F:LUCK -F:SEARCH F:SLAY_ORC F:SLAY_TROLL F:TUNNEL diff --git a/lib/edit/e_info.txt b/lib/edit/e_info.txt index 0b85ce93..8174e41b 100644 --- a/lib/edit/e_info.txt +++ b/lib/edit/e_info.txt @@ -485,9 +485,7 @@ T:33:0:99 T:115:57:57 R:100 F:RES_BLIND -F:SEARCH F:SEE_INVIS -f:SEARCH R:20 F:ESP_ALL @@ -1474,7 +1472,6 @@ F:KILL_DRAGON F:REGEN F:RES_NEXUS F:R_HIGH -F:SEARCH F:SLAY_EVIL F:SLOW_DIGEST F:TELEPORT @@ -2301,7 +2298,6 @@ F:FEATHER F:FREE_ACT F:HIDE_TYPE F:IGNORE_ACID -F:SEARCH F:SHOW_MODS R:10 F:SPEED diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index e998ac71..7ac6d9ac 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -993,7 +993,6 @@ F:IGNORE_COLD F:IGNORE_ELEC F:IGNORE_FIRE F:LUCK -F:SEARCH F:STEALTH f:STEALTH D:A wonderfully light cloak coloured in brown and green hues. Its colouring @@ -1432,16 +1431,6 @@ F:SPEED f:SPEED D:This wonderful ring grants you additional energy, allowing you to act faster. -N:137:Searching -G:=:d -I:45:23:0 -W:5:0:2:250 -A:5/1 -F:HIDE_TYPE -F:SEARCH -f:SEARCH -D:This ring magically improves your attention, so you can detect hidden things better. - # New : It can be activated but at the cost of its destruction N:138:Teleportation G:=:d @@ -1739,16 +1728,6 @@ F:HIDE_TYPE f:CHR D:This amulet grants beauty beyond mere looks. -N:165:Searching -G:":d -I:40:5:0 -W:15:0:3:600 -A:15/1 -F:HIDE_TYPE -F:SEARCH -f:SEARCH -D:This amulet grants keen sight, finding things that are hidden. - N:166:Teleportation G:":d I:40:1:0 @@ -1816,7 +1795,6 @@ F:IGNORE_FIRE F:INT F:RES_BLIND F:RES_CONF -F:SEARCH F:SPELL_CONTAIN F:SUST_INT F:WIELD_CAST diff --git a/lib/edit/ra_info.txt b/lib/edit/ra_info.txt index 4452c682..6ac58484 100644 --- a/lib/edit/ra_info.txt +++ b/lib/edit/ra_info.txt @@ -1799,7 +1799,6 @@ T:40:0:255 T:45:0:255 W:1:1:12 C:0:0:0:6 -F:SEARCH N:460 X:10:1 @@ -1881,7 +1880,6 @@ X:12:1 T:39:0:255 W:1:1:10 C:0:0:0:4 -F:SEARCH N:508 X:12:1 diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt index 65e931c1..5d2e4bdf 100644 --- a/lib/mods/theme/edit/a_info.txt +++ b/lib/mods/theme/edit/a_info.txt @@ -38,7 +38,6 @@ F:HIDE_TYPE F:INSTA_ART F:LITE3 F:LUCK -F:SEARCH a:LIGHT D:A small crystal phial, with the light of Earendil's Star contained inside. D:Its light is imperishable, and near it darkness cannot endure. @@ -121,7 +120,6 @@ F:INT F:RES_ACID F:RES_COLD F:RES_ELEC -F:SEARCH F:SEE_INVIS F:WIS a:DISP_EVIL @@ -203,7 +201,6 @@ F:INSTA_ART F:INT F:RES_DARK F:RES_POIS -F:SEARCH F:SEE_INVIS F:STEALTH F:STR @@ -682,7 +679,6 @@ F:HIDE_TYPE F:INFRA F:LITE2 F:LITE3 -F:SEARCH a:SUNLIGHT D:The shining helm that Gil-galad, legendary Elven-king, wore in battle. @@ -742,7 +738,6 @@ F:HIDE_TYPE F:INT F:RES_DARK F:RES_LITE -F:SEARCH F:SPEED F:STEALTH Z:panic hit @@ -991,7 +986,6 @@ F:ACTIVATE F:HIDE_TYPE F:INT F:RES_BLIND -F:SEARCH F:SEE_INVIS F:WIS a:DETECT_ALL @@ -1019,7 +1013,6 @@ F:RES_DISEN F:RES_FEAR F:RES_FIRE F:RES_POIS -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:TELEPORT @@ -1080,7 +1073,6 @@ F:RES_DARK F:RES_LITE F:RES_SHARDS F:RES_SOUND -F:SEARCH F:SEE_INVIS F:SPEED D:A crown of massive gold, set with wondrous jewels of thought and warding, @@ -1505,7 +1497,6 @@ F:FREE_ACT F:HIDE_TYPE F:LUCK F:RES_DARK -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_EVIL @@ -1684,7 +1675,6 @@ F:LITE1 F:RANDOM_RES_OR_POWER F:RES_FIRE F:RES_LITE -F:SEARCH F:SHOW_MODS F:SLAY_DEMON F:SLAY_EVIL @@ -1729,7 +1719,6 @@ F:RANDOM_RES_OR_POWER F:RES_COLD F:RES_COLD F:RES_DARK -F:SEARCH F:SHOW_MODS F:SLAY_DRAGON F:SLAY_EVIL @@ -2305,7 +2294,6 @@ F:INT F:RES_FEAR F:RES_FIRE F:RES_LITE -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_DEMON @@ -2488,7 +2476,6 @@ F:RES_COLD F:RES_ELEC F:RES_FEAR F:RES_FIRE -F:SEARCH F:SHOW_MODS F:SLAY_EVIL F:SLAY_GIANT @@ -2842,7 +2829,6 @@ F:INT F:RANDOM_POWER F:RES_FIRE F:RES_NETHER -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_EVIL @@ -3086,7 +3072,6 @@ F:INT F:RES_ACID F:RES_COLD F:RES_ELEC -F:SEARCH F:SEE_INVIS F:SPELL_CONTAIN F:SUST_INT @@ -3311,7 +3296,6 @@ F:ACTIVATE F:INFRA F:RES_DARK F:RES_POIS -F:SEARCH F:STEALTH a:DRUEDAIN D:The fabled Drum of the Druedain that will protect those who play it @@ -3471,7 +3455,6 @@ P:0:0d0:20:0:0 F:ACTIVATE F:HIDE_TYPE F:INFRA -F:SEARCH F:SHOW_MODS F:SPECIAL_GENE F:XTRA_SHOTS @@ -3641,7 +3624,6 @@ F:ACTIVATE F:COULD2H F:DEX F:HIDE_TYPE -F:SEARCH F:SHOW_MODS F:SLAY_ORC f:COULD2H @@ -3820,7 +3802,6 @@ F:RES_COLD F:RES_DARK F:RES_ELEC F:RES_FIRE -F:SEARCH F:STEALTH D:Familiar with the secret ways hidden in darkness, this leather cuirass is D:truly more than it appears. @@ -3842,7 +3823,6 @@ F:RES_ACID F:RES_DARK F:RES_DISEN F:RES_ELEC -F:SEARCH F:SUST_CHR F:SUST_DEX F:SUST_WIS @@ -3866,7 +3846,6 @@ F:RES_ACID F:RES_DISEN F:RES_FIRE F:RES_SHARDS -F:SEARCH F:SPELL a:CELEBRIMBOR D:This once belonged to Celebrimbor, maker of the Rings of Power. One who @@ -3956,7 +3935,6 @@ F:INFRA F:RES_ACID F:RES_DARK F:RES_DISEN -F:SEARCH F:SLAY_DRAGON F:SLAY_GIANT F:SLAY_ORC @@ -4090,7 +4068,6 @@ P:4:1d1:5:5:10 F:CLIMB F:HIDE_TYPE F:INFRA -F:SEARCH F:TUNNEL Z:magic map D:A set of iron-shod boots stamped by Gimli's combat prowess, a peerless @@ -4168,7 +4145,6 @@ F:DEX F:HIDE_TYPE F:INVIS F:LUCK -F:SEARCH F:STEALTH a:CURE_HUNGER D:This simple-looking cloak, dyed in hues that blend into the woodlands, was a gift @@ -4194,7 +4170,6 @@ F:LIFE F:LUCK F:RES_FEAR F:RES_SOUND -F:SEARCH F:SEE_INVIS F:STEALTH F:SUST_CHR @@ -4224,7 +4199,6 @@ F:RES_COLD F:RES_ELEC F:RES_FIRE F:RES_MORGUL -F:SEARCH F:SEE_INVIS F:SHOW_MODS F:SLAY_ANIMAL @@ -4262,7 +4236,6 @@ F:LUCK F:RES_CONF F:RES_FEAR F:RES_SOUND -F:SEARCH F:SEE_INVIS F:STEALTH a:VALAROMA @@ -4290,7 +4263,6 @@ F:MAGIC_BREATH F:RES_COLD F:RES_DARK F:RES_LITE -F:SEARCH F:SEE_INVIS F:SUST_CHR a:GILGALAD @@ -4438,7 +4410,6 @@ F:HIDE_TYPE F:INFRA F:INSTA_ART F:LITE3 -F:SEARCH Z:dazzle D:It was a gift from the Falas-Elves to the Naugrim who built Menegroth, D:the abode of Thingol and Melian. It shines like starlight on the waves @@ -4578,7 +4549,6 @@ F:LITE2 F:LITE3 F:RES_BLIND F:RES_LITE -F:SEARCH F:SEE_INVIS F:WATER_BREATH F:WIS @@ -4617,7 +4587,6 @@ F:INSTA_ART F:INT F:LITE2 F:RES_BLIND -F:SEARCH F:SEE_INVIS F:WIS a:PALANTIR @@ -5010,7 +4979,6 @@ F:LITE1 F:LUCK F:RES_BLIND F:RES_DARK -F:SEARCH F:STEALTH F:WATER_BREATH D:This pearl-trimmed blue robe was created by a Maia loremaster in diff --git a/lib/mods/theme/edit/e_info.txt b/lib/mods/theme/edit/e_info.txt index 9fe63b5d..6361c33e 100644 --- a/lib/mods/theme/edit/e_info.txt +++ b/lib/mods/theme/edit/e_info.txt @@ -491,9 +491,7 @@ T:33:0:99 T:115:57:57 R:100 F:RES_BLIND -F:SEARCH F:SEE_INVIS -f:SEARCH R:20 F:ESP_ALL @@ -1486,7 +1484,6 @@ F:FREE_ACT F:KILL_DRAGON F:REGEN F:RES_MORGUL -F:SEARCH F:SLAY_EVIL F:SLOW_DIGEST F:TELEPORT @@ -2330,7 +2327,6 @@ F:FEATHER F:FREE_ACT F:HIDE_TYPE F:IGNORE_ACID -F:SEARCH F:SHOW_MODS R:10 F:SPEED @@ -2545,8 +2541,6 @@ r:F:HEAVY_CURSE T:30:2:3 Z:panic hit R:100 -F:SEARCH -f:SEARCH R:50 F:STEALTH f:STEALTH diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index 30700595..ed99d177 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -1003,7 +1003,6 @@ F:IGNORE_COLD F:IGNORE_ELEC F:IGNORE_FIRE F:LUCK -F:SEARCH F:STEALTH f:STEALTH D:A wonderfully light cloak coloured in brown and green hues. Its colouring @@ -1449,16 +1448,6 @@ F:SPEED f:SPEED D:This wonderful ring grants you additional energy, allowing you to act faster. -N:137:Searching -G:=:d -I:45:23:0 -W:5:0:2:250 -A:5/1 -F:HIDE_TYPE -F:SEARCH -f:SEARCH -D:This ring magically improves your attention, so you can detect hidden things better. - # New : It can be activated but at the cost of its destruction N:138:Teleportation G:=:d @@ -1679,16 +1668,6 @@ F:HIDE_TYPE f:CHR D:This amulet grants beauty beyond mere looks. -N:165:Searching -G:":d -I:40:5:0 -W:15:0:3:600 -A:15/1 -F:HIDE_TYPE -F:SEARCH -f:SEARCH -D:This amulet grants keen sight, finding things that are hidden. - N:166:Teleportation G:":d I:40:1:0 @@ -1742,7 +1721,6 @@ F:IGNORE_FIRE F:INT F:RES_BLIND F:RES_CONF -F:SEARCH F:SPELL_CONTAIN F:SUST_INT F:WIELD_CAST diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 5cf09fea..dca8ff4b 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -2172,27 +2172,22 @@ S:R:5:0 S:F:ESP_ANIMAL S:R:10:1 S:F:ESP_ORC -S:F:SEARCH S:R:15:0 S:F:ESP_TROLL S:R:20:1 S:F:ESP_DRAGON -S:F:SEARCH S:R:25:0 S:F:ESP_UNDEAD S:R:30:1 S:F:ESP_NONLIVING -S:F:SEARCH S:R:35:0 S:F:ESP_EVIL S:R:40:1 S:F:ESP_GOOD -S:F:SEARCH S:R:45:0 S:F:ESP_DEMON S:R:50:1 S:F:ESP_ALL -S:F:SEARCH S:Z:smell monsters S:Z:smell metal R:k:+500:+300:Stealth @@ -2284,27 +2279,22 @@ S:R:4:0 S:F:ESP_ANIMAL S:R:8:1 S:F:ESP_ORC -S:F:SEARCH S:R:12:0 S:F:ESP_TROLL S:R:16:1 S:F:ESP_DRAGON -S:F:SEARCH S:R:20:0 S:F:ESP_UNDEAD S:R:24:1 S:F:ESP_NONLIVING -S:F:SEARCH S:R:28:0 S:F:ESP_EVIL S:R:32:1 S:F:ESP_GOOD -S:F:SEARCH S:R:36:0 S:F:ESP_DEMON S:R:40:1 S:F:ESP_ALL -S:F:SEARCH S:R:50:0 S:F:PRECOGNITION S:Z:smell monsters diff --git a/lib/mods/theme/edit/ra_info.txt b/lib/mods/theme/edit/ra_info.txt index bbf28db3..5add55b4 100644 --- a/lib/mods/theme/edit/ra_info.txt +++ b/lib/mods/theme/edit/ra_info.txt @@ -1799,7 +1799,6 @@ T:40:0:255 T:45:0:255 W:1:1:12 C:0:0:0:6 -F:SEARCH N:460 X:10:1 @@ -1881,7 +1880,6 @@ X:12:1 T:39:0:255 W:1:1:10 C:0:0:0:4 -F:SEARCH N:508 X:12:1 diff --git a/lib/mods/theme/edit/set_info.txt b/lib/mods/theme/edit/set_info.txt index 716bf66d..182618d4 100644 --- a/lib/mods/theme/edit/set_info.txt +++ b/lib/mods/theme/edit/set_info.txt @@ -220,7 +220,6 @@ D:It is one of two items rumoured to defy the Shadow. # The Soft Leather Armour 'Hithlomir' P:168:2:2 F:RES_BLIND -F:SEARCH # The Set of Leather Gloves 'Cammithrim' P:53:2:2 F:DEX diff --git a/src/defines.h b/src/defines.h index 7da8e038..1cd16b89 100644 --- a/src/defines.h +++ b/src/defines.h @@ -1207,7 +1207,6 @@ #define SV_AMULET_ADORNMENT 2 #define SV_AMULET_SLOW_DIGEST 3 #define SV_AMULET_RESIST_ACID 4 -#define SV_AMULET_SEARCHING 5 #define SV_AMULET_BRILLANCE 6 #define SV_AMULET_CHARISMA 7 #define SV_AMULET_THE_MAGI 8 @@ -1258,7 +1257,6 @@ #define SV_RING_RESIST_POIS 20 #define SV_RING_FREE_ACTION 21 #define SV_RING_SEE_INVIS 22 -#define SV_RING_SEARCHING 23 #define SV_RING_STR 24 #define SV_RING_INT 25 #define SV_RING_DEX 26 diff --git a/src/object1.cc b/src/object1.cc index 1eb9b484..ad82f20f 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1950,12 +1950,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) t += " to stealth"; } - /* Search */ - else if (flags & TR_SEARCH) - { - t += " to searching"; - } - /* Infravision */ else if (flags & TR_INFRA) { @@ -2667,7 +2661,6 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (flags & TR_DEX) vp[vn++] = "dexterity"; if (flags & TR_CON) vp[vn++] = "constitution"; if (flags & TR_CHR) vp[vn++] = "charisma"; - if (flags & TR_SEARCH) vp[vn++] = "searching"; if (flags & TR_INFRA) vp[vn++] = "infravision"; if (flags & TR_TUNNEL) vp[vn++] = "ability to tunnel"; if (flags & TR_SPEED) vp[vn++] = "speed"; diff --git a/src/object2.cc b/src/object2.cc index 6a584ffc..95fcf041 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -874,7 +874,6 @@ s32b flag_cost(object_type const *o_ptr, int plusses) if (flags & TR_CHAOTIC) total += 10000; if (flags & TR_VAMPIRIC) total += 13000; if (flags & TR_STEALTH) total += (250 * plusses); - if (flags & TR_SEARCH) total += (100 * plusses); if (flags & TR_INFRA) total += (150 * plusses); if (flags & TR_TUNNEL) total += (175 * plusses); if ((flags & TR_SPEED) && (plusses > 0)) @@ -1201,7 +1200,6 @@ s32b object_value_real(object_type const *o_ptr) /* Give credit for stealth and searching */ if (flags & TR_STEALTH) value += (o_ptr->pval * 100L); - if (flags & TR_SEARCH) value += (o_ptr->pval * 100L); /* Give credit for infra-vision and tunneling */ if (flags & TR_INFRA) value += (o_ptr->pval * 50L); @@ -2896,25 +2894,6 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) } break; - /* Searching */ - case SV_RING_SEARCHING: - { - /* Bonus to searching */ - o_ptr->pval = 1 + m_bonus(5, level); - - /* Cursed */ - if (power < 0) - { - /* Cursed */ - o_ptr->ident |= (IDENT_CURSED); - - /* Reverse pval */ - o_ptr->pval = 0 - (o_ptr->pval); - } - - break; - } - /* Flames, Acid, Ice */ case SV_RING_FLAMES: case SV_RING_ACID: @@ -3124,24 +3103,6 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power) } break; - /* Amulet of searching */ - case SV_AMULET_SEARCHING: - { - o_ptr->pval = randint(5) + m_bonus(5, level); - - /* Cursed */ - if (power < 0) - { - /* Cursed */ - o_ptr->ident |= (IDENT_CURSED); - - /* Reverse bonuses */ - o_ptr->pval = 0 - (o_ptr->pval); - } - - break; - } - /* Amulet of the Magi -- never cursed */ case SV_AMULET_THE_MAGI: { @@ -3770,24 +3731,21 @@ void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *li { /* Add a random pval-affected ability */ /* This might cause boots with + to blows */ - switch (randint(6)) + switch (randint(5)) { case 1: o_ptr->art_flags |= TR_STEALTH; break; case 2: - o_ptr->art_flags |= TR_SEARCH; - break; - case 3: o_ptr->art_flags |= TR_INFRA; break; - case 4: + case 3: o_ptr->art_flags |= TR_TUNNEL; break; - case 5: + case 4: o_ptr->art_flags |= TR_SPEED; break; - case 6: + case 5: o_ptr->art_flags |= TR_BLOWS; break; } diff --git a/src/object_flag_list.hpp b/src/object_flag_list.hpp index 696b590c..a7aef7d4 100644 --- a/src/object_flag_list.hpp +++ b/src/object_flag_list.hpp @@ -30,13 +30,12 @@ TR(1, 5, TR_CHR , CHR , "Add Chr" , 0, 0, 5, TR(1, 6, TR_MANA , MANA , "Mul Mana" , 0, 0, 6, BINARY , 0, false, false) TR(1, 7, TR_SPELL , SPELL , "Mul SPower", 0, 0, 7, BINARY , 0, true , false) TR(1, 8, TR_STEALTH , STEALTH , "Add Stea." , 0, 0, 8, NUMERIC , 0, true , false) -TR(1, 9, TR_SEARCH , SEARCH , "Add Sear." , 0, 0, 9, NUMERIC , 0, true , false) -TR(1, 10, TR_INFRA , INFRA , "Add Infra" , 0, 0, 10, NUMERIC , 0, true , false) -TR(1, 11, TR_TUNNEL , TUNNEL , "Add Tun.." , 0, 0, 11, NUMERIC , 0, true , false) -TR(1, 12, TR_SPEED , SPEED , "Add Speed" , 0, 0, 12, NUMERIC , 0, true , false) -TR(1, 13, TR_BLOWS , BLOWS , "Add Blows" , 0, 0, 13, NUMERIC , 0, true , false) -TR(1, 14, TR_CHAOTIC , CHAOTIC , "Chaotic" , 0, 0, 14, BINARY , 0, false, false) -TR(1, 15, TR_VAMPIRIC , VAMPIRIC , "Vampiric" , 0, 0, 15, BINARY , 0, false, false) +TR(1, 10, TR_INFRA , INFRA , "Add Infra" , 0, 0, 9, NUMERIC , 0, true , false) +TR(1, 11, TR_TUNNEL , TUNNEL , "Add Tun.." , 0, 0, 10, NUMERIC , 0, true , false) +TR(1, 12, TR_SPEED , SPEED , "Add Speed" , 0, 0, 11, NUMERIC , 0, true , false) +TR(1, 13, TR_BLOWS , BLOWS , "Add Blows" , 0, 0, 12, NUMERIC , 0, true , false) +TR(1, 14, TR_CHAOTIC , CHAOTIC , "Chaotic" , 0, 0, 13, BINARY , 0, false, false) +TR(1, 15, TR_VAMPIRIC , VAMPIRIC , "Vampiric" , 0, 0, 14, BINARY , 0, false, false) TR(1, 16, TR_SLAY_ANIMAL , SLAY_ANIMAL , "Slay Anim.", 0, 1, 0, BINARY , 0, false, false) TR(1, 17, TR_SLAY_EVIL , SLAY_EVIL , "Slay Evil" , 0, 1, 1, BINARY , 0, false, false) TR(1, 18, TR_SLAY_UNDEAD , SLAY_UNDEAD , "Slay Und." , 0, 1, 2, BINARY , 0, false, false) diff --git a/src/q_wight.cc b/src/q_wight.cc index 01272aea..f635ed29 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -78,7 +78,6 @@ static bool_ quest_wight_gen_hook(void *, void *, void *) q_ptr->art_flags |= TR_INT | - TR_SEARCH | TR_RES_BLIND | TR_SENS_FIRE | TR_RES_CONF | diff --git a/src/spells2.cc b/src/spells2.cc index fdf8cd27..2eb8889b 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -1596,10 +1596,6 @@ void self_knowledge(FILE *fff) { info[i++] = "Your stealth is affected by your equipment."; } - if (flags & TR_SEARCH) - { - info[i++] = "Your searching ability is affected by your equipment."; - } if (flags & TR_INFRA) { info[i++] = "Your infravision is affected by your equipment."; diff --git a/src/tables.cc b/src/tables.cc index e2eb5ff1..b091d764 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2393,7 +2393,7 @@ extern std::vector const &flags_groups() "Mind", TERM_YELLOW, 7, - TR_INT | TR_SEARCH | TR_SUST_INT | TR_RES_CONF | TR_RES_FEAR | + TR_INT | TR_SUST_INT | TR_RES_CONF | TR_RES_FEAR | ESP_ORC | ESP_TROLL | ESP_GIANT | ESP_ANIMAL | ESP_UNIQUE | ESP_SPIDER | ESP_DEMON, }, flags_group { -- cgit v1.2.3 From e50b345d5c7371432ea29b121edef970e74f7f64 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 16 Oct 2016 12:28:53 +0200 Subject: Remove "defines.txt" It's a maintenance nightmare -- which all but guarantees that it won't be maintained -- and of very limited value anyway. It's also an annoyance when cleaning up code dealing with items. --- lib/help/automat.txt | 5 +- lib/help/defines.txt | 615 ---------------------------------------- lib/help/index.txt | 6 - lib/mods/theme/help/automat.txt | 5 +- lib/mods/theme/help/defines.txt | 615 ---------------------------------------- lib/mods/theme/help/index.txt | 6 - 6 files changed, 4 insertions(+), 1248 deletions(-) delete mode 100644 lib/help/defines.txt delete mode 100644 lib/mods/theme/help/defines.txt diff --git a/lib/help/automat.txt b/lib/help/automat.txt index 0ba56d19..c09630a5 100644 --- a/lib/help/automat.txt +++ b/lib/help/automat.txt @@ -249,9 +249,8 @@ instead of 23 you could write TV_SWORD. #####GAh that would be better. But where can I find out what all the names, and #####Gnumbers of tvalues are? -Well I've written a *****defines.txt*0[file] which lists tvalues and one which lists svalues for you -to check on, and you may want to check the objects entry in k_info.txt in your -lib/edit directory. If you look at the entry for dagger you'll see: +Have a look at the object entry in k_info.txt in your lib/edit directory. If you +check the entry for dagger you'll see: N:43:& Dagger~ G:|:W diff --git a/lib/help/defines.txt b/lib/help/defines.txt deleted file mode 100644 index 5093d994..00000000 --- a/lib/help/defines.txt +++ /dev/null @@ -1,615 +0,0 @@ -|||||oy -~~~~~81|Defines -~~~~~85|Defines|Tvals -~~~~~82|Automatizer|Defines -~~~~~83|Tvals -#####R /----------------------------------------\ -#####R < Tvals and svals > -#####R \----------------------------------------/ - -Some objects don't have svals as such. Spellbooks, wands, and staves for -instance don't have svalues as they are defined in lua. - -TV_SKELETON 1 /* Skeletons ('s') */ -TV_BOTTLE 2 /* Empty bottles ('!') */ -TV_SPIKE 5 /* Spikes ('~') */ -TV_MSTAFF 6 /* Mage Staffs */ -TV_CHEST 7 /* Chests ('~') */ -TV_PARCHMENT 8 /* Parchments from Kamband */ -*****defines.txt*09[TV_CORPSE] 9 /* Monster corpses */ -TV_EGG 10 /* Monster Eggs */ -TV_JUNK 11 /* Sticks, Pottery, etc ('~') */ -*****defines.txt*12[TV_TOOL] 12 /* Tools */ -*****defines.txt*14[TV_INSTRUMENT] 14 /* Musical instruments */ -*****defines.txt*15[TV_BOOMERANG] 15 /* Boomerangs */ -*****defines.txt*16[TV_SHOT] 16 /* Ammo for slings */ -*****defines.txt*16[TV_ARROW] 17 /* Ammo for bows */ -*****defines.txt*16[TV_BOLT] 18 /* Ammo for x-bows */ -*****defines.txt*19[TV_BOW] 19 /* Slings/Bows/Xbows */ -*****defines.txt*20[TV_DIGGING] 20 /* Shovels/Picks */ -*****defines.txt*21[TV_HAFTED] 21 /* Priest Weapons */ -*****defines.txt*22[TV_POLEARM] 22 /* Pikes/Glaives/Spears/etc. */ -*****defines.txt*23[TV_SWORD] 23 /* Edged Weapons */ -*****defines.txt*24[TV_AXE] 24 /* Axes/Cleavers */ -*****defines.txt*30[TV_BOOTS] 30 /* Boots */ -*****defines.txt*31[TV_GLOVES] 31 /* Gloves */ -*****defines.txt*32[TV_HELM] 32 /* Helms */ -*****defines.txt*32[TV_CROWN] 33 /* Crowns */ -*****defines.txt*34[TV_SHIELD] 34 /* Shields */ -*****defines.txt*35[TV_CLOAK] 35 /* Cloaks */ -*****defines.txt*36[TV_SOFT_ARMOR] 36 /* Soft Armor */ -*****defines.txt*37[TV_HARD_ARMOR] 37 /* Hard Armor */ -*****defines.txt*38[TV_DRAG_ARMOR] 38 /* Dragon Scale Mail */ -*****defines.txt*39[TV_LITE] 39 /* Lites (including Specials) */ -*****defines.txt*40[TV_AMULET] 40 /* Amulets (including Specials) */ -*****defines.txt*45[TV_RING] 45 /* Rings (including Specials) */ -*****defines.txt*46[TV_TRAPKIT] 46 /* Trapkits */ -TV_TOTEM 54 /* Summoner totems */ -*****defines.txt*55[TV_STAFF] 55 /* Staffs */ -*****defines.txt*65[TV_WAND] 65 /* Wands */ -*****defines.txt*66[TV_ROD] 66 /* Rod tips */ -*****defines.txt*67[TV_ROD_MAIN] 67 /* Rod body's */ -*****defines.txt*70[TV_SCROLL] 70 /* Scrolls */ -*****defines.txt*71[TV_POTION] 71 /* potions */ -*****defines.txt*72[TV_POTION2] 72 /* Second set of potion */ -TV_FLASK 77 /* Flasks of oil */ -*****defines.txt*80[TV_FOOD] 80 /* Food, including mushrooms */ -TV_HYPNOS 99 /* To wield monsters !:) */ -TV_GOLD 100 /* Gold can only be picked up by players */ -TV_RANDART 102 /* Random Artifacts */ -TV_RUNE1 104 /* Base runes */ -TV_RUNE2 105 /* Modifier runes */ -TV_BOOK 111 /* spell books */ -*****defines.txt*115[TV_DAEMON_BOOK] 115 /* Demon blades, shields and horns */ -~~~~~84|Defines|Svals -~~~~~12|Svals -/* The "sval" codes for TV_TOOL */ - SV_TOOL_CLIMB 0 -~~~~~16 -/* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */ - SV_AMMO_LIGHT 0 /* pebbles */ - SV_AMMO_NORMAL 1 /* shots, arrows, bolts */ - SV_AMMO_HEAVY 2 /* seeker arrows and bolts, mithril shots */ -~~~~~14 -/* The "sval" codes for TV_INSTRUMENT */ - SV_FLUTE 1 - SV_BANJO 2 - SV_LUTE 3 - SV_MANDOLIN 4 - SV_DRUM 5 - SV_HARP 6 - SV_HORN 7 -~~~~~46 -/* The "sval" codes for TV_TRAPKIT */ - SV_TRAPKIT_SLING 1 - SV_TRAPKIT_BOW 2 - SV_TRAPKIT_XBOW 3 - SV_TRAPKIT_POTION 4 - SV_TRAPKIT_SCROLL 5 - SV_TRAPKIT_DEVICE 6 -~~~~~15 -/* The "sval" codes for TV_BOOMERANG */ - SV_BOOM_S_WOOD 1 /* 1d4 */ - SV_BOOM_WOOD 2 /* 1d9 */ - SV_BOOM_S_METAL 3 /* 1d8 */ - SV_BOOM_METAL 4 /* 2d4 */ -~~~~~19 -/* The "sval" codes for TV_BOW (note information in "sval") */ - SV_SLING 2 /* (x2) */ - SV_SHORT_BOW 12 /* (x2) */ - SV_LONG_BOW 13 /* (x3) */ - SV_LIGHT_XBOW 23 /* (x3) */ - SV_HEAVY_XBOW 24 /* (x4) */ -~~~~~20 -/* The "sval" codes for TV_DIGGING */ - SV_SHOVEL 1 - SV_GNOMISH_SHOVEL 2 - SV_DWARVEN_SHOVEL 3 - SV_PICK 4 - SV_ORCISH_PICK 5 - SV_DWARVEN_PICK 6 - SV_MATTOCK 7 -~~~~~21 -/* The "sval" values for TV_HAFTED */ - SV_CLUB 1 /* 1d4 */ - SV_WHIP 2 /* 1d6 */ - SV_QUARTERSTAFF 3 /* 1d9 */ - SV_NUNCHAKU 4 /* 2d3 */ - SV_MACE 5 /* 2d4 */ - SV_BALL_AND_CHAIN 6 /* 2d4 */ - SV_WAR_HAMMER 8 /* 3d3 */ - SV_LUCERN_HAMMER 10 /* 2d5 */ - SV_THREE_PIECE_ROD 11 /* 3d3 */ - SV_MORNING_STAR 12 /* 2d6 */ - SV_FLAIL 13 /* 2d6 */ - SV_LEAD_FILLED_MACE 15 /* 3d4 */ - SV_TWO_HANDED_FLAIL 18 /* 3d6 */ - SV_GREAT_HAMMER 19 /* 4d6 */ - SV_MACE_OF_DISRUPTION 20 /* 5d8 */ - SV_GROND 50 /* 3d4 */ -~~~~~24 -/* The "sval" values for TV_AXE */ - SV_HATCHET 1 /* 1d5 */ - SV_CLEAVER 2 /* 2d4 */ - SV_LIGHT_WAR_AXE 8 /* 2d5 */ - SV_BEAKED_AXE 10 /* 2d6 */ - SV_BROAD_AXE 11 /* 2d6 */ - SV_BATTLE_AXE 22 /* 2d8 */ - SV_GREAT_AXE 25 /* 4d4 */ - SV_LOCHABER_AXE 28 /* 3d8 */ - SV_SLAUGHTER_AXE 30 /* 5d7 */ -~~~~~22 -/* The "sval" values for TV_POLEARM */ - SV_SPEAR 2 /* 1d6 */ - SV_SICKLE 3 /* 2d3 */ - SV_AWL_PIKE 4 /* 1d8 */ - SV_TRIDENT 5 /* 1d9 */ - SV_FAUCHARD 6 /* 1d10 */ - SV_BROAD_SPEAR 7 /* 1d9 */ - SV_PIKE 8 /* 2d5 */ - SV_GLAIVE 13 /* 2d6 */ - SV_HALBERD 15 /* 3d4 */ - SV_GUISARME 16 /* 2d5 */ - SV_SCYTHE 17 /* 5d3 */ - SV_LANCE 20 /* 2d8 */ - SV_TRIFURCATE_SPEAR 26 /* 2d9 */ - SV_HEAVY_LANCE 29 /* 4d8 */ - SV_SCYTHE_OF_SLICING 30 /* 8d4 */ -~~~~~23 -/* The "sval" codes for TV_SWORD */ - SV_BROKEN_DAGGER 1 /* 1d1 */ - SV_BROKEN_SWORD 2 /* 1d2 */ - SV_DAGGER 4 /* 1d4 */ - SV_MAIN_GAUCHE 5 /* 1d5 */ - SV_RAPIER 7 /* 1d6 */ - SV_SMALL_SWORD 8 /* 1d6 */ - SV_BASILLARD 9 /* 1d8 */ - SV_SHORT_SWORD 10 /* 1d7 */ - SV_SABRE 11 /* 1d7 */ - SV_CUTLASS 12 /* 1d7 */ - SV_KHOPESH 14 /* 2d4 */ - SV_TULWAR 15 /* 2d4 */ - SV_BROAD_SWORD 16 /* 2d5 */ - SV_LONG_SWORD 17 /* 2d5 */ - SV_SCIMITAR 18 /* 2d5 */ - SV_KATANA 20 /* 3d4 */ - SV_BASTARD_SWORD 21 /* 3d4 */ - SV_GREAT_SCIMITAR 22 /* 4d5 */ - SV_CLAYMORE 23 /* 2d8 */ - SV_ESPADON 24 /* 2d9 */ - SV_TWO_HANDED_SWORD 25 /* 3d6 */ - SV_FLAMBERGE 26 /* 3d7 */ - SV_EXECUTIONERS_SWORD 28 /* 4d5 */ - SV_ZWEIHANDER 29 /* 4d6 */ - SV_BLADE_OF_CHAOS 30 /* 6d5 */ - SV_SHADOW_BLADE 31 /* 4d4 */ - SV_BLUESTEEL_BLADE 32 /* 3d9 */ - SV_DARK_SWORD 33 /* 3d7 */ -~~~~~34 -/* The "sval" codes for TV_SHIELD */ - SV_SMALL_LEATHER_SHIELD 2 - SV_SMALL_METAL_SHIELD 3 - SV_LARGE_LEATHER_SHIELD 4 - SV_LARGE_METAL_SHIELD 5 - SV_DRAGON_SHIELD 6 - SV_SHIELD_OF_DEFLECTION 10 -~~~~~32 -/* The "sval" codes for TV_HELM */ - SV_HARD_LEATHER_CAP 2 - SV_METAL_CAP 3 - SV_IRON_HELM 5 - SV_STEEL_HELM 6 - SV_DRAGON_HELM 7 - SV_IRON_CROWN 10 - SV_GOLDEN_CROWN 11 - SV_JEWELED_CROWN 12 - SV_MORGOTH 50 -~~~~~30 -/* The "sval" codes for TV_BOOTS */ - SV_PAIR_OF_SOFT_LEATHER_BOOTS 2 - SV_PAIR_OF_HARD_LEATHER_BOOTS 3 - SV_PAIR_OF_METAL_SHOD_BOOTS 6 -~~~~~35 -/* The "sval" codes for TV_CLOAK */ - SV_CLOAK 1 - SV_ELVEN_CLOAK 2 - SV_FUR_CLOAK 3 - SV_SHADOW_CLOAK 6 -~~~~~31 -/* The "sval" codes for TV_GLOVES */ - SV_SET_OF_LEATHER_GLOVES 1 - SV_SET_OF_GAUNTLETS 2 - SV_SET_OF_CESTI 5 -~~~~~36 -/* The "sval" codes for TV_SOFT_ARMOR */ - SV_FILTHY_RAG 1 - SV_ROBE 2 - SV_PAPER_ARMOR 3 /* 4 */ - SV_SOFT_LEATHER_ARMOR 4 - SV_SOFT_STUDDED_LEATHER 5 - SV_HARD_LEATHER_ARMOR 6 - SV_HARD_STUDDED_LEATHER 7 - SV_RHINO_HIDE_ARMOR 8 - SV_CORD_ARMOR 9 /* 6 */ - SV_PADDED_ARMOR 10 /* 4 */ - SV_LEATHER_SCALE_MAIL 11 - SV_LEATHER_JACK 12 - SV_STONE_AND_HIDE_ARMOR 15 /* 15 */ - SV_THUNDERLORD_SUIT 16 -~~~~~37 -/* The "sval" codes for TV_HARD_ARMOR */ - SV_RUSTY_CHAIN_MAIL 1 /* 14- */ - SV_RING_MAIL 2 /* 12 */ - SV_METAL_SCALE_MAIL 3 /* 13 */ - SV_CHAIN_MAIL 4 /* 14 */ - SV_DOUBLE_RING_MAIL 5 /* 15 */ - SV_AUGMENTED_CHAIN_MAIL 6 /* 16 */ - SV_DOUBLE_CHAIN_MAIL 7 /* 16 */ - SV_BAR_CHAIN_MAIL 8 /* 18 */ - SV_METAL_BRIGANDINE_ARMOUR 9 /* 19 */ - SV_SPLINT_MAIL 10 /* 19 */ - SV_PARTIAL_PLATE_ARMOUR 12 /* 22 */ - SV_METAL_LAMELLAR_ARMOUR 13 /* 23 */ - SV_FULL_PLATE_ARMOUR 15 /* 25 */ - SV_RIBBED_PLATE_ARMOUR 18 /* 28 */ - SV_MITHRIL_CHAIN_MAIL 20 /* 28+ */ - SV_MITHRIL_PLATE_MAIL 25 /* 35+ */ - SV_ADAMANTITE_PLATE_MAIL 30 /* 40+ */ -~~~~~38 -/* The "sval" codes for TV_DRAG_ARMOR */ - SV_DRAGON_BLACK 1 - SV_DRAGON_BLUE 2 - SV_DRAGON_WHITE 3 - SV_DRAGON_RED 4 - SV_DRAGON_GREEN 5 - SV_DRAGON_MULTIHUED 6 - SV_DRAGON_SHINING 10 - SV_DRAGON_LAW 12 - SV_DRAGON_BRONZE 14 - SV_DRAGON_GOLD 16 - SV_DRAGON_CHAOS 18 - SV_DRAGON_BALANCE 20 - SV_DRAGON_POWER 30 -~~~~~39 -/* The sval codes for TV_LITE */ - SV_LITE_TORCH 0 - SV_LITE_LANTERN 1 - SV_LITE_TORCH_EVER 2 - SV_LITE_DWARVEN 3 - SV_LITE_FEANORIAN 4 - SV_LITE_GALADRIEL 100 - SV_LITE_ELENDIL 101 - SV_LITE_THRAIN 102 - SV_LITE_UNDEATH 103 - SV_LITE_PALANTIR 104 - SV_ANCHOR_SPACETIME 105 - SV_STONE_LORE 106 -~~~~~40 -/* The "sval" codes for TV_AMULET */ - SV_AMULET_DOOM 0 - SV_AMULET_TELEPORT 1 - SV_AMULET_ADORNMENT 2 - SV_AMULET_SLOW_DIGEST 3 - SV_AMULET_RESIST_ACID 4 - SV_AMULET_SEARCHING 5 - SV_AMULET_BRILLANCE 6 - SV_AMULET_CHARISMA 7 - SV_AMULET_THE_MAGI 8 - SV_AMULET_REFLECTION 9 - SV_AMULET_CARLAMMAS 10 - SV_AMULET_INGWE 11 - SV_AMULET_DWARVES 12 - SV_AMULET_NO_MAGIC 13 - SV_AMULET_NO_TELE 14 - SV_AMULET_RESISTANCE 15 - SV_AMULET_NOTHING 16 - SV_AMULET_SERPENT 17 - SV_AMULET_TORIS_MEJISTOS 18 - SV_AMULET_ELESSAR 19 - SV_AMULET_EVENSTAR 20 - SV_AMULET_SUSTENANCE 21 - SV_AMULET_TELEPATHY 22 - SV_AMULET_TRICKERY 23 - SV_AMULET_WEAPONMASTERY 24 - SV_AMULET_DEVOTION 25 - SV_AMULET_INFRA 26 - SV_AMULET_SPELL 27 - SV_AMULET_WISDOM 28 - SV_AMULET_RESIST_ELEC 29 - SV_AMULET_REGEN 30 -~~~~~45 -/* The sval codes for TV_RING */ - SV_RING_WOE 0 - SV_RING_AGGRAVATION 1 - SV_RING_WEAKNESS 2 - SV_RING_STUPIDITY 3 - SV_RING_TELEPORTATION 4 - SV_RING_SPECIAL 5 - SV_RING_SLOW_DIGESTION 6 - SV_RING_FEATHER_FALL 7 - SV_RING_RESIST_FIRE 8 - SV_RING_RESIST_COLD 9 - SV_RING_SUSTAIN_STR 10 - SV_RING_SUSTAIN_INT 11 - SV_RING_SUSTAIN_WIS 12 - SV_RING_SUSTAIN_CON 13 - SV_RING_SUSTAIN_DEX 14 - SV_RING_SUSTAIN_CHR 15 - SV_RING_PROTECTION 16 - SV_RING_ACID 17 - SV_RING_FLAMES 18 - SV_RING_ICE 19 - SV_RING_RESIST_POIS 20 - SV_RING_FREE_ACTION 21 - SV_RING_SEE_INVIS 22 - SV_RING_SEARCHING 23 - SV_RING_STR 24 - SV_RING_INT 25 - SV_RING_DEX 26 - SV_RING_CON 27 - SV_RING_ACCURACY 28 - SV_RING_DAMAGE 29 - SV_RING_SLAYING 30 - SV_RING_SPEED 31 - SV_RING_BARAHIR 32 - SV_RING_TULKAS 33 - SV_RING_NARYA 34 - SV_RING_NENYA 35 - SV_RING_VILYA 36 - SV_RING_POWER 37 - SV_RING_RES_FEAR 38 - SV_RING_RES_LD 39 - SV_RING_RES_NETHER 40 - SV_RING_RES_NEXUS 41 - SV_RING_RES_SOUND 42 - SV_RING_RES_CONFUSION 43 - SV_RING_RES_SHARDS 44 - SV_RING_RES_DISENCHANT 45 - SV_RING_RES_CHAOS 46 - SV_RING_RES_BLINDNESS 47 - SV_RING_LORDLY 48 - SV_RING_ATTACKS 49 - SV_RING_NOTHING 50 - SV_RING_PRECONITION 51 - SV_RING_FLAR 52 - SV_RING_INVIS 53 - SV_RING_FLYING 54 - SV_RING_WRAITH 55 - SV_RING_ELEC 56 - SV_RING_DURIN 57 - SV_RING_SPELL 58 - SV_RING_CRIT 59 -~~~~~55 -/* The "sval" codes for TV_STAFF */ - SV_STAFF_SCHOOL 1 - SV_STAFF_NOTHING 2 -~~~~~65 -/* The "sval" codes for TV_WAND */ - SV_WAND_SCHOOL 1 - SV_WAND_NOTHING 2 -~~~~~66 -/* The "sval" codes for TV_ROD(Rod Tips) */ - SV_ROD_NOTHING 0 - SV_ROD_DETECT_DOOR 1 - SV_ROD_IDENTIFY 2 - SV_ROD_RECALL 3 - SV_ROD_ILLUMINATION 4 - SV_ROD_MAPPING 5 - SV_ROD_DETECTION 6 - SV_ROD_CURING 8 - SV_ROD_HEALING 9 - SV_ROD_RESTORATION 10 - SV_ROD_SPEED 11 - SV_ROD_TELEPORT_AWAY 13 - SV_ROD_DISARMING 14 - SV_ROD_LITE 15 - SV_ROD_SLEEP_MONSTER 16 - SV_ROD_SLOW_MONSTER 17 - SV_ROD_DRAIN_LIFE 18 - SV_ROD_POLYMORPH 19 - SV_ROD_ACID_BOLT 20 - SV_ROD_ELEC_BOLT 21 - SV_ROD_FIRE_BOLT 22 - SV_ROD_COLD_BOLT 23 - SV_ROD_ACID_BALL 24 - SV_ROD_ELEC_BALL 25 - SV_ROD_FIRE_BALL 26 - SV_ROD_COLD_BALL 27 - SV_ROD_HAVOC 28 - SV_ROD_DETECT_TRAP 29 - SV_ROD_HOME 30 -~~~~~67 -/* The "sval" codes for TV_ROD_MAIN(Rods) */ - SV_ROD_WOODEN 10 - SV_ROD_COPPER 20 - SV_ROD_IRON 50 - SV_ROD_ALUMINIUM 75 - SV_ROD_SILVER 100 - SV_ROD_GOLDEN 125 - SV_ROD_MITHRIL 160 - SV_ROD_ADMANTITE 200 -~~~~~70 -/* The "sval" codes for TV_SCROLL */ - SV_SCROLL_DARKNESS 0 - SV_SCROLL_AGGRAVATE_MONSTER 1 - SV_SCROLL_CURSE_ARMOR 2 - SV_SCROLL_CURSE_WEAPON 3 - SV_SCROLL_SUMMON_MONSTER 4 - SV_SCROLL_SUMMON_UNDEAD 5 - SV_SCROLL_SUMMON_MINE 6 - SV_SCROLL_TRAP_CREATION 7 - SV_SCROLL_PHASE_DOOR 8 - SV_SCROLL_TELEPORT 9 - SV_SCROLL_TELEPORT_LEVEL 10 - SV_SCROLL_WORD_OF_RECALL 11 - SV_SCROLL_IDENTIFY 12 - SV_SCROLL_STAR_IDENTIFY 13 - SV_SCROLL_REMOVE_CURSE 14 - SV_SCROLL_STAR_REMOVE_CURSE 15 - SV_SCROLL_ENCHANT_ARMOR 16 - SV_SCROLL_ENCHANT_WEAPON_TO_HIT 17 - SV_SCROLL_ENCHANT_WEAPON_TO_DAM 18 - SV_SCROLL_ENCHANT_WEAPON_PVAL 19 - SV_SCROLL_STAR_ENCHANT_ARMOR 20 - SV_SCROLL_STAR_ENCHANT_WEAPON 21 - SV_SCROLL_RECHARGING 22 - SV_SCROLL_RESET_RECALL 23 - SV_SCROLL_LIGHT 24 - SV_SCROLL_MAPPING 25 - SV_SCROLL_DETECT_GOLD 26 - SV_SCROLL_DETECT_ITEM 27 - SV_SCROLL_DETECT_TRAP 28 - SV_SCROLL_DETECT_DOOR 29 - SV_SCROLL_DETECT_INVIS 30 - SV_SCROLL_DIVINATION 31 - SV_SCROLL_SATISFY_HUNGER 32 - SV_SCROLL_BLESSING 33 - SV_SCROLL_HOLY_CHANT 34 - SV_SCROLL_HOLY_PRAYER 35 - SV_SCROLL_MONSTER_CONFUSION 36 - SV_SCROLL_PROTECTION_FROM_EVIL 37 - SV_SCROLL_RUNE_OF_PROTECTION 38 - SV_SCROLL_TRAP_DOOR_DESTRUCTION 39 - SV_SCROLL_DEINCARNATION 40 - SV_SCROLL_STAR_DESTRUCTION 41 - SV_SCROLL_DISPEL_UNDEAD 42 - SV_SCROLL_MASS_RESURECTION 43 - SV_SCROLL_GENOCIDE 44 - SV_SCROLL_MASS_GENOCIDE 45 - SV_SCROLL_ACQUIREMENT 46 - SV_SCROLL_STAR_ACQUIREMENT 47 - SV_SCROLL_FIRE 48 - SV_SCROLL_ICE 49 - SV_SCROLL_CHAOS 50 - SV_SCROLL_RUMOR 51 - SV_SCROLL_ARTIFACT 52 - SV_SCROLL_NOTHING 53 - SV_SCROLL_SPELL 54 -~~~~~71 -/* The "sval" codes for TV_POTION */ - SV_POTION_WATER 0 - SV_POTION_APPLE_JUICE 1 - SV_POTION_SLIME_MOLD 2 - SV_POTION_BLOOD 3 - SV_POTION_SLOWNESS 4 - SV_POTION_SALT_WATER 5 - SV_POTION_POISON 6 - SV_POTION_BLINDNESS 7 - SV_POTION_INVIS 8 - SV_POTION_CONFUSION 9 - SV_POTION_MUTATION 10 - SV_POTION_SLEEP 11 - SV_POTION_LEARNING 12 - SV_POTION_LOSE_MEMORIES 13 - SV_POTION_RUINATION 15 - SV_POTION_DEC_STR 16 - SV_POTION_DEC_INT 17 - SV_POTION_DEC_WIS 18 - SV_POTION_DEC_DEX 19 - SV_POTION_DEC_CON 20 - SV_POTION_DEC_CHR 21 - SV_POTION_DETONATIONS 22 - SV_POTION_DEATH 23 - SV_POTION_INFRAVISION 24 - SV_POTION_DETECT_INVIS 25 - SV_POTION_SLOW_POISON 26 - SV_POTION_CURE_POISON 27 - SV_POTION_BOLDNESS 28 - SV_POTION_SPEED 29 - SV_POTION_RESIST_HEAT 30 - SV_POTION_RESIST_COLD 31 - SV_POTION_HEROISM 32 - SV_POTION_BESERK_STRENGTH 33 - SV_POTION_CURE_LIGHT 34 - SV_POTION_CURE_SERIOUS 35 - SV_POTION_CURE_CRITICAL 36 - SV_POTION_HEALING 37 - SV_POTION_STAR_HEALING 38 - SV_POTION_LIFE 39 - SV_POTION_RESTORE_MANA 40 - SV_POTION_RESTORE_EXP 41 - SV_POTION_RES_STR 42 - SV_POTION_RES_INT 43 - SV_POTION_RES_WIS 44 - SV_POTION_RES_DEX 45 - SV_POTION_RES_CON 46 - SV_POTION_RES_CHR 47 - SV_POTION_INC_STR 48 - SV_POTION_INC_INT 49 - SV_POTION_INC_WIS 50 - SV_POTION_INC_DEX 51 - SV_POTION_INC_CON 52 - SV_POTION_INC_CHR 53 - SV_POTION_AUGMENTATION 55 - SV_POTION_ENLIGHTENMENT 56 - SV_POTION_STAR_ENLIGHTENMENT 57 - SV_POTION_SELF_KNOWLEDGE 58 - SV_POTION_EXPERIENCE 59 - SV_POTION_RESISTANCE 60 - SV_POTION_CURING 61 - SV_POTION_INVULNERABILITY 62 - SV_POTION_NEW_LIFE 63 -~~~~~72 -/* The "sval" codes for TV_POTION2 */ - SV_POTION2_MIMIC_ABOMINATION 1 - SV_POTION2_MIMIC_WOLF 2 - SV_POTION2_MIMIC_APE 3 - SV_POTION2_MIMIC_GOAT 4 - SV_POTION2_MIMIC_INSECT 5 - SV_POTION2_MIMIC_SPARROW 6 - SV_POTION2_MIMIC_STATUE 7 - SV_POTION2_MIMIC_VAMPIRE 8 - SV_POTION2_MIMIC_SPIDER 9 - SV_POTION2_MIMIC_MANA_BALL 10 - SV_POTION2_MIMIC_FIRE_CLOUD 11 - SV_POTION2_MIMIC_COLD_CLOUD 12 - SV_POTION2_MIMIC_CHAOS_CLOUD 13 - SV_POTION2_CURE_LIGHT_SANITY 14 - SV_POTION2_CURE_SERIOUS_SANITY 15 - SV_POTION2_CURE_CRITICAL_SANITY 16 - SV_POTION2_CURE_SANITY 17 - SV_POTION2_CURE_WATER 18 -~~~~~80 -/* The "sval" codes for TV_FOOD */ - SV_FOOD_POISON 0 - SV_FOOD_BLINDNESS 1 - SV_FOOD_PARANOIA 2 - SV_FOOD_CONFUSION 3 - SV_FOOD_HALLUCINATION 4 - SV_FOOD_PARALYSIS 5 - SV_FOOD_WEAKNESS 6 - SV_FOOD_SICKNESS 7 - SV_FOOD_STUPIDITY 8 - SV_FOOD_NAIVETY 9 - SV_FOOD_UNHEALTH 10 - SV_FOOD_DISEASE 11 - SV_FOOD_CURE_POISON 12 - SV_FOOD_CURE_BLINDNESS 13 - SV_FOOD_CURE_PARANOIA 14 - SV_FOOD_CURE_CONFUSION 15 - SV_FOOD_CURE_SERIOUS 16 - SV_FOOD_RESTORE_STR 17 - SV_FOOD_RESTORE_CON 18 - SV_FOOD_RESTORING 19 - SV_FOOD_BISCUIT 32 - SV_FOOD_JERKY 33 - SV_FOOD_RATION 35 - SV_FOOD_SLIME_MOLD 36 - SV_FOOD_WAYBREAD 37 - SV_FOOD_PINT_OF_ALE 38 - SV_FOOD_PINT_OF_WINE 39 - SV_FOOD_ATHELAS 40 - SV_FOOD_GREAT_HEALTH 41 - SV_FOOD_FORTUNE_COOKIE 42 -~~~~~09 -/* The "sval" codes for TV_CORPSE */ - SV_CORPSE_CORPSE 1 - SV_CORPSE_SKELETON 2 - SV_CORPSE_HEAD 3 - SV_CORPSE_SKULL 4 - SV_CORPSE_MEAT 5 -~~~~~115 -/* The "sval" codes for TV_DAEMON_BOOK */ - SV_DEMONBLADE 55 - SV_DEMONSHIELD 56 - SV_DEMONHORN 57 diff --git a/lib/help/index.txt b/lib/help/index.txt index 87293d27..5bf20d66 100644 --- a/lib/help/index.txt +++ b/lib/help/index.txt @@ -54,7 +54,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****automat.txt*03[Auto destroy] *****automat.txt*02[Auto pick-up] *****automat.txt*01[Automatizer] - *****defines.txt*82[Defines] *****automat.txt*04[Autosquelch] *****c_axemas.txt*01[Axemaster] ~~~~~66 @@ -160,9 +159,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****debug.txt*100[Command List] *****debug.txt*111[Command descriptions ] *****debug.txt*112[General] - *****defines.txt*81[Defines] - *****defines.txt*84[Svals] - *****defines.txt*85[Tvals] *****c_demono.txt*01[Demonologist] *****m_demono.txt*02[Demonology Magic] *****version.txt*01[Development history] @@ -526,7 +522,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****birth.txt*34[Strength] *****c_summon.txt*01[Summoners] *****c_summon.txt*03[Summoning] - *****defines.txt*12[Svals] *****c_swordm.txt*01[Swordmasters] *****c_symbia.txt*01[Symbiant] *****c_symbia.txt*03[Naming your symbiote] @@ -549,7 +544,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****g_tulkas.txt*01[Tulkas] *****c_palad.txt*03[Paladin] *****g_tulkas.txt*03[Prayers] - *****defines.txt*83[Tvals] ~~~~~85 *****/Uindex.txt*85[U] *****m_udun.txt*02[Udun Magic] diff --git a/lib/mods/theme/help/automat.txt b/lib/mods/theme/help/automat.txt index 0ba56d19..c09630a5 100644 --- a/lib/mods/theme/help/automat.txt +++ b/lib/mods/theme/help/automat.txt @@ -249,9 +249,8 @@ instead of 23 you could write TV_SWORD. #####GAh that would be better. But where can I find out what all the names, and #####Gnumbers of tvalues are? -Well I've written a *****defines.txt*0[file] which lists tvalues and one which lists svalues for you -to check on, and you may want to check the objects entry in k_info.txt in your -lib/edit directory. If you look at the entry for dagger you'll see: +Have a look at the object entry in k_info.txt in your lib/edit directory. If you +check the entry for dagger you'll see: N:43:& Dagger~ G:|:W diff --git a/lib/mods/theme/help/defines.txt b/lib/mods/theme/help/defines.txt deleted file mode 100644 index 5093d994..00000000 --- a/lib/mods/theme/help/defines.txt +++ /dev/null @@ -1,615 +0,0 @@ -|||||oy -~~~~~81|Defines -~~~~~85|Defines|Tvals -~~~~~82|Automatizer|Defines -~~~~~83|Tvals -#####R /----------------------------------------\ -#####R < Tvals and svals > -#####R \----------------------------------------/ - -Some objects don't have svals as such. Spellbooks, wands, and staves for -instance don't have svalues as they are defined in lua. - -TV_SKELETON 1 /* Skeletons ('s') */ -TV_BOTTLE 2 /* Empty bottles ('!') */ -TV_SPIKE 5 /* Spikes ('~') */ -TV_MSTAFF 6 /* Mage Staffs */ -TV_CHEST 7 /* Chests ('~') */ -TV_PARCHMENT 8 /* Parchments from Kamband */ -*****defines.txt*09[TV_CORPSE] 9 /* Monster corpses */ -TV_EGG 10 /* Monster Eggs */ -TV_JUNK 11 /* Sticks, Pottery, etc ('~') */ -*****defines.txt*12[TV_TOOL] 12 /* Tools */ -*****defines.txt*14[TV_INSTRUMENT] 14 /* Musical instruments */ -*****defines.txt*15[TV_BOOMERANG] 15 /* Boomerangs */ -*****defines.txt*16[TV_SHOT] 16 /* Ammo for slings */ -*****defines.txt*16[TV_ARROW] 17 /* Ammo for bows */ -*****defines.txt*16[TV_BOLT] 18 /* Ammo for x-bows */ -*****defines.txt*19[TV_BOW] 19 /* Slings/Bows/Xbows */ -*****defines.txt*20[TV_DIGGING] 20 /* Shovels/Picks */ -*****defines.txt*21[TV_HAFTED] 21 /* Priest Weapons */ -*****defines.txt*22[TV_POLEARM] 22 /* Pikes/Glaives/Spears/etc. */ -*****defines.txt*23[TV_SWORD] 23 /* Edged Weapons */ -*****defines.txt*24[TV_AXE] 24 /* Axes/Cleavers */ -*****defines.txt*30[TV_BOOTS] 30 /* Boots */ -*****defines.txt*31[TV_GLOVES] 31 /* Gloves */ -*****defines.txt*32[TV_HELM] 32 /* Helms */ -*****defines.txt*32[TV_CROWN] 33 /* Crowns */ -*****defines.txt*34[TV_SHIELD] 34 /* Shields */ -*****defines.txt*35[TV_CLOAK] 35 /* Cloaks */ -*****defines.txt*36[TV_SOFT_ARMOR] 36 /* Soft Armor */ -*****defines.txt*37[TV_HARD_ARMOR] 37 /* Hard Armor */ -*****defines.txt*38[TV_DRAG_ARMOR] 38 /* Dragon Scale Mail */ -*****defines.txt*39[TV_LITE] 39 /* Lites (including Specials) */ -*****defines.txt*40[TV_AMULET] 40 /* Amulets (including Specials) */ -*****defines.txt*45[TV_RING] 45 /* Rings (including Specials) */ -*****defines.txt*46[TV_TRAPKIT] 46 /* Trapkits */ -TV_TOTEM 54 /* Summoner totems */ -*****defines.txt*55[TV_STAFF] 55 /* Staffs */ -*****defines.txt*65[TV_WAND] 65 /* Wands */ -*****defines.txt*66[TV_ROD] 66 /* Rod tips */ -*****defines.txt*67[TV_ROD_MAIN] 67 /* Rod body's */ -*****defines.txt*70[TV_SCROLL] 70 /* Scrolls */ -*****defines.txt*71[TV_POTION] 71 /* potions */ -*****defines.txt*72[TV_POTION2] 72 /* Second set of potion */ -TV_FLASK 77 /* Flasks of oil */ -*****defines.txt*80[TV_FOOD] 80 /* Food, including mushrooms */ -TV_HYPNOS 99 /* To wield monsters !:) */ -TV_GOLD 100 /* Gold can only be picked up by players */ -TV_RANDART 102 /* Random Artifacts */ -TV_RUNE1 104 /* Base runes */ -TV_RUNE2 105 /* Modifier runes */ -TV_BOOK 111 /* spell books */ -*****defines.txt*115[TV_DAEMON_BOOK] 115 /* Demon blades, shields and horns */ -~~~~~84|Defines|Svals -~~~~~12|Svals -/* The "sval" codes for TV_TOOL */ - SV_TOOL_CLIMB 0 -~~~~~16 -/* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */ - SV_AMMO_LIGHT 0 /* pebbles */ - SV_AMMO_NORMAL 1 /* shots, arrows, bolts */ - SV_AMMO_HEAVY 2 /* seeker arrows and bolts, mithril shots */ -~~~~~14 -/* The "sval" codes for TV_INSTRUMENT */ - SV_FLUTE 1 - SV_BANJO 2 - SV_LUTE 3 - SV_MANDOLIN 4 - SV_DRUM 5 - SV_HARP 6 - SV_HORN 7 -~~~~~46 -/* The "sval" codes for TV_TRAPKIT */ - SV_TRAPKIT_SLING 1 - SV_TRAPKIT_BOW 2 - SV_TRAPKIT_XBOW 3 - SV_TRAPKIT_POTION 4 - SV_TRAPKIT_SCROLL 5 - SV_TRAPKIT_DEVICE 6 -~~~~~15 -/* The "sval" codes for TV_BOOMERANG */ - SV_BOOM_S_WOOD 1 /* 1d4 */ - SV_BOOM_WOOD 2 /* 1d9 */ - SV_BOOM_S_METAL 3 /* 1d8 */ - SV_BOOM_METAL 4 /* 2d4 */ -~~~~~19 -/* The "sval" codes for TV_BOW (note information in "sval") */ - SV_SLING 2 /* (x2) */ - SV_SHORT_BOW 12 /* (x2) */ - SV_LONG_BOW 13 /* (x3) */ - SV_LIGHT_XBOW 23 /* (x3) */ - SV_HEAVY_XBOW 24 /* (x4) */ -~~~~~20 -/* The "sval" codes for TV_DIGGING */ - SV_SHOVEL 1 - SV_GNOMISH_SHOVEL 2 - SV_DWARVEN_SHOVEL 3 - SV_PICK 4 - SV_ORCISH_PICK 5 - SV_DWARVEN_PICK 6 - SV_MATTOCK 7 -~~~~~21 -/* The "sval" values for TV_HAFTED */ - SV_CLUB 1 /* 1d4 */ - SV_WHIP 2 /* 1d6 */ - SV_QUARTERSTAFF 3 /* 1d9 */ - SV_NUNCHAKU 4 /* 2d3 */ - SV_MACE 5 /* 2d4 */ - SV_BALL_AND_CHAIN 6 /* 2d4 */ - SV_WAR_HAMMER 8 /* 3d3 */ - SV_LUCERN_HAMMER 10 /* 2d5 */ - SV_THREE_PIECE_ROD 11 /* 3d3 */ - SV_MORNING_STAR 12 /* 2d6 */ - SV_FLAIL 13 /* 2d6 */ - SV_LEAD_FILLED_MACE 15 /* 3d4 */ - SV_TWO_HANDED_FLAIL 18 /* 3d6 */ - SV_GREAT_HAMMER 19 /* 4d6 */ - SV_MACE_OF_DISRUPTION 20 /* 5d8 */ - SV_GROND 50 /* 3d4 */ -~~~~~24 -/* The "sval" values for TV_AXE */ - SV_HATCHET 1 /* 1d5 */ - SV_CLEAVER 2 /* 2d4 */ - SV_LIGHT_WAR_AXE 8 /* 2d5 */ - SV_BEAKED_AXE 10 /* 2d6 */ - SV_BROAD_AXE 11 /* 2d6 */ - SV_BATTLE_AXE 22 /* 2d8 */ - SV_GREAT_AXE 25 /* 4d4 */ - SV_LOCHABER_AXE 28 /* 3d8 */ - SV_SLAUGHTER_AXE 30 /* 5d7 */ -~~~~~22 -/* The "sval" values for TV_POLEARM */ - SV_SPEAR 2 /* 1d6 */ - SV_SICKLE 3 /* 2d3 */ - SV_AWL_PIKE 4 /* 1d8 */ - SV_TRIDENT 5 /* 1d9 */ - SV_FAUCHARD 6 /* 1d10 */ - SV_BROAD_SPEAR 7 /* 1d9 */ - SV_PIKE 8 /* 2d5 */ - SV_GLAIVE 13 /* 2d6 */ - SV_HALBERD 15 /* 3d4 */ - SV_GUISARME 16 /* 2d5 */ - SV_SCYTHE 17 /* 5d3 */ - SV_LANCE 20 /* 2d8 */ - SV_TRIFURCATE_SPEAR 26 /* 2d9 */ - SV_HEAVY_LANCE 29 /* 4d8 */ - SV_SCYTHE_OF_SLICING 30 /* 8d4 */ -~~~~~23 -/* The "sval" codes for TV_SWORD */ - SV_BROKEN_DAGGER 1 /* 1d1 */ - SV_BROKEN_SWORD 2 /* 1d2 */ - SV_DAGGER 4 /* 1d4 */ - SV_MAIN_GAUCHE 5 /* 1d5 */ - SV_RAPIER 7 /* 1d6 */ - SV_SMALL_SWORD 8 /* 1d6 */ - SV_BASILLARD 9 /* 1d8 */ - SV_SHORT_SWORD 10 /* 1d7 */ - SV_SABRE 11 /* 1d7 */ - SV_CUTLASS 12 /* 1d7 */ - SV_KHOPESH 14 /* 2d4 */ - SV_TULWAR 15 /* 2d4 */ - SV_BROAD_SWORD 16 /* 2d5 */ - SV_LONG_SWORD 17 /* 2d5 */ - SV_SCIMITAR 18 /* 2d5 */ - SV_KATANA 20 /* 3d4 */ - SV_BASTARD_SWORD 21 /* 3d4 */ - SV_GREAT_SCIMITAR 22 /* 4d5 */ - SV_CLAYMORE 23 /* 2d8 */ - SV_ESPADON 24 /* 2d9 */ - SV_TWO_HANDED_SWORD 25 /* 3d6 */ - SV_FLAMBERGE 26 /* 3d7 */ - SV_EXECUTIONERS_SWORD 28 /* 4d5 */ - SV_ZWEIHANDER 29 /* 4d6 */ - SV_BLADE_OF_CHAOS 30 /* 6d5 */ - SV_SHADOW_BLADE 31 /* 4d4 */ - SV_BLUESTEEL_BLADE 32 /* 3d9 */ - SV_DARK_SWORD 33 /* 3d7 */ -~~~~~34 -/* The "sval" codes for TV_SHIELD */ - SV_SMALL_LEATHER_SHIELD 2 - SV_SMALL_METAL_SHIELD 3 - SV_LARGE_LEATHER_SHIELD 4 - SV_LARGE_METAL_SHIELD 5 - SV_DRAGON_SHIELD 6 - SV_SHIELD_OF_DEFLECTION 10 -~~~~~32 -/* The "sval" codes for TV_HELM */ - SV_HARD_LEATHER_CAP 2 - SV_METAL_CAP 3 - SV_IRON_HELM 5 - SV_STEEL_HELM 6 - SV_DRAGON_HELM 7 - SV_IRON_CROWN 10 - SV_GOLDEN_CROWN 11 - SV_JEWELED_CROWN 12 - SV_MORGOTH 50 -~~~~~30 -/* The "sval" codes for TV_BOOTS */ - SV_PAIR_OF_SOFT_LEATHER_BOOTS 2 - SV_PAIR_OF_HARD_LEATHER_BOOTS 3 - SV_PAIR_OF_METAL_SHOD_BOOTS 6 -~~~~~35 -/* The "sval" codes for TV_CLOAK */ - SV_CLOAK 1 - SV_ELVEN_CLOAK 2 - SV_FUR_CLOAK 3 - SV_SHADOW_CLOAK 6 -~~~~~31 -/* The "sval" codes for TV_GLOVES */ - SV_SET_OF_LEATHER_GLOVES 1 - SV_SET_OF_GAUNTLETS 2 - SV_SET_OF_CESTI 5 -~~~~~36 -/* The "sval" codes for TV_SOFT_ARMOR */ - SV_FILTHY_RAG 1 - SV_ROBE 2 - SV_PAPER_ARMOR 3 /* 4 */ - SV_SOFT_LEATHER_ARMOR 4 - SV_SOFT_STUDDED_LEATHER 5 - SV_HARD_LEATHER_ARMOR 6 - SV_HARD_STUDDED_LEATHER 7 - SV_RHINO_HIDE_ARMOR 8 - SV_CORD_ARMOR 9 /* 6 */ - SV_PADDED_ARMOR 10 /* 4 */ - SV_LEATHER_SCALE_MAIL 11 - SV_LEATHER_JACK 12 - SV_STONE_AND_HIDE_ARMOR 15 /* 15 */ - SV_THUNDERLORD_SUIT 16 -~~~~~37 -/* The "sval" codes for TV_HARD_ARMOR */ - SV_RUSTY_CHAIN_MAIL 1 /* 14- */ - SV_RING_MAIL 2 /* 12 */ - SV_METAL_SCALE_MAIL 3 /* 13 */ - SV_CHAIN_MAIL 4 /* 14 */ - SV_DOUBLE_RING_MAIL 5 /* 15 */ - SV_AUGMENTED_CHAIN_MAIL 6 /* 16 */ - SV_DOUBLE_CHAIN_MAIL 7 /* 16 */ - SV_BAR_CHAIN_MAIL 8 /* 18 */ - SV_METAL_BRIGANDINE_ARMOUR 9 /* 19 */ - SV_SPLINT_MAIL 10 /* 19 */ - SV_PARTIAL_PLATE_ARMOUR 12 /* 22 */ - SV_METAL_LAMELLAR_ARMOUR 13 /* 23 */ - SV_FULL_PLATE_ARMOUR 15 /* 25 */ - SV_RIBBED_PLATE_ARMOUR 18 /* 28 */ - SV_MITHRIL_CHAIN_MAIL 20 /* 28+ */ - SV_MITHRIL_PLATE_MAIL 25 /* 35+ */ - SV_ADAMANTITE_PLATE_MAIL 30 /* 40+ */ -~~~~~38 -/* The "sval" codes for TV_DRAG_ARMOR */ - SV_DRAGON_BLACK 1 - SV_DRAGON_BLUE 2 - SV_DRAGON_WHITE 3 - SV_DRAGON_RED 4 - SV_DRAGON_GREEN 5 - SV_DRAGON_MULTIHUED 6 - SV_DRAGON_SHINING 10 - SV_DRAGON_LAW 12 - SV_DRAGON_BRONZE 14 - SV_DRAGON_GOLD 16 - SV_DRAGON_CHAOS 18 - SV_DRAGON_BALANCE 20 - SV_DRAGON_POWER 30 -~~~~~39 -/* The sval codes for TV_LITE */ - SV_LITE_TORCH 0 - SV_LITE_LANTERN 1 - SV_LITE_TORCH_EVER 2 - SV_LITE_DWARVEN 3 - SV_LITE_FEANORIAN 4 - SV_LITE_GALADRIEL 100 - SV_LITE_ELENDIL 101 - SV_LITE_THRAIN 102 - SV_LITE_UNDEATH 103 - SV_LITE_PALANTIR 104 - SV_ANCHOR_SPACETIME 105 - SV_STONE_LORE 106 -~~~~~40 -/* The "sval" codes for TV_AMULET */ - SV_AMULET_DOOM 0 - SV_AMULET_TELEPORT 1 - SV_AMULET_ADORNMENT 2 - SV_AMULET_SLOW_DIGEST 3 - SV_AMULET_RESIST_ACID 4 - SV_AMULET_SEARCHING 5 - SV_AMULET_BRILLANCE 6 - SV_AMULET_CHARISMA 7 - SV_AMULET_THE_MAGI 8 - SV_AMULET_REFLECTION 9 - SV_AMULET_CARLAMMAS 10 - SV_AMULET_INGWE 11 - SV_AMULET_DWARVES 12 - SV_AMULET_NO_MAGIC 13 - SV_AMULET_NO_TELE 14 - SV_AMULET_RESISTANCE 15 - SV_AMULET_NOTHING 16 - SV_AMULET_SERPENT 17 - SV_AMULET_TORIS_MEJISTOS 18 - SV_AMULET_ELESSAR 19 - SV_AMULET_EVENSTAR 20 - SV_AMULET_SUSTENANCE 21 - SV_AMULET_TELEPATHY 22 - SV_AMULET_TRICKERY 23 - SV_AMULET_WEAPONMASTERY 24 - SV_AMULET_DEVOTION 25 - SV_AMULET_INFRA 26 - SV_AMULET_SPELL 27 - SV_AMULET_WISDOM 28 - SV_AMULET_RESIST_ELEC 29 - SV_AMULET_REGEN 30 -~~~~~45 -/* The sval codes for TV_RING */ - SV_RING_WOE 0 - SV_RING_AGGRAVATION 1 - SV_RING_WEAKNESS 2 - SV_RING_STUPIDITY 3 - SV_RING_TELEPORTATION 4 - SV_RING_SPECIAL 5 - SV_RING_SLOW_DIGESTION 6 - SV_RING_FEATHER_FALL 7 - SV_RING_RESIST_FIRE 8 - SV_RING_RESIST_COLD 9 - SV_RING_SUSTAIN_STR 10 - SV_RING_SUSTAIN_INT 11 - SV_RING_SUSTAIN_WIS 12 - SV_RING_SUSTAIN_CON 13 - SV_RING_SUSTAIN_DEX 14 - SV_RING_SUSTAIN_CHR 15 - SV_RING_PROTECTION 16 - SV_RING_ACID 17 - SV_RING_FLAMES 18 - SV_RING_ICE 19 - SV_RING_RESIST_POIS 20 - SV_RING_FREE_ACTION 21 - SV_RING_SEE_INVIS 22 - SV_RING_SEARCHING 23 - SV_RING_STR 24 - SV_RING_INT 25 - SV_RING_DEX 26 - SV_RING_CON 27 - SV_RING_ACCURACY 28 - SV_RING_DAMAGE 29 - SV_RING_SLAYING 30 - SV_RING_SPEED 31 - SV_RING_BARAHIR 32 - SV_RING_TULKAS 33 - SV_RING_NARYA 34 - SV_RING_NENYA 35 - SV_RING_VILYA 36 - SV_RING_POWER 37 - SV_RING_RES_FEAR 38 - SV_RING_RES_LD 39 - SV_RING_RES_NETHER 40 - SV_RING_RES_NEXUS 41 - SV_RING_RES_SOUND 42 - SV_RING_RES_CONFUSION 43 - SV_RING_RES_SHARDS 44 - SV_RING_RES_DISENCHANT 45 - SV_RING_RES_CHAOS 46 - SV_RING_RES_BLINDNESS 47 - SV_RING_LORDLY 48 - SV_RING_ATTACKS 49 - SV_RING_NOTHING 50 - SV_RING_PRECONITION 51 - SV_RING_FLAR 52 - SV_RING_INVIS 53 - SV_RING_FLYING 54 - SV_RING_WRAITH 55 - SV_RING_ELEC 56 - SV_RING_DURIN 57 - SV_RING_SPELL 58 - SV_RING_CRIT 59 -~~~~~55 -/* The "sval" codes for TV_STAFF */ - SV_STAFF_SCHOOL 1 - SV_STAFF_NOTHING 2 -~~~~~65 -/* The "sval" codes for TV_WAND */ - SV_WAND_SCHOOL 1 - SV_WAND_NOTHING 2 -~~~~~66 -/* The "sval" codes for TV_ROD(Rod Tips) */ - SV_ROD_NOTHING 0 - SV_ROD_DETECT_DOOR 1 - SV_ROD_IDENTIFY 2 - SV_ROD_RECALL 3 - SV_ROD_ILLUMINATION 4 - SV_ROD_MAPPING 5 - SV_ROD_DETECTION 6 - SV_ROD_CURING 8 - SV_ROD_HEALING 9 - SV_ROD_RESTORATION 10 - SV_ROD_SPEED 11 - SV_ROD_TELEPORT_AWAY 13 - SV_ROD_DISARMING 14 - SV_ROD_LITE 15 - SV_ROD_SLEEP_MONSTER 16 - SV_ROD_SLOW_MONSTER 17 - SV_ROD_DRAIN_LIFE 18 - SV_ROD_POLYMORPH 19 - SV_ROD_ACID_BOLT 20 - SV_ROD_ELEC_BOLT 21 - SV_ROD_FIRE_BOLT 22 - SV_ROD_COLD_BOLT 23 - SV_ROD_ACID_BALL 24 - SV_ROD_ELEC_BALL 25 - SV_ROD_FIRE_BALL 26 - SV_ROD_COLD_BALL 27 - SV_ROD_HAVOC 28 - SV_ROD_DETECT_TRAP 29 - SV_ROD_HOME 30 -~~~~~67 -/* The "sval" codes for TV_ROD_MAIN(Rods) */ - SV_ROD_WOODEN 10 - SV_ROD_COPPER 20 - SV_ROD_IRON 50 - SV_ROD_ALUMINIUM 75 - SV_ROD_SILVER 100 - SV_ROD_GOLDEN 125 - SV_ROD_MITHRIL 160 - SV_ROD_ADMANTITE 200 -~~~~~70 -/* The "sval" codes for TV_SCROLL */ - SV_SCROLL_DARKNESS 0 - SV_SCROLL_AGGRAVATE_MONSTER 1 - SV_SCROLL_CURSE_ARMOR 2 - SV_SCROLL_CURSE_WEAPON 3 - SV_SCROLL_SUMMON_MONSTER 4 - SV_SCROLL_SUMMON_UNDEAD 5 - SV_SCROLL_SUMMON_MINE 6 - SV_SCROLL_TRAP_CREATION 7 - SV_SCROLL_PHASE_DOOR 8 - SV_SCROLL_TELEPORT 9 - SV_SCROLL_TELEPORT_LEVEL 10 - SV_SCROLL_WORD_OF_RECALL 11 - SV_SCROLL_IDENTIFY 12 - SV_SCROLL_STAR_IDENTIFY 13 - SV_SCROLL_REMOVE_CURSE 14 - SV_SCROLL_STAR_REMOVE_CURSE 15 - SV_SCROLL_ENCHANT_ARMOR 16 - SV_SCROLL_ENCHANT_WEAPON_TO_HIT 17 - SV_SCROLL_ENCHANT_WEAPON_TO_DAM 18 - SV_SCROLL_ENCHANT_WEAPON_PVAL 19 - SV_SCROLL_STAR_ENCHANT_ARMOR 20 - SV_SCROLL_STAR_ENCHANT_WEAPON 21 - SV_SCROLL_RECHARGING 22 - SV_SCROLL_RESET_RECALL 23 - SV_SCROLL_LIGHT 24 - SV_SCROLL_MAPPING 25 - SV_SCROLL_DETECT_GOLD 26 - SV_SCROLL_DETECT_ITEM 27 - SV_SCROLL_DETECT_TRAP 28 - SV_SCROLL_DETECT_DOOR 29 - SV_SCROLL_DETECT_INVIS 30 - SV_SCROLL_DIVINATION 31 - SV_SCROLL_SATISFY_HUNGER 32 - SV_SCROLL_BLESSING 33 - SV_SCROLL_HOLY_CHANT 34 - SV_SCROLL_HOLY_PRAYER 35 - SV_SCROLL_MONSTER_CONFUSION 36 - SV_SCROLL_PROTECTION_FROM_EVIL 37 - SV_SCROLL_RUNE_OF_PROTECTION 38 - SV_SCROLL_TRAP_DOOR_DESTRUCTION 39 - SV_SCROLL_DEINCARNATION 40 - SV_SCROLL_STAR_DESTRUCTION 41 - SV_SCROLL_DISPEL_UNDEAD 42 - SV_SCROLL_MASS_RESURECTION 43 - SV_SCROLL_GENOCIDE 44 - SV_SCROLL_MASS_GENOCIDE 45 - SV_SCROLL_ACQUIREMENT 46 - SV_SCROLL_STAR_ACQUIREMENT 47 - SV_SCROLL_FIRE 48 - SV_SCROLL_ICE 49 - SV_SCROLL_CHAOS 50 - SV_SCROLL_RUMOR 51 - SV_SCROLL_ARTIFACT 52 - SV_SCROLL_NOTHING 53 - SV_SCROLL_SPELL 54 -~~~~~71 -/* The "sval" codes for TV_POTION */ - SV_POTION_WATER 0 - SV_POTION_APPLE_JUICE 1 - SV_POTION_SLIME_MOLD 2 - SV_POTION_BLOOD 3 - SV_POTION_SLOWNESS 4 - SV_POTION_SALT_WATER 5 - SV_POTION_POISON 6 - SV_POTION_BLINDNESS 7 - SV_POTION_INVIS 8 - SV_POTION_CONFUSION 9 - SV_POTION_MUTATION 10 - SV_POTION_SLEEP 11 - SV_POTION_LEARNING 12 - SV_POTION_LOSE_MEMORIES 13 - SV_POTION_RUINATION 15 - SV_POTION_DEC_STR 16 - SV_POTION_DEC_INT 17 - SV_POTION_DEC_WIS 18 - SV_POTION_DEC_DEX 19 - SV_POTION_DEC_CON 20 - SV_POTION_DEC_CHR 21 - SV_POTION_DETONATIONS 22 - SV_POTION_DEATH 23 - SV_POTION_INFRAVISION 24 - SV_POTION_DETECT_INVIS 25 - SV_POTION_SLOW_POISON 26 - SV_POTION_CURE_POISON 27 - SV_POTION_BOLDNESS 28 - SV_POTION_SPEED 29 - SV_POTION_RESIST_HEAT 30 - SV_POTION_RESIST_COLD 31 - SV_POTION_HEROISM 32 - SV_POTION_BESERK_STRENGTH 33 - SV_POTION_CURE_LIGHT 34 - SV_POTION_CURE_SERIOUS 35 - SV_POTION_CURE_CRITICAL 36 - SV_POTION_HEALING 37 - SV_POTION_STAR_HEALING 38 - SV_POTION_LIFE 39 - SV_POTION_RESTORE_MANA 40 - SV_POTION_RESTORE_EXP 41 - SV_POTION_RES_STR 42 - SV_POTION_RES_INT 43 - SV_POTION_RES_WIS 44 - SV_POTION_RES_DEX 45 - SV_POTION_RES_CON 46 - SV_POTION_RES_CHR 47 - SV_POTION_INC_STR 48 - SV_POTION_INC_INT 49 - SV_POTION_INC_WIS 50 - SV_POTION_INC_DEX 51 - SV_POTION_INC_CON 52 - SV_POTION_INC_CHR 53 - SV_POTION_AUGMENTATION 55 - SV_POTION_ENLIGHTENMENT 56 - SV_POTION_STAR_ENLIGHTENMENT 57 - SV_POTION_SELF_KNOWLEDGE 58 - SV_POTION_EXPERIENCE 59 - SV_POTION_RESISTANCE 60 - SV_POTION_CURING 61 - SV_POTION_INVULNERABILITY 62 - SV_POTION_NEW_LIFE 63 -~~~~~72 -/* The "sval" codes for TV_POTION2 */ - SV_POTION2_MIMIC_ABOMINATION 1 - SV_POTION2_MIMIC_WOLF 2 - SV_POTION2_MIMIC_APE 3 - SV_POTION2_MIMIC_GOAT 4 - SV_POTION2_MIMIC_INSECT 5 - SV_POTION2_MIMIC_SPARROW 6 - SV_POTION2_MIMIC_STATUE 7 - SV_POTION2_MIMIC_VAMPIRE 8 - SV_POTION2_MIMIC_SPIDER 9 - SV_POTION2_MIMIC_MANA_BALL 10 - SV_POTION2_MIMIC_FIRE_CLOUD 11 - SV_POTION2_MIMIC_COLD_CLOUD 12 - SV_POTION2_MIMIC_CHAOS_CLOUD 13 - SV_POTION2_CURE_LIGHT_SANITY 14 - SV_POTION2_CURE_SERIOUS_SANITY 15 - SV_POTION2_CURE_CRITICAL_SANITY 16 - SV_POTION2_CURE_SANITY 17 - SV_POTION2_CURE_WATER 18 -~~~~~80 -/* The "sval" codes for TV_FOOD */ - SV_FOOD_POISON 0 - SV_FOOD_BLINDNESS 1 - SV_FOOD_PARANOIA 2 - SV_FOOD_CONFUSION 3 - SV_FOOD_HALLUCINATION 4 - SV_FOOD_PARALYSIS 5 - SV_FOOD_WEAKNESS 6 - SV_FOOD_SICKNESS 7 - SV_FOOD_STUPIDITY 8 - SV_FOOD_NAIVETY 9 - SV_FOOD_UNHEALTH 10 - SV_FOOD_DISEASE 11 - SV_FOOD_CURE_POISON 12 - SV_FOOD_CURE_BLINDNESS 13 - SV_FOOD_CURE_PARANOIA 14 - SV_FOOD_CURE_CONFUSION 15 - SV_FOOD_CURE_SERIOUS 16 - SV_FOOD_RESTORE_STR 17 - SV_FOOD_RESTORE_CON 18 - SV_FOOD_RESTORING 19 - SV_FOOD_BISCUIT 32 - SV_FOOD_JERKY 33 - SV_FOOD_RATION 35 - SV_FOOD_SLIME_MOLD 36 - SV_FOOD_WAYBREAD 37 - SV_FOOD_PINT_OF_ALE 38 - SV_FOOD_PINT_OF_WINE 39 - SV_FOOD_ATHELAS 40 - SV_FOOD_GREAT_HEALTH 41 - SV_FOOD_FORTUNE_COOKIE 42 -~~~~~09 -/* The "sval" codes for TV_CORPSE */ - SV_CORPSE_CORPSE 1 - SV_CORPSE_SKELETON 2 - SV_CORPSE_HEAD 3 - SV_CORPSE_SKULL 4 - SV_CORPSE_MEAT 5 -~~~~~115 -/* The "sval" codes for TV_DAEMON_BOOK */ - SV_DEMONBLADE 55 - SV_DEMONSHIELD 56 - SV_DEMONHORN 57 diff --git a/lib/mods/theme/help/index.txt b/lib/mods/theme/help/index.txt index c89a70b3..c0d874ef 100644 --- a/lib/mods/theme/help/index.txt +++ b/lib/mods/theme/help/index.txt @@ -56,7 +56,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****automat.txt*03[Auto destroy] *****automat.txt*02[Auto pick-up] *****automat.txt*01[Automatizer] - *****defines.txt*82[Defines] *****automat.txt*04[Autosquelch] *****c_axemas.txt*01[Axemaster] ~~~~~66 @@ -173,9 +172,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****debug.txt*100[Command List] *****debug.txt*111[Command descriptions ] *****debug.txt*112[General] - *****defines.txt*81[Defines] - *****defines.txt*84[Svals] - *****defines.txt*85[Tvals] *****r_demon.txt*01[Demon] *****rm_adanrog.txt*01[Adanrog] *****rm_aewrog.txt*01[Aewrog] @@ -576,7 +572,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****birth.txt*34[Strength] *****c_summon.txt*01[Summoners] *****c_summon.txt*03[Summoning] - *****defines.txt*12[Svals] *****c_swordm.txt*01[Swordmasters] *****c_symbia.txt*01[Symbiant] *****c_symbia.txt*03[Naming your symbiote] @@ -599,7 +594,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****g_tulkas.txt*01[Tulkas] *****c_palad.txt*03[Paladin] *****g_tulkas.txt*03[Prayers] - *****defines.txt*83[Tvals] ~~~~~85 *****/Uindex.txt*85[U] *****m_udun.txt*02[Udun Magic] -- cgit v1.2.3 From 128b467fcc9a36fc1f8d1794f8c66ae1a9d08274 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sun, 16 Oct 2016 12:28:53 +0200 Subject: Fix monster spell selection caused by 'missing' TRAPS spell --- src/melee2.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 0988d2af..fbc793bd 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -941,11 +941,11 @@ static std::vector extract_spells(monster_spell_flag_set auto result = std::vector(); result.reserve(spell_flag_set.nbits); - for (std::size_t k = 0; k < monster_spell_flag_set::nbits; k++) + for (auto const &monster_spell: monster_spells()) { - if (spell_flag_set.bit(k)) + if (bool(spell_flag_set & monster_spell->flag_set)) { - result.push_back(monster_spells()[k]); + result.push_back(monster_spell); } } -- cgit v1.2.3 From f7a9a64b585facda723742ef30f02da0a1f48b77 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 22 Oct 2016 13:40:14 +0200 Subject: Remove !SelfKnowledge --- lib/edit/k_info.txt | 9 - lib/mods/theme/edit/k_info.txt | 9 - src/cmd6.cc | 11 - src/defines.h | 2 - src/files.cc | 9 - src/spells1.cc | 23 - src/spells2.cc | 988 ----------------------------------------- src/spells2.hpp | 1 - src/spells3.cc | 24 +- src/tables.cc | 1 - src/wizard2.cc | 5 - 11 files changed, 2 insertions(+), 1080 deletions(-) diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 7ac6d9ac..b7916096 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -3920,15 +3920,6 @@ P:0:1d1:0:0:0 D:This wonderful potion will fully heal you no matter how badly you're hurt, allow drained D:abilities to recover and remove various other ailments. -N:421:Self Knowledge -G:!:d -I:71:58:0 -W:40:0:4:2000 -A:40/1 -P:0:1d1:0:0:0 -F:FOUNTAIN -D:A drink of insight, letting you know yourself better. - N:422:*Enlightenment* G:!:d I:71:57:0 diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index ed99d177..c53f40f3 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -3956,15 +3956,6 @@ F:FOUNTAIN D:This wonderful potion will fully heal you no matter how badly you're hurt, allow drained D:abilities to recover and remove various other ailments. -N:421:Self Knowledge -G:!:d -I:71:58:0 -W:40:0:4:2000 -A:40/1 -P:0:1d1:0:0:0 -F:FOUNTAIN -D:A drink of insight that lets you know yourself better. - N:422:*Enlightenment* G:!:d I:71:57:0 diff --git a/src/cmd6.cc b/src/cmd6.cc index 70f35bd0..f7261a96 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -2302,17 +2302,6 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) (void)detect_objects_gold(DEFAULT_RADIUS); (void)detect_objects_normal(DEFAULT_RADIUS); identify_pack(); - self_knowledge(NULL); - ident = TRUE; - - break; - } - - case SV_POTION_SELF_KNOWLEDGE: - { - msg_print("You begin to know yourself a little better..."); - msg_print(NULL); - self_knowledge(NULL); ident = TRUE; break; diff --git a/src/defines.h b/src/defines.h index 1cd16b89..6fab7852 100644 --- a/src/defines.h +++ b/src/defines.h @@ -1505,7 +1505,6 @@ #define SV_POTION_AUGMENTATION 55 #define SV_POTION_ENLIGHTENMENT 56 #define SV_POTION_STAR_ENLIGHTENMENT 57 -#define SV_POTION_SELF_KNOWLEDGE 58 #define SV_POTION_EXPERIENCE 59 #define SV_POTION_RESISTANCE 60 #define SV_POTION_CURING 61 @@ -1888,7 +1887,6 @@ #define GF_JAM_DOOR 88 #define GF_DOMINATION 89 #define GF_DISP_GOOD 90 -#define GF_IDENTIFY 91 #define GF_RAISE 92 #define GF_STAR_IDENTIFY 93 #define GF_DESTRUCTION 94 diff --git a/src/files.cc b/src/files.cc index 9f1262b0..3b9bc875 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2794,15 +2794,6 @@ errr file_character(cptr name, bool_ full) fprintf (fff, "\n\n"); - /* Emit the self-knowledge lines, even though they duplicate the - information in the grids (below), because they contain information - that's not in the grids (racial abilities, luck, etc.). */ - if (full) - { - self_knowledge(fff); - fprintf(fff, "\n\n"); - } - /* adds and slays */ display_player (2); file_character_print_grid(fff, FALSE, TRUE); diff --git a/src/spells1.cc b/src/spells1.cc index 05373942..aad281a0 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -3984,19 +3984,6 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) /* Squelch ! */ squeltch_grid(); - break; - } - case GF_IDENTIFY: - { - object_aware(o_ptr); - object_known(o_ptr); - - /* Process the appropriate hooks */ - identify_hooks(0 - this_o_idx, o_ptr, IDENT_NORMAL); - - /* Squelch ! */ - squeltch_grid(); - break; } case GF_RAISE: @@ -4292,7 +4279,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) case GF_JAM_DOOR: case GF_RAISE: case GF_RAISE_DEMON: - case GF_IDENTIFY: break; /* none of the above anger */ case GF_TRAP_DEMONSOUL: if (r_ptr->flags & RF_DEMON) @@ -7677,14 +7663,6 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad break; } - /* Knowledge */ - case GF_IDENTIFY: - { - if (fuzzy) msg_print("You are hit by pure knowledge!"); - self_knowledge(NULL); - break; - } - /* Psi -- ESP */ case GF_PSI: { @@ -8536,7 +8514,6 @@ bool_ potion_smash_effect(int who, int y, int x, int o_sval) case SV_POTION_AUGMENTATION: case SV_POTION_ENLIGHTENMENT: case SV_POTION_STAR_ENLIGHTENMENT: - case SV_POTION_SELF_KNOWLEDGE: case SV_POTION_EXPERIENCE: case SV_POTION_RESISTANCE: case SV_POTION_INVULNERABILITY: diff --git a/src/spells2.cc b/src/spells2.cc index 2eb8889b..e0f0512e 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -789,994 +789,6 @@ bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a sh - -/* - * self-knowledge... idea from nethack. Useful for determining powers and - * resistances of items. It saves the screen, clears it, then starts listing - * attributes, a screenful at a time. (There are a LOT of attributes to - * list. It will probably take 2 or 3 screens for a powerful character whose - * using several artifacts...) -CFT - * - * It is now a lot more efficient. -BEN- - * - * See also "identify_fully()". - * - * XXX XXX XXX Use the "show_file()" method, perhaps. - */ -void self_knowledge(FILE *fff) -{ - auto const &r_info = game->edit_data.r_info; - - int i = 0, j, k; - - int iter; /* Iterator for a loop */ - - object_type *o_ptr; - - char Dummy[80]; - - cptr info[200]; - - strcpy (Dummy, ""); - - /* Acquire item flags from equipment */ - auto flags = object_flag_set(); - for (k = INVEN_WIELD; k < INVEN_TOTAL; k++) - { - o_ptr = &p_ptr->inventory[k]; - - /* Skip non-objects */ - if (!o_ptr->k_idx) continue; - - /* Extract the flags */ - flags |= object_flags(o_ptr); - } - - if (death) - { - static char buf[250]; - - sprintf(buf, "You are dead, killed by %s %s.", - died_from, describe_player_location().c_str()); - info[i++] = buf; - } - - /* Racial powers... */ - if (p_ptr->body_monster != 0) - { - auto r_ptr = &r_info[p_ptr->body_monster]; - - if (r_ptr->flags & RF_CHAR_CLEAR || - r_ptr->flags & RF_ATTR_CLEAR) - info[i++] = "You are transparent."; - if ((r_ptr->flags & RF_CHAR_MULTI) || - (r_ptr->flags & RF_SHAPECHANGER)) - info[i++] = "Your form constantly changes."; - if (r_ptr->flags & RF_ATTR_MULTI) - info[i++] = "Your color constantly changes."; - if (r_ptr->flags & RF_NEVER_BLOW) - info[i++] = "You do not have a physical weapon."; - if (r_ptr->flags & RF_NEVER_MOVE) - info[i++] = "You cannot move."; - if ((r_ptr->flags & RF_RAND_25) && - (r_ptr->flags & RF_RAND_50)) - info[i++] = "You move extremely erratically."; - else if (r_ptr->flags & RF_RAND_50) - info[i++] = "You move somewhat erratically."; - else if (r_ptr->flags & RF_RAND_25) - info[i++] = "You move a bit erratically."; - if (r_ptr->flags & RF_STUPID) - info[i++] = "You are very stupid (INT -4)."; - if (r_ptr->flags & RF_SMART) - info[i++] = "You are very smart (INT +4)."; - /* Not implemented */ - if (r_ptr->flags & RF_CAN_SPEAK) - info[i++] = "You can speak."; - else - info[i++] = "You cannot speak."; - /* Not implemented */ - if (r_ptr->flags & RF_COLD_BLOOD) - info[i++] = "You are cold blooded."; - /* Not implemented */ - if (r_ptr->flags & RF_EMPTY_MIND) - info[i++] = "You have an empty mind."; - if (r_ptr->flags & RF_WEIRD_MIND) - info[i++] = "You have a weird mind."; - if (r_ptr->spells & SF_MULTIPLY) - info[i++] = "You can multiply."; - if (r_ptr->flags & RF_POWERFUL) - info[i++] = "You have strong breath."; - /* Not implemented */ - if (r_ptr->flags & RF_ELDRITCH_HORROR) - info[i++] = "You are an eldritch horror."; - if (r_ptr->flags & RF_OPEN_DOOR) - info[i++] = "You can open doors."; - else - info[i++] = "You cannot open doors."; - if (r_ptr->flags & RF_BASH_DOOR) - info[i++] = "You can bash doors."; - else - info[i++] = "You cannot bash doors."; - if (r_ptr->flags & RF_PASS_WALL) - info[i++] = "You can pass walls."; - if (r_ptr->flags & RF_KILL_WALL) - info[i++] = "You destroy walls."; - /* Not implemented */ - if (r_ptr->flags & RF_MOVE_BODY) - info[i++] = "You can move monsters."; - /* Not implemented */ - if (r_ptr->flags & RF_ORC) - info[i++] = "You have orc blood in your veins."; - /* Not implemented */ - else if (r_ptr->flags & RF_TROLL) - info[i++] = "You have troll blood in your veins."; - /* Not implemented */ - else if (r_ptr->flags & RF_GIANT) - info[i++] = "You have giant blood in your veins."; - /* Not implemented */ - else if (r_ptr->flags & RF_DRAGON) - info[i++] = "You have dragon blood in your veins."; - /* Not implemented */ - else if (r_ptr->flags & RF_DEMON) - info[i++] = "You have demon blood in your veins."; - /* Not implemented */ - else if (r_ptr->flags & RF_UNDEAD) - info[i++] = "You are an undead."; - /* Not implemented */ - else if (r_ptr->flags & RF_ANIMAL) - info[i++] = "You are an animal."; - /* Not implemented */ - else if (r_ptr->flags & RF_THUNDERLORD) - info[i++] = "You have thunderlord blood in your veins."; - if (r_ptr->flags & RF_EVIL) - info[i++] = "You are inherently evil."; - else if (r_ptr->flags & RF_GOOD) - info[i++] = "You are inherently good."; - if (r_ptr->flags & RF_AURA_COLD) - info[i++] = "You are surrounded by a chilly aura."; - /* Not implemented */ - if (r_ptr->flags & RF_NONLIVING) - info[i++] = "You are not living."; - /* Not implemented */ - if (r_ptr->flags & RF_HURT_LITE) - info[i++] = "Your eyes are vulnerable to bright light."; - /* Not implemented */ - if (r_ptr->flags & RF_HURT_ROCK) - info[i++] = "You can be hurt by rock remover."; - if (r_ptr->flags & RF_SUSCEP_FIRE) - info[i++] = "You are vulnerable to fire."; - if (r_ptr->flags & RF_SUSCEP_COLD) - info[i++] = "You are vulnerable to cold."; - if (r_ptr->flags & RF_RES_TELE) - info[i++] = "You are resistant to teleportation."; - if (r_ptr->flags & RF_RES_NETH) - info[i++] = "You are resistant to nether."; - if (r_ptr->flags & RF_RES_WATE) - info[i++] = "You are resistant to water."; - if (r_ptr->flags & RF_RES_PLAS) - info[i++] = "You are resistant to plasma."; - if (r_ptr->flags & RF_RES_WATE) - info[i++] = "You are resistant to nexus."; - if (r_ptr->flags & RF_RES_DISE) - info[i++] = "You are resistant to disease."; - /* Not implemented */ - if (r_ptr->flags & RF_NO_SLEEP) - info[i++] = "You cannot be slept."; - /* Not implemented */ - if (r_ptr->flags & RF_UNIQUE_4) - info[i++] = "You are a Nazgul."; - if (r_ptr->flags & RF_NO_FEAR) - info[i++] = "You are immune to fear."; - if (r_ptr->flags & RF_NO_STUN) - info[i++] = "You are immune to stun."; - if (r_ptr->flags & RF_NO_CONF) - info[i++] = "You are immune to confusion."; - if (r_ptr->flags & RF_NO_SLEEP) - info[i++] = "You are immune to sleep."; - - if (r_ptr->spells & SF_SHRIEK) - info[i++] = "You can aggravate monsters."; - if (r_ptr->spells & SF_ROCKET) - info[i++] = "You can fire a rocket."; - if (r_ptr->spells & SF_ARROW_1) - info[i++] = "You can fire a light arrow."; - if (r_ptr->spells & SF_ARROW_2) - info[i++] = "You can fire a heavy arrow."; - if (r_ptr->spells & SF_ARROW_3) - info[i++] = "You can fire a light missile."; - if (r_ptr->spells & SF_ARROW_4) - info[i++] = "You can fire a heavy missile."; - if (r_ptr->spells & SF_BR_ACID) - info[i++] = "You can breathe acid."; - if (r_ptr->spells & SF_BR_ELEC) - info[i++] = "You can breathe electricity."; - if (r_ptr->spells & SF_BR_FIRE) - info[i++] = "You can breathe fire."; - if (r_ptr->spells & SF_BR_COLD) - info[i++] = "You can breathe cold."; - if (r_ptr->spells & SF_BR_POIS) - info[i++] = "You can breathe poison."; - if (r_ptr->spells & SF_BR_NETH) - info[i++] = "You can breathe nether."; - if (r_ptr->spells & SF_BR_LITE) - info[i++] = "You can breathe light."; - if (r_ptr->spells & SF_BR_DARK) - info[i++] = "You can breathe darkness."; - if (r_ptr->spells & SF_BR_CONF) - info[i++] = "You can breathe confusion."; - if (r_ptr->spells & SF_BR_SOUN) - info[i++] = "You can breathe sound."; - if (r_ptr->spells & SF_BR_CHAO) - info[i++] = "You can breathe chaos."; - if (r_ptr->spells & SF_BR_DISE) - info[i++] = "You can breathe disenchantment."; - if (r_ptr->spells & SF_BR_NEXU) - info[i++] = "You can breathe nexus."; - if (r_ptr->spells & SF_BR_TIME) - info[i++] = "You can breathe time."; - if (r_ptr->spells & SF_BR_INER) - info[i++] = "You can breathe inertia."; - if (r_ptr->spells & SF_BR_GRAV) - info[i++] = "You can breathe gravity."; - if (r_ptr->spells & SF_BR_SHAR) - info[i++] = "You can breathe shards."; - if (r_ptr->spells & SF_BR_PLAS) - info[i++] = "You can breathe plasma."; - if (r_ptr->spells & SF_BR_WALL) - info[i++] = "You can breathe force."; - if (r_ptr->spells & SF_BR_MANA) - info[i++] = "You can breathe mana."; - if (r_ptr->spells & SF_BR_NUKE) - info[i++] = "You can breathe nuke."; - if (r_ptr->spells & SF_BR_DISI) - info[i++] = "You can breathe disintegration."; - if (r_ptr->spells & SF_BA_ACID) - info[i++] = "You can cast a ball of acid."; - if (r_ptr->spells & SF_BA_ELEC) - info[i++] = "You can cast a ball of electricity."; - if (r_ptr->spells & SF_BA_FIRE) - info[i++] = "You can cast a ball of fire."; - if (r_ptr->spells & SF_BA_COLD) - info[i++] = "You can cast a ball of cold."; - if (r_ptr->spells & SF_BA_POIS) - info[i++] = "You can cast a ball of poison."; - if (r_ptr->spells & SF_BA_NETH) - info[i++] = "You can cast a ball of nether."; - if (r_ptr->spells & SF_BA_WATE) - info[i++] = "You can cast a ball of water."; - if (r_ptr->spells & SF_DRAIN_MANA) - info[i++] = "You can drain mana."; - if (r_ptr->spells & SF_MIND_BLAST) - info[i++] = "You can cause mind blasting."; - if (r_ptr->spells & SF_BRAIN_SMASH) - info[i++] = "You can cause brain smashing."; - if (r_ptr->spells & SF_CAUSE_1) - info[i++] = "You can cause light wounds."; - if (r_ptr->spells & SF_CAUSE_2) - info[i++] = "You can cause serious wounds."; - if (r_ptr->spells & SF_CAUSE_3) - info[i++] = "You can cause critical wounds."; - if (r_ptr->spells & SF_CAUSE_4) - info[i++] = "You can cause mortal wounds."; - if (r_ptr->spells & SF_BO_ACID) - info[i++] = "You can cast a bolt of acid."; - if (r_ptr->spells & SF_BO_ELEC) - info[i++] = "You can cast a bolt of electricity."; - if (r_ptr->spells & SF_BO_FIRE) - info[i++] = "You can cast a bolt of fire."; - if (r_ptr->spells & SF_BO_COLD) - info[i++] = "You can cast a bolt of cold."; - if (r_ptr->spells & SF_BO_POIS) - info[i++] = "You can cast a bolt of poison."; - if (r_ptr->spells & SF_BO_NETH) - info[i++] = "You can cast a bolt of nether."; - if (r_ptr->spells & SF_BO_WATE) - info[i++] = "You can cast a bolt of water."; - if (r_ptr->spells & SF_BO_MANA) - info[i++] = "You can cast a bolt of mana."; - if (r_ptr->spells & SF_BO_PLAS) - info[i++] = "You can cast a bolt of plasma."; - if (r_ptr->spells & SF_BO_ICEE) - info[i++] = "You can cast a bolt of ice."; - if (r_ptr->spells & SF_MISSILE) - info[i++] = "You can cast magic missile."; - if (r_ptr->spells & SF_SCARE) - info[i++] = "You can terrify."; - if (r_ptr->spells & SF_BLIND) - info[i++] = "You can blind."; - if (r_ptr->spells & SF_CONF) - info[i++] = "You can use confusion."; - if (r_ptr->spells & SF_SLOW) - info[i++] = "You can cast slow."; - if (r_ptr->spells & SF_HOLD) - info[i++] = "You can touch to paralyze."; - if (r_ptr->spells & SF_HASTE) - info[i++] = "You can haste yourself."; - if (r_ptr->spells & SF_HAND_DOOM) - info[i++] = "You can invoke Hand of Doom."; - if (r_ptr->spells & SF_HEAL) - info[i++] = "You can heal yourself."; - if (r_ptr->spells & SF_BLINK) - info[i++] = "You can blink."; - if (r_ptr->spells & SF_TPORT) - info[i++] = "You can teleport."; - if (r_ptr->spells & SF_TELE_TO) - info[i++] = "You can go between places."; - if (r_ptr->spells & SF_TELE_AWAY) - info[i++] = "You can teleport away."; - if (r_ptr->spells & SF_TELE_LEVEL) - info[i++] = "You can teleport level."; - if (r_ptr->spells & SF_DARKNESS) - info[i++] = "You can create darkness."; - if (r_ptr->spells & SF_FORGET) - info[i++] = "You can fade memories."; - if (r_ptr->spells & SF_RAISE_DEAD) - info[i++] = "You can Raise the Dead."; - if (r_ptr->spells & SF_S_BUG) - info[i++] = "You can magically summon a Software Bugs."; - if (r_ptr->spells & SF_S_RNG) - info[i++] = "You can magically summon the RNG."; - if (r_ptr->spells & SF_S_THUNDERLORD) - info[i++] = "You can magically summon some Thunderlords."; - if (r_ptr->spells & SF_S_KIN) - info[i++] = "You can magically summon some Kins."; - if (r_ptr->spells & SF_S_HI_DEMON) - info[i++] = "You can magically summon greater demons."; - if (r_ptr->spells & SF_S_MONSTER) - info[i++] = "You can magically summon a monster."; - if (r_ptr->spells & SF_S_MONSTERS) - info[i++] = "You can magically summon monsters."; - if (r_ptr->spells & SF_S_ANT) - info[i++] = "You can magically summon ants."; - if (r_ptr->spells & SF_S_SPIDER) - info[i++] = "You can magically summon spiders."; - if (r_ptr->spells & SF_S_HOUND) - info[i++] = "You can magically summon hounds."; - if (r_ptr->spells & SF_S_HYDRA) - info[i++] = "You can magically summon hydras."; - if (r_ptr->spells & SF_S_ANGEL) - info[i++] = "You can magically summon an angel."; - if (r_ptr->spells & SF_S_DEMON) - info[i++] = "You can magically summon a demon."; - if (r_ptr->spells & SF_S_UNDEAD) - info[i++] = "You can magically summon an undead."; - if (r_ptr->spells & SF_S_DRAGON) - info[i++] = "You can magically summon a dragon."; - if (r_ptr->spells & SF_S_HI_UNDEAD) - info[i++] = "You can magically summon greater undead."; - if (r_ptr->spells & SF_S_HI_DRAGON) - info[i++] = "You can magically summon greater dragons."; - if (r_ptr->spells & SF_S_WRAITH) - info[i++] = "You can magically summon a wraith."; - if (r_ptr->spells & SF_S_UNIQUE) - info[i++] = "You can magically summon an unique monster."; - /* Not implemented */ - if (r_ptr->flags & RF_AQUATIC) - info[i++] = "You are aquatic."; - /* Not implemented */ - if (r_ptr->flags & RF_CAN_SWIM) - info[i++] = "You can swim."; - /* Not implemented */ - if (r_ptr->flags & RF_CAN_FLY) - info[i++] = "You can fly."; - if ((r_ptr->flags & RF_MORTAL).empty()) - info[i++] = "You are immortal."; - /* Not implemented */ - if (r_ptr->flags & RF_NAZGUL) - info[i++] = "You are a Nazgul."; - - if (r_ptr->flags & RF_SPIDER) - info[i++] = "You are a spider."; - - if (r_ptr->flags & RF_WILD_TOWN) - info[i++] = "You appear in towns."; - if (r_ptr->flags & RF_WILD_SHORE) - info[i++] = "You appear on the shore."; - if (r_ptr->flags & RF_WILD_OCEAN) - info[i++] = "You appear in the ocean."; - if (r_ptr->flags & RF_WILD_WASTE) - info[i++] = "You appear in the waste."; - if (r_ptr->flags & RF_WILD_WOOD) - info[i++] = "You appear in woods."; - if (r_ptr->flags & RF_WILD_VOLCANO) - info[i++] = "You appear in volcanos."; - if (r_ptr->flags & RF_WILD_MOUNTAIN) - info[i++] = "You appear in the mountains."; - if (r_ptr->flags & RF_WILD_GRASS) - info[i++] = "You appear in grassy areas."; - - if (r_ptr->flags & RF_SUSCEP_ACID) - info[i++] = "You are vulnerable to acid."; - if (r_ptr->flags & RF_SUSCEP_ELEC) - info[i++] = "You are vulnerable to electricity."; - if (r_ptr->flags & RF_SUSCEP_POIS) - info[i++] = "You are vulnerable to poison."; - if (r_ptr->flags & RF_KILL_TREES) - info[i++] = "You can eat trees."; - if (r_ptr->flags & RF_WYRM_PROTECT) - info[i++] = "You are protected by great wyrms of power."; - } - - /* List powers */ - for (iter = 0; iter < POWER_MAX; iter++) - { - if (p_ptr->powers[iter]) - { - info[i++] = powers_type[iter].desc_text; - } - } - - if (p_ptr->allow_one_death) - { - info[i++] = "The Blood of Life flows through your veins."; - } - if (p_ptr->blind) - { - info[i++] = "You cannot see."; - } - if (p_ptr->confused) - { - info[i++] = "You are confused."; - } - if (p_ptr->afraid) - { - info[i++] = "You are terrified."; - } - if (p_ptr->cut) - { - info[i++] = "You are bleeding."; - } - if (p_ptr->stun) - { - info[i++] = "You are stunned."; - } - if (p_ptr->poisoned) - { - info[i++] = "You are poisoned."; - } - if (p_ptr->image) - { - info[i++] = "You are hallucinating."; - } - if (p_ptr->aggravate) - { - info[i++] = "You aggravate monsters."; - } - if (p_ptr->teleport) - { - info[i++] = "Your position is very uncertain."; - } - if (p_ptr->blessed) - { - info[i++] = "You feel righteous."; - } - if (p_ptr->hero) - { - info[i++] = "You feel heroic."; - } - if (p_ptr->shero) - { - info[i++] = "You are in a battle rage."; - } - if (p_ptr->protevil) - { - info[i++] = "You are protected from evil."; - } - if (p_ptr->shield) - { - info[i++] = "You are protected by a mystic shield."; - } - if (p_ptr->invuln) - { - info[i++] = "You are temporarily invulnerable."; - } - if (p_ptr->confusing) - { - info[i++] = "Your hands are glowing dull red."; - } - if (p_ptr->word_recall) - { - info[i++] = "You will soon be recalled."; - } - if (p_ptr->see_infra) - { - info[i++] = "Your eyes are sensitive to infrared light."; - } - if (p_ptr->see_inv) - { - info[i++] = "You can see invisible creatures."; - } - if (p_ptr->magical_breath) - { - info[i++] = "You can breathe without air."; - } - else if (p_ptr->water_breath) - { - info[i++] = "You can breathe underwater."; - } - if (p_ptr->ffall) - { - info[i++] = "You levitate just over the ground."; - } - if (p_ptr->climb) - { - info[i++] = "You can climb high mountains."; - } - if (p_ptr->free_act) - { - info[i++] = "You have free action."; - } - if (p_ptr->regenerate) - { - info[i++] = "You regenerate quickly."; - } - if (p_ptr->slow_digest) - { - info[i++] = "Your appetite is small."; - } - // Telepathy - { - if (p_ptr->computed_flags & ESP_ALL) - { - info[i++] = "You have ESP."; - } - else - { - if (p_ptr->computed_flags & ESP_ORC) info[i++] = "You can sense the presence of orcs."; - if (p_ptr->computed_flags & ESP_TROLL) info[i++] = "You can sense the presence of trolls."; - if (p_ptr->computed_flags & ESP_DRAGON) info[i++] = "You can sense the presence of dragons."; - if (p_ptr->computed_flags & ESP_SPIDER) info[i++] = "You can sense the presence of spiders."; - if (p_ptr->computed_flags & ESP_GIANT) info[i++] = "You can sense the presence of giants."; - if (p_ptr->computed_flags & ESP_DEMON) info[i++] = "You can sense the presence of demons."; - if (p_ptr->computed_flags & ESP_UNDEAD) info[i++] = "You can sense presence of undead."; - if (p_ptr->computed_flags & ESP_EVIL) info[i++] = "You can sense the presence of evil beings."; - if (p_ptr->computed_flags & ESP_ANIMAL) info[i++] = "You can sense the presence of animals."; - if (p_ptr->computed_flags & ESP_THUNDERLORD) info[i++] = "You can sense the presence of thunderlords."; - if (p_ptr->computed_flags & ESP_GOOD) info[i++] = "You can sense the presence of good beings."; - if (p_ptr->computed_flags & ESP_NONLIVING) info[i++] = "You can sense the presence of non-living things."; - if (p_ptr->computed_flags & ESP_UNIQUE) info[i++] = "You can sense the presence of unique beings."; - } - } - if (!luck( -100, 100)) - { - info[i++] = "You have normal luck."; - } - else if (luck( -100, 100) < 0) - { - if (luck( -100, 100) < -90) - { - info[i++] = "You are incredibly unlucky."; - } - else if (luck( -100, 100) < -60) - { - info[i++] = "You are extremely unlucky."; - } - else if (luck( -100, 100) < -30) - { - info[i++] = "You are very unlucky."; - } - else - { - info[i++] = "You are unlucky."; - } - } - else if (luck( -100, 100) > 0) - { - if (luck( -100, 100) > 90) - { - info[i++] = "You are incredibly lucky."; - } - else if (luck( -100, 100) > 60) - { - info[i++] = "You are extremely lucky."; - } - else if (luck( -100, 100) > 30) - { - info[i++] = "You are very lucky."; - } - else - { - info[i++] = "You are lucky."; - } - } - if (p_ptr->auto_id) - { - info[i++] = "You know everything."; - } - if (p_ptr->hold_life) - { - info[i++] = "You have a firm hold on your life force."; - } - if (p_ptr->reflect) - { - info[i++] = "You reflect arrows and bolts."; - } - if (p_ptr->sh_fire) - { - info[i++] = "You are surrounded with a fiery aura."; - } - if (p_ptr->sh_elec) - { - info[i++] = "You are surrounded with electricity."; - } - if (p_ptr->antimagic) - { - info[i++] = "You are surrounded by an anti-magic field."; - } - if (p_ptr->anti_magic) - { - info[i++] = "You are surrounded by an anti-magic shell."; - } - if (p_ptr->wraith_form) - { - info[i++] = "You are incorporeal."; - } - if (p_ptr->anti_tele) - { - info[i++] = "You cannot teleport."; - } - if (p_ptr->lite) - { - info[i++] = "You are carrying a permanent light."; - } - - if (p_ptr->immune_acid) - { - info[i++] = "You are completely immune to acid."; - } - else if ((p_ptr->resist_acid) && (p_ptr->oppose_acid)) - { - info[i++] = "You resist acid exceptionally well."; - } - else if ((p_ptr->resist_acid) || (p_ptr->oppose_acid)) - { - info[i++] = "You are resistant to acid."; - } - - if (p_ptr->immune_elec) - { - info[i++] = "You are completely immune to lightning."; - } - else if ((p_ptr->resist_elec) && (p_ptr->oppose_elec)) - { - info[i++] = "You resist lightning exceptionally well."; - } - else if ((p_ptr->resist_elec) || (p_ptr->oppose_elec)) - { - info[i++] = "You are resistant to lightning."; - } - - if (p_ptr->immune_fire) - { - info[i++] = "You are completely immune to fire."; - } - else if ((p_ptr->resist_fire) && (p_ptr->oppose_fire)) - { - info[i++] = "You resist fire exceptionally well."; - } - else if ((p_ptr->resist_fire) || (p_ptr->oppose_fire)) - { - info[i++] = "You are resistant to fire."; - } - else if (p_ptr->sensible_fire) - { - info[i++] = "You are very vulnerable to fire."; - } - - if (p_ptr->immune_cold) - { - info[i++] = "You are completely immune to cold."; - } - else if ((p_ptr->resist_cold) && (p_ptr->oppose_cold)) - { - info[i++] = "You resist cold exceptionally well."; - } - else if ((p_ptr->resist_cold) || (p_ptr->oppose_cold)) - { - info[i++] = "You are resistant to cold."; - } - - if ((p_ptr->resist_pois) && (p_ptr->oppose_pois)) - { - info[i++] = "You resist poison exceptionally well."; - } - else if ((p_ptr->resist_pois) || (p_ptr->oppose_pois)) - { - info[i++] = "You are resistant to poison."; - } - - if (p_ptr->resist_lite) - { - info[i++] = "You are resistant to bright light."; - } - if (p_ptr->resist_dark) - { - info[i++] = "You are resistant to darkness."; - } - if (p_ptr->resist_conf) - { - info[i++] = "You are resistant to confusion."; - } - if (p_ptr->resist_sound) - { - info[i++] = "You are resistant to sonic attacks."; - } - if (p_ptr->resist_disen) - { - info[i++] = "You are resistant to disenchantment."; - } - if (p_ptr->resist_chaos) - { - info[i++] = "You are resistant to chaos."; - } - if (p_ptr->resist_shard) - { - info[i++] = "You are resistant to blasts of shards."; - } - if (p_ptr->resist_nexus) - { - info[i++] = "You are resistant to nexus attacks."; - } - if (p_ptr->immune_neth) - { - info[i++] = "You are immune to nether forces."; - } - else if (p_ptr->resist_neth) - { - info[i++] = "You are resistant to nether forces."; - } - if (p_ptr->resist_fear) - { - info[i++] = "You are completely fearless."; - } - if (p_ptr->resist_blind) - { - info[i++] = "Your eyes are resistant to blindness."; - } - if (p_ptr->resist_continuum) - { - info[i++] = "The space-time continuum cannot be disrupted near you."; - } - - if (p_ptr->sustain_str) - { - info[i++] = "Your strength is sustained."; - } - if (p_ptr->sustain_int) - { - info[i++] = "Your intelligence is sustained."; - } - if (p_ptr->sustain_wis) - { - info[i++] = "Your wisdom is sustained."; - } - if (p_ptr->sustain_con) - { - info[i++] = "Your constitution is sustained."; - } - if (p_ptr->sustain_dex) - { - info[i++] = "Your dexterity is sustained."; - } - if (p_ptr->sustain_chr) - { - info[i++] = "Your charisma is sustained."; - } - if (p_ptr->black_breath) - { - info[i++] = "You suffer from Black Breath."; - } - - if (flags & TR_STR) - { - info[i++] = "Your strength is affected by your equipment."; - } - if (flags & TR_INT) - { - info[i++] = "Your intelligence is affected by your equipment."; - } - if (flags & TR_WIS) - { - info[i++] = "Your wisdom is affected by your equipment."; - } - if (flags & TR_DEX) - { - info[i++] = "Your dexterity is affected by your equipment."; - } - if (flags & TR_CON) - { - info[i++] = "Your constitution is affected by your equipment."; - } - if (flags & TR_CHR) - { - info[i++] = "Your charisma is affected by your equipment."; - } - - if (flags & TR_STEALTH) - { - info[i++] = "Your stealth is affected by your equipment."; - } - if (flags & TR_INFRA) - { - info[i++] = "Your infravision is affected by your equipment."; - } - if (flags & TR_TUNNEL) - { - info[i++] = "Your digging ability is affected by your equipment."; - } - if (flags & TR_SPEED) - { - info[i++] = "Your speed is affected by your equipment."; - } - if (flags & TR_BLOWS) - { - info[i++] = "Your attack speed is affected by your equipment."; - } - if (flags & TR_CRIT) - { - info[i++] = "Your ability to score critical hits is affected by your equipment."; - } - - - /* Access the current weapon */ - o_ptr = &p_ptr->inventory[INVEN_WIELD]; - - /* Analyze the weapon */ - if (o_ptr->k_idx) - { - flags = object_flags(o_ptr); - - /* Indicate Blessing */ - if (flags & TR_BLESSED) - { - info[i++] = "Your weapon has been blessed by the gods."; - } - - if (flags & TR_CHAOTIC) - { - info[i++] = "Your weapon is branded with the Sign of Chaos."; - } - - /* Hack */ - if (flags & TR_IMPACT) - { - info[i++] = "The impact of your weapon can cause earthquakes."; - } - - if (flags & TR_VORPAL) - { - info[i++] = "Your weapon is very sharp."; - } - - if (flags & TR_VAMPIRIC) - { - info[i++] = "Your weapon drains life from your foes."; - } - - /* Special "Attack Bonuses" */ - if (flags & TR_BRAND_ACID) - { - info[i++] = "Your weapon melts your foes."; - } - if (flags & TR_BRAND_ELEC) - { - info[i++] = "Your weapon shocks your foes."; - } - if (flags & TR_BRAND_FIRE) - { - info[i++] = "Your weapon burns your foes."; - } - if (flags & TR_BRAND_COLD) - { - info[i++] = "Your weapon freezes your foes."; - } - if (flags & TR_BRAND_POIS) - { - info[i++] = "Your weapon poisons your foes."; - } - - /* Special "slay" flags */ - if (flags & TR_SLAY_ANIMAL) - { - info[i++] = "Your weapon strikes at animals with extra force."; - } - if (flags & TR_SLAY_EVIL) - { - info[i++] = "Your weapon strikes at evil with extra force."; - } - if (flags & TR_SLAY_UNDEAD) - { - info[i++] = "Your weapon strikes at undead with holy wrath."; - } - if (flags & TR_SLAY_DEMON) - { - info[i++] = "Your weapon strikes at demons with holy wrath."; - } - if (flags & TR_SLAY_ORC) - { - info[i++] = "Your weapon is especially deadly against orcs."; - } - if (flags & TR_SLAY_TROLL) - { - info[i++] = "Your weapon is especially deadly against trolls."; - } - if (flags & TR_SLAY_GIANT) - { - info[i++] = "Your weapon is especially deadly against giants."; - } - if (flags & TR_SLAY_DRAGON) - { - info[i++] = "Your weapon is especially deadly against dragons."; - } - - /* Special "kill" flags */ - if (flags & TR_KILL_DRAGON) - { - info[i++] = "Your weapon is a great bane of dragons."; - } - /* Special "kill" flags */ - if (flags & TR_KILL_DEMON) - { - info[i++] = "Your weapon is a great bane of demons."; - } - /* Special "kill" flags */ - if (flags & TR_KILL_UNDEAD) - { - info[i++] = "Your weapon is a great bane of undeads."; - } - } - - /* Print on screen or in a file ? */ - if (fff == NULL) - { - /* Save the screen */ - character_icky = TRUE; - Term_save(); - - /* Erase the screen */ - for (k = 1; k < 24; k++) prt("", k, 13); - - /* Label the information */ - prt(" Your Attributes:", 1, 15); - - /* We will print on top of the map (column 13) */ - for (k = 2, j = 0; j < i; j++) - { - /* Show the info */ - prt(info[j], k++, 15); - - /* Every 20 entries (lines 2 to 21), start over */ - if ((k == 22) && (j + 1 < i)) - { - prt("-- more --", k, 15); - inkey(); - for (; k > 2; k--) prt("", k, 15); - } - } - - /* Pause */ - prt("[Press any key to continue]", k, 13); - inkey(); - - /* Restore the screen */ - Term_load(); - character_icky = FALSE; - } - else - { - /* Label the information */ - fprintf(fff, " Your Attributes:\n"); - - /* We will print on top of the map (column 13) */ - for (j = 0; j < i; j ++) - { - /* Show the info */ - fprintf(fff, "%s\n", info[j]); - } - } -} - - static int report_magics_aux(int dur) { if (dur <= 5) diff --git a/src/spells2.hpp b/src/spells2.hpp index 3fcab116..13f2790e 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -23,7 +23,6 @@ extern void identify_pack_fully(void); extern bool_ remove_curse(void); extern bool_ remove_all_curse(void); extern bool_ restore_level(void); -extern void self_knowledge(FILE *fff); extern bool_ lose_all_info(void); extern bool_ detect_traps(int rad); extern bool_ detect_doors(int rad); diff --git a/src/spells3.cc b/src/spells3.cc index 95357ba0..113decf9 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -877,31 +877,16 @@ const char *demonology_control_demon_info() casting_result divination_greater_identify() { - if (get_check("Cast on yourself?")) - { - self_knowledge(NULL); - } - else - { - identify_fully(); - } + identify_fully(); return CAST_OBVIOUS; } casting_result divination_identify() { - if (get_level_s(IDENTIFY, 50) >= 27) - { - casting_result result = NO_CAST; - result = cplus(result, identify_pack()); - result = cplus(result, fire_ball(GF_IDENTIFY, 0, 1, get_level_s(IDENTIFY, 3))); - return result; - } - else if (get_level_s(IDENTIFY, 50) >= 17) + if (get_level_s(IDENTIFY, 50) >= 17) { casting_result result = NO_CAST; result = cplus(result, identify_pack()); - result = cplus(result, fire_ball(GF_IDENTIFY, 0, 1, 0)); return result; } else if (ident_spell()) @@ -3910,10 +3895,6 @@ const char *music_hobbit_melodies_info() int music_clairaudience_lasting() { set_tim_esp(5); - if (get_level_s(MUSIC_MIND, 50) >= 10) - { - fire_ball(GF_IDENTIFY, 0, 1, 1 + get_level(MUSIC_MIND, 3)); - } return get_mana(MUSIC_MIND); } @@ -4543,7 +4524,6 @@ casting_result varda_evenstar_spell() if (get_level_s(VARDA_EVENSTAR, 50) >= 40) { identify_pack(); - self_knowledge(NULL); } return CAST_OBVIOUS; diff --git a/src/tables.cc b/src/tables.cc index b091d764..f87db29c 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -4099,7 +4099,6 @@ gf_name_type gf_names[] = { GF_JAM_DOOR, "door jamming" }, { GF_DOMINATION, "domination" }, { GF_DISP_GOOD, "dispel good" }, - { GF_IDENTIFY, "identification" }, { GF_RAISE, "raise dead" }, { GF_STAR_IDENTIFY, "*identification*" }, { GF_DESTRUCTION, "destruction" }, diff --git a/src/wizard2.cc b/src/wizard2.cc index e5b5d3d3..a291fd63 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -1638,11 +1638,6 @@ void do_cmd_debug() do_cmd_wiz_jump(); break; - /* Self-Knowledge */ - case 'k': - self_knowledge(NULL); - break; - /* Learn about objects */ case 'l': do_cmd_wiz_learn(); -- cgit v1.2.3 From a29534fe8f074be8a1ff084618c194afc7287744 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 22 Oct 2016 21:38:24 +0200 Subject: Rework compiler flags They're all currently identical for both GCC/Clang anyway. Move sanitizer flags to DEBUG-only configuration. Closes #8 --- CMakeLists.txt | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43cea2c3..4379c761 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,33 +11,39 @@ INCLUDE(FindPkgConfig) # # Basic common compiler flags. # -SET(COMMON_COMPILER_FLAGS "-pipe -Wall -Wextra -Wno-unused-value -Wno-unused-parameter -fsanitize=undefined -fsanitize=address") +SET(COMMON_COMPILER_FLAGS "-pipe -Wall -Wextra -Wno-unused-value -Wno-unused-parameter") # -# GCC/G++ flags +# Sanitizer flags for debugging +# +SET(SANITIZER_FLAGS "-fsanitize=undefined -fsanitize=address") + +# +# C Compiler Flags +# +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") +SET(CMAKE_C_FLAGS_RELEASE "-O2") +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g ${SANITIZER_FLAGS}") + +# +# C++ Compiler Flags +# +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++14") +SET(CMAKE_CXX_FLAGS_RELEASE "-O2") +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g ${SANITIZER_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") + +# +# GCC Flags # IF(CMAKE_COMPILER_IS_GNUCC) - # Let's set sensible options. - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") - SET(CMAKE_C_FLAGS_RELEASE "-O2") - SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++14 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") - SET(CMAKE_CXX_FLAGS_RELEASE "-O2") - SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") + # Nothing for now ENDIF() # # Clang flags # -IF("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILER_FLAGS}") - SET(CMAKE_C_FLAGS_RELEASE "-O2") - SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") -ENDIF() IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILER_FLAGS} --std=c++14 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC") - SET(CMAKE_CXX_FLAGS_RELEASE "-O2") - SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") + # Nothing for now ENDIF() # Add standard math library -- cgit v1.2.3 From 5cde1c26dfaff1e8d85888b4375ec6238f983621 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 19 Nov 2016 21:15:54 +0100 Subject: Remove "adornment" amulet --- lib/edit/k_info.txt | 8 -------- lib/mods/theme/edit/k_info.txt | 2 -- src/defines.h | 1 - 3 files changed, 11 deletions(-) diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index b7916096..8a3a37c7 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -1760,14 +1760,6 @@ F:RES_ACID f:RES_ACID D:This magical talisman will make the corroding forces of acid less threatening to your health. -N:169:Adornment -G:":d -I:40:2:0 -W:10:0:3:20 -A:10/1 -F:EASY_KNOW -D:This amulet is not magical. It just looks good. - ##### Extra armour ##### N:170:& Double Ring Mail~ diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index c53f40f3..c15808dc 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -1679,8 +1679,6 @@ F:TELEPORT f:TELEPORT D:This amulet nastily throws you all over the place. -# Replacing Adornment with Protection from Evil from T-Plus by Ingeborg S. Norden - N:169:Protection from Evil G:":d I:40:2:0 diff --git a/src/defines.h b/src/defines.h index 6fab7852..7f43e7f4 100644 --- a/src/defines.h +++ b/src/defines.h @@ -1204,7 +1204,6 @@ /* The "sval" codes for TV_AMULET */ #define SV_AMULET_DOOM 0 #define SV_AMULET_TELEPORT 1 -#define SV_AMULET_ADORNMENT 2 #define SV_AMULET_SLOW_DIGEST 3 #define SV_AMULET_RESIST_ACID 4 #define SV_AMULET_BRILLANCE 6 -- cgit v1.2.3 From f8298b525a99f371c614554685d83ad2056af416 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 19 Nov 2016 21:16:13 +0100 Subject: Fix off-by-one when renaming Automatizer rule --- src/squeltch.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/squeltch.cc b/src/squeltch.cc index 43f566ea..747c6beb 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -251,7 +251,7 @@ static void rename_rule(Rule *rule) Term_get_size(&wid, &hgt); sprintf(name, "%s", rule->get_name()); - if (input_box("New name?", hgt / 2, wid / 2, name, sizeof(name))) + if (input_box("New name?", hgt / 2, wid / 2, name, sizeof(name) - 1)) { rule->set_name(name); } -- cgit v1.2.3 From 33ab0c7749426684d044bd25da05526bf19de742 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 19 Nov 2016 21:16:34 +0100 Subject: Reduce length of "light radius" object description message --- src/object1.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object1.cc b/src/object1.cc index ad82f20f..4c065b24 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -2629,7 +2629,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait } else { - text_out(format("It provides light (radius %d) forever. ", radius)); + text_out(format("It provides light (radius %d). ", radius)); } } } -- cgit v1.2.3 From b774262f0a15e1dded8f11474256015a6e639792 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 4 Jan 2017 21:13:15 +0100 Subject: Remove unused artifact_type::max_num --- src/artifact_type.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/artifact_type.hpp b/src/artifact_type.hpp index 8ff53433..9f866aa7 100644 --- a/src/artifact_type.hpp +++ b/src/artifact_type.hpp @@ -42,7 +42,6 @@ struct artifact_type byte rarity = 0; /* Artifact rarity */ byte cur_num = 0; /* Number created (0 or 1) */ - byte max_num = 0; /* Unused (should be "1") */ s16b power = 0; /* Power granted, if any */ -- cgit v1.2.3 From ed08d82d76665f84d5fd9ce4ef41e84542b010cc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 4 Jan 2017 21:26:49 +0100 Subject: Remove obsolete 'cppformat' vendor code --- CMakeLists.txt | 5 + src/CMakeLists.txt | 4 - vendor/cppformat/format.cc | 1385 ------------------- vendor/cppformat/format.h | 3259 -------------------------------------------- 4 files changed, 5 insertions(+), 4648 deletions(-) delete mode 100644 vendor/cppformat/format.cc delete mode 100644 vendor/cppformat/format.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4379c761..61b8dda7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,11 @@ IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # Nothing for now ENDIF() +# +# fmt +# +ADD_DEFINITIONS(-DFMT_HEADER_ONLY) + # Add standard math library SET(LIBS ${LIBS} m) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3b8189b5..1900ac72 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,10 +8,6 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/jsoncons) # Add subdirectories ADD_SUBDIRECTORY (squelch) -# Sources (vendor) -SET(SRCS_VENDOR - ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/cppformat/format.cc) - # Sources (common) SET(SRCS_COMMON birth.cc diff --git a/vendor/cppformat/format.cc b/vendor/cppformat/format.cc deleted file mode 100644 index d17c2d68..00000000 --- a/vendor/cppformat/format.cc +++ /dev/null @@ -1,1385 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2015, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "format.h" - -#include - -#include -#include -#include -#include -#include -#include // for std::ptrdiff_t - -#if defined(_WIN32) && defined(__MINGW32__) -# include -#endif - -#if FMT_USE_WINDOWS_H -# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) -# include -# else -# define NOMINMAX -# include -# undef NOMINMAX -# endif -#endif - -using fmt::internal::Arg; - -// Check if exceptions are disabled. -#if defined(__GNUC__) && !defined(__EXCEPTIONS) -# define FMT_EXCEPTIONS 0 -#endif -#if defined(_MSC_VER) && !_HAS_EXCEPTIONS -# define FMT_EXCEPTIONS 0 -#endif -#ifndef FMT_EXCEPTIONS -# define FMT_EXCEPTIONS 1 -#endif - -#if FMT_EXCEPTIONS -# define FMT_TRY try -# define FMT_CATCH(x) catch (x) -#else -# define FMT_TRY if (true) -# define FMT_CATCH(x) if (false) -#endif - -#ifndef FMT_THROW -# if FMT_EXCEPTIONS -# define FMT_THROW(x) throw x -# else -# define FMT_THROW(x) assert(false) -# endif -#endif - -#ifdef FMT_HEADER_ONLY -# define FMT_FUNC inline -#else -# define FMT_FUNC -#endif - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable: 4127) // conditional expression is constant -# pragma warning(disable: 4702) // unreachable code -// Disable deprecation warning for strerror. The latter is not called but -// MSVC fails to detect it. -# pragma warning(disable: 4996) -#endif - -// Dummy implementations of strerror_r and strerror_s called if corresponding -// system functions are not available. -static inline fmt::internal::Null<> strerror_r(int, char *, ...) { - return fmt::internal::Null<>(); -} -static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { - return fmt::internal::Null<>(); -} - -namespace fmt { -namespace { - -#ifndef _MSC_VER -# define FMT_SNPRINTF snprintf -#else // _MSC_VER -inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { - va_list args; - va_start(args, format); - int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); - va_end(args); - return result; -} -# define FMT_SNPRINTF fmt_snprintf -#endif // _MSC_VER - -#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) -# define FMT_SWPRINTF snwprintf -#else -# define FMT_SWPRINTF swprintf -#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) - -// Checks if a value fits in int - used to avoid warnings about comparing -// signed and unsigned integers. -template -struct IntChecker { - template - static bool fits_in_int(T value) { - unsigned max = INT_MAX; - return value <= max; - } - static bool fits_in_int(bool) { return true; } -}; - -template <> -struct IntChecker { - template - static bool fits_in_int(T value) { - return value >= INT_MIN && value <= INT_MAX; - } - static bool fits_in_int(int) { return true; } -}; - -const char RESET_COLOR[] = "\x1b[0m"; - -typedef void (*FormatFunc)(fmt::Writer &, int, fmt::StringRef); - -// Portable thread-safe version of strerror. -// Sets buffer to point to a string describing the error code. -// This can be either a pointer to a string stored in buffer, -// or a pointer to some static immutable string. -// Returns one of the following values: -// 0 - success -// ERANGE - buffer is not large enough to store the error message -// other - failure -// Buffer should be at least of size 1. -int safe_strerror( - int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { - FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); - - class StrError { - private: - int error_code_; - char *&buffer_; - std::size_t buffer_size_; - - // A noop assignment operator to avoid bogus warnings. - void operator=(const StrError &) {} - - // Handle the result of XSI-compliant version of strerror_r. - int handle(int result) { - // glibc versions before 2.13 return result in errno. - return result == -1 ? errno : result; - } - - // Handle the result of GNU-specific version of strerror_r. - int handle(char *message) { - // If the buffer is full then the message is probably truncated. - if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) - return ERANGE; - buffer_ = message; - return 0; - } - - // Handle the case when strerror_r is not available. - int handle(fmt::internal::Null<>) { - return fallback(strerror_s(buffer_, buffer_size_, error_code_)); - } - - // Fallback to strerror_s when strerror_r is not available. - int fallback(int result) { - // If the buffer is full then the message is probably truncated. - return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? - ERANGE : result; - } - - // Fallback to strerror if strerror_r and strerror_s are not available. - int fallback(fmt::internal::Null<>) { - errno = 0; - buffer_ = strerror(error_code_); - return errno; - } - - public: - StrError(int err_code, char *&buf, std::size_t buf_size) - : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} - - int run() { - strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. - return handle(strerror_r(error_code_, buffer_, buffer_size_)); - } - }; - return StrError(error_code, buffer, buffer_size).run(); -} - -void format_error_code(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - // Report error code making sure that the output fits into - // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential - // bad_alloc. - out.clear(); - static const char SEP[] = ": "; - static const char ERROR_STR[] = "error "; - fmt::internal::IntTraits::MainType ec_value = error_code; - // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. - std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; - error_code_size += fmt::internal::count_digits(ec_value); - if (message.size() <= fmt::internal::INLINE_BUFFER_SIZE - error_code_size) - out << message << SEP; - out << ERROR_STR << error_code; - assert(out.size() <= fmt::internal::INLINE_BUFFER_SIZE); -} - -void report_error(FormatFunc func, - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - fmt::MemoryWriter full_message; - func(full_message, error_code, message); - // Use Writer::data instead of Writer::c_str to avoid potential memory - // allocation. - std::fwrite(full_message.data(), full_message.size(), 1, stderr); - std::fputc('\n', stderr); -} - -// IsZeroInt::visit(arg) returns true iff arg is a zero integer. -class IsZeroInt : public fmt::internal::ArgVisitor { - public: - template - bool visit_any_int(T value) { return value == 0; } -}; - -// Parses an unsigned integer advancing s to the end of the parsed input. -// This function assumes that the first character of s is a digit. -template -int parse_nonnegative_int(const Char *&s) { - assert('0' <= *s && *s <= '9'); - unsigned value = 0; - do { - unsigned new_value = value * 10 + (*s++ - '0'); - // Check if value wrapped around. - if (new_value < value) { - value = UINT_MAX; - break; - } - value = new_value; - } while ('0' <= *s && *s <= '9'); - if (value > INT_MAX) - FMT_THROW(fmt::FormatError("number is too big")); - return value; -} - -template -inline bool is_name_start(Char c) { - return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; -} - -inline void require_numeric_argument(const Arg &arg, char spec) { - if (arg.type > Arg::LAST_NUMERIC_TYPE) { - std::string message = - fmt::format("format specifier '{}' requires numeric argument", spec); - FMT_THROW(fmt::FormatError(message)); - } -} - -template -void check_sign(const Char *&s, const Arg &arg) { - char sign = static_cast(*s); - require_numeric_argument(arg, sign); - if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) { - FMT_THROW(fmt::FormatError(fmt::format( - "format specifier '{}' requires signed argument", sign))); - } - ++s; -} - -// Checks if an argument is a valid printf width specifier and sets -// left alignment if it is negative. -class WidthHandler : public fmt::internal::ArgVisitor { - private: - fmt::FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); - - public: - explicit WidthHandler(fmt::FormatSpec &spec) : spec_(spec) {} - - void report_unhandled_arg() { - FMT_THROW(fmt::FormatError("width is not integer")); - } - - template - unsigned visit_any_int(T value) { - typedef typename fmt::internal::IntTraits::MainType UnsignedType; - UnsignedType width = value; - if (fmt::internal::is_negative(value)) { - spec_.align_ = fmt::ALIGN_LEFT; - width = 0 - width; - } - if (width > INT_MAX) - FMT_THROW(fmt::FormatError("number is too big")); - return static_cast(width); - } -}; - -class PrecisionHandler : - public fmt::internal::ArgVisitor { - public: - void report_unhandled_arg() { - FMT_THROW(fmt::FormatError("precision is not integer")); - } - - template - int visit_any_int(T value) { - if (!IntChecker::is_signed>::fits_in_int(value)) - FMT_THROW(fmt::FormatError("number is too big")); - return static_cast(value); - } -}; - -// Converts an integer argument to an integral type T for printf. -template -class ArgConverter : public fmt::internal::ArgVisitor, void> { - private: - fmt::internal::Arg &arg_; - wchar_t type_; - - FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); - - public: - ArgConverter(fmt::internal::Arg &arg, wchar_t type) - : arg_(arg), type_(type) {} - - void visit_bool(bool value) { - if (type_ != 's') - visit_any_int(value); - } - - template - void visit_any_int(U value) { - bool is_signed = type_ == 'd' || type_ == 'i'; - using fmt::internal::Arg; - if (sizeof(T) <= sizeof(int)) { - // Extra casts are used to silence warnings. - if (is_signed) { - arg_.type = Arg::INT; - arg_.int_value = static_cast(static_cast(value)); - } else { - arg_.type = Arg::UINT; - arg_.uint_value = static_cast( - static_cast::Type>(value)); - } - } else { - if (is_signed) { - arg_.type = Arg::LONG_LONG; - arg_.long_long_value = - static_cast::Type>(value); - } else { - arg_.type = Arg::ULONG_LONG; - arg_.ulong_long_value = - static_cast::Type>(value); - } - } - } -}; - -// Converts an integer argument to char for printf. -class CharConverter : public fmt::internal::ArgVisitor { - private: - fmt::internal::Arg &arg_; - - FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); - - public: - explicit CharConverter(fmt::internal::Arg &arg) : arg_(arg) {} - - template - void visit_any_int(T value) { - arg_.type = Arg::CHAR; - arg_.int_value = static_cast(value); - } -}; -} // namespace - -namespace internal { - -template -class BasicArgFormatter : public ArgVisitor { - private: - BasicWriter &writer_; - FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicArgFormatter); - - void write_pointer(const void *p) { - spec_.flags_ = HASH_FLAG; - spec_.type_ = 'x'; - writer_.write_int(reinterpret_cast(p), spec_); - } - - protected: - BasicWriter &writer() { return writer_; } - FormatSpec &spec() { return spec_; } - - void write(bool value) { - const char *str_value = value ? "true" : "false"; - Arg::StringValue str = { str_value, strlen(str_value) }; - writer_.write_str(str, spec_); - } - - void write(const char *value) { - Arg::StringValue str = {value, value != 0 ? strlen(value) : 0}; - writer_.write_str(str, spec_); - } - - public: - BasicArgFormatter(BasicWriter &w, FormatSpec &s) - : writer_(w), spec_(s) {} - - template - void visit_any_int(T value) { writer_.write_int(value, spec_); } - - template - void visit_any_double(T value) { writer_.write_double(value, spec_); } - - void visit_bool(bool value) { - if (spec_.type_) - return visit_any_int(value); - write(value); - } - - void visit_char(int value) { - if (spec_.type_ && spec_.type_ != 'c') { - spec_.flags_ |= CHAR_FLAG; - writer_.write_int(value, spec_); - return; - } - if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) - FMT_THROW(FormatError("invalid format specifier for char")); - typedef typename BasicWriter::CharPtr CharPtr; - Char fill = internal::CharTraits::cast(spec_.fill()); - CharPtr out = CharPtr(); - const unsigned CHAR_WIDTH = 1; - if (spec_.width_ > CHAR_WIDTH) { - out = writer_.grow_buffer(spec_.width_); - if (spec_.align_ == ALIGN_RIGHT) { - std::fill_n(out, spec_.width_ - CHAR_WIDTH, fill); - out += spec_.width_ - CHAR_WIDTH; - } else if (spec_.align_ == ALIGN_CENTER) { - out = writer_.fill_padding(out, spec_.width_, - internal::check(CHAR_WIDTH), fill); - } else { - std::fill_n(out + CHAR_WIDTH, spec_.width_ - CHAR_WIDTH, fill); - } - } else { - out = writer_.grow_buffer(CHAR_WIDTH); - } - *out = internal::CharTraits::cast(value); - } - - void visit_cstring(const char *value) { - if (spec_.type_ == 'p') - return write_pointer(value); - write(value); - } - - void visit_string(Arg::StringValue value) { - writer_.write_str(value, spec_); - } - - using ArgVisitor::visit_wstring; - - void visit_wstring(Arg::StringValue value) { - writer_.write_str(value, spec_); - } - - void visit_pointer(const void *value) { - if (spec_.type_ && spec_.type_ != 'p') - report_unknown_type(spec_.type_, "pointer"); - write_pointer(value); - } -}; - -// An argument formatter. -template -class ArgFormatter : public BasicArgFormatter, Char> { - private: - BasicFormatter &formatter_; - const Char *format_; - - public: - ArgFormatter(BasicFormatter &f, FormatSpec &s, const Char *fmt) - : BasicArgFormatter, Char>(f.writer(), s), - formatter_(f), format_(fmt) {} - - void visit_custom(Arg::CustomValue c) { - c.format(&formatter_, c.value, &format_); - } -}; - -template -class PrintfArgFormatter : - public BasicArgFormatter, Char> { - - void write_null_pointer() { - this->spec().type_ = 0; - this->write("(nil)"); - } - - typedef BasicArgFormatter, Char> Base; - - public: - PrintfArgFormatter(BasicWriter &w, FormatSpec &s) - : BasicArgFormatter, Char>(w, s) {} - - void visit_bool(bool value) { - FormatSpec &fmt_spec = this->spec(); - if (fmt_spec.type_ != 's') - return this->visit_any_int(value); - fmt_spec.type_ = 0; - this->write(value); - } - - void visit_char(int value) { - const FormatSpec &fmt_spec = this->spec(); - BasicWriter &w = this->writer(); - if (fmt_spec.type_ && fmt_spec.type_ != 'c') - w.write_int(value, fmt_spec); - typedef typename BasicWriter::CharPtr CharPtr; - CharPtr out = CharPtr(); - if (fmt_spec.width_ > 1) { - Char fill = ' '; - out = w.grow_buffer(fmt_spec.width_); - if (fmt_spec.align_ != ALIGN_LEFT) { - std::fill_n(out, fmt_spec.width_ - 1, fill); - out += fmt_spec.width_ - 1; - } else { - std::fill_n(out + 1, fmt_spec.width_ - 1, fill); - } - } else { - out = w.grow_buffer(1); - } - *out = static_cast(value); - } - - void visit_cstring(const char *value) { - if (value) - Base::visit_cstring(value); - else if (this->spec().type_ == 'p') - write_null_pointer(); - else - this->write("(null)"); - } - - void visit_pointer(const void *value) { - if (value) - return Base::visit_pointer(value); - this->spec().type_ = 0; - write_null_pointer(); - } - - void visit_custom(Arg::CustomValue c) { - BasicFormatter formatter(ArgList(), this->writer()); - const Char format_str[] = {'}', 0}; - const Char *format = format_str; - c.format(&formatter, c.value, &format); - } -}; -} // namespace internal -} // namespace fmt - -FMT_FUNC void fmt::SystemError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_system_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -template -int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, value) : - FMT_SNPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, width, value) : - FMT_SNPRINTF(buffer, size, format, width, precision, value); -} - -template -int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, value) : - FMT_SWPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, width, value) : - FMT_SWPRINTF(buffer, size, format, width, precision, value); -} - -template -const char fmt::internal::BasicData::DIGITS[] = - "0001020304050607080910111213141516171819" - "2021222324252627282930313233343536373839" - "4041424344454647484950515253545556575859" - "6061626364656667686970717273747576777879" - "8081828384858687888990919293949596979899"; - -#define FMT_POWERS_OF_10(factor) \ - factor * 10, \ - factor * 100, \ - factor * 1000, \ - factor * 10000, \ - factor * 100000, \ - factor * 1000000, \ - factor * 10000000, \ - factor * 100000000, \ - factor * 1000000000 - -template -const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { - 0, FMT_POWERS_OF_10(1) -}; - -template -const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { - 0, - FMT_POWERS_OF_10(1), - FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), - // Multiply several constants instead of using a single long long constant - // to avoid warnings about C++98 not supporting long long. - fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 -}; - -FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { - (void)type; - if (std::isprint(static_cast(code))) { - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '{}' for {}", code, type))); - } - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '\\x{:02x}' for {}", - static_cast(code), type))); -} - -#if FMT_USE_WINDOWS_H - -FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { - static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; - if (s.size() > INT_MAX) - FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); - int s_size = static_cast(s.size()); - int length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_.resize(length + 1); - length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_[length] = 0; -} - -FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { - if (int error_code = convert(s)) { - FMT_THROW(WindowsError(error_code, - "cannot convert string from UTF-16 to UTF-8")); - } -} - -FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { - if (s.size() > INT_MAX) - return ERROR_INVALID_PARAMETER; - int s_size = static_cast(s.size()); - int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); - if (length == 0) - return GetLastError(); - buffer_.resize(length + 1); - length = WideCharToMultiByte( - CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); - if (length == 0) - return GetLastError(); - buffer_[length] = 0; - return 0; -} - -FMT_FUNC void fmt::WindowsError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_windows_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -FMT_FUNC void fmt::internal::format_windows_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - class String { - private: - LPWSTR str_; - - public: - String() : str_() {} - ~String() { LocalFree(str_); } - LPWSTR *ptr() { return &str_; } - LPCWSTR c_str() const { return str_; } - }; - FMT_TRY { - String system_message; - if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, - error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - reinterpret_cast(system_message.ptr()), 0, 0)) { - UTF16ToUTF8 utf8_message; - if (utf8_message.convert(system_message.c_str()) == ERROR_SUCCESS) { - out << message << ": " << utf8_message; - return; - } - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -#endif // FMT_USE_WINDOWS_H - -FMT_FUNC void fmt::internal::format_system_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - FMT_TRY { - MemoryBuffer buffer; - buffer.resize(INLINE_BUFFER_SIZE); - for (;;) { - char *system_message = &buffer[0]; - int result = safe_strerror(error_code, system_message, buffer.size()); - if (result == 0) { - out << message << ": " << system_message; - return; - } - if (result != ERANGE) - break; // Can't get error message, report error code instead. - buffer.resize(buffer.size() * 2); - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -template -void fmt::internal::ArgMap::init(const ArgList &args) { - if (!map_.empty()) - return; - typedef internal::NamedArg NamedArg; - const NamedArg *named_arg = 0; - bool use_values = - args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; - if (use_values) { - for (unsigned i = 0;/*nothing*/; ++i) { - internal::Arg::Type arg_type = args.type(i); - switch (arg_type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.values_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } - return; - } - for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { - internal::Arg::Type arg_type = args.type(i); - if (arg_type == internal::Arg::NAMED_ARG) { - named_arg = static_cast(args.args_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); - } - } - for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { - switch (args.args_[i].type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.args_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } -} - -template -void fmt::internal::FixedBuffer::grow(std::size_t) { - FMT_THROW(std::runtime_error("buffer overflow")); -} - -template -template -void fmt::BasicWriter::write_str( - const Arg::StringValue &s, const FormatSpec &spec) { - // Check if StrChar is convertible to Char. - internal::CharTraits::convert(StrChar()); - if (spec.type_ && spec.type_ != 's') - internal::report_unknown_type(spec.type_, "string"); - const StrChar *str_value = s.value; - std::size_t str_size = s.size; - if (str_size == 0) { - if (!str_value) { - FMT_THROW(FormatError("string pointer is null")); - return; - } - } - std::size_t precision = spec.precision_; - if (spec.precision_ >= 0 && precision < str_size) - str_size = spec.precision_; - write_str(str_value, str_size, spec); -} - -template -inline Arg fmt::BasicFormatter::get_arg( - BasicStringRef arg_name, const char *&error) { - if (check_no_auto_index(error)) { - map_.init(args()); - const Arg *arg = map_.find(arg_name); - if (arg) - return *arg; - error = "argument not found"; - } - return Arg(); -} - -template -inline Arg fmt::BasicFormatter::parse_arg_index(const Char *&s) { - const char *error = 0; - Arg arg = *s < '0' || *s > '9' ? - next_arg(error) : get_arg(parse_nonnegative_int(s), error); - if (error) { - FMT_THROW(FormatError( - *s != '}' && *s != ':' ? "invalid format string" : error)); - } - return arg; -} - -template -inline Arg fmt::BasicFormatter::parse_arg_name(const Char *&s) { - assert(is_name_start(*s)); - const Char *start = s; - Char c; - do { - c = *++s; - } while (is_name_start(c) || ('0' <= c && c <= '9')); - const char *error = 0; - Arg arg = get_arg(fmt::BasicStringRef(start, s - start), error); - if (error) - FMT_THROW(fmt::FormatError(error)); - return arg; -} - -FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( - unsigned arg_index, const char *&error) { - Arg arg = args_[arg_index]; - switch (arg.type) { - case Arg::NONE: - error = "argument index out of range"; - break; - case Arg::NAMED_ARG: - arg = *static_cast(arg.pointer); - default: - /*nothing*/; - } - return arg; -} - -inline Arg fmt::internal::FormatterBase::next_arg(const char *&error) { - if (next_arg_index_ >= 0) - return do_get_arg(next_arg_index_++, error); - error = "cannot switch from manual to automatic argument indexing"; - return Arg(); -} - -inline bool fmt::internal::FormatterBase::check_no_auto_index( - const char *&error) { - if (next_arg_index_ > 0) { - error = "cannot switch from automatic to manual argument indexing"; - return false; - } - next_arg_index_ = -1; - return true; -} - -inline Arg fmt::internal::FormatterBase::get_arg( - unsigned arg_index, const char *&error) { - return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); -} - -template -void fmt::internal::PrintfFormatter::parse_flags( - FormatSpec &spec, const Char *&s) { - for (;;) { - switch (*s++) { - case '-': - spec.align_ = ALIGN_LEFT; - break; - case '+': - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '0': - spec.fill_ = '0'; - break; - case ' ': - spec.flags_ |= SIGN_FLAG; - break; - case '#': - spec.flags_ |= HASH_FLAG; - break; - default: - --s; - return; - } - } -} - -template -Arg fmt::internal::PrintfFormatter::get_arg( - const Char *s, unsigned arg_index) { - (void)s; - const char *error = 0; - Arg arg = arg_index == UINT_MAX ? - next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); - if (error) - FMT_THROW(FormatError(!*s ? "invalid format string" : error)); - return arg; -} - -template -unsigned fmt::internal::PrintfFormatter::parse_header( - const Char *&s, FormatSpec &spec) { - unsigned arg_index = UINT_MAX; - Char c = *s; - if (c >= '0' && c <= '9') { - // Parse an argument index (if followed by '$') or a width possibly - // preceded with '0' flag(s). - unsigned value = parse_nonnegative_int(s); - if (*s == '$') { // value is an argument index - ++s; - arg_index = value; - } else { - if (c == '0') - spec.fill_ = '0'; - if (value != 0) { - // Nonzero value means that we parsed width and don't need to - // parse it or flags again, so return now. - spec.width_ = value; - return arg_index; - } - } - } - parse_flags(spec, s); - // Parse width. - if (*s >= '0' && *s <= '9') { - spec.width_ = parse_nonnegative_int(s); - } else if (*s == '*') { - ++s; - spec.width_ = WidthHandler(spec).visit(get_arg(s)); - } - return arg_index; -} - -template -void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, BasicCStringRef format_str) { - const Char *start = format_str.c_str(); - const Char *s = start; - while (*s) { - Char c = *s++; - if (c != '%') continue; - if (*s == c) { - write(writer, start, s); - start = ++s; - continue; - } - write(writer, start, s - 1); - - FormatSpec spec; - spec.align_ = ALIGN_RIGHT; - - // Parse argument index, flags and width. - unsigned arg_index = parse_header(s, spec); - - // Parse precision. - if (*s == '.') { - ++s; - if ('0' <= *s && *s <= '9') { - spec.precision_ = parse_nonnegative_int(s); - } else if (*s == '*') { - ++s; - spec.precision_ = PrecisionHandler().visit(get_arg(s)); - } - } - - Arg arg = get_arg(s, arg_index); - if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) - spec.flags_ &= ~HASH_FLAG; - if (spec.fill_ == '0') { - if (arg.type <= Arg::LAST_NUMERIC_TYPE) - spec.align_ = ALIGN_NUMERIC; - else - spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. - } - - // Parse length and convert the argument to the required type. - switch (*s++) { - case 'h': - if (*s == 'h') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'l': - if (*s == 'l') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'j': - ArgConverter(arg, *s).visit(arg); - break; - case 'z': - ArgConverter(arg, *s).visit(arg); - break; - case 't': - ArgConverter(arg, *s).visit(arg); - break; - case 'L': - // printf produces garbage when 'L' is omitted for long double, no - // need to do the same. - break; - default: - --s; - ArgConverter(arg, *s).visit(arg); - } - - // Parse type. - if (!*s) - FMT_THROW(FormatError("invalid format string")); - spec.type_ = static_cast(*s++); - if (arg.type <= Arg::LAST_INTEGER_TYPE) { - // Normalize type. - switch (spec.type_) { - case 'i': case 'u': - spec.type_ = 'd'; - break; - case 'c': - // TODO: handle wchar_t - CharConverter(arg).visit(arg); - break; - } - } - - start = s; - - // Format argument. - internal::PrintfArgFormatter(writer, spec).visit(arg); - } - write(writer, start, s); -} - -template -const Char *fmt::BasicFormatter::format( - const Char *&format_str, const Arg &arg) { - const Char *s = format_str; - FormatSpec spec; - if (*s == ':') { - if (arg.type == Arg::CUSTOM) { - arg.custom.format(this, arg.custom.value, &s); - return s; - } - ++s; - // Parse fill and alignment. - if (Char c = *s) { - const Char *p = s + 1; - spec.align_ = ALIGN_DEFAULT; - do { - switch (*p) { - case '<': - spec.align_ = ALIGN_LEFT; - break; - case '>': - spec.align_ = ALIGN_RIGHT; - break; - case '=': - spec.align_ = ALIGN_NUMERIC; - break; - case '^': - spec.align_ = ALIGN_CENTER; - break; - } - if (spec.align_ != ALIGN_DEFAULT) { - if (p != s) { - if (c == '}') break; - if (c == '{') - FMT_THROW(FormatError("invalid fill character '{'")); - s += 2; - spec.fill_ = c; - } else ++s; - if (spec.align_ == ALIGN_NUMERIC) - require_numeric_argument(arg, '='); - break; - } - } while (--p >= s); - } - - // Parse sign. - switch (*s) { - case '+': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '-': - check_sign(s, arg); - spec.flags_ |= MINUS_FLAG; - break; - case ' ': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG; - break; - } - - if (*s == '#') { - require_numeric_argument(arg, '#'); - spec.flags_ |= HASH_FLAG; - ++s; - } - - // Parse zero flag. - if (*s == '0') { - require_numeric_argument(arg, '0'); - spec.align_ = ALIGN_NUMERIC; - spec.fill_ = '0'; - ++s; - } - - // Parse width. - if ('0' <= *s && *s <= '9') { - spec.width_ = parse_nonnegative_int(s); - } else if (*s == '{') { - ++s; - Arg width_arg = is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (width_arg.type) { - case Arg::INT: - if (width_arg.int_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.int_value; - break; - case Arg::UINT: - value = width_arg.uint_value; - break; - case Arg::LONG_LONG: - if (width_arg.long_long_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = width_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("width is not integer")); - } - if (value > INT_MAX) - FMT_THROW(FormatError("number is too big")); - spec.width_ = static_cast(value); - } - - // Parse precision. - if (*s == '.') { - ++s; - spec.precision_ = 0; - if ('0' <= *s && *s <= '9') { - spec.precision_ = parse_nonnegative_int(s); - } else if (*s == '{') { - ++s; - Arg precision_arg = - is_name_start(*s) ? parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (precision_arg.type) { - case Arg::INT: - if (precision_arg.int_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.int_value; - break; - case Arg::UINT: - value = precision_arg.uint_value; - break; - case Arg::LONG_LONG: - if (precision_arg.long_long_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = precision_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("precision is not integer")); - } - if (value > INT_MAX) - FMT_THROW(FormatError("number is too big")); - spec.precision_ = static_cast(value); - } else { - FMT_THROW(FormatError("missing precision specifier")); - } - if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) { - FMT_THROW(FormatError( - fmt::format("precision not allowed in {} format specifier", - arg.type == Arg::POINTER ? "pointer" : "integer"))); - } - } - - // Parse type. - if (*s != '}' && *s) - spec.type_ = static_cast(*s++); - } - - if (*s++ != '}') - FMT_THROW(FormatError("missing '}' in format string")); - - // Format argument. - internal::ArgFormatter(*this, spec, s - 1).visit(arg); - return s; -} - -template -void fmt::BasicFormatter::format(BasicCStringRef format_str) { - const Char *s = format_str.c_str(); - const Char *start = s; - while (*s) { - Char c = *s++; - if (c != '{' && c != '}') continue; - if (*s == c) { - write(writer_, start, s); - start = ++s; - continue; - } - if (c == '}') - FMT_THROW(FormatError("unmatched '}' in format string")); - write(writer_, start, s - 1); - Arg arg = is_name_start(*s) ? parse_arg_name(s) : parse_arg_index(s); - start = s = format(s, arg); - } - write(writer_, start, s); -} - -FMT_FUNC void fmt::report_system_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_system_error, error_code, message); -} - -#if FMT_USE_WINDOWS_H -FMT_FUNC void fmt::report_windows_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_windows_error, error_code, message); -} -#endif - -FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - std::fwrite(w.data(), 1, w.size(), f); -} - -FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { - print(stdout, format_str, args); -} - -FMT_FUNC void fmt::print(std::ostream &os, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - os.write(w.data(), w.size()); -} - -FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { - char escape[] = "\x1b[30m"; - escape[3] = static_cast('0' + c); - std::fputs(escape, stdout); - print(format, args); - std::fputs(RESET_COLOR, stdout); -} - -FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - std::size_t size = w.size(); - return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); -} - -#ifndef FMT_HEADER_ONLY - -template struct fmt::internal::BasicData; - -// Explicit instantiations for char. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template const char *fmt::BasicFormatter::format( - const char *&format_str, const fmt::internal::Arg &arg); - -template void fmt::BasicFormatter::format(CStringRef format); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, CStringRef format); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, long double value); - -// Explicit instantiations for wchar_t. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template const wchar_t *fmt::BasicFormatter::format( - const wchar_t *&format_str, const fmt::internal::Arg &arg); - -template void fmt::BasicFormatter::format( - BasicCStringRef format); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, WCStringRef format); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, long double value); - -#endif // FMT_HEADER_ONLY - -#ifdef _MSC_VER -# pragma warning(pop) -#endif diff --git a/vendor/cppformat/format.h b/vendor/cppformat/format.h deleted file mode 100644 index 568123d8..00000000 --- a/vendor/cppformat/format.h +++ /dev/null @@ -1,3259 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2015, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_FORMAT_H_ -#define FMT_FORMAT_H_ - -#if defined _MSC_VER && _MSC_VER <= 1500 -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -typedef long long intmax_t; -#else -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef FMT_USE_IOSTREAMS -# define FMT_USE_IOSTREAMS 1 -#endif - -#if FMT_USE_IOSTREAMS -# include -#endif - -#ifdef _SECURE_SCL -# define FMT_SECURE_SCL _SECURE_SCL -#else -# define FMT_SECURE_SCL 0 -#endif - -#if FMT_SECURE_SCL -# include -#endif - -#ifdef _MSC_VER -# include // _BitScanReverse, _BitScanReverse64 - -namespace fmt { -namespace internal { -# pragma intrinsic(_BitScanReverse) -inline uint32_t clz(uint32_t x) { - unsigned long r = 0; - _BitScanReverse(&r, x); - return 31 - r; -} -# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) - -# ifdef _WIN64 -# pragma intrinsic(_BitScanReverse64) -# endif - -inline uint32_t clzll(uint64_t x) { - unsigned long r = 0; -# ifdef _WIN64 - _BitScanReverse64(&r, x); -# else - // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast(x >> 32))) - return 63 - (r + 32); - - // Scan the low 32 bits. - _BitScanReverse(&r, static_cast(x)); -# endif - return 63 - r; -} -# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) -} -} -#endif - -#ifdef __GNUC__ -# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -# define FMT_GCC_EXTENSION __extension__ -# if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic push -// Disable the warning about "long long" which is sometimes reported even -// when using __extension__. -# pragma GCC diagnostic ignored "-Wlong-long" -// Disable the warning about declaration shadowing because it affects too -// many valid cases. -# pragma GCC diagnostic ignored "-Wshadow" -// Disable the warning about implicit conversions that may change the sign of -// an integer; silencing it otherwise would require many explicit casts. -# pragma GCC diagnostic ignored "-Wsign-conversion" -# endif -# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ -# define FMT_HAS_GXX_CXX11 1 -# endif -#else -# define FMT_GCC_EXTENSION -#endif - -#if defined(__clang__) && !defined(__INTEL_COMPILER) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wdocumentation" -#endif - -#ifdef __GNUC_LIBSTD__ -# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) -#endif - -#ifdef __has_feature -# define FMT_HAS_FEATURE(x) __has_feature(x) -#else -# define FMT_HAS_FEATURE(x) 0 -#endif - -#ifdef __has_builtin -# define FMT_HAS_BUILTIN(x) __has_builtin(x) -#else -# define FMT_HAS_BUILTIN(x) 0 -#endif - -#ifdef __has_cpp_attribute -# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) -#else -# define FMT_HAS_CPP_ATTRIBUTE(x) 0 -#endif - -#ifndef FMT_USE_VARIADIC_TEMPLATES -// Variadic templates are available in GCC since version 4.4 -// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ -// since version 2013. -# define FMT_USE_VARIADIC_TEMPLATES \ - (FMT_HAS_FEATURE(cxx_variadic_templates) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800) -#endif - -#ifndef FMT_USE_RVALUE_REFERENCES -// Don't use rvalue references when compiling with clang and an old libstdc++ -// as the latter doesn't provide std::move. -# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 -# define FMT_USE_RVALUE_REFERENCES 0 -# else -# define FMT_USE_RVALUE_REFERENCES \ - (FMT_HAS_FEATURE(cxx_rvalue_references) || \ - (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600) -# endif -#endif - -#if FMT_USE_RVALUE_REFERENCES -# include // for std::move -#endif - -// Define FMT_USE_NOEXCEPT to make C++ Format use noexcept (C++11 feature). -#ifndef FMT_USE_NOEXCEPT -# define FMT_USE_NOEXCEPT 0 -#endif - -#ifndef FMT_NOEXCEPT -# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ - _MSC_VER >= 1900 -# define FMT_NOEXCEPT noexcept -# else -# define FMT_NOEXCEPT throw() -# endif -#endif - -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef FMT_USE_DELETED_FUNCTIONS -# define FMT_USE_DELETED_FUNCTIONS 0 -#endif - -#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800 -# define FMT_DELETED_OR_UNDEFINED = delete -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&) = delete; \ - TypeName& operator=(const TypeName&) = delete -#else -# define FMT_DELETED_OR_UNDEFINED -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - TypeName& operator=(const TypeName&) -#endif - -#ifndef FMT_USE_USER_DEFINED_LITERALS -// All compilers which support UDLs also support variadic templates. This -// makes the fmt::literals implementation easier. However, an explicit check -// for variadic templates is added here just in case. -# define FMT_USE_USER_DEFINED_LITERALS \ - FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ - (FMT_HAS_FEATURE(cxx_user_literals) || \ - (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1900) -#endif - -#ifndef FMT_ASSERT -# define FMT_ASSERT(condition, message) assert((condition) && message) -#endif - -namespace fmt { -namespace internal { -struct DummyInt { - int data[2]; - operator int() const { return 0; } -}; -typedef std::numeric_limits FPUtil; - -// Dummy implementations of system functions such as signbit and ecvt called -// if the latter are not available. -inline DummyInt signbit(...) { return DummyInt(); } -inline DummyInt _ecvt_s(...) { return DummyInt(); } -inline DummyInt isinf(...) { return DummyInt(); } -inline DummyInt _finite(...) { return DummyInt(); } -inline DummyInt isnan(...) { return DummyInt(); } -inline DummyInt _isnan(...) { return DummyInt(); } - -// A helper function to suppress bogus "conditional expression is constant" -// warnings. -template -inline T check(T value) { return value; } -} -} // namespace fmt - -namespace std { -// Standard permits specialization of std::numeric_limits. This specialization -// is used to resolve ambiguity between isinf and std::isinf in glibc: -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 -// and the same for isnan and signbit. -template <> -class numeric_limits : - public std::numeric_limits { - public: - // Portable version of isinf. - template - static bool isinfinity(T x) { - using namespace fmt::internal; - // The resolution "priority" is: - // isinf macro > std::isinf > ::isinf > fmt::internal::isinf - if (check(sizeof(isinf(x)) == sizeof(bool) || - sizeof(isinf(x)) == sizeof(int))) { - return !!isinf(x); - } - return !_finite(static_cast(x)); - } - - // Portable version of isnan. - template - static bool isnotanumber(T x) { - using namespace fmt::internal; - if (check(sizeof(isnan(x)) == sizeof(bool) || - sizeof(isnan(x)) == sizeof(int))) { - return !!isnan(x); - } - return _isnan(static_cast(x)) != 0; - } - - // Portable version of signbit. - static bool isnegative(double x) { - using namespace fmt::internal; - if (check(sizeof(signbit(x)) == sizeof(int))) - return !!signbit(x); - if (x < 0) return true; - if (!isnotanumber(x)) return false; - int dec = 0, sign = 0; - char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. - _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); - return sign != 0; - } -}; -} // namespace std - -namespace fmt { - -// Fix the warning about long long on older versions of GCC -// that don't support the diagnostic pragma. -FMT_GCC_EXTENSION typedef long long LongLong; -FMT_GCC_EXTENSION typedef unsigned long long ULongLong; - -#if FMT_USE_RVALUE_REFERENCES -using std::move; -#endif - -template -class BasicWriter; - -typedef BasicWriter Writer; -typedef BasicWriter WWriter; - -template -class BasicFormatter; - -template -void format(BasicFormatter &f, const Char *&format_str, const T &value); - -/** - \rst - A string reference. It can be constructed from a C string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +------------+-------------------------+ - | Type | Definition | - +============+=========================+ - | StringRef | BasicStringRef | - +------------+-------------------------+ - | WStringRef | BasicStringRef | - +------------+-------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(StringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicStringRef { - private: - const Char *data_; - std::size_t size_; - - public: - /** Constructs a string reference object from a C string and a size. */ - BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} - - /** - \rst - Constructs a string reference object from a C string computing - the size with ``std::char_traits::length``. - \endrst - */ - BasicStringRef(const Char *s) - : data_(s), size_(std::char_traits::length(s)) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicStringRef(const std::basic_string &s) - : data_(s.c_str()), size_(s.size()) {} - - /** - \rst - Converts a string reference to an ``std::string`` object. - \endrst - */ - std::basic_string to_string() const { - return std::basic_string(data_, size_); - } - - /** Returns the pointer to a C string. */ - const Char *data() const { return data_; } - - /** Returns the string size. */ - std::size_t size() const { return size_; } - - // Lexicographically compare this string reference to other. - int compare(BasicStringRef other) const { - std::size_t size = std::min(size_, other.size_); - int result = std::char_traits::compare(data_, other.data_, size); - if (result == 0) - result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); - return result; - } - - friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) == 0; - } - friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) != 0; - } - friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) < 0; - } - friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) <= 0; - } - friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) > 0; - } - friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) >= 0; - } -}; - -typedef BasicStringRef StringRef; -typedef BasicStringRef WStringRef; - -/** - \rst - A reference to a null terminated string. It can be constructed from a C - string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +-------------+--------------------------+ - | Type | Definition | - +=============+==========================+ - | CStringRef | BasicCStringRef | - +-------------+--------------------------+ - | WCStringRef | BasicCStringRef | - +-------------+--------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(CStringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicCStringRef { - private: - const Char *data_; - - public: - /** Constructs a string reference object from a C string. */ - BasicCStringRef(const Char *s) : data_(s) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} - - /** Returns the pointer to a C string. */ - const Char *c_str() const { return data_; } -}; - -typedef BasicCStringRef CStringRef; -typedef BasicCStringRef WCStringRef; - -/** - A formatting error such as invalid format string. -*/ -class FormatError : public std::runtime_error { - public: - explicit FormatError(CStringRef message) - : std::runtime_error(message.c_str()) {} -}; - -namespace internal { -// The number of characters to store in the MemoryBuffer object itself -// to avoid dynamic memory allocation. -enum { INLINE_BUFFER_SIZE = 500 }; - -#if FMT_SECURE_SCL -// Use checked iterator to avoid warnings on MSVC. -template -inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) { - return stdext::checked_array_iterator(ptr, size); -} -#else -template -inline T *make_ptr(T *ptr, std::size_t) { return ptr; } -#endif -} // namespace internal - -/** - \rst - A buffer supporting a subset of ``std::vector``'s operations. - \endrst - */ -template -class Buffer { - private: - FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); - - protected: - T *ptr_; - std::size_t size_; - std::size_t capacity_; - - Buffer(T *ptr = 0, std::size_t capacity = 0) - : ptr_(ptr), size_(0), capacity_(capacity) {} - - /** - \rst - Increases the buffer capacity to hold at least *size* elements updating - ``ptr_`` and ``capacity_``. - \endrst - */ - virtual void grow(std::size_t size) = 0; - - public: - virtual ~Buffer() {} - - /** Returns the size of this buffer. */ - std::size_t size() const { return size_; } - - /** Returns the capacity of this buffer. */ - std::size_t capacity() const { return capacity_; } - - /** - Resizes the buffer. If T is a POD type new elements may not be initialized. - */ - void resize(std::size_t new_size) { - if (new_size > capacity_) - grow(new_size); - size_ = new_size; - } - - /** - \rst - Reserves space to store at least *capacity* elements. - \endrst - */ - void reserve(std::size_t capacity) { - if (capacity > capacity_) - grow(capacity); - } - - void clear() FMT_NOEXCEPT { size_ = 0; } - - void push_back(const T &value) { - if (size_ == capacity_) - grow(size_ + 1); - ptr_[size_++] = value; - } - - /** Appends data to the end of the buffer. */ - template - void append(const U *begin, const U *end); - - T &operator[](std::size_t index) { return ptr_[index]; } - const T &operator[](std::size_t index) const { return ptr_[index]; } -}; - -template -template -void Buffer::append(const U *begin, const U *end) { - assert(begin <= end); - std::size_t new_size = size_ + (end - begin); - if (new_size > capacity_) - grow(new_size); - std::copy(begin, end, internal::make_ptr(ptr_, capacity_) + size_); - size_ = new_size; -} - -namespace internal { - -// A memory buffer for POD types with the first SIZE elements stored in -// the object itself. -template > -class MemoryBuffer : private Allocator, public Buffer { - private: - T data_[SIZE]; - - // Deallocate memory allocated by the buffer. - void deallocate() { - if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); - } - - protected: - void grow(std::size_t size); - - public: - explicit MemoryBuffer(const Allocator &alloc = Allocator()) - : Allocator(alloc), Buffer(data_, SIZE) {} - ~MemoryBuffer() { deallocate(); } - -#if FMT_USE_RVALUE_REFERENCES - private: - // Move data from other to this buffer. - void move(MemoryBuffer &other) { - Allocator &this_alloc = *this, &other_alloc = other; - this_alloc = std::move(other_alloc); - this->size_ = other.size_; - this->capacity_ = other.capacity_; - if (other.ptr_ == other.data_) { - this->ptr_ = data_; - std::copy(other.data_, - other.data_ + this->size_, make_ptr(data_, this->capacity_)); - } else { - this->ptr_ = other.ptr_; - // Set pointer to the inline array so that delete is not called - // when deallocating. - other.ptr_ = other.data_; - } - } - - public: - MemoryBuffer(MemoryBuffer &&other) { - move(other); - } - - MemoryBuffer &operator=(MemoryBuffer &&other) { - assert(this != &other); - deallocate(); - move(other); - return *this; - } -#endif - - // Returns a copy of the allocator associated with this buffer. - Allocator get_allocator() const { return *this; } -}; - -template -void MemoryBuffer::grow(std::size_t size) { - std::size_t new_capacity = - (std::max)(size, this->capacity_ + this->capacity_ / 2); - T *new_ptr = this->allocate(new_capacity); - // The following code doesn't throw, so the raw pointer above doesn't leak. - std::copy(this->ptr_, - this->ptr_ + this->size_, make_ptr(new_ptr, new_capacity)); - std::size_t old_capacity = this->capacity_; - T *old_ptr = this->ptr_; - this->capacity_ = new_capacity; - this->ptr_ = new_ptr; - // deallocate may throw (at least in principle), but it doesn't matter since - // the buffer already uses the new storage and will deallocate it in case - // of exception. - if (old_ptr != data_) - Allocator::deallocate(old_ptr, old_capacity); -} - -// A fixed-size buffer. -template -class FixedBuffer : public fmt::Buffer { - public: - FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} - - protected: - void grow(std::size_t size); -}; - -template -class BasicCharTraits { - public: -#if FMT_SECURE_SCL - typedef stdext::checked_array_iterator CharPtr; -#else - typedef Char *CharPtr; -#endif - static Char cast(wchar_t value) { return static_cast(value); } -}; - -template -class CharTraits; - -template <> -class CharTraits : public BasicCharTraits { - private: - // Conversion from wchar_t to char is not allowed. - static char convert(wchar_t); - - public: - static char convert(char value) { return value; } - - // Formats a floating-point number. - template - static int format_float(char *buffer, std::size_t size, - const char *format, unsigned width, int precision, T value); -}; - -template <> -class CharTraits : public BasicCharTraits { - public: - static wchar_t convert(char value) { return value; } - static wchar_t convert(wchar_t value) { return value; } - - template - static int format_float(wchar_t *buffer, std::size_t size, - const wchar_t *format, unsigned width, int precision, T value); -}; - -// Checks if a number is negative - used to avoid warnings. -template -struct SignChecker { - template - static bool is_negative(T value) { return value < 0; } -}; - -template <> -struct SignChecker { - template - static bool is_negative(T) { return false; } -}; - -// Returns true if value is negative, false otherwise. -// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. -template -inline bool is_negative(T value) { - return SignChecker::is_signed>::is_negative(value); -} - -// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. -template -struct TypeSelector { typedef uint32_t Type; }; - -template <> -struct TypeSelector { typedef uint64_t Type; }; - -template -struct IntTraits { - // Smallest of uint32_t and uint64_t that is large enough to represent - // all values of T. - typedef typename - TypeSelector::digits <= 32>::Type MainType; -}; - -// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. -template -struct MakeUnsigned { typedef T Type; }; - -#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ - template <> \ - struct MakeUnsigned { typedef U Type; } - -FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); -FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); -FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); -FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); - -void report_unknown_type(char code, const char *type); - -// Static data is placed in this class template to allow header-only -// configuration. -template -struct BasicData { - static const uint32_t POWERS_OF_10_32[]; - static const uint64_t POWERS_OF_10_64[]; - static const char DIGITS[]; -}; - -typedef BasicData<> Data; - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) -# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) -#endif - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) -# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) -#endif - -#ifdef FMT_BUILTIN_CLZLL -// Returns the number of decimal digits in n. Leading zeros are not counted -// except for n == 0 in which case count_digits returns 1. -inline unsigned count_digits(uint64_t n) { - // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 - // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. - unsigned t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; - return t - (n < Data::POWERS_OF_10_64[t]) + 1; -} -#else -// Fallback version of count_digits used when __builtin_clz is not available. -inline unsigned count_digits(uint64_t n) { - unsigned count = 1; - for (;;) { - // Integer division is slow so do it for a group of four digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - if (n < 10) return count; - if (n < 100) return count + 1; - if (n < 1000) return count + 2; - if (n < 10000) return count + 3; - n /= 10000u; - count += 4; - } -} -#endif - -#ifdef FMT_BUILTIN_CLZ -// Optional version of count_digits for better performance on 32-bit platforms. -inline unsigned count_digits(uint32_t n) { - uint32_t t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; - return t - (n < Data::POWERS_OF_10_32[t]) + 1; -} -#endif - -// Formats a decimal unsigned integer value writing into buffer. -template -inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) { - buffer += num_digits; - while (value >= 100) { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer = Data::DIGITS[index + 1]; - *--buffer = Data::DIGITS[index]; - } - if (value < 10) { - *--buffer = static_cast('0' + value); - return; - } - unsigned index = static_cast(value * 2); - *--buffer = Data::DIGITS[index + 1]; - *--buffer = Data::DIGITS[index]; -} - -#ifndef _WIN32 -# define FMT_USE_WINDOWS_H 0 -#elif !defined(FMT_USE_WINDOWS_H) -# define FMT_USE_WINDOWS_H 1 -#endif - -// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. -// All the functionality that relies on it will be disabled too. -#if FMT_USE_WINDOWS_H -// A converter from UTF-8 to UTF-16. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF8ToUTF16 { - private: - MemoryBuffer buffer_; - - public: - explicit UTF8ToUTF16(StringRef s); - operator WStringRef() const { return WStringRef(&buffer_[0], size()); } - size_t size() const { return buffer_.size() - 1; } - const wchar_t *c_str() const { return &buffer_[0]; } - std::wstring str() const { return std::wstring(&buffer_[0], size()); } -}; - -// A converter from UTF-16 to UTF-8. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF16ToUTF8 { - private: - MemoryBuffer buffer_; - - public: - UTF16ToUTF8() {} - explicit UTF16ToUTF8(WStringRef s); - operator StringRef() const { return StringRef(&buffer_[0], size()); } - size_t size() const { return buffer_.size() - 1; } - const char *c_str() const { return &buffer_[0]; } - std::string str() const { return std::string(&buffer_[0], size()); } - - // Performs conversion returning a system error code instead of - // throwing exception on conversion error. This method may still throw - // in case of memory allocation error. - int convert(WStringRef s); -}; - -void format_windows_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; -#endif - -void format_system_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; - -// A formatting argument value. -struct Value { - template - struct StringValue { - const Char *value; - std::size_t size; - }; - - typedef void (*FormatFunc)( - void *formatter, const void *arg, void *format_str_ptr); - - struct CustomValue { - const void *value; - FormatFunc format; - }; - - union { - int int_value; - unsigned uint_value; - LongLong long_long_value; - ULongLong ulong_long_value; - double double_value; - long double long_double_value; - const void *pointer; - StringValue string; - StringValue sstring; - StringValue ustring; - StringValue wstring; - CustomValue custom; - }; - - enum Type { - NONE, NAMED_ARG, - // Integer types should go first, - INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, - // followed by floating-point types. - DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, - CSTRING, STRING, WSTRING, POINTER, CUSTOM - }; -}; - -// A formatting argument. It is a POD type to allow storage in -// internal::MemoryBuffer. -struct Arg : Value { - Type type; -}; - -template -struct NamedArg; - -template -struct Null {}; - -// A helper class template to enable or disable overloads taking wide -// characters and strings in MakeValue. -template -struct WCharHelper { - typedef Null Supported; - typedef T Unsupported; -}; - -template -struct WCharHelper { - typedef T Supported; - typedef Null Unsupported; -}; - -typedef char Yes[1]; -typedef char No[2]; - -// These are non-members to workaround an overload resolution bug in bcc32. -Yes &convert(fmt::ULongLong); -Yes &convert(std::ostream &); -No &convert(...); - -template -T &get(); - -struct DummyStream : std::ostream { - // Hide all operator<< overloads from std::ostream. - void operator<<(Null<>); -}; - -No &operator<<(std::ostream &, int); - -template -struct ConvertToIntImpl { - enum { value = false }; -}; - -template -struct ConvertToIntImpl { - // Convert to int only if T doesn't have an overloaded operator<<. - enum { - value = sizeof(convert(get() << get())) == sizeof(No) - }; -}; - -template -struct ConvertToIntImpl2 { - enum { value = false }; -}; - -template -struct ConvertToIntImpl2 { - enum { - // Don't convert numeric types. - value = ConvertToIntImpl::is_specialized>::value - }; -}; - -template -struct ConvertToInt { - enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; - enum { value = ConvertToIntImpl2::value }; -}; - -#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ - template <> \ - struct ConvertToInt { enum { value = 0 }; } - -// Silence warnings about convering float to int. -FMT_DISABLE_CONVERSION_TO_INT(float); -FMT_DISABLE_CONVERSION_TO_INT(double); -FMT_DISABLE_CONVERSION_TO_INT(long double); - -template -struct EnableIf {}; - -template -struct EnableIf { typedef T type; }; - -template -struct Conditional { typedef T type; }; - -template -struct Conditional { typedef F type; }; - -// For bcc32 which doesn't understand ! in template arguments. -template -struct Not { enum { value = 0 }; }; - -template<> -struct Not { enum { value = 1 }; }; - -// Makes an Arg object from any type. -template -class MakeValue : public Arg { - private: - // The following two methods are private to disallow formatting of - // arbitrary pointers. If you want to output a pointer cast it to - // "void *" or "const void *". In particular, this forbids formatting - // of "[const] volatile char *" which is printed as bool by iostreams. - // Do not implement! - template - MakeValue(const T *value); - template - MakeValue(T *value); - - // The following methods are private to disallow formatting of wide - // characters and strings into narrow strings as in - // fmt::format("{}", L"test"); - // To fix this, use a wide format string: fmt::format(L"{}", L"test"). -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Unsupported); -#endif - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - - void set_string(StringRef str) { - string.value = str.data(); - string.size = str.size(); - } - - void set_string(WStringRef str) { - wstring.value = str.data(); - wstring.size = str.size(); - } - - // Formats an argument of a custom type, such as a user-defined class. - template - static void format_custom_arg( - void *formatter, const void *arg, void *format_str_ptr) { - format(*static_cast*>(formatter), - *static_cast(format_str_ptr), - *static_cast(arg)); - } - - public: - MakeValue() {} - -#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ - MakeValue(Type value) { field = rhs; } \ - static uint64_t type(Type) { return Arg::TYPE; } - -#define FMT_MAKE_VALUE(Type, field, TYPE) \ - FMT_MAKE_VALUE_(Type, field, TYPE, value) - - FMT_MAKE_VALUE(bool, int_value, BOOL) - FMT_MAKE_VALUE(short, int_value, INT) - FMT_MAKE_VALUE(unsigned short, uint_value, UINT) - FMT_MAKE_VALUE(int, int_value, INT) - FMT_MAKE_VALUE(unsigned, uint_value, UINT) - - MakeValue(long value) { - // To minimize the number of types we need to deal with, long is - // translated either to int or to long long depending on its size. - if (check(sizeof(long) == sizeof(int))) - int_value = static_cast(value); - else - long_long_value = value; - } - static uint64_t type(long) { - return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; - } - - MakeValue(unsigned long value) { - if (check(sizeof(unsigned long) == sizeof(unsigned))) - uint_value = static_cast(value); - else - ulong_long_value = value; - } - static uint64_t type(unsigned long) { - return sizeof(unsigned long) == sizeof(unsigned) ? - Arg::UINT : Arg::ULONG_LONG; - } - - FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) - FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) - FMT_MAKE_VALUE(float, double_value, DOUBLE) - FMT_MAKE_VALUE(double, double_value, DOUBLE) - FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) - FMT_MAKE_VALUE(signed char, int_value, INT) - FMT_MAKE_VALUE(unsigned char, uint_value, UINT) - FMT_MAKE_VALUE(char, int_value, CHAR) - -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Supported value) { - int_value = value; - } - static uint64_t type(wchar_t) { return Arg::CHAR; } -#endif - -#define FMT_MAKE_STR_VALUE(Type, TYPE) \ - MakeValue(Type value) { set_string(value); } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_VALUE(char *, string.value, CSTRING) - FMT_MAKE_VALUE(const char *, string.value, CSTRING) - FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) - FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) - FMT_MAKE_STR_VALUE(const std::string &, STRING) - FMT_MAKE_STR_VALUE(StringRef, STRING) - FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) - -#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ - MakeValue(typename WCharHelper::Supported value) { \ - set_string(value); \ - } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) - FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) - - FMT_MAKE_VALUE(void *, pointer, POINTER) - FMT_MAKE_VALUE(const void *, pointer, POINTER) - - template - MakeValue(const T &value, - typename EnableIf::value>::value, int>::type = 0) { - custom.value = &value; - custom.format = &format_custom_arg; - } - - template - MakeValue(const T &value, - typename EnableIf::value, int>::type = 0) { - int_value = value; - } - - template - static uint64_t type(const T &) { - return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; - } - - // Additional template param `Char_` is needed here because make_type always - // uses MakeValue. - template - MakeValue(const NamedArg &value) { pointer = &value; } - - template - static uint64_t type(const NamedArg &) { return Arg::NAMED_ARG; } -}; - -template -struct NamedArg : Arg { - BasicStringRef name; - - template - NamedArg(BasicStringRef argname, const T &value) - : Arg(MakeValue(value)), name(argname) { - type = static_cast(MakeValue::type(value)); - } -}; - -#define FMT_DISPATCH(call) static_cast(this)->call - -// An argument visitor. -// To use ArgVisitor define a subclass that implements some or all of the -// visit methods with the same signatures as the methods in ArgVisitor, -// for example, visit_int(int). -// Specify the subclass name as the Impl template parameter. Then calling -// ArgVisitor::visit for some argument will dispatch to a visit method -// specific to the argument type. For example, if the argument type is -// double then visit_double(double) method of a subclass will be called. -// If the subclass doesn't contain a method with this signature, then -// a corresponding method of ArgVisitor will be called. -// -// Example: -// class MyArgVisitor : public ArgVisitor { -// public: -// void visit_int(int value) { print("{}", value); } -// void visit_double(double value) { print("{}", value ); } -// }; -// -// ArgVisitor uses the curiously recurring template pattern: -// http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern -template -class ArgVisitor { - public: - void report_unhandled_arg() {} - - Result visit_unhandled_arg() { - FMT_DISPATCH(report_unhandled_arg()); - return Result(); - } - - Result visit_int(int value) { - return FMT_DISPATCH(visit_any_int(value)); - } - Result visit_long_long(LongLong value) { - return FMT_DISPATCH(visit_any_int(value)); - } - Result visit_uint(unsigned value) { - return FMT_DISPATCH(visit_any_int(value)); - } - Result visit_ulong_long(ULongLong value) { - return FMT_DISPATCH(visit_any_int(value)); - } - Result visit_bool(bool value) { - return FMT_DISPATCH(visit_any_int(value)); - } - Result visit_char(int value) { - return FMT_DISPATCH(visit_any_int(value)); - } - template - Result visit_any_int(T) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - Result visit_double(double value) { - return FMT_DISPATCH(visit_any_double(value)); - } - Result visit_long_double(long double value) { - return FMT_DISPATCH(visit_any_double(value)); - } - template - Result visit_any_double(T) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - Result visit_cstring(const char *) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - Result visit_string(Arg::StringValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - Result visit_wstring(Arg::StringValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - Result visit_pointer(const void *) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - Result visit_custom(Arg::CustomValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - Result visit(const Arg &arg) { - switch (arg.type) { - default: - FMT_ASSERT(false, "invalid argument type"); - return Result(); - case Arg::INT: - return FMT_DISPATCH(visit_int(arg.int_value)); - case Arg::UINT: - return FMT_DISPATCH(visit_uint(arg.uint_value)); - case Arg::LONG_LONG: - return FMT_DISPATCH(visit_long_long(arg.long_long_value)); - case Arg::ULONG_LONG: - return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); - case Arg::BOOL: - return FMT_DISPATCH(visit_bool(arg.int_value != 0)); - case Arg::CHAR: - return FMT_DISPATCH(visit_char(arg.int_value)); - case Arg::DOUBLE: - return FMT_DISPATCH(visit_double(arg.double_value)); - case Arg::LONG_DOUBLE: - return FMT_DISPATCH(visit_long_double(arg.long_double_value)); - case Arg::CSTRING: - return FMT_DISPATCH(visit_cstring(arg.string.value)); - case Arg::STRING: - return FMT_DISPATCH(visit_string(arg.string)); - case Arg::WSTRING: - return FMT_DISPATCH(visit_wstring(arg.wstring)); - case Arg::POINTER: - return FMT_DISPATCH(visit_pointer(arg.pointer)); - case Arg::CUSTOM: - return FMT_DISPATCH(visit_custom(arg.custom)); - } - } -}; - -class RuntimeError : public std::runtime_error { - protected: - RuntimeError() : std::runtime_error("") {} -}; - -template -class BasicArgFormatter; - -template -class PrintfArgFormatter; - -template -class ArgMap; -} // namespace internal - -/** An argument list. */ -class ArgList { - private: - // To reduce compiled code size per formatting function call, types of first - // MAX_PACKED_ARGS arguments are passed in the types_ field. - uint64_t types_; - union { - // If the number of arguments is less than MAX_PACKED_ARGS, the argument - // values are stored in values_, otherwise they are stored in args_. - // This is done to reduce compiled code size as storing larger objects - // may require more code (at least on x86-64) even if the same amount of - // data is actually copied to stack. It saves ~10% on the bloat test. - const internal::Value *values_; - const internal::Arg *args_; - }; - - internal::Arg::Type type(unsigned index) const { - unsigned shift = index * 4; - uint64_t mask = 0xf; - return static_cast( - (types_ & (mask << shift)) >> shift); - } - - template - friend class internal::ArgMap; - - public: - // Maximum number of arguments with packed types. - enum { MAX_PACKED_ARGS = 16 }; - - ArgList() : types_(0) {} - - ArgList(ULongLong types, const internal::Value *values) - : types_(types), values_(values) {} - ArgList(ULongLong types, const internal::Arg *args) - : types_(types), args_(args) {} - - /** Returns the argument at specified index. */ - internal::Arg operator[](unsigned index) const { - using internal::Arg; - Arg arg; - bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; - if (index < MAX_PACKED_ARGS) { - Arg::Type arg_type = type(index); - internal::Value &val = arg; - if (arg_type != Arg::NONE) - val = use_values ? values_[index] : args_[index]; - arg.type = arg_type; - return arg; - } - if (use_values) { - // The index is greater than the number of arguments that can be stored - // in values, so return a "none" argument. - arg.type = Arg::NONE; - return arg; - } - for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) { - if (args_[i].type == Arg::NONE) - return args_[i]; - } - return args_[index]; - } -}; - -struct FormatSpec; - -namespace internal { - -template -class ArgMap { - private: - typedef std::map, internal::Arg> MapType; - typedef typename MapType::value_type Pair; - - MapType map_; - - public: - void init(const ArgList &args); - - const internal::Arg* find(const fmt::BasicStringRef &name) const { - typename MapType::const_iterator it = map_.find(name); - return it != map_.end() ? &it->second : 0; - } -}; - -class FormatterBase { - private: - ArgList args_; - int next_arg_index_; - - // Returns the argument with specified index. - Arg do_get_arg(unsigned arg_index, const char *&error); - - protected: - const ArgList &args() const { return args_; } - - explicit FormatterBase(const ArgList &args) { - args_ = args; - next_arg_index_ = 0; - } - - // Returns the next argument. - Arg next_arg(const char *&error); - - // Checks if manual indexing is used and returns the argument with - // specified index. - Arg get_arg(unsigned arg_index, const char *&error); - - bool check_no_auto_index(const char *&error); - - template - void write(BasicWriter &w, const Char *start, const Char *end) { - if (start != end) - w << BasicStringRef(start, end - start); - } -}; - -// A printf formatter. -template -class PrintfFormatter : private FormatterBase { - private: - void parse_flags(FormatSpec &spec, const Char *&s); - - // Returns the argument with specified index or, if arg_index is equal - // to the maximum unsigned value, the next argument. - Arg get_arg(const Char *s, - unsigned arg_index = (std::numeric_limits::max)()); - - // Parses argument index, flags and width and returns the argument index. - unsigned parse_header(const Char *&s, FormatSpec &spec); - - public: - explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} - void format(BasicWriter &writer, BasicCStringRef format_str); -}; -} // namespace internal - -// A formatter. -template -class BasicFormatter : private internal::FormatterBase { - private: - BasicWriter &writer_; - internal::ArgMap map_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); - - using internal::FormatterBase::get_arg; - - // Checks if manual indexing is used and returns the argument with - // specified name. - internal::Arg get_arg(BasicStringRef arg_name, const char *&error); - - // Parses argument index and returns corresponding argument. - internal::Arg parse_arg_index(const Char *&s); - - // Parses argument name and returns corresponding argument. - internal::Arg parse_arg_name(const Char *&s); - - public: - BasicFormatter(const ArgList &args, BasicWriter &w) - : internal::FormatterBase(args), writer_(w) {} - - BasicWriter &writer() { return writer_; } - - void format(BasicCStringRef format_str); - - const Char *format(const Char *&format_str, const internal::Arg &arg); -}; - -enum Alignment { - ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC -}; - -// Flags. -enum { - SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, - CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. -}; - -// An empty format specifier. -struct EmptySpec {}; - -// A type specifier. -template -struct TypeSpec : EmptySpec { - Alignment align() const { return ALIGN_DEFAULT; } - unsigned width() const { return 0; } - int precision() const { return -1; } - bool flag(unsigned) const { return false; } - char type() const { return TYPE; } - char fill() const { return ' '; } -}; - -// A width specifier. -struct WidthSpec { - unsigned width_; - // Fill is always wchar_t and cast to char if necessary to avoid having - // two specialization of WidthSpec and its subclasses. - wchar_t fill_; - - WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} - - unsigned width() const { return width_; } - wchar_t fill() const { return fill_; } -}; - -// An alignment specifier. -struct AlignSpec : WidthSpec { - Alignment align_; - - AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) - : WidthSpec(width, fill), align_(align) {} - - Alignment align() const { return align_; } - - int precision() const { return -1; } -}; - -// An alignment and type specifier. -template -struct AlignTypeSpec : AlignSpec { - AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} - - bool flag(unsigned) const { return false; } - char type() const { return TYPE; } -}; - -// A full format specifier. -struct FormatSpec : AlignSpec { - unsigned flags_; - int precision_; - char type_; - - FormatSpec( - unsigned width = 0, char type = 0, wchar_t fill = ' ') - : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} - - bool flag(unsigned f) const { return (flags_ & f) != 0; } - int precision() const { return precision_; } - char type() const { return type_; } -}; - -// An integer format specifier. -template , typename Char = char> -class IntFormatSpec : public SpecT { - private: - T value_; - - public: - IntFormatSpec(T val, const SpecT &spec = SpecT()) - : SpecT(spec), value_(val) {} - - T value() const { return value_; } -}; - -// A string format specifier. -template -class StrFormatSpec : public AlignSpec { - private: - const Char *str_; - - public: - template - StrFormatSpec(const Char *str, unsigned width, FillChar fill) - : AlignSpec(width, fill), str_(str) { - internal::CharTraits::convert(FillChar()); - } - - const Char *str() const { return str_; } -}; - -/** - Returns an integer format specifier to format the value in base 2. - */ -IntFormatSpec > bin(int value); - -/** - Returns an integer format specifier to format the value in base 8. - */ -IntFormatSpec > oct(int value); - -/** - Returns an integer format specifier to format the value in base 16 using - lower-case letters for the digits above 9. - */ -IntFormatSpec > hex(int value); - -/** - Returns an integer formatter format specifier to format in base 16 using - upper-case letters for the digits above 9. - */ -IntFormatSpec > hexu(int value); - -/** - \rst - Returns an integer format specifier to pad the formatted argument with the - fill character to the specified width using the default (right) numeric - alignment. - - **Example**:: - - MemoryWriter out; - out << pad(hex(0xcafe), 8, '0'); - // out.str() == "0000cafe" - - \endrst - */ -template -IntFormatSpec, Char> pad( - int value, unsigned width, Char fill = ' '); - -#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ -inline IntFormatSpec > bin(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'b'>()); \ -} \ - \ -inline IntFormatSpec > oct(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'o'>()); \ -} \ - \ -inline IntFormatSpec > hex(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'x'>()); \ -} \ - \ -inline IntFormatSpec > hexu(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'X'>()); \ -} \ - \ -template \ -inline IntFormatSpec > pad( \ - IntFormatSpec > f, unsigned width) { \ - return IntFormatSpec >( \ - f.value(), AlignTypeSpec(width, ' ')); \ -} \ - \ -/* For compatibility with older compilers we provide two overloads for pad, */ \ -/* one that takes a fill character and one that doesn't. In the future this */ \ -/* can be replaced with one overload making the template argument Char */ \ -/* default to char (C++11). */ \ -template \ -inline IntFormatSpec, Char> pad( \ - IntFormatSpec, Char> f, \ - unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - f.value(), AlignTypeSpec(width, fill)); \ -} \ - \ -inline IntFormatSpec > pad( \ - TYPE value, unsigned width) { \ - return IntFormatSpec >( \ - value, AlignTypeSpec<0>(width, ' ')); \ -} \ - \ -template \ -inline IntFormatSpec, Char> pad( \ - TYPE value, unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - value, AlignTypeSpec<0>(width, fill)); \ -} - -FMT_DEFINE_INT_FORMATTERS(int) -FMT_DEFINE_INT_FORMATTERS(long) -FMT_DEFINE_INT_FORMATTERS(unsigned) -FMT_DEFINE_INT_FORMATTERS(unsigned long) -FMT_DEFINE_INT_FORMATTERS(LongLong) -FMT_DEFINE_INT_FORMATTERS(ULongLong) - -/** - \rst - Returns a string formatter that pads the formatted argument with the fill - character to the specified width using the default (left) string alignment. - - **Example**:: - - std::string s = str(MemoryWriter() << pad("abc", 8)); - // s == "abc " - - \endrst - */ -template -inline StrFormatSpec pad( - const Char *str, unsigned width, Char fill = ' ') { - return StrFormatSpec(str, width, fill); -} - -inline StrFormatSpec pad( - const wchar_t *str, unsigned width, char fill = ' ') { - return StrFormatSpec(str, width, fill); -} - -// Generates a comma-separated list with results of applying f to -// numbers 0..n-1. -# define FMT_GEN(n, f) FMT_GEN##n(f) -# define FMT_GEN1(f) f(0) -# define FMT_GEN2(f) FMT_GEN1(f), f(1) -# define FMT_GEN3(f) FMT_GEN2(f), f(2) -# define FMT_GEN4(f) FMT_GEN3(f), f(3) -# define FMT_GEN5(f) FMT_GEN4(f), f(4) -# define FMT_GEN6(f) FMT_GEN5(f), f(5) -# define FMT_GEN7(f) FMT_GEN6(f), f(6) -# define FMT_GEN8(f) FMT_GEN7(f), f(7) -# define FMT_GEN9(f) FMT_GEN8(f), f(8) -# define FMT_GEN10(f) FMT_GEN9(f), f(9) -# define FMT_GEN11(f) FMT_GEN10(f), f(10) -# define FMT_GEN12(f) FMT_GEN11(f), f(11) -# define FMT_GEN13(f) FMT_GEN12(f), f(12) -# define FMT_GEN14(f) FMT_GEN13(f), f(13) -# define FMT_GEN15(f) FMT_GEN14(f), f(14) - -namespace internal { -inline uint64_t make_type() { return 0; } - -template -inline uint64_t make_type(const T &arg) { return MakeValue::type(arg); } - -template -struct ArgArray { - // Computes the argument array size by adding 1 to N, which is the number of - // arguments, if N is zero, because array of zero size is invalid, or if N - // is greater than ArgList::MAX_PACKED_ARGS to accommodate for an extra - // argument that marks the end of the list. - enum { SIZE = N + (N == 0 || N >= ArgList::MAX_PACKED_ARGS ? 1 : 0) }; - - typedef typename Conditional< - (N < ArgList::MAX_PACKED_ARGS), Value, Arg>::type Type[SIZE]; -}; - -#if FMT_USE_VARIADIC_TEMPLATES -template -inline uint64_t make_type(const Arg &first, const Args & ... tail) { - return make_type(first) | (make_type(tail...) << 4); -} - -inline void do_set_types(Arg *) {} - -template -inline void do_set_types(Arg *args, const T &arg, const Args & ... tail) { - args->type = static_cast(MakeValue::type(arg)); - do_set_types(args + 1, tail...); -} - -template -inline void set_types(Arg *array, const Args & ... args) { - if (check(sizeof...(Args) > ArgList::MAX_PACKED_ARGS)) - do_set_types(array, args...); - array[sizeof...(Args)].type = Arg::NONE; -} - -template -inline void set_types(Value *, const Args & ...) { - // Do nothing as types are passed separately from values. -} - -template -inline void store_args(Value *) {} - -template -inline void store_args(Arg *args, const T &arg, const Args & ... tail) { - // Assign only the Value subobject of Arg and don't overwrite type (if any) - // that is assigned by set_types. - Value &value = *args; - value = MakeValue(arg); - store_args(args + 1, tail...); -} - -template -ArgList make_arg_list(typename ArgArray::Type array, - const Args & ... args) { - if (check(sizeof...(Args) >= ArgList::MAX_PACKED_ARGS)) - set_types(array, args...); - store_args(array, args...); - return ArgList(make_type(args...), array); -} -#else - -struct ArgType { - uint64_t type; - - ArgType() : type(0) {} - - template - ArgType(const T &arg) : type(make_type(arg)) {} -}; - -# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() - -inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { - return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | - (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | - (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | - (t12.type << 48) | (t13.type << 52) | (t14.type << 56); -} -#endif - -template -class FormatBuf : public std::basic_streambuf { - private: - typedef typename std::basic_streambuf::int_type int_type; - typedef typename std::basic_streambuf::traits_type traits_type; - - Buffer &buffer_; - Char *start_; - - public: - FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { - this->setp(start_, start_ + buffer_.capacity()); - } - - int_type overflow(int_type ch = traits_type::eof()) { - if (!traits_type::eq_int_type(ch, traits_type::eof())) { - size_t size = this->pptr() - start_; - buffer_.resize(size); - buffer_.reserve(size * 2); - - start_ = &buffer_[0]; - start_[size] = traits_type::to_char_type(ch); - this->setp(start_+ size + 1, start_ + size * 2); - } - return ch; - } - - size_t size() const { - return this->pptr() - start_; - } -}; -} // namespace internal - -# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n -# define FMT_MAKE_ARG_TYPE(n) T##n -# define FMT_MAKE_ARG(n) const T##n &v##n -# define FMT_ASSIGN_char(n) arr[n] = fmt::internal::MakeValue(v##n) -# define FMT_ASSIGN_wchar_t(n) arr[n] = fmt::internal::MakeValue(v##n) - -#if FMT_USE_VARIADIC_TEMPLATES -// Defines a variadic function returning void. -# define FMT_VARIADIC_VOID(func, arg_type) \ - template \ - void func(arg_type arg0, const Args & ... args) { \ - typename fmt::internal::ArgArray::Type array; \ - func(arg0, fmt::internal::make_arg_list(array, args...)); \ - } - -// Defines a variadic constructor. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ - typename fmt::internal::ArgArray::Type array; \ - func(arg0, arg1, fmt::internal::make_arg_list(array, args...)); \ - } - -#else - -# define FMT_MAKE_REF(n) fmt::internal::MakeValue(v##n) -# define FMT_MAKE_REF2(n) v##n - -// Defines a wrapper for a function taking one argument of type arg_type -// and n additional arguments of arbitrary types. -# define FMT_WRAP1(func, arg_type, n) \ - template \ - inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic function returning void on a pre-C++11 compiler. -# define FMT_VARIADIC_VOID(func, arg_type) \ - inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ - FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ - FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ - FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ - FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ - FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) - -# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg0, arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic constructor on a pre-C++11 compiler. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) -#endif - -// Generates a comma-separated list with results of applying f to pairs -// (argument, index). -#define FMT_FOR_EACH1(f, x0) f(x0, 0) -#define FMT_FOR_EACH2(f, x0, x1) \ - FMT_FOR_EACH1(f, x0), f(x1, 1) -#define FMT_FOR_EACH3(f, x0, x1, x2) \ - FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) -#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ - FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) -#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ - FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) -#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ - FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) -#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ - FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) -#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ - FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) -#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ - FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) -#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ - FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) - -/** - An error returned by an operating system or a language runtime, - for example a file opening error. -*/ -class SystemError : public internal::RuntimeError { - private: - void init(int err_code, CStringRef format_str, ArgList args); - - protected: - int error_code_; - - typedef char Char; // For FMT_VARIADIC_CTOR. - - SystemError() {} - - public: - /** - \rst - Constructs a :class:`fmt::SystemError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is - the system message corresponding to the error code. - *error_code* is a system error code as given by ``errno``. - If *error_code* is not a valid error code such as -1, the system message - may look like "Unknown error -1" and is platform-dependent. - - **Example**:: - - // This throws a SystemError with the description - // cannot open file 'madeup': No such file or directory - // or similar (system message may vary). - const char *filename = "madeup"; - std::FILE *file = std::fopen(filename, "r"); - if (!file) - throw fmt::SystemError(errno, "cannot open file '{}'", filename); - \endrst - */ - SystemError(int error_code, CStringRef message) { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) - - int error_code() const { return error_code_; } -}; - -/** - \rst - This template provides operations for formatting and writing data into - a character stream. The output is stored in a buffer provided by a subclass - such as :class:`fmt::BasicMemoryWriter`. - - You can use one of the following typedefs for common character types: - - +---------+----------------------+ - | Type | Definition | - +=========+======================+ - | Writer | BasicWriter | - +---------+----------------------+ - | WWriter | BasicWriter | - +---------+----------------------+ - - \endrst - */ -template -class BasicWriter { - private: - // Output buffer. - Buffer &buffer_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); - - typedef typename internal::CharTraits::CharPtr CharPtr; - -#if FMT_SECURE_SCL - // Returns pointer value. - static Char *get(CharPtr p) { return p.base(); } -#else - static Char *get(Char *p) { return p; } -#endif - - // Fills the padding around the content and returns the pointer to the - // content area. - static CharPtr fill_padding(CharPtr buffer, - unsigned total_size, std::size_t content_size, wchar_t fill); - - // Grows the buffer by n characters and returns a pointer to the newly - // allocated area. - CharPtr grow_buffer(std::size_t n) { - std::size_t size = buffer_.size(); - buffer_.resize(size + n); - return internal::make_ptr(&buffer_[size], n); - } - - // Writes an unsigned decimal integer. - template - Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) { - unsigned num_digits = internal::count_digits(value); - Char *ptr = get(grow_buffer(prefix_size + num_digits)); - internal::format_decimal(ptr + prefix_size, value, num_digits); - return ptr; - } - - // Writes a decimal integer. - template - void write_decimal(Int value) { - typename internal::IntTraits::MainType abs_value = value; - if (internal::is_negative(value)) { - abs_value = 0 - abs_value; - *write_unsigned_decimal(abs_value, 1) = '-'; - } else { - write_unsigned_decimal(abs_value, 0); - } - } - - // Prepare a buffer for integer formatting. - CharPtr prepare_int_buffer(unsigned num_digits, - const EmptySpec &, const char *prefix, unsigned prefix_size) { - unsigned size = prefix_size + num_digits; - CharPtr p = grow_buffer(size); - std::copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - - template - CharPtr prepare_int_buffer(unsigned num_digits, - const Spec &spec, const char *prefix, unsigned prefix_size); - - // Formats an integer. - template - void write_int(T value, Spec spec); - - // Formats a floating-point number (double or long double). - template - void write_double(T value, const FormatSpec &spec); - - // Writes a formatted string. - template - CharPtr write_str( - const StrChar *s, std::size_t size, const AlignSpec &spec); - - template - void write_str( - const internal::Arg::StringValue &str, const FormatSpec &spec); - - // This following methods are private to disallow writing wide characters - // and strings to a char stream. If you want to print a wide string as a - // pointer as std::ostream does, cast it to const void*. - // Do not implement! - void operator<<(typename internal::WCharHelper::Unsupported); - void operator<<( - typename internal::WCharHelper::Unsupported); - - // Appends floating-point length specifier to the format string. - // The second argument is only used for overload resolution. - void append_float_length(Char *&format_ptr, long double) { - *format_ptr++ = 'L'; - } - - template - void append_float_length(Char *&, T) {} - - template - friend class internal::BasicArgFormatter; - - friend class internal::PrintfArgFormatter; - - protected: - /** - Constructs a ``BasicWriter`` object. - */ - explicit BasicWriter(Buffer &b) : buffer_(b) {} - - public: - /** - \rst - Destroys a ``BasicWriter`` object. - \endrst - */ - virtual ~BasicWriter() {} - - /** - Returns the total number of characters written. - */ - std::size_t size() const { return buffer_.size(); } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const Char *c_str() const { - std::size_t size = buffer_.size(); - buffer_.reserve(size + 1); - buffer_[size] = '\0'; - return &buffer_[0]; - } - - /** - \rst - Returns the content of the output buffer as an `std::string`. - \endrst - */ - std::basic_string str() const { - return std::basic_string(&buffer_[0], buffer_.size()); - } - - /** - \rst - Writes formatted data. - - *args* is an argument list representing arbitrary arguments. - - **Example**:: - - MemoryWriter out; - out.write("Current point:\n"); - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - Current point: - (-3.140000, +3.140000) - - The output can be accessed using :func:`data()`, :func:`c_str` or - :func:`str` methods. - - See also :ref:`syntax`. - \endrst - */ - void write(BasicCStringRef format, ArgList args) { - BasicFormatter(args, *this).format(format); - } - FMT_VARIADIC_VOID(write, BasicCStringRef) - - BasicWriter &operator<<(int value) { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned value) { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(long value) { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned long value) { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(LongLong value) { - write_decimal(value); - return *this; - } - - /** - \rst - Formats *value* and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(ULongLong value) { - return *this << IntFormatSpec(value); - } - - BasicWriter &operator<<(double value) { - write_double(value, FormatSpec()); - return *this; - } - - /** - \rst - Formats *value* using the general format for floating-point numbers - (``'g'``) and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(long double value) { - write_double(value, FormatSpec()); - return *this; - } - - /** - Writes a character to the stream. - */ - BasicWriter &operator<<(char value) { - buffer_.push_back(value); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) { - buffer_.push_back(value); - return *this; - } - - /** - \rst - Writes *value* to the stream. - \endrst - */ - BasicWriter &operator<<(fmt::BasicStringRef value) { - const Char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) { - const char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - template - BasicWriter &operator<<(IntFormatSpec spec) { - internal::CharTraits::convert(FillChar()); - write_int(spec.value(), spec); - return *this; - } - - template - BasicWriter &operator<<(const StrFormatSpec &spec) { - const StrChar *s = spec.str(); - write_str(s, std::char_traits::length(s), spec); - return *this; - } - - void clear() FMT_NOEXCEPT { buffer_.clear(); } -}; - -template -template -typename BasicWriter::CharPtr BasicWriter::write_str( - const StrChar *s, std::size_t size, const AlignSpec &spec) { - CharPtr out = CharPtr(); - if (spec.width() > size) { - out = grow_buffer(spec.width()); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.align() == ALIGN_RIGHT) { - std::fill_n(out, spec.width() - size, fill); - out += spec.width() - size; - } else if (spec.align() == ALIGN_CENTER) { - out = fill_padding(out, spec.width(), size, fill); - } else { - std::fill_n(out + size, spec.width() - size, fill); - } - } else { - out = grow_buffer(size); - } - std::copy(s, s + size, out); - return out; -} - -template -typename BasicWriter::CharPtr - BasicWriter::fill_padding( - CharPtr buffer, unsigned total_size, - std::size_t content_size, wchar_t fill) { - std::size_t padding = total_size - content_size; - std::size_t left_padding = padding / 2; - Char fill_char = internal::CharTraits::cast(fill); - std::fill_n(buffer, left_padding, fill_char); - buffer += left_padding; - CharPtr content = buffer; - std::fill_n(buffer + content_size, padding - left_padding, fill_char); - return content; -} - -template -template -typename BasicWriter::CharPtr - BasicWriter::prepare_int_buffer( - unsigned num_digits, const Spec &spec, - const char *prefix, unsigned prefix_size) { - unsigned width = spec.width(); - Alignment align = spec.align(); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.precision() > static_cast(num_digits)) { - // Octal prefix '0' is counted as a digit, so ignore it if precision - // is specified. - if (prefix_size > 0 && prefix[prefix_size - 1] == '0') - --prefix_size; - unsigned number_size = prefix_size + spec.precision(); - AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); - if (number_size >= width) - return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); - buffer_.reserve(width); - unsigned fill_size = width - number_size; - if (align != ALIGN_LEFT) { - CharPtr p = grow_buffer(fill_size); - std::fill(p, p + fill_size, fill); - } - CharPtr result = prepare_int_buffer( - num_digits, subspec, prefix, prefix_size); - if (align == ALIGN_LEFT) { - CharPtr p = grow_buffer(fill_size); - std::fill(p, p + fill_size, fill); - } - return result; - } - unsigned size = prefix_size + num_digits; - if (width <= size) { - CharPtr p = grow_buffer(size); - std::copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - CharPtr p = grow_buffer(width); - CharPtr end = p + width; - if (align == ALIGN_LEFT) { - std::copy(prefix, prefix + prefix_size, p); - p += size; - std::fill(p, end, fill); - } else if (align == ALIGN_CENTER) { - p = fill_padding(p, width, size, fill); - std::copy(prefix, prefix + prefix_size, p); - p += size; - } else { - if (align == ALIGN_NUMERIC) { - if (prefix_size != 0) { - p = std::copy(prefix, prefix + prefix_size, p); - size -= prefix_size; - } - } else { - std::copy(prefix, prefix + prefix_size, end - size); - } - std::fill(p, end - size, fill); - p = end; - } - return p - 1; -} - -template -template -void BasicWriter::write_int(T value, Spec spec) { - unsigned prefix_size = 0; - typedef typename internal::IntTraits::MainType UnsignedType; - UnsignedType abs_value = value; - char prefix[4] = ""; - if (internal::is_negative(value)) { - prefix[0] = '-'; - ++prefix_size; - abs_value = 0 - abs_value; - } else if (spec.flag(SIGN_FLAG)) { - prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; - ++prefix_size; - } - switch (spec.type()) { - case 0: case 'd': { - unsigned num_digits = internal::count_digits(abs_value); - CharPtr p = prepare_int_buffer( - num_digits, spec, prefix, prefix_size) + 1 - num_digits; - internal::format_decimal(get(p), abs_value, num_digits); - break; - } - case 'x': case 'X': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 4) != 0); - Char *p = get(prepare_int_buffer( - num_digits, spec, prefix, prefix_size)); - n = abs_value; - const char *digits = spec.type() == 'x' ? - "0123456789abcdef" : "0123456789ABCDEF"; - do { - *p-- = digits[n & 0xf]; - } while ((n >>= 4) != 0); - break; - } - case 'b': case 'B': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 1) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do { - *p-- = static_cast('0' + (n & 1)); - } while ((n >>= 1) != 0); - break; - } - case 'o': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) - prefix[prefix_size++] = '0'; - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 3) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do { - *p-- = static_cast('0' + (n & 7)); - } while ((n >>= 3) != 0); - break; - } - default: - internal::report_unknown_type( - spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); - break; - } -} - -template -template -void BasicWriter::write_double( - T value, const FormatSpec &spec) { - // Check type. - char type = spec.type(); - bool upper = false; - switch (type) { - case 0: - type = 'g'; - break; - case 'e': case 'f': case 'g': case 'a': - break; - case 'F': -#ifdef _MSC_VER - // MSVC's printf doesn't support 'F'. - type = 'f'; -#endif - // Fall through. - case 'E': case 'G': case 'A': - upper = true; - break; - default: - internal::report_unknown_type(type, "double"); - break; - } - - char sign = 0; - // Use isnegative instead of value < 0 because the latter is always - // false for NaN. - if (internal::FPUtil::isnegative(static_cast(value))) { - sign = '-'; - value = -value; - } else if (spec.flag(SIGN_FLAG)) { - sign = spec.flag(PLUS_FLAG) ? '+' : ' '; - } - - if (internal::FPUtil::isnotanumber(value)) { - // Format NaN ourselves because sprintf's output is not consistent - // across platforms. - std::size_t nan_size = 4; - const char *nan = upper ? " NAN" : " nan"; - if (!sign) { - --nan_size; - ++nan; - } - CharPtr out = write_str(nan, nan_size, spec); - if (sign) - *out = sign; - return; - } - - if (internal::FPUtil::isinfinity(value)) { - // Format infinity ourselves because sprintf's output is not consistent - // across platforms. - std::size_t inf_size = 4; - const char *inf = upper ? " INF" : " inf"; - if (!sign) { - --inf_size; - ++inf; - } - CharPtr out = write_str(inf, inf_size, spec); - if (sign) - *out = sign; - return; - } - - std::size_t offset = buffer_.size(); - unsigned width = spec.width(); - if (sign) { - buffer_.reserve(buffer_.size() + (std::max)(width, 1u)); - if (width > 0) - --width; - ++offset; - } - - // Build format string. - enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg - Char format[MAX_FORMAT_SIZE]; - Char *format_ptr = format; - *format_ptr++ = '%'; - unsigned width_for_sprintf = width; - if (spec.flag(HASH_FLAG)) - *format_ptr++ = '#'; - if (spec.align() == ALIGN_CENTER) { - width_for_sprintf = 0; - } else { - if (spec.align() == ALIGN_LEFT) - *format_ptr++ = '-'; - if (width != 0) - *format_ptr++ = '*'; - } - if (spec.precision() >= 0) { - *format_ptr++ = '.'; - *format_ptr++ = '*'; - } - - append_float_length(format_ptr, value); - *format_ptr++ = type; - *format_ptr = '\0'; - - // Format using snprintf. - Char fill = internal::CharTraits::cast(spec.fill()); - for (;;) { - std::size_t buffer_size = buffer_.capacity() - offset; -#ifdef _MSC_VER - // MSVC's vsnprintf_s doesn't work with zero size, so reserve - // space for at least one extra character to make the size non-zero. - // Note that the buffer's capacity will increase by more than 1. - if (buffer_size == 0) { - buffer_.reserve(offset + 1); - buffer_size = buffer_.capacity() - offset; - } -#endif - Char *start = &buffer_[offset]; - int n = internal::CharTraits::format_float( - start, buffer_size, format, width_for_sprintf, spec.precision(), value); - if (n >= 0 && offset + n < buffer_.capacity()) { - if (sign) { - if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || - *start != ' ') { - *(start - 1) = sign; - sign = 0; - } else { - *(start - 1) = fill; - } - ++n; - } - if (spec.align() == ALIGN_CENTER && - spec.width() > static_cast(n)) { - width = spec.width(); - CharPtr p = grow_buffer(width); - std::copy(p, p + n, p + (width - n) / 2); - fill_padding(p, spec.width(), n, fill); - return; - } - if (spec.fill() != ' ' || sign) { - while (*start == ' ') - *start++ = fill; - if (sign) - *(start - 1) = sign; - } - grow_buffer(n); - return; - } - // If n is negative we ask to increase the capacity by at least 1, - // but as std::vector, the buffer grows exponentially. - buffer_.reserve(n >= 0 ? offset + n + 1 : buffer_.capacity() + 1); - } -} - -/** - \rst - This class template provides operations for formatting and writing data - into a character stream. The output is stored in a memory buffer that grows - dynamically. - - You can use one of the following typedefs for common character types - and the standard allocator: - - +---------------+-----------------------------------------------------+ - | Type | Definition | - +===============+=====================================================+ - | MemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - | WMemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - - **Example**:: - - MemoryWriter out; - out << "The answer is " << 42 << "\n"; - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - The answer is 42 - (-3.140000, +3.140000) - - The output can be converted to an ``std::string`` with ``out.str()`` or - accessed as a C string with ``out.c_str()``. - \endrst - */ -template > -class BasicMemoryWriter : public BasicWriter { - private: - internal::MemoryBuffer buffer_; - - public: - explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) - : BasicWriter(buffer_), buffer_(alloc) {} - -#if FMT_USE_RVALUE_REFERENCES - /** - \rst - Constructs a :class:`fmt::BasicMemoryWriter` object moving the content - of the other object to it. - \endrst - */ - BasicMemoryWriter(BasicMemoryWriter &&other) - : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) { - } - - /** - \rst - Moves the content of the other ``BasicMemoryWriter`` object to this one. - \endrst - */ - BasicMemoryWriter &operator=(BasicMemoryWriter &&other) { - buffer_ = std::move(other.buffer_); - return *this; - } -#endif -}; - -typedef BasicMemoryWriter MemoryWriter; -typedef BasicMemoryWriter WMemoryWriter; - -/** - \rst - This class template provides operations for formatting and writing data - into a fixed-size array. For writing into a dynamically growing buffer - use :class:`fmt::BasicMemoryWriter`. - - Any write method will throw ``std::runtime_error`` if the output doesn't fit - into the array. - - You can use one of the following typedefs for common character types: - - +--------------+---------------------------+ - | Type | Definition | - +==============+===========================+ - | ArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - | WArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - \endrst - */ -template -class BasicArrayWriter : public BasicWriter { - private: - internal::FixedBuffer buffer_; - - public: - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - given size. - \endrst - */ - BasicArrayWriter(Char *array, std::size_t size) - : BasicWriter(buffer_), buffer_(array, size) {} - - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - size known at compile time. - \endrst - */ - template - explicit BasicArrayWriter(Char (&array)[SIZE]) - : BasicWriter(buffer_), buffer_(array, SIZE) {} -}; - -typedef BasicArrayWriter ArrayWriter; -typedef BasicArrayWriter WArrayWriter; - -// Formats a value. -template -void format(BasicFormatter &f, const Char *&format_str, const T &value) { - internal::MemoryBuffer buffer; - - internal::FormatBuf format_buf(buffer); - std::basic_ostream output(&format_buf); - output << value; - - BasicStringRef str(&buffer[0], format_buf.size()); - internal::Arg arg = internal::MakeValue(str); - arg.type = static_cast( - internal::MakeValue::type(str)); - format_str = f.format(format_str, arg); -} - -// Reports a system error without throwing an exception. -// Can be used to report errors from destructors. -void report_system_error(int error_code, StringRef message) FMT_NOEXCEPT; - -#if FMT_USE_WINDOWS_H - -/** A Windows error. */ -class WindowsError : public SystemError { - private: - void init(int error_code, CStringRef format_str, ArgList args); - - public: - /** - \rst - Constructs a :class:`fmt::WindowsError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is the - system message corresponding to the error code. - *error_code* is a Windows error code as given by ``GetLastError``. - If *error_code* is not a valid error code such as -1, the system message - will look like "error -1". - - **Example**:: - - // This throws a WindowsError with the description - // cannot open file 'madeup': The system cannot find the file specified. - // or similar (system message may vary). - const char *filename = "madeup"; - LPOFSTRUCT of = LPOFSTRUCT(); - HFILE file = OpenFile(filename, &of, OF_READ); - if (file == HFILE_ERROR) { - throw fmt::WindowsError(GetLastError(), - "cannot open file '{}'", filename); - } - \endrst - */ - WindowsError(int error_code, CStringRef message) { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) -}; - -// Reports a Windows error without throwing an exception. -// Can be used to report errors from destructors. -void report_windows_error(int error_code, StringRef message) FMT_NOEXCEPT; - -#endif - -enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; - -/** - Formats a string and prints it to stdout using ANSI escape sequences - to specify color (experimental). - Example: - print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); - */ -void print_colored(Color c, CStringRef format, ArgList args); - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = format("The answer is {}", 42); - \endrst -*/ -inline std::string format(CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -inline std::wstring format(WCStringRef format_str, ArgList args) { - WMemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - print(stderr, "Don't {}!", "panic"); - \endrst - */ -void print(std::FILE *f, CStringRef format_str, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - print("Elapsed time: {0:.2f} seconds", 1.23); - \endrst - */ -void print(CStringRef format_str, ArgList args); - -template -void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { - internal::PrintfFormatter(args).format(w, format); -} - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = fmt::sprintf("The answer is %d", 42); - \endrst -*/ -inline std::string sprintf(CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - return w.str(); -} - -inline std::wstring sprintf(WCStringRef format, ArgList args) { - WMemoryWriter w; - printf(w, format, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - fmt::fprintf(stderr, "Don't %s!", "panic"); - \endrst - */ -int fprintf(std::FILE *f, CStringRef format, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - fmt::printf("Elapsed time: %.2f seconds", 1.23); - \endrst - */ -inline int printf(CStringRef format, ArgList args) { - return fprintf(stdout, format, args); -} - -/** - Fast integer formatter. - */ -class FormatInt { - private: - // Buffer should be large enough to hold all digits (digits10 + 1), - // a sign and a null character. - enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; - mutable char buffer_[BUFFER_SIZE]; - char *str_; - - // Formats value in reverse and returns the number of digits. - char *format_decimal(ULongLong value) { - char *buffer_end = buffer_ + BUFFER_SIZE - 1; - while (value >= 100) { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - } - if (value < 10) { - *--buffer_end = static_cast('0' + value); - return buffer_end; - } - unsigned index = static_cast(value * 2); - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - return buffer_end; - } - - void FormatSigned(LongLong value) { - ULongLong abs_value = static_cast(value); - bool negative = value < 0; - if (negative) - abs_value = 0 - abs_value; - str_ = format_decimal(abs_value); - if (negative) - *--str_ = '-'; - } - - public: - explicit FormatInt(int value) { FormatSigned(value); } - explicit FormatInt(long value) { FormatSigned(value); } - explicit FormatInt(LongLong value) { FormatSigned(value); } - explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} - explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} - explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} - - /** - Returns the number of characters written to the output buffer. - */ - std::size_t size() const { return buffer_ - str_ + BUFFER_SIZE - 1; } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const char *data() const { return str_; } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const char *c_str() const { - buffer_[BUFFER_SIZE - 1] = '\0'; - return str_; - } - - /** - \rst - Returns the content of the output buffer as an ``std::string``. - \endrst - */ - std::string str() const { return std::string(str_, size()); } -}; - -// Formats a decimal integer value writing into buffer and returns -// a pointer to the end of the formatted string. This function doesn't -// write a terminating null character. -template -inline void format_decimal(char *&buffer, T value) { - typename internal::IntTraits::MainType abs_value = value; - if (internal::is_negative(value)) { - *buffer++ = '-'; - abs_value = 0 - abs_value; - } - if (abs_value < 100) { - if (abs_value < 10) { - *buffer++ = static_cast('0' + abs_value); - return; - } - unsigned index = static_cast(abs_value * 2); - *buffer++ = internal::Data::DIGITS[index]; - *buffer++ = internal::Data::DIGITS[index + 1]; - return; - } - unsigned num_digits = internal::count_digits(abs_value); - internal::format_decimal(buffer, abs_value, num_digits); - buffer += num_digits; -} - -/** - \rst - Returns a named argument for formatting functions. - - **Example**:: - - print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); - - \endrst - */ -template -inline internal::NamedArg arg(StringRef name, const T &arg) { - return internal::NamedArg(name, arg); -} - -template -inline internal::NamedArg arg(WStringRef name, const T &arg) { - return internal::NamedArg(name, arg); -} - -// The following two functions are deleted intentionally to disable -// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. -template -void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -template -void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -} - -#if FMT_GCC_VERSION -// Use the system_header pragma to suppress warnings about variadic macros -// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't -// work. It is used at the end because we want to suppress as little warnings -// as possible. -# pragma GCC system_header -#endif - -// This is used to work around VC++ bugs in handling variadic macros. -#define FMT_EXPAND(args) args - -// Returns the number of arguments. -// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. -#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) -#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) -#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N -#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - -#define FMT_CONCAT(a, b) a##b -#define FMT_FOR_EACH_(N, f, ...) \ - FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) -#define FMT_FOR_EACH(f, ...) \ - FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) - -#define FMT_ADD_ARG_NAME(type, index) type arg##index -#define FMT_GET_ARG_NAME(type, index) arg##index - -#if FMT_USE_VARIADIC_TEMPLATES -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - template \ - ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - const Args & ... args) { \ - typename fmt::internal::ArgArray::Type array; \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ - fmt::internal::make_arg_list(array, args...)); \ - } -#else -// Defines a wrapper for a function taking __VA_ARGS__ arguments -// and n additional arguments of arbitrary types. -# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ - template \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - FMT_GEN(n, FMT_MAKE_ARG)) { \ - fmt::internal::ArgArray::Type arr; \ - FMT_GEN(n, FMT_ASSIGN_##Char); \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ - } - -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ - } \ - FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) -#endif // FMT_USE_VARIADIC_TEMPLATES - -/** - \rst - Defines a variadic function with the specified return type, function name - and argument types passed as variable arguments to this macro. - - **Example**:: - - void print_error(const char *file, int line, const char *format, - fmt::ArgList args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args); - } - FMT_VARIADIC(void, print_error, const char *, int, const char *) - - ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that - don't implement variadic templates. You don't have to use this macro if - you don't need legacy compiler support and can use variadic templates - directly:: - - template - void print_error(const char *file, int line, const char *format, - const Args & ... args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args...); - } - \endrst - */ -#define FMT_VARIADIC(ReturnType, func, ...) \ - FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_VARIADIC_W(ReturnType, func, ...) \ - FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) - -#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) - -/** - \rst - Convenient macro to capture the arguments' names and values into several - ``fmt::arg(name, value)``. - - **Example**:: - - int x = 1, y = 2; - print("point: ({x}, {y})", FMT_CAPTURE(x, y)); - // same as: - // print("point: ({x}, {y})", arg("x", x), arg("y", y)); - - \endrst - */ -#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) - -#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) - -namespace fmt { -FMT_VARIADIC(std::string, format, CStringRef) -FMT_VARIADIC_W(std::wstring, format, WCStringRef) -FMT_VARIADIC(void, print, CStringRef) -FMT_VARIADIC(void, print, std::FILE *, CStringRef) - -FMT_VARIADIC(void, print_colored, Color, CStringRef) -FMT_VARIADIC(std::string, sprintf, CStringRef) -FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) -FMT_VARIADIC(int, printf, CStringRef) -FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) - -#if FMT_USE_IOSTREAMS -/** - \rst - Prints formatted data to the stream *os*. - - **Example**:: - - print(cerr, "Don't {}!", "panic"); - \endrst - */ -void print(std::ostream &os, CStringRef format_str, ArgList args); -FMT_VARIADIC(void, print, std::ostream &, CStringRef) -#endif -} // namespace fmt - -#if FMT_USE_USER_DEFINED_LITERALS -namespace fmt { -namespace internal { - -template -struct UdlFormat { - const Char *str; - - template - auto operator()(Args && ... args) const - -> decltype(format(str, std::forward(args)...)) { - return format(str, std::forward(args)...); - } -}; - -template -struct UdlArg { - const Char *str; - - template - NamedArg operator=(T &&value) const { - return {str, std::forward(value)}; - } -}; - -} // namespace internal - -inline namespace literals { - -/** - \rst - C++11 literal equivalent of :func:`fmt::format`. - - **Example**:: - - using namespace fmt::literals; - std::string message = "The answer is {}"_format(42); - \endrst - */ -inline internal::UdlFormat -operator"" _format(const char *s, std::size_t) { return {s}; } -inline internal::UdlFormat -operator"" _format(const wchar_t *s, std::size_t) { return {s}; } - -/** - \rst - C++11 literal equivalent of :func:`fmt::arg`. - - **Example**:: - - using namespace fmt::literals; - print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); - \endrst - */ -inline internal::UdlArg -operator"" _a(const char *s, std::size_t) { return {s}; } -inline internal::UdlArg -operator"" _a(const wchar_t *s, std::size_t) { return {s}; } - -} // inline namespace literals -} // namespace fmt -#endif // FMT_USE_USER_DEFINED_LITERALS - -// Restore warnings. -#if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic pop -#endif - -#if defined(__clang__) && !defined(__INTEL_COMPILER) -# pragma clang diagnostic pop -#endif - -#ifdef FMT_HEADER_ONLY -# include "format.cc" -#endif - -#endif // FMT_FORMAT_H_ -- cgit v1.2.3 From 145a0540715551140f17e4a193b605618c390f8f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 4 Jan 2017 21:27:24 +0100 Subject: Bump to fmt-3.0.1 --- vendor/fmt | 2 +- vendor/fmt-3.0.0/fmt/CMakeLists.txt | 91 - vendor/fmt-3.0.0/fmt/format.cc | 935 --------- vendor/fmt-3.0.0/fmt/format.h | 3832 ---------------------------------- vendor/fmt-3.0.0/fmt/ostream.cc | 61 - vendor/fmt-3.0.0/fmt/ostream.h | 133 -- vendor/fmt-3.0.0/fmt/posix.cc | 256 --- vendor/fmt-3.0.0/fmt/posix.h | 403 ---- vendor/fmt-3.0.0/fmt/time.h | 64 - vendor/fmt-3.0.1/fmt/CMakeLists.txt | 93 + vendor/fmt-3.0.1/fmt/format.cc | 940 +++++++++ vendor/fmt-3.0.1/fmt/format.h | 3883 +++++++++++++++++++++++++++++++++++ vendor/fmt-3.0.1/fmt/ostream.cc | 43 + vendor/fmt-3.0.1/fmt/ostream.h | 115 ++ vendor/fmt-3.0.1/fmt/posix.cc | 238 +++ vendor/fmt-3.0.1/fmt/posix.h | 386 ++++ vendor/fmt-3.0.1/fmt/time.h | 53 + 17 files changed, 5752 insertions(+), 5776 deletions(-) delete mode 100644 vendor/fmt-3.0.0/fmt/CMakeLists.txt delete mode 100644 vendor/fmt-3.0.0/fmt/format.cc delete mode 100644 vendor/fmt-3.0.0/fmt/format.h delete mode 100644 vendor/fmt-3.0.0/fmt/ostream.cc delete mode 100644 vendor/fmt-3.0.0/fmt/ostream.h delete mode 100644 vendor/fmt-3.0.0/fmt/posix.cc delete mode 100644 vendor/fmt-3.0.0/fmt/posix.h delete mode 100644 vendor/fmt-3.0.0/fmt/time.h create mode 100644 vendor/fmt-3.0.1/fmt/CMakeLists.txt create mode 100644 vendor/fmt-3.0.1/fmt/format.cc create mode 100644 vendor/fmt-3.0.1/fmt/format.h create mode 100644 vendor/fmt-3.0.1/fmt/ostream.cc create mode 100644 vendor/fmt-3.0.1/fmt/ostream.h create mode 100644 vendor/fmt-3.0.1/fmt/posix.cc create mode 100644 vendor/fmt-3.0.1/fmt/posix.h create mode 100644 vendor/fmt-3.0.1/fmt/time.h diff --git a/vendor/fmt b/vendor/fmt index 8b04339a..8d7e4769 120000 --- a/vendor/fmt +++ b/vendor/fmt @@ -1 +1 @@ -fmt-3.0.0 \ No newline at end of file +fmt-3.0.1 \ No newline at end of file diff --git a/vendor/fmt-3.0.0/fmt/CMakeLists.txt b/vendor/fmt-3.0.0/fmt/CMakeLists.txt deleted file mode 100644 index c0ef02e5..00000000 --- a/vendor/fmt-3.0.0/fmt/CMakeLists.txt +++ /dev/null @@ -1,91 +0,0 @@ -# Define the fmt library, its includes and the needed defines. -# format.cc is added to FMT_HEADERS for the header-only configuration. -set(FMT_HEADERS format.h format.cc ostream.h ostream.cc time.h) -if (HAVE_OPEN) - set(FMT_HEADERS ${FMT_HEADERS} posix.h) - set(FMT_SOURCES ${FMT_SOURCES} posix.cc) -endif () - -add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} ../ChangeLog.rst) - -option(FMT_CPPFORMAT "Build cppformat library for backward compatibility." OFF) -if (FMT_CPPFORMAT) - message(WARNING "The cppformat library is deprecated, use fmt instead.") - add_library(cppformat ${FMT_SOURCES} ${FMT_HEADERS}) -endif () - -# Starting with cmake 3.1 the CXX_STANDARD property can be used instead. -target_compile_options(fmt PUBLIC ${CPP11_FLAG}) -if (FMT_PEDANTIC) - target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) -endif () - -target_include_directories(fmt INTERFACE - $ - $) - -set_target_properties(fmt PROPERTIES - VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) - -if (BUILD_SHARED_LIBS) - if (UNIX AND NOT APPLE) - # Fix rpmlint warning: - # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. - target_link_libraries(fmt -Wl,--as-needed) - endif () - target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) -endif () - -#------------------------------------------------------------------------------ -# additionally define a header only library when cmake is new enough -if (CMAKE_VERSION VERSION_GREATER 3.1.0 OR CMAKE_VERSION VERSION_EQUAL 3.1.0) - add_library(fmt-header-only INTERFACE) - - target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) - - target_include_directories(fmt-header-only INTERFACE - $ - $) -endif () - -# Install targets. -if (FMT_INSTALL) - include(CMakePackageConfigHelpers) - set(FMT_CMAKE_DIR lib/cmake/fmt CACHE STRING - "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") - set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) - set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) - set(targets_export_name fmt-targets) - - set (INSTALL_TARGETS fmt) - if (TARGET fmt-header-only) - set(INSTALL_TARGETS ${INSTALL_TARGETS} fmt-header-only) - endif () - - set(FMT_LIB_DIR lib CACHE STRING - "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.") - - # Generate the version, config and target files into the build directory. - write_basic_package_version_file( - ${version_config} - VERSION ${FMT_VERSION} - COMPATIBILITY AnyNewerVersion) - configure_package_config_file( - ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in - ${project_config} - INSTALL_DESTINATION ${FMT_CMAKE_DIR}) - export(TARGETS ${INSTALL_TARGETS} FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) - - # Install version, config and target files. - install( - FILES ${project_config} ${version_config} - DESTINATION ${FMT_CMAKE_DIR}) - install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}) - - # Install the library and headers. - install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} DESTINATION ${FMT_LIB_DIR}) - install(FILES ${FMT_HEADERS} DESTINATION include/fmt) - if (FMT_CPPFORMAT) - install(TARGETS cppformat DESTINATION ${FMT_LIB_DIR}) - endif () -endif () diff --git a/vendor/fmt-3.0.0/fmt/format.cc b/vendor/fmt-3.0.0/fmt/format.cc deleted file mode 100644 index ae5d1103..00000000 --- a/vendor/fmt-3.0.0/fmt/format.cc +++ /dev/null @@ -1,935 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "format.h" - -#include - -#include -#include -#include -#include -#include -#include // for std::ptrdiff_t - -#if defined(_WIN32) && defined(__MINGW32__) -# include -#endif - -#if FMT_USE_WINDOWS_H -# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) -# include -# else -# define NOMINMAX -# include -# undef NOMINMAX -# endif -#endif - -using fmt::internal::Arg; - -#if FMT_EXCEPTIONS -# define FMT_TRY try -# define FMT_CATCH(x) catch (x) -#else -# define FMT_TRY if (true) -# define FMT_CATCH(x) if (false) -#endif - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable: 4127) // conditional expression is constant -# pragma warning(disable: 4702) // unreachable code -// Disable deprecation warning for strerror. The latter is not called but -// MSVC fails to detect it. -# pragma warning(disable: 4996) -#endif - -// Dummy implementations of strerror_r and strerror_s called if corresponding -// system functions are not available. -static inline fmt::internal::Null<> strerror_r(int, char *, ...) { - return fmt::internal::Null<>(); -} -static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { - return fmt::internal::Null<>(); -} - -namespace fmt { -namespace { - -#ifndef _MSC_VER -# define FMT_SNPRINTF snprintf -#else // _MSC_VER -inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { - va_list args; - va_start(args, format); - int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); - va_end(args); - return result; -} -# define FMT_SNPRINTF fmt_snprintf -#endif // _MSC_VER - -#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) -# define FMT_SWPRINTF snwprintf -#else -# define FMT_SWPRINTF swprintf -#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) - -// Checks if a value fits in int - used to avoid warnings about comparing -// signed and unsigned integers. -template -struct IntChecker { - template - static bool fits_in_int(T value) { - unsigned max = INT_MAX; - return value <= max; - } - static bool fits_in_int(bool) { return true; } -}; - -template <> -struct IntChecker { - template - static bool fits_in_int(T value) { - return value >= INT_MIN && value <= INT_MAX; - } - static bool fits_in_int(int) { return true; } -}; - -const char RESET_COLOR[] = "\x1b[0m"; - -typedef void (*FormatFunc)(Writer &, int, StringRef); - -// Portable thread-safe version of strerror. -// Sets buffer to point to a string describing the error code. -// This can be either a pointer to a string stored in buffer, -// or a pointer to some static immutable string. -// Returns one of the following values: -// 0 - success -// ERANGE - buffer is not large enough to store the error message -// other - failure -// Buffer should be at least of size 1. -int safe_strerror( - int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { - FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); - - class StrError { - private: - int error_code_; - char *&buffer_; - std::size_t buffer_size_; - - // A noop assignment operator to avoid bogus warnings. - void operator=(const StrError &) {} - - // Handle the result of XSI-compliant version of strerror_r. - int handle(int result) { - // glibc versions before 2.13 return result in errno. - return result == -1 ? errno : result; - } - - // Handle the result of GNU-specific version of strerror_r. - int handle(char *message) { - // If the buffer is full then the message is probably truncated. - if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) - return ERANGE; - buffer_ = message; - return 0; - } - - // Handle the case when strerror_r is not available. - int handle(internal::Null<>) { - return fallback(strerror_s(buffer_, buffer_size_, error_code_)); - } - - // Fallback to strerror_s when strerror_r is not available. - int fallback(int result) { - // If the buffer is full then the message is probably truncated. - return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? - ERANGE : result; - } - - // Fallback to strerror if strerror_r and strerror_s are not available. - int fallback(internal::Null<>) { - errno = 0; - buffer_ = strerror(error_code_); - return errno; - } - - public: - StrError(int err_code, char *&buf, std::size_t buf_size) - : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} - - int run() { - strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. - return handle(strerror_r(error_code_, buffer_, buffer_size_)); - } - }; - return StrError(error_code, buffer, buffer_size).run(); -} - -void format_error_code(Writer &out, int error_code, - StringRef message) FMT_NOEXCEPT { - // Report error code making sure that the output fits into - // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential - // bad_alloc. - out.clear(); - static const char SEP[] = ": "; - static const char ERROR_STR[] = "error "; - // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. - std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; - typedef internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(error_code); - if (internal::is_negative(error_code)) { - abs_value = 0 - abs_value; - ++error_code_size; - } - error_code_size += internal::count_digits(abs_value); - if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) - out << message << SEP; - out << ERROR_STR << error_code; - assert(out.size() <= internal::INLINE_BUFFER_SIZE); -} - -void report_error(FormatFunc func, int error_code, - StringRef message) FMT_NOEXCEPT { - MemoryWriter full_message; - func(full_message, error_code, message); - // Use Writer::data instead of Writer::c_str to avoid potential memory - // allocation. - std::fwrite(full_message.data(), full_message.size(), 1, stderr); - std::fputc('\n', stderr); -} - -// IsZeroInt::visit(arg) returns true iff arg is a zero integer. -class IsZeroInt : public ArgVisitor { - public: - template - bool visit_any_int(T value) { return value == 0; } -}; - -// Checks if an argument is a valid printf width specifier and sets -// left alignment if it is negative. -class WidthHandler : public ArgVisitor { - private: - FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); - - public: - explicit WidthHandler(FormatSpec &spec) : spec_(spec) {} - - void report_unhandled_arg() { - FMT_THROW(FormatError("width is not integer")); - } - - template - unsigned visit_any_int(T value) { - typedef typename internal::IntTraits::MainType UnsignedType; - UnsignedType width = static_cast(value); - if (internal::is_negative(value)) { - spec_.align_ = ALIGN_LEFT; - width = 0 - width; - } - if (width > INT_MAX) - FMT_THROW(FormatError("number is too big")); - return static_cast(width); - } -}; - -class PrecisionHandler : public ArgVisitor { - public: - void report_unhandled_arg() { - FMT_THROW(FormatError("precision is not integer")); - } - - template - int visit_any_int(T value) { - if (!IntChecker::is_signed>::fits_in_int(value)) - FMT_THROW(FormatError("number is too big")); - return static_cast(value); - } -}; - -template -struct is_same { - enum { value = 0 }; -}; - -template -struct is_same { - enum { value = 1 }; -}; - -// An argument visitor that converts an integer argument to T for printf, -// if T is an integral type. If T is void, the argument is converted to -// corresponding signed or unsigned type depending on the type specifier: -// 'd' and 'i' - signed, other - unsigned) -template -class ArgConverter : public ArgVisitor, void> { - private: - internal::Arg &arg_; - wchar_t type_; - - FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); - - public: - ArgConverter(internal::Arg &arg, wchar_t type) - : arg_(arg), type_(type) {} - - void visit_bool(bool value) { - if (type_ != 's') - visit_any_int(value); - } - - template - void visit_any_int(U value) { - bool is_signed = type_ == 'd' || type_ == 'i'; - using internal::Arg; - typedef typename internal::Conditional< - is_same::value, U, T>::type TargetType; - if (sizeof(TargetType) <= sizeof(int)) { - // Extra casts are used to silence warnings. - if (is_signed) { - arg_.type = Arg::INT; - arg_.int_value = static_cast(static_cast(value)); - } else { - arg_.type = Arg::UINT; - typedef typename internal::MakeUnsigned::Type Unsigned; - arg_.uint_value = static_cast(static_cast(value)); - } - } else { - if (is_signed) { - arg_.type = Arg::LONG_LONG; - // glibc's printf doesn't sign extend arguments of smaller types: - // std::printf("%lld", -42); // prints "4294967254" - // but we don't have to do the same because it's a UB. - arg_.long_long_value = static_cast(value); - } else { - arg_.type = Arg::ULONG_LONG; - arg_.ulong_long_value = - static_cast::Type>(value); - } - } - } -}; - -// Converts an integer argument to char for printf. -class CharConverter : public ArgVisitor { - private: - internal::Arg &arg_; - - FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); - - public: - explicit CharConverter(internal::Arg &arg) : arg_(arg) {} - - template - void visit_any_int(T value) { - arg_.type = internal::Arg::CHAR; - arg_.int_value = static_cast(value); - } -}; -} // namespace - -namespace internal { - -template -class PrintfArgFormatter : - public ArgFormatterBase, Char> { - - void write_null_pointer() { - this->spec().type_ = 0; - this->write("(nil)"); - } - - typedef ArgFormatterBase, Char> Base; - - public: - PrintfArgFormatter(BasicWriter &w, FormatSpec &s) - : ArgFormatterBase, Char>(w, s) {} - - void visit_bool(bool value) { - FormatSpec &fmt_spec = this->spec(); - if (fmt_spec.type_ != 's') - return this->visit_any_int(value); - fmt_spec.type_ = 0; - this->write(value); - } - - void visit_char(int value) { - const FormatSpec &fmt_spec = this->spec(); - BasicWriter &w = this->writer(); - if (fmt_spec.type_ && fmt_spec.type_ != 'c') - w.write_int(value, fmt_spec); - typedef typename BasicWriter::CharPtr CharPtr; - CharPtr out = CharPtr(); - if (fmt_spec.width_ > 1) { - Char fill = ' '; - out = w.grow_buffer(fmt_spec.width_); - if (fmt_spec.align_ != ALIGN_LEFT) { - std::fill_n(out, fmt_spec.width_ - 1, fill); - out += fmt_spec.width_ - 1; - } else { - std::fill_n(out + 1, fmt_spec.width_ - 1, fill); - } - } else { - out = w.grow_buffer(1); - } - *out = static_cast(value); - } - - void visit_cstring(const char *value) { - if (value) - Base::visit_cstring(value); - else if (this->spec().type_ == 'p') - write_null_pointer(); - else - this->write("(null)"); - } - - void visit_pointer(const void *value) { - if (value) - return Base::visit_pointer(value); - this->spec().type_ = 0; - write_null_pointer(); - } - - void visit_custom(Arg::CustomValue c) { - BasicFormatter formatter(ArgList(), this->writer()); - const Char format_str[] = {'}', 0}; - const Char *format = format_str; - c.format(&formatter, c.value, &format); - } -}; -} // namespace internal -} // namespace fmt - -FMT_FUNC void fmt::SystemError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_system_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -template -int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, value) : - FMT_SNPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SNPRINTF(buffer, size, format, width, value) : - FMT_SNPRINTF(buffer, size, format, width, precision, value); -} - -template -int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, T value) { - if (width == 0) { - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, value) : - FMT_SWPRINTF(buffer, size, format, precision, value); - } - return precision < 0 ? - FMT_SWPRINTF(buffer, size, format, width, value) : - FMT_SWPRINTF(buffer, size, format, width, precision, value); -} - -template -const char fmt::internal::BasicData::DIGITS[] = - "0001020304050607080910111213141516171819" - "2021222324252627282930313233343536373839" - "4041424344454647484950515253545556575859" - "6061626364656667686970717273747576777879" - "8081828384858687888990919293949596979899"; - -#define FMT_POWERS_OF_10(factor) \ - factor * 10, \ - factor * 100, \ - factor * 1000, \ - factor * 10000, \ - factor * 100000, \ - factor * 1000000, \ - factor * 10000000, \ - factor * 100000000, \ - factor * 1000000000 - -template -const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { - 0, FMT_POWERS_OF_10(1) -}; - -template -const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { - 0, - FMT_POWERS_OF_10(1), - FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), - // Multiply several constants instead of using a single long long constant - // to avoid warnings about C++98 not supporting long long. - fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 -}; - -FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { - (void)type; - if (std::isprint(static_cast(code))) { - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '{}' for {}", code, type))); - } - FMT_THROW(fmt::FormatError( - fmt::format("unknown format code '\\x{:02x}' for {}", - static_cast(code), type))); -} - -#if FMT_USE_WINDOWS_H - -FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { - static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; - if (s.size() > INT_MAX) - FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); - int s_size = static_cast(s.size()); - int length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_.resize(length + 1); - length = MultiByteToWideChar( - CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); - if (length == 0) - FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); - buffer_[length] = 0; -} - -FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { - if (int error_code = convert(s)) { - FMT_THROW(WindowsError(error_code, - "cannot convert string from UTF-16 to UTF-8")); - } -} - -FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { - if (s.size() > INT_MAX) - return ERROR_INVALID_PARAMETER; - int s_size = static_cast(s.size()); - int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); - if (length == 0) - return GetLastError(); - buffer_.resize(length + 1); - length = WideCharToMultiByte( - CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); - if (length == 0) - return GetLastError(); - buffer_[length] = 0; - return 0; -} - -FMT_FUNC void fmt::WindowsError::init( - int err_code, CStringRef format_str, ArgList args) { - error_code_ = err_code; - MemoryWriter w; - internal::format_windows_error(w, err_code, format(format_str, args)); - std::runtime_error &base = *this; - base = std::runtime_error(w.str()); -} - -FMT_FUNC void fmt::internal::format_windows_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - FMT_TRY { - MemoryBuffer buffer; - buffer.resize(INLINE_BUFFER_SIZE); - for (;;) { - wchar_t *system_message = &buffer[0]; - int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - system_message, static_cast(buffer.size()), 0); - if (result != 0) { - UTF16ToUTF8 utf8_message; - if (utf8_message.convert(system_message) == ERROR_SUCCESS) { - out << message << ": " << utf8_message; - return; - } - break; - } - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - break; // Can't get error message, report error code instead. - buffer.resize(buffer.size() * 2); - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -#endif // FMT_USE_WINDOWS_H - -FMT_FUNC void fmt::internal::format_system_error( - fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT { - FMT_TRY { - MemoryBuffer buffer; - buffer.resize(INLINE_BUFFER_SIZE); - for (;;) { - char *system_message = &buffer[0]; - int result = safe_strerror(error_code, system_message, buffer.size()); - if (result == 0) { - out << message << ": " << system_message; - return; - } - if (result != ERANGE) - break; // Can't get error message, report error code instead. - buffer.resize(buffer.size() * 2); - } - } FMT_CATCH(...) {} - fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. -} - -template -void fmt::internal::ArgMap::init(const ArgList &args) { - if (!map_.empty()) - return; - typedef internal::NamedArg NamedArg; - const NamedArg *named_arg = 0; - bool use_values = - args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; - if (use_values) { - for (unsigned i = 0;/*nothing*/; ++i) { - internal::Arg::Type arg_type = args.type(i); - switch (arg_type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.values_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } - return; - } - for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { - internal::Arg::Type arg_type = args.type(i); - if (arg_type == internal::Arg::NAMED_ARG) { - named_arg = static_cast(args.args_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - } - } - for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { - switch (args.args_[i].type) { - case internal::Arg::NONE: - return; - case internal::Arg::NAMED_ARG: - named_arg = static_cast(args.args_[i].pointer); - map_.push_back(Pair(named_arg->name, *named_arg)); - break; - default: - /*nothing*/; - } - } -} - -template -void fmt::internal::FixedBuffer::grow(std::size_t) { - FMT_THROW(std::runtime_error("buffer overflow")); -} - -FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( - unsigned arg_index, const char *&error) { - Arg arg = args_[arg_index]; - switch (arg.type) { - case Arg::NONE: - error = "argument index out of range"; - break; - case Arg::NAMED_ARG: - arg = *static_cast(arg.pointer); - break; - default: - /*nothing*/; - } - return arg; -} - -template -void fmt::internal::PrintfFormatter::parse_flags( - FormatSpec &spec, const Char *&s) { - for (;;) { - switch (*s++) { - case '-': - spec.align_ = ALIGN_LEFT; - break; - case '+': - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '0': - spec.fill_ = '0'; - break; - case ' ': - spec.flags_ |= SIGN_FLAG; - break; - case '#': - spec.flags_ |= HASH_FLAG; - break; - default: - --s; - return; - } - } -} - -template -Arg fmt::internal::PrintfFormatter::get_arg( - const Char *s, unsigned arg_index) { - (void)s; - const char *error = 0; - Arg arg = arg_index == UINT_MAX ? - next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); - if (error) - FMT_THROW(FormatError(!*s ? "invalid format string" : error)); - return arg; -} - -template -unsigned fmt::internal::PrintfFormatter::parse_header( - const Char *&s, FormatSpec &spec) { - unsigned arg_index = UINT_MAX; - Char c = *s; - if (c >= '0' && c <= '9') { - // Parse an argument index (if followed by '$') or a width possibly - // preceded with '0' flag(s). - unsigned value = parse_nonnegative_int(s); - if (*s == '$') { // value is an argument index - ++s; - arg_index = value; - } else { - if (c == '0') - spec.fill_ = '0'; - if (value != 0) { - // Nonzero value means that we parsed width and don't need to - // parse it or flags again, so return now. - spec.width_ = value; - return arg_index; - } - } - } - parse_flags(spec, s); - // Parse width. - if (*s >= '0' && *s <= '9') { - spec.width_ = parse_nonnegative_int(s); - } else if (*s == '*') { - ++s; - spec.width_ = WidthHandler(spec).visit(get_arg(s)); - } - return arg_index; -} - -template -void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, BasicCStringRef format_str) { - const Char *start = format_str.c_str(); - const Char *s = start; - while (*s) { - Char c = *s++; - if (c != '%') continue; - if (*s == c) { - write(writer, start, s); - start = ++s; - continue; - } - write(writer, start, s - 1); - - FormatSpec spec; - spec.align_ = ALIGN_RIGHT; - - // Parse argument index, flags and width. - unsigned arg_index = parse_header(s, spec); - - // Parse precision. - if (*s == '.') { - ++s; - if ('0' <= *s && *s <= '9') { - spec.precision_ = static_cast(parse_nonnegative_int(s)); - } else if (*s == '*') { - ++s; - spec.precision_ = PrecisionHandler().visit(get_arg(s)); - } - } - - Arg arg = get_arg(s, arg_index); - if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) - spec.flags_ &= ~to_unsigned(HASH_FLAG); - if (spec.fill_ == '0') { - if (arg.type <= Arg::LAST_NUMERIC_TYPE) - spec.align_ = ALIGN_NUMERIC; - else - spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. - } - - // Parse length and convert the argument to the required type. - switch (*s++) { - case 'h': - if (*s == 'h') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'l': - if (*s == 'l') - ArgConverter(arg, *++s).visit(arg); - else - ArgConverter(arg, *s).visit(arg); - break; - case 'j': - ArgConverter(arg, *s).visit(arg); - break; - case 'z': - ArgConverter(arg, *s).visit(arg); - break; - case 't': - ArgConverter(arg, *s).visit(arg); - break; - case 'L': - // printf produces garbage when 'L' is omitted for long double, no - // need to do the same. - break; - default: - --s; - ArgConverter(arg, *s).visit(arg); - } - - // Parse type. - if (!*s) - FMT_THROW(FormatError("invalid format string")); - spec.type_ = static_cast(*s++); - if (arg.type <= Arg::LAST_INTEGER_TYPE) { - // Normalize type. - switch (spec.type_) { - case 'i': case 'u': - spec.type_ = 'd'; - break; - case 'c': - // TODO: handle wchar_t - CharConverter(arg).visit(arg); - break; - } - } - - start = s; - - // Format argument. - internal::PrintfArgFormatter(writer, spec).visit(arg); - } - write(writer, start, s); -} - -FMT_FUNC void fmt::report_system_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_system_error, error_code, message); -} - -#if FMT_USE_WINDOWS_H -FMT_FUNC void fmt::report_windows_error( - int error_code, fmt::StringRef message) FMT_NOEXCEPT { - // 'fmt::' is for bcc32. - fmt::report_error(internal::format_windows_error, error_code, message); -} -#endif - -FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - std::fwrite(w.data(), 1, w.size(), f); -} - -FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { - print(stdout, format_str, args); -} - -FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { - char escape[] = "\x1b[30m"; - escape[3] = static_cast('0' + c); - std::fputs(escape, stdout); - print(format, args); - std::fputs(RESET_COLOR, stdout); -} - -FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - std::size_t size = w.size(); - return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); -} - -#ifndef FMT_HEADER_ONLY - -template struct fmt::internal::BasicData; - -// Explicit instantiations for char. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template void fmt::internal::ArgMap::init(const fmt::ArgList &args); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, CStringRef format); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - char *buffer, std::size_t size, const char *format, - unsigned width, int precision, long double value); - -// Explicit instantiations for wchar_t. - -template void fmt::internal::FixedBuffer::grow(std::size_t); - -template void fmt::internal::ArgMap::init(const fmt::ArgList &args); - -template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, WCStringRef format); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, double value); - -template int fmt::internal::CharTraits::format_float( - wchar_t *buffer, std::size_t size, const wchar_t *format, - unsigned width, int precision, long double value); - -#endif // FMT_HEADER_ONLY - -#ifdef _MSC_VER -# pragma warning(pop) -#endif diff --git a/vendor/fmt-3.0.0/fmt/format.h b/vendor/fmt-3.0.0/fmt/format.h deleted file mode 100644 index 5013b810..00000000 --- a/vendor/fmt-3.0.0/fmt/format.h +++ /dev/null @@ -1,3832 +0,0 @@ -/* - Formatting library for C++ - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_FORMAT_H_ -#define FMT_FORMAT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _SECURE_SCL -# define FMT_SECURE_SCL _SECURE_SCL -#else -# define FMT_SECURE_SCL 0 -#endif - -#if FMT_SECURE_SCL -# include -#endif - -#if defined(_MSC_VER) && _MSC_VER <= 1500 -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -typedef __int64 intmax_t; -#else -#include -#endif - -#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) -# ifdef FMT_EXPORT -# define FMT_API __declspec(dllexport) -# elif defined(FMT_SHARED) -# define FMT_API __declspec(dllimport) -# endif -#endif -#ifndef FMT_API -# define FMT_API -#endif - -#ifdef __GNUC__ -# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -# define FMT_GCC_EXTENSION __extension__ -# if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic push -// Disable the warning about "long long" which is sometimes reported even -// when using __extension__. -# pragma GCC diagnostic ignored "-Wlong-long" -// Disable the warning about declaration shadowing because it affects too -// many valid cases. -# pragma GCC diagnostic ignored "-Wshadow" -// Disable the warning about implicit conversions that may change the sign of -// an integer; silencing it otherwise would require many explicit casts. -# pragma GCC diagnostic ignored "-Wsign-conversion" -# endif -# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ -# define FMT_HAS_GXX_CXX11 1 -# endif -#else -# define FMT_GCC_EXTENSION -#endif - -#if defined(__INTEL_COMPILER) -# define FMT_ICC_VERSION __INTEL_COMPILER -#elif defined(__ICL) -# define FMT_ICC_VERSION __ICL -#endif - -#if defined(__clang__) && !defined(FMT_ICC_VERSION) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wdocumentation" -#endif - -#ifdef __GNUC_LIBSTD__ -# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) -#endif - -#ifdef __has_feature -# define FMT_HAS_FEATURE(x) __has_feature(x) -#else -# define FMT_HAS_FEATURE(x) 0 -#endif - -#ifdef __has_builtin -# define FMT_HAS_BUILTIN(x) __has_builtin(x) -#else -# define FMT_HAS_BUILTIN(x) 0 -#endif - -#ifdef __has_cpp_attribute -# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) -#else -# define FMT_HAS_CPP_ATTRIBUTE(x) 0 -#endif - -#ifndef FMT_USE_VARIADIC_TEMPLATES -// Variadic templates are available in GCC since version 4.4 -// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ -// since version 2013. -# define FMT_USE_VARIADIC_TEMPLATES \ - (FMT_HAS_FEATURE(cxx_variadic_templates) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800) -#endif - -#ifndef FMT_USE_RVALUE_REFERENCES -// Don't use rvalue references when compiling with clang and an old libstdc++ -// as the latter doesn't provide std::move. -# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 -# define FMT_USE_RVALUE_REFERENCES 0 -# else -# define FMT_USE_RVALUE_REFERENCES \ - (FMT_HAS_FEATURE(cxx_rvalue_references) || \ - (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600) -# endif -#endif - -#if FMT_USE_RVALUE_REFERENCES -# include // for std::move -#endif - -// Check if exceptions are disabled. -#if defined(__GNUC__) && !defined(__EXCEPTIONS) -# define FMT_EXCEPTIONS 0 -#endif -#if defined(_MSC_VER) && !_HAS_EXCEPTIONS -# define FMT_EXCEPTIONS 0 -#endif -#ifndef FMT_EXCEPTIONS -# define FMT_EXCEPTIONS 1 -#endif - -#ifndef FMT_THROW -# if FMT_EXCEPTIONS -# define FMT_THROW(x) throw x -# else -# define FMT_THROW(x) assert(false) -# endif -#endif - -// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). -#ifndef FMT_USE_NOEXCEPT -# define FMT_USE_NOEXCEPT 0 -#endif - -#ifndef FMT_NOEXCEPT -# if FMT_EXCEPTIONS -# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ - _MSC_VER >= 1900 -# define FMT_NOEXCEPT noexcept -# else -# define FMT_NOEXCEPT throw() -# endif -# else -# define FMT_NOEXCEPT -# endif -#endif - -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef FMT_USE_DELETED_FUNCTIONS -# define FMT_USE_DELETED_FUNCTIONS 0 -#endif - -#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ - (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1800 -# define FMT_DELETED_OR_UNDEFINED = delete -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&) = delete; \ - TypeName& operator=(const TypeName&) = delete -#else -# define FMT_DELETED_OR_UNDEFINED -# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - TypeName& operator=(const TypeName&) -#endif - -#ifndef FMT_USE_USER_DEFINED_LITERALS -// All compilers which support UDLs also support variadic templates. This -// makes the fmt::literals implementation easier. However, an explicit check -// for variadic templates is added here just in case. -// For Intel's compiler both it and the system gcc/msc must support UDLs. -# define FMT_USE_USER_DEFINED_LITERALS \ - FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ - (FMT_HAS_FEATURE(cxx_user_literals) || \ - (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1900) && \ - (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500) -#endif - -#ifndef FMT_ASSERT -# define FMT_ASSERT(condition, message) assert((condition) && message) -#endif - - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) -# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) -#endif - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) -# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) -#endif - -// Some compilers masquerade as both MSVC and GCC-likes or -// otherwise support __builtin_clz and __builtin_clzll, so -// only define FMT_BUILTIN_CLZ using the MSVC intrinsics -// if the clz and clzll builtins are not available. -#if defined(_MSC_VER) && !defined(FMT_BUILTIN_CLZLL) -# include // _BitScanReverse, _BitScanReverse64 - -namespace fmt { -namespace internal { -# pragma intrinsic(_BitScanReverse) -inline uint32_t clz(uint32_t x) { - unsigned long r = 0; - _BitScanReverse(&r, x); - - assert(x != 0); - // Static analysis complains about using uninitialized data - // "r", but the only way that can happen is if "x" is 0, - // which the callers guarantee to not happen. -# pragma warning(suppress: 6102) - return 31 - r; -} -# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) - -# ifdef _WIN64 -# pragma intrinsic(_BitScanReverse64) -# endif - -inline uint32_t clzll(uint64_t x) { - unsigned long r = 0; -# ifdef _WIN64 - _BitScanReverse64(&r, x); -# else - // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast(x >> 32))) - return 63 - (r + 32); - - // Scan the low 32 bits. - _BitScanReverse(&r, static_cast(x)); -# endif - - assert(x != 0); - // Static analysis complains about using uninitialized data - // "r", but the only way that can happen is if "x" is 0, - // which the callers guarantee to not happen. -# pragma warning(suppress: 6102) - return 63 - r; -} -# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) -} -} -#endif - -namespace fmt { -namespace internal { -struct DummyInt { - int data[2]; - operator int() const { return 0; } -}; -typedef std::numeric_limits FPUtil; - -// Dummy implementations of system functions such as signbit and ecvt called -// if the latter are not available. -inline DummyInt signbit(...) { return DummyInt(); } -inline DummyInt _ecvt_s(...) { return DummyInt(); } -inline DummyInt isinf(...) { return DummyInt(); } -inline DummyInt _finite(...) { return DummyInt(); } -inline DummyInt isnan(...) { return DummyInt(); } -inline DummyInt _isnan(...) { return DummyInt(); } - -// A helper function to suppress bogus "conditional expression is constant" -// warnings. -template -inline T check(T value) { return value; } -} -} // namespace fmt - -namespace std { -// Standard permits specialization of std::numeric_limits. This specialization -// is used to resolve ambiguity between isinf and std::isinf in glibc: -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 -// and the same for isnan and signbit. -template <> -class numeric_limits : - public std::numeric_limits { - public: - // Portable version of isinf. - template - static bool isinfinity(T x) { - using namespace fmt::internal; - // The resolution "priority" is: - // isinf macro > std::isinf > ::isinf > fmt::internal::isinf - if (check(sizeof(isinf(x)) == sizeof(bool) || - sizeof(isinf(x)) == sizeof(int))) { - return isinf(x) != 0; - } - return !_finite(static_cast(x)); - } - - // Portable version of isnan. - template - static bool isnotanumber(T x) { - using namespace fmt::internal; - if (check(sizeof(isnan(x)) == sizeof(bool) || - sizeof(isnan(x)) == sizeof(int))) { - return isnan(x) != 0; - } - return _isnan(static_cast(x)) != 0; - } - - // Portable version of signbit. - static bool isnegative(double x) { - using namespace fmt::internal; - if (check(sizeof(signbit(x)) == sizeof(int))) - return signbit(x) != 0; - if (x < 0) return true; - if (!isnotanumber(x)) return false; - int dec = 0, sign = 0; - char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. - _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); - return sign != 0; - } -}; -} // namespace std - -namespace fmt { - -// Fix the warning about long long on older versions of GCC -// that don't support the diagnostic pragma. -FMT_GCC_EXTENSION typedef long long LongLong; -FMT_GCC_EXTENSION typedef unsigned long long ULongLong; - -#if FMT_USE_RVALUE_REFERENCES -using std::move; -#endif - -template -class BasicWriter; - -typedef BasicWriter Writer; -typedef BasicWriter WWriter; - -template -class ArgFormatter; - -template > -class BasicFormatter; - -/** - \rst - A string reference. It can be constructed from a C string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +------------+-------------------------+ - | Type | Definition | - +============+=========================+ - | StringRef | BasicStringRef | - +------------+-------------------------+ - | WStringRef | BasicStringRef | - +------------+-------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(StringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicStringRef { - private: - const Char *data_; - std::size_t size_; - - public: - /** Constructs a string reference object from a C string and a size. */ - BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} - - /** - \rst - Constructs a string reference object from a C string computing - the size with ``std::char_traits::length``. - \endrst - */ - BasicStringRef(const Char *s) - : data_(s), size_(std::char_traits::length(s)) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicStringRef(const std::basic_string &s) - : data_(s.c_str()), size_(s.size()) {} - - /** - \rst - Converts a string reference to an ``std::string`` object. - \endrst - */ - std::basic_string to_string() const { - return std::basic_string(data_, size_); - } - - /** Returns a pointer to the string data. */ - const Char *data() const { return data_; } - - /** Returns the string size. */ - std::size_t size() const { return size_; } - - // Lexicographically compare this string reference to other. - int compare(BasicStringRef other) const { - std::size_t size = size_ < other.size_ ? size_ : other.size_; - int result = std::char_traits::compare(data_, other.data_, size); - if (result == 0) - result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); - return result; - } - - friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) == 0; - } - friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) != 0; - } - friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) < 0; - } - friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) <= 0; - } - friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) > 0; - } - friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) { - return lhs.compare(rhs) >= 0; - } -}; - -typedef BasicStringRef StringRef; -typedef BasicStringRef WStringRef; - -/** - \rst - A reference to a null terminated string. It can be constructed from a C - string or ``std::string``. - - You can use one of the following typedefs for common character types: - - +-------------+--------------------------+ - | Type | Definition | - +=============+==========================+ - | CStringRef | BasicCStringRef | - +-------------+--------------------------+ - | WCStringRef | BasicCStringRef | - +-------------+--------------------------+ - - This class is most useful as a parameter type to allow passing - different types of strings to a function, for example:: - - template - std::string format(CStringRef format_str, const Args & ... args); - - format("{}", 42); - format(std::string("{}"), 42); - \endrst - */ -template -class BasicCStringRef { - private: - const Char *data_; - - public: - /** Constructs a string reference object from a C string. */ - BasicCStringRef(const Char *s) : data_(s) {} - - /** - \rst - Constructs a string reference from an ``std::string`` object. - \endrst - */ - BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} - - /** Returns the pointer to a C string. */ - const Char *c_str() const { return data_; } -}; - -typedef BasicCStringRef CStringRef; -typedef BasicCStringRef WCStringRef; - -/** - A formatting error such as invalid format string. -*/ -class FormatError : public std::runtime_error { - public: - explicit FormatError(CStringRef message) - : std::runtime_error(message.c_str()) {} -}; - -namespace internal { - -// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. -template -struct MakeUnsigned { typedef T Type; }; - -#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ - template <> \ - struct MakeUnsigned { typedef U Type; } - -FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); -FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); -FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); -FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); - -// Casts nonnegative integer to unsigned. -template -inline typename MakeUnsigned::Type to_unsigned(Int value) { - FMT_ASSERT(value >= 0, "negative value"); - return static_cast::Type>(value); -} - -// The number of characters to store in the MemoryBuffer object itself -// to avoid dynamic memory allocation. -enum { INLINE_BUFFER_SIZE = 500 }; - -#if FMT_SECURE_SCL -// Use checked iterator to avoid warnings on MSVC. -template -inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) { - return stdext::checked_array_iterator(ptr, size); -} -#else -template -inline T *make_ptr(T *ptr, std::size_t) { return ptr; } -#endif -} // namespace internal - -/** - \rst - A buffer supporting a subset of ``std::vector``'s operations. - \endrst - */ -template -class Buffer { - private: - FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); - - protected: - T *ptr_; - std::size_t size_; - std::size_t capacity_; - - Buffer(T *ptr = 0, std::size_t capacity = 0) - : ptr_(ptr), size_(0), capacity_(capacity) {} - - /** - \rst - Increases the buffer capacity to hold at least *size* elements updating - ``ptr_`` and ``capacity_``. - \endrst - */ - virtual void grow(std::size_t size) = 0; - - public: - virtual ~Buffer() {} - - /** Returns the size of this buffer. */ - std::size_t size() const { return size_; } - - /** Returns the capacity of this buffer. */ - std::size_t capacity() const { return capacity_; } - - /** - Resizes the buffer. If T is a POD type new elements may not be initialized. - */ - void resize(std::size_t new_size) { - if (new_size > capacity_) - grow(new_size); - size_ = new_size; - } - - /** - \rst - Reserves space to store at least *capacity* elements. - \endrst - */ - void reserve(std::size_t capacity) { - if (capacity > capacity_) - grow(capacity); - } - - void clear() FMT_NOEXCEPT { size_ = 0; } - - void push_back(const T &value) { - if (size_ == capacity_) - grow(size_ + 1); - ptr_[size_++] = value; - } - - /** Appends data to the end of the buffer. */ - template - void append(const U *begin, const U *end); - - T &operator[](std::size_t index) { return ptr_[index]; } - const T &operator[](std::size_t index) const { return ptr_[index]; } -}; - -template -template -void Buffer::append(const U *begin, const U *end) { - std::size_t new_size = size_ + internal::to_unsigned(end - begin); - if (new_size > capacity_) - grow(new_size); - std::uninitialized_copy(begin, end, - internal::make_ptr(ptr_, capacity_) + size_); - size_ = new_size; -} - -namespace internal { - -// A memory buffer for trivially copyable/constructible types with the first SIZE -// elements stored in the object itself. -template > -class MemoryBuffer : private Allocator, public Buffer { - private: - T data_[SIZE]; - - // Deallocate memory allocated by the buffer. - void deallocate() { - if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); - } - - protected: - void grow(std::size_t size); - - public: - explicit MemoryBuffer(const Allocator &alloc = Allocator()) - : Allocator(alloc), Buffer(data_, SIZE) {} - ~MemoryBuffer() { deallocate(); } - -#if FMT_USE_RVALUE_REFERENCES - private: - // Move data from other to this buffer. - void move(MemoryBuffer &other) { - Allocator &this_alloc = *this, &other_alloc = other; - this_alloc = std::move(other_alloc); - this->size_ = other.size_; - this->capacity_ = other.capacity_; - if (other.ptr_ == other.data_) { - this->ptr_ = data_; - std::uninitialized_copy(other.data_, other.data_ + this->size_, - make_ptr(data_, this->capacity_)); - } else { - this->ptr_ = other.ptr_; - // Set pointer to the inline array so that delete is not called - // when deallocating. - other.ptr_ = other.data_; - } - } - - public: - MemoryBuffer(MemoryBuffer &&other) { - move(other); - } - - MemoryBuffer &operator=(MemoryBuffer &&other) { - assert(this != &other); - deallocate(); - move(other); - return *this; - } -#endif - - // Returns a copy of the allocator associated with this buffer. - Allocator get_allocator() const { return *this; } -}; - -template -void MemoryBuffer::grow(std::size_t size) { - std::size_t new_capacity = this->capacity_ + this->capacity_ / 2; - if (size > new_capacity) - new_capacity = size; - T *new_ptr = this->allocate(new_capacity); - // The following code doesn't throw, so the raw pointer above doesn't leak. - std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_, - make_ptr(new_ptr, new_capacity)); - std::size_t old_capacity = this->capacity_; - T *old_ptr = this->ptr_; - this->capacity_ = new_capacity; - this->ptr_ = new_ptr; - // deallocate may throw (at least in principle), but it doesn't matter since - // the buffer already uses the new storage and will deallocate it in case - // of exception. - if (old_ptr != data_) - Allocator::deallocate(old_ptr, old_capacity); -} - -// A fixed-size buffer. -template -class FixedBuffer : public fmt::Buffer { - public: - FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} - - protected: - FMT_API void grow(std::size_t size); -}; - -template -class BasicCharTraits { - public: -#if FMT_SECURE_SCL - typedef stdext::checked_array_iterator CharPtr; -#else - typedef Char *CharPtr; -#endif - static Char cast(int value) { return static_cast(value); } -}; - -template -class CharTraits; - -template <> -class CharTraits : public BasicCharTraits { - private: - // Conversion from wchar_t to char is not allowed. - static char convert(wchar_t); - - public: - static char convert(char value) { return value; } - - // Formats a floating-point number. - template - FMT_API static int format_float(char *buffer, std::size_t size, - const char *format, unsigned width, int precision, T value); -}; - -template <> -class CharTraits : public BasicCharTraits { - public: - static wchar_t convert(char value) { return value; } - static wchar_t convert(wchar_t value) { return value; } - - template - FMT_API static int format_float(wchar_t *buffer, std::size_t size, - const wchar_t *format, unsigned width, int precision, T value); -}; - -// Checks if a number is negative - used to avoid warnings. -template -struct SignChecker { - template - static bool is_negative(T value) { return value < 0; } -}; - -template <> -struct SignChecker { - template - static bool is_negative(T) { return false; } -}; - -// Returns true if value is negative, false otherwise. -// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. -template -inline bool is_negative(T value) { - return SignChecker::is_signed>::is_negative(value); -} - -// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. -template -struct TypeSelector { typedef uint32_t Type; }; - -template <> -struct TypeSelector { typedef uint64_t Type; }; - -template -struct IntTraits { - // Smallest of uint32_t and uint64_t that is large enough to represent - // all values of T. - typedef typename - TypeSelector::digits <= 32>::Type MainType; -}; - -FMT_API void report_unknown_type(char code, const char *type); - -// Static data is placed in this class template to allow header-only -// configuration. -template -struct FMT_API BasicData { - static const uint32_t POWERS_OF_10_32[]; - static const uint64_t POWERS_OF_10_64[]; - static const char DIGITS[]; -}; - -typedef BasicData<> Data; - -#ifdef FMT_BUILTIN_CLZLL -// Returns the number of decimal digits in n. Leading zeros are not counted -// except for n == 0 in which case count_digits returns 1. -inline unsigned count_digits(uint64_t n) { - // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 - // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. - int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; - return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; -} -#else -// Fallback version of count_digits used when __builtin_clz is not available. -inline unsigned count_digits(uint64_t n) { - unsigned count = 1; - for (;;) { - // Integer division is slow so do it for a group of four digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - if (n < 10) return count; - if (n < 100) return count + 1; - if (n < 1000) return count + 2; - if (n < 10000) return count + 3; - n /= 10000u; - count += 4; - } -} -#endif - -#ifdef FMT_BUILTIN_CLZ -// Optional version of count_digits for better performance on 32-bit platforms. -inline unsigned count_digits(uint32_t n) { - int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; - return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; -} -#endif - -// A functor that doesn't add a thousands separator. -struct NoThousandsSep { - template - void operator()(Char *) {} -}; - -// A functor that adds a thousands separator. -class ThousandsSep { - private: - fmt::StringRef sep_; - - // Index of a decimal digit with the least significant digit having index 0. - unsigned digit_index_; - - public: - explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {} - - template - void operator()(Char *&buffer) { - if (++digit_index_ % 3 != 0) - return; - buffer -= sep_.size(); - std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(), - internal::make_ptr(buffer, sep_.size())); - } -}; - -// Formats a decimal unsigned integer value writing into buffer. -// thousands_sep is a functor that is called after writing each char to -// add a thousands separator if necessary. -template -inline void format_decimal(Char *buffer, UInt value, unsigned num_digits, - ThousandsSep thousands_sep) { - buffer += num_digits; - while (value >= 100) { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer = Data::DIGITS[index + 1]; - thousands_sep(buffer); - *--buffer = Data::DIGITS[index]; - thousands_sep(buffer); - } - if (value < 10) { - *--buffer = static_cast('0' + value); - return; - } - unsigned index = static_cast(value * 2); - *--buffer = Data::DIGITS[index + 1]; - *--buffer = Data::DIGITS[index]; -} - -template -inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) { - return format_decimal(buffer, value, num_digits, NoThousandsSep()); -} - -#ifndef _WIN32 -# define FMT_USE_WINDOWS_H 0 -#elif !defined(FMT_USE_WINDOWS_H) -# define FMT_USE_WINDOWS_H 1 -#endif - -// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. -// All the functionality that relies on it will be disabled too. -#if FMT_USE_WINDOWS_H -// A converter from UTF-8 to UTF-16. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF8ToUTF16 { - private: - MemoryBuffer buffer_; - - public: - FMT_API explicit UTF8ToUTF16(StringRef s); - operator WStringRef() const { return WStringRef(&buffer_[0], size()); } - size_t size() const { return buffer_.size() - 1; } - const wchar_t *c_str() const { return &buffer_[0]; } - std::wstring str() const { return std::wstring(&buffer_[0], size()); } -}; - -// A converter from UTF-16 to UTF-8. -// It is only provided for Windows since other systems support UTF-8 natively. -class UTF16ToUTF8 { - private: - MemoryBuffer buffer_; - - public: - UTF16ToUTF8() {} - FMT_API explicit UTF16ToUTF8(WStringRef s); - operator StringRef() const { return StringRef(&buffer_[0], size()); } - size_t size() const { return buffer_.size() - 1; } - const char *c_str() const { return &buffer_[0]; } - std::string str() const { return std::string(&buffer_[0], size()); } - - // Performs conversion returning a system error code instead of - // throwing exception on conversion error. This method may still throw - // in case of memory allocation error. - FMT_API int convert(WStringRef s); -}; - -FMT_API void format_windows_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; -#endif - -FMT_API void format_system_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; - -// A formatting argument value. -struct Value { - template - struct StringValue { - const Char *value; - std::size_t size; - }; - - typedef void (*FormatFunc)( - void *formatter, const void *arg, void *format_str_ptr); - - struct CustomValue { - const void *value; - FormatFunc format; - }; - - union { - int int_value; - unsigned uint_value; - LongLong long_long_value; - ULongLong ulong_long_value; - double double_value; - long double long_double_value; - const void *pointer; - StringValue string; - StringValue sstring; - StringValue ustring; - StringValue wstring; - CustomValue custom; - }; - - enum Type { - NONE, NAMED_ARG, - // Integer types should go first, - INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, - // followed by floating-point types. - DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, - CSTRING, STRING, WSTRING, POINTER, CUSTOM - }; -}; - -// A formatting argument. It is a trivially copyable/constructible type to -// allow storage in internal::MemoryBuffer. -struct Arg : Value { - Type type; -}; - -template -struct NamedArg; - -template -struct Null {}; - -// A helper class template to enable or disable overloads taking wide -// characters and strings in MakeValue. -template -struct WCharHelper { - typedef Null Supported; - typedef T Unsupported; -}; - -template -struct WCharHelper { - typedef T Supported; - typedef Null Unsupported; -}; - -typedef char Yes[1]; -typedef char No[2]; - -template -T &get(); - -// These are non-members to workaround an overload resolution bug in bcc32. -Yes &convert(fmt::ULongLong); -No &convert(...); - -template -struct ConvertToIntImpl { - enum { value = ENABLE_CONVERSION }; -}; - -template -struct ConvertToIntImpl2 { - enum { value = false }; -}; - -template -struct ConvertToIntImpl2 { - enum { - // Don't convert numeric types. - value = ConvertToIntImpl::is_specialized>::value - }; -}; - -template -struct ConvertToInt { - enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; - enum { value = ConvertToIntImpl2::value }; -}; - -#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ - template <> \ - struct ConvertToInt { enum { value = 0 }; } - -// Silence warnings about convering float to int. -FMT_DISABLE_CONVERSION_TO_INT(float); -FMT_DISABLE_CONVERSION_TO_INT(double); -FMT_DISABLE_CONVERSION_TO_INT(long double); - -template -struct EnableIf {}; - -template -struct EnableIf { typedef T type; }; - -template -struct Conditional { typedef T type; }; - -template -struct Conditional { typedef F type; }; - -// For bcc32 which doesn't understand ! in template arguments. -template -struct Not { enum { value = 0 }; }; - -template<> -struct Not { enum { value = 1 }; }; - -// Makes an Arg object from any type. -template -class MakeValue : public Arg { - public: - typedef typename Formatter::Char Char; - - private: - // The following two methods are private to disallow formatting of - // arbitrary pointers. If you want to output a pointer cast it to - // "void *" or "const void *". In particular, this forbids formatting - // of "[const] volatile char *" which is printed as bool by iostreams. - // Do not implement! - template - MakeValue(const T *value); - template - MakeValue(T *value); - - // The following methods are private to disallow formatting of wide - // characters and strings into narrow strings as in - // fmt::format("{}", L"test"); - // To fix this, use a wide format string: fmt::format(L"{}", L"test"). -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Unsupported); -#endif - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - MakeValue(typename WCharHelper::Unsupported); - - void set_string(StringRef str) { - string.value = str.data(); - string.size = str.size(); - } - - void set_string(WStringRef str) { - wstring.value = str.data(); - wstring.size = str.size(); - } - - // Formats an argument of a custom type, such as a user-defined class. - template - static void format_custom_arg( - void *formatter, const void *arg, void *format_str_ptr) { - format(*static_cast(formatter), - *static_cast(format_str_ptr), - *static_cast(arg)); - } - - public: - MakeValue() {} - -#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ - MakeValue(Type value) { field = rhs; } \ - static uint64_t type(Type) { return Arg::TYPE; } - -#define FMT_MAKE_VALUE(Type, field, TYPE) \ - FMT_MAKE_VALUE_(Type, field, TYPE, value) - - FMT_MAKE_VALUE(bool, int_value, BOOL) - FMT_MAKE_VALUE(short, int_value, INT) - FMT_MAKE_VALUE(unsigned short, uint_value, UINT) - FMT_MAKE_VALUE(int, int_value, INT) - FMT_MAKE_VALUE(unsigned, uint_value, UINT) - - MakeValue(long value) { - // To minimize the number of types we need to deal with, long is - // translated either to int or to long long depending on its size. - if (check(sizeof(long) == sizeof(int))) - int_value = static_cast(value); - else - long_long_value = value; - } - static uint64_t type(long) { - return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; - } - - MakeValue(unsigned long value) { - if (check(sizeof(unsigned long) == sizeof(unsigned))) - uint_value = static_cast(value); - else - ulong_long_value = value; - } - static uint64_t type(unsigned long) { - return sizeof(unsigned long) == sizeof(unsigned) ? - Arg::UINT : Arg::ULONG_LONG; - } - - FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) - FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) - FMT_MAKE_VALUE(float, double_value, DOUBLE) - FMT_MAKE_VALUE(double, double_value, DOUBLE) - FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) - FMT_MAKE_VALUE(signed char, int_value, INT) - FMT_MAKE_VALUE(unsigned char, uint_value, UINT) - FMT_MAKE_VALUE(char, int_value, CHAR) - -#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) - MakeValue(typename WCharHelper::Supported value) { - int_value = value; - } - static uint64_t type(wchar_t) { return Arg::CHAR; } -#endif - -#define FMT_MAKE_STR_VALUE(Type, TYPE) \ - MakeValue(Type value) { set_string(value); } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_VALUE(char *, string.value, CSTRING) - FMT_MAKE_VALUE(const char *, string.value, CSTRING) - FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) - FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) - FMT_MAKE_STR_VALUE(const std::string &, STRING) - FMT_MAKE_STR_VALUE(StringRef, STRING) - FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) - -#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ - MakeValue(typename WCharHelper::Supported value) { \ - set_string(value); \ - } \ - static uint64_t type(Type) { return Arg::TYPE; } - - FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) - FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) - FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) - - FMT_MAKE_VALUE(void *, pointer, POINTER) - FMT_MAKE_VALUE(const void *, pointer, POINTER) - - template - MakeValue(const T &value, - typename EnableIf::value>::value, int>::type = 0) { - custom.value = &value; - custom.format = &format_custom_arg; - } - - template - MakeValue(const T &value, - typename EnableIf::value, int>::type = 0) { - int_value = value; - } - - template - static uint64_t type(const T &) { - return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; - } - - // Additional template param `Char_` is needed here because make_type always - // uses char. - template - MakeValue(const NamedArg &value) { pointer = &value; } - - template - static uint64_t type(const NamedArg &) { return Arg::NAMED_ARG; } -}; - -template -class MakeArg : public Arg { -public: - MakeArg() { - type = Arg::NONE; - } - - template - MakeArg(const T &value) - : Arg(MakeValue(value)) { - type = static_cast(MakeValue::type(value)); - } -}; - -template -struct NamedArg : Arg { - BasicStringRef name; - - template - NamedArg(BasicStringRef argname, const T &value) - : Arg(MakeArg< BasicFormatter >(value)), name(argname) {} -}; - -class RuntimeError : public std::runtime_error { - protected: - RuntimeError() : std::runtime_error("") {} -}; - -template -class PrintfArgFormatter; - -template -class ArgMap; -} // namespace internal - -/** An argument list. */ -class ArgList { - private: - // To reduce compiled code size per formatting function call, types of first - // MAX_PACKED_ARGS arguments are passed in the types_ field. - uint64_t types_; - union { - // If the number of arguments is less than MAX_PACKED_ARGS, the argument - // values are stored in values_, otherwise they are stored in args_. - // This is done to reduce compiled code size as storing larger objects - // may require more code (at least on x86-64) even if the same amount of - // data is actually copied to stack. It saves ~10% on the bloat test. - const internal::Value *values_; - const internal::Arg *args_; - }; - - internal::Arg::Type type(unsigned index) const { - unsigned shift = index * 4; - uint64_t mask = 0xf; - return static_cast( - (types_ & (mask << shift)) >> shift); - } - - template - friend class internal::ArgMap; - - public: - // Maximum number of arguments with packed types. - enum { MAX_PACKED_ARGS = 16 }; - - ArgList() : types_(0) {} - - ArgList(ULongLong types, const internal::Value *values) - : types_(types), values_(values) {} - ArgList(ULongLong types, const internal::Arg *args) - : types_(types), args_(args) {} - - /** Returns the argument at specified index. */ - internal::Arg operator[](unsigned index) const { - using internal::Arg; - Arg arg; - bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; - if (index < MAX_PACKED_ARGS) { - Arg::Type arg_type = type(index); - internal::Value &val = arg; - if (arg_type != Arg::NONE) - val = use_values ? values_[index] : args_[index]; - arg.type = arg_type; - return arg; - } - if (use_values) { - // The index is greater than the number of arguments that can be stored - // in values, so return a "none" argument. - arg.type = Arg::NONE; - return arg; - } - for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) { - if (args_[i].type == Arg::NONE) - return args_[i]; - } - return args_[index]; - } -}; - -#define FMT_DISPATCH(call) static_cast(this)->call - -/** - \rst - An argument visitor based on the `curiously recurring template pattern - `_. - - To use `~fmt::ArgVisitor` define a subclass that implements some or all of the - visit methods with the same signatures as the methods in `~fmt::ArgVisitor`, - for example, `~fmt::ArgVisitor::visit_int()`. - Pass the subclass as the *Impl* template parameter. Then calling - `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method - specific to the argument type. For example, if the argument type is - ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass - will be called. If the subclass doesn't contain a method with this signature, - then a corresponding method of `~fmt::ArgVisitor` will be called. - - **Example**:: - - class MyArgVisitor : public fmt::ArgVisitor { - public: - void visit_int(int value) { fmt::print("{}", value); } - void visit_double(double value) { fmt::print("{}", value ); } - }; - \endrst - */ -template -class ArgVisitor { - private: - typedef internal::Arg Arg; - - public: - void report_unhandled_arg() {} - - Result visit_unhandled_arg() { - FMT_DISPATCH(report_unhandled_arg()); - return Result(); - } - - /** Visits an ``int`` argument. **/ - Result visit_int(int value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``long long`` argument. **/ - Result visit_long_long(LongLong value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an ``unsigned`` argument. **/ - Result visit_uint(unsigned value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an ``unsigned long long`` argument. **/ - Result visit_ulong_long(ULongLong value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``bool`` argument. **/ - Result visit_bool(bool value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits a ``char`` or ``wchar_t`` argument. **/ - Result visit_char(int value) { - return FMT_DISPATCH(visit_any_int(value)); - } - - /** Visits an argument of any integral type. **/ - template - Result visit_any_int(T) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a ``double`` argument. **/ - Result visit_double(double value) { - return FMT_DISPATCH(visit_any_double(value)); - } - - /** Visits a ``long double`` argument. **/ - Result visit_long_double(long double value) { - return FMT_DISPATCH(visit_any_double(value)); - } - - /** Visits a ``double`` or ``long double`` argument. **/ - template - Result visit_any_double(T) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a null-terminated C string (``const char *``) argument. **/ - Result visit_cstring(const char *) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a string argument. **/ - Result visit_string(Arg::StringValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a wide string argument. **/ - Result visit_wstring(Arg::StringValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits a pointer argument. **/ - Result visit_pointer(const void *) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** Visits an argument of a custom (user-defined) type. **/ - Result visit_custom(Arg::CustomValue) { - return FMT_DISPATCH(visit_unhandled_arg()); - } - - /** - \rst - Visits an argument dispatching to the appropriate visit method based on - the argument type. For example, if the argument type is ``double`` then - the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be - called. - \endrst - */ - Result visit(const Arg &arg) { - switch (arg.type) { - default: - FMT_ASSERT(false, "invalid argument type"); - return Result(); - case Arg::INT: - return FMT_DISPATCH(visit_int(arg.int_value)); - case Arg::UINT: - return FMT_DISPATCH(visit_uint(arg.uint_value)); - case Arg::LONG_LONG: - return FMT_DISPATCH(visit_long_long(arg.long_long_value)); - case Arg::ULONG_LONG: - return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); - case Arg::BOOL: - return FMT_DISPATCH(visit_bool(arg.int_value != 0)); - case Arg::CHAR: - return FMT_DISPATCH(visit_char(arg.int_value)); - case Arg::DOUBLE: - return FMT_DISPATCH(visit_double(arg.double_value)); - case Arg::LONG_DOUBLE: - return FMT_DISPATCH(visit_long_double(arg.long_double_value)); - case Arg::CSTRING: - return FMT_DISPATCH(visit_cstring(arg.string.value)); - case Arg::STRING: - return FMT_DISPATCH(visit_string(arg.string)); - case Arg::WSTRING: - return FMT_DISPATCH(visit_wstring(arg.wstring)); - case Arg::POINTER: - return FMT_DISPATCH(visit_pointer(arg.pointer)); - case Arg::CUSTOM: - return FMT_DISPATCH(visit_custom(arg.custom)); - } - } -}; - -enum Alignment { - ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC -}; - -// Flags. -enum { - SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, - CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. -}; - -// An empty format specifier. -struct EmptySpec {}; - -// A type specifier. -template -struct TypeSpec : EmptySpec { - Alignment align() const { return ALIGN_DEFAULT; } - unsigned width() const { return 0; } - int precision() const { return -1; } - bool flag(unsigned) const { return false; } - char type() const { return TYPE; } - char fill() const { return ' '; } -}; - -// A width specifier. -struct WidthSpec { - unsigned width_; - // Fill is always wchar_t and cast to char if necessary to avoid having - // two specialization of WidthSpec and its subclasses. - wchar_t fill_; - - WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} - - unsigned width() const { return width_; } - wchar_t fill() const { return fill_; } -}; - -// An alignment specifier. -struct AlignSpec : WidthSpec { - Alignment align_; - - AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) - : WidthSpec(width, fill), align_(align) {} - - Alignment align() const { return align_; } - - int precision() const { return -1; } -}; - -// An alignment and type specifier. -template -struct AlignTypeSpec : AlignSpec { - AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} - - bool flag(unsigned) const { return false; } - char type() const { return TYPE; } -}; - -// A full format specifier. -struct FormatSpec : AlignSpec { - unsigned flags_; - int precision_; - char type_; - - FormatSpec( - unsigned width = 0, char type = 0, wchar_t fill = ' ') - : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} - - bool flag(unsigned f) const { return (flags_ & f) != 0; } - int precision() const { return precision_; } - char type() const { return type_; } -}; - -// An integer format specifier. -template , typename Char = char> -class IntFormatSpec : public SpecT { - private: - T value_; - - public: - IntFormatSpec(T val, const SpecT &spec = SpecT()) - : SpecT(spec), value_(val) {} - - T value() const { return value_; } -}; - -// A string format specifier. -template -class StrFormatSpec : public AlignSpec { - private: - const Char *str_; - - public: - template - StrFormatSpec(const Char *str, unsigned width, FillChar fill) - : AlignSpec(width, fill), str_(str) { - internal::CharTraits::convert(FillChar()); - } - - const Char *str() const { return str_; } -}; - -/** - Returns an integer format specifier to format the value in base 2. - */ -IntFormatSpec > bin(int value); - -/** - Returns an integer format specifier to format the value in base 8. - */ -IntFormatSpec > oct(int value); - -/** - Returns an integer format specifier to format the value in base 16 using - lower-case letters for the digits above 9. - */ -IntFormatSpec > hex(int value); - -/** - Returns an integer formatter format specifier to format in base 16 using - upper-case letters for the digits above 9. - */ -IntFormatSpec > hexu(int value); - -/** - \rst - Returns an integer format specifier to pad the formatted argument with the - fill character to the specified width using the default (right) numeric - alignment. - - **Example**:: - - MemoryWriter out; - out << pad(hex(0xcafe), 8, '0'); - // out.str() == "0000cafe" - - \endrst - */ -template -IntFormatSpec, Char> pad( - int value, unsigned width, Char fill = ' '); - -#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ -inline IntFormatSpec > bin(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'b'>()); \ -} \ - \ -inline IntFormatSpec > oct(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'o'>()); \ -} \ - \ -inline IntFormatSpec > hex(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'x'>()); \ -} \ - \ -inline IntFormatSpec > hexu(TYPE value) { \ - return IntFormatSpec >(value, TypeSpec<'X'>()); \ -} \ - \ -template \ -inline IntFormatSpec > pad( \ - IntFormatSpec > f, unsigned width) { \ - return IntFormatSpec >( \ - f.value(), AlignTypeSpec(width, ' ')); \ -} \ - \ -/* For compatibility with older compilers we provide two overloads for pad, */ \ -/* one that takes a fill character and one that doesn't. In the future this */ \ -/* can be replaced with one overload making the template argument Char */ \ -/* default to char (C++11). */ \ -template \ -inline IntFormatSpec, Char> pad( \ - IntFormatSpec, Char> f, \ - unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - f.value(), AlignTypeSpec(width, fill)); \ -} \ - \ -inline IntFormatSpec > pad( \ - TYPE value, unsigned width) { \ - return IntFormatSpec >( \ - value, AlignTypeSpec<0>(width, ' ')); \ -} \ - \ -template \ -inline IntFormatSpec, Char> pad( \ - TYPE value, unsigned width, Char fill) { \ - return IntFormatSpec, Char>( \ - value, AlignTypeSpec<0>(width, fill)); \ -} - -FMT_DEFINE_INT_FORMATTERS(int) -FMT_DEFINE_INT_FORMATTERS(long) -FMT_DEFINE_INT_FORMATTERS(unsigned) -FMT_DEFINE_INT_FORMATTERS(unsigned long) -FMT_DEFINE_INT_FORMATTERS(LongLong) -FMT_DEFINE_INT_FORMATTERS(ULongLong) - -/** - \rst - Returns a string formatter that pads the formatted argument with the fill - character to the specified width using the default (left) string alignment. - - **Example**:: - - std::string s = str(MemoryWriter() << pad("abc", 8)); - // s == "abc " - - \endrst - */ -template -inline StrFormatSpec pad( - const Char *str, unsigned width, Char fill = ' ') { - return StrFormatSpec(str, width, fill); -} - -inline StrFormatSpec pad( - const wchar_t *str, unsigned width, char fill = ' ') { - return StrFormatSpec(str, width, fill); -} - -namespace internal { - -template -class ArgMap { - private: - typedef std::vector< - std::pair, internal::Arg> > MapType; - typedef typename MapType::value_type Pair; - - MapType map_; - - public: - FMT_API void init(const ArgList &args); - - const internal::Arg* find(const fmt::BasicStringRef &name) const { - // The list is unsorted, so just return the first matching name. - for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); - it != end; ++it) { - if (it->first == name) - return &it->second; - } - return 0; - } -}; - -template -class ArgFormatterBase : public ArgVisitor { - private: - BasicWriter &writer_; - FormatSpec &spec_; - - FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase); - - void write_pointer(const void *p) { - spec_.flags_ = HASH_FLAG; - spec_.type_ = 'x'; - writer_.write_int(reinterpret_cast(p), spec_); - } - - protected: - BasicWriter &writer() { return writer_; } - FormatSpec &spec() { return spec_; } - - void write(bool value) { - const char *str_value = value ? "true" : "false"; - Arg::StringValue str = { str_value, std::strlen(str_value) }; - writer_.write_str(str, spec_); - } - - void write(const char *value) { - Arg::StringValue str = {value, value != 0 ? std::strlen(value) : 0}; - writer_.write_str(str, spec_); - } - - public: - ArgFormatterBase(BasicWriter &w, FormatSpec &s) - : writer_(w), spec_(s) {} - - template - void visit_any_int(T value) { writer_.write_int(value, spec_); } - - template - void visit_any_double(T value) { writer_.write_double(value, spec_); } - - void visit_bool(bool value) { - if (spec_.type_) - return visit_any_int(value); - write(value); - } - - void visit_char(int value) { - if (spec_.type_ && spec_.type_ != 'c') { - spec_.flags_ |= CHAR_FLAG; - writer_.write_int(value, spec_); - return; - } - if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) - FMT_THROW(FormatError("invalid format specifier for char")); - typedef typename BasicWriter::CharPtr CharPtr; - Char fill = internal::CharTraits::cast(spec_.fill()); - CharPtr out = CharPtr(); - const unsigned CHAR_WIDTH = 1; - if (spec_.width_ > CHAR_WIDTH) { - out = writer_.grow_buffer(spec_.width_); - if (spec_.align_ == ALIGN_RIGHT) { - std::uninitialized_fill_n(out, spec_.width_ - CHAR_WIDTH, fill); - out += spec_.width_ - CHAR_WIDTH; - } else if (spec_.align_ == ALIGN_CENTER) { - out = writer_.fill_padding(out, spec_.width_, - internal::check(CHAR_WIDTH), fill); - } else { - std::uninitialized_fill_n(out + CHAR_WIDTH, - spec_.width_ - CHAR_WIDTH, fill); - } - } else { - out = writer_.grow_buffer(CHAR_WIDTH); - } - *out = internal::CharTraits::cast(value); - } - - void visit_cstring(const char *value) { - if (spec_.type_ == 'p') - return write_pointer(value); - write(value); - } - - void visit_string(Arg::StringValue value) { - writer_.write_str(value, spec_); - } - - using ArgVisitor::visit_wstring; - - void visit_wstring(Arg::StringValue value) { - writer_.write_str(value, spec_); - } - - void visit_pointer(const void *value) { - if (spec_.type_ && spec_.type_ != 'p') - report_unknown_type(spec_.type_, "pointer"); - write_pointer(value); - } -}; - -class FormatterBase { - private: - ArgList args_; - int next_arg_index_; - - // Returns the argument with specified index. - FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); - - protected: - const ArgList &args() const { return args_; } - - explicit FormatterBase(const ArgList &args) { - args_ = args; - next_arg_index_ = 0; - } - - // Returns the next argument. - Arg next_arg(const char *&error) { - if (next_arg_index_ >= 0) - return do_get_arg(internal::to_unsigned(next_arg_index_++), error); - error = "cannot switch from manual to automatic argument indexing"; - return Arg(); - } - - // Checks if manual indexing is used and returns the argument with - // specified index. - Arg get_arg(unsigned arg_index, const char *&error) { - return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); - } - - bool check_no_auto_index(const char *&error) { - if (next_arg_index_ > 0) { - error = "cannot switch from automatic to manual argument indexing"; - return false; - } - next_arg_index_ = -1; - return true; - } - - template - void write(BasicWriter &w, const Char *start, const Char *end) { - if (start != end) - w << BasicStringRef(start, internal::to_unsigned(end - start)); - } -}; - -// A printf formatter. -template -class PrintfFormatter : private FormatterBase { - private: - void parse_flags(FormatSpec &spec, const Char *&s); - - // Returns the argument with specified index or, if arg_index is equal - // to the maximum unsigned value, the next argument. - Arg get_arg(const Char *s, - unsigned arg_index = (std::numeric_limits::max)()); - - // Parses argument index, flags and width and returns the argument index. - unsigned parse_header(const Char *&s, FormatSpec &spec); - - public: - explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} - FMT_API void format(BasicWriter &writer, - BasicCStringRef format_str); -}; -} // namespace internal - -/** - \rst - An argument formatter based on the `curiously recurring template pattern - `_. - - To use `~fmt::BasicArgFormatter` define a subclass that implements some or - all of the visit methods with the same signatures as the methods in - `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`. - Pass the subclass as the *Impl* template parameter. When a formatting - function processes an argument, it will dispatch to a visit method - specific to the argument type. For example, if the argument type is - ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass - will be called. If the subclass doesn't contain a method with this signature, - then a corresponding method of `~fmt::BasicArgFormatter` or its superclass - will be called. - \endrst - */ -template -class BasicArgFormatter : public internal::ArgFormatterBase { - private: - BasicFormatter &formatter_; - const Char *format_; - - public: - /** - \rst - Constructs an argument formatter object. - *formatter* is a reference to the main formatter object, *spec* contains - format specifier information for standard argument types, and *fmt* points - to the part of the format string being parsed for custom argument types. - \endrst - */ - BasicArgFormatter(BasicFormatter &formatter, - FormatSpec &spec, const Char *fmt) - : internal::ArgFormatterBase(formatter.writer(), spec), - formatter_(formatter), format_(fmt) {} - - /** Formats argument of a custom (user-defined) type. */ - void visit_custom(internal::Arg::CustomValue c) { - c.format(&formatter_, c.value, &format_); - } -}; - -/** The default argument formatter. */ -template -class ArgFormatter : public BasicArgFormatter, Char> { - public: - /** Constructs an argument formatter object. */ - ArgFormatter(BasicFormatter &formatter, - FormatSpec &spec, const Char *fmt) - : BasicArgFormatter, Char>(formatter, spec, fmt) {} -}; - -/** This template formats data and writes the output to a writer. */ -template -class BasicFormatter : private internal::FormatterBase { - public: - /** The character type for the output. */ - typedef CharType Char; - - private: - BasicWriter &writer_; - internal::ArgMap map_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); - - using internal::FormatterBase::get_arg; - - // Checks if manual indexing is used and returns the argument with - // specified name. - internal::Arg get_arg(BasicStringRef arg_name, const char *&error); - - // Parses argument index and returns corresponding argument. - internal::Arg parse_arg_index(const Char *&s); - - // Parses argument name and returns corresponding argument. - internal::Arg parse_arg_name(const Char *&s); - - public: - /** - \rst - Constructs a ``BasicFormatter`` object. References to the arguments and - the writer are stored in the formatter object so make sure they have - appropriate lifetimes. - \endrst - */ - BasicFormatter(const ArgList &args, BasicWriter &w) - : internal::FormatterBase(args), writer_(w) {} - - /** Returns a reference to the writer associated with this formatter. */ - BasicWriter &writer() { return writer_; } - - /** Formats stored arguments and writes the output to the writer. */ - void format(BasicCStringRef format_str); - - // Formats a single argument and advances format_str, a format string pointer. - const Char *format(const Char *&format_str, const internal::Arg &arg); -}; - -// Generates a comma-separated list with results of applying f to -// numbers 0..n-1. -# define FMT_GEN(n, f) FMT_GEN##n(f) -# define FMT_GEN1(f) f(0) -# define FMT_GEN2(f) FMT_GEN1(f), f(1) -# define FMT_GEN3(f) FMT_GEN2(f), f(2) -# define FMT_GEN4(f) FMT_GEN3(f), f(3) -# define FMT_GEN5(f) FMT_GEN4(f), f(4) -# define FMT_GEN6(f) FMT_GEN5(f), f(5) -# define FMT_GEN7(f) FMT_GEN6(f), f(6) -# define FMT_GEN8(f) FMT_GEN7(f), f(7) -# define FMT_GEN9(f) FMT_GEN8(f), f(8) -# define FMT_GEN10(f) FMT_GEN9(f), f(9) -# define FMT_GEN11(f) FMT_GEN10(f), f(10) -# define FMT_GEN12(f) FMT_GEN11(f), f(11) -# define FMT_GEN13(f) FMT_GEN12(f), f(12) -# define FMT_GEN14(f) FMT_GEN13(f), f(13) -# define FMT_GEN15(f) FMT_GEN14(f), f(14) - -namespace internal { -inline uint64_t make_type() { return 0; } - -template -inline uint64_t make_type(const T &arg) { - return MakeValue< BasicFormatter >::type(arg); -} - -template -struct ArgArray; - -template -struct ArgArray { - typedef Value Type[N > 0 ? N : 1]; - - template - static Value make(const T &value) { -#ifdef __clang__ - Value result = MakeValue(value); - // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: - // https://github.com/fmtlib/fmt/issues/276 - (void)result.custom.format; - return result; -#else - return MakeValue(value); -#endif - } -}; - -template -struct ArgArray { - typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE - - template - static Arg make(const T &value) { return MakeArg(value); } -}; - -#if FMT_USE_VARIADIC_TEMPLATES -template -inline uint64_t make_type(const Arg &first, const Args & ... tail) { - return make_type(first) | (make_type(tail...) << 4); -} - -#else - -struct ArgType { - uint64_t type; - - ArgType() : type(0) {} - - template - ArgType(const T &arg) : type(make_type(arg)) {} -}; - -# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() - -inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { - return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | - (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | - (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | - (t12.type << 48) | (t13.type << 52) | (t14.type << 56); -} -#endif -} // namespace internal - -# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n -# define FMT_MAKE_ARG_TYPE(n) T##n -# define FMT_MAKE_ARG(n) const T##n &v##n -# define FMT_ASSIGN_char(n) \ - arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) -# define FMT_ASSIGN_wchar_t(n) \ - arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) - -#if FMT_USE_VARIADIC_TEMPLATES -// Defines a variadic function returning void. -# define FMT_VARIADIC_VOID(func, arg_type) \ - template \ - void func(arg_type arg0, const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } - -// Defines a variadic constructor. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } - -#else - -# define FMT_MAKE_REF(n) \ - fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) -# define FMT_MAKE_REF2(n) v##n - -// Defines a wrapper for a function taking one argument of type arg_type -// and n additional arguments of arbitrary types. -# define FMT_WRAP1(func, arg_type, n) \ - template \ - inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic function returning void on a pre-C++11 compiler. -# define FMT_VARIADIC_VOID(func, arg_type) \ - inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ - FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ - FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ - FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ - FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ - FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) - -# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ - template \ - ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ - const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ - func(arg0, arg1, fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ - } - -// Emulates a variadic constructor on a pre-C++11 compiler. -# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ - FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) -#endif - -// Generates a comma-separated list with results of applying f to pairs -// (argument, index). -#define FMT_FOR_EACH1(f, x0) f(x0, 0) -#define FMT_FOR_EACH2(f, x0, x1) \ - FMT_FOR_EACH1(f, x0), f(x1, 1) -#define FMT_FOR_EACH3(f, x0, x1, x2) \ - FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) -#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ - FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) -#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ - FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) -#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ - FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) -#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ - FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) -#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ - FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) -#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ - FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) -#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ - FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) - -/** - An error returned by an operating system or a language runtime, - for example a file opening error. -*/ -class SystemError : public internal::RuntimeError { - private: - void init(int err_code, CStringRef format_str, ArgList args); - - protected: - int error_code_; - - typedef char Char; // For FMT_VARIADIC_CTOR. - - SystemError() {} - - public: - /** - \rst - Constructs a :class:`fmt::SystemError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is - the system message corresponding to the error code. - *error_code* is a system error code as given by ``errno``. - If *error_code* is not a valid error code such as -1, the system message - may look like "Unknown error -1" and is platform-dependent. - - **Example**:: - - // This throws a SystemError with the description - // cannot open file 'madeup': No such file or directory - // or similar (system message may vary). - const char *filename = "madeup"; - std::FILE *file = std::fopen(filename, "r"); - if (!file) - throw fmt::SystemError(errno, "cannot open file '{}'", filename); - \endrst - */ - SystemError(int error_code, CStringRef message) { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) - - int error_code() const { return error_code_; } -}; - -/** - \rst - This template provides operations for formatting and writing data into - a character stream. The output is stored in a buffer provided by a subclass - such as :class:`fmt::BasicMemoryWriter`. - - You can use one of the following typedefs for common character types: - - +---------+----------------------+ - | Type | Definition | - +=========+======================+ - | Writer | BasicWriter | - +---------+----------------------+ - | WWriter | BasicWriter | - +---------+----------------------+ - - \endrst - */ -template -class BasicWriter { - private: - // Output buffer. - Buffer &buffer_; - - FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); - - typedef typename internal::CharTraits::CharPtr CharPtr; - -#if FMT_SECURE_SCL - // Returns pointer value. - static Char *get(CharPtr p) { return p.base(); } -#else - static Char *get(Char *p) { return p; } -#endif - - // Fills the padding around the content and returns the pointer to the - // content area. - static CharPtr fill_padding(CharPtr buffer, - unsigned total_size, std::size_t content_size, wchar_t fill); - - // Grows the buffer by n characters and returns a pointer to the newly - // allocated area. - CharPtr grow_buffer(std::size_t n) { - std::size_t size = buffer_.size(); - buffer_.resize(size + n); - return internal::make_ptr(&buffer_[size], n); - } - - // Writes an unsigned decimal integer. - template - Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) { - unsigned num_digits = internal::count_digits(value); - Char *ptr = get(grow_buffer(prefix_size + num_digits)); - internal::format_decimal(ptr + prefix_size, value, num_digits); - return ptr; - } - - // Writes a decimal integer. - template - void write_decimal(Int value) { - typedef typename internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(value); - if (internal::is_negative(value)) { - abs_value = 0 - abs_value; - *write_unsigned_decimal(abs_value, 1) = '-'; - } else { - write_unsigned_decimal(abs_value, 0); - } - } - - // Prepare a buffer for integer formatting. - CharPtr prepare_int_buffer(unsigned num_digits, - const EmptySpec &, const char *prefix, unsigned prefix_size) { - unsigned size = prefix_size + num_digits; - CharPtr p = grow_buffer(size); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - - template - CharPtr prepare_int_buffer(unsigned num_digits, - const Spec &spec, const char *prefix, unsigned prefix_size); - - // Formats an integer. - template - void write_int(T value, Spec spec); - - // Formats a floating-point number (double or long double). - template - void write_double(T value, const FormatSpec &spec); - - // Writes a formatted string. - template - CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec); - - template - void write_str(const internal::Arg::StringValue &str, - const FormatSpec &spec); - - // This following methods are private to disallow writing wide characters - // and strings to a char stream. If you want to print a wide string as a - // pointer as std::ostream does, cast it to const void*. - // Do not implement! - void operator<<(typename internal::WCharHelper::Unsupported); - void operator<<( - typename internal::WCharHelper::Unsupported); - - // Appends floating-point length specifier to the format string. - // The second argument is only used for overload resolution. - void append_float_length(Char *&format_ptr, long double) { - *format_ptr++ = 'L'; - } - - template - void append_float_length(Char *&, T) {} - - template - friend class internal::ArgFormatterBase; - - friend class internal::PrintfArgFormatter; - - protected: - /** - Constructs a ``BasicWriter`` object. - */ - explicit BasicWriter(Buffer &b) : buffer_(b) {} - - public: - /** - \rst - Destroys a ``BasicWriter`` object. - \endrst - */ - virtual ~BasicWriter() {} - - /** - Returns the total number of characters written. - */ - std::size_t size() const { return buffer_.size(); } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const Char *c_str() const { - std::size_t size = buffer_.size(); - buffer_.reserve(size + 1); - buffer_[size] = '\0'; - return &buffer_[0]; - } - - /** - \rst - Returns the content of the output buffer as an `std::string`. - \endrst - */ - std::basic_string str() const { - return std::basic_string(&buffer_[0], buffer_.size()); - } - - /** - \rst - Writes formatted data. - - *args* is an argument list representing arbitrary arguments. - - **Example**:: - - MemoryWriter out; - out.write("Current point:\n"); - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - Current point: - (-3.140000, +3.140000) - - The output can be accessed using :func:`data()`, :func:`c_str` or - :func:`str` methods. - - See also :ref:`syntax`. - \endrst - */ - void write(BasicCStringRef format, ArgList args) { - BasicFormatter(args, *this).format(format); - } - FMT_VARIADIC_VOID(write, BasicCStringRef) - - BasicWriter &operator<<(int value) { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned value) { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(long value) { - write_decimal(value); - return *this; - } - BasicWriter &operator<<(unsigned long value) { - return *this << IntFormatSpec(value); - } - BasicWriter &operator<<(LongLong value) { - write_decimal(value); - return *this; - } - - /** - \rst - Formats *value* and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(ULongLong value) { - return *this << IntFormatSpec(value); - } - - BasicWriter &operator<<(double value) { - write_double(value, FormatSpec()); - return *this; - } - - /** - \rst - Formats *value* using the general format for floating-point numbers - (``'g'``) and writes it to the stream. - \endrst - */ - BasicWriter &operator<<(long double value) { - write_double(value, FormatSpec()); - return *this; - } - - /** - Writes a character to the stream. - */ - BasicWriter &operator<<(char value) { - buffer_.push_back(value); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) { - buffer_.push_back(value); - return *this; - } - - /** - \rst - Writes *value* to the stream. - \endrst - */ - BasicWriter &operator<<(fmt::BasicStringRef value) { - const Char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - BasicWriter &operator<<( - typename internal::WCharHelper::Supported value) { - const char *str = value.data(); - buffer_.append(str, str + value.size()); - return *this; - } - - template - BasicWriter &operator<<(IntFormatSpec spec) { - internal::CharTraits::convert(FillChar()); - write_int(spec.value(), spec); - return *this; - } - - template - BasicWriter &operator<<(const StrFormatSpec &spec) { - const StrChar *s = spec.str(); - write_str(s, std::char_traits::length(s), spec); - return *this; - } - - void clear() FMT_NOEXCEPT { buffer_.clear(); } - - Buffer &buffer() FMT_NOEXCEPT { return buffer_; } -}; - -template -template -typename BasicWriter::CharPtr BasicWriter::write_str( - const StrChar *s, std::size_t size, const AlignSpec &spec) { - CharPtr out = CharPtr(); - if (spec.width() > size) { - out = grow_buffer(spec.width()); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.align() == ALIGN_RIGHT) { - std::uninitialized_fill_n(out, spec.width() - size, fill); - out += spec.width() - size; - } else if (spec.align() == ALIGN_CENTER) { - out = fill_padding(out, spec.width(), size, fill); - } else { - std::uninitialized_fill_n(out + size, spec.width() - size, fill); - } - } else { - out = grow_buffer(size); - } - std::uninitialized_copy(s, s + size, out); - return out; -} - -template -template -void BasicWriter::write_str( - const internal::Arg::StringValue &s, const FormatSpec &spec) { - // Check if StrChar is convertible to Char. - internal::CharTraits::convert(StrChar()); - if (spec.type_ && spec.type_ != 's') - internal::report_unknown_type(spec.type_, "string"); - const StrChar *str_value = s.value; - std::size_t str_size = s.size; - if (str_size == 0) { - if (!str_value) { - FMT_THROW(FormatError("string pointer is null")); - return; - } - } - std::size_t precision = static_cast(spec.precision_); - if (spec.precision_ >= 0 && precision < str_size) - str_size = precision; - write_str(str_value, str_size, spec); -} - -template -typename BasicWriter::CharPtr - BasicWriter::fill_padding( - CharPtr buffer, unsigned total_size, - std::size_t content_size, wchar_t fill) { - std::size_t padding = total_size - content_size; - std::size_t left_padding = padding / 2; - Char fill_char = internal::CharTraits::cast(fill); - std::uninitialized_fill_n(buffer, left_padding, fill_char); - buffer += left_padding; - CharPtr content = buffer; - std::uninitialized_fill_n(buffer + content_size, - padding - left_padding, fill_char); - return content; -} - -template -template -typename BasicWriter::CharPtr - BasicWriter::prepare_int_buffer( - unsigned num_digits, const Spec &spec, - const char *prefix, unsigned prefix_size) { - unsigned width = spec.width(); - Alignment align = spec.align(); - Char fill = internal::CharTraits::cast(spec.fill()); - if (spec.precision() > static_cast(num_digits)) { - // Octal prefix '0' is counted as a digit, so ignore it if precision - // is specified. - if (prefix_size > 0 && prefix[prefix_size - 1] == '0') - --prefix_size; - unsigned number_size = - prefix_size + internal::to_unsigned(spec.precision()); - AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); - if (number_size >= width) - return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); - buffer_.reserve(width); - unsigned fill_size = width - number_size; - if (align != ALIGN_LEFT) { - CharPtr p = grow_buffer(fill_size); - std::uninitialized_fill(p, p + fill_size, fill); - } - CharPtr result = prepare_int_buffer( - num_digits, subspec, prefix, prefix_size); - if (align == ALIGN_LEFT) { - CharPtr p = grow_buffer(fill_size); - std::uninitialized_fill(p, p + fill_size, fill); - } - return result; - } - unsigned size = prefix_size + num_digits; - if (width <= size) { - CharPtr p = grow_buffer(size); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - return p + size - 1; - } - CharPtr p = grow_buffer(width); - CharPtr end = p + width; - if (align == ALIGN_LEFT) { - std::uninitialized_copy(prefix, prefix + prefix_size, p); - p += size; - std::uninitialized_fill(p, end, fill); - } else if (align == ALIGN_CENTER) { - p = fill_padding(p, width, size, fill); - std::uninitialized_copy(prefix, prefix + prefix_size, p); - p += size; - } else { - if (align == ALIGN_NUMERIC) { - if (prefix_size != 0) { - p = std::uninitialized_copy(prefix, prefix + prefix_size, p); - size -= prefix_size; - } - } else { - std::uninitialized_copy(prefix, prefix + prefix_size, end - size); - } - std::uninitialized_fill(p, end - size, fill); - p = end; - } - return p - 1; -} - -template -template -void BasicWriter::write_int(T value, Spec spec) { - unsigned prefix_size = 0; - typedef typename internal::IntTraits::MainType UnsignedType; - UnsignedType abs_value = static_cast(value); - char prefix[4] = ""; - if (internal::is_negative(value)) { - prefix[0] = '-'; - ++prefix_size; - abs_value = 0 - abs_value; - } else if (spec.flag(SIGN_FLAG)) { - prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; - ++prefix_size; - } - switch (spec.type()) { - case 0: case 'd': { - unsigned num_digits = internal::count_digits(abs_value); - CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1; - internal::format_decimal(get(p), abs_value, 0); - break; - } - case 'x': case 'X': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 4) != 0); - Char *p = get(prepare_int_buffer( - num_digits, spec, prefix, prefix_size)); - n = abs_value; - const char *digits = spec.type() == 'x' ? - "0123456789abcdef" : "0123456789ABCDEF"; - do { - *p-- = digits[n & 0xf]; - } while ((n >>= 4) != 0); - break; - } - case 'b': case 'B': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = spec.type(); - } - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 1) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do { - *p-- = static_cast('0' + (n & 1)); - } while ((n >>= 1) != 0); - break; - } - case 'o': { - UnsignedType n = abs_value; - if (spec.flag(HASH_FLAG)) - prefix[prefix_size++] = '0'; - unsigned num_digits = 0; - do { - ++num_digits; - } while ((n >>= 3) != 0); - Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); - n = abs_value; - do { - *p-- = static_cast('0' + (n & 7)); - } while ((n >>= 3) != 0); - break; - } - case 'n': { - unsigned num_digits = internal::count_digits(abs_value); - fmt::StringRef sep = std::localeconv()->thousands_sep; - unsigned size = static_cast( - num_digits + sep.size() * (num_digits - 1) / 3); - CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1; - internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep)); - break; - } - default: - internal::report_unknown_type( - spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); - break; - } -} - -template -template -void BasicWriter::write_double(T value, const FormatSpec &spec) { - // Check type. - char type = spec.type(); - bool upper = false; - switch (type) { - case 0: - type = 'g'; - break; - case 'e': case 'f': case 'g': case 'a': - break; - case 'F': -#ifdef _MSC_VER - // MSVC's printf doesn't support 'F'. - type = 'f'; -#endif - // Fall through. - case 'E': case 'G': case 'A': - upper = true; - break; - default: - internal::report_unknown_type(type, "double"); - break; - } - - char sign = 0; - // Use isnegative instead of value < 0 because the latter is always - // false for NaN. - if (internal::FPUtil::isnegative(static_cast(value))) { - sign = '-'; - value = -value; - } else if (spec.flag(SIGN_FLAG)) { - sign = spec.flag(PLUS_FLAG) ? '+' : ' '; - } - - if (internal::FPUtil::isnotanumber(value)) { - // Format NaN ourselves because sprintf's output is not consistent - // across platforms. - std::size_t nan_size = 4; - const char *nan = upper ? " NAN" : " nan"; - if (!sign) { - --nan_size; - ++nan; - } - CharPtr out = write_str(nan, nan_size, spec); - if (sign) - *out = sign; - return; - } - - if (internal::FPUtil::isinfinity(value)) { - // Format infinity ourselves because sprintf's output is not consistent - // across platforms. - std::size_t inf_size = 4; - const char *inf = upper ? " INF" : " inf"; - if (!sign) { - --inf_size; - ++inf; - } - CharPtr out = write_str(inf, inf_size, spec); - if (sign) - *out = sign; - return; - } - - std::size_t offset = buffer_.size(); - unsigned width = spec.width(); - if (sign) { - buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u)); - if (width > 0) - --width; - ++offset; - } - - // Build format string. - enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg - Char format[MAX_FORMAT_SIZE]; - Char *format_ptr = format; - *format_ptr++ = '%'; - unsigned width_for_sprintf = width; - if (spec.flag(HASH_FLAG)) - *format_ptr++ = '#'; - if (spec.align() == ALIGN_CENTER) { - width_for_sprintf = 0; - } else { - if (spec.align() == ALIGN_LEFT) - *format_ptr++ = '-'; - if (width != 0) - *format_ptr++ = '*'; - } - if (spec.precision() >= 0) { - *format_ptr++ = '.'; - *format_ptr++ = '*'; - } - - append_float_length(format_ptr, value); - *format_ptr++ = type; - *format_ptr = '\0'; - - // Format using snprintf. - Char fill = internal::CharTraits::cast(spec.fill()); - unsigned n = 0; - Char *start = 0; - for (;;) { - std::size_t buffer_size = buffer_.capacity() - offset; -#ifdef _MSC_VER - // MSVC's vsnprintf_s doesn't work with zero size, so reserve - // space for at least one extra character to make the size non-zero. - // Note that the buffer's capacity will increase by more than 1. - if (buffer_size == 0) { - buffer_.reserve(offset + 1); - buffer_size = buffer_.capacity() - offset; - } -#endif - start = &buffer_[offset]; - int result = internal::CharTraits::format_float( - start, buffer_size, format, width_for_sprintf, spec.precision(), value); - if (result >= 0) { - n = internal::to_unsigned(result); - if (offset + n < buffer_.capacity()) - break; // The buffer is large enough - continue with formatting. - buffer_.reserve(offset + n + 1); - } else { - // If result is negative we ask to increase the capacity by at least 1, - // but as std::vector, the buffer grows exponentially. - buffer_.reserve(buffer_.capacity() + 1); - } - } - if (sign) { - if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || - *start != ' ') { - *(start - 1) = sign; - sign = 0; - } else { - *(start - 1) = fill; - } - ++n; - } - if (spec.align() == ALIGN_CENTER && spec.width() > n) { - width = spec.width(); - CharPtr p = grow_buffer(width); - std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); - fill_padding(p, spec.width(), n, fill); - return; - } - if (spec.fill() != ' ' || sign) { - while (*start == ' ') - *start++ = fill; - if (sign) - *(start - 1) = sign; - } - grow_buffer(n); -} - -/** - \rst - This class template provides operations for formatting and writing data - into a character stream. The output is stored in a memory buffer that grows - dynamically. - - You can use one of the following typedefs for common character types - and the standard allocator: - - +---------------+-----------------------------------------------------+ - | Type | Definition | - +===============+=====================================================+ - | MemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - | WMemoryWriter | BasicMemoryWriter> | - +---------------+-----------------------------------------------------+ - - **Example**:: - - MemoryWriter out; - out << "The answer is " << 42 << "\n"; - out.write("({:+f}, {:+f})", -3.14, 3.14); - - This will write the following output to the ``out`` object: - - .. code-block:: none - - The answer is 42 - (-3.140000, +3.140000) - - The output can be converted to an ``std::string`` with ``out.str()`` or - accessed as a C string with ``out.c_str()``. - \endrst - */ -template > -class BasicMemoryWriter : public BasicWriter { - private: - internal::MemoryBuffer buffer_; - - public: - explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) - : BasicWriter(buffer_), buffer_(alloc) {} - -#if FMT_USE_RVALUE_REFERENCES - /** - \rst - Constructs a :class:`fmt::BasicMemoryWriter` object moving the content - of the other object to it. - \endrst - */ - BasicMemoryWriter(BasicMemoryWriter &&other) - : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) { - } - - /** - \rst - Moves the content of the other ``BasicMemoryWriter`` object to this one. - \endrst - */ - BasicMemoryWriter &operator=(BasicMemoryWriter &&other) { - buffer_ = std::move(other.buffer_); - return *this; - } -#endif -}; - -typedef BasicMemoryWriter MemoryWriter; -typedef BasicMemoryWriter WMemoryWriter; - -/** - \rst - This class template provides operations for formatting and writing data - into a fixed-size array. For writing into a dynamically growing buffer - use :class:`fmt::BasicMemoryWriter`. - - Any write method will throw ``std::runtime_error`` if the output doesn't fit - into the array. - - You can use one of the following typedefs for common character types: - - +--------------+---------------------------+ - | Type | Definition | - +==============+===========================+ - | ArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - | WArrayWriter | BasicArrayWriter | - +--------------+---------------------------+ - \endrst - */ -template -class BasicArrayWriter : public BasicWriter { - private: - internal::FixedBuffer buffer_; - - public: - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - given size. - \endrst - */ - BasicArrayWriter(Char *array, std::size_t size) - : BasicWriter(buffer_), buffer_(array, size) {} - - /** - \rst - Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the - size known at compile time. - \endrst - */ - template - explicit BasicArrayWriter(Char (&array)[SIZE]) - : BasicWriter(buffer_), buffer_(array, SIZE) {} -}; - -typedef BasicArrayWriter ArrayWriter; -typedef BasicArrayWriter WArrayWriter; - -// Reports a system error without throwing an exception. -// Can be used to report errors from destructors. -FMT_API void report_system_error(int error_code, - StringRef message) FMT_NOEXCEPT; - -#if FMT_USE_WINDOWS_H - -/** A Windows error. */ -class WindowsError : public SystemError { - private: - FMT_API void init(int error_code, CStringRef format_str, ArgList args); - - public: - /** - \rst - Constructs a :class:`fmt::WindowsError` object with the description - of the form - - .. parsed-literal:: - **: ** - - where ** is the formatted message and ** is the - system message corresponding to the error code. - *error_code* is a Windows error code as given by ``GetLastError``. - If *error_code* is not a valid error code such as -1, the system message - will look like "error -1". - - **Example**:: - - // This throws a WindowsError with the description - // cannot open file 'madeup': The system cannot find the file specified. - // or similar (system message may vary). - const char *filename = "madeup"; - LPOFSTRUCT of = LPOFSTRUCT(); - HFILE file = OpenFile(filename, &of, OF_READ); - if (file == HFILE_ERROR) { - throw fmt::WindowsError(GetLastError(), - "cannot open file '{}'", filename); - } - \endrst - */ - WindowsError(int error_code, CStringRef message) { - init(error_code, message, ArgList()); - } - FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) -}; - -// Reports a Windows error without throwing an exception. -// Can be used to report errors from destructors. -FMT_API void report_windows_error(int error_code, - StringRef message) FMT_NOEXCEPT; - -#endif - -enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; - -/** - Formats a string and prints it to stdout using ANSI escape sequences - to specify color (experimental). - Example: - print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); - */ -FMT_API void print_colored(Color c, CStringRef format, ArgList args); - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = format("The answer is {}", 42); - \endrst -*/ -inline std::string format(CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -inline std::wstring format(WCStringRef format_str, ArgList args) { - WMemoryWriter w; - w.write(format_str, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - print(stderr, "Don't {}!", "panic"); - \endrst - */ -FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - print("Elapsed time: {0:.2f} seconds", 1.23); - \endrst - */ -FMT_API void print(CStringRef format_str, ArgList args); - -template -void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { - internal::PrintfFormatter(args).format(w, format); -} - -/** - \rst - Formats arguments and returns the result as a string. - - **Example**:: - - std::string message = fmt::sprintf("The answer is %d", 42); - \endrst -*/ -inline std::string sprintf(CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - return w.str(); -} - -inline std::wstring sprintf(WCStringRef format, ArgList args) { - WMemoryWriter w; - printf(w, format, args); - return w.str(); -} - -/** - \rst - Prints formatted data to the file *f*. - - **Example**:: - - fmt::fprintf(stderr, "Don't %s!", "panic"); - \endrst - */ -FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); - -/** - \rst - Prints formatted data to ``stdout``. - - **Example**:: - - fmt::printf("Elapsed time: %.2f seconds", 1.23); - \endrst - */ -inline int printf(CStringRef format, ArgList args) { - return fprintf(stdout, format, args); -} - -/** - Fast integer formatter. - */ -class FormatInt { - private: - // Buffer should be large enough to hold all digits (digits10 + 1), - // a sign and a null character. - enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; - mutable char buffer_[BUFFER_SIZE]; - char *str_; - - // Formats value in reverse and returns the number of digits. - char *format_decimal(ULongLong value) { - char *buffer_end = buffer_ + BUFFER_SIZE - 1; - while (value >= 100) { - // Integer division is slow so do it for a group of two digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - unsigned index = static_cast((value % 100) * 2); - value /= 100; - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - } - if (value < 10) { - *--buffer_end = static_cast('0' + value); - return buffer_end; - } - unsigned index = static_cast(value * 2); - *--buffer_end = internal::Data::DIGITS[index + 1]; - *--buffer_end = internal::Data::DIGITS[index]; - return buffer_end; - } - - void FormatSigned(LongLong value) { - ULongLong abs_value = static_cast(value); - bool negative = value < 0; - if (negative) - abs_value = 0 - abs_value; - str_ = format_decimal(abs_value); - if (negative) - *--str_ = '-'; - } - - public: - explicit FormatInt(int value) { FormatSigned(value); } - explicit FormatInt(long value) { FormatSigned(value); } - explicit FormatInt(LongLong value) { FormatSigned(value); } - explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} - explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} - explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} - - /** Returns the number of characters written to the output buffer. */ - std::size_t size() const { - return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); - } - - /** - Returns a pointer to the output buffer content. No terminating null - character is appended. - */ - const char *data() const { return str_; } - - /** - Returns a pointer to the output buffer content with terminating null - character appended. - */ - const char *c_str() const { - buffer_[BUFFER_SIZE - 1] = '\0'; - return str_; - } - - /** - \rst - Returns the content of the output buffer as an ``std::string``. - \endrst - */ - std::string str() const { return std::string(str_, size()); } -}; - -// Formats a decimal integer value writing into buffer and returns -// a pointer to the end of the formatted string. This function doesn't -// write a terminating null character. -template -inline void format_decimal(char *&buffer, T value) { - typedef typename internal::IntTraits::MainType MainType; - MainType abs_value = static_cast(value); - if (internal::is_negative(value)) { - *buffer++ = '-'; - abs_value = 0 - abs_value; - } - if (abs_value < 100) { - if (abs_value < 10) { - *buffer++ = static_cast('0' + abs_value); - return; - } - unsigned index = static_cast(abs_value * 2); - *buffer++ = internal::Data::DIGITS[index]; - *buffer++ = internal::Data::DIGITS[index + 1]; - return; - } - unsigned num_digits = internal::count_digits(abs_value); - internal::format_decimal(buffer, abs_value, num_digits); - buffer += num_digits; -} - -/** - \rst - Returns a named argument for formatting functions. - - **Example**:: - - print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); - - \endrst - */ -template -inline internal::NamedArg arg(StringRef name, const T &arg) { - return internal::NamedArg(name, arg); -} - -template -inline internal::NamedArg arg(WStringRef name, const T &arg) { - return internal::NamedArg(name, arg); -} - -// The following two functions are deleted intentionally to disable -// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. -template -void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -template -void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; -} - -#if FMT_GCC_VERSION -// Use the system_header pragma to suppress warnings about variadic macros -// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't -// work. It is used at the end because we want to suppress as little warnings -// as possible. -# pragma GCC system_header -#endif - -// This is used to work around VC++ bugs in handling variadic macros. -#define FMT_EXPAND(args) args - -// Returns the number of arguments. -// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. -#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) -#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) -#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N -#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - -#define FMT_CONCAT(a, b) a##b -#define FMT_FOR_EACH_(N, f, ...) \ - FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) -#define FMT_FOR_EACH(f, ...) \ - FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) - -#define FMT_ADD_ARG_NAME(type, index) type arg##index -#define FMT_GET_ARG_NAME(type, index) arg##index - -#if FMT_USE_VARIADIC_TEMPLATES -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - template \ - ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - const Args & ... args) { \ - typedef fmt::internal::ArgArray ArgArray; \ - typename ArgArray::Type array{ \ - ArgArray::template make >(args)...}; \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ - fmt::ArgList(fmt::internal::make_type(args...), array)); \ - } -#else -// Defines a wrapper for a function taking __VA_ARGS__ arguments -// and n additional arguments of arbitrary types. -# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ - template \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ - FMT_GEN(n, FMT_MAKE_ARG)) { \ - fmt::internal::ArgArray::Type arr; \ - FMT_GEN(n, FMT_ASSIGN_##Char); \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ - fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ - } - -# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ - inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ - call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ - } \ - FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ - FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) -#endif // FMT_USE_VARIADIC_TEMPLATES - -/** - \rst - Defines a variadic function with the specified return type, function name - and argument types passed as variable arguments to this macro. - - **Example**:: - - void print_error(const char *file, int line, const char *format, - fmt::ArgList args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args); - } - FMT_VARIADIC(void, print_error, const char *, int, const char *) - - ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that - don't implement variadic templates. You don't have to use this macro if - you don't need legacy compiler support and can use variadic templates - directly:: - - template - void print_error(const char *file, int line, const char *format, - const Args & ... args) { - fmt::print("{}: {}: ", file, line); - fmt::print(format, args...); - } - \endrst - */ -#define FMT_VARIADIC(ReturnType, func, ...) \ - FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_VARIADIC_W(ReturnType, func, ...) \ - FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) - -#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) - -#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) - -/** - \rst - Convenient macro to capture the arguments' names and values into several - ``fmt::arg(name, value)``. - - **Example**:: - - int x = 1, y = 2; - print("point: ({x}, {y})", FMT_CAPTURE(x, y)); - // same as: - // print("point: ({x}, {y})", arg("x", x), arg("y", y)); - - \endrst - */ -#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) - -#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) - -namespace fmt { -FMT_VARIADIC(std::string, format, CStringRef) -FMT_VARIADIC_W(std::wstring, format, WCStringRef) -FMT_VARIADIC(void, print, CStringRef) -FMT_VARIADIC(void, print, std::FILE *, CStringRef) - -FMT_VARIADIC(void, print_colored, Color, CStringRef) -FMT_VARIADIC(std::string, sprintf, CStringRef) -FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) -FMT_VARIADIC(int, printf, CStringRef) -FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) - -namespace internal { -template -inline bool is_name_start(Char c) { - return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; -} - -// Parses an unsigned integer advancing s to the end of the parsed input. -// This function assumes that the first character of s is a digit. -template -unsigned parse_nonnegative_int(const Char *&s) { - assert('0' <= *s && *s <= '9'); - unsigned value = 0; - do { - unsigned new_value = value * 10 + (*s++ - '0'); - // Check if value wrapped around. - if (new_value < value) { - value = (std::numeric_limits::max)(); - break; - } - value = new_value; - } while ('0' <= *s && *s <= '9'); - // Convert to unsigned to prevent a warning. - unsigned max_int = (std::numeric_limits::max)(); - if (value > max_int) - FMT_THROW(FormatError("number is too big")); - return value; -} - -inline void require_numeric_argument(const Arg &arg, char spec) { - if (arg.type > Arg::LAST_NUMERIC_TYPE) { - std::string message = - fmt::format("format specifier '{}' requires numeric argument", spec); - FMT_THROW(fmt::FormatError(message)); - } -} - -template -void check_sign(const Char *&s, const Arg &arg) { - char sign = static_cast(*s); - require_numeric_argument(arg, sign); - if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) { - FMT_THROW(FormatError(fmt::format( - "format specifier '{}' requires signed argument", sign))); - } - ++s; -} -} // namespace internal - -template -inline internal::Arg BasicFormatter::get_arg( - BasicStringRef arg_name, const char *&error) { - if (check_no_auto_index(error)) { - map_.init(args()); - const internal::Arg *arg = map_.find(arg_name); - if (arg) - return *arg; - error = "argument not found"; - } - return internal::Arg(); -} - -template -inline internal::Arg BasicFormatter::parse_arg_index(const Char *&s) { - const char *error = 0; - internal::Arg arg = *s < '0' || *s > '9' ? - next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error); - if (error) { - FMT_THROW(FormatError( - *s != '}' && *s != ':' ? "invalid format string" : error)); - } - return arg; -} - -template -inline internal::Arg BasicFormatter::parse_arg_name(const Char *&s) { - assert(internal::is_name_start(*s)); - const Char *start = s; - Char c; - do { - c = *++s; - } while (internal::is_name_start(c) || ('0' <= c && c <= '9')); - const char *error = 0; - internal::Arg arg = get_arg(BasicStringRef(start, s - start), error); - if (error) - FMT_THROW(FormatError(error)); - return arg; -} - -template -const Char *BasicFormatter::format( - const Char *&format_str, const internal::Arg &arg) { - using internal::Arg; - const Char *s = format_str; - FormatSpec spec; - if (*s == ':') { - if (arg.type == Arg::CUSTOM) { - arg.custom.format(this, arg.custom.value, &s); - return s; - } - ++s; - // Parse fill and alignment. - if (Char c = *s) { - const Char *p = s + 1; - spec.align_ = ALIGN_DEFAULT; - do { - switch (*p) { - case '<': - spec.align_ = ALIGN_LEFT; - break; - case '>': - spec.align_ = ALIGN_RIGHT; - break; - case '=': - spec.align_ = ALIGN_NUMERIC; - break; - case '^': - spec.align_ = ALIGN_CENTER; - break; - } - if (spec.align_ != ALIGN_DEFAULT) { - if (p != s) { - if (c == '}') break; - if (c == '{') - FMT_THROW(FormatError("invalid fill character '{'")); - s += 2; - spec.fill_ = c; - } else ++s; - if (spec.align_ == ALIGN_NUMERIC) - require_numeric_argument(arg, '='); - break; - } - } while (--p >= s); - } - - // Parse sign. - switch (*s) { - case '+': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG | PLUS_FLAG; - break; - case '-': - check_sign(s, arg); - spec.flags_ |= MINUS_FLAG; - break; - case ' ': - check_sign(s, arg); - spec.flags_ |= SIGN_FLAG; - break; - } - - if (*s == '#') { - require_numeric_argument(arg, '#'); - spec.flags_ |= HASH_FLAG; - ++s; - } - - // Parse zero flag. - if (*s == '0') { - require_numeric_argument(arg, '0'); - spec.align_ = ALIGN_NUMERIC; - spec.fill_ = '0'; - ++s; - } - - // Parse width. - if ('0' <= *s && *s <= '9') { - spec.width_ = internal::parse_nonnegative_int(s); - } else if (*s == '{') { - ++s; - Arg width_arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (width_arg.type) { - case Arg::INT: - if (width_arg.int_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.int_value; - break; - case Arg::UINT: - value = width_arg.uint_value; - break; - case Arg::LONG_LONG: - if (width_arg.long_long_value < 0) - FMT_THROW(FormatError("negative width")); - value = width_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = width_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("width is not integer")); - } - if (value > (std::numeric_limits::max)()) - FMT_THROW(FormatError("number is too big")); - spec.width_ = static_cast(value); - } - - // Parse precision. - if (*s == '.') { - ++s; - spec.precision_ = 0; - if ('0' <= *s && *s <= '9') { - spec.precision_ = internal::parse_nonnegative_int(s); - } else if (*s == '{') { - ++s; - Arg precision_arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - if (*s++ != '}') - FMT_THROW(FormatError("invalid format string")); - ULongLong value = 0; - switch (precision_arg.type) { - case Arg::INT: - if (precision_arg.int_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.int_value; - break; - case Arg::UINT: - value = precision_arg.uint_value; - break; - case Arg::LONG_LONG: - if (precision_arg.long_long_value < 0) - FMT_THROW(FormatError("negative precision")); - value = precision_arg.long_long_value; - break; - case Arg::ULONG_LONG: - value = precision_arg.ulong_long_value; - break; - default: - FMT_THROW(FormatError("precision is not integer")); - } - if (value > (std::numeric_limits::max)()) - FMT_THROW(FormatError("number is too big")); - spec.precision_ = static_cast(value); - } else { - FMT_THROW(FormatError("missing precision specifier")); - } - if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) { - FMT_THROW(FormatError( - fmt::format("precision not allowed in {} format specifier", - arg.type == Arg::POINTER ? "pointer" : "integer"))); - } - } - - // Parse type. - if (*s != '}' && *s) - spec.type_ = static_cast(*s++); - } - - if (*s++ != '}') - FMT_THROW(FormatError("missing '}' in format string")); - - // Format argument. - ArgFormatter(*this, spec, s - 1).visit(arg); - return s; -} - -template -void BasicFormatter::format(BasicCStringRef format_str) { - const Char *s = format_str.c_str(); - const Char *start = s; - while (*s) { - Char c = *s++; - if (c != '{' && c != '}') continue; - if (*s == c) { - write(writer_, start, s); - start = ++s; - continue; - } - if (c == '}') - FMT_THROW(FormatError("unmatched '}' in format string")); - write(writer_, start, s - 1); - internal::Arg arg = internal::is_name_start(*s) ? - parse_arg_name(s) : parse_arg_index(s); - start = s = format(s, arg); - } - write(writer_, start, s); -} -} // namespace fmt - -#if FMT_USE_USER_DEFINED_LITERALS -namespace fmt { -namespace internal { - -template -struct UdlFormat { - const Char *str; - - template - auto operator()(Args && ... args) const - -> decltype(format(str, std::forward(args)...)) { - return format(str, std::forward(args)...); - } -}; - -template -struct UdlArg { - const Char *str; - - template - NamedArg operator=(T &&value) const { - return {str, std::forward(value)}; - } -}; - -} // namespace internal - -inline namespace literals { - -/** - \rst - C++11 literal equivalent of :func:`fmt::format`. - - **Example**:: - - using namespace fmt::literals; - std::string message = "The answer is {}"_format(42); - \endrst - */ -inline internal::UdlFormat -operator"" _format(const char *s, std::size_t) { return {s}; } -inline internal::UdlFormat -operator"" _format(const wchar_t *s, std::size_t) { return {s}; } - -/** - \rst - C++11 literal equivalent of :func:`fmt::arg`. - - **Example**:: - - using namespace fmt::literals; - print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); - \endrst - */ -inline internal::UdlArg -operator"" _a(const char *s, std::size_t) { return {s}; } -inline internal::UdlArg -operator"" _a(const wchar_t *s, std::size_t) { return {s}; } - -} // inline namespace literals -} // namespace fmt -#endif // FMT_USE_USER_DEFINED_LITERALS - -// Restore warnings. -#if FMT_GCC_VERSION >= 406 -# pragma GCC diagnostic pop -#endif - -#if defined(__clang__) && !defined(FMT_ICC_VERSION) -# pragma clang diagnostic pop -#endif - -#ifdef FMT_HEADER_ONLY -# define FMT_FUNC inline -# include "format.cc" -#else -# define FMT_FUNC -#endif - -#endif // FMT_FORMAT_H_ diff --git a/vendor/fmt-3.0.0/fmt/ostream.cc b/vendor/fmt-3.0.0/fmt/ostream.cc deleted file mode 100644 index 0ba30347..00000000 --- a/vendor/fmt-3.0.0/fmt/ostream.cc +++ /dev/null @@ -1,61 +0,0 @@ -/* - Formatting library for C++ - std::ostream support - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "ostream.h" - -namespace fmt { - -namespace { -// Write the content of w to os. -void write(std::ostream &os, Writer &w) { - const char *data = w.data(); - typedef internal::MakeUnsigned::Type UnsignedStreamSize; - UnsignedStreamSize size = w.size(); - UnsignedStreamSize max_size = - internal::to_unsigned((std::numeric_limits::max)()); - do { - UnsignedStreamSize n = size <= max_size ? size : max_size; - os.write(data, static_cast(n)); - data += n; - size -= n; - } while (size != 0); -} -} - -FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { - MemoryWriter w; - w.write(format_str, args); - write(os, w); -} - -FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args) { - MemoryWriter w; - printf(w, format, args); - write(os, w); - return static_cast(w.size()); -} -} // namespace fmt diff --git a/vendor/fmt-3.0.0/fmt/ostream.h b/vendor/fmt-3.0.0/fmt/ostream.h deleted file mode 100644 index 458d31de..00000000 --- a/vendor/fmt-3.0.0/fmt/ostream.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - Formatting library for C++ - std::ostream support - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_OSTREAM_H_ -#define FMT_OSTREAM_H_ - -#include "format.h" -#include - -namespace fmt { - -namespace internal { - -template -class FormatBuf : public std::basic_streambuf { - private: - typedef typename std::basic_streambuf::int_type int_type; - typedef typename std::basic_streambuf::traits_type traits_type; - - Buffer &buffer_; - Char *start_; - - public: - FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { - this->setp(start_, start_ + buffer_.capacity()); - } - - int_type overflow(int_type ch = traits_type::eof()) { - if (!traits_type::eq_int_type(ch, traits_type::eof())) { - size_t buf_size = size(); - buffer_.resize(buf_size); - buffer_.reserve(buf_size * 2); - - start_ = &buffer_[0]; - start_[buf_size] = traits_type::to_char_type(ch); - this->setp(start_+ buf_size + 1, start_ + buf_size * 2); - } - return ch; - } - - size_t size() const { - return to_unsigned(this->pptr() - start_); - } -}; - -Yes &convert(std::ostream &); - -struct DummyStream : std::ostream { - DummyStream(); // Suppress a bogus warning in MSVC. - // Hide all operator<< overloads from std::ostream. - void operator<<(Null<>); -}; - -No &operator<<(std::ostream &, int); - -template -struct ConvertToIntImpl { - // Convert to int only if T doesn't have an overloaded operator<<. - enum { - value = sizeof(convert(get() << get())) == sizeof(No) - }; -}; -} // namespace internal - -// Formats a value. -template -void format(BasicFormatter &f, - const Char *&format_str, const T &value) { - internal::MemoryBuffer buffer; - - internal::FormatBuf format_buf(buffer); - std::basic_ostream output(&format_buf); - output << value; - - BasicStringRef str(&buffer[0], format_buf.size()); - typedef internal::MakeArg< BasicFormatter > MakeArg; - format_str = f.format(format_str, MakeArg(str)); -} - -/** - \rst - Prints formatted data to the stream *os*. - - **Example**:: - - print(cerr, "Don't {}!", "panic"); - \endrst - */ -FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); -FMT_VARIADIC(void, print, std::ostream &, CStringRef) - -/** - \rst - Prints formatted data to the stream *os*. - - **Example**:: - - fprintf(cerr, "Don't %s!", "panic"); - \endrst - */ -FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); -FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) -} // namespace fmt - -#ifdef FMT_HEADER_ONLY -# include "ostream.cc" -#endif - -#endif // FMT_OSTREAM_H_ diff --git a/vendor/fmt-3.0.0/fmt/posix.cc b/vendor/fmt-3.0.0/fmt/posix.cc deleted file mode 100644 index 1ec746a4..00000000 --- a/vendor/fmt-3.0.0/fmt/posix.cc +++ /dev/null @@ -1,256 +0,0 @@ -/* - A C++ interface to POSIX functions. - - Copyright (c) 2014 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -// Disable bogus MSVC warnings. -#ifndef _CRT_SECURE_NO_WARNINGS -# define _CRT_SECURE_NO_WARNINGS -#endif - -#include "posix.h" - -#include -#include -#include - -#ifndef _WIN32 -# include -#else -# include -# include - -# define O_CREAT _O_CREAT -# define O_TRUNC _O_TRUNC - -# ifndef S_IRUSR -# define S_IRUSR _S_IREAD -# endif - -# ifndef S_IWUSR -# define S_IWUSR _S_IWRITE -# endif - -# ifdef __MINGW32__ -# define _SH_DENYNO 0x40 -# endif - -#endif // _WIN32 - -#ifdef fileno -# undef fileno -#endif - -namespace { -#ifdef _WIN32 -// Return type of read and write functions. -typedef int RWResult; - -// On Windows the count argument to read and write is unsigned, so convert -// it from size_t preventing integer overflow. -inline unsigned convert_rwcount(std::size_t count) { - return count <= UINT_MAX ? static_cast(count) : UINT_MAX; -} -#else -// Return type of read and write functions. -typedef ssize_t RWResult; - -inline std::size_t convert_rwcount(std::size_t count) { return count; } -#endif -} - -fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT { - if (file_ && FMT_SYSTEM(fclose(file_)) != 0) - fmt::report_system_error(errno, "cannot close file"); -} - -fmt::BufferedFile::BufferedFile( - fmt::CStringRef filename, fmt::CStringRef mode) { - FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0); - if (!file_) - throw SystemError(errno, "cannot open file {}", filename); -} - -void fmt::BufferedFile::close() { - if (!file_) - return; - int result = FMT_SYSTEM(fclose(file_)); - file_ = 0; - if (result != 0) - throw SystemError(errno, "cannot close file"); -} - -// A macro used to prevent expansion of fileno on broken versions of MinGW. -#define FMT_ARGS - -int fmt::BufferedFile::fileno() const { - int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_)); - if (fd == -1) - throw SystemError(errno, "cannot get file descriptor"); - return fd; -} - -fmt::File::File(fmt::CStringRef path, int oflag) { - int mode = S_IRUSR | S_IWUSR; -#if defined(_WIN32) && !defined(__MINGW32__) - fd_ = -1; - FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode)); -#else - FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode))); -#endif - if (fd_ == -1) - throw SystemError(errno, "cannot open file {}", path); -} - -fmt::File::~File() FMT_NOEXCEPT { - // Don't retry close in case of EINTR! - // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html - if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0) - fmt::report_system_error(errno, "cannot close file"); -} - -void fmt::File::close() { - if (fd_ == -1) - return; - // Don't retry close in case of EINTR! - // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html - int result = FMT_POSIX_CALL(close(fd_)); - fd_ = -1; - if (result != 0) - throw SystemError(errno, "cannot close file"); -} - -fmt::LongLong fmt::File::size() const { -#ifdef _WIN32 - // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT - // is less than 0x0500 as is the case with some default MinGW builds. - // Both functions support large file sizes. - DWORD size_upper = 0; - HANDLE handle = reinterpret_cast(_get_osfhandle(fd_)); - DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper)); - if (size_lower == INVALID_FILE_SIZE) { - DWORD error = GetLastError(); - if (error != NO_ERROR) - throw WindowsError(GetLastError(), "cannot get file size"); - } - fmt::ULongLong long_size = size_upper; - return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower; -#else - typedef struct stat Stat; - Stat file_stat = Stat(); - if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1) - throw SystemError(errno, "cannot get file attributes"); - FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size), - "return type of File::size is not large enough"); - return file_stat.st_size; -#endif -} - -std::size_t fmt::File::read(void *buffer, std::size_t count) { - RWResult result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); - if (result < 0) - throw SystemError(errno, "cannot read from file"); - return internal::to_unsigned(result); -} - -std::size_t fmt::File::write(const void *buffer, std::size_t count) { - RWResult result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); - if (result < 0) - throw SystemError(errno, "cannot write to file"); - return internal::to_unsigned(result); -} - -fmt::File fmt::File::dup(int fd) { - // Don't retry as dup doesn't return EINTR. - // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html - int new_fd = FMT_POSIX_CALL(dup(fd)); - if (new_fd == -1) - throw SystemError(errno, "cannot duplicate file descriptor {}", fd); - return File(new_fd); -} - -void fmt::File::dup2(int fd) { - int result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); - if (result == -1) { - throw SystemError(errno, - "cannot duplicate file descriptor {} to {}", fd_, fd); - } -} - -void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT { - int result = 0; - FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); - if (result == -1) - ec = ErrorCode(errno); -} - -void fmt::File::pipe(File &read_end, File &write_end) { - // Close the descriptors first to make sure that assignments don't throw - // and there are no leaks. - read_end.close(); - write_end.close(); - int fds[2] = {}; -#ifdef _WIN32 - // Make the default pipe capacity same as on Linux 2.6.11+. - enum { DEFAULT_CAPACITY = 65536 }; - int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY)); -#else - // Don't retry as the pipe function doesn't return EINTR. - // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html - int result = FMT_POSIX_CALL(pipe(fds)); -#endif - if (result != 0) - throw SystemError(errno, "cannot create pipe"); - // The following assignments don't throw because read_fd and write_fd - // are closed. - read_end = File(fds[0]); - write_end = File(fds[1]); -} - -fmt::BufferedFile fmt::File::fdopen(const char *mode) { - // Don't retry as fdopen doesn't return EINTR. - FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode)); - if (!f) - throw SystemError(errno, "cannot associate stream with file descriptor"); - BufferedFile file(f); - fd_ = -1; - return file; -} - -long fmt::getpagesize() { -#ifdef _WIN32 - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwPageSize; -#else - long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE)); - if (size < 0) - throw SystemError(errno, "cannot get memory page size"); - return size; -#endif -} diff --git a/vendor/fmt-3.0.0/fmt/posix.h b/vendor/fmt-3.0.0/fmt/posix.h deleted file mode 100644 index ab6d12e8..00000000 --- a/vendor/fmt-3.0.0/fmt/posix.h +++ /dev/null @@ -1,403 +0,0 @@ -/* - A C++ interface to POSIX functions. - - Copyright (c) 2014 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_POSIX_H_ -#define FMT_POSIX_H_ - -#ifdef __MINGW32__ -// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/. -# undef __STRICT_ANSI__ -#endif - -#include -#include // for O_RDONLY -#include // for locale_t -#include -#include // for strtod_l - -#include - -#ifdef __APPLE__ -# include // for LC_NUMERIC_MASK on OS X -#endif - -#include "format.h" - -#ifndef FMT_POSIX -# if defined(_WIN32) && !defined(__MINGW32__) -// Fix warnings about deprecated symbols. -# define FMT_POSIX(call) _##call -# else -# define FMT_POSIX(call) call -# endif -#endif - -// Calls to system functions are wrapped in FMT_SYSTEM for testability. -#ifdef FMT_SYSTEM -# define FMT_POSIX_CALL(call) FMT_SYSTEM(call) -#else -# define FMT_SYSTEM(call) call -# ifdef _WIN32 -// Fix warnings about deprecated symbols. -# define FMT_POSIX_CALL(call) ::_##call -# else -# define FMT_POSIX_CALL(call) ::call -# endif -#endif - -#if FMT_GCC_VERSION >= 407 -# define FMT_UNUSED __attribute__((unused)) -#else -# define FMT_UNUSED -#endif - -#ifndef FMT_USE_STATIC_ASSERT -# define FMT_USE_STATIC_ASSERT 0 -#endif - -#if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \ - (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600 -# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message) -#else -# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b) -# define FMT_STATIC_ASSERT(cond, message) \ - typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED -#endif - -// Retries the expression while it evaluates to error_result and errno -// equals to EINTR. -#ifndef _WIN32 -# define FMT_RETRY_VAL(result, expression, error_result) \ - do { \ - result = (expression); \ - } while (result == error_result && errno == EINTR) -#else -# define FMT_RETRY_VAL(result, expression, error_result) result = (expression) -#endif - -#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1) - -namespace fmt { - -// An error code. -class ErrorCode { - private: - int value_; - - public: - explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {} - - int get() const FMT_NOEXCEPT { return value_; } -}; - -// A buffered file. -class BufferedFile { - private: - FILE *file_; - - friend class File; - - explicit BufferedFile(FILE *f) : file_(f) {} - - public: - // Constructs a BufferedFile object which doesn't represent any file. - BufferedFile() FMT_NOEXCEPT : file_(0) {} - - // Destroys the object closing the file it represents if any. - ~BufferedFile() FMT_NOEXCEPT; - -#if !FMT_USE_RVALUE_REFERENCES - // Emulate a move constructor and a move assignment operator if rvalue - // references are not supported. - - private: - // A proxy object to emulate a move constructor. - // It is private to make it impossible call operator Proxy directly. - struct Proxy { - FILE *file; - }; - -public: - // A "move constructor" for moving from a temporary. - BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {} - - // A "move constructor" for moving from an lvalue. - BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) { - f.file_ = 0; - } - - // A "move assignment operator" for moving from a temporary. - BufferedFile &operator=(Proxy p) { - close(); - file_ = p.file; - return *this; - } - - // A "move assignment operator" for moving from an lvalue. - BufferedFile &operator=(BufferedFile &other) { - close(); - file_ = other.file_; - other.file_ = 0; - return *this; - } - - // Returns a proxy object for moving from a temporary: - // BufferedFile file = BufferedFile(...); - operator Proxy() FMT_NOEXCEPT { - Proxy p = {file_}; - file_ = 0; - return p; - } - -#else - private: - FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile); - - public: - BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) { - other.file_ = 0; - } - - BufferedFile& operator=(BufferedFile &&other) { - close(); - file_ = other.file_; - other.file_ = 0; - return *this; - } -#endif - - // Opens a file. - BufferedFile(CStringRef filename, CStringRef mode); - - // Closes the file. - void close(); - - // Returns the pointer to a FILE object representing this file. - FILE *get() const FMT_NOEXCEPT { return file_; } - - // We place parentheses around fileno to workaround a bug in some versions - // of MinGW that define fileno as a macro. - int (fileno)() const; - - void print(CStringRef format_str, const ArgList &args) { - fmt::print(file_, format_str, args); - } - FMT_VARIADIC(void, print, CStringRef) -}; - -// A file. Closed file is represented by a File object with descriptor -1. -// Methods that are not declared with FMT_NOEXCEPT may throw -// fmt::SystemError in case of failure. Note that some errors such as -// closing the file multiple times will cause a crash on Windows rather -// than an exception. You can get standard behavior by overriding the -// invalid parameter handler with _set_invalid_parameter_handler. -class File { - private: - int fd_; // File descriptor. - - // Constructs a File object with a given descriptor. - explicit File(int fd) : fd_(fd) {} - - public: - // Possible values for the oflag argument to the constructor. - enum { - RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only. - WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only. - RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing. - }; - - // Constructs a File object which doesn't represent any file. - File() FMT_NOEXCEPT : fd_(-1) {} - - // Opens a file and constructs a File object representing this file. - File(CStringRef path, int oflag); - -#if !FMT_USE_RVALUE_REFERENCES - // Emulate a move constructor and a move assignment operator if rvalue - // references are not supported. - - private: - // A proxy object to emulate a move constructor. - // It is private to make it impossible call operator Proxy directly. - struct Proxy { - int fd; - }; - - public: - // A "move constructor" for moving from a temporary. - File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {} - - // A "move constructor" for moving from an lvalue. - File(File &other) FMT_NOEXCEPT : fd_(other.fd_) { - other.fd_ = -1; - } - - // A "move assignment operator" for moving from a temporary. - File &operator=(Proxy p) { - close(); - fd_ = p.fd; - return *this; - } - - // A "move assignment operator" for moving from an lvalue. - File &operator=(File &other) { - close(); - fd_ = other.fd_; - other.fd_ = -1; - return *this; - } - - // Returns a proxy object for moving from a temporary: - // File file = File(...); - operator Proxy() FMT_NOEXCEPT { - Proxy p = {fd_}; - fd_ = -1; - return p; - } - -#else - private: - FMT_DISALLOW_COPY_AND_ASSIGN(File); - - public: - File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) { - other.fd_ = -1; - } - - File& operator=(File &&other) { - close(); - fd_ = other.fd_; - other.fd_ = -1; - return *this; - } -#endif - - // Destroys the object closing the file it represents if any. - ~File() FMT_NOEXCEPT; - - // Returns the file descriptor. - int descriptor() const FMT_NOEXCEPT { return fd_; } - - // Closes the file. - void close(); - - // Returns the file size. The size has signed type for consistency with - // stat::st_size. - LongLong size() const; - - // Attempts to read count bytes from the file into the specified buffer. - std::size_t read(void *buffer, std::size_t count); - - // Attempts to write count bytes from the specified buffer to the file. - std::size_t write(const void *buffer, std::size_t count); - - // Duplicates a file descriptor with the dup function and returns - // the duplicate as a file object. - static File dup(int fd); - - // Makes fd be the copy of this file descriptor, closing fd first if - // necessary. - void dup2(int fd); - - // Makes fd be the copy of this file descriptor, closing fd first if - // necessary. - void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; - - // Creates a pipe setting up read_end and write_end file objects for reading - // and writing respectively. - static void pipe(File &read_end, File &write_end); - - // Creates a BufferedFile object associated with this file and detaches - // this File object from the file. - BufferedFile fdopen(const char *mode); -}; - -// Returns the memory page size. -long getpagesize(); - -#if defined(LC_NUMERIC_MASK) || defined(_MSC_VER) -# define FMT_LOCALE -#endif - -#ifdef FMT_LOCALE -// A "C" numeric locale. -class Locale { - private: -# ifdef _MSC_VER - typedef _locale_t locale_t; - - enum { LC_NUMERIC_MASK = LC_NUMERIC }; - - static locale_t newlocale(int category_mask, const char *locale, locale_t) { - return _create_locale(category_mask, locale); - } - - static void freelocale(locale_t locale) { - _free_locale(locale); - } - - static double strtod_l(const char *nptr, char **endptr, _locale_t locale) { - return _strtod_l(nptr, endptr, locale); - } -# endif - - locale_t locale_; - - FMT_DISALLOW_COPY_AND_ASSIGN(Locale); - - public: - typedef locale_t Type; - - Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) { - if (!locale_) - throw fmt::SystemError(errno, "cannot create locale"); - } - ~Locale() { freelocale(locale_); } - - Type get() const { return locale_; } - - // Converts string to floating-point number and advances str past the end - // of the parsed input. - double strtod(const char *&str) const { - char *end = 0; - double result = strtod_l(str, &end, locale_); - str = end; - return result; - } -}; -#endif // FMT_LOCALE -} // namespace fmt - -#if !FMT_USE_RVALUE_REFERENCES -namespace std { -// For compatibility with C++98. -inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; } -inline fmt::File &move(fmt::File &f) { return f; } -} -#endif - -#endif // FMT_POSIX_H_ diff --git a/vendor/fmt-3.0.0/fmt/time.h b/vendor/fmt-3.0.0/fmt/time.h deleted file mode 100644 index 863382c0..00000000 --- a/vendor/fmt-3.0.0/fmt/time.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - Formatting library for C++ - time formatting - - Copyright (c) 2012 - 2016, Victor Zverovich - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FMT_TIME_H_ -#define FMT_TIME_H_ - -#include "fmt/format.h" -#include - -namespace fmt { -template -void format(BasicFormatter &f, - const char *&format_str, const std::tm &tm) { - if (*format_str == ':') - ++format_str; - const char *end = format_str; - while (*end && *end != '}') - ++end; - if (*end != '}') - FMT_THROW(FormatError("missing '}' in format string")); - internal::MemoryBuffer format; - format.append(format_str, end + 1); - format[format.size() - 1] = '\0'; - Buffer &buffer = f.writer().buffer(); - std::size_t start = buffer.size(); - for (;;) { - std::size_t size = buffer.capacity() - start; - std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm); - if (count != 0) { - buffer.resize(start + count); - break; - } - const std::size_t MIN_GROWTH = 10; - buffer.reserve(buffer.capacity() + size > MIN_GROWTH ? size : MIN_GROWTH); - } - format_str = end + 1; -} -} - -#endif // FMT_TIME_H_ diff --git a/vendor/fmt-3.0.1/fmt/CMakeLists.txt b/vendor/fmt-3.0.1/fmt/CMakeLists.txt new file mode 100644 index 00000000..89ef1f35 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/CMakeLists.txt @@ -0,0 +1,93 @@ +# Define the fmt library, its includes and the needed defines. +# format.cc is added to FMT_HEADERS for the header-only configuration. +set(FMT_HEADERS format.h format.cc ostream.h ostream.cc time.h) +if (HAVE_OPEN) + set(FMT_HEADERS ${FMT_HEADERS} posix.h) + set(FMT_SOURCES ${FMT_SOURCES} posix.cc) +endif () + +add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} ../ChangeLog.rst) + +option(FMT_CPPFORMAT "Build cppformat library for backward compatibility." OFF) +if (FMT_CPPFORMAT) + message(WARNING "The cppformat library is deprecated, use fmt instead.") + add_library(cppformat ${FMT_SOURCES} ${FMT_HEADERS}) +endif () + +# Starting with cmake 3.1 the CXX_STANDARD property can be used instead. +target_compile_options(fmt PUBLIC ${CPP11_FLAG}) +if (FMT_PEDANTIC) + target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS}) +endif () + +target_include_directories(fmt PUBLIC + $ + $) + +set_target_properties(fmt PROPERTIES + VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}) + +if (BUILD_SHARED_LIBS) + if (UNIX AND NOT APPLE) + # Fix rpmlint warning: + # unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6. + target_link_libraries(fmt -Wl,--as-needed) + endif () + target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED) +endif () + +#------------------------------------------------------------------------------ +# additionally define a header only library when cmake is new enough +if (CMAKE_VERSION VERSION_GREATER 3.1.0 OR CMAKE_VERSION VERSION_EQUAL 3.1.0) + add_library(fmt-header-only INTERFACE) + + target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) + + target_include_directories(fmt-header-only INTERFACE + $ + $) +endif () + +# Install targets. +if (FMT_INSTALL) + include(CMakePackageConfigHelpers) + set(FMT_CMAKE_DIR lib/cmake/fmt CACHE STRING + "Installation directory for cmake files, relative to ${CMAKE_INSTALL_PREFIX}.") + set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake) + set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake) + set(targets_export_name fmt-targets) + + set (INSTALL_TARGETS fmt) + if (TARGET fmt-header-only) + set(INSTALL_TARGETS ${INSTALL_TARGETS} fmt-header-only) + endif () + + set(FMT_LIB_DIR lib CACHE STRING + "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.") + + # Generate the version, config and target files into the build directory. + write_basic_package_version_file( + ${version_config} + VERSION ${FMT_VERSION} + COMPATIBILITY AnyNewerVersion) + configure_package_config_file( + ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in + ${project_config} + INSTALL_DESTINATION ${FMT_CMAKE_DIR}) + export(TARGETS ${INSTALL_TARGETS} + FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) + + # Install version, config and target files. + install( + FILES ${project_config} ${version_config} + DESTINATION ${FMT_CMAKE_DIR}) + install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}) + + # Install the library and headers. + install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name} + DESTINATION ${FMT_LIB_DIR}) + install(FILES ${FMT_HEADERS} DESTINATION include/fmt) + if (FMT_CPPFORMAT) + install(TARGETS cppformat DESTINATION ${FMT_LIB_DIR}) + endif () +endif () diff --git a/vendor/fmt-3.0.1/fmt/format.cc b/vendor/fmt-3.0.1/fmt/format.cc new file mode 100644 index 00000000..2bd774e4 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/format.cc @@ -0,0 +1,940 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "format.h" + +#include + +#include +#include +#include +#include +#include +#include // for std::ptrdiff_t + +#if defined(_WIN32) && defined(__MINGW32__) +# include +#endif + +#if FMT_USE_WINDOWS_H +# if defined(NOMINMAX) || defined(FMT_WIN_MINMAX) +# include +# else +# define NOMINMAX +# include +# undef NOMINMAX +# endif +#endif + +using fmt::internal::Arg; + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4127) // conditional expression is constant +# pragma warning(disable: 4702) // unreachable code +// Disable deprecation warning for strerror. The latter is not called but +// MSVC fails to detect it. +# pragma warning(disable: 4996) +#endif + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +static inline fmt::internal::Null<> strerror_r(int, char *, ...) { + return fmt::internal::Null<>(); +} +static inline fmt::internal::Null<> strerror_s(char *, std::size_t, ...) { + return fmt::internal::Null<>(); +} + +namespace fmt { + +FMT_FUNC internal::RuntimeError::~RuntimeError() throw() {} +FMT_FUNC FormatError::~FormatError() throw() {} +FMT_FUNC SystemError::~SystemError() throw() {} + +namespace { + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char *buffer, size_t size, const char *format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +#if defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) +# define FMT_SWPRINTF snwprintf +#else +# define FMT_SWPRINTF swprintf +#endif // defined(_WIN32) && defined(__MINGW32__) && !defined(__NO_ISOCEXT) + +// Checks if a value fits in int - used to avoid warnings about comparing +// signed and unsigned integers. +template +struct IntChecker { + template + static bool fits_in_int(T value) { + unsigned max = INT_MAX; + return value <= max; + } + static bool fits_in_int(bool) { return true; } +}; + +template <> +struct IntChecker { + template + static bool fits_in_int(T value) { + return value >= INT_MIN && value <= INT_MAX; + } + static bool fits_in_int(int) { return true; } +}; + +const char RESET_COLOR[] = "\x1b[0m"; + +typedef void (*FormatFunc)(Writer &, int, StringRef); + +// Portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +int safe_strerror( + int error_code, char *&buffer, std::size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != 0 && buffer_size != 0, "invalid buffer"); + + class StrError { + private: + int error_code_; + char *&buffer_; + std::size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const StrError &) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + int handle(char *message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + int handle(internal::Null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? + ERANGE : result; + } + + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(internal::Null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } + + public: + StrError(int err_code, char *&buf, std::size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { + strerror_r(0, 0, ""); // Suppress a warning about unused strerror_r. + return handle(strerror_r(error_code_, buffer_, buffer_size_)); + } + }; + return StrError(error_code, buffer, buffer_size).run(); +} + +void format_error_code(Writer &out, int error_code, + StringRef message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // INLINE_BUFFER_SIZE to avoid dynamic memory allocation and potential + // bad_alloc. + out.clear(); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + typedef internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(error_code); + if (internal::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += internal::count_digits(abs_value); + if (message.size() <= internal::INLINE_BUFFER_SIZE - error_code_size) + out << message << SEP; + out << ERROR_STR << error_code; + assert(out.size() <= internal::INLINE_BUFFER_SIZE); +} + +void report_error(FormatFunc func, int error_code, + StringRef message) FMT_NOEXCEPT { + MemoryWriter full_message; + func(full_message, error_code, message); + // Use Writer::data instead of Writer::c_str to avoid potential memory + // allocation. + std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// IsZeroInt::visit(arg) returns true iff arg is a zero integer. +class IsZeroInt : public ArgVisitor { + public: + template + bool visit_any_int(T value) { return value == 0; } +}; + +// Checks if an argument is a valid printf width specifier and sets +// left alignment if it is negative. +class WidthHandler : public ArgVisitor { + private: + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(WidthHandler); + + public: + explicit WidthHandler(FormatSpec &spec) : spec_(spec) {} + + void report_unhandled_arg() { + FMT_THROW(FormatError("width is not integer")); + } + + template + unsigned visit_any_int(T value) { + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType width = static_cast(value); + if (internal::is_negative(value)) { + spec_.align_ = ALIGN_LEFT; + width = 0 - width; + } + if (width > INT_MAX) + FMT_THROW(FormatError("number is too big")); + return static_cast(width); + } +}; + +class PrecisionHandler : public ArgVisitor { + public: + void report_unhandled_arg() { + FMT_THROW(FormatError("precision is not integer")); + } + + template + int visit_any_int(T value) { + if (!IntChecker::is_signed>::fits_in_int(value)) + FMT_THROW(FormatError("number is too big")); + return static_cast(value); + } +}; + +template +struct is_same { + enum { value = 0 }; +}; + +template +struct is_same { + enum { value = 1 }; +}; + +// An argument visitor that converts an integer argument to T for printf, +// if T is an integral type. If T is void, the argument is converted to +// corresponding signed or unsigned type depending on the type specifier: +// 'd' and 'i' - signed, other - unsigned) +template +class ArgConverter : public ArgVisitor, void> { + private: + internal::Arg &arg_; + wchar_t type_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgConverter); + + public: + ArgConverter(internal::Arg &arg, wchar_t type) + : arg_(arg), type_(type) {} + + void visit_bool(bool value) { + if (type_ != 's') + visit_any_int(value); + } + + template + void visit_any_int(U value) { + bool is_signed = type_ == 'd' || type_ == 'i'; + using internal::Arg; + typedef typename internal::Conditional< + is_same::value, U, T>::type TargetType; + if (sizeof(TargetType) <= sizeof(int)) { + // Extra casts are used to silence warnings. + if (is_signed) { + arg_.type = Arg::INT; + arg_.int_value = static_cast(static_cast(value)); + } else { + arg_.type = Arg::UINT; + typedef typename internal::MakeUnsigned::Type Unsigned; + arg_.uint_value = static_cast(static_cast(value)); + } + } else { + if (is_signed) { + arg_.type = Arg::LONG_LONG; + // glibc's printf doesn't sign extend arguments of smaller types: + // std::printf("%lld", -42); // prints "4294967254" + // but we don't have to do the same because it's a UB. + arg_.long_long_value = static_cast(value); + } else { + arg_.type = Arg::ULONG_LONG; + arg_.ulong_long_value = + static_cast::Type>(value); + } + } + } +}; + +// Converts an integer argument to char for printf. +class CharConverter : public ArgVisitor { + private: + internal::Arg &arg_; + + FMT_DISALLOW_COPY_AND_ASSIGN(CharConverter); + + public: + explicit CharConverter(internal::Arg &arg) : arg_(arg) {} + + template + void visit_any_int(T value) { + arg_.type = internal::Arg::CHAR; + arg_.int_value = static_cast(value); + } +}; +} // namespace + +namespace internal { + +template +class PrintfArgFormatter : + public ArgFormatterBase, Char> { + + void write_null_pointer() { + this->spec().type_ = 0; + this->write("(nil)"); + } + + typedef ArgFormatterBase, Char> Base; + + public: + PrintfArgFormatter(BasicWriter &w, FormatSpec &s) + : ArgFormatterBase, Char>(w, s) {} + + void visit_bool(bool value) { + FormatSpec &fmt_spec = this->spec(); + if (fmt_spec.type_ != 's') + return this->visit_any_int(value); + fmt_spec.type_ = 0; + this->write(value); + } + + void visit_char(int value) { + const FormatSpec &fmt_spec = this->spec(); + BasicWriter &w = this->writer(); + if (fmt_spec.type_ && fmt_spec.type_ != 'c') + w.write_int(value, fmt_spec); + typedef typename BasicWriter::CharPtr CharPtr; + CharPtr out = CharPtr(); + if (fmt_spec.width_ > 1) { + Char fill = ' '; + out = w.grow_buffer(fmt_spec.width_); + if (fmt_spec.align_ != ALIGN_LEFT) { + std::fill_n(out, fmt_spec.width_ - 1, fill); + out += fmt_spec.width_ - 1; + } else { + std::fill_n(out + 1, fmt_spec.width_ - 1, fill); + } + } else { + out = w.grow_buffer(1); + } + *out = static_cast(value); + } + + void visit_cstring(const char *value) { + if (value) + Base::visit_cstring(value); + else if (this->spec().type_ == 'p') + write_null_pointer(); + else + this->write("(null)"); + } + + void visit_pointer(const void *value) { + if (value) + return Base::visit_pointer(value); + this->spec().type_ = 0; + write_null_pointer(); + } + + void visit_custom(Arg::CustomValue c) { + BasicFormatter formatter(ArgList(), this->writer()); + const Char format_str[] = {'}', 0}; + const Char *format = format_str; + c.format(&formatter, c.value, &format); + } +}; +} // namespace internal +} // namespace fmt + +FMT_FUNC void fmt::SystemError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_system_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +template +int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, value) : + FMT_SNPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SNPRINTF(buffer, size, format, width, value) : + FMT_SNPRINTF(buffer, size, format, width, precision, value); +} + +template +int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, T value) { + if (width == 0) { + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, value) : + FMT_SWPRINTF(buffer, size, format, precision, value); + } + return precision < 0 ? + FMT_SWPRINTF(buffer, size, format, width, value) : + FMT_SWPRINTF(buffer, size, format, width, precision, value); +} + +template +const char fmt::internal::BasicData::DIGITS[] = + "0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, \ + factor * 100, \ + factor * 1000, \ + factor * 10000, \ + factor * 100000, \ + factor * 1000000, \ + factor * 10000000, \ + factor * 100000000, \ + factor * 1000000000 + +template +const uint32_t fmt::internal::BasicData::POWERS_OF_10_32[] = { + 0, FMT_POWERS_OF_10(1) +}; + +template +const uint64_t fmt::internal::BasicData::POWERS_OF_10_64[] = { + 0, + FMT_POWERS_OF_10(1), + FMT_POWERS_OF_10(fmt::ULongLong(1000000000)), + // Multiply several constants instead of using a single long long constant + // to avoid warnings about C++98 not supporting long long. + fmt::ULongLong(1000000000) * fmt::ULongLong(1000000000) * 10 +}; + +FMT_FUNC void fmt::internal::report_unknown_type(char code, const char *type) { + (void)type; + if (std::isprint(static_cast(code))) { + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '{}' for {}", code, type))); + } + FMT_THROW(fmt::FormatError( + fmt::format("unknown format code '\\x{:02x}' for {}", + static_cast(code), type))); +} + +#if FMT_USE_WINDOWS_H + +FMT_FUNC fmt::internal::UTF8ToUTF16::UTF8ToUTF16(fmt::StringRef s) { + static const char ERROR_MSG[] = "cannot convert string from UTF-8 to UTF-16"; + if (s.size() > INT_MAX) + FMT_THROW(WindowsError(ERROR_INVALID_PARAMETER, ERROR_MSG)); + int s_size = static_cast(s.size()); + int length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, 0, 0); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_.resize(length + 1); + length = MultiByteToWideChar( + CP_UTF8, MB_ERR_INVALID_CHARS, s.data(), s_size, &buffer_[0], length); + if (length == 0) + FMT_THROW(WindowsError(GetLastError(), ERROR_MSG)); + buffer_[length] = 0; +} + +FMT_FUNC fmt::internal::UTF16ToUTF8::UTF16ToUTF8(fmt::WStringRef s) { + if (int error_code = convert(s)) { + FMT_THROW(WindowsError(error_code, + "cannot convert string from UTF-16 to UTF-8")); + } +} + +FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) { + if (s.size() > INT_MAX) + return ERROR_INVALID_PARAMETER; + int s_size = static_cast(s.size()); + int length = WideCharToMultiByte(CP_UTF8, 0, s.data(), s_size, 0, 0, 0, 0); + if (length == 0) + return GetLastError(); + buffer_.resize(length + 1); + length = WideCharToMultiByte( + CP_UTF8, 0, s.data(), s_size, &buffer_[0], length, 0, 0); + if (length == 0) + return GetLastError(); + buffer_[length] = 0; + return 0; +} + +FMT_FUNC void fmt::WindowsError::init( + int err_code, CStringRef format_str, ArgList args) { + error_code_ = err_code; + MemoryWriter w; + internal::format_windows_error(w, err_code, format(format_str, args)); + std::runtime_error &base = *this; + base = std::runtime_error(w.str()); +} + +FMT_FUNC void fmt::internal::format_windows_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + wchar_t *system_message = &buffer[0]; + int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + system_message, static_cast(buffer.size()), 0); + if (result != 0) { + UTF16ToUTF8 utf8_message; + if (utf8_message.convert(system_message) == ERROR_SUCCESS) { + out << message << ": " << utf8_message; + return; + } + break; + } + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +#endif // FMT_USE_WINDOWS_H + +FMT_FUNC void fmt::internal::format_system_error( + fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT { + FMT_TRY { + MemoryBuffer buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + char *system_message = &buffer[0]; + int result = safe_strerror(error_code, system_message, buffer.size()); + if (result == 0) { + out << message << ": " << system_message; + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); + } + } FMT_CATCH(...) {} + fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. +} + +template +void fmt::internal::ArgMap::init(const ArgList &args) { + if (!map_.empty()) + return; + typedef internal::NamedArg NamedArg; + const NamedArg *named_arg = 0; + bool use_values = + args.type(ArgList::MAX_PACKED_ARGS - 1) == internal::Arg::NONE; + if (use_values) { + for (unsigned i = 0;/*nothing*/; ++i) { + internal::Arg::Type arg_type = args.type(i); + switch (arg_type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.values_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } + return; + } + for (unsigned i = 0; i != ArgList::MAX_PACKED_ARGS; ++i) { + internal::Arg::Type arg_type = args.type(i); + if (arg_type == internal::Arg::NAMED_ARG) { + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + } + } + for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { + switch (args.args_[i].type) { + case internal::Arg::NONE: + return; + case internal::Arg::NAMED_ARG: + named_arg = static_cast(args.args_[i].pointer); + map_.push_back(Pair(named_arg->name, *named_arg)); + break; + default: + /*nothing*/; + } + } +} + +template +void fmt::internal::FixedBuffer::grow(std::size_t) { + FMT_THROW(std::runtime_error("buffer overflow")); +} + +FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( + unsigned arg_index, const char *&error) { + Arg arg = args_[arg_index]; + switch (arg.type) { + case Arg::NONE: + error = "argument index out of range"; + break; + case Arg::NAMED_ARG: + arg = *static_cast(arg.pointer); + break; + default: + /*nothing*/; + } + return arg; +} + +template +void fmt::internal::PrintfFormatter::parse_flags( + FormatSpec &spec, const Char *&s) { + for (;;) { + switch (*s++) { + case '-': + spec.align_ = ALIGN_LEFT; + break; + case '+': + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '0': + spec.fill_ = '0'; + break; + case ' ': + spec.flags_ |= SIGN_FLAG; + break; + case '#': + spec.flags_ |= HASH_FLAG; + break; + default: + --s; + return; + } + } +} + +template +Arg fmt::internal::PrintfFormatter::get_arg( + const Char *s, unsigned arg_index) { + (void)s; + const char *error = 0; + Arg arg = arg_index == UINT_MAX ? + next_arg(error) : FormatterBase::get_arg(arg_index - 1, error); + if (error) + FMT_THROW(FormatError(!*s ? "invalid format string" : error)); + return arg; +} + +template +unsigned fmt::internal::PrintfFormatter::parse_header( + const Char *&s, FormatSpec &spec) { + unsigned arg_index = UINT_MAX; + Char c = *s; + if (c >= '0' && c <= '9') { + // Parse an argument index (if followed by '$') or a width possibly + // preceded with '0' flag(s). + unsigned value = parse_nonnegative_int(s); + if (*s == '$') { // value is an argument index + ++s; + arg_index = value; + } else { + if (c == '0') + spec.fill_ = '0'; + if (value != 0) { + // Nonzero value means that we parsed width and don't need to + // parse it or flags again, so return now. + spec.width_ = value; + return arg_index; + } + } + } + parse_flags(spec, s); + // Parse width. + if (*s >= '0' && *s <= '9') { + spec.width_ = parse_nonnegative_int(s); + } else if (*s == '*') { + ++s; + spec.width_ = WidthHandler(spec).visit(get_arg(s)); + } + return arg_index; +} + +template +void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, BasicCStringRef format_str) { + const Char *start = format_str.c_str(); + const Char *s = start; + while (*s) { + Char c = *s++; + if (c != '%') continue; + if (*s == c) { + write(writer, start, s); + start = ++s; + continue; + } + write(writer, start, s - 1); + + FormatSpec spec; + spec.align_ = ALIGN_RIGHT; + + // Parse argument index, flags and width. + unsigned arg_index = parse_header(s, spec); + + // Parse precision. + if (*s == '.') { + ++s; + if ('0' <= *s && *s <= '9') { + spec.precision_ = static_cast(parse_nonnegative_int(s)); + } else if (*s == '*') { + ++s; + spec.precision_ = PrecisionHandler().visit(get_arg(s)); + } + } + + Arg arg = get_arg(s, arg_index); + if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) + spec.flags_ &= ~to_unsigned(HASH_FLAG); + if (spec.fill_ == '0') { + if (arg.type <= Arg::LAST_NUMERIC_TYPE) + spec.align_ = ALIGN_NUMERIC; + else + spec.fill_ = ' '; // Ignore '0' flag for non-numeric types. + } + + // Parse length and convert the argument to the required type. + switch (*s++) { + case 'h': + if (*s == 'h') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'l': + if (*s == 'l') + ArgConverter(arg, *++s).visit(arg); + else + ArgConverter(arg, *s).visit(arg); + break; + case 'j': + ArgConverter(arg, *s).visit(arg); + break; + case 'z': + ArgConverter(arg, *s).visit(arg); + break; + case 't': + ArgConverter(arg, *s).visit(arg); + break; + case 'L': + // printf produces garbage when 'L' is omitted for long double, no + // need to do the same. + break; + default: + --s; + ArgConverter(arg, *s).visit(arg); + } + + // Parse type. + if (!*s) + FMT_THROW(FormatError("invalid format string")); + spec.type_ = static_cast(*s++); + if (arg.type <= Arg::LAST_INTEGER_TYPE) { + // Normalize type. + switch (spec.type_) { + case 'i': case 'u': + spec.type_ = 'd'; + break; + case 'c': + // TODO: handle wchar_t + CharConverter(arg).visit(arg); + break; + } + } + + start = s; + + // Format argument. + internal::PrintfArgFormatter(writer, spec).visit(arg); + } + write(writer, start, s); +} + +FMT_FUNC void fmt::report_system_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_system_error, error_code, message); +} + +#if FMT_USE_WINDOWS_H +FMT_FUNC void fmt::report_windows_error( + int error_code, fmt::StringRef message) FMT_NOEXCEPT { + // 'fmt::' is for bcc32. + fmt::report_error(internal::format_windows_error, error_code, message); +} +#endif + +FMT_FUNC void fmt::print(std::FILE *f, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + std::fwrite(w.data(), 1, w.size(), f); +} + +FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { + print(stdout, format_str, args); +} + +FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { + char escape[] = "\x1b[30m"; + escape[3] = static_cast('0' + c); + std::fputs(escape, stdout); + print(format, args); + std::fputs(RESET_COLOR, stdout); +} + +FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + std::size_t size = w.size(); + return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast(size); +} + +#ifndef FMT_HEADER_ONLY + +template struct fmt::internal::BasicData; + +// Explicit instantiations for char. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, CStringRef format); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + char *buffer, std::size_t size, const char *format, + unsigned width, int precision, long double value); + +// Explicit instantiations for wchar_t. + +template void fmt::internal::FixedBuffer::grow(std::size_t); + +template void fmt::internal::ArgMap::init(const fmt::ArgList &args); + +template void fmt::internal::PrintfFormatter::format( + BasicWriter &writer, WCStringRef format); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, double value); + +template int fmt::internal::CharTraits::format_float( + wchar_t *buffer, std::size_t size, const wchar_t *format, + unsigned width, int precision, long double value); + +#endif // FMT_HEADER_ONLY + +#ifdef _MSC_VER +# pragma warning(pop) +#endif diff --git a/vendor/fmt-3.0.1/fmt/format.h b/vendor/fmt-3.0.1/fmt/format.h new file mode 100644 index 00000000..f8ce147c --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/format.h @@ -0,0 +1,3883 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _SECURE_SCL +# define FMT_SECURE_SCL _SECURE_SCL +#else +# define FMT_SECURE_SCL 0 +#endif + +#if FMT_SECURE_SCL +# include +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VER _MSC_VER +#else +# define FMT_MSC_VER 0 +#endif + +#if FMT_MSC_VER && FMT_MSC_VER <= 1500 +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 intmax_t; +#else +#include +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# endif +#endif +#ifndef FMT_API +# define FMT_API +#endif + +#ifdef __GNUC__ +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# define FMT_GCC_EXTENSION __extension__ +# if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic push +// Disable the warning about "long long" which is sometimes reported even +// when using __extension__. +# pragma GCC diagnostic ignored "-Wlong-long" +// Disable the warning about declaration shadowing because it affects too +// many valid cases. +# pragma GCC diagnostic ignored "-Wshadow" +// Disable the warning about implicit conversions that may change the sign of +// an integer; silencing it otherwise would require many explicit casts. +# pragma GCC diagnostic ignored "-Wsign-conversion" +# endif +# if __cplusplus >= 201103L || defined __GXX_EXPERIMENTAL_CXX0X__ +# define FMT_HAS_GXX_CXX11 1 +# endif +#else +# define FMT_GCC_EXTENSION +#endif + +#if defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#elif defined(__ICL) +# define FMT_ICC_VERSION __ICL +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +# pragma clang diagnostic ignored "-Wpadded" +#endif + +#ifdef __GNUC_LIBSTD__ +# define FMT_GNUC_LIBSTD_VERSION (__GNUC_LIBSTD__ * 100 + __GNUC_LIBSTD_MINOR__) +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#ifndef FMT_USE_VARIADIC_TEMPLATES +// Variadic templates are available in GCC since version 4.4 +// (http://gcc.gnu.org/projects/cxx0x.html) and in Visual C++ +// since version 2013. +# define FMT_USE_VARIADIC_TEMPLATES \ + (FMT_HAS_FEATURE(cxx_variadic_templates) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800) +#endif + +#ifndef FMT_USE_RVALUE_REFERENCES +// Don't use rvalue references when compiling with clang and an old libstdc++ +// as the latter doesn't provide std::move. +# if defined(FMT_GNUC_LIBSTD_VERSION) && FMT_GNUC_LIBSTD_VERSION <= 402 +# define FMT_USE_RVALUE_REFERENCES 0 +# else +# define FMT_USE_RVALUE_REFERENCES \ + (FMT_HAS_FEATURE(cxx_rvalue_references) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1600) +# endif +#endif + +#if FMT_USE_RVALUE_REFERENCES +# include // for std::move +#endif + +// Check if exceptions are disabled. +#if defined(__GNUC__) && !defined(__EXCEPTIONS) +# define FMT_EXCEPTIONS 0 +#endif +#if FMT_MSC_VER && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +#endif +#ifndef FMT_EXCEPTIONS +# define FMT_EXCEPTIONS 1 +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# define FMT_THROW(x) throw x +# else +# define FMT_THROW(x) assert(false) +# endif +#endif + +// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS +# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + FMT_MSC_VER >= 1900 +# define FMT_NOEXCEPT noexcept +# else +# define FMT_NOEXCEPT throw() +# endif +# else +# define FMT_NOEXCEPT +# endif +#endif + +#ifndef FMT_OVERRIDE +# if FMT_USE_OVERRIDE || FMT_HAS_FEATURE(cxx_override) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + FMT_MSC_VER >= 1900 +# define FMT_OVERRIDE override +# else +# define FMT_OVERRIDE +# endif +#endif + + +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#ifndef FMT_USE_DELETED_FUNCTIONS +# define FMT_USE_DELETED_FUNCTIONS 0 +#endif + +#if FMT_USE_DELETED_FUNCTIONS || FMT_HAS_FEATURE(cxx_deleted_functions) || \ + (FMT_GCC_VERSION >= 404 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1800 +# define FMT_DELETED_OR_UNDEFINED = delete +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&) = delete; \ + TypeName& operator=(const TypeName&) = delete +#else +# define FMT_DELETED_OR_UNDEFINED +# define FMT_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + TypeName& operator=(const TypeName&) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// All compilers which support UDLs also support variadic templates. This +// makes the fmt::literals implementation easier. However, an explicit check +// for variadic templates is added here just in case. +// For Intel's compiler both it and the system gcc/msc must support UDLs. +# define FMT_USE_USER_DEFINED_LITERALS \ + FMT_USE_VARIADIC_TEMPLATES && FMT_USE_RVALUE_REFERENCES && \ + (FMT_HAS_FEATURE(cxx_user_literals) || \ + (FMT_GCC_VERSION >= 407 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900) && \ + (!defined(FMT_ICC_VERSION) || FMT_ICC_VERSION >= 1500) +#endif + +#ifndef FMT_ASSERT +# define FMT_ASSERT(condition, message) assert((condition) && message) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or +// otherwise support __builtin_clz and __builtin_clzll, so +// only define FMT_BUILTIN_CLZ using the MSVC intrinsics +// if the clz and clzll builtins are not available. +#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) +# include // _BitScanReverse, _BitScanReverse64 + +namespace fmt { +namespace internal { +# pragma intrinsic(_BitScanReverse) +inline uint32_t clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) + +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) +} +} +#endif + +namespace fmt { +namespace internal { +struct DummyInt { + int data[2]; + operator int() const { return 0; } +}; +typedef std::numeric_limits FPUtil; + +// Dummy implementations of system functions such as signbit and ecvt called +// if the latter are not available. +inline DummyInt signbit(...) { return DummyInt(); } +inline DummyInt _ecvt_s(...) { return DummyInt(); } +inline DummyInt isinf(...) { return DummyInt(); } +inline DummyInt _finite(...) { return DummyInt(); } +inline DummyInt isnan(...) { return DummyInt(); } +inline DummyInt _isnan(...) { return DummyInt(); } + +// A helper function to suppress bogus "conditional expression is constant" +// warnings. +template +inline T const_check(T value) { return value; } +} +} // namespace fmt + +namespace std { +// Standard permits specialization of std::numeric_limits. This specialization +// is used to resolve ambiguity between isinf and std::isinf in glibc: +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48891 +// and the same for isnan and signbit. +template <> +class numeric_limits : + public std::numeric_limits { + public: + // Portable version of isinf. + template + static bool isinfinity(T x) { + using namespace fmt::internal; + // The resolution "priority" is: + // isinf macro > std::isinf > ::isinf > fmt::internal::isinf + if (const_check(sizeof(isinf(x)) == sizeof(bool) || + sizeof(isinf(x)) == sizeof(int))) { + return isinf(x) != 0; + } + return !_finite(static_cast(x)); + } + + // Portable version of isnan. + template + static bool isnotanumber(T x) { + using namespace fmt::internal; + if (const_check(sizeof(isnan(x)) == sizeof(bool) || + sizeof(isnan(x)) == sizeof(int))) { + return isnan(x) != 0; + } + return _isnan(static_cast(x)) != 0; + } + + // Portable version of signbit. + static bool isnegative(double x) { + using namespace fmt::internal; + if (const_check(sizeof(signbit(x)) == sizeof(int))) + return signbit(x) != 0; + if (x < 0) return true; + if (!isnotanumber(x)) return false; + int dec = 0, sign = 0; + char buffer[2]; // The buffer size must be >= 2 or _ecvt_s will fail. + _ecvt_s(buffer, sizeof(buffer), x, 0, &dec, &sign); + return sign != 0; + } +}; +} // namespace std + +namespace fmt { + +// Fix the warning about long long on older versions of GCC +// that don't support the diagnostic pragma. +FMT_GCC_EXTENSION typedef long long LongLong; +FMT_GCC_EXTENSION typedef unsigned long long ULongLong; + +#if FMT_USE_RVALUE_REFERENCES +using std::move; +#endif + +template +class BasicWriter; + +typedef BasicWriter Writer; +typedef BasicWriter WWriter; + +template +class ArgFormatter; + +template > +class BasicFormatter; + +/** + \rst + A string reference. It can be constructed from a C string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +------------+-------------------------+ + | Type | Definition | + +============+=========================+ + | StringRef | BasicStringRef | + +------------+-------------------------+ + | WStringRef | BasicStringRef | + +------------+-------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(StringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicStringRef { + private: + const Char *data_; + std::size_t size_; + + public: + /** Constructs a string reference object from a C string and a size. */ + BasicStringRef(const Char *s, std::size_t size) : data_(s), size_(size) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ + BasicStringRef(const Char *s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicStringRef(const std::basic_string &s) + : data_(s.c_str()), size_(s.size()) {} + + /** + \rst + Converts a string reference to an ``std::string`` object. + \endrst + */ + std::basic_string to_string() const { + return std::basic_string(data_, size_); + } + + /** Returns a pointer to the string data. */ + const Char *data() const { return data_; } + + /** Returns the string size. */ + std::size_t size() const { return size_; } + + // Lexicographically compare this string reference to other. + int compare(BasicStringRef other) const { + std::size_t size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) != 0; + } + friend bool operator<(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(BasicStringRef lhs, BasicStringRef rhs) { + return lhs.compare(rhs) >= 0; + } +}; + +typedef BasicStringRef StringRef; +typedef BasicStringRef WStringRef; + +/** + \rst + A reference to a null terminated string. It can be constructed from a C + string or ``std::string``. + + You can use one of the following typedefs for common character types: + + +-------------+--------------------------+ + | Type | Definition | + +=============+==========================+ + | CStringRef | BasicCStringRef | + +-------------+--------------------------+ + | WCStringRef | BasicCStringRef | + +-------------+--------------------------+ + + This class is most useful as a parameter type to allow passing + different types of strings to a function, for example:: + + template + std::string format(CStringRef format_str, const Args & ... args); + + format("{}", 42); + format(std::string("{}"), 42); + \endrst + */ +template +class BasicCStringRef { + private: + const Char *data_; + + public: + /** Constructs a string reference object from a C string. */ + BasicCStringRef(const Char *s) : data_(s) {} + + /** + \rst + Constructs a string reference from an ``std::string`` object. + \endrst + */ + BasicCStringRef(const std::basic_string &s) : data_(s.c_str()) {} + + /** Returns the pointer to a C string. */ + const Char *c_str() const { return data_; } +}; + +typedef BasicCStringRef CStringRef; +typedef BasicCStringRef WCStringRef; + +/** A formatting error such as invalid format string. */ +class FormatError : public std::runtime_error { + public: + explicit FormatError(CStringRef message) + : std::runtime_error(message.c_str()) {} + ~FormatError() throw(); +}; + +namespace internal { + +// MakeUnsigned::Type gives an unsigned type corresponding to integer type T. +template +struct MakeUnsigned { typedef T Type; }; + +#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ + template <> \ + struct MakeUnsigned { typedef U Type; } + +FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); +FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); +FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); +FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); + +// Casts nonnegative integer to unsigned. +template +inline typename MakeUnsigned::Type to_unsigned(Int value) { + FMT_ASSERT(value >= 0, "negative value"); + return static_cast::Type>(value); +} + +// The number of characters to store in the MemoryBuffer object itself +// to avoid dynamic memory allocation. +enum { INLINE_BUFFER_SIZE = 500 }; + +#if FMT_SECURE_SCL +// Use checked iterator to avoid warnings on MSVC. +template +inline stdext::checked_array_iterator make_ptr(T *ptr, std::size_t size) { + return stdext::checked_array_iterator(ptr, size); +} +#else +template +inline T *make_ptr(T *ptr, std::size_t) { return ptr; } +#endif +} // namespace internal + +/** + \rst + A buffer supporting a subset of ``std::vector``'s operations. + \endrst + */ +template +class Buffer { + private: + FMT_DISALLOW_COPY_AND_ASSIGN(Buffer); + + protected: + T *ptr_; + std::size_t size_; + std::size_t capacity_; + + Buffer(T *ptr = 0, std::size_t capacity = 0) + : ptr_(ptr), size_(0), capacity_(capacity) {} + + /** + \rst + Increases the buffer capacity to hold at least *size* elements updating + ``ptr_`` and ``capacity_``. + \endrst + */ + virtual void grow(std::size_t size) = 0; + + public: + virtual ~Buffer() {} + + /** Returns the size of this buffer. */ + std::size_t size() const { return size_; } + + /** Returns the capacity of this buffer. */ + std::size_t capacity() const { return capacity_; } + + /** + Resizes the buffer. If T is a POD type new elements may not be initialized. + */ + void resize(std::size_t new_size) { + if (new_size > capacity_) + grow(new_size); + size_ = new_size; + } + + /** + \rst + Reserves space to store at least *capacity* elements. + \endrst + */ + void reserve(std::size_t capacity) { + if (capacity > capacity_) + grow(capacity); + } + + void clear() FMT_NOEXCEPT { size_ = 0; } + + void push_back(const T &value) { + if (size_ == capacity_) + grow(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template + void append(const U *begin, const U *end); + + T &operator[](std::size_t index) { return ptr_[index]; } + const T &operator[](std::size_t index) const { return ptr_[index]; } +}; + +template +template +void Buffer::append(const U *begin, const U *end) { + std::size_t new_size = size_ + internal::to_unsigned(end - begin); + if (new_size > capacity_) + grow(new_size); + std::uninitialized_copy(begin, end, + internal::make_ptr(ptr_, capacity_) + size_); + size_ = new_size; +} + +namespace internal { + +// A memory buffer for trivially copyable/constructible types with the first +// SIZE elements stored in the object itself. +template > +class MemoryBuffer : private Allocator, public Buffer { + private: + T data_[SIZE]; + + // Deallocate memory allocated by the buffer. + void deallocate() { + if (this->ptr_ != data_) Allocator::deallocate(this->ptr_, this->capacity_); + } + + protected: + void grow(std::size_t size) FMT_OVERRIDE; + + public: + explicit MemoryBuffer(const Allocator &alloc = Allocator()) + : Allocator(alloc), Buffer(data_, SIZE) {} + ~MemoryBuffer() { deallocate(); } + +#if FMT_USE_RVALUE_REFERENCES + private: + // Move data from other to this buffer. + void move(MemoryBuffer &other) { + Allocator &this_alloc = *this, &other_alloc = other; + this_alloc = std::move(other_alloc); + this->size_ = other.size_; + this->capacity_ = other.capacity_; + if (other.ptr_ == other.data_) { + this->ptr_ = data_; + std::uninitialized_copy(other.data_, other.data_ + this->size_, + make_ptr(data_, this->capacity_)); + } else { + this->ptr_ = other.ptr_; + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.ptr_ = other.data_; + } + } + + public: + MemoryBuffer(MemoryBuffer &&other) { + move(other); + } + + MemoryBuffer &operator=(MemoryBuffer &&other) { + assert(this != &other); + deallocate(); + move(other); + return *this; + } +#endif + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const { return *this; } +}; + +template +void MemoryBuffer::grow(std::size_t size) { + std::size_t new_capacity = this->capacity_ + this->capacity_ / 2; + if (size > new_capacity) + new_capacity = size; + T *new_ptr = this->allocate(new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(this->ptr_, this->ptr_ + this->size_, + make_ptr(new_ptr, new_capacity)); + std::size_t old_capacity = this->capacity_; + T *old_ptr = this->ptr_; + this->capacity_ = new_capacity; + this->ptr_ = new_ptr; + // deallocate may throw (at least in principle), but it doesn't matter since + // the buffer already uses the new storage and will deallocate it in case + // of exception. + if (old_ptr != data_) + Allocator::deallocate(old_ptr, old_capacity); +} + +// A fixed-size buffer. +template +class FixedBuffer : public fmt::Buffer { + public: + FixedBuffer(Char *array, std::size_t size) : fmt::Buffer(array, size) {} + + protected: + FMT_API void grow(std::size_t size); +}; + +template +class BasicCharTraits { + public: +#if FMT_SECURE_SCL + typedef stdext::checked_array_iterator CharPtr; +#else + typedef Char *CharPtr; +#endif + static Char cast(int value) { return static_cast(value); } +}; + +template +class CharTraits; + +template <> +class CharTraits : public BasicCharTraits { + private: + // Conversion from wchar_t to char is not allowed. + static char convert(wchar_t); + + public: + static char convert(char value) { return value; } + + // Formats a floating-point number. + template + FMT_API static int format_float(char *buffer, std::size_t size, + const char *format, unsigned width, int precision, T value); +}; + +template <> +class CharTraits : public BasicCharTraits { + public: + static wchar_t convert(char value) { return value; } + static wchar_t convert(wchar_t value) { return value; } + + template + FMT_API static int format_float(wchar_t *buffer, std::size_t size, + const wchar_t *format, unsigned width, int precision, T value); +}; + +// Checks if a number is negative - used to avoid warnings. +template +struct SignChecker { + template + static bool is_negative(T value) { return value < 0; } +}; + +template <> +struct SignChecker { + template + static bool is_negative(T) { return false; } +}; + +// Returns true if value is negative, false otherwise. +// Same as (value < 0) but doesn't produce warnings if T is an unsigned type. +template +inline bool is_negative(T value) { + return SignChecker::is_signed>::is_negative(value); +} + +// Selects uint32_t if FitsIn32Bits is true, uint64_t otherwise. +template +struct TypeSelector { typedef uint32_t Type; }; + +template <> +struct TypeSelector { typedef uint64_t Type; }; + +template +struct IntTraits { + // Smallest of uint32_t and uint64_t that is large enough to represent + // all values of T. + typedef typename + TypeSelector::digits <= 32>::Type MainType; +}; + +FMT_API void report_unknown_type(char code, const char *type); + +// Static data is placed in this class template to allow header-only +// configuration. +template +struct FMT_API BasicData { + static const uint32_t POWERS_OF_10_32[]; + static const uint64_t POWERS_OF_10_64[]; + static const char DIGITS[]; +}; + +#ifndef FMT_USE_EXTERN_TEMPLATES +// Clang doesn't have a feature check for extern templates so we check +// for variadic templates which were introduced in the same version. +# define FMT_USE_EXTERN_TEMPLATES (__clang__ && FMT_USE_VARIADIC_TEMPLATES) +#endif + +#if FMT_USE_EXTERN_TEMPLATES && !defined(FMT_HEADER_ONLY) +extern template struct BasicData; +#endif + +typedef BasicData<> Data; + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline unsigned count_digits(uint64_t n) { + // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. + int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline unsigned count_digits(uint64_t n) { + unsigned count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline unsigned count_digits(uint32_t n) { + int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; +} +#endif + +// A functor that doesn't add a thousands separator. +struct NoThousandsSep { + template + void operator()(Char *) {} +}; + +// A functor that adds a thousands separator. +class ThousandsSep { + private: + fmt::StringRef sep_; + + // Index of a decimal digit with the least significant digit having index 0. + unsigned digit_index_; + + public: + explicit ThousandsSep(fmt::StringRef sep) : sep_(sep), digit_index_(0) {} + + template + void operator()(Char *&buffer) { + if (++digit_index_ % 3 != 0) + return; + buffer -= sep_.size(); + std::uninitialized_copy(sep_.data(), sep_.data() + sep_.size(), + internal::make_ptr(buffer, sep_.size())); + } +}; + +// Formats a decimal unsigned integer value writing into buffer. +// thousands_sep is a functor that is called after writing each char to +// add a thousands separator if necessary. +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits, + ThousandsSep thousands_sep) { + buffer += num_digits; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer = Data::DIGITS[index + 1]; + thousands_sep(buffer); + *--buffer = Data::DIGITS[index]; + thousands_sep(buffer); + } + if (value < 10) { + *--buffer = static_cast('0' + value); + return; + } + unsigned index = static_cast(value * 2); + *--buffer = Data::DIGITS[index + 1]; + thousands_sep(buffer); + *--buffer = Data::DIGITS[index]; +} + +template +inline void format_decimal(Char *buffer, UInt value, unsigned num_digits) { + return format_decimal(buffer, value, num_digits, NoThousandsSep()); +} + +#ifndef _WIN32 +# define FMT_USE_WINDOWS_H 0 +#elif !defined(FMT_USE_WINDOWS_H) +# define FMT_USE_WINDOWS_H 1 +#endif + +// Define FMT_USE_WINDOWS_H to 0 to disable use of windows.h. +// All the functionality that relies on it will be disabled too. +#if FMT_USE_WINDOWS_H +// A converter from UTF-8 to UTF-16. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF8ToUTF16 { + private: + MemoryBuffer buffer_; + + public: + FMT_API explicit UTF8ToUTF16(StringRef s); + operator WStringRef() const { return WStringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const wchar_t *c_str() const { return &buffer_[0]; } + std::wstring str() const { return std::wstring(&buffer_[0], size()); } +}; + +// A converter from UTF-16 to UTF-8. +// It is only provided for Windows since other systems support UTF-8 natively. +class UTF16ToUTF8 { + private: + MemoryBuffer buffer_; + + public: + UTF16ToUTF8() {} + FMT_API explicit UTF16ToUTF8(WStringRef s); + operator StringRef() const { return StringRef(&buffer_[0], size()); } + size_t size() const { return buffer_.size() - 1; } + const char *c_str() const { return &buffer_[0]; } + std::string str() const { return std::string(&buffer_[0], size()); } + + // Performs conversion returning a system error code instead of + // throwing exception on conversion error. This method may still throw + // in case of memory allocation error. + FMT_API int convert(WStringRef s); +}; + +FMT_API void format_windows_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; +#endif + +FMT_API void format_system_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; + +// A formatting argument value. +struct Value { + template + struct StringValue { + const Char *value; + std::size_t size; + }; + + typedef void (*FormatFunc)( + void *formatter, const void *arg, void *format_str_ptr); + + struct CustomValue { + const void *value; + FormatFunc format; + }; + + union { + int int_value; + unsigned uint_value; + LongLong long_long_value; + ULongLong ulong_long_value; + double double_value; + long double long_double_value; + const void *pointer; + StringValue string; + StringValue sstring; + StringValue ustring; + StringValue wstring; + CustomValue custom; + }; + + enum Type { + NONE, NAMED_ARG, + // Integer types should go first, + INT, UINT, LONG_LONG, ULONG_LONG, BOOL, CHAR, LAST_INTEGER_TYPE = CHAR, + // followed by floating-point types. + DOUBLE, LONG_DOUBLE, LAST_NUMERIC_TYPE = LONG_DOUBLE, + CSTRING, STRING, WSTRING, POINTER, CUSTOM + }; +}; + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in internal::MemoryBuffer. +struct Arg : Value { + Type type; +}; + +template +struct NamedArg; + +template +struct Null {}; + +// A helper class template to enable or disable overloads taking wide +// characters and strings in MakeValue. +template +struct WCharHelper { + typedef Null Supported; + typedef T Unsupported; +}; + +template +struct WCharHelper { + typedef T Supported; + typedef Null Unsupported; +}; + +typedef char Yes[1]; +typedef char No[2]; + +template +T &get(); + +// These are non-members to workaround an overload resolution bug in bcc32. +Yes &convert(fmt::ULongLong); +No &convert(...); + +template +struct ConvertToIntImpl { + enum { value = ENABLE_CONVERSION }; +}; + +template +struct ConvertToIntImpl2 { + enum { value = false }; +}; + +template +struct ConvertToIntImpl2 { + enum { + // Don't convert numeric types. + value = ConvertToIntImpl::is_specialized>::value + }; +}; + +template +struct ConvertToInt { + enum { enable_conversion = sizeof(convert(get())) == sizeof(Yes) }; + enum { value = ConvertToIntImpl2::value }; +}; + +#define FMT_DISABLE_CONVERSION_TO_INT(Type) \ + template <> \ + struct ConvertToInt { enum { value = 0 }; } + +// Silence warnings about convering float to int. +FMT_DISABLE_CONVERSION_TO_INT(float); +FMT_DISABLE_CONVERSION_TO_INT(double); +FMT_DISABLE_CONVERSION_TO_INT(long double); + +template +struct EnableIf {}; + +template +struct EnableIf { typedef T type; }; + +template +struct Conditional { typedef T type; }; + +template +struct Conditional { typedef F type; }; + +// For bcc32 which doesn't understand ! in template arguments. +template +struct Not { enum { value = 0 }; }; + +template<> +struct Not { enum { value = 1 }; }; + +template struct LConvCheck { + LConvCheck(int) {} +}; + +// Returns the thousands separator for the current locale. +// We check if ``lconv`` contains ``thousands_sep`` because on Android +// ``lconv`` is stubbed as an empty struct. +template +inline StringRef thousands_sep( + LConv *lc, LConvCheck = 0) { + return lc->thousands_sep; +} + +inline fmt::StringRef thousands_sep(...) { return ""; } + +// Makes an Arg object from any type. +template +class MakeValue : public Arg { + public: + typedef typename Formatter::Char Char; + + private: + // The following two methods are private to disallow formatting of + // arbitrary pointers. If you want to output a pointer cast it to + // "void *" or "const void *". In particular, this forbids formatting + // of "[const] volatile char *" which is printed as bool by iostreams. + // Do not implement! + template + MakeValue(const T *value); + template + MakeValue(T *value); + + // The following methods are private to disallow formatting of wide + // characters and strings into narrow strings as in + // fmt::format("{}", L"test"); + // To fix this, use a wide format string: fmt::format(L"{}", L"test"). +#if !FMT_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Unsupported); +#endif + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + MakeValue(typename WCharHelper::Unsupported); + + void set_string(StringRef str) { + string.value = str.data(); + string.size = str.size(); + } + + void set_string(WStringRef str) { + wstring.value = str.data(); + wstring.size = str.size(); + } + + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg( + void *formatter, const void *arg, void *format_str_ptr) { + format(*static_cast(formatter), + *static_cast(format_str_ptr), + *static_cast(arg)); + } + + public: + MakeValue() {} + +#define FMT_MAKE_VALUE_(Type, field, TYPE, rhs) \ + MakeValue(Type value) { field = rhs; } \ + static uint64_t type(Type) { return Arg::TYPE; } + +#define FMT_MAKE_VALUE(Type, field, TYPE) \ + FMT_MAKE_VALUE_(Type, field, TYPE, value) + + FMT_MAKE_VALUE(bool, int_value, BOOL) + FMT_MAKE_VALUE(short, int_value, INT) + FMT_MAKE_VALUE(unsigned short, uint_value, UINT) + FMT_MAKE_VALUE(int, int_value, INT) + FMT_MAKE_VALUE(unsigned, uint_value, UINT) + + MakeValue(long value) { + // To minimize the number of types we need to deal with, long is + // translated either to int or to long long depending on its size. + if (const_check(sizeof(long) == sizeof(int))) + int_value = static_cast(value); + else + long_long_value = value; + } + static uint64_t type(long) { + return sizeof(long) == sizeof(int) ? Arg::INT : Arg::LONG_LONG; + } + + MakeValue(unsigned long value) { + if (const_check(sizeof(unsigned long) == sizeof(unsigned))) + uint_value = static_cast(value); + else + ulong_long_value = value; + } + static uint64_t type(unsigned long) { + return sizeof(unsigned long) == sizeof(unsigned) ? + Arg::UINT : Arg::ULONG_LONG; + } + + FMT_MAKE_VALUE(LongLong, long_long_value, LONG_LONG) + FMT_MAKE_VALUE(ULongLong, ulong_long_value, ULONG_LONG) + FMT_MAKE_VALUE(float, double_value, DOUBLE) + FMT_MAKE_VALUE(double, double_value, DOUBLE) + FMT_MAKE_VALUE(long double, long_double_value, LONG_DOUBLE) + FMT_MAKE_VALUE(signed char, int_value, INT) + FMT_MAKE_VALUE(unsigned char, uint_value, UINT) + FMT_MAKE_VALUE(char, int_value, CHAR) + +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) + MakeValue(typename WCharHelper::Supported value) { + int_value = value; + } + static uint64_t type(wchar_t) { return Arg::CHAR; } +#endif + +#define FMT_MAKE_STR_VALUE(Type, TYPE) \ + MakeValue(Type value) { set_string(value); } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_VALUE(char *, string.value, CSTRING) + FMT_MAKE_VALUE(const char *, string.value, CSTRING) + FMT_MAKE_VALUE(signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(const signed char *, sstring.value, CSTRING) + FMT_MAKE_VALUE(unsigned char *, ustring.value, CSTRING) + FMT_MAKE_VALUE(const unsigned char *, ustring.value, CSTRING) + FMT_MAKE_STR_VALUE(const std::string &, STRING) + FMT_MAKE_STR_VALUE(StringRef, STRING) + FMT_MAKE_VALUE_(CStringRef, string.value, CSTRING, value.c_str()) + +#define FMT_MAKE_WSTR_VALUE(Type, TYPE) \ + MakeValue(typename WCharHelper::Supported value) { \ + set_string(value); \ + } \ + static uint64_t type(Type) { return Arg::TYPE; } + + FMT_MAKE_WSTR_VALUE(wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const wchar_t *, WSTRING) + FMT_MAKE_WSTR_VALUE(const std::wstring &, WSTRING) + FMT_MAKE_WSTR_VALUE(WStringRef, WSTRING) + + FMT_MAKE_VALUE(void *, pointer, POINTER) + FMT_MAKE_VALUE(const void *, pointer, POINTER) + + template + MakeValue(const T &value, + typename EnableIf::value>::value, int>::type = 0) { + custom.value = &value; + custom.format = &format_custom_arg; + } + + template + MakeValue(const T &value, + typename EnableIf::value, int>::type = 0) { + int_value = value; + } + + template + static uint64_t type(const T &) { + return ConvertToInt::value ? Arg::INT : Arg::CUSTOM; + } + + // Additional template param `Char_` is needed here because make_type always + // uses char. + template + MakeValue(const NamedArg &value) { pointer = &value; } + + template + static uint64_t type(const NamedArg &) { return Arg::NAMED_ARG; } +}; + +template +class MakeArg : public Arg { +public: + MakeArg() { + type = Arg::NONE; + } + + template + MakeArg(const T &value) + : Arg(MakeValue(value)) { + type = static_cast(MakeValue::type(value)); + } +}; + +template +struct NamedArg : Arg { + BasicStringRef name; + + template + NamedArg(BasicStringRef argname, const T &value) + : Arg(MakeArg< BasicFormatter >(value)), name(argname) {} +}; + +class RuntimeError : public std::runtime_error { + protected: + RuntimeError() : std::runtime_error("") {} + ~RuntimeError() throw(); +}; + +template +class PrintfArgFormatter; + +template +class ArgMap; +} // namespace internal + +/** An argument list. */ +class ArgList { + private: + // To reduce compiled code size per formatting function call, types of first + // MAX_PACKED_ARGS arguments are passed in the types_ field. + uint64_t types_; + union { + // If the number of arguments is less than MAX_PACKED_ARGS, the argument + // values are stored in values_, otherwise they are stored in args_. + // This is done to reduce compiled code size as storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const internal::Value *values_; + const internal::Arg *args_; + }; + + internal::Arg::Type type(unsigned index) const { + unsigned shift = index * 4; + uint64_t mask = 0xf; + return static_cast( + (types_ & (mask << shift)) >> shift); + } + + template + friend class internal::ArgMap; + + public: + // Maximum number of arguments with packed types. + enum { MAX_PACKED_ARGS = 16 }; + + ArgList() : types_(0) {} + + ArgList(ULongLong types, const internal::Value *values) + : types_(types), values_(values) {} + ArgList(ULongLong types, const internal::Arg *args) + : types_(types), args_(args) {} + + /** Returns the argument at specified index. */ + internal::Arg operator[](unsigned index) const { + using internal::Arg; + Arg arg; + bool use_values = type(MAX_PACKED_ARGS - 1) == Arg::NONE; + if (index < MAX_PACKED_ARGS) { + Arg::Type arg_type = type(index); + internal::Value &val = arg; + if (arg_type != Arg::NONE) + val = use_values ? values_[index] : args_[index]; + arg.type = arg_type; + return arg; + } + if (use_values) { + // The index is greater than the number of arguments that can be stored + // in values, so return a "none" argument. + arg.type = Arg::NONE; + return arg; + } + for (unsigned i = MAX_PACKED_ARGS; i <= index; ++i) { + if (args_[i].type == Arg::NONE) + return args_[i]; + } + return args_[index]; + } +}; + +#define FMT_DISPATCH(call) static_cast(this)->call + +/** + \rst + An argument visitor based on the `curiously recurring template pattern + `_. + + To use `~fmt::ArgVisitor` define a subclass that implements some or all of the + visit methods with the same signatures as the methods in `~fmt::ArgVisitor`, + for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. Then calling + `~fmt::ArgVisitor::visit` for some argument will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::ArgVisitor` will be called. + + **Example**:: + + class MyArgVisitor : public fmt::ArgVisitor { + public: + void visit_int(int value) { fmt::print("{}", value); } + void visit_double(double value) { fmt::print("{}", value ); } + }; + \endrst + */ +template +class ArgVisitor { + private: + typedef internal::Arg Arg; + + public: + void report_unhandled_arg() {} + + Result visit_unhandled_arg() { + FMT_DISPATCH(report_unhandled_arg()); + return Result(); + } + + /** Visits an ``int`` argument. **/ + Result visit_int(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``long long`` argument. **/ + Result visit_long_long(LongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned`` argument. **/ + Result visit_uint(unsigned value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an ``unsigned long long`` argument. **/ + Result visit_ulong_long(ULongLong value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``bool`` argument. **/ + Result visit_bool(bool value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits a ``char`` or ``wchar_t`` argument. **/ + Result visit_char(int value) { + return FMT_DISPATCH(visit_any_int(value)); + } + + /** Visits an argument of any integral type. **/ + template + Result visit_any_int(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a ``double`` argument. **/ + Result visit_double(double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``long double`` argument. **/ + Result visit_long_double(long double value) { + return FMT_DISPATCH(visit_any_double(value)); + } + + /** Visits a ``double`` or ``long double`` argument. **/ + template + Result visit_any_double(T) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a null-terminated C string (``const char *``) argument. **/ + Result visit_cstring(const char *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a string argument. **/ + Result visit_string(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a wide string argument. **/ + Result visit_wstring(Arg::StringValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits a pointer argument. **/ + Result visit_pointer(const void *) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** Visits an argument of a custom (user-defined) type. **/ + Result visit_custom(Arg::CustomValue) { + return FMT_DISPATCH(visit_unhandled_arg()); + } + + /** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + the `~fmt::ArgVisitor::visit_double()` method of the *Impl* class will be + called. + \endrst + */ + Result visit(const Arg &arg) { + switch (arg.type) { + case Arg::NONE: + case Arg::NAMED_ARG: + FMT_ASSERT(false, "invalid argument type"); + break; + case Arg::INT: + return FMT_DISPATCH(visit_int(arg.int_value)); + case Arg::UINT: + return FMT_DISPATCH(visit_uint(arg.uint_value)); + case Arg::LONG_LONG: + return FMT_DISPATCH(visit_long_long(arg.long_long_value)); + case Arg::ULONG_LONG: + return FMT_DISPATCH(visit_ulong_long(arg.ulong_long_value)); + case Arg::BOOL: + return FMT_DISPATCH(visit_bool(arg.int_value != 0)); + case Arg::CHAR: + return FMT_DISPATCH(visit_char(arg.int_value)); + case Arg::DOUBLE: + return FMT_DISPATCH(visit_double(arg.double_value)); + case Arg::LONG_DOUBLE: + return FMT_DISPATCH(visit_long_double(arg.long_double_value)); + case Arg::CSTRING: + return FMT_DISPATCH(visit_cstring(arg.string.value)); + case Arg::STRING: + return FMT_DISPATCH(visit_string(arg.string)); + case Arg::WSTRING: + return FMT_DISPATCH(visit_wstring(arg.wstring)); + case Arg::POINTER: + return FMT_DISPATCH(visit_pointer(arg.pointer)); + case Arg::CUSTOM: + return FMT_DISPATCH(visit_custom(arg.custom)); + } + return Result(); + } +}; + +enum Alignment { + ALIGN_DEFAULT, ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER, ALIGN_NUMERIC +}; + +// Flags. +enum { + SIGN_FLAG = 1, PLUS_FLAG = 2, MINUS_FLAG = 4, HASH_FLAG = 8, + CHAR_FLAG = 0x10 // Argument has char type - used in error reporting. +}; + +// An empty format specifier. +struct EmptySpec {}; + +// A type specifier. +template +struct TypeSpec : EmptySpec { + Alignment align() const { return ALIGN_DEFAULT; } + unsigned width() const { return 0; } + int precision() const { return -1; } + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } + char fill() const { return ' '; } +}; + +// A width specifier. +struct WidthSpec { + unsigned width_; + // Fill is always wchar_t and cast to char if necessary to avoid having + // two specialization of WidthSpec and its subclasses. + wchar_t fill_; + + WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} + + unsigned width() const { return width_; } + wchar_t fill() const { return fill_; } +}; + +// An alignment specifier. +struct AlignSpec : WidthSpec { + Alignment align_; + + AlignSpec(unsigned width, wchar_t fill, Alignment align = ALIGN_DEFAULT) + : WidthSpec(width, fill), align_(align) {} + + Alignment align() const { return align_; } + + int precision() const { return -1; } +}; + +// An alignment and type specifier. +template +struct AlignTypeSpec : AlignSpec { + AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} + + bool flag(unsigned) const { return false; } + char type() const { return TYPE; } +}; + +// A full format specifier. +struct FormatSpec : AlignSpec { + unsigned flags_; + int precision_; + char type_; + + FormatSpec( + unsigned width = 0, char type = 0, wchar_t fill = ' ') + : AlignSpec(width, fill), flags_(0), precision_(-1), type_(type) {} + + bool flag(unsigned f) const { return (flags_ & f) != 0; } + int precision() const { return precision_; } + char type() const { return type_; } +}; + +// An integer format specifier. +template , typename Char = char> +class IntFormatSpec : public SpecT { + private: + T value_; + + public: + IntFormatSpec(T val, const SpecT &spec = SpecT()) + : SpecT(spec), value_(val) {} + + T value() const { return value_; } +}; + +// A string format specifier. +template +class StrFormatSpec : public AlignSpec { + private: + const Char *str_; + + public: + template + StrFormatSpec(const Char *str, unsigned width, FillChar fill) + : AlignSpec(width, fill), str_(str) { + internal::CharTraits::convert(FillChar()); + } + + const Char *str() const { return str_; } +}; + +/** + Returns an integer format specifier to format the value in base 2. + */ +IntFormatSpec > bin(int value); + +/** + Returns an integer format specifier to format the value in base 8. + */ +IntFormatSpec > oct(int value); + +/** + Returns an integer format specifier to format the value in base 16 using + lower-case letters for the digits above 9. + */ +IntFormatSpec > hex(int value); + +/** + Returns an integer formatter format specifier to format in base 16 using + upper-case letters for the digits above 9. + */ +IntFormatSpec > hexu(int value); + +/** + \rst + Returns an integer format specifier to pad the formatted argument with the + fill character to the specified width using the default (right) numeric + alignment. + + **Example**:: + + MemoryWriter out; + out << pad(hex(0xcafe), 8, '0'); + // out.str() == "0000cafe" + + \endrst + */ +template +IntFormatSpec, Char> pad( + int value, unsigned width, Char fill = ' '); + +#define FMT_DEFINE_INT_FORMATTERS(TYPE) \ +inline IntFormatSpec > bin(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'b'>()); \ +} \ + \ +inline IntFormatSpec > oct(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'o'>()); \ +} \ + \ +inline IntFormatSpec > hex(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'x'>()); \ +} \ + \ +inline IntFormatSpec > hexu(TYPE value) { \ + return IntFormatSpec >(value, TypeSpec<'X'>()); \ +} \ + \ +template \ +inline IntFormatSpec > pad( \ + IntFormatSpec > f, unsigned width) { \ + return IntFormatSpec >( \ + f.value(), AlignTypeSpec(width, ' ')); \ +} \ + \ +/* For compatibility with older compilers we provide two overloads for pad, */ \ +/* one that takes a fill character and one that doesn't. In the future this */ \ +/* can be replaced with one overload making the template argument Char */ \ +/* default to char (C++11). */ \ +template \ +inline IntFormatSpec, Char> pad( \ + IntFormatSpec, Char> f, \ + unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + f.value(), AlignTypeSpec(width, fill)); \ +} \ + \ +inline IntFormatSpec > pad( \ + TYPE value, unsigned width) { \ + return IntFormatSpec >( \ + value, AlignTypeSpec<0>(width, ' ')); \ +} \ + \ +template \ +inline IntFormatSpec, Char> pad( \ + TYPE value, unsigned width, Char fill) { \ + return IntFormatSpec, Char>( \ + value, AlignTypeSpec<0>(width, fill)); \ +} + +FMT_DEFINE_INT_FORMATTERS(int) +FMT_DEFINE_INT_FORMATTERS(long) +FMT_DEFINE_INT_FORMATTERS(unsigned) +FMT_DEFINE_INT_FORMATTERS(unsigned long) +FMT_DEFINE_INT_FORMATTERS(LongLong) +FMT_DEFINE_INT_FORMATTERS(ULongLong) + +/** + \rst + Returns a string formatter that pads the formatted argument with the fill + character to the specified width using the default (left) string alignment. + + **Example**:: + + std::string s = str(MemoryWriter() << pad("abc", 8)); + // s == "abc " + + \endrst + */ +template +inline StrFormatSpec pad( + const Char *str, unsigned width, Char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +inline StrFormatSpec pad( + const wchar_t *str, unsigned width, char fill = ' ') { + return StrFormatSpec(str, width, fill); +} + +namespace internal { + +template +class ArgMap { + private: + typedef std::vector< + std::pair, internal::Arg> > MapType; + typedef typename MapType::value_type Pair; + + MapType map_; + + public: + FMT_API void init(const ArgList &args); + + const internal::Arg* find(const fmt::BasicStringRef &name) const { + // The list is unsorted, so just return the first matching name. + for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); + it != end; ++it) { + if (it->first == name) + return &it->second; + } + return 0; + } +}; + +template +class ArgFormatterBase : public ArgVisitor { + private: + BasicWriter &writer_; + FormatSpec &spec_; + + FMT_DISALLOW_COPY_AND_ASSIGN(ArgFormatterBase); + + void write_pointer(const void *p) { + spec_.flags_ = HASH_FLAG; + spec_.type_ = 'x'; + writer_.write_int(reinterpret_cast(p), spec_); + } + + protected: + BasicWriter &writer() { return writer_; } + FormatSpec &spec() { return spec_; } + + void write(bool value) { + const char *str_value = value ? "true" : "false"; + Arg::StringValue str = { str_value, std::strlen(str_value) }; + writer_.write_str(str, spec_); + } + + void write(const char *value) { + Arg::StringValue str = {value, value != 0 ? std::strlen(value) : 0}; + writer_.write_str(str, spec_); + } + + public: + ArgFormatterBase(BasicWriter &w, FormatSpec &s) + : writer_(w), spec_(s) {} + + template + void visit_any_int(T value) { writer_.write_int(value, spec_); } + + template + void visit_any_double(T value) { writer_.write_double(value, spec_); } + + void visit_bool(bool value) { + if (spec_.type_) + return visit_any_int(value); + write(value); + } + + void visit_char(int value) { + if (spec_.type_ && spec_.type_ != 'c') { + spec_.flags_ |= CHAR_FLAG; + writer_.write_int(value, spec_); + return; + } + if (spec_.align_ == ALIGN_NUMERIC || spec_.flags_ != 0) + FMT_THROW(FormatError("invalid format specifier for char")); + typedef typename BasicWriter::CharPtr CharPtr; + Char fill = internal::CharTraits::cast(spec_.fill()); + CharPtr out = CharPtr(); + const unsigned CHAR_SIZE = 1; + if (spec_.width_ > CHAR_SIZE) { + out = writer_.grow_buffer(spec_.width_); + if (spec_.align_ == ALIGN_RIGHT) { + std::uninitialized_fill_n(out, spec_.width_ - CHAR_SIZE, fill); + out += spec_.width_ - CHAR_SIZE; + } else if (spec_.align_ == ALIGN_CENTER) { + out = writer_.fill_padding(out, spec_.width_, + internal::const_check(CHAR_SIZE), fill); + } else { + std::uninitialized_fill_n(out + CHAR_SIZE, + spec_.width_ - CHAR_SIZE, fill); + } + } else { + out = writer_.grow_buffer(CHAR_SIZE); + } + *out = internal::CharTraits::cast(value); + } + + void visit_cstring(const char *value) { + if (spec_.type_ == 'p') + return write_pointer(value); + write(value); + } + + void visit_string(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + using ArgVisitor::visit_wstring; + + void visit_wstring(Arg::StringValue value) { + writer_.write_str(value, spec_); + } + + void visit_pointer(const void *value) { + if (spec_.type_ && spec_.type_ != 'p') + report_unknown_type(spec_.type_, "pointer"); + write_pointer(value); + } +}; + +class FormatterBase { + private: + ArgList args_; + int next_arg_index_; + + // Returns the argument with specified index. + FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); + + protected: + const ArgList &args() const { return args_; } + + explicit FormatterBase(const ArgList &args) { + args_ = args; + next_arg_index_ = 0; + } + + // Returns the next argument. + Arg next_arg(const char *&error) { + if (next_arg_index_ >= 0) + return do_get_arg(internal::to_unsigned(next_arg_index_++), error); + error = "cannot switch from manual to automatic argument indexing"; + return Arg(); + } + + // Checks if manual indexing is used and returns the argument with + // specified index. + Arg get_arg(unsigned arg_index, const char *&error) { + return check_no_auto_index(error) ? do_get_arg(arg_index, error) : Arg(); + } + + bool check_no_auto_index(const char *&error) { + if (next_arg_index_ > 0) { + error = "cannot switch from automatic to manual argument indexing"; + return false; + } + next_arg_index_ = -1; + return true; + } + + template + void write(BasicWriter &w, const Char *start, const Char *end) { + if (start != end) + w << BasicStringRef(start, internal::to_unsigned(end - start)); + } +}; + +// A printf formatter. +template +class PrintfFormatter : private FormatterBase { + private: + void parse_flags(FormatSpec &spec, const Char *&s); + + // Returns the argument with specified index or, if arg_index is equal + // to the maximum unsigned value, the next argument. + Arg get_arg(const Char *s, + unsigned arg_index = (std::numeric_limits::max)()); + + // Parses argument index, flags and width and returns the argument index. + unsigned parse_header(const Char *&s, FormatSpec &spec); + + public: + explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} + FMT_API void format(BasicWriter &writer, + BasicCStringRef format_str); +}; +} // namespace internal + +/** + \rst + An argument formatter based on the `curiously recurring template pattern + `_. + + To use `~fmt::BasicArgFormatter` define a subclass that implements some or + all of the visit methods with the same signatures as the methods in + `~fmt::ArgVisitor`, for example, `~fmt::ArgVisitor::visit_int()`. + Pass the subclass as the *Impl* template parameter. When a formatting + function processes an argument, it will dispatch to a visit method + specific to the argument type. For example, if the argument type is + ``double`` then the `~fmt::ArgVisitor::visit_double()` method of a subclass + will be called. If the subclass doesn't contain a method with this signature, + then a corresponding method of `~fmt::BasicArgFormatter` or its superclass + will be called. + \endrst + */ +template +class BasicArgFormatter : public internal::ArgFormatterBase { + private: + BasicFormatter &formatter_; + const Char *format_; + + public: + /** + \rst + Constructs an argument formatter object. + *formatter* is a reference to the main formatter object, *spec* contains + format specifier information for standard argument types, and *fmt* points + to the part of the format string being parsed for custom argument types. + \endrst + */ + BasicArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : internal::ArgFormatterBase(formatter.writer(), spec), + formatter_(formatter), format_(fmt) {} + + /** Formats argument of a custom (user-defined) type. */ + void visit_custom(internal::Arg::CustomValue c) { + c.format(&formatter_, c.value, &format_); + } +}; + +/** The default argument formatter. */ +template +class ArgFormatter : public BasicArgFormatter, Char> { + public: + /** Constructs an argument formatter object. */ + ArgFormatter(BasicFormatter &formatter, + FormatSpec &spec, const Char *fmt) + : BasicArgFormatter, Char>(formatter, spec, fmt) {} +}; + +/** This template formats data and writes the output to a writer. */ +template +class BasicFormatter : private internal::FormatterBase { + public: + /** The character type for the output. */ + typedef CharType Char; + + private: + BasicWriter &writer_; + internal::ArgMap map_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicFormatter); + + using internal::FormatterBase::get_arg; + + // Checks if manual indexing is used and returns the argument with + // specified name. + internal::Arg get_arg(BasicStringRef arg_name, const char *&error); + + // Parses argument index and returns corresponding argument. + internal::Arg parse_arg_index(const Char *&s); + + // Parses argument name and returns corresponding argument. + internal::Arg parse_arg_name(const Char *&s); + + public: + /** + \rst + Constructs a ``BasicFormatter`` object. References to the arguments and + the writer are stored in the formatter object so make sure they have + appropriate lifetimes. + \endrst + */ + BasicFormatter(const ArgList &args, BasicWriter &w) + : internal::FormatterBase(args), writer_(w) {} + + /** Returns a reference to the writer associated with this formatter. */ + BasicWriter &writer() { return writer_; } + + /** Formats stored arguments and writes the output to the writer. */ + void format(BasicCStringRef format_str); + + // Formats a single argument and advances format_str, a format string pointer. + const Char *format(const Char *&format_str, const internal::Arg &arg); +}; + +// Generates a comma-separated list with results of applying f to +// numbers 0..n-1. +# define FMT_GEN(n, f) FMT_GEN##n(f) +# define FMT_GEN1(f) f(0) +# define FMT_GEN2(f) FMT_GEN1(f), f(1) +# define FMT_GEN3(f) FMT_GEN2(f), f(2) +# define FMT_GEN4(f) FMT_GEN3(f), f(3) +# define FMT_GEN5(f) FMT_GEN4(f), f(4) +# define FMT_GEN6(f) FMT_GEN5(f), f(5) +# define FMT_GEN7(f) FMT_GEN6(f), f(6) +# define FMT_GEN8(f) FMT_GEN7(f), f(7) +# define FMT_GEN9(f) FMT_GEN8(f), f(8) +# define FMT_GEN10(f) FMT_GEN9(f), f(9) +# define FMT_GEN11(f) FMT_GEN10(f), f(10) +# define FMT_GEN12(f) FMT_GEN11(f), f(11) +# define FMT_GEN13(f) FMT_GEN12(f), f(12) +# define FMT_GEN14(f) FMT_GEN13(f), f(13) +# define FMT_GEN15(f) FMT_GEN14(f), f(14) + +namespace internal { +inline uint64_t make_type() { return 0; } + +template +inline uint64_t make_type(const T &arg) { + return MakeValue< BasicFormatter >::type(arg); +} + +template +struct ArgArray; + +template +struct ArgArray { + typedef Value Type[N > 0 ? N : 1]; + + template + static Value make(const T &value) { +#ifdef __clang__ + Value result = MakeValue(value); + // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: + // https://github.com/fmtlib/fmt/issues/276 + (void)result.custom.format; + return result; +#else + return MakeValue(value); +#endif + } +}; + +template +struct ArgArray { + typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE + + template + static Arg make(const T &value) { return MakeArg(value); } +}; + +#if FMT_USE_VARIADIC_TEMPLATES +template +inline uint64_t make_type(const Arg &first, const Args & ... tail) { + return make_type(first) | (make_type(tail...) << 4); +} + +#else + +struct ArgType { + uint64_t type; + + ArgType() : type(0) {} + + template + ArgType(const T &arg) : type(make_type(arg)) {} +}; + +# define FMT_ARG_TYPE_DEFAULT(n) ArgType t##n = ArgType() + +inline uint64_t make_type(FMT_GEN15(FMT_ARG_TYPE_DEFAULT)) { + return t0.type | (t1.type << 4) | (t2.type << 8) | (t3.type << 12) | + (t4.type << 16) | (t5.type << 20) | (t6.type << 24) | (t7.type << 28) | + (t8.type << 32) | (t9.type << 36) | (t10.type << 40) | (t11.type << 44) | + (t12.type << 48) | (t13.type << 52) | (t14.type << 56); +} +#endif +} // namespace internal + +# define FMT_MAKE_TEMPLATE_ARG(n) typename T##n +# define FMT_MAKE_ARG_TYPE(n) T##n +# define FMT_MAKE_ARG(n) const T##n &v##n +# define FMT_ASSIGN_char(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_ASSIGN_wchar_t(n) \ + arr[n] = fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) + +#if FMT_USE_VARIADIC_TEMPLATES +// Defines a variadic function returning void. +# define FMT_VARIADIC_VOID(func, arg_type) \ + template \ + void func(arg_type arg0, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +// Defines a variadic constructor. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } + +#else + +# define FMT_MAKE_REF(n) \ + fmt::internal::MakeValue< fmt::BasicFormatter >(v##n) +# define FMT_MAKE_REF2(n) v##n + +// Defines a wrapper for a function taking one argument of type arg_type +// and n additional arguments of arbitrary types. +# define FMT_WRAP1(func, arg_type, n) \ + template \ + inline void func(arg_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic function returning void on a pre-C++11 compiler. +# define FMT_VARIADIC_VOID(func, arg_type) \ + inline void func(arg_type arg) { func(arg, fmt::ArgList()); } \ + FMT_WRAP1(func, arg_type, 1) FMT_WRAP1(func, arg_type, 2) \ + FMT_WRAP1(func, arg_type, 3) FMT_WRAP1(func, arg_type, 4) \ + FMT_WRAP1(func, arg_type, 5) FMT_WRAP1(func, arg_type, 6) \ + FMT_WRAP1(func, arg_type, 7) FMT_WRAP1(func, arg_type, 8) \ + FMT_WRAP1(func, arg_type, 9) FMT_WRAP1(func, arg_type, 10) + +# define FMT_CTOR(ctor, func, arg0_type, arg1_type, n) \ + template \ + ctor(arg0_type arg0, arg1_type arg1, FMT_GEN(n, FMT_MAKE_ARG)) { \ + const fmt::internal::ArgArray::Type array = {FMT_GEN(n, FMT_MAKE_REF)}; \ + func(arg0, arg1, fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), array)); \ + } + +// Emulates a variadic constructor on a pre-C++11 compiler. +# define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 1) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 2) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 3) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 4) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 5) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 6) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 7) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 8) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 9) \ + FMT_CTOR(ctor, func, arg0_type, arg1_type, 10) +#endif + +// Generates a comma-separated list with results of applying f to pairs +// (argument, index). +#define FMT_FOR_EACH1(f, x0) f(x0, 0) +#define FMT_FOR_EACH2(f, x0, x1) \ + FMT_FOR_EACH1(f, x0), f(x1, 1) +#define FMT_FOR_EACH3(f, x0, x1, x2) \ + FMT_FOR_EACH2(f, x0 ,x1), f(x2, 2) +#define FMT_FOR_EACH4(f, x0, x1, x2, x3) \ + FMT_FOR_EACH3(f, x0, x1, x2), f(x3, 3) +#define FMT_FOR_EACH5(f, x0, x1, x2, x3, x4) \ + FMT_FOR_EACH4(f, x0, x1, x2, x3), f(x4, 4) +#define FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5) \ + FMT_FOR_EACH5(f, x0, x1, x2, x3, x4), f(x5, 5) +#define FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6) \ + FMT_FOR_EACH6(f, x0, x1, x2, x3, x4, x5), f(x6, 6) +#define FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7) \ + FMT_FOR_EACH7(f, x0, x1, x2, x3, x4, x5, x6), f(x7, 7) +#define FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8) \ + FMT_FOR_EACH8(f, x0, x1, x2, x3, x4, x5, x6, x7), f(x8, 8) +#define FMT_FOR_EACH10(f, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) \ + FMT_FOR_EACH9(f, x0, x1, x2, x3, x4, x5, x6, x7, x8), f(x9, 9) + +/** + An error returned by an operating system or a language runtime, + for example a file opening error. +*/ +class SystemError : public internal::RuntimeError { + private: + void init(int err_code, CStringRef format_str, ArgList args); + + protected: + int error_code_; + + typedef char Char; // For FMT_VARIADIC_CTOR. + + SystemError() {} + + public: + /** + \rst + Constructs a :class:`fmt::SystemError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is + the system message corresponding to the error code. + *error_code* is a system error code as given by ``errno``. + If *error_code* is not a valid error code such as -1, the system message + may look like "Unknown error -1" and is platform-dependent. + + **Example**:: + + // This throws a SystemError with the description + // cannot open file 'madeup': No such file or directory + // or similar (system message may vary). + const char *filename = "madeup"; + std::FILE *file = std::fopen(filename, "r"); + if (!file) + throw fmt::SystemError(errno, "cannot open file '{}'", filename); + \endrst + */ + SystemError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(SystemError, init, int, CStringRef) + + ~SystemError() throw(); + + int error_code() const { return error_code_; } +}; + +/** + \rst + This template provides operations for formatting and writing data into + a character stream. The output is stored in a buffer provided by a subclass + such as :class:`fmt::BasicMemoryWriter`. + + You can use one of the following typedefs for common character types: + + +---------+----------------------+ + | Type | Definition | + +=========+======================+ + | Writer | BasicWriter | + +---------+----------------------+ + | WWriter | BasicWriter | + +---------+----------------------+ + + \endrst + */ +template +class BasicWriter { + private: + // Output buffer. + Buffer &buffer_; + + FMT_DISALLOW_COPY_AND_ASSIGN(BasicWriter); + + typedef typename internal::CharTraits::CharPtr CharPtr; + +#if FMT_SECURE_SCL + // Returns pointer value. + static Char *get(CharPtr p) { return p.base(); } +#else + static Char *get(Char *p) { return p; } +#endif + + // Fills the padding around the content and returns the pointer to the + // content area. + static CharPtr fill_padding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); + + // Grows the buffer by n characters and returns a pointer to the newly + // allocated area. + CharPtr grow_buffer(std::size_t n) { + std::size_t size = buffer_.size(); + buffer_.resize(size + n); + return internal::make_ptr(&buffer_[size], n); + } + + // Writes an unsigned decimal integer. + template + Char *write_unsigned_decimal(UInt value, unsigned prefix_size = 0) { + unsigned num_digits = internal::count_digits(value); + Char *ptr = get(grow_buffer(prefix_size + num_digits)); + internal::format_decimal(ptr + prefix_size, value, num_digits); + return ptr; + } + + // Writes a decimal integer. + template + void write_decimal(Int value) { + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) { + abs_value = 0 - abs_value; + *write_unsigned_decimal(abs_value, 1) = '-'; + } else { + write_unsigned_decimal(abs_value, 0); + } + } + + // Prepare a buffer for integer formatting. + CharPtr prepare_int_buffer(unsigned num_digits, + const EmptySpec &, const char *prefix, unsigned prefix_size) { + unsigned size = prefix_size + num_digits; + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + + template + CharPtr prepare_int_buffer(unsigned num_digits, + const Spec &spec, const char *prefix, unsigned prefix_size); + + // Formats an integer. + template + void write_int(T value, Spec spec); + + // Formats a floating-point number (double or long double). + template + void write_double(T value, const FormatSpec &spec); + + // Writes a formatted string. + template + CharPtr write_str(const StrChar *s, std::size_t size, const AlignSpec &spec); + + template + void write_str(const internal::Arg::StringValue &str, + const FormatSpec &spec); + + // This following methods are private to disallow writing wide characters + // and strings to a char stream. If you want to print a wide string as a + // pointer as std::ostream does, cast it to const void*. + // Do not implement! + void operator<<(typename internal::WCharHelper::Unsupported); + void operator<<( + typename internal::WCharHelper::Unsupported); + + // Appends floating-point length specifier to the format string. + // The second argument is only used for overload resolution. + void append_float_length(Char *&format_ptr, long double) { + *format_ptr++ = 'L'; + } + + template + void append_float_length(Char *&, T) {} + + template + friend class internal::ArgFormatterBase; + + friend class internal::PrintfArgFormatter; + + protected: + /** + Constructs a ``BasicWriter`` object. + */ + explicit BasicWriter(Buffer &b) : buffer_(b) {} + + public: + /** + \rst + Destroys a ``BasicWriter`` object. + \endrst + */ + virtual ~BasicWriter() {} + + /** + Returns the total number of characters written. + */ + std::size_t size() const { return buffer_.size(); } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const Char *data() const FMT_NOEXCEPT { return &buffer_[0]; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const Char *c_str() const { + std::size_t size = buffer_.size(); + buffer_.reserve(size + 1); + buffer_[size] = '\0'; + return &buffer_[0]; + } + + /** + \rst + Returns the content of the output buffer as an `std::string`. + \endrst + */ + std::basic_string str() const { + return std::basic_string(&buffer_[0], buffer_.size()); + } + + /** + \rst + Writes formatted data. + + *args* is an argument list representing arbitrary arguments. + + **Example**:: + + MemoryWriter out; + out.write("Current point:\n"); + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + Current point: + (-3.140000, +3.140000) + + The output can be accessed using :func:`data()`, :func:`c_str` or + :func:`str` methods. + + See also :ref:`syntax`. + \endrst + */ + void write(BasicCStringRef format, ArgList args) { + BasicFormatter(args, *this).format(format); + } + FMT_VARIADIC_VOID(write, BasicCStringRef) + + BasicWriter &operator<<(int value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(long value) { + write_decimal(value); + return *this; + } + BasicWriter &operator<<(unsigned long value) { + return *this << IntFormatSpec(value); + } + BasicWriter &operator<<(LongLong value) { + write_decimal(value); + return *this; + } + + /** + \rst + Formats *value* and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(ULongLong value) { + return *this << IntFormatSpec(value); + } + + BasicWriter &operator<<(double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + \rst + Formats *value* using the general format for floating-point numbers + (``'g'``) and writes it to the stream. + \endrst + */ + BasicWriter &operator<<(long double value) { + write_double(value, FormatSpec()); + return *this; + } + + /** + Writes a character to the stream. + */ + BasicWriter &operator<<(char value) { + buffer_.push_back(value); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + buffer_.push_back(value); + return *this; + } + + /** + \rst + Writes *value* to the stream. + \endrst + */ + BasicWriter &operator<<(fmt::BasicStringRef value) { + const Char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + BasicWriter &operator<<( + typename internal::WCharHelper::Supported value) { + const char *str = value.data(); + buffer_.append(str, str + value.size()); + return *this; + } + + template + BasicWriter &operator<<(IntFormatSpec spec) { + internal::CharTraits::convert(FillChar()); + write_int(spec.value(), spec); + return *this; + } + + template + BasicWriter &operator<<(const StrFormatSpec &spec) { + const StrChar *s = spec.str(); + write_str(s, std::char_traits::length(s), spec); + return *this; + } + + void clear() FMT_NOEXCEPT { buffer_.clear(); } + + Buffer &buffer() FMT_NOEXCEPT { return buffer_; } +}; + +template +template +typename BasicWriter::CharPtr BasicWriter::write_str( + const StrChar *s, std::size_t size, const AlignSpec &spec) { + CharPtr out = CharPtr(); + if (spec.width() > size) { + out = grow_buffer(spec.width()); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.align() == ALIGN_RIGHT) { + std::uninitialized_fill_n(out, spec.width() - size, fill); + out += spec.width() - size; + } else if (spec.align() == ALIGN_CENTER) { + out = fill_padding(out, spec.width(), size, fill); + } else { + std::uninitialized_fill_n(out + size, spec.width() - size, fill); + } + } else { + out = grow_buffer(size); + } + std::uninitialized_copy(s, s + size, out); + return out; +} + +template +template +void BasicWriter::write_str( + const internal::Arg::StringValue &s, const FormatSpec &spec) { + // Check if StrChar is convertible to Char. + internal::CharTraits::convert(StrChar()); + if (spec.type_ && spec.type_ != 's') + internal::report_unknown_type(spec.type_, "string"); + const StrChar *str_value = s.value; + std::size_t str_size = s.size; + if (str_size == 0) { + if (!str_value) { + FMT_THROW(FormatError("string pointer is null")); + } + } + std::size_t precision = static_cast(spec.precision_); + if (spec.precision_ >= 0 && precision < str_size) + str_size = precision; + write_str(str_value, str_size, spec); +} + +template +typename BasicWriter::CharPtr + BasicWriter::fill_padding( + CharPtr buffer, unsigned total_size, + std::size_t content_size, wchar_t fill) { + std::size_t padding = total_size - content_size; + std::size_t left_padding = padding / 2; + Char fill_char = internal::CharTraits::cast(fill); + std::uninitialized_fill_n(buffer, left_padding, fill_char); + buffer += left_padding; + CharPtr content = buffer; + std::uninitialized_fill_n(buffer + content_size, + padding - left_padding, fill_char); + return content; +} + +template +template +typename BasicWriter::CharPtr + BasicWriter::prepare_int_buffer( + unsigned num_digits, const Spec &spec, + const char *prefix, unsigned prefix_size) { + unsigned width = spec.width(); + Alignment align = spec.align(); + Char fill = internal::CharTraits::cast(spec.fill()); + if (spec.precision() > static_cast(num_digits)) { + // Octal prefix '0' is counted as a digit, so ignore it if precision + // is specified. + if (prefix_size > 0 && prefix[prefix_size - 1] == '0') + --prefix_size; + unsigned number_size = + prefix_size + internal::to_unsigned(spec.precision()); + AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); + if (number_size >= width) + return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); + buffer_.reserve(width); + unsigned fill_size = width - number_size; + if (align != ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + CharPtr result = prepare_int_buffer( + num_digits, subspec, prefix, prefix_size); + if (align == ALIGN_LEFT) { + CharPtr p = grow_buffer(fill_size); + std::uninitialized_fill(p, p + fill_size, fill); + } + return result; + } + unsigned size = prefix_size + num_digits; + if (width <= size) { + CharPtr p = grow_buffer(size); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + return p + size - 1; + } + CharPtr p = grow_buffer(width); + CharPtr end = p + width; + if (align == ALIGN_LEFT) { + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + std::uninitialized_fill(p, end, fill); + } else if (align == ALIGN_CENTER) { + p = fill_padding(p, width, size, fill); + std::uninitialized_copy(prefix, prefix + prefix_size, p); + p += size; + } else { + if (align == ALIGN_NUMERIC) { + if (prefix_size != 0) { + p = std::uninitialized_copy(prefix, prefix + prefix_size, p); + size -= prefix_size; + } + } else { + std::uninitialized_copy(prefix, prefix + prefix_size, end - size); + } + std::uninitialized_fill(p, end - size, fill); + p = end; + } + return p - 1; +} + +template +template +void BasicWriter::write_int(T value, Spec spec) { + unsigned prefix_size = 0; + typedef typename internal::IntTraits::MainType UnsignedType; + UnsignedType abs_value = static_cast(value); + char prefix[4] = ""; + if (internal::is_negative(value)) { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } else if (spec.flag(SIGN_FLAG)) { + prefix[0] = spec.flag(PLUS_FLAG) ? '+' : ' '; + ++prefix_size; + } + switch (spec.type()) { + case 0: case 'd': { + unsigned num_digits = internal::count_digits(abs_value); + CharPtr p = prepare_int_buffer(num_digits, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0); + break; + } + case 'x': case 'X': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 4) != 0); + Char *p = get(prepare_int_buffer( + num_digits, spec, prefix, prefix_size)); + n = abs_value; + const char *digits = spec.type() == 'x' ? + "0123456789abcdef" : "0123456789ABCDEF"; + do { + *p-- = digits[n & 0xf]; + } while ((n >>= 4) != 0); + break; + } + case 'b': case 'B': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = spec.type(); + } + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 1) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 1)); + } while ((n >>= 1) != 0); + break; + } + case 'o': { + UnsignedType n = abs_value; + if (spec.flag(HASH_FLAG)) + prefix[prefix_size++] = '0'; + unsigned num_digits = 0; + do { + ++num_digits; + } while ((n >>= 3) != 0); + Char *p = get(prepare_int_buffer(num_digits, spec, prefix, prefix_size)); + n = abs_value; + do { + *p-- = static_cast('0' + (n & 7)); + } while ((n >>= 3) != 0); + break; + } + case 'n': { + unsigned num_digits = internal::count_digits(abs_value); + fmt::StringRef sep = ""; +#ifndef ANDROID + sep = internal::thousands_sep(std::localeconv()); +#endif + unsigned size = static_cast( + num_digits + sep.size() * ((num_digits - 1) / 3)); + CharPtr p = prepare_int_buffer(size, spec, prefix, prefix_size) + 1; + internal::format_decimal(get(p), abs_value, 0, internal::ThousandsSep(sep)); + break; + } + default: + internal::report_unknown_type( + spec.type(), spec.flag(CHAR_FLAG) ? "char" : "integer"); + break; + } +} + +template +template +void BasicWriter::write_double(T value, const FormatSpec &spec) { + // Check type. + char type = spec.type(); + bool upper = false; + switch (type) { + case 0: + type = 'g'; + break; + case 'e': case 'f': case 'g': case 'a': + break; + case 'F': +#if FMT_MSC_VER + // MSVC's printf doesn't support 'F'. + type = 'f'; +#endif + // Fall through. + case 'E': case 'G': case 'A': + upper = true; + break; + default: + internal::report_unknown_type(type, "double"); + break; + } + + char sign = 0; + // Use isnegative instead of value < 0 because the latter is always + // false for NaN. + if (internal::FPUtil::isnegative(static_cast(value))) { + sign = '-'; + value = -value; + } else if (spec.flag(SIGN_FLAG)) { + sign = spec.flag(PLUS_FLAG) ? '+' : ' '; + } + + if (internal::FPUtil::isnotanumber(value)) { + // Format NaN ourselves because sprintf's output is not consistent + // across platforms. + std::size_t nan_size = 4; + const char *nan = upper ? " NAN" : " nan"; + if (!sign) { + --nan_size; + ++nan; + } + CharPtr out = write_str(nan, nan_size, spec); + if (sign) + *out = sign; + return; + } + + if (internal::FPUtil::isinfinity(value)) { + // Format infinity ourselves because sprintf's output is not consistent + // across platforms. + std::size_t inf_size = 4; + const char *inf = upper ? " INF" : " inf"; + if (!sign) { + --inf_size; + ++inf; + } + CharPtr out = write_str(inf, inf_size, spec); + if (sign) + *out = sign; + return; + } + + std::size_t offset = buffer_.size(); + unsigned width = spec.width(); + if (sign) { + buffer_.reserve(buffer_.size() + (width > 1u ? width : 1u)); + if (width > 0) + --width; + ++offset; + } + + // Build format string. + enum { MAX_FORMAT_SIZE = 10}; // longest format: %#-*.*Lg + Char format[MAX_FORMAT_SIZE]; + Char *format_ptr = format; + *format_ptr++ = '%'; + unsigned width_for_sprintf = width; + if (spec.flag(HASH_FLAG)) + *format_ptr++ = '#'; + if (spec.align() == ALIGN_CENTER) { + width_for_sprintf = 0; + } else { + if (spec.align() == ALIGN_LEFT) + *format_ptr++ = '-'; + if (width != 0) + *format_ptr++ = '*'; + } + if (spec.precision() >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + + append_float_length(format_ptr, value); + *format_ptr++ = type; + *format_ptr = '\0'; + + // Format using snprintf. + Char fill = internal::CharTraits::cast(spec.fill()); + unsigned n = 0; + Char *start = 0; + for (;;) { + std::size_t buffer_size = buffer_.capacity() - offset; +#if FMT_MSC_VER + // MSVC's vsnprintf_s doesn't work with zero size, so reserve + // space for at least one extra character to make the size non-zero. + // Note that the buffer's capacity will increase by more than 1. + if (buffer_size == 0) { + buffer_.reserve(offset + 1); + buffer_size = buffer_.capacity() - offset; + } +#endif + start = &buffer_[offset]; + int result = internal::CharTraits::format_float( + start, buffer_size, format, width_for_sprintf, spec.precision(), value); + if (result >= 0) { + n = internal::to_unsigned(result); + if (offset + n < buffer_.capacity()) + break; // The buffer is large enough - continue with formatting. + buffer_.reserve(offset + n + 1); + } else { + // If result is negative we ask to increase the capacity by at least 1, + // but as std::vector, the buffer grows exponentially. + buffer_.reserve(buffer_.capacity() + 1); + } + } + if (sign) { + if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || + *start != ' ') { + *(start - 1) = sign; + sign = 0; + } else { + *(start - 1) = fill; + } + ++n; + } + if (spec.align() == ALIGN_CENTER && spec.width() > n) { + width = spec.width(); + CharPtr p = grow_buffer(width); + std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); + fill_padding(p, spec.width(), n, fill); + return; + } + if (spec.fill() != ' ' || sign) { + while (*start == ' ') + *start++ = fill; + if (sign) + *(start - 1) = sign; + } + grow_buffer(n); +} + +/** + \rst + This class template provides operations for formatting and writing data + into a character stream. The output is stored in a memory buffer that grows + dynamically. + + You can use one of the following typedefs for common character types + and the standard allocator: + + +---------------+-----------------------------------------------------+ + | Type | Definition | + +===============+=====================================================+ + | MemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + | WMemoryWriter | BasicMemoryWriter> | + +---------------+-----------------------------------------------------+ + + **Example**:: + + MemoryWriter out; + out << "The answer is " << 42 << "\n"; + out.write("({:+f}, {:+f})", -3.14, 3.14); + + This will write the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42 + (-3.140000, +3.140000) + + The output can be converted to an ``std::string`` with ``out.str()`` or + accessed as a C string with ``out.c_str()``. + \endrst + */ +template > +class BasicMemoryWriter : public BasicWriter { + private: + internal::MemoryBuffer buffer_; + + public: + explicit BasicMemoryWriter(const Allocator& alloc = Allocator()) + : BasicWriter(buffer_), buffer_(alloc) {} + +#if FMT_USE_RVALUE_REFERENCES + /** + \rst + Constructs a :class:`fmt::BasicMemoryWriter` object moving the content + of the other object to it. + \endrst + */ + BasicMemoryWriter(BasicMemoryWriter &&other) + : BasicWriter(buffer_), buffer_(std::move(other.buffer_)) { + } + + /** + \rst + Moves the content of the other ``BasicMemoryWriter`` object to this one. + \endrst + */ + BasicMemoryWriter &operator=(BasicMemoryWriter &&other) { + buffer_ = std::move(other.buffer_); + return *this; + } +#endif +}; + +typedef BasicMemoryWriter MemoryWriter; +typedef BasicMemoryWriter WMemoryWriter; + +/** + \rst + This class template provides operations for formatting and writing data + into a fixed-size array. For writing into a dynamically growing buffer + use :class:`fmt::BasicMemoryWriter`. + + Any write method will throw ``std::runtime_error`` if the output doesn't fit + into the array. + + You can use one of the following typedefs for common character types: + + +--------------+---------------------------+ + | Type | Definition | + +==============+===========================+ + | ArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + | WArrayWriter | BasicArrayWriter | + +--------------+---------------------------+ + \endrst + */ +template +class BasicArrayWriter : public BasicWriter { + private: + internal::FixedBuffer buffer_; + + public: + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + given size. + \endrst + */ + BasicArrayWriter(Char *array, std::size_t size) + : BasicWriter(buffer_), buffer_(array, size) {} + + /** + \rst + Constructs a :class:`fmt::BasicArrayWriter` object for *array* of the + size known at compile time. + \endrst + */ + template + explicit BasicArrayWriter(Char (&array)[SIZE]) + : BasicWriter(buffer_), buffer_(array, SIZE) {} +}; + +typedef BasicArrayWriter ArrayWriter; +typedef BasicArrayWriter WArrayWriter; + +// Reports a system error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_system_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#if FMT_USE_WINDOWS_H + +/** A Windows error. */ +class WindowsError : public SystemError { + private: + FMT_API void init(int error_code, CStringRef format_str, ArgList args); + + public: + /** + \rst + Constructs a :class:`fmt::WindowsError` object with the description + of the form + + .. parsed-literal:: + **: ** + + where ** is the formatted message and ** is the + system message corresponding to the error code. + *error_code* is a Windows error code as given by ``GetLastError``. + If *error_code* is not a valid error code such as -1, the system message + will look like "error -1". + + **Example**:: + + // This throws a WindowsError with the description + // cannot open file 'madeup': The system cannot find the file specified. + // or similar (system message may vary). + const char *filename = "madeup"; + LPOFSTRUCT of = LPOFSTRUCT(); + HFILE file = OpenFile(filename, &of, OF_READ); + if (file == HFILE_ERROR) { + throw fmt::WindowsError(GetLastError(), + "cannot open file '{}'", filename); + } + \endrst + */ + WindowsError(int error_code, CStringRef message) { + init(error_code, message, ArgList()); + } + FMT_VARIADIC_CTOR(WindowsError, init, int, CStringRef) +}; + +// Reports a Windows error without throwing an exception. +// Can be used to report errors from destructors. +FMT_API void report_windows_error(int error_code, + StringRef message) FMT_NOEXCEPT; + +#endif + +enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; + +/** + Formats a string and prints it to stdout using ANSI escape sequences + to specify color (experimental). + Example: + print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); + */ +FMT_API void print_colored(Color c, CStringRef format, ArgList args); + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = format("The answer is {}", 42); + \endrst +*/ +inline std::string format(CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +inline std::wstring format(WCStringRef format_str, ArgList args) { + WMemoryWriter w; + w.write(format_str, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + print(stderr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +FMT_API void print(CStringRef format_str, ArgList args); + +template +void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { + internal::PrintfFormatter(args).format(w, format); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + std::string message = fmt::sprintf("The answer is %d", 42); + \endrst +*/ +inline std::string sprintf(CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + return w.str(); +} + +inline std::wstring sprintf(WCStringRef format, ArgList args) { + WMemoryWriter w; + printf(w, format, args); + return w.str(); +} + +/** + \rst + Prints formatted data to the file *f*. + + **Example**:: + + fmt::fprintf(stderr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); + +/** + \rst + Prints formatted data to ``stdout``. + + **Example**:: + + fmt::printf("Elapsed time: %.2f seconds", 1.23); + \endrst + */ +inline int printf(CStringRef format, ArgList args) { + return fprintf(stdout, format, args); +} + +/** + Fast integer formatter. + */ +class FormatInt { + private: + // Buffer should be large enough to hold all digits (digits10 + 1), + // a sign and a null character. + enum {BUFFER_SIZE = std::numeric_limits::digits10 + 3}; + mutable char buffer_[BUFFER_SIZE]; + char *str_; + + // Formats value in reverse and returns the number of digits. + char *format_decimal(ULongLong value) { + char *buffer_end = buffer_ + BUFFER_SIZE - 1; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + unsigned index = static_cast((value % 100) * 2); + value /= 100; + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + } + if (value < 10) { + *--buffer_end = static_cast('0' + value); + return buffer_end; + } + unsigned index = static_cast(value * 2); + *--buffer_end = internal::Data::DIGITS[index + 1]; + *--buffer_end = internal::Data::DIGITS[index]; + return buffer_end; + } + + void FormatSigned(LongLong value) { + ULongLong abs_value = static_cast(value); + bool negative = value < 0; + if (negative) + abs_value = 0 - abs_value; + str_ = format_decimal(abs_value); + if (negative) + *--str_ = '-'; + } + + public: + explicit FormatInt(int value) { FormatSigned(value); } + explicit FormatInt(long value) { FormatSigned(value); } + explicit FormatInt(LongLong value) { FormatSigned(value); } + explicit FormatInt(unsigned value) : str_(format_decimal(value)) {} + explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} + explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} + + /** Returns the number of characters written to the output buffer. */ + std::size_t size() const { + return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); + } + + /** + Returns a pointer to the output buffer content. No terminating null + character is appended. + */ + const char *data() const { return str_; } + + /** + Returns a pointer to the output buffer content with terminating null + character appended. + */ + const char *c_str() const { + buffer_[BUFFER_SIZE - 1] = '\0'; + return str_; + } + + /** + \rst + Returns the content of the output buffer as an ``std::string``. + \endrst + */ + std::string str() const { return std::string(str_, size()); } +}; + +// Formats a decimal integer value writing into buffer and returns +// a pointer to the end of the formatted string. This function doesn't +// write a terminating null character. +template +inline void format_decimal(char *&buffer, T value) { + typedef typename internal::IntTraits::MainType MainType; + MainType abs_value = static_cast(value); + if (internal::is_negative(value)) { + *buffer++ = '-'; + abs_value = 0 - abs_value; + } + if (abs_value < 100) { + if (abs_value < 10) { + *buffer++ = static_cast('0' + abs_value); + return; + } + unsigned index = static_cast(abs_value * 2); + *buffer++ = internal::Data::DIGITS[index]; + *buffer++ = internal::Data::DIGITS[index + 1]; + return; + } + unsigned num_digits = internal::count_digits(abs_value); + internal::format_decimal(buffer, abs_value, num_digits); + buffer += num_digits; +} + +/** + \rst + Returns a named argument for formatting functions. + + **Example**:: + + print("Elapsed time: {s:.2f} seconds", arg("s", 1.23)); + + \endrst + */ +template +inline internal::NamedArg arg(StringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +template +inline internal::NamedArg arg(WStringRef name, const T &arg) { + return internal::NamedArg(name, arg); +} + +// The following two functions are deleted intentionally to disable +// nested named arguments as in ``format("{}", arg("a", arg("b", 42)))``. +template +void arg(StringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +template +void arg(WStringRef, const internal::NamedArg&) FMT_DELETED_OR_UNDEFINED; +} + +#if FMT_GCC_VERSION +// Use the system_header pragma to suppress warnings about variadic macros +// because suppressing -Wvariadic-macros with the diagnostic pragma doesn't +// work. It is used at the end because we want to suppress as little warnings +// as possible. +# pragma GCC system_header +#endif + +// This is used to work around VC++ bugs in handling variadic macros. +#define FMT_EXPAND(args) args + +// Returns the number of arguments. +// Based on https://groups.google.com/forum/#!topic/comp.std.c/d-6Mj5Lko_s. +#define FMT_NARG(...) FMT_NARG_(__VA_ARGS__, FMT_RSEQ_N()) +#define FMT_NARG_(...) FMT_EXPAND(FMT_ARG_N(__VA_ARGS__)) +#define FMT_ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define FMT_RSEQ_N() 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 + +#define FMT_CONCAT(a, b) a##b +#define FMT_FOR_EACH_(N, f, ...) \ + FMT_EXPAND(FMT_CONCAT(FMT_FOR_EACH, N)(f, __VA_ARGS__)) +#define FMT_FOR_EACH(f, ...) \ + FMT_EXPAND(FMT_FOR_EACH_(FMT_NARG(__VA_ARGS__), f, __VA_ARGS__)) + +#define FMT_ADD_ARG_NAME(type, index) type arg##index +#define FMT_GET_ARG_NAME(type, index) arg##index + +#if FMT_USE_VARIADIC_TEMPLATES +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + template \ + ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + const Args & ... args) { \ + typedef fmt::internal::ArgArray ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make >(args)...}; \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ + fmt::ArgList(fmt::internal::make_type(args...), array)); \ + } +#else +// Defines a wrapper for a function taking __VA_ARGS__ arguments +// and n additional arguments of arbitrary types. +# define FMT_WRAP(Char, ReturnType, func, call, n, ...) \ + template \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ + FMT_GEN(n, FMT_MAKE_ARG)) { \ + fmt::internal::ArgArray::Type arr; \ + FMT_GEN(n, FMT_ASSIGN_##Char); \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList( \ + fmt::internal::make_type(FMT_GEN(n, FMT_MAKE_REF2)), arr)); \ + } + +# define FMT_VARIADIC_(Char, ReturnType, func, call, ...) \ + inline ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__)) { \ + call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), fmt::ArgList()); \ + } \ + FMT_WRAP(Char, ReturnType, func, call, 1, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 2, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 3, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 4, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 5, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 6, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 7, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 8, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 9, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 10, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 11, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 12, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 13, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 14, __VA_ARGS__) \ + FMT_WRAP(Char, ReturnType, func, call, 15, __VA_ARGS__) +#endif // FMT_USE_VARIADIC_TEMPLATES + +/** + \rst + Defines a variadic function with the specified return type, function name + and argument types passed as variable arguments to this macro. + + **Example**:: + + void print_error(const char *file, int line, const char *format, + fmt::ArgList args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args); + } + FMT_VARIADIC(void, print_error, const char *, int, const char *) + + ``FMT_VARIADIC`` is used for compatibility with legacy C++ compilers that + don't implement variadic templates. You don't have to use this macro if + you don't need legacy compiler support and can use variadic templates + directly:: + + template + void print_error(const char *file, int line, const char *format, + const Args & ... args) { + fmt::print("{}: {}: ", file, line); + fmt::print(format, args...); + } + \endrst + */ +#define FMT_VARIADIC(ReturnType, func, ...) \ + FMT_VARIADIC_(char, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_VARIADIC_W(ReturnType, func, ...) \ + FMT_VARIADIC_(wchar_t, ReturnType, func, return func, __VA_ARGS__) + +#define FMT_CAPTURE_ARG_(id, index) ::fmt::arg(#id, id) + +#define FMT_CAPTURE_ARG_W_(id, index) ::fmt::arg(L###id, id) + +/** + \rst + Convenient macro to capture the arguments' names and values into several + ``fmt::arg(name, value)``. + + **Example**:: + + int x = 1, y = 2; + print("point: ({x}, {y})", FMT_CAPTURE(x, y)); + // same as: + // print("point: ({x}, {y})", arg("x", x), arg("y", y)); + + \endrst + */ +#define FMT_CAPTURE(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_, __VA_ARGS__) + +#define FMT_CAPTURE_W(...) FMT_FOR_EACH(FMT_CAPTURE_ARG_W_, __VA_ARGS__) + +namespace fmt { +FMT_VARIADIC(std::string, format, CStringRef) +FMT_VARIADIC_W(std::wstring, format, WCStringRef) +FMT_VARIADIC(void, print, CStringRef) +FMT_VARIADIC(void, print, std::FILE *, CStringRef) + +FMT_VARIADIC(void, print_colored, Color, CStringRef) +FMT_VARIADIC(std::string, sprintf, CStringRef) +FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef) +FMT_VARIADIC(int, printf, CStringRef) +FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) + +namespace internal { +template +inline bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +// Parses an unsigned integer advancing s to the end of the parsed input. +// This function assumes that the first character of s is a digit. +template +unsigned parse_nonnegative_int(const Char *&s) { + assert('0' <= *s && *s <= '9'); + unsigned value = 0; + do { + unsigned new_value = value * 10 + (*s++ - '0'); + // Check if value wrapped around. + if (new_value < value) { + value = (std::numeric_limits::max)(); + break; + } + value = new_value; + } while ('0' <= *s && *s <= '9'); + // Convert to unsigned to prevent a warning. + unsigned max_int = (std::numeric_limits::max)(); + if (value > max_int) + FMT_THROW(FormatError("number is too big")); + return value; +} + +inline void require_numeric_argument(const Arg &arg, char spec) { + if (arg.type > Arg::LAST_NUMERIC_TYPE) { + std::string message = + fmt::format("format specifier '{}' requires numeric argument", spec); + FMT_THROW(fmt::FormatError(message)); + } +} + +template +void check_sign(const Char *&s, const Arg &arg) { + char sign = static_cast(*s); + require_numeric_argument(arg, sign); + if (arg.type == Arg::UINT || arg.type == Arg::ULONG_LONG) { + FMT_THROW(FormatError(fmt::format( + "format specifier '{}' requires signed argument", sign))); + } + ++s; +} +} // namespace internal + +template +inline internal::Arg BasicFormatter::get_arg( + BasicStringRef arg_name, const char *&error) { + if (check_no_auto_index(error)) { + map_.init(args()); + const internal::Arg *arg = map_.find(arg_name); + if (arg) + return *arg; + error = "argument not found"; + } + return internal::Arg(); +} + +template +inline internal::Arg BasicFormatter::parse_arg_index(const Char *&s) { + const char *error = 0; + internal::Arg arg = *s < '0' || *s > '9' ? + next_arg(error) : get_arg(internal::parse_nonnegative_int(s), error); + if (error) { + FMT_THROW(FormatError( + *s != '}' && *s != ':' ? "invalid format string" : error)); + } + return arg; +} + +template +inline internal::Arg BasicFormatter::parse_arg_name(const Char *&s) { + assert(internal::is_name_start(*s)); + const Char *start = s; + Char c; + do { + c = *++s; + } while (internal::is_name_start(c) || ('0' <= c && c <= '9')); + const char *error = 0; + internal::Arg arg = get_arg(BasicStringRef(start, s - start), error); + if (error) + FMT_THROW(FormatError(error)); + return arg; +} + +template +const Char *BasicFormatter::format( + const Char *&format_str, const internal::Arg &arg) { + using internal::Arg; + const Char *s = format_str; + FormatSpec spec; + if (*s == ':') { + if (arg.type == Arg::CUSTOM) { + arg.custom.format(this, arg.custom.value, &s); + return s; + } + ++s; + // Parse fill and alignment. + if (Char c = *s) { + const Char *p = s + 1; + spec.align_ = ALIGN_DEFAULT; + do { + switch (*p) { + case '<': + spec.align_ = ALIGN_LEFT; + break; + case '>': + spec.align_ = ALIGN_RIGHT; + break; + case '=': + spec.align_ = ALIGN_NUMERIC; + break; + case '^': + spec.align_ = ALIGN_CENTER; + break; + } + if (spec.align_ != ALIGN_DEFAULT) { + if (p != s) { + if (c == '}') break; + if (c == '{') + FMT_THROW(FormatError("invalid fill character '{'")); + s += 2; + spec.fill_ = c; + } else ++s; + if (spec.align_ == ALIGN_NUMERIC) + require_numeric_argument(arg, '='); + break; + } + } while (--p >= s); + } + + // Parse sign. + switch (*s) { + case '+': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG | PLUS_FLAG; + break; + case '-': + check_sign(s, arg); + spec.flags_ |= MINUS_FLAG; + break; + case ' ': + check_sign(s, arg); + spec.flags_ |= SIGN_FLAG; + break; + } + + if (*s == '#') { + require_numeric_argument(arg, '#'); + spec.flags_ |= HASH_FLAG; + ++s; + } + + // Parse zero flag. + if (*s == '0') { + require_numeric_argument(arg, '0'); + spec.align_ = ALIGN_NUMERIC; + spec.fill_ = '0'; + ++s; + } + + // Parse width. + if ('0' <= *s && *s <= '9') { + spec.width_ = internal::parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg width_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (width_arg.type) { + case Arg::INT: + if (width_arg.int_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.int_value; + break; + case Arg::UINT: + value = width_arg.uint_value; + break; + case Arg::LONG_LONG: + if (width_arg.long_long_value < 0) + FMT_THROW(FormatError("negative width")); + value = width_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = width_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("width is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.width_ = static_cast(value); + } + + // Parse precision. + if (*s == '.') { + ++s; + spec.precision_ = 0; + if ('0' <= *s && *s <= '9') { + spec.precision_ = internal::parse_nonnegative_int(s); + } else if (*s == '{') { + ++s; + Arg precision_arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + if (*s++ != '}') + FMT_THROW(FormatError("invalid format string")); + ULongLong value = 0; + switch (precision_arg.type) { + case Arg::INT: + if (precision_arg.int_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.int_value; + break; + case Arg::UINT: + value = precision_arg.uint_value; + break; + case Arg::LONG_LONG: + if (precision_arg.long_long_value < 0) + FMT_THROW(FormatError("negative precision")); + value = precision_arg.long_long_value; + break; + case Arg::ULONG_LONG: + value = precision_arg.ulong_long_value; + break; + default: + FMT_THROW(FormatError("precision is not integer")); + } + if (value > (std::numeric_limits::max)()) + FMT_THROW(FormatError("number is too big")); + spec.precision_ = static_cast(value); + } else { + FMT_THROW(FormatError("missing precision specifier")); + } + if (arg.type <= Arg::LAST_INTEGER_TYPE || arg.type == Arg::POINTER) { + FMT_THROW(FormatError( + fmt::format("precision not allowed in {} format specifier", + arg.type == Arg::POINTER ? "pointer" : "integer"))); + } + } + + // Parse type. + if (*s != '}' && *s) + spec.type_ = static_cast(*s++); + } + + if (*s++ != '}') + FMT_THROW(FormatError("missing '}' in format string")); + + // Format argument. + ArgFormatter(*this, spec, s - 1).visit(arg); + return s; +} + +template +void BasicFormatter::format(BasicCStringRef format_str) { + const Char *s = format_str.c_str(); + const Char *start = s; + while (*s) { + Char c = *s++; + if (c != '{' && c != '}') continue; + if (*s == c) { + write(writer_, start, s); + start = ++s; + continue; + } + if (c == '}') + FMT_THROW(FormatError("unmatched '}' in format string")); + write(writer_, start, s - 1); + internal::Arg arg = internal::is_name_start(*s) ? + parse_arg_name(s) : parse_arg_index(s); + start = s = format(s, arg); + } + write(writer_, start, s); +} +} // namespace fmt + +#if FMT_USE_USER_DEFINED_LITERALS +namespace fmt { +namespace internal { + +template +struct UdlFormat { + const Char *str; + + template + auto operator()(Args && ... args) const + -> decltype(format(str, std::forward(args)...)) { + return format(str, std::forward(args)...); + } +}; + +template +struct UdlArg { + const Char *str; + + template + NamedArg operator=(T &&value) const { + return {str, std::forward(value)}; + } +}; + +} // namespace internal + +inline namespace literals { + +/** + \rst + C++11 literal equivalent of :func:`fmt::format`. + + **Example**:: + + using namespace fmt::literals; + std::string message = "The answer is {}"_format(42); + \endrst + */ +inline internal::UdlFormat +operator"" _format(const char *s, std::size_t) { return {s}; } +inline internal::UdlFormat +operator"" _format(const wchar_t *s, std::size_t) { return {s}; } + +/** + \rst + C++11 literal equivalent of :func:`fmt::arg`. + + **Example**:: + + using namespace fmt::literals; + print("Elapsed time: {s:.2f} seconds", "s"_a=1.23); + \endrst + */ +inline internal::UdlArg +operator"" _a(const char *s, std::size_t) { return {s}; } +inline internal::UdlArg +operator"" _a(const wchar_t *s, std::size_t) { return {s}; } + +} // inline namespace literals +} // namespace fmt +#endif // FMT_USE_USER_DEFINED_LITERALS + +// Restore warnings. +#if FMT_GCC_VERSION >= 406 +# pragma GCC diagnostic pop +#endif + +#if defined(__clang__) && !defined(FMT_ICC_VERSION) +# pragma clang diagnostic pop +#endif + +#ifdef FMT_HEADER_ONLY +# define FMT_FUNC inline +# include "format.cc" +#else +# define FMT_FUNC +#endif + +#endif // FMT_FORMAT_H_ diff --git a/vendor/fmt-3.0.1/fmt/ostream.cc b/vendor/fmt-3.0.1/fmt/ostream.cc new file mode 100644 index 00000000..bcb67fe1 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/ostream.cc @@ -0,0 +1,43 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#include "ostream.h" + +namespace fmt { + +namespace { +// Write the content of w to os. +void write(std::ostream &os, Writer &w) { + const char *data = w.data(); + typedef internal::MakeUnsigned::Type UnsignedStreamSize; + UnsignedStreamSize size = w.size(); + UnsignedStreamSize max_size = + internal::to_unsigned((std::numeric_limits::max)()); + do { + UnsignedStreamSize n = size <= max_size ? size : max_size; + os.write(data, static_cast(n)); + data += n; + size -= n; + } while (size != 0); +} +} + +FMT_FUNC void print(std::ostream &os, CStringRef format_str, ArgList args) { + MemoryWriter w; + w.write(format_str, args); + write(os, w); +} + +FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + write(os, w); + return static_cast(w.size()); +} +} // namespace fmt diff --git a/vendor/fmt-3.0.1/fmt/ostream.h b/vendor/fmt-3.0.1/fmt/ostream.h new file mode 100644 index 00000000..29483c1b --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/ostream.h @@ -0,0 +1,115 @@ +/* + Formatting library for C++ - std::ostream support + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_OSTREAM_H_ +#define FMT_OSTREAM_H_ + +#include "format.h" +#include + +namespace fmt { + +namespace internal { + +template +class FormatBuf : public std::basic_streambuf { + private: + typedef typename std::basic_streambuf::int_type int_type; + typedef typename std::basic_streambuf::traits_type traits_type; + + Buffer &buffer_; + Char *start_; + + public: + FormatBuf(Buffer &buffer) : buffer_(buffer), start_(&buffer[0]) { + this->setp(start_, start_ + buffer_.capacity()); + } + + int_type overflow(int_type ch = traits_type::eof()) { + if (!traits_type::eq_int_type(ch, traits_type::eof())) { + size_t buf_size = size(); + buffer_.resize(buf_size); + buffer_.reserve(buf_size * 2); + + start_ = &buffer_[0]; + start_[buf_size] = traits_type::to_char_type(ch); + this->setp(start_+ buf_size + 1, start_ + buf_size * 2); + } + return ch; + } + + size_t size() const { + return to_unsigned(this->pptr() - start_); + } +}; + +Yes &convert(std::ostream &); + +struct DummyStream : std::ostream { + DummyStream(); // Suppress a bogus warning in MSVC. + // Hide all operator<< overloads from std::ostream. + void operator<<(Null<>); +}; + +No &operator<<(std::ostream &, int); + +template +struct ConvertToIntImpl { + // Convert to int only if T doesn't have an overloaded operator<<. + enum { + value = sizeof(convert(get() << get())) == sizeof(No) + }; +}; +} // namespace internal + +// Formats a value. +template +void format(BasicFormatter &f, + const Char *&format_str, const T &value) { + internal::MemoryBuffer buffer; + + internal::FormatBuf format_buf(buffer); + std::basic_ostream output(&format_buf); + output << value; + + BasicStringRef str(&buffer[0], format_buf.size()); + typedef internal::MakeArg< BasicFormatter > MakeArg; + format_str = f.format(format_str, MakeArg(str)); +} + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + print(cerr, "Don't {}!", "panic"); + \endrst + */ +FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(void, print, std::ostream &, CStringRef) + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + fprintf(cerr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) +} // namespace fmt + +#ifdef FMT_HEADER_ONLY +# include "ostream.cc" +#endif + +#endif // FMT_OSTREAM_H_ diff --git a/vendor/fmt-3.0.1/fmt/posix.cc b/vendor/fmt-3.0.1/fmt/posix.cc new file mode 100644 index 00000000..76eb7f05 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/posix.cc @@ -0,0 +1,238 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +// Disable bogus MSVC warnings. +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +#include "posix.h" + +#include +#include +#include + +#ifndef _WIN32 +# include +#else +# include +# include + +# define O_CREAT _O_CREAT +# define O_TRUNC _O_TRUNC + +# ifndef S_IRUSR +# define S_IRUSR _S_IREAD +# endif + +# ifndef S_IWUSR +# define S_IWUSR _S_IWRITE +# endif + +# ifdef __MINGW32__ +# define _SH_DENYNO 0x40 +# endif + +#endif // _WIN32 + +#ifdef fileno +# undef fileno +#endif + +namespace { +#ifdef _WIN32 +// Return type of read and write functions. +typedef int RWResult; + +// On Windows the count argument to read and write is unsigned, so convert +// it from size_t preventing integer overflow. +inline unsigned convert_rwcount(std::size_t count) { + return count <= UINT_MAX ? static_cast(count) : UINT_MAX; +} +#else +// Return type of read and write functions. +typedef ssize_t RWResult; + +inline std::size_t convert_rwcount(std::size_t count) { return count; } +#endif +} + +fmt::BufferedFile::~BufferedFile() FMT_NOEXCEPT { + if (file_ && FMT_SYSTEM(fclose(file_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +fmt::BufferedFile::BufferedFile( + fmt::CStringRef filename, fmt::CStringRef mode) { + FMT_RETRY_VAL(file_, FMT_SYSTEM(fopen(filename.c_str(), mode.c_str())), 0); + if (!file_) + FMT_THROW(SystemError(errno, "cannot open file {}", filename)); +} + +void fmt::BufferedFile::close() { + if (!file_) + return; + int result = FMT_SYSTEM(fclose(file_)); + file_ = 0; + if (result != 0) + FMT_THROW(SystemError(errno, "cannot close file")); +} + +// A macro used to prevent expansion of fileno on broken versions of MinGW. +#define FMT_ARGS + +int fmt::BufferedFile::fileno() const { + int fd = FMT_POSIX_CALL(fileno FMT_ARGS(file_)); + if (fd == -1) + FMT_THROW(SystemError(errno, "cannot get file descriptor")); + return fd; +} + +fmt::File::File(fmt::CStringRef path, int oflag) { + int mode = S_IRUSR | S_IWUSR; +#if defined(_WIN32) && !defined(__MINGW32__) + fd_ = -1; + FMT_POSIX_CALL(sopen_s(&fd_, path.c_str(), oflag, _SH_DENYNO, mode)); +#else + FMT_RETRY(fd_, FMT_POSIX_CALL(open(path.c_str(), oflag, mode))); +#endif + if (fd_ == -1) + FMT_THROW(SystemError(errno, "cannot open file {}", path)); +} + +fmt::File::~File() FMT_NOEXCEPT { + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + if (fd_ != -1 && FMT_POSIX_CALL(close(fd_)) != 0) + fmt::report_system_error(errno, "cannot close file"); +} + +void fmt::File::close() { + if (fd_ == -1) + return; + // Don't retry close in case of EINTR! + // See http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html + int result = FMT_POSIX_CALL(close(fd_)); + fd_ = -1; + if (result != 0) + FMT_THROW(SystemError(errno, "cannot close file")); +} + +fmt::LongLong fmt::File::size() const { +#ifdef _WIN32 + // Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT + // is less than 0x0500 as is the case with some default MinGW builds. + // Both functions support large file sizes. + DWORD size_upper = 0; + HANDLE handle = reinterpret_cast(_get_osfhandle(fd_)); + DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper)); + if (size_lower == INVALID_FILE_SIZE) { + DWORD error = GetLastError(); + if (error != NO_ERROR) + FMT_THROW(WindowsError(GetLastError(), "cannot get file size")); + } + fmt::ULongLong long_size = size_upper; + return (long_size << sizeof(DWORD) * CHAR_BIT) | size_lower; +#else + typedef struct stat Stat; + Stat file_stat = Stat(); + if (FMT_POSIX_CALL(fstat(fd_, &file_stat)) == -1) + FMT_THROW(SystemError(errno, "cannot get file attributes")); + FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(file_stat.st_size), + "return type of File::size is not large enough"); + return file_stat.st_size; +#endif +} + +std::size_t fmt::File::read(void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + FMT_THROW(SystemError(errno, "cannot read from file")); + return internal::to_unsigned(result); +} + +std::size_t fmt::File::write(const void *buffer, std::size_t count) { + RWResult result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); + if (result < 0) + FMT_THROW(SystemError(errno, "cannot write to file")); + return internal::to_unsigned(result); +} + +fmt::File fmt::File::dup(int fd) { + // Don't retry as dup doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html + int new_fd = FMT_POSIX_CALL(dup(fd)); + if (new_fd == -1) + FMT_THROW(SystemError(errno, "cannot duplicate file descriptor {}", fd)); + return File(new_fd); +} + +void fmt::File::dup2(int fd) { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) { + FMT_THROW(SystemError(errno, + "cannot duplicate file descriptor {} to {}", fd_, fd)); + } +} + +void fmt::File::dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT { + int result = 0; + FMT_RETRY(result, FMT_POSIX_CALL(dup2(fd_, fd))); + if (result == -1) + ec = ErrorCode(errno); +} + +void fmt::File::pipe(File &read_end, File &write_end) { + // Close the descriptors first to make sure that assignments don't throw + // and there are no leaks. + read_end.close(); + write_end.close(); + int fds[2] = {}; +#ifdef _WIN32 + // Make the default pipe capacity same as on Linux 2.6.11+. + enum { DEFAULT_CAPACITY = 65536 }; + int result = FMT_POSIX_CALL(pipe(fds, DEFAULT_CAPACITY, _O_BINARY)); +#else + // Don't retry as the pipe function doesn't return EINTR. + // http://pubs.opengroup.org/onlinepubs/009696799/functions/pipe.html + int result = FMT_POSIX_CALL(pipe(fds)); +#endif + if (result != 0) + FMT_THROW(SystemError(errno, "cannot create pipe")); + // The following assignments don't throw because read_fd and write_fd + // are closed. + read_end = File(fds[0]); + write_end = File(fds[1]); +} + +fmt::BufferedFile fmt::File::fdopen(const char *mode) { + // Don't retry as fdopen doesn't return EINTR. + FILE *f = FMT_POSIX_CALL(fdopen(fd_, mode)); + if (!f) + FMT_THROW(SystemError(errno, "cannot associate stream with file descriptor")); + BufferedFile file(f); + fd_ = -1; + return file; +} + +long fmt::getpagesize() { +#ifdef _WIN32 + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwPageSize; +#else + long size = FMT_POSIX_CALL(sysconf(_SC_PAGESIZE)); + if (size < 0) + FMT_THROW(SystemError(errno, "cannot get memory page size")); + return size; +#endif +} diff --git a/vendor/fmt-3.0.1/fmt/posix.h b/vendor/fmt-3.0.1/fmt/posix.h new file mode 100644 index 00000000..be1286c4 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/posix.h @@ -0,0 +1,386 @@ +/* + A C++ interface to POSIX functions. + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_POSIX_H_ +#define FMT_POSIX_H_ + +#if defined(__MINGW32__) || defined(__CYGWIN__) +// Workaround MinGW bug https://sourceforge.net/p/mingw/bugs/2024/. +# undef __STRICT_ANSI__ +#endif + +#include +#include // for O_RDONLY +#include // for locale_t +#include +#include // for strtod_l + +#include + +#if defined __APPLE__ || defined(__FreeBSD__) +# include // for LC_NUMERIC_MASK on OS X +#endif + +#include "format.h" + +#ifndef FMT_POSIX +# if defined(_WIN32) && !defined(__MINGW32__) +// Fix warnings about deprecated symbols. +# define FMT_POSIX(call) _##call +# else +# define FMT_POSIX(call) call +# endif +#endif + +// Calls to system functions are wrapped in FMT_SYSTEM for testability. +#ifdef FMT_SYSTEM +# define FMT_POSIX_CALL(call) FMT_SYSTEM(call) +#else +# define FMT_SYSTEM(call) call +# ifdef _WIN32 +// Fix warnings about deprecated symbols. +# define FMT_POSIX_CALL(call) ::_##call +# else +# define FMT_POSIX_CALL(call) ::call +# endif +#endif + +#if FMT_GCC_VERSION >= 407 +# define FMT_UNUSED __attribute__((unused)) +#else +# define FMT_UNUSED +#endif + +#ifndef FMT_USE_STATIC_ASSERT +# define FMT_USE_STATIC_ASSERT 0 +#endif + +#if FMT_USE_STATIC_ASSERT || FMT_HAS_FEATURE(cxx_static_assert) || \ + (FMT_GCC_VERSION >= 403 && FMT_HAS_GXX_CXX11) || _MSC_VER >= 1600 +# define FMT_STATIC_ASSERT(cond, message) static_assert(cond, message) +#else +# define FMT_CONCAT_(a, b) FMT_CONCAT(a, b) +# define FMT_STATIC_ASSERT(cond, message) \ + typedef int FMT_CONCAT_(Assert, __LINE__)[(cond) ? 1 : -1] FMT_UNUSED +#endif + +// Retries the expression while it evaluates to error_result and errno +// equals to EINTR. +#ifndef _WIN32 +# define FMT_RETRY_VAL(result, expression, error_result) \ + do { \ + result = (expression); \ + } while (result == error_result && errno == EINTR) +#else +# define FMT_RETRY_VAL(result, expression, error_result) result = (expression) +#endif + +#define FMT_RETRY(result, expression) FMT_RETRY_VAL(result, expression, -1) + +namespace fmt { + +// An error code. +class ErrorCode { + private: + int value_; + + public: + explicit ErrorCode(int value = 0) FMT_NOEXCEPT : value_(value) {} + + int get() const FMT_NOEXCEPT { return value_; } +}; + +// A buffered file. +class BufferedFile { + private: + FILE *file_; + + friend class File; + + explicit BufferedFile(FILE *f) : file_(f) {} + + public: + // Constructs a BufferedFile object which doesn't represent any file. + BufferedFile() FMT_NOEXCEPT : file_(0) {} + + // Destroys the object closing the file it represents if any. + ~BufferedFile() FMT_NOEXCEPT; + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + + private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy { + FILE *file; + }; + +public: + // A "move constructor" for moving from a temporary. + BufferedFile(Proxy p) FMT_NOEXCEPT : file_(p.file) {} + + // A "move constructor" for moving from an lvalue. + BufferedFile(BufferedFile &f) FMT_NOEXCEPT : file_(f.file_) { + f.file_ = 0; + } + + // A "move assignment operator" for moving from a temporary. + BufferedFile &operator=(Proxy p) { + close(); + file_ = p.file; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + BufferedFile &operator=(BufferedFile &other) { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // BufferedFile file = BufferedFile(...); + operator Proxy() FMT_NOEXCEPT { + Proxy p = {file_}; + file_ = 0; + return p; + } + +#else + private: + FMT_DISALLOW_COPY_AND_ASSIGN(BufferedFile); + + public: + BufferedFile(BufferedFile &&other) FMT_NOEXCEPT : file_(other.file_) { + other.file_ = 0; + } + + BufferedFile& operator=(BufferedFile &&other) { + close(); + file_ = other.file_; + other.file_ = 0; + return *this; + } +#endif + + // Opens a file. + BufferedFile(CStringRef filename, CStringRef mode); + + // Closes the file. + void close(); + + // Returns the pointer to a FILE object representing this file. + FILE *get() const FMT_NOEXCEPT { return file_; } + + // We place parentheses around fileno to workaround a bug in some versions + // of MinGW that define fileno as a macro. + int (fileno)() const; + + void print(CStringRef format_str, const ArgList &args) { + fmt::print(file_, format_str, args); + } + FMT_VARIADIC(void, print, CStringRef) +}; + +// A file. Closed file is represented by a File object with descriptor -1. +// Methods that are not declared with FMT_NOEXCEPT may throw +// fmt::SystemError in case of failure. Note that some errors such as +// closing the file multiple times will cause a crash on Windows rather +// than an exception. You can get standard behavior by overriding the +// invalid parameter handler with _set_invalid_parameter_handler. +class File { + private: + int fd_; // File descriptor. + + // Constructs a File object with a given descriptor. + explicit File(int fd) : fd_(fd) {} + + public: + // Possible values for the oflag argument to the constructor. + enum { + RDONLY = FMT_POSIX(O_RDONLY), // Open for reading only. + WRONLY = FMT_POSIX(O_WRONLY), // Open for writing only. + RDWR = FMT_POSIX(O_RDWR) // Open for reading and writing. + }; + + // Constructs a File object which doesn't represent any file. + File() FMT_NOEXCEPT : fd_(-1) {} + + // Opens a file and constructs a File object representing this file. + File(CStringRef path, int oflag); + +#if !FMT_USE_RVALUE_REFERENCES + // Emulate a move constructor and a move assignment operator if rvalue + // references are not supported. + + private: + // A proxy object to emulate a move constructor. + // It is private to make it impossible call operator Proxy directly. + struct Proxy { + int fd; + }; + + public: + // A "move constructor" for moving from a temporary. + File(Proxy p) FMT_NOEXCEPT : fd_(p.fd) {} + + // A "move constructor" for moving from an lvalue. + File(File &other) FMT_NOEXCEPT : fd_(other.fd_) { + other.fd_ = -1; + } + + // A "move assignment operator" for moving from a temporary. + File &operator=(Proxy p) { + close(); + fd_ = p.fd; + return *this; + } + + // A "move assignment operator" for moving from an lvalue. + File &operator=(File &other) { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } + + // Returns a proxy object for moving from a temporary: + // File file = File(...); + operator Proxy() FMT_NOEXCEPT { + Proxy p = {fd_}; + fd_ = -1; + return p; + } + +#else + private: + FMT_DISALLOW_COPY_AND_ASSIGN(File); + + public: + File(File &&other) FMT_NOEXCEPT : fd_(other.fd_) { + other.fd_ = -1; + } + + File& operator=(File &&other) { + close(); + fd_ = other.fd_; + other.fd_ = -1; + return *this; + } +#endif + + // Destroys the object closing the file it represents if any. + ~File() FMT_NOEXCEPT; + + // Returns the file descriptor. + int descriptor() const FMT_NOEXCEPT { return fd_; } + + // Closes the file. + void close(); + + // Returns the file size. The size has signed type for consistency with + // stat::st_size. + LongLong size() const; + + // Attempts to read count bytes from the file into the specified buffer. + std::size_t read(void *buffer, std::size_t count); + + // Attempts to write count bytes from the specified buffer to the file. + std::size_t write(const void *buffer, std::size_t count); + + // Duplicates a file descriptor with the dup function and returns + // the duplicate as a file object. + static File dup(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd); + + // Makes fd be the copy of this file descriptor, closing fd first if + // necessary. + void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; + + // Creates a pipe setting up read_end and write_end file objects for reading + // and writing respectively. + static void pipe(File &read_end, File &write_end); + + // Creates a BufferedFile object associated with this file and detaches + // this File object from the file. + BufferedFile fdopen(const char *mode); +}; + +// Returns the memory page size. +long getpagesize(); + +#if (defined(LC_NUMERIC_MASK) || defined(_MSC_VER)) && \ + !defined(__ANDROID__) && !defined(__CYGWIN__) +# define FMT_LOCALE +#endif + +#ifdef FMT_LOCALE +// A "C" numeric locale. +class Locale { + private: +# ifdef _MSC_VER + typedef _locale_t locale_t; + + enum { LC_NUMERIC_MASK = LC_NUMERIC }; + + static locale_t newlocale(int category_mask, const char *locale, locale_t) { + return _create_locale(category_mask, locale); + } + + static void freelocale(locale_t locale) { + _free_locale(locale); + } + + static double strtod_l(const char *nptr, char **endptr, _locale_t locale) { + return _strtod_l(nptr, endptr, locale); + } +# endif + + locale_t locale_; + + FMT_DISALLOW_COPY_AND_ASSIGN(Locale); + + public: + typedef locale_t Type; + + Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) { + if (!locale_) + FMT_THROW(fmt::SystemError(errno, "cannot create locale")); + } + ~Locale() { freelocale(locale_); } + + Type get() const { return locale_; } + + // Converts string to floating-point number and advances str past the end + // of the parsed input. + double strtod(const char *&str) const { + char *end = 0; + double result = strtod_l(str, &end, locale_); + str = end; + return result; + } +}; +#endif // FMT_LOCALE +} // namespace fmt + +#if !FMT_USE_RVALUE_REFERENCES +namespace std { +// For compatibility with C++98. +inline fmt::BufferedFile &move(fmt::BufferedFile &f) { return f; } +inline fmt::File &move(fmt::File &f) { return f; } +} +#endif + +#endif // FMT_POSIX_H_ diff --git a/vendor/fmt-3.0.1/fmt/time.h b/vendor/fmt-3.0.1/fmt/time.h new file mode 100644 index 00000000..10225c03 --- /dev/null +++ b/vendor/fmt-3.0.1/fmt/time.h @@ -0,0 +1,53 @@ +/* + Formatting library for C++ - time formatting + + Copyright (c) 2012 - 2016, Victor Zverovich + All rights reserved. + + For the license information refer to format.h. + */ + +#ifndef FMT_TIME_H_ +#define FMT_TIME_H_ + +#include "format.h" +#include + +namespace fmt { +template +void format(BasicFormatter &f, + const char *&format_str, const std::tm &tm) { + if (*format_str == ':') + ++format_str; + const char *end = format_str; + while (*end && *end != '}') + ++end; + if (*end != '}') + FMT_THROW(FormatError("missing '}' in format string")); + internal::MemoryBuffer format; + format.append(format_str, end + 1); + format[format.size() - 1] = '\0'; + Buffer &buffer = f.writer().buffer(); + std::size_t start = buffer.size(); + for (;;) { + std::size_t size = buffer.capacity() - start; + std::size_t count = std::strftime(&buffer[start], size, &format[0], &tm); + if (count != 0) { + buffer.resize(start + count); + break; + } + if (size >= format.size() * 256) { + // If the buffer is 256 times larger than the format string, assume + // that `strftime` gives an empty result. There doesn't seem to be a + // better way to distinguish the two cases: + // https://github.com/fmtlib/fmt/issues/367 + break; + } + const std::size_t MIN_GROWTH = 10; + buffer.reserve(buffer.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH)); + } + format_str = end + 1; +} +} + +#endif // FMT_TIME_H_ -- cgit v1.2.3 From 993ed44638fa17fe76c69f148daa6a1c14af4329 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 14 Jan 2017 13:28:37 +0100 Subject: main-win: Remove parameter from play_game() --- src/main-win.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main-win.c b/src/main-win.c index 0403dc46..54336a37 100644 --- a/src/main-win.c +++ b/src/main-win.c @@ -2063,7 +2063,7 @@ static void check_for_save_file(LPSTR cmd_line) game_in_progress = TRUE; /* Play game */ - play_game(FALSE); + play_game(); } @@ -2096,7 +2096,7 @@ static void process_menus(WORD wCmd) { game_in_progress = TRUE; Term_flush(); - play_game(TRUE); + play_game(); quit(NULL); } break; @@ -2135,7 +2135,7 @@ ofn.lStructSize = sizeof(OPENFILENAME); validate_file(savefile); game_in_progress = TRUE; Term_flush(); - play_game(FALSE); + play_game(); quit(NULL); } } @@ -3323,7 +3323,7 @@ int FAR PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, check_for_save_file(lpCmdLine); game_in_progress = TRUE; - play_game(FALSE); + play_game(); /* Prompt the user */ Term_fresh(); -- cgit v1.2.3 From 464c03435151346bdbff4c78545fa3c829c5370e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 14 Jan 2017 13:28:37 +0100 Subject: Remove unnecessary include in dungeon.h --- src/dungeon.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dungeon.h b/src/dungeon.h index 43515f9a..2a178dd1 100644 --- a/src/dungeon.h +++ b/src/dungeon.h @@ -1,7 +1,5 @@ #pragma once -#include "h-basic.h" - // C linkage required for these functions since main-* code uses them. #ifdef __cplusplus extern "C" { -- cgit v1.2.3 From f89759714a9332f7250054a3a0db7fae4fe1952f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 14 Jan 2017 13:28:37 +0100 Subject: Fix link order --- src/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1900ac72..4967e826 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -154,28 +154,28 @@ ENDIF(WIN32) IF(X11_FOUND) INCLUDE_DIRECTORIES(${X11_INCLUDE_DIR}) ADD_EXECUTABLE(tome-x11 main-x11.c) - TARGET_LINK_LIBRARIES(tome-x11 game game_main squelch ${LIBS} ${X11_LIBRARIES}) + TARGET_LINK_LIBRARIES(tome-x11 game_main game squelch ${LIBS} ${X11_LIBRARIES}) INSTALL(TARGETS tome-x11 RUNTIME DESTINATION bin) ENDIF() IF(SDL_FOUND AND SDLIMAGE_FOUND AND SDLTTF_FOUND) INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDLIMAGE_INCLUDE_DIR} ${SDLTTF_INCLUDE_DIR}) ADD_EXECUTABLE(tome-sdl main-sdl.c) - TARGET_LINK_LIBRARIES(tome-sdl game game_main squelch ${LIBS} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ${SDL_LIBRARY} m) + TARGET_LINK_LIBRARIES(tome-sdl game_main game squelch ${LIBS} ${SDLIMAGE_LIBRARY} ${SDLTTF_LIBRARY} ${SDL_LIBRARY} m) INSTALL(TARGETS tome-sdl RUNTIME DESTINATION bin) ENDIF() IF(CURSES_FOUND) INCLUDE_DIRECTORIES(${CURSES_INCLUDE_DIR}) ADD_EXECUTABLE(tome-gcu main-gcu.c) - TARGET_LINK_LIBRARIES(tome-gcu game game_main squelch ${LIBS} ${CURSES_LIBRARIES}) + TARGET_LINK_LIBRARIES(tome-gcu game_main game squelch ${LIBS} ${CURSES_LIBRARIES}) INSTALL(TARGETS tome-gcu RUNTIME DESTINATION bin) ENDIF() IF(GTK2_FOUND) INCLUDE_DIRECTORIES(${GTK2_INCLUDE_DIRS}) ADD_EXECUTABLE(tome-gtk2 main-gtk2.c) - TARGET_LINK_LIBRARIES(tome-gtk2 game game_main squelch ${LIBS} ${GTK2_LIBRARIES}) + TARGET_LINK_LIBRARIES(tome-gtk2 game_main game squelch ${LIBS} ${GTK2_LIBRARIES}) INSTALL(TARGETS tome-gtk2 RUNTIME DESTINATION bin) ENDIF() -- cgit v1.2.3 From 64d0292f358de0212f7d88e379d829c01d2ab9dd Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 28 Feb 2017 19:44:12 +0100 Subject: Remove long-obsolete Automatizer files --- lib/mods/theme/user/automat.atm | 667 ----------------------------------- lib/mods/theme/user/fierce.atm | 761 ---------------------------------------- lib/user/automat.atm | 0 3 files changed, 1428 deletions(-) delete mode 100644 lib/mods/theme/user/automat.atm delete mode 100644 lib/mods/theme/user/fierce.atm delete mode 100644 lib/user/automat.atm diff --git a/lib/mods/theme/user/automat.atm b/lib/mods/theme/user/automat.atm deleted file mode 100644 index 03e31974..00000000 --- a/lib/mods/theme/user/automat.atm +++ /dev/null @@ -1,667 +0,0 @@ --- This automatiser file was created by Feanor for the Annals of Ea module. -clean_ruleset() -add_ruleset -[[ - - - - 7 - - empty - - - - - 80 - - - - - - - - 40 - - - - 45 - - - - 40 - bad - - - 45 - bad - - - - - - - - Trapping - - - - 71 - - - - 71 - - - - 71 - 13 - - - 71 - - - - - - - - 65 - - - - - - - Trapping - - - - 70 - - - Vampire - - - - 70 - - - - 70 - - - - - - - - Broken Dagger - - average - bad - very bad - - - - - - 6 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 14 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 15 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 16 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 17 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 18 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 19 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 20 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 21 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 22 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 23 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 24 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 30 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 31 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 32 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 33 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 34 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 35 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 36 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 37 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 38 - - - - - very bad - bad - - - - - average - - - - good - - - - - - - - 115 - - - - - - - very bad - bad - - - - - average - - - - good - - - - - - - 46 - - bad - very bad - - - - - - - 9 - - - Corpse-preservation - - - Possession - - - Summoning - - - - - - 104 - 105 - - - Runecraft - - - - 46 - - Trapping - - - average - good - - - - - - Archer - - - Ranger - - - Sniper - - - 11 - - - - - Archer - - - Ranger - - - Sniper - - - 1 - - - -]] diff --git a/lib/mods/theme/user/fierce.atm b/lib/mods/theme/user/fierce.atm deleted file mode 100644 index c49f7de3..00000000 --- a/lib/mods/theme/user/fierce.atm +++ /dev/null @@ -1,761 +0,0 @@ -clean_ruleset() -add_ruleset -[[ - - flask of oil - - - - - 7 - - empty - - - - - 80 - - - - - - - - 40 - - - - 45 - - - - 40 - bad - - - 45 - bad - - - - - - - - Trapping - - - - 71 - - - - 71 - - - - 71 - 13 - - - 71 - - - - - - - - 65 - - - - - - - Trapping - - - - 70 - - - Vampire - - - - 70 - - - - 70 - - - - - - - - Broken Dagger - - average - bad - very bad - - - very good - - - - - - - 6 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 14 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 15 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 16 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 17 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 18 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 19 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 20 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 21 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 22 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 23 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 24 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 30 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 31 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 32 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 33 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 34 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 35 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 36 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 37 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 38 - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - - 115 - - - - - - - very bad - bad - - - - - average - - - - good - - - - very good - - - - - - - 46 - - bad - very bad - - - - - - - 9 - - - Corpse-preservation - - - Possession - - - Summoning - - - - - - 104 - 105 - - - Runecraft - - - - 46 - - Trapping - - - average - good - - - - - - Archer - - - Ranger - - - Sniper - - - 11 - - - - - Archer - - - Ranger - - - Sniper - - - 1 - - - -]] diff --git a/lib/user/automat.atm b/lib/user/automat.atm deleted file mode 100644 index e69de29b..00000000 -- cgit v1.2.3 From 5bc01c584066a0cea37021eb6e13bd96d74de7b5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 28 Feb 2017 19:44:12 +0100 Subject: Remove Runecrafting --- lib/edit/e_info.txt | 12 - lib/edit/k_info.txt | 182 ------- lib/edit/p_info.txt | 13 - lib/edit/s_info.txt | 8 - lib/help/birth.txt | 3 +- lib/help/c_geoman.txt | 1 - lib/help/c_mage.txt | 1 - lib/help/c_necro.txt | 1 - lib/help/c_runecr.txt | 110 ---- lib/help/c_sorcer.txt | 1 - lib/help/c_thaum.txt | 1 - lib/help/c_warper.txt | 1 - lib/help/index.txt | 5 - lib/help/magic.txt | 5 +- lib/help/skills.txt | 12 +- lib/help/tome_faq.txt | 7 - lib/mods/theme/edit/e_info.txt | 12 - lib/mods/theme/edit/k_info.txt | 220 -------- lib/mods/theme/edit/p_info.txt | 15 - lib/mods/theme/edit/s_info.txt | 8 - lib/mods/theme/edit/st_info.txt | 13 - lib/mods/theme/edit/t_edoras.txt | 7 +- lib/mods/theme/edit/t_pelar.txt | 7 +- lib/mods/theme/help/birth.txt | 5 +- lib/mods/theme/help/c_geoman.txt | 1 - lib/mods/theme/help/c_mage.txt | 1 - lib/mods/theme/help/c_necro.txt | 1 - lib/mods/theme/help/c_runecr.txt | 110 ---- lib/mods/theme/help/c_sorcer.txt | 1 - lib/mods/theme/help/c_thaum.txt | 1 - lib/mods/theme/help/c_warper.txt | 1 - lib/mods/theme/help/index.txt | 6 - lib/mods/theme/help/magic.txt | 5 +- lib/mods/theme/help/skills.txt | 12 +- lib/mods/theme/help/tome_faq.txt | 7 - src/cmd6.cc | 106 +--- src/cmd7.cc | 1027 -------------------------------------- src/cmd7.hpp | 3 - src/defines.h | 17 - src/dungeon.cc | 10 - src/help.cc | 41 +- src/loadsave.cc | 12 - src/object1.cc | 65 +-- src/object1.hpp | 2 +- src/object2.cc | 61 +-- src/player_type.hpp | 6 - src/q_fireprof.cc | 32 +- src/rune_spell.hpp | 15 - src/rune_spell_fwd.hpp | 3 - src/skills.cc | 3 - src/skills_defs.hpp | 1 - src/store.cc | 10 - src/tables.cc | 10 - 53 files changed, 46 insertions(+), 2174 deletions(-) delete mode 100644 lib/help/c_runecr.txt delete mode 100644 lib/mods/theme/help/c_runecr.txt delete mode 100644 src/rune_spell.hpp delete mode 100644 src/rune_spell_fwd.hpp diff --git a/lib/edit/e_info.txt b/lib/edit/e_info.txt index 8174e41b..165d4771 100644 --- a/lib/edit/e_info.txt +++ b/lib/edit/e_info.txt @@ -98,18 +98,6 @@ F:SPELL R:50 F:PVAL_M2 -N:4:of Spell -T:6:0:255 -X:A:24:60 -W:0:2:8:40000 -C:0:0:0:0 -R:100 -F:ACTIVATE -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - ### Body Armor ### N:5:of Resist Acid diff --git a/lib/edit/k_info.txt b/lib/edit/k_info.txt index 8a3a37c7..1f97827b 100644 --- a/lib/edit/k_info.txt +++ b/lib/edit/k_info.txt @@ -5580,175 +5580,6 @@ A:30/1:45/1:55/1 D:This scroll is inscribed with a ritual which allows you to discern what fate holds in store for D:you. -### Here comes the Runes ### - -N:679:Self -G:?:b -I:105:0:0 -W:3:5:2:40 -A:3/1 -P:0:1d1:0:0:0 - -N:680:Ray -G:?:b -I:105:2:0 -W:10:5:2:300 -A:10/1 -P:0:1d1:0:0:0 -F:IGNORE_COLD -F:IGNORE_ELEC - -N:681:Sphere -G:?:b -I:105:3:0 -W:15:5:2:1000 -A:15/1 -P:0:1d1:0:0:0 -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:682:Knowledge -G:?:b -I:104:91:0 -W:6:5:2:200 -A:6/1 -P:0:1d1:0:0:0 - -N:683:Life -G:?:D -I:104:53:0 -W:3:5:2:200 -A:3/1 -P:0:1d1:0:0:0 - -N:684:Fire -G:?:r -I:104:5:0 -W:10:5:2:300 -A:10/1 -P:0:1d1:0:0:0 -F:IGNORE_FIRE - -N:685:Cold -G:?:b -I:104:4:0 -W:12:5:2:300 -A:12/1 -P:0:1d1:0:0:0 -F:IGNORE_COLD - -N:686:Lightning -G:?:W -I:104:1:0 -W:13:5:2:300 -A:13/1 -P:0:1d1:0:0:0 -F:IGNORE_ELEC - -N:687:Acid -G:?:B -I:104:3:0 -W:16:5:2:300 -A:16/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID - -N:688:Element -G:?:g -I:104:10:0 -W:23:5:2:1000 -A:23/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:689:Chaos -G:?:v -I:104:30:0 -W:26:5:2:2000 -A:26/1 -P:0:1d1:0:0:0 -F:ATTR_MULTI -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:690:Mind -G:?:D -I:104:85:0 -W:19:5:2:3000 -A:19/1 -P:0:1d1:0:0:0 -F:IGNORE_ELEC - -N:691:Holding -G:?:B -I:104:75:0 -W:5:5:2:500 -A:5/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID - -N:692:Arrow -G:?:b -I:105:1:0 -W:6:5:2:100 -A:6/1 -P:0:1d1:0:0:0 -F:IGNORE_ELEC - -N:693:Power Surge -G:?:b -I:105:4:0 -W:50:5:2:5000 -A:50/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:694:Armageddon -G:?:b -I:105:5:0 -W:30:5:2:4000 -A:30/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - -N:695:Gravity -G:?:G -I:104:35:0 -W:16:5:2:300 -A:16/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID - -# Now, the rest of the runes... - -N:697:Undeath -G:?:G -I:104:92:0 -W:35:5:2:1000 -A:35/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID - -N:698:Protection -G:?:G -I:104:74:0 -W:45:5:2:1500 -A:45/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID - # XXX # The Ring of Precognition (now a k_info.txt artifact) @@ -6431,19 +6262,6 @@ F:SLAY_ANIMAL D:A huge axe, the sort used for slaughtering animals, this weapon is unusually deadly against D:natural creatures. -N:806:& Runestone~ -G:?:v -I:105:255:0 -W:10:5:2:300 -A:10/3:20/2:30/1:60/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A small oval stone. One surface is flat, as if something ought to be scratched or inscribed into -D:it. - N:807:& Fortune cookie~ G:,:U I:80:42:500 diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index dd78db25..2846854f 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -207,7 +207,6 @@ C:k:+0:+700:Nature C:k:+0:+700:Meta C:k:+0:+700:Mind C:k:+0:+700:Necromancy -C:k:+0:+700:Runecraft C:k:+0:+700:Thaumaturgy C:k:+1000:+550:Spirituality C:k:+1000:+200:Combat @@ -284,7 +283,6 @@ C:a:k:+0:+300:Divination C:a:k:+0:+300:Meta C:a:k:+0:+300:Mind C:a:k:+0:+200:Necromancy -C:a:k:+0:+200:Runecraft C:a:k:+0:+200:Thaumaturgy C:a:O:36:2:1d1 C:a:O:111:50:1d1 @@ -306,17 +304,6 @@ C:a:O:23:4:1d1 C:a:O:111:50:1d1 C:a:b:25:Undead Form -C:a:N:Runecrafter -C:a:D:Runecrafters use the runes found in Middle-earth to create -C:a:D:finely tuned spells for each specific situation. -C:a:k:+1000:+50:Magic -C:a:k:+1000:+300:Runecraft -C:a:k:+0:-100:Weaponmastery -C:a:O:111:50:1d1 -C:a:O:105:1:1d1 -C:a:O:104:5:1d1 -C:a:O:23:4:1d1 - C:a:N:Thaumaturgist C:a:D:Thaumaturgy spells come from within and are different for each character. C:a:D:Since attack is the best defence, all their spells are offensive. diff --git a/lib/edit/s_info.txt b/lib/edit/s_info.txt index d708f177..9ad2eee7 100644 --- a/lib/edit/s_info.txt +++ b/lib/edit/s_info.txt @@ -112,11 +112,6 @@ A:7:Use Necromancy F:RANDOM_GAIN G:60 -N:34:Runecraft -D:Ability to combine magic runes to create your own spells -D:Runespells use the dexterity stat -A:9:Use Runespells - N:43:Thaumaturgy D:Ability to gain and cast innate spells D:Spells use the intelligence stat @@ -159,7 +154,6 @@ f:Mind:Magic%10 f:Udun:Magic%10 f:Demonology:Magic%10 f:Necromancy:Magic%4 -f:Runecraft:Magic%12 f:Thaumaturgy:Magic%6 @@ -328,7 +322,6 @@ E:Nature:Antimagic E:Udun:Antimagic E:Sorcery:Antimagic E:Demonology:Antimagic -E:Runecraft:Antimagic E:Necromancy:Antimagic E:Mindcraft:Antimagic E:Music:Antimagic @@ -435,7 +428,6 @@ T:Magic:Nature T:Magic:Udun T:Magic:Demonology T:Magic:Necromancy -T:Magic:Runecraft T:Magic:Thaumaturgy T:Geomancy:Fire diff --git a/lib/help/birth.txt b/lib/help/birth.txt index 990b5eba..89b04d53 100644 --- a/lib/help/birth.txt +++ b/lib/help/birth.txt @@ -241,7 +241,7 @@ or rogue. Spell casting generally requires a more experienced player that is familiar with survival techniques. *****c_mage.txt*0[Mage] *****c_rogue.txt*0[Rogue] - *****c_archer.txt*0[Archer] *****c_mimic.txt*0[Mimic] *****c_runecr.txt*0[Runecrafter] + *****c_archer.txt*0[Archer] *****c_mimic.txt*0[Mimic] *****c_assass.txt*0[Assassin] *****c_mindcr.txt*0[Mindcrafter] *****c_sorcer.txt*0[Sorceror] *****c_axemas.txt*0[Axemaster] *****c_monk.txt*0[Monk] *****c_summon.txt*0[Summoner] *****c_bard.txt*0[Bard] *****c_necro.txt*0[Necromancer] *****c_swordm.txt*0[Swordmaster] @@ -507,7 +507,6 @@ are listed in the following table. Geomancer -5 +3 0 +1 -2 +1 Mage -5 +3 0 +1 -2 +1 Necromancer -5 +3 0 +1 -2 +1 - Runecrafter -5 +3 0 +1 -2 +1 Sorceror -5 +3 0 +1 -2 +1 Thaumaturgist -5 +3 0 +1 -2 +1 Warper -5 +3 0 +1 -2 +1 diff --git a/lib/help/c_geoman.txt b/lib/help/c_geoman.txt index 47855875..ba8eaa66 100644 --- a/lib/help/c_geoman.txt +++ b/lib/help/c_geoman.txt @@ -43,7 +43,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.700] Nature 0.000 [0.700] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/c_mage.txt b/lib/help/c_mage.txt index 949d3bcc..9bfd6a3c 100644 --- a/lib/help/c_mage.txt +++ b/lib/help/c_mage.txt @@ -48,7 +48,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.900] Nature 0.000 [0.900] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/c_necro.txt b/lib/help/c_necro.txt index f3a5ad2c..c4b05e3c 100644 --- a/lib/help/c_necro.txt +++ b/lib/help/c_necro.txt @@ -42,7 +42,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.900] Nature 0.000 [0.500] Necromancy 1.000 [1.000] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/c_runecr.txt b/lib/help/c_runecr.txt deleted file mode 100644 index 8388eff9..00000000 --- a/lib/help/c_runecr.txt +++ /dev/null @@ -1,110 +0,0 @@ -~~~~~01|Runecrafter -~~~~~02|Classes|Runecrafter -#####R=== Runecrafters === - -#####GDescription -Instead of using spellbooks like the other spellcasters they instead -use mystic runes. To cast a spell they select a primary rune of the -elements (fire, cold, etc.) and they also choose a set of secondary runes, -which shape the effect of the first one. The secondary runes include -Self, Arrow, Ray, ... and Armageddon. After that they chose the amount -of mana to use and the spell is cast! But the more secondary runes they -chose the more mana is used to cast the spell. They also are bad -fighters, but if they concentrate all their mana in one spell -(especially with a mage staff of mana) they could kill nearly anything. - -#####GStarting Stat Modifiers -Strength -5 -Intelligence +3 -Wisdom +0 -Dexterity +1 -Constitution -2 -Charisma +1 -Hit Die +d0 -Spell Points +50% -Exp Penalty 30% - -#####GStarting Skills: -#####BSkill Start Level Skill Point Gains -Combat 1.000 [0.200] - Weaponmastery 0.700 [0.400] -Sneakiness 1.000 [0.900] - Stealth 0.000 [0.400] -Magic 2.000 [0.950] - Magic-Device 1.000 [1.200] - Spell-power 0.000 [0.600] - Mana 1.000 [0.600] - Geomancy - Fire 0.000 [0.700] - Water 0.000 [0.700] - Air 0.000 [0.700] - Earth 0.000 [0.700] - Meta 0.000 [0.700] - Conveyance 0.000 [0.700] - Divination 0.000 [0.700] - Temporal 0.000 [0.700] - Mind 0.000 [0.700] - Nature 0.000 [0.700] - Necromancy 0.000 [0.700] - Runecraft 1.000 [1.000] - Thaumaturgy 0.000 [0.700] -Spirituality 1.000 [0.550] - Prayer 0.000 [0.500] -Monster-lore 0.000 [0.500] - -*A Runecrafter cannot learn the Geomancy skill, but it is shown in his skill -screen because the elemental schools are sub-skills of it. - -#####GInnate Abilities: -#####BAbility Character level -Perfect casting 1 - -~~~~~03|Runecrafter|Runecrafter powers -~~~~~04|Skills|Runecrafting - Runecrafter powers -#####GRune Magic -Runecrafters combine runes using the 'm' command. They first select a -rune that controls magic type, then apply one or more runes to fine-tune -effects, (pressing ESC when done), and then input the amount of mana -they wish to expend on the spell. - -Runecrafters can cast the spells from their runes in several ways: -1. On-the-fly by combining runes when they need them. -2. Memorise rune combinations for quick use when needed (and they don't - need to be able to see then!), and then later cast from memory. -3. Carving them into a Runestone, then using the Runestone later (takes - less mana, but they have to be able to see). - -[[[[[BSpell Types:] -(Some kinds are not listed, and are left for the reader to discover...) - Knowledge: Identify all objects in affected grids, Self-knowledge - if Self rune is used. - Life: Heals monsters in affected grids, heals player if Self rune - is used. - Fire, Cold, Lightning, Acid: Casts magics of that element. - Elements: Irresistible damage. - Mind: A mind blast that badly effects intelligent monsters. - Temporary ESP if Self rune is used. - Gravity: A gravity spell that both does damage and whisks affected - creatures around. - -[[[[[BSpell Effects] (all are listed): - Self: Effects the caster. This rune can be used with any other; - if used alone, only the caster's grid is affected. - Arrow: Spell will include a bolt effect. This allows aiming. - Ray: Spell will include a beam effect. This allows aiming. - Increases difficulty slightly. - Sphere: Spell will end with a circular explosion. Increases - difficulty a bit. Can be used alone, or with Self, Arrow, or - Ray. - Power Surge: Not currently recommended for use. Increases - difficulty a lot. - Armageddon: Hurls down meteors of the magical type in the vicinity - of the caster. Increases difficulty noticeably, but can do a - great deal of damage. - -#####GStarting Equipment -A Runecrafter begins the game with: - a Rune [Fire] - a Rune [Arrow] - a Dagger - diff --git a/lib/help/c_sorcer.txt b/lib/help/c_sorcer.txt index 8a33184f..c2fbdbb0 100644 --- a/lib/help/c_sorcer.txt +++ b/lib/help/c_sorcer.txt @@ -48,7 +48,6 @@ Magic 1.000 [1.000] Mind 0.000 [1.000] Nature 0.000 [1.000] Necromancy 0.000 [1.000] - Runecraft 0.000 [0.900] Thaumaturgy 0.000 [0.900] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/c_thaum.txt b/lib/help/c_thaum.txt index 653e84fa..2680a1c4 100644 --- a/lib/help/c_thaum.txt +++ b/lib/help/c_thaum.txt @@ -46,7 +46,6 @@ Magic 3.000 [0.950] Mind 0.000 [0.700] Nature 0.000 [0.700] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 1.000 [1.000] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/c_warper.txt b/lib/help/c_warper.txt index 55d16be5..1c461049 100644 --- a/lib/help/c_warper.txt +++ b/lib/help/c_warper.txt @@ -41,7 +41,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.700] Nature 0.000 [0.800] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/help/index.txt b/lib/help/index.txt index 5bf20d66..a22e26d5 100644 --- a/lib/help/index.txt +++ b/lib/help/index.txt @@ -106,7 +106,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****c_pr_man.txt*02[Priest - Manwe] *****c_ranger.txt*02[Ranger] *****c_rogue.txt*02[Rogue] - *****c_runecr.txt*02[Runecrafter] *****c_sorcer.txt*02[Sorceror] *****birth.txt*77[Stat Bonuses] *****c_summon.txt*02[Summoners] @@ -399,8 +398,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****c_ranger.txt*01[Ranger] *****c_rogue.txt*01[Rogue] *****r_rohank.txt*01[RohanKnight] - *****c_runecr.txt*01[Runecrafter] - *****c_runecr.txt*03[Runecrafter powers] *****tome_faq.txt*11[Runes] ~~~~~83 *****/Sindex.txt*83[S] @@ -467,8 +464,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****skills.txt*45[Possession] *****c_posses.txt*04[Possession - Possessor powers ] *****skills.txt*39[Prayer] - *****skills.txt*36[Runecraft] - *****c_runecr.txt*04[Runecrafting - Runecrafter powers] *****skills.txt*56[Screen] *****skills.txt*09[Sling-mastery] *****skills.txt*14[Sneakiness] diff --git a/lib/help/magic.txt b/lib/help/magic.txt index 14fa6570..1811be84 100644 --- a/lib/help/magic.txt +++ b/lib/help/magic.txt @@ -23,14 +23,13 @@ schools: Other magical skills, generally being used primarily by characters of a specific class, are: - *****m_demono.txt*0[Demonology] *****m_necrom.txt*0[Necromancy] *****skills.txt*36[Runecraft] + *****m_demono.txt*0[Demonology] *****m_necrom.txt*0[Necromancy] *****m_thaum.txt*0[Thaumaturgy] *****m_geoman.txt*0[Geomancy] The *****m_demono.txt*0[Demonology] skill is primarily used by *****c_demono.txt*0[Demonologists] for their special spells, whereas the *****m_necrom.txt*0[Necromancy] skill is used by *****c_necro.txt*0[Necromancers] for their own set of special spells. -The same goes for *****skills.txt*36[Runecraft], which is used by *****c_runecr.txt*0[Runecrafters] to allow use of more -difficult runes or rune-combinations. *****m_thaum.txt*0[Thaumaturgy] gives you randomly chosen +*****m_thaum.txt*0[Thaumaturgy] gives you randomly chosen attack spells, and as such each game with it will be different. *****c_geoman.txt*0[Geomancers] harness the powers of the elements using *****m_geoman.txt*0[Geomancy]. diff --git a/lib/help/skills.txt b/lib/help/skills.txt index 32e9df04..a7d1ed36 100644 --- a/lib/help/skills.txt +++ b/lib/help/skills.txt @@ -63,8 +63,7 @@ gets the free points). For example, a skill point put into Weaponmastery raises Combat by 0.5 skill points. This is actually multiplied by the skill modifier that your character has in the Combat skill. For example, a Swordmaster investing a skill point into Weaponmastery would have his Combat -skill raised by 0.5 * [0.900] while a Runecrafter would have his Combat -skill raised by 0.5 * [0.200]. +skill raised by 0.5 * [0.900]. As well as this, skills are grouped together in similar types. Looking under the Combat skill, there are subtypes of Weaponmastery, Archery and Antimagic. @@ -117,7 +116,7 @@ The skills are: *****skills.txt*21[Magic] *****skills.txt*54[Magic-device] *****skills.txt*24[Mana] *****skills.txt*29[Meta] *****skills.txt*47[Mimicry] *****skills.txt*33[Mind] *****skills.txt*41[Mindcraft] *****skills.txt*42[Monster-lore] *****skills.txt*59[Music] *****skills.txt*34[Nature] *****skills.txt*35[Necromancy] *****skills.txt*07[Polearm-mastery] - *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*36[Runecraft] *****skills.txt*09[Sling-mastery] + *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*09[Sling-mastery] *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] *****skills.txt*19[Stealing] *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] *****skills.txt*03[Sword-mastery] *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] *****skills.txt*48[Udun] @@ -305,7 +304,7 @@ ability. Sub-skills include: Magic-device, Spell-power, Sorcery, Mana, Fire, Water, Air, Earth, Meta, Conveyance, Divination, Temporal, Mind, Nature, Udun, Demonology, -Necromancy, Runecraft, and Thaumaturgy. +Necromancy, and Thaumaturgy. ~~~~~54|Skills|Magic-device [[[[[BMagic-device] This skill is a sub-skill of the Magic skill. It eases the use of magical @@ -446,11 +445,6 @@ point on your Necromancy skill adds 0.04 bonus skill points to your Magic skill. Investing in the Necromancy skill? You might be interested in the *****ability.txt*08[Touch of Death] and *****ability.txt*12[Undead Form] abilities. -~~~~~36|Skills|Runecraft -[[[[[BRunecraft] -This skill is a sub-skill of the Magic skill. This is the base skill of the -Runecrafter class. Spending 1 skill point on your Runecraft skill adds 0.12 -bonus skill points to your Magic skill. ~~~~~37|Skills|Thaumaturgy [[[[[BThaumaturgy] This skill is a sub-skill of the Magic skill. Each level of *****m_thaum.txt*0[thaumaturgy] gives diff --git a/lib/help/tome_faq.txt b/lib/help/tome_faq.txt index 171b74d4..f8f03c36 100644 --- a/lib/help/tome_faq.txt +++ b/lib/help/tome_faq.txt @@ -101,13 +101,6 @@ activation can be something very nasty.... To activate it, use the normal Activation command, but when prompted for which item to activate change to the backpack instead of wielded equipment. -~~~~~11|Runes -#####G------------------------------------------------------------------------------ -#####GQ: I keep coming across "runes". What are they? - -Runes are used to cast and store spells of varying types. *****c_runecr.txt*0[Runecrafters] are the -class who are most proficient at using these. You can only use them if you -have access to the *****skills.txt*36[Runecrafting] skill. ~~~~~12|Homes #####G------------------------------------------------------------------------------ #####GQ: Where can I store all my equipment? Theere's not enough room in my diff --git a/lib/mods/theme/edit/e_info.txt b/lib/mods/theme/edit/e_info.txt index 6361c33e..03671cf8 100644 --- a/lib/mods/theme/edit/e_info.txt +++ b/lib/mods/theme/edit/e_info.txt @@ -98,18 +98,6 @@ F:SPELL R:50 F:PVAL_M2 -N:4:of Spell -T:6:0:99 -X:A:24:60 -W:0:2:8:40000 -C:0:0:0:0 -R:100 -F:ACTIVATE -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE - ### Body Armor ### N:5:of Resist Acid diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt index c15808dc..6cfe4dee 100644 --- a/lib/mods/theme/edit/k_info.txt +++ b/lib/mods/theme/edit/k_info.txt @@ -5694,213 +5694,6 @@ A:30/1:45/1:55/1 D:This scroll is inscribed with a ritual which allows you to discern what fate holds in store for D:you. -### Here comes the Runes ### - -N:679:Self -G:?:b -I:105:0:0 -W:3:5:2:40 -A:3/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -D:A rune signifying the caster. - -N:680:Ray -G:?:b -I:105:2:0 -W:10:5:2:300 -A:10/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_COLD -F:IGNORE_ELEC -D:A rune signifying a beam or ray. - -N:681:Sphere -G:?:b -I:105:3:0 -W:15:5:2:1000 -A:15/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rune signifying a ball or sphere. - -N:682:Knowledge -G:?:b -I:104:91:0 -W:6:5:2:200 -A:6/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -D:A rune signifying knowledge. - -N:683:Life -G:?:D -I:104:53:0 -W:3:5:2:200 -A:3/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -D:A rune signifying life. - -N:684:Fire -G:?:r -I:104:5:0 -W:10:5:2:300 -A:10/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_FIRE -D:A rune signifying flame. - -N:685:Cold -G:?:b -I:104:4:0 -W:12:5:2:300 -A:12/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_COLD -D:A rune signifying cold. - -N:686:Lightning -G:?:W -I:104:1:0 -W:13:5:2:300 -A:13/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ELEC -D:A rune signifying a lightning beam. - -N:687:Acid -G:?:B -I:104:3:0 -W:16:5:2:300 -A:16/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -D:A rune signifying acid. - -N:688:Element -G:?:g -I:104:10:0 -W:23:5:2:1000 -A:23/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rune signifying an element. - -N:689:Chaos -G:?:v -I:104:30:0 -W:26:5:2:2000 -A:26/1 -P:0:1d1:0:0:0 -F:ATTR_MULTI -F:EASY_KNOW -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rune signifying raw chaos. - -N:690:Mind -G:?:D -I:104:85:0 -W:19:5:2:3000 -A:19/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ELEC -D:A rune signifying the mind. - -N:691:Holding -G:?:B -I:104:75:0 -W:5:5:2:500 -A:5/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -D:A rune signifying the action of holding, or sleep. - -N:692:Arrow -G:?:b -I:105:1:0 -W:6:5:2:100 -A:6/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ELEC -D:A rune signifying an arrow. - -N:693:Power Surge -G:?:b -I:105:4:0 -W:50:5:2:5000 -A:50/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rune signifying a powerful surge. - -N:694:Armageddon -G:?:b -I:105:5:0 -W:30:5:2:4000 -A:30/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A rune signifying a powerful blast. - -N:695:Gravity -G:?:G -I:104:35:0 -W:16:5:2:300 -A:16/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -D:A rune signifying the forces of gravity. - -# XXX - -N:697:Undeath -G:?:G -I:104:92:0 -W:35:5:2:1000 -A:35/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -D:A rune signifying undeath. - -N:698:Protection -G:?:G -I:104:74:0 -W:45:5:2:1500 -A:45/1 -P:0:1d1:0:0:0 -F:EASY_KNOW -F:IGNORE_ACID -D:A rune signifying protection. - # XXX # The Ring of Precognition (now a k_info.txt artifact) @@ -6572,19 +6365,6 @@ F:SLAY_ANIMAL D:A huge axe, the sort used for slaughtering animals, this weapon is unusually deadly against D:natural creatures. -N:806:& Runestone~ -G:?:v -I:105:255:0 -W:10:5:2:300 -A:10/3:20/2:30/1:60/1 -P:0:1d1:0:0:0 -F:IGNORE_ACID -F:IGNORE_COLD -F:IGNORE_ELEC -F:IGNORE_FIRE -D:A small oval stone. One surface is flat, as if something ought to be scratched or inscribed into -D:it. - N:807:& Fortune cookie~ G:,:U I:80:42:500 diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index dca8ff4b..18e638d3 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -232,7 +232,6 @@ C:k:+0:+700:Nature C:k:+0:+700:Meta C:k:+0:+700:Mind C:k:+0:+700:Necromancy -C:k:+0:+700:Runecraft C:k:+0:+700:Thaumaturgy C:k:+1000:+550:Spirituality C:k:+1000:+200:Combat @@ -309,7 +308,6 @@ C:a:k:+0:+300:Divination C:a:k:+0:+300:Meta C:a:k:+0:+300:Mind C:a:k:+0:+200:Necromancy -C:a:k:+0:+200:Runecraft C:a:k:+0:+200:Thaumaturgy C:a:O:36:2:1d1 C:a:O:111:50:1d1 @@ -331,17 +329,6 @@ C:a:O:23:4:1d1 C:a:O:111:50:1d1 C:a:b:25:Undead Form -C:a:N:Runecrafter -C:a:D:Runecrafters use the runes found in Middle-earth to create -C:a:D:finely tuned spells for each specific situation. -C:a:k:+1000:+50:Magic -C:a:k:+1000:+300:Runecraft -C:a:k:+0:-100:Weaponmastery -C:a:O:111:50:1d1 -C:a:O:105:1:1d1 -C:a:O:104:5:1d1 -C:a:O:23:4:1d1 - C:a:N:Thaumaturgist C:a:D:Thaumaturgy spells come from within and are different for each character. C:a:D:Since attack is the best defence, all their spells are offensive. @@ -359,7 +346,6 @@ C:a:k:=0:=0:Nature C:a:k:=0:=0:Meta C:a:k:=0:=0:Mind C:a:k:=0:=0:Necromancy -C:a:k:=0:=0:Runecraft C:a:k:+1000:+300:Thaumaturgy C:a:k:+0:-100:Weaponmastery C:a:k:+0:-150:Magic-Device @@ -381,7 +367,6 @@ C:a:k:=0:=0:Nature C:a:k:=0:=0:Temporal C:a:k:=0:=0:Meta C:a:k:=0:=0:Necromancy -C:a:k:=0:=0:Runecraft C:a:k:=0:=0:Thaumaturgy C:a:k:+1000:+300:Divination C:a:k:+1000:+300:Mind diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt index b40e20b5..0384f153 100644 --- a/lib/mods/theme/edit/s_info.txt +++ b/lib/mods/theme/edit/s_info.txt @@ -113,11 +113,6 @@ A:7:Use Necromancy F:RANDOM_GAIN G:60 -N:34:Runecraft -D:Ability to combine magic runes to create your own spells -D:Runespells use the dexterity stat -A:9:Use Runespells - N:43:Thaumaturgy D:Ability to gain and cast innate spells D:Spells use the intelligence stat @@ -160,7 +155,6 @@ f:Mind:Magic%10 f:Udun:Magic%10 f:Demonology:Magic%10 f:Necromancy:Magic%4 -f:Runecraft:Magic%12 f:Thaumaturgy:Magic%6 @@ -330,7 +324,6 @@ E:Nature:Antimagic E:Udun:Antimagic E:Sorcery:Antimagic E:Demonology:Antimagic -E:Runecraft:Antimagic E:Necromancy:Antimagic E:Mindcraft:Antimagic E:Music:Antimagic @@ -437,7 +430,6 @@ T:Magic:Nature T:Magic:Udun T:Magic:Demonology T:Magic:Necromancy -T:Magic:Runecraft T:Magic:Thaumaturgy T:Geomancy:Fire diff --git a/lib/mods/theme/edit/st_info.txt b/lib/mods/theme/edit/st_info.txt index 6f8514b1..88303fff 100644 --- a/lib/mods/theme/edit/st_info.txt +++ b/lib/mods/theme/edit/st_info.txt @@ -897,19 +897,6 @@ O:186:187:188:189 G:*:w W:24 -# Rune Shop -N:62:Runic Magic Shop -T:100:104:256 -T:100:104:256 -T:100:104:256 -T:50:105:256 -T:50:105:256 -T:50:105:256 -A:0:0:1:2:3:4 -O:190:191:192:193 -G:6:w -W:24 - # based on Mining Supply store in Khazad-Dum N:63:Construction Supply Store T:100:20:256 diff --git a/lib/mods/theme/edit/t_edoras.txt b/lib/mods/theme/edit/t_edoras.txt index 9ab17db6..aa0b9641 100644 --- a/lib/mods/theme/edit/t_edoras.txt +++ b/lib/mods/theme/edit/t_edoras.txt @@ -28,9 +28,6 @@ F:c:74:3:0:0:0:0:64 #The Library F:g:74:3:0:0:0:0:13 -#Rune shop -F:r:74:3:0:0:0:0:62 - #The Beastmaster F:b:74:3:0:0:0:0:16 @@ -74,7 +71,7 @@ D:#--------------------------------------------###-----------OOO--------O------- D:#-------------------------------------------###-----------OOO----------O-----------###----------OO-----------------OOOO##-----------OO--OO-######----##------------,---------------------------------# D:#-------------------------------------------##-----------OOO-OOOOOOOOOOOOO--------##------------OO-------------------OOO##----#####aOOO--O-######----##------------,---------------------------------# D:#------------------------------------------##-----------OOO--O###########O------###-------------OO---------------------OO##---######--OOOOOOO---------##-----------,---------------------------------# -D:#------------------------------------------##----------OOOOOOOr#########rO-----##---------------OO----------------------OO##--######---#c##g#---------##-----------,---------------------------------# +D:#------------------------------------------##----------OOOOOOO###########O-----##---------------OO----------------------OO##--######---#c##g#---------##-----------,---------------------------------# D:#------------------------------------------##----------OOO---O###########O----###---------------OO#########--------------OO##----------######---------##-----------,---------------------------------# D:#------------------------------------------##----------OOO---OOOOOOOOOOOOO---###----------------OO-----######-------------OO##---------######----------##----------,,--------------------------------# D:#------------------------------------------##---------OOOO-------------------##-----------------OO---------####------------OO##------------------------##-----------,--------------------------------# @@ -114,4 +111,4 @@ D:#-----------------------------------------------------------------------#####- D:#--------------------------------------------------------------------------######--------------------------------#########---------------------------------------------------------------------------# D:#-----------------------------------------------------------------------------###########----------------############--------------------------------------------------------------------------------# D:#-----------------------------------------------------------------------------------########################-----------------------------------------------------------------------------------------# -D:###################################################################################################################################################################################################### \ No newline at end of file +D:###################################################################################################################################################################################################### diff --git a/lib/mods/theme/edit/t_pelar.txt b/lib/mods/theme/edit/t_pelar.txt index fcc31244..08e9d7d2 100644 --- a/lib/mods/theme/edit/t_pelar.txt +++ b/lib/mods/theme/edit/t_pelar.txt @@ -22,9 +22,6 @@ F:c:74:3:0:0:0:0:86 # Music store F:d:74:3:0:0:0:0:64 -# Rune Shop -F:e:74:3:0:0:0:0:62 - # Hunting Store F:f:74:3:0:0:0:0:61 @@ -73,7 +70,7 @@ D:#-------------------------------------------------OVVVVVVVVVVVVVVVVVVVVVVVVVVV D:#-------------------------------------------------OVVVVVVVVVVVVVVVVVVVVVVVVVVV.......########................OOOO6###########9OOOOOOOOO#,,,,,,,,#####VVV@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVVVVVVVVVVVVVVVVVVVVVVVV.........#cc#...............#####,O#############O,,,,,,#####,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@#######################.......................####,,,,,,O,,#######,OO,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# -D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,,OOOOO##....................#####,,,,,,,,,O,###e###O,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# +D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,,OOOOO##....................#####,,,,,,,,,O,#######O,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@####,,#####,,,,O,,,,,##..................###,,,,,,,,,,,,,,OOOOOOOO,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@####,,####bOO,O,,,,,,##.................###,,,,,#######,,,,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@####,,#####,,O,,####,##................aaa##,,,,#######,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# @@ -102,4 +99,4 @@ D:#-------------------------------------------------@VVVVV@##########aaaaaaaaaaa D:#-------------------------------------------------@VVVVV@#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# D:#-------------------------------------------------@VVVVV@##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# -D:###################################################################################################################################################################################################### \ No newline at end of file +D:###################################################################################################################################################################################################### diff --git a/lib/mods/theme/help/birth.txt b/lib/mods/theme/help/birth.txt index 9e7da8dd..28685c7d 100644 --- a/lib/mods/theme/help/birth.txt +++ b/lib/mods/theme/help/birth.txt @@ -260,7 +260,7 @@ or rogue. Spell casting generally requires a more experienced player that is familiar with survival techniques. *****c_archer.txt*0[Archer] *****c_mimic.txt*0[Mimic] *****c_rogue.txt*0[Rogue] - *****c_ascet.txt*0[Ascetic] *****c_mindcr.txt*0[Mindcrafter] *****c_runecr.txt*0[Runecrafter] + *****c_ascet.txt*0[Ascetic] *****c_mindcr.txt*0[Mindcrafter] *****c_assass.txt*0[Assassin] *****c_monk.txt*0[Monk] *****c_sorcer.txt*0[Sorceror] *****c_axemas.txt*0[Axemaster] *****c_necro.txt*0[Necromancer] *****c_stonewr.txt*0[Stonewright] *****c_bard.txt*0[Bard] *****c_palad.txt*0[Paladin] *****c_swordm.txt*0[Swordmaster] @@ -558,7 +558,6 @@ are listed in the following table. Geomancer -5 +3 0 +1 -2 +1 Mage -5 +3 0 +1 -2 +1 Necromancer -5 +3 0 +1 -2 +1 - Runecrafter -5 +3 0 +1 -2 +1 Sorceror -5 +3 0 +1 -2 +1 Thaumaturgist -5 +3 0 +1 -2 +1 Warper -5 +3 0 +1 -2 +1 @@ -656,4 +655,4 @@ are listed in the following table. (Lygrog) +5 +5 +5 +10 +5 +50 +0 +0 +30 feet (Limrog) +2 +2 +2 +2 +2 +30 +0 +0 +20 feet (Rawrog) +0 +0 +4 -3 +0 +10 +10 +10 +0 feet - (Adanrog) +1 +1 +1 +1 +1 +20 +15 +10 +20 feet \ No newline at end of file + (Adanrog) +1 +1 +1 +1 +1 +20 +15 +10 +20 feet diff --git a/lib/mods/theme/help/c_geoman.txt b/lib/mods/theme/help/c_geoman.txt index 47855875..ba8eaa66 100644 --- a/lib/mods/theme/help/c_geoman.txt +++ b/lib/mods/theme/help/c_geoman.txt @@ -43,7 +43,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.700] Nature 0.000 [0.700] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/c_mage.txt b/lib/mods/theme/help/c_mage.txt index 949d3bcc..9bfd6a3c 100644 --- a/lib/mods/theme/help/c_mage.txt +++ b/lib/mods/theme/help/c_mage.txt @@ -48,7 +48,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.900] Nature 0.000 [0.900] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/c_necro.txt b/lib/mods/theme/help/c_necro.txt index f3a5ad2c..c4b05e3c 100644 --- a/lib/mods/theme/help/c_necro.txt +++ b/lib/mods/theme/help/c_necro.txt @@ -42,7 +42,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.900] Nature 0.000 [0.500] Necromancy 1.000 [1.000] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/c_runecr.txt b/lib/mods/theme/help/c_runecr.txt deleted file mode 100644 index 8388eff9..00000000 --- a/lib/mods/theme/help/c_runecr.txt +++ /dev/null @@ -1,110 +0,0 @@ -~~~~~01|Runecrafter -~~~~~02|Classes|Runecrafter -#####R=== Runecrafters === - -#####GDescription -Instead of using spellbooks like the other spellcasters they instead -use mystic runes. To cast a spell they select a primary rune of the -elements (fire, cold, etc.) and they also choose a set of secondary runes, -which shape the effect of the first one. The secondary runes include -Self, Arrow, Ray, ... and Armageddon. After that they chose the amount -of mana to use and the spell is cast! But the more secondary runes they -chose the more mana is used to cast the spell. They also are bad -fighters, but if they concentrate all their mana in one spell -(especially with a mage staff of mana) they could kill nearly anything. - -#####GStarting Stat Modifiers -Strength -5 -Intelligence +3 -Wisdom +0 -Dexterity +1 -Constitution -2 -Charisma +1 -Hit Die +d0 -Spell Points +50% -Exp Penalty 30% - -#####GStarting Skills: -#####BSkill Start Level Skill Point Gains -Combat 1.000 [0.200] - Weaponmastery 0.700 [0.400] -Sneakiness 1.000 [0.900] - Stealth 0.000 [0.400] -Magic 2.000 [0.950] - Magic-Device 1.000 [1.200] - Spell-power 0.000 [0.600] - Mana 1.000 [0.600] - Geomancy - Fire 0.000 [0.700] - Water 0.000 [0.700] - Air 0.000 [0.700] - Earth 0.000 [0.700] - Meta 0.000 [0.700] - Conveyance 0.000 [0.700] - Divination 0.000 [0.700] - Temporal 0.000 [0.700] - Mind 0.000 [0.700] - Nature 0.000 [0.700] - Necromancy 0.000 [0.700] - Runecraft 1.000 [1.000] - Thaumaturgy 0.000 [0.700] -Spirituality 1.000 [0.550] - Prayer 0.000 [0.500] -Monster-lore 0.000 [0.500] - -*A Runecrafter cannot learn the Geomancy skill, but it is shown in his skill -screen because the elemental schools are sub-skills of it. - -#####GInnate Abilities: -#####BAbility Character level -Perfect casting 1 - -~~~~~03|Runecrafter|Runecrafter powers -~~~~~04|Skills|Runecrafting - Runecrafter powers -#####GRune Magic -Runecrafters combine runes using the 'm' command. They first select a -rune that controls magic type, then apply one or more runes to fine-tune -effects, (pressing ESC when done), and then input the amount of mana -they wish to expend on the spell. - -Runecrafters can cast the spells from their runes in several ways: -1. On-the-fly by combining runes when they need them. -2. Memorise rune combinations for quick use when needed (and they don't - need to be able to see then!), and then later cast from memory. -3. Carving them into a Runestone, then using the Runestone later (takes - less mana, but they have to be able to see). - -[[[[[BSpell Types:] -(Some kinds are not listed, and are left for the reader to discover...) - Knowledge: Identify all objects in affected grids, Self-knowledge - if Self rune is used. - Life: Heals monsters in affected grids, heals player if Self rune - is used. - Fire, Cold, Lightning, Acid: Casts magics of that element. - Elements: Irresistible damage. - Mind: A mind blast that badly effects intelligent monsters. - Temporary ESP if Self rune is used. - Gravity: A gravity spell that both does damage and whisks affected - creatures around. - -[[[[[BSpell Effects] (all are listed): - Self: Effects the caster. This rune can be used with any other; - if used alone, only the caster's grid is affected. - Arrow: Spell will include a bolt effect. This allows aiming. - Ray: Spell will include a beam effect. This allows aiming. - Increases difficulty slightly. - Sphere: Spell will end with a circular explosion. Increases - difficulty a bit. Can be used alone, or with Self, Arrow, or - Ray. - Power Surge: Not currently recommended for use. Increases - difficulty a lot. - Armageddon: Hurls down meteors of the magical type in the vicinity - of the caster. Increases difficulty noticeably, but can do a - great deal of damage. - -#####GStarting Equipment -A Runecrafter begins the game with: - a Rune [Fire] - a Rune [Arrow] - a Dagger - diff --git a/lib/mods/theme/help/c_sorcer.txt b/lib/mods/theme/help/c_sorcer.txt index 8a33184f..c2fbdbb0 100644 --- a/lib/mods/theme/help/c_sorcer.txt +++ b/lib/mods/theme/help/c_sorcer.txt @@ -48,7 +48,6 @@ Magic 1.000 [1.000] Mind 0.000 [1.000] Nature 0.000 [1.000] Necromancy 0.000 [1.000] - Runecraft 0.000 [0.900] Thaumaturgy 0.000 [0.900] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/c_thaum.txt b/lib/mods/theme/help/c_thaum.txt index 653e84fa..2680a1c4 100644 --- a/lib/mods/theme/help/c_thaum.txt +++ b/lib/mods/theme/help/c_thaum.txt @@ -46,7 +46,6 @@ Magic 3.000 [0.950] Mind 0.000 [0.700] Nature 0.000 [0.700] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 1.000 [1.000] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/c_warper.txt b/lib/mods/theme/help/c_warper.txt index 55d16be5..1c461049 100644 --- a/lib/mods/theme/help/c_warper.txt +++ b/lib/mods/theme/help/c_warper.txt @@ -41,7 +41,6 @@ Magic 1.000 [0.900] Mind 0.000 [0.700] Nature 0.000 [0.800] Necromancy 0.000 [0.700] - Runecraft 0.000 [0.700] Thaumaturgy 0.000 [0.700] Spirituality 1.000 [0.550] Prayer 0.000 [0.500] diff --git a/lib/mods/theme/help/index.txt b/lib/mods/theme/help/index.txt index c0d874ef..84bef517 100644 --- a/lib/mods/theme/help/index.txt +++ b/lib/mods/theme/help/index.txt @@ -116,7 +116,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****c_pr_varda.txt*02[Priest - Varda] *****c_ranger.txt*02[Ranger] *****c_rogue.txt*02[Rogue] - *****c_runecr.txt*02[Runecrafter] *****c_sorcer.txt*02[Sorceror] *****c_sniper.txt*02[Sniper] *****birth.txt*77[Stat Bonuses] @@ -447,9 +446,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****c_ranger.txt*01[Ranger] *****c_rogue.txt*01[Rogue] *****r_rohank.txt*01[RohanKnight] - *****c_runecr.txt*01[Runecrafter] - *****c_runecr.txt*03[Runecrafter powers] - *****tome_faq.txt*11[Runes] ~~~~~83 *****/Sindex.txt*83[S] *****command.txt*125[Saving and Exiting] @@ -516,8 +512,6 @@ Don't forget you can browse the help from the *****help.hlp*02[Main menu]. *****skills.txt*45[Possession] *****c_posses.txt*04[Possession - Possessor powers ] *****skills.txt*39[Prayer] - *****skills.txt*36[Runecraft] - *****c_runecr.txt*04[Runecrafting - Runecrafter powers] *****skills.txt*56[Screen] *****skills.txt*09[Sling-mastery] *****skills.txt*14[Sneakiness] diff --git a/lib/mods/theme/help/magic.txt b/lib/mods/theme/help/magic.txt index 14fa6570..1811be84 100644 --- a/lib/mods/theme/help/magic.txt +++ b/lib/mods/theme/help/magic.txt @@ -23,14 +23,13 @@ schools: Other magical skills, generally being used primarily by characters of a specific class, are: - *****m_demono.txt*0[Demonology] *****m_necrom.txt*0[Necromancy] *****skills.txt*36[Runecraft] + *****m_demono.txt*0[Demonology] *****m_necrom.txt*0[Necromancy] *****m_thaum.txt*0[Thaumaturgy] *****m_geoman.txt*0[Geomancy] The *****m_demono.txt*0[Demonology] skill is primarily used by *****c_demono.txt*0[Demonologists] for their special spells, whereas the *****m_necrom.txt*0[Necromancy] skill is used by *****c_necro.txt*0[Necromancers] for their own set of special spells. -The same goes for *****skills.txt*36[Runecraft], which is used by *****c_runecr.txt*0[Runecrafters] to allow use of more -difficult runes or rune-combinations. *****m_thaum.txt*0[Thaumaturgy] gives you randomly chosen +*****m_thaum.txt*0[Thaumaturgy] gives you randomly chosen attack spells, and as such each game with it will be different. *****c_geoman.txt*0[Geomancers] harness the powers of the elements using *****m_geoman.txt*0[Geomancy]. diff --git a/lib/mods/theme/help/skills.txt b/lib/mods/theme/help/skills.txt index 32e9df04..6d6638d6 100644 --- a/lib/mods/theme/help/skills.txt +++ b/lib/mods/theme/help/skills.txt @@ -63,8 +63,7 @@ gets the free points). For example, a skill point put into Weaponmastery raises Combat by 0.5 skill points. This is actually multiplied by the skill modifier that your character has in the Combat skill. For example, a Swordmaster investing a skill point into Weaponmastery would have his Combat -skill raised by 0.5 * [0.900] while a Runecrafter would have his Combat -skill raised by 0.5 * [0.200]. +skill raised by 0.5 * [0.900]. As well as this, skills are grouped together in similar types. Looking under the Combat skill, there are subtypes of Weaponmastery, Archery and Antimagic. @@ -117,7 +116,7 @@ The skills are: *****skills.txt*21[Magic] *****skills.txt*54[Magic-device] *****skills.txt*24[Mana] *****skills.txt*29[Meta] *****skills.txt*47[Mimicry] *****skills.txt*33[Mind] *****skills.txt*41[Mindcraft] *****skills.txt*42[Monster-lore] *****skills.txt*59[Music] *****skills.txt*34[Nature] *****skills.txt*35[Necromancy] *****skills.txt*07[Polearm-mastery] - *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*36[Runecraft] *****skills.txt*09[Sling-mastery] + *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*09[Sling-mastery] *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery] *****skills.txt*19[Stealing] *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning] *****skills.txt*03[Sword-mastery] *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy] *****skills.txt*48[Udun] @@ -305,7 +304,7 @@ ability. Sub-skills include: Magic-device, Spell-power, Sorcery, Mana, Fire, Water, Air, Earth, Meta, Conveyance, Divination, Temporal, Mind, Nature, Udun, Demonology, -Necromancy, Runecraft, and Thaumaturgy. +Necromancy, and Thaumaturgy. ~~~~~54|Skills|Magic-device [[[[[BMagic-device] This skill is a sub-skill of the Magic skill. It eases the use of magical @@ -446,11 +445,6 @@ point on your Necromancy skill adds 0.04 bonus skill points to your Magic skill. Investing in the Necromancy skill? You might be interested in the *****ability.txt*08[Touch of Death] and *****ability.txt*12[Undead Form] abilities. -~~~~~36|Skills|Runecraft -[[[[[BRunecraft] -This skill is a sub-skill of the Magic skill. This is the base skill of the -Runecrafter class. Spending 1 skill point on your Runecraft skill adds 0.12 -bonus skill points to your Magic skill. ~~~~~37|Skills|Thaumaturgy [[[[[BThaumaturgy] This skill is a sub-skill of the Magic skill. Each level of *****m_thaum.txt*0[thaumaturgy] gives diff --git a/lib/mods/theme/help/tome_faq.txt b/lib/mods/theme/help/tome_faq.txt index 55f6375b..d321a28a 100644 --- a/lib/mods/theme/help/tome_faq.txt +++ b/lib/mods/theme/help/tome_faq.txt @@ -101,13 +101,6 @@ activation can be something very nasty.... To activate it, use the normal Activation command, but when prompted for which item to activate change to the backpack instead of wielded equipment. -~~~~~11|Runes -#####G------------------------------------------------------------------------------ -#####GQ: I keep coming across "runes". What are they? - -Runes are used to cast and store spells of varying types. *****c_runecr.txt*0[Runecrafters] are the -class who are most proficient at using these. You can only use them if you -have access to the *****skills.txt*36[Runecrafting] skill. ~~~~~12|Homes #####G------------------------------------------------------------------------------ #####GQ: Where can I store all my equipment? Theere's not enough room in my diff --git a/src/cmd6.cc b/src/cmd6.cc index f7261a96..80a033eb 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -60,12 +60,6 @@ using boost::algorithm::iequals; -/* - * Forward declare - */ -static bool_ activate_spell(object_type * o_ptr, byte choice); - - /* * General function to find an item by its name */ @@ -4807,8 +4801,6 @@ void do_cmd_activate(void) int item, lev, chance; - char ch, spell_choice; - /* Get an item */ command_wrk = USE_EQUIP; if (!get_item(&item, @@ -4892,15 +4884,8 @@ void do_cmd_activate(void) /* Check the recharge */ if (o_ptr->timeout) { - /* Mage Staff of Spells -- Have another timeout in xtra2 */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL) && o_ptr->xtra2) - { - msg_print("It whines, glows and fades..."); - return; - } - /* Monster eggs */ - else if (o_ptr->tval == TV_EGG) + if (o_ptr->tval == TV_EGG) { msg_print("You resume the development of the egg."); o_ptr->timeout = 0; @@ -4936,61 +4921,6 @@ void do_cmd_activate(void) return; } - /* Mage Staff of Spells */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - while (TRUE) - { - if (!get_com("Use Spell [1] or [2]?", &ch)) - { - return; - } - - if (ch == '1') - { - spell_choice = 1; - break; - } - - if (ch == '2') - { - spell_choice = 2; - break; - } - } - - if (spell_choice == 1) - { - /* Still need to check timeouts because there is another counter */ - if (o_ptr->timeout) - { - msg_print("The first spell is still charging!"); - return; - } - - /* Cast spell 1 */ - activate_spell(o_ptr, spell_choice); - } - else if (spell_choice == 2) - { - /* Still need to check timeouts because there is another counter */ - if (o_ptr->xtra2) - { - msg_print("The second spell is still charging!"); - return; - } - - /* Cast spell 2 */ - activate_spell(o_ptr, spell_choice); - } - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); - - /* Success */ - return; - } - /* Monster eggs */ if (o_ptr->tval == TV_EGG) { @@ -7751,37 +7681,3 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) return NULL; } - - -static bool_ activate_spell(object_type * o_ptr, byte choice) -{ - int mana = 0, gf = 0, mod = 0; - - rune_spell s_ptr; - - - if (choice == 1) - { - gf = o_ptr->pval & 0xFFFF; - mod = o_ptr->pval3 & 0xFFFF; - mana = o_ptr->pval2 & 0xFF; - } - else if (choice == 2) - { - gf = o_ptr->pval >> 16; - mod = o_ptr->pval3 >> 16; - mana = o_ptr->pval2 >> 8; - } - - s_ptr.type = gf; - s_ptr.rune2 = 1 << mod; - s_ptr.mana = mana; - - /* Execute */ - rune_exec(&s_ptr, 0); - - if (choice == 1) o_ptr->timeout = mana * 5; - if (choice == 2) o_ptr->xtra2 = mana * 5; - - return (TRUE); -} diff --git a/src/cmd7.cc b/src/cmd7.cc index 48747cfb..4d491416 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -2420,23 +2420,6 @@ void do_cmd_necromancer(void) p_ptr->window |= (PW_PLAYER); } -/* - * Hook to determine if an object is "runestone" - */ -static bool item_tester_hook_runestone(object_type const *o_ptr) -{ - return ((o_ptr->tval == TV_RUNE2) && - (o_ptr->sval == RUNE_STONE) && - (o_ptr->pval == 0)); -} - -static bool item_tester_hook_runestone_full(object_type const *o_ptr) -{ - return ((o_ptr->tval == TV_RUNE2) && - (o_ptr->sval == RUNE_STONE) && - (o_ptr->pval != 0)); -} - /* * math.h(sqrt) is banned of angband so ... :) */ @@ -2459,1016 +2442,6 @@ s32b sroot(s32b n) } -/* - * Damage formula, for runes - */ -void rune_calc_power(s32b *power, s32b *powerdiv) -{ - /* Not too weak power(paranoia) */ - *power = (*power < 1) ? 1 : *power; - *power += 3; - - *power = 37 * sroot(*power) / 10; - - /* To reduce the high level power, while increasing the low levels */ - *powerdiv = *power / 3; - if (*powerdiv < 1) *powerdiv = 1; - - /* Use the spell multiplicator */ - *power *= (p_ptr->to_s / 2) ? (p_ptr->to_s / 2) : 1; -} - - -/* - * Return percentage chance of runespell failure. - */ -int spell_chance_rune(rune_spell* spell) -{ - int chance, minfail; - - s32b power = spell->mana, power_rune = 0, powerdiv = 0; - - - if (spell->rune2 & RUNE_POWER_SURGE) - { - power_rune += 4; - } - if (spell->rune2 & RUNE_ARMAGEDDON) - { - power_rune += 3; - } - if (spell->rune2 & RUNE_SPHERE) - { - power_rune += 2; - } - if (spell->rune2 & RUNE_RAY) - { - power_rune += 1; - } - - rune_calc_power(&power, &powerdiv); - - chance = (5 * power_rune) + (power); - - /* Reduce failure rate by INT/WIS adjustment */ - chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_DEX]] - 1); - - /* Extract the minimum failure rate */ - minfail = adj_mag_fail[p_ptr->stat_ind[A_DEX]]; - - /* Return the chance */ - return clamp_failure_chance(chance, minfail); -} - - -/* - * Combine the Runes - */ -int rune_exec(rune_spell *spell, int cost) -{ - int dir, power_rune = 0, mana_used, plev = get_skill(SKILL_RUNECRAFT); - - int chance; - - s32b power, powerdiv; - - int rad = 0, ty = -1, tx = -1, dam = 0, flg = 0; - - - if (spell->rune2 & RUNE_POWER_SURGE) - { - power_rune += 4; - } - if (spell->rune2 & RUNE_ARMAGEDDON) - { - power_rune += 3; - } - if (spell->rune2 & RUNE_SPHERE) - { - power_rune += 2; - } - if (spell->rune2 & RUNE_RAY) - { - power_rune += 1; - } - - - power = spell->mana; - - if (cost && ((power * cost / 100) > p_ptr->csp - (power_rune * (plev / 5)))) - { - power = p_ptr->csp - (power_rune * (plev / 5)); - mana_used = power + (power_rune * (plev / 5)); - } - else - { - mana_used = (power * cost / 100) + (power_rune * (plev / 5)); - } - - rune_calc_power(&power, &powerdiv); - - dam = damroll(powerdiv, power); - - if (wizard) msg_format("Rune %dd%d = dam %d", powerdiv, power, dam); - - /* Extract the base spell failure rate */ - chance = spell_chance_rune(spell); - - /* Failure ? */ - if (rand_int(100) < chance) - { - int insanity = (p_ptr->msane - p_ptr->csane) * 100 / p_ptr->msane; - char sfail[80]; - - /* Flush input if told so */ - flush_on_failure(); - - /* Insane players can see something strange */ - if (rand_int(100) < insanity) - { - get_rnd_line("sfail.txt", sfail); - msg_format("A cloud of %s appears above you.", sfail); - } - - /* Normal failure messages */ - else - { - msg_print("You failed to get the spell off!"); - } - - if (is_magestaff()) energy_use = 80; - else energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); - return (mana_used); - } - - if (spell->rune2 & RUNE_POWER_SURGE) - { - flg |= (PROJECT_VIEWABLE); - ty = p_ptr->py; - tx = p_ptr->px; - } - - if (spell->rune2 & RUNE_ARMAGEDDON) - { - flg |= (PROJECT_THRU); - flg |= (PROJECT_KILL); - flg |= (PROJECT_ITEM); - flg |= (PROJECT_GRID); - flg |= (PROJECT_METEOR_SHOWER); - rad = (power / 8 == 0) ? 1 : power / 8; - rad = (rad > 10) ? 10 : rad; - ty = p_ptr->py; - tx = p_ptr->px; - } - - if (spell->rune2 & RUNE_SPHERE) - { - flg |= (PROJECT_THRU); - flg |= (PROJECT_KILL); - flg |= (PROJECT_ITEM); - flg |= (PROJECT_GRID); - rad = (power / 8 == 0) ? 1 : power / 8; - rad = (rad > 10) ? 10 : rad; - ty = p_ptr->py; - tx = p_ptr->px; - } - - if (spell->rune2 & RUNE_RAY) - { - flg |= (PROJECT_THRU); - flg |= (PROJECT_KILL); - flg |= (PROJECT_BEAM); - ty = -1; - tx = -1; - } - if (spell->rune2 & RUNE_ARROW) - { - flg |= (PROJECT_THRU); - flg |= (PROJECT_STOP); - flg |= (PROJECT_KILL); - ty = -1; - tx = -1; - } - if (spell->rune2 & RUNE_SELF) - { - flg |= (PROJECT_THRU); - flg |= (PROJECT_STOP); - flg |= (PROJECT_KILL); - ty = p_ptr->py; - tx = p_ptr->px; - unsafe = TRUE; - } - - if ((ty == -1) && (tx == -1)) - { - if (!get_aim_dir(&dir)) return (mana_used); - - /* Use the given direction */ - tx = p_ptr->px + ddx[dir]; - ty = p_ptr->py + ddy[dir]; - - /* Hack -- Use an actual "target" */ - if ((dir == 5) && target_okay()) - { - tx = target_col; - ty = target_row; - } - } - - if (flg & PROJECT_VIEWABLE) - { - project_hack(spell->type, dam); - } - else if (flg & PROJECT_METEOR_SHOWER) - { - project_meteor(rad, spell->type, dam, flg); - } - else project(0, rad, ty, tx, dam, spell->type, flg); - - if (unsafe) unsafe = FALSE; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); - - return (mana_used); -} - - -/* - * Test if all runes needed at in the player p_ptr->inventory - */ -bool_ test_runespell(rune_spell *spell) -{ - int i; - - object_type *o_ptr; - - bool_ typeok = FALSE; - - int rune2 = 0; - - - for (i = 0; i < INVEN_WIELD; i++) - { - o_ptr = &p_ptr->inventory[i]; - - if (!o_ptr->k_idx) continue; - - /* Does the rune1(type) match ? */ - if ((o_ptr->tval == TV_RUNE1) && (o_ptr->sval == spell->type)) - { - typeok = TRUE; - } - - if ((o_ptr->tval == TV_RUNE2) && (o_ptr->sval != RUNE_STONE)) - { - /* Add it to the list */ - rune2 |= 1 << o_ptr->sval; - } - } - - /* Need all runes to be present */ - return (typeok && ((rune2 & spell->rune2) == spell->rune2)); -} - - -/* - * Ask for rune, rune2 and mana - */ -bool_ get_runespell(rune_spell *spell) -{ - s32b rune_combine = 0; - - /* Lambda to use for selecting the secondary rune(s) */ - auto rune2_filter = [&](object_type const *o_ptr) -> bool { - return ((o_ptr->tval == TV_RUNE2) && - (o_ptr->sval != RUNE_STONE) && - (!(rune_combine & BIT(o_ptr->sval)))); - }; - - /* Prompt */ - const char *const q = "Use which rune? "; - const char *const s = "You have no rune to use."; - - /* Extract first rune for the base effect */ - int type = 0; - { - int item; - if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR), object_filter::TVal(TV_RUNE1))) - { - return FALSE; - } - - object_type *o_ptr = get_object(item); - type = o_ptr->sval; - } - - /* Choose secondary rune(s) */ - int rune2 = 0; - while (1) - { - int item; - if (!get_item(&item, q, nullptr, (USE_INVEN | USE_FLOOR), rune2_filter)) - { - break; - } - - object_type *o_ptr = get_object(item); - - rune_combine |= 1 << o_ptr->sval; - rune2 |= 1 << o_ptr->sval; - } - - if (!rune2) - { - msg_print("You have not selected a second rune!"); - return (FALSE); - } - - int power_rune = 0; - int plev = get_skill(SKILL_RUNECRAFT); - s32b power = get_quantity("Which amount of Mana? ", - p_ptr->csp - (power_rune * (plev / 5))); - if (power < 1) - { - power = 1; - } - - spell->mana = power; - spell->type = type; - spell->rune2 = rune2; - - return (TRUE); -} - - -void do_cmd_rune(void) -{ - rune_spell spell; - - - /* Require some mana */ - if (p_ptr->csp <= 0) - { - msg_print("You have no mana!"); - return; - } - - /* Require lite */ - if (p_ptr->blind || no_lite()) - { - msg_print("You cannot see!"); - return; - } - - /* Not when confused */ - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - if (!get_runespell(&spell)) return; - - /* Execute at normal mana cost */ - p_ptr->csp -= rune_exec(&spell, 100); - - /* Safety :) */ - if (p_ptr->csp < 0) p_ptr->csp = 0; - - /* Take a turn */ - if (is_magestaff()) energy_use = 80; - else energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -/* - * Print a batch of runespells. - */ -static void print_runespell_batch(std::size_t batch, int max) -{ - prt(format(" %-30s Fail Mana Power", "Name"), 1, 20); - - int i; - for (i = 0; i < max; i++) - { - auto spell = &p_ptr->rune_spells[batch * 10 + i]; - - int power = spell->mana; - s32b powerdiv; - rune_calc_power(&power, &powerdiv); - - int const p = power; - int const dp = powerdiv; - - char buff[80]; - strnfmt(buff, 80, " %c) %-30s %4d%% %4d %dd%d ", I2A(i), spell->name, - spell_chance_rune(spell), spell->mana, dp, p); - - prt(buff, 2 + i, 20); - } - prt("", 2 + i, 20); -} - - - -/* - * List ten random spells and ask to pick one. - */ - -static rune_spell* select_runespell_from_batch(std::size_t batch, int *s_idx) -{ - auto &rune_spells = p_ptr->rune_spells; - - character_icky = TRUE; - - int const mut_max = (rune_spells.size() < (batch + 1) * 10) - ? rune_spells.size() - batch * 10 - : 10; - - char tmp[160]; - strnfmt(tmp, 160, "(a-%c, / to rename, - to comment) Select a power: ", - I2A(mut_max - 1)); - prt(tmp, 0, 0); - - rune_spell *ret = nullptr; - - while (1) - { - Term_save(); - - print_runespell_batch(batch, mut_max); - - char which = inkey(); - - Term_load(); - - if (which == ESCAPE) - { - *s_idx = -1; - ret = NULL; - break; - } - else if ((which == '*') || (which == '?') || (which == ' ')) - { - print_runespell_batch(batch, mut_max); - } - else if ((which == '\r') && (mut_max == 1)) - { - *s_idx = batch * 10; - ret = &rune_spells[batch * 10]; - break; - } - else if (which == '/') - { - prt("Rename which power: ", 0, 0); - which = tolower(inkey()); - - if (isalpha(which) && (A2I(which) <= mut_max)) - { - char out_val[30] = { '\0' }; - strcpy(out_val, rune_spells[batch*10 + A2I(which)].name); - if (get_string("Name this power: ", out_val, 29)) - { - strcpy(rune_spells[batch*10 + A2I(which)].name, out_val); - } - prt(tmp, 0, 0); - } - else - { - bell(); - prt(tmp, 0, 0); - } - } - else - { - which = tolower(which); - if (isalpha(which) && (A2I(which) < mut_max)) - { - *s_idx = batch * 10 + A2I(which); - ret = &rune_spells[batch * 10 + A2I(which)]; - break; - } - else - { - bell(); - } - } - } - - character_icky = FALSE; - - return (ret); -} - - -/* - * Pick a random spell from a menu - */ -static rune_spell* select_runespell(int *s_idx) -{ - auto const &rune_spells = p_ptr->rune_spells; - - char which; - - if (rune_spells.empty()) - { - msg_print("There are no runespells you can cast."); - return (NULL); - } - - std::size_t batch_max = (rune_spells.size() - 1) / 10; - - character_icky = TRUE; - Term_save(); - - { - char tmp[160]; - strnfmt(tmp, 160, "(a-%c) Select batch of powers: ", I2A(batch_max)); - prt(tmp, 0, 0); - } - - while (1) - { - which = inkey(); - - if (which == ESCAPE) - { - Term_load(); - character_icky = FALSE; - return (NULL); - } - else if ((which == '\r') && (batch_max == 0)) - { - Term_load(); - character_icky = FALSE; - return (select_runespell_from_batch(0, s_idx)); - - } - else - { - which = tolower(which); - if (isalpha(which) && (static_cast(A2I(which)) <= batch_max)) - { - Term_load(); - character_icky = FALSE; - return (select_runespell_from_batch(A2I(which), s_idx)); - } - else - { - bell(); - } - } - } -} - - -/* - * Cast a memorized runespell - * Note that the only limits are antimagic & conf, NOT blind - */ -static void do_cmd_rune_cast() -{ - /* Require some mana */ - if (p_ptr->csp <= 0) - { - msg_print("You have no mana!"); - return; - } - - /* No magic */ - if (p_ptr->antimagic) - { - msg_print("Your anti-magic field disrupts any magic attempts."); - return; - } - - /* No magic */ - if (p_ptr->anti_magic) - { - msg_print("Your anti-magic shell disrupts any magic attempts."); - return; - } - - /* Not when confused */ - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - int s_idx; - rune_spell *s_ptr; - s_ptr = select_runespell(&s_idx); - - if (s_ptr == NULL) return; - - /* Need the runes */ - if (!test_runespell(s_ptr)) - { - msg_print("You lack some essential rune(s) for this runespell!"); - return; - } - - /* Execute at normal mana cost */ - p_ptr->csp -= rune_exec(s_ptr, 100); - - /* Safety :) */ - if (p_ptr->csp < 0) p_ptr->csp = 0; - - /* Take a turn */ - if (is_magestaff()) energy_use = 80; - else energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -/* - * Cast a runespell from a carved runestone - */ -void do_cmd_runestone() -{ - rune_spell s_ptr; - - int item; - - - /* Require some mana */ - if (p_ptr->csp <= 0) - { - msg_print("You have no mana!"); - return; - } - - /* Require lite */ - if (p_ptr->blind || no_lite()) - { - msg_print("You cannot see!"); - return; - } - - /* Not when confused */ - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - /* No magic */ - if (p_ptr->antimagic) - { - msg_print("Your anti-magic field disrupts any magic attempts."); - return; - } - - /* No magic */ - if (p_ptr->anti_magic) - { - msg_print("Your anti-magic shell disrupts any magic attempts."); - return; - } - - /* Get an item */ - if (!get_item(&item, - "Cast from which runestone? ", - "You have no runestone to cast from.", - (USE_INVEN | USE_FLOOR), - item_tester_hook_runestone_full)) - { - return; - } - - /* Get the item */ - object_type *o_ptr = get_object(item); - - s_ptr.type = o_ptr->pval; - s_ptr.rune2 = o_ptr->pval2; - s_ptr.mana = o_ptr->pval3; - - /* Execute less mana */ - p_ptr->csp -= rune_exec(&s_ptr, 75); - - /* Safety :) */ - if (p_ptr->csp < 0) p_ptr->csp = 0; - - /* Take a turn */ - energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -/* - * Add a runespell to the list - */ -void do_cmd_rune_add_mem() -{ - auto &rune_spells = p_ptr->rune_spells; - - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - if (rune_spells.size() >= MAX_RUNES) - { - msg_print("You have already learned the maximum number of runespells!"); - return; - } - - rune_spell s_ptr; - if (!get_runespell(&s_ptr)) return; - - // Create the new rune spell - rune_spell ds; - ds.type = s_ptr.type; - ds.rune2 = s_ptr.rune2; - ds.mana = s_ptr.mana; - strcpy(ds.name, "Unnamed Runespell"); - - get_string("Name this runespell: ", ds.name, 29); - - // Add to list - rune_spells.emplace_back(ds); - - /* Take a turn */ - energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -/* - * Carve a runespell onto a Runestone - */ -void do_cmd_rune_carve() -{ - /* Not when confused */ - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - /* Require lite */ - if (p_ptr->blind || no_lite()) - { - msg_print("You cannot see!"); - return; - } - - if (!get_check("Beware, this will destroy the involved runes, continue?")) - { - return; - } - - rune_spell s_ptr; - if (!get_runespell(&s_ptr)) - { - return; - } - - /* Get an item */ - int item; - if (!get_item(&item, - "Use which runestone? ", - "You have no runestone to use.", - (USE_INVEN | USE_FLOOR), - item_tester_hook_runestone)) - { - return; - } - - /* Get the item */ - object_type *o_ptr = get_object(item); - - o_ptr->pval = s_ptr.type; - o_ptr->pval2 = s_ptr.rune2; - o_ptr->pval3 = s_ptr.mana; - - /* Start with old inscription */ - char out_val[80]; - strcpy(out_val, o_ptr->inscription.c_str()); - - /* Get a new inscription (possibly empty) */ - if (get_string("Name this runestone: ", out_val, 80)) - { - /* Save the inscription */ - o_ptr->inscription = out_val; - - /* Combine the pack */ - p_ptr->notice |= (PN_COMBINE); - - /* Window stuff */ - p_ptr->window |= (PW_INVEN | PW_EQUIP); - } - - /* Delete the runes */ - for (int i = 0; i < INVEN_WIELD; i++) - { - o_ptr = &p_ptr->inventory[i]; - - if (o_ptr->k_idx) - { - bool_ do_del = FALSE; - - if ((o_ptr->tval == TV_RUNE1) && (o_ptr->sval == s_ptr.type)) do_del = TRUE; - if ((o_ptr->tval == TV_RUNE2) && (BIT(o_ptr->sval) & s_ptr.rune2)) do_del = TRUE; - - if (do_del) - { - inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE); - } - } - } - - /* Take a turn -- Carving takes a LONG time */ - energy_use = 400; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -/* - * Remove a runespell - */ -void do_cmd_rune_del() -{ - auto &rune_spells = p_ptr->rune_spells; - - if (p_ptr->confused) - { - msg_print("You are too confused!"); - return; - } - - rune_spell *s_ptr; - int s_idx; - s_ptr = select_runespell(&s_idx); - - if (s_ptr == NULL) return; - - /* Delete */ - rune_spells.erase(rune_spells.begin() + s_idx); - - /* Take a turn */ - energy_use = 100; - - /* Window stuff */ - p_ptr->window |= (PW_PLAYER); - p_ptr->redraw |= (PR_FRAME); -} - - -void do_cmd_rune_add() -{ - int ext = 0; - - char ch; - - - /* Select what to do */ - while (TRUE) - { - if (!get_com("Add to [M]emory(need runes to cast) or " - "Carve a [R]unestone(less mana to cast)", &ch)) - { - ext = 0; - break; - } - if ((ch == 'M') || (ch == 'm')) - { - ext = 1; - break; - } - if ((ch == 'R') || (ch == 'r')) - { - ext = 2; - break; - } - } - - switch (ext) - { - /* Create a Spell in memory */ - case 1: - { - do_cmd_rune_add_mem(); - break; - } - - /* Carve a Runestone */ - case 2: - { - do_cmd_rune_carve(); - break; - } - } -} - - -void do_cmd_runecrafter() -{ - int ext = 0; - - char ch; - - - /* Select what to do */ - while (TRUE) - { - if (!get_com("Rune Spell:[C]reate, [D]elete, C[a]st, D[i]rectly Cast " - "or Use [R]unestone", &ch)) - { - ext = 0; - break; - } - if ((ch == 'C') || (ch == 'c')) - { - ext = 1; - break; - } - if ((ch == 'D') || (ch == 'd')) - { - ext = 2; - break; - } - if ((ch == 'A') || (ch == 'a')) - { - ext = 3; - break; - } - if ((ch == 'I') || (ch == 'i')) - { - ext = 4; - break; - } - if ((ch == 'R') || (ch == 'r')) - { - ext = 5; - break; - } - } - - switch (ext) - { - /* Create a Spell */ - case 1: - { - do_cmd_rune_add(); - break; - } - - /* Delete a Spell */ - case 2: - { - do_cmd_rune_del(); - break; - } - - /* Cast a Spell */ - case 3: - { - do_cmd_rune_cast(); - break; - } - - /* Directly Cast a Spell */ - case 4: - { - do_cmd_rune(); - break; - } - - /* Cast a Runestone */ - case 5: - { - do_cmd_runestone(); - break; - } - } -} - - void do_cmd_unbeliever_antimagic() { if (get_skill(SKILL_ANTIMAGIC) < 20) diff --git a/src/cmd7.hpp b/src/cmd7.hpp index 162e5461..0c650210 100644 --- a/src/cmd7.hpp +++ b/src/cmd7.hpp @@ -1,12 +1,10 @@ #pragma once #include "h-basic.h" -#include "rune_spell_fwd.hpp" #include "object_type_fwd.hpp" extern void do_cmd_pray(void); extern void do_cmd_create_boulder(void); -extern int rune_exec(rune_spell *spell, int cost); extern void necro_info(char *p, int power); extern void mindcraft_info(char *p, int power); extern void symbiotic_info(char *p, int power); @@ -22,7 +20,6 @@ extern void do_cmd_archer(void); extern void do_cmd_set_piercing(void); extern void do_cmd_necromancer(void); extern void do_cmd_unbeliever(void); -extern void do_cmd_runecrafter(void); extern void do_cmd_symbiotic(void); extern s32b sroot(s32b n); extern int clamp_failure_chance(int chance, int minfail); diff --git a/src/defines.h b/src/defines.h index 7f43e7f4..fe690e2b 100644 --- a/src/defines.h +++ b/src/defines.h @@ -381,7 +381,6 @@ #define MKEY_MIMIC 6 #define MKEY_NECRO 7 #define MKEY_POWER_MAGE 8 -#define MKEY_RUNE 9 #define MKEY_FORGING 10 #define MKEY_INCARNATION 11 #define MKEY_SUMMON 13 @@ -654,7 +653,6 @@ #define EGO_MANA 1 #define EGO_POWER 2 #define EGO_MANA_POWER 3 -#define EGO_MSTAFF_SPELL 4 #define EGO_BRAND_POIS 77 #define EGO_BRAND_ELEC 74 #define EGO_BRAND_FIRE 75 @@ -972,8 +970,6 @@ #define TV_HYPNOS 99 /* To wield monsters !:) */ #define TV_GOLD 100 /* Gold can only be picked up by players */ #define TV_RANDART 102 /* Random Artifacts */ -#define TV_RUNE1 104 /* Base runes */ -#define TV_RUNE2 105 /* Modifier runes */ #define TV_BOOK 111 #define TV_SYMBIOTIC_BOOK 112 @@ -2172,19 +2168,6 @@ #define FATE_FIND_V 5 #define FATE_DIE 6 -/* - * Runes definition - */ -#define RUNE_SELF 0x00000001 -#define RUNE_ARROW 0x00000002 -#define RUNE_RAY 0x00000004 -#define RUNE_SPHERE 0x00000008 -#define RUNE_POWER_SURGE 0x00000010 -#define RUNE_ARMAGEDDON 0x00000020 -#define RUNE_MOD_MAX 6 -#define RUNE_STONE 0x000000FF - - /* * Defines of the different dungeon types */ diff --git a/src/dungeon.cc b/src/dungeon.cc index e4946959..c1170c93 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -2815,16 +2815,6 @@ static void process_world(void) j++; } } - - /* Recharge second spell in Mage Staffs of Spells */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL) && (o_ptr->xtra2 > 0)) - { - /* Recharge */ - o_ptr->xtra2--; - - /* Notice changes */ - if (o_ptr->xtra2 == 0) j++; - } } /* Notice changes */ diff --git a/src/help.cc b/src/help.cc index 2c5da549..43d4873f 100644 --- a/src/help.cc +++ b/src/help.cc @@ -24,25 +24,24 @@ #include "variable.hpp" #define DESC_MAX 14 -#define TRIGGERED_HELP_MAX 17 +#define TRIGGERED_HELP_MAX 16 #define HELP_VOID_JUMPGATE 0 #define HELP_FOUNTAIN 1 #define HELP_FOUND_OBJECT 2 #define HELP_FOUND_ALTAR 3 #define HELP_FOUND_STAIR 4 -#define HELP_GET_RUNE 5 -#define HELP_GET_ROD 6 -#define HELP_GET_ROD_TIP 7 -#define HELP_GET_DEVICE 8 -#define HELP_WILDERNESS 9 -#define HELP_GAME_TOME 10 -#define HELP_GAME_THEME 11 -#define HELP_1ST_LEVEL 12 -#define HELP_20TH_LEVEL 13 -#define HELP_ID_SPELL_ITM 14 -#define HELP_MELEE_SKILLS 15 -#define HELP_MON_ASK_HELP 16 +#define HELP_GET_ROD 5 +#define HELP_GET_ROD_TIP 6 +#define HELP_GET_DEVICE 7 +#define HELP_WILDERNESS 8 +#define HELP_GAME_TOME 9 +#define HELP_GAME_THEME 10 +#define HELP_1ST_LEVEL 11 +#define HELP_20TH_LEVEL 12 +#define HELP_ID_SPELL_ITM 13 +#define HELP_MELEE_SKILLS 14 +#define HELP_MON_ASK_HELP 15 /** * Game started? @@ -179,7 +178,6 @@ context_help_type class_table[] = { "Priest(Manwe)", "c_pr_man.txt", 0 }, { "Ranger", "c_ranger.txt", 0 }, { "Rogue", "c_rogue.txt", 0 }, - { "Runecrafter", "c_runecr.txt", 0 }, { "Sorceror", "c_sorcer.txt", 0 }, { "Summoner", "c_summon.txt", 0 }, { "Swordmaster", "c_swordm.txt", 0 }, @@ -267,7 +265,6 @@ context_help_type skill_table[] = { "Polearm-mastery", "skills.txt", 7 }, { "Possession", "skills.txt", 45 }, { "Prayer", "skills.txt", 39 }, - { "Runecraft", "skills.txt", 36 }, { "Sling-mastery", "skills.txt", 9 }, { "Sneakiness", "skills.txt", 14 }, { "Spell-power", "skills.txt", 22 }, @@ -333,12 +330,6 @@ static bool_ trigger_found_stairs(void *in, void *out) { return (cave[p->y][p->x].feat == FEAT_MORE); } -static bool_ trigger_get_rune(void *in, void *out) { - hook_get_in *g = (hook_get_in *) in; - return ((g->o_ptr->tval == TV_RUNE1) || - (g->o_ptr->tval == TV_RUNE2)); -} - static bool_ trigger_get_rod(void *in, void *out) { hook_get_in *g = (hook_get_in *) in; return (g->o_ptr->tval == TV_ROD_MAIN); @@ -444,14 +435,6 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] = "But be ready to fight what lies within, for it might not be too friendly.", NULL } }, - { HELP_GET_RUNE, - HOOK_GET, - trigger_get_rune, - { "Ah, a rune! Runes are used with the Runecraft skill to allow you to", - "create spells on your own.", - NULL - } - }, { HELP_GET_ROD, HOOK_GET, trigger_get_rod, diff --git a/src/loadsave.cc b/src/loadsave.cc index e91e8993..731efab2 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -493,15 +493,6 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } -static void do_rune_spell(rune_spell *s_ptr, ls_flag_t flag) -{ - do_string(s_ptr->name, 30, flag); - do_s16b(&s_ptr->type, flag); - do_s16b(&s_ptr->rune2, flag); - do_s16b(&s_ptr->mana, flag); -} - - /* * Show information on the screen, one line at a time. * @@ -900,9 +891,6 @@ static bool_ do_extra(ls_flag_t flag) /* Random spells */ do_vector(flag, p_ptr->random_spells, do_random_spell); - /* Rune spells */ - do_vector(flag, p_ptr->rune_spells, do_rune_spell); - /* Random seed for object flavors. */ do_seed(&seed_flavor(), flag); diff --git a/src/object1.cc b/src/object1.cc index 4c065b24..8d2a2bb0 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1358,23 +1358,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) break; } - case TV_RUNE2: - { - if (o_ptr->sval != RUNE_STONE) - { - modstr = basenm; - basenm = "& Rune~ [#]"; - } - break; - } - - case TV_RUNE1: - { - modstr = basenm; - basenm = "& Rune~ [#]"; - break; - } - case TV_DAEMON_BOOK: case TV_BOOK: { @@ -1980,16 +1963,6 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) } } - /* Indicate "charging" Mage Staffs XXX XXX XXX */ - if (known && o_ptr->timeout && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))) - { - t += " (charging spell1)"; - } - if (known && o_ptr->xtra2 && (is_ego_p(o_ptr, EGO_MSTAFF_SPELL))) - { - t += " (charging spell2)"; - } - /* No more details wanted */ if (mode < 3) @@ -2111,15 +2084,11 @@ void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode) * Determine the "Activation" (if any) for an artifact * Return a string, or NULL for "no activation" */ -cptr item_activation(object_type *o_ptr, byte num) +cptr item_activation(object_type *o_ptr) { - auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; auto const &e_info = game->edit_data.e_info; - /* Needed hacks */ - static char rspell[2][80]; - /* Extract the flags */ auto const flags = object_flags(o_ptr); @@ -2134,29 +2103,6 @@ cptr item_activation(object_type *o_ptr, byte num) * for art_name */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - int gf, mod, mana; - - if (!num) - { - gf = o_ptr->pval & 0xFFFF; - mod = o_ptr->pval3 & 0xFFFF; - mana = o_ptr->pval2 & 0xFF; - } - else - { - gf = o_ptr->pval >> 16; - mod = o_ptr->pval3 >> 16; - mana = o_ptr->pval2 >> 8; - } - sprintf(rspell[num], "runespell(%s, %s, %d) every %d turns", - k_info[lookup_kind(TV_RUNE1, gf)].name, - k_info[lookup_kind(TV_RUNE2, mod)].name, - mana, mana * 5); - return rspell[num]; - } - if (o_ptr->tval == TV_EGG) { return "stop or resume the egg development"; @@ -2589,14 +2535,7 @@ bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait if (flags & TR_ACTIVATE) { text_out("It can be activated for "); - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - text_out(item_activation(o_ptr, 0)); - text_out(" and "); - text_out(item_activation(o_ptr, 1)); - } - else - text_out(item_activation(o_ptr, 0)); + text_out(item_activation(o_ptr)); /* Mega-hack -- get rid of useless line for e.g. randarts */ if (flags & TR_ACTIVATE_NO_WIELD) diff --git a/src/object1.hpp b/src/object1.hpp index af055985..f585b013 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -36,7 +36,7 @@ extern void show_inven_full(); extern void show_equip_full(); extern void toggle_inven_equip(void); extern bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t()); -extern cptr item_activation(object_type *o_ptr,byte num); +extern cptr item_activation(object_type *o_ptr); extern void py_pickup_floor(int pickup); extern void object_gain_level(object_type *o_ptr); extern byte object_attr(object_type const *o_ptr); diff --git a/src/object2.cc b/src/object2.cc index 95fcf041..51fdcb95 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -1505,17 +1505,6 @@ bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr) return FALSE; } - case TV_RUNE1: - { - return TRUE; - } - - case TV_RUNE2: - { - if ((o_ptr->sval == RUNE_STONE) || (j_ptr->sval == RUNE_STONE)) return FALSE; - else return TRUE; - } - case TV_INSTRUMENT: { return FALSE; @@ -2559,29 +2548,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power) { case TV_MSTAFF: { - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - int gf[2], i; - - for (i = 0; i < 2; i++) - { - int k = 0; - - gf[i] = 0; - while (!k) - { - k = lookup_kind(TV_RUNE1, (gf[i] = rand_int(MAX_GF))); - } - } - - o_ptr->pval = gf[0] + (gf[1] << 16); - o_ptr->pval3 = rand_int(RUNE_MOD_MAX) + (rand_int(RUNE_MOD_MAX) << 16); - o_ptr->pval2 = randint(70) + (randint(70) << 8); - } - else - { - o_ptr->art_flags |= (TR_SPELL_CONTAIN | TR_WIELD_CAST); - } + o_ptr->art_flags |= (TR_SPELL_CONTAIN | TR_WIELD_CAST); break; } case TV_BOLT: @@ -4212,15 +4179,7 @@ try_an_other_ego: /* Spell in it ? No! */ if (flags & TR_SPELL_CONTAIN) { - /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - o_ptr->art_flags &= ~TR_SPELL_CONTAIN; - } - else - { - o_ptr->pval2 = -1; - } + o_ptr->pval2 = -1; } /* Cheat -- describe the item */ @@ -4251,15 +4210,7 @@ try_an_other_ego: /* Spell in it ? No! */ if (flags & TR_SPELL_CONTAIN) { - /* Mega hack, mage staves of spell cannot SPELL_CONTAIN */ - if (is_ego_p(o_ptr, EGO_MSTAFF_SPELL)) - { - o_ptr->art_flags &= ~TR_SPELL_CONTAIN; - } - else - { - o_ptr->pval2 = -1; - } + o_ptr->pval2 = -1; } /* Hacccccccckkkkk attack ! :) -- To prevent som ugly crashs */ @@ -4439,12 +4390,6 @@ static bool kind_is_theme(obj_theme const *theme, int k_idx) case TV_RANDART: prob = theme->magic; break; - case TV_RUNE1: - prob = theme->magic; - break; - case TV_RUNE2: - prob = theme->magic; - break; case TV_BOOK: prob = theme->magic; break; diff --git a/src/player_type.hpp b/src/player_type.hpp index 0015eaef..9b7ac21d 100644 --- a/src/player_type.hpp +++ b/src/player_type.hpp @@ -8,7 +8,6 @@ #include "object_type.hpp" #include "powers.hpp" #include "random_spell.hpp" -#include "rune_spell.hpp" #include "spellbinder.hpp" #include @@ -411,11 +410,6 @@ struct player_type */ std::vector random_spells; - /** - * Runecrafter's selfmade spells. - */ - std::vector rune_spells; - /** * Does the player have the given ability? */ diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 693248e3..9e36ce5c 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -29,16 +29,16 @@ typedef struct fireproof_settings fireproof_settings; struct fireproof_settings { byte tval; /* tval of object to use. */ + byte sval; /* sval of object to use. */ cptr tval_name; /* descriptive name of tval */ cptr tval_name_plural; /* descriptive name of tval (plural) */ - byte sval_max; /* max sval of object to use; sval will be 1<=X<=sval_max. */ s32b total_points; /* total number of points awarded */ }; static fireproof_settings const *fireproof_get_settings() { static fireproof_settings fireproof_settings = - { TV_RUNE2, "rune", "runes", 5, 24 }; + { TV_SCROLL, SV_SCROLL_FIRE, "scroll", "scrolls", 24 }; return &fireproof_settings; } @@ -61,22 +61,13 @@ static void set_item_points_remaining(s32b v) cquest.data[0] = settings->total_points - v; } -static void fireproof_set_sval(int sval_max) -{ - cquest.data[1] = sval_max; -} - -static int fireproof_get_sval() -{ - return cquest.data[1]; -} - static bool item_tester_hook_eligible(object_type const *o_ptr) { + fireproof_settings const *settings = fireproof_get_settings(); /* check it's the 'marked' item */ - return ((o_ptr->tval == fireproof_get_settings()->tval) && - (o_ptr->sval == fireproof_get_sval()) && - (o_ptr->pval2 == fireproof_get_sval())); + return ((o_ptr->tval == settings->tval) && + (o_ptr->sval == settings->sval) && + (o_ptr->pval2 == settings->sval)); } static object_filter_t const &item_tester_hook_proofable() @@ -378,7 +369,7 @@ static bool_ fireproof_get_hook(void *, void *in_, void *) * generated via random object placement */ if ((p_ptr->inside_quest == QUEST_FIREPROOF) && (cquest.status != QUEST_STATUS_COMPLETED) && - (o_ptr->pval2 == fireproof_get_sval())) + (o_ptr->pval2 == fireproof_get_settings()->sval)) { /* ok mark the quest 'completed' */ cquest.status = QUEST_STATUS_COMPLETED; @@ -489,16 +480,13 @@ static bool_ fireproof_gen_hook(void *, void *, void *) /* no teleport */ dungeon_flags = DF_NO_TELEPORT; - /* determine type of item */ - fireproof_set_sval(randint(settings->sval_max)); - - /* create essence */ + /* create quest item */ { object_type forge; - object_prep(&forge, lookup_kind(settings->tval, fireproof_get_sval())); + object_prep(&forge, lookup_kind(settings->tval, settings->sval)); /* mark item */ - forge.pval2 = fireproof_get_sval(); + forge.pval2 = settings->sval; forge.inscription = "quest"; /* roll for co-ordinates in top half of map */ diff --git a/src/rune_spell.hpp b/src/rune_spell.hpp deleted file mode 100644 index e1e8d190..00000000 --- a/src/rune_spell.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "h-basic.h" - -/** - * Runecrafter prefered spells - */ -struct rune_spell -{ - char name[30] { '\0' }; /* name */ - - s16b type = 0; /* Type of the spell(GF) */ - s16b rune2 = 0; /* Modifiers */ - s16b mana = 0; /* Mana involved */ -}; diff --git a/src/rune_spell_fwd.hpp b/src/rune_spell_fwd.hpp deleted file mode 100644 index eb540a2a..00000000 --- a/src/rune_spell_fwd.hpp +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -struct rune_spell; diff --git a/src/skills.cc b/src/skills.cc index 652f925e..8572d07f 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -1127,9 +1127,6 @@ void do_cmd_activate_skill() case MKEY_POWER_MAGE: do_cmd_powermage(); break; - case MKEY_RUNE: - do_cmd_runecrafter(); - break; case MKEY_FORGING: do_cmd_archer(); break; diff --git a/src/skills_defs.hpp b/src/skills_defs.hpp index b21ea0fb..9bf3c9ce 100644 --- a/src/skills_defs.hpp +++ b/src/skills_defs.hpp @@ -36,7 +36,6 @@ #define SKILL_NECROMANCY 31 #define SKILL_MIMICRY 32 #define SKILL_ANTIMAGIC 33 -#define SKILL_RUNECRAFT 34 /* XXX */ #define SKILL_STEALTH 36 /* XXX */ diff --git a/src/store.cc b/src/store.cc index 8771fcd4..9d4e7f81 100644 --- a/src/store.cc +++ b/src/store.cc @@ -55,7 +55,6 @@ #define STORE_BOOKS "Book Store" #define STORE_PETS "Pet Shop" #define STORE_HUNTING_SUPPLIES "Hunting Supply Store" -#define STORE_RUNIC_MAGIC "Runic Magic Shop" #define STORE_CONSTRUCTION_SUPPLIES "Construction Supply Store" #define STORE_MUSIC "Music Store" @@ -819,15 +818,6 @@ static bool store_will_buy(object_type const *o_ptr) return true; } } - else if ((store_name == STORE_RUNIC_MAGIC)) - { - switch (o_ptr->tval) - { - case TV_RUNE1: - case TV_RUNE2: - return true; - } - } else if ((store_name == STORE_CONSTRUCTION_SUPPLIES)) { switch (o_ptr->tval) diff --git a/src/tables.cc b/src/tables.cc index f87db29c..22e9a98b 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -3724,8 +3724,6 @@ tval_desc tvals[] = { TV_MSTAFF, "Mage Staff" }, { TV_PARCHMENT, "Parchment" }, { TV_INSTRUMENT, "Musical Instrument" }, - { TV_RUNE1, "Rune 1" }, - { TV_RUNE2, "Rune 2" }, { TV_JUNK, "Junk" }, { 0, NULL } }; @@ -3885,14 +3883,6 @@ tval_desc tval_descs[] = "Those objects are only known of by rumours. It is said that " "they can be activated for great or strange effects..." }, - { - TV_RUNE1, - "Runes are used with the Runecraft skill to create brand new spells." - }, - { - TV_RUNE2, - "Runes are used with the Runecraft skill to create brand new spells." - }, { TV_JUNK, "Junk is usually worthless, though experienced archers can " -- cgit v1.2.3 From aae967c8a33e1aad994b7349abad7fbd447264bb Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove random_spell::{name,desc} --- src/cmd7.cc | 78 +++++++----------------------------------------- src/loadsave.cc | 2 -- src/random_spell.hpp | 3 +- src/random_spell_fwd.hpp | 3 ++ src/spells1.cc | 22 ++------------ src/spells1.hpp | 4 +++ 6 files changed, 22 insertions(+), 90 deletions(-) create mode 100644 src/random_spell_fwd.hpp diff --git a/src/cmd7.cc b/src/cmd7.cc index 4d491416..38e5d6cd 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -42,6 +42,8 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include + /* * Describe class powers of Mindcrafters * @@ -1270,18 +1272,19 @@ static void print_spell_batch(int batch, int max) { auto rspell = &random_spells[batch * 10 + i]; - char buff[80]; + std::string buff; + std::string name = name_spell(rspell); if (rspell->untried) { - strnfmt(buff, 80, " %c) %-30s (Spell untried) ", - I2A(i), rspell->name); + buff = fmt::format(" {:c}) {:<30} (Spell untried) ", + (char) I2A(i), name); } else { - strnfmt(buff, 80, " %c) %-30s %3d %4d%% %3d %3dd%d ", - I2A(i), rspell->name, + buff = fmt::format(" {:c}) {:<30} {:>3d} {:>4d}% {:>3d} {:>3d}d{:d} ", + (char) I2A(i), name, rspell->level, spell_chance_random(rspell), rspell->mana, rspell->dam_dice, rspell->dam_sides); } @@ -1302,7 +1305,6 @@ static random_spell* select_spell_from_batch(std::size_t batch) auto &random_spells = p_ptr->random_spells; char tmp[160]; - char out_val[30]; char which; random_spell* ret = nullptr; @@ -1316,8 +1318,8 @@ static random_spell* select_spell_from_batch(std::size_t batch) ? random_spells.size() - batch * 10 : 10; - strnfmt(tmp, 160, "(a-%c, A-%c to browse, / to rename, - to comment) Select a power: ", - I2A(mut_max - 1), I2A(mut_max - 1) - 'a' + 'A'); + strnfmt(tmp, 160, "(a-%c) Select a power: ", + I2A(mut_max - 1)); prt(tmp, 0, 0); @@ -1356,65 +1358,7 @@ static random_spell* select_spell_from_batch(std::size_t batch) continue; } - /* Rename */ - if (which == '/') - { - prt("Rename which power: ", 0, 0); - which = tolower(inkey()); - - if (isalpha(which) && (A2I(which) <= mut_max)) - { - strcpy(out_val, random_spells[batch*10 + A2I(which)].name); - if (get_string("Name this power: ", out_val, 29)) - { - strcpy(random_spells[batch*10 + A2I(which)].name, out_val); - } - prt(tmp, 0, 0); - } - else - { - bell(); - prt(tmp, 0, 0); - } - - /* Wait for next command */ - continue; - } - - /* Comment */ - if (which == '-') - { - prt("Comment which power: ", 0, 0); - which = tolower(inkey()); - - if (isalpha(which) && (A2I(which) <= mut_max)) - { - strcpy(out_val, random_spells[batch*10 + A2I(which)].desc); - if (get_string("Comment this power: ", out_val, 29)) - { - strcpy(random_spells[batch*10 + A2I(which)].desc, out_val); - } - prt(tmp, 0, 0); - } - else - { - bell(); - prt(tmp, 0, 0); - } - - /* Wait for next command */ - continue; - } - - if (isalpha(which) && isupper(which)) - { - which = tolower(which); - c_prt(TERM_L_BLUE, format("%s : %s", random_spells[batch*10 + A2I(which)].name, random_spells[batch*10 + A2I(which)].desc), 0, 0); - inkey(); - prt(tmp, 0, 0); - continue; - } - else if (isalpha(which) && (A2I(which) < mut_max)) + if (isalpha(which) && (A2I(which) < mut_max)) { /* Pick the power */ ret = &random_spells[batch * 10 + A2I(which)]; diff --git a/src/loadsave.cc b/src/loadsave.cc index 731efab2..5c6b24bb 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -480,8 +480,6 @@ static void do_subrace(ls_flag_t flag) static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) { - do_string(s_ptr->name, 30, flag); - do_string(s_ptr->desc, 30, flag); do_s16b(&s_ptr->mana, flag); do_s16b(&s_ptr->fail, flag); do_u32b(&s_ptr->proj_flags, flag); diff --git a/src/random_spell.hpp b/src/random_spell.hpp index 2ed71096..f02b9848 100644 --- a/src/random_spell.hpp +++ b/src/random_spell.hpp @@ -1,14 +1,13 @@ #pragma once #include "h-basic.h" +#include /** * A structure to describe the random spells of the Power Mages */ struct random_spell { - char desc[30] = { }; /* Desc of the spell */ - char name[30] = { }; /* Name of the spell */ s16b mana = 0; /* Mana cost */ s16b fail = 0; /* Failure rate */ u32b proj_flags = 0; /* Project function flags */ diff --git a/src/random_spell_fwd.hpp b/src/random_spell_fwd.hpp new file mode 100644 index 00000000..ee559c31 --- /dev/null +++ b/src/random_spell_fwd.hpp @@ -0,0 +1,3 @@ +#pragma once + +struct random_spell; diff --git a/src/spells1.cc b/src/spells1.cc index aad281a0..fe620256 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -50,6 +50,7 @@ #include "z-rand.hpp" #include +#include #include using std::this_thread::sleep_for; @@ -8775,8 +8776,7 @@ static void describe_attack_fully(int type, char* r) * Give a randomly-generated spell a name. * Note that it only describes the first effect! */ - -static void name_spell(random_spell* s_ptr) +std::string name_spell(random_spell const *s_ptr) { char buff[30]; cptr buff2 = "???"; @@ -8807,7 +8807,7 @@ static void name_spell(random_spell* s_ptr) } describe_attack_fully(s_ptr->GF, buff); - strnfmt(s_ptr->name, 30, "%s - %s", buff2, buff); + return fmt::format("{:s} - {:s}", buff2, buff); } void generate_spell(int plev) @@ -8913,22 +8913,6 @@ void generate_spell(int plev) rspell.GF = destructive_attack_types[rand_int(10)]; } - // Give the spell a name - name_spell(&rspell); - - // Give the spell a description - if (ball_desc) - { - /* 30 character limit on the string! */ - sprintf(rspell.desc, "Dam: %d, Rad: %d, Pow: %d", - sides, dice, power); - } - else - { - sprintf(rspell.desc, "Damage: %dd%d, Power: %d", - dice, sides, power); - } - // Add random_spells.emplace_back(rspell); } diff --git a/src/spells1.hpp b/src/spells1.hpp index 5512063f..b67f73bb 100644 --- a/src/spells1.hpp +++ b/src/spells1.hpp @@ -1,6 +1,9 @@ #pragma once +#include + #include "h-basic.h" +#include "random_spell_fwd.hpp" extern byte spell_color(int type); extern s16b poly_r_idx(int r_idx); @@ -27,6 +30,7 @@ extern bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg); extern bool_ potion_smash_effect(int who, int y, int x, int o_sval); extern void do_poly_self(void); extern void corrupt_player(void); +extern std::string name_spell(random_spell const *); extern void generate_spell(int plev); extern bool_ unsafe; extern s16b do_poly_monster(int y, int x); -- cgit v1.2.3 From c2ff640e5540fd4c55dd054ae87dd510a11155e9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move "Game" initialization to main_real() --- src/init2.cc | 3 --- src/main.cc | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/init2.cc b/src/init2.cc index 1b83851e..88fd5470 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -1038,9 +1038,6 @@ void init_angband(void) char buf[1024]; - // Initialize game structure - game = new Game(); - /* Init some VERY basic stuff, like macro arrays */ init_basic(); diff --git a/src/main.cc b/src/main.cc index 7badc9bb..9dd49aaa 100644 --- a/src/main.cc +++ b/src/main.cc @@ -11,6 +11,7 @@ #include "birth.hpp" #include "dungeon.h" #include "files.hpp" +#include "game.hpp" #include "init2.h" #include "modules.hpp" #include "util.h" @@ -131,6 +132,9 @@ int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platf bool_ args = TRUE; + // Initialize game structure + game = new Game(); + /* Get the file paths */ init_file_paths_with_env(); -- cgit v1.2.3 From a40a0d1aeddb4742e486f601cbcc7e9ddcc06e2d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move player_{name,base} to Game --- src/birth.cc | 134 +++++++++++++++++++++------------------------------ src/cmd4.cc | 74 ++++++++++++++++------------- src/dungeon.cc | 5 +- src/files.cc | 142 +++++++++++++++++++++++++++++-------------------------- src/game.hpp | 10 ++++ src/init1.cc | 2 +- src/loadsave.cc | 6 +-- src/main.cc | 16 ++----- src/notes.cc | 10 ++-- src/notes.hpp | 2 +- src/q_library.cc | 3 +- src/randart.cc | 2 +- src/squeltch.cc | 8 ++-- src/util.cc | 39 +++++++++++---- src/util.hpp | 5 +- src/variable.cc | 10 ---- src/variable.hpp | 2 - 17 files changed, 235 insertions(+), 235 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 75d533ab..3b8c9fda 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -103,73 +103,48 @@ static s32b auto_round; */ static s32b last_round; -/* Human */ -static const char *human_syllable1[] = -{ - "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar", - "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et", - "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha", - "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth", "Lar", "Leg", "M", "Mir", - "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T", - "Tr", "Th", "V", "Y", "Z", "W", "Wic", -}; - -static const char *human_syllable2[] = -{ - "a", "ae", "au", "ao", "are", "ale", "ali", "ay", "ardo", "e", "ei", - "ea", "eri", "era", "ela", "eli", "enda", "erra", "i", "ia", "ie", - "ire", "ira", "ila", "ili", "ira", "igo", "o", "oa", "oi", "oe", - "ore", "u", "y", -}; - -static const char *human_syllable3[] = -{ - "a", "and", "b", "bwyn", "baen", "bard", "c", "ctred", "cred", "ch", - "can", "d", "dan", "don", "der", "dric", "dfrid", "dus", "f", "g", - "gord", "gan", "l", "li", "lgrin", "lin", "lith", "lath", "loth", - "ld", "ldric", "ldan", "m", "mas", "mos", "mar", "mond", "n", - "nydd", "nidd", "nnon", "nwan", "nyth", "nad", "nn", "nnor", "nd", - "p", "r", "ron", "rd", "s", "sh", "seth", "sean", "t", "th", "tha", - "tlan", "trem", "tram", "v", "vudd", "w", "wan", "win", "wyn", "wyr", - "wyr", "wyth", -}; - /* * Random Name Generator * based on a Javascript by Michael Hensley * "http://geocities.com/timessquare/castle/6274/" */ -static void create_random_name(int race, char *name) +static std::string create_random_name() { - const char *syl1, *syl2, *syl3; - - int idx; - - - /* Paranoia */ - if (!name) return; - - /* Select the monster type */ - switch (race) - { - /* Create the monster name */ - - /* Use human ones */ - default: - { - idx = rand_int(sizeof(human_syllable1) / sizeof(char *)); - syl1 = human_syllable1[idx]; - idx = rand_int(sizeof(human_syllable2) / sizeof(char *)); - syl2 = human_syllable2[idx]; - idx = rand_int(sizeof(human_syllable3) / sizeof(char *)); - syl3 = human_syllable3[idx]; - - break; - } - } - - /* Concatenate selected syllables */ - strnfmt(name, 32, "%s%s%s", syl1, syl2, syl3); + static const std::vector human_syllable1 + { + "Ab", "Ac", "Ad", "Af", "Agr", "Ast", "As", "Al", "Adw", "Adr", "Ar", + "B", "Br", "C", "Cr", "Ch", "Cad", "D", "Dr", "Dw", "Ed", "Eth", "Et", + "Er", "El", "Eow", "F", "Fr", "G", "Gr", "Gw", "Gal", "Gl", "H", "Ha", + "Ib", "Jer", "K", "Ka", "Ked", "L", "Loth", "Lar", "Leg", "M", "Mir", + "N", "Nyd", "Ol", "Oc", "On", "P", "Pr", "R", "Rh", "S", "Sev", "T", + "Tr", "Th", "V", "Y", "Z", "W", "Wic", + }; + + static const std::vector human_syllable2 + { + "a", "ae", "au", "ao", "are", "ale", "ali", "ay", "ardo", "e", "ei", + "ea", "eri", "era", "ela", "eli", "enda", "erra", "i", "ia", "ie", + "ire", "ira", "ila", "ili", "ira", "igo", "o", "oa", "oi", "oe", + "ore", "u", "y", + }; + + static const std::vector human_syllable3 + { + "a", "and", "b", "bwyn", "baen", "bard", "c", "ctred", "cred", "ch", + "can", "d", "dan", "don", "der", "dric", "dfrid", "dus", "f", "g", + "gord", "gan", "l", "li", "lgrin", "lin", "lith", "lath", "loth", + "ld", "ldric", "ldan", "m", "mas", "mos", "mar", "mond", "n", + "nydd", "nidd", "nnon", "nwan", "nyth", "nad", "nn", "nnor", "nd", + "p", "r", "ron", "rd", "s", "sh", "seth", "sean", "t", "th", "tha", + "tlan", "trem", "tram", "v", "vudd", "w", "wan", "win", "wyn", "wyr", + "wyr", "wyth", + }; + + auto const &syl1 = *uniform_element(human_syllable1); + auto const &syl2 = *uniform_element(human_syllable2); + auto const &syl3 = *uniform_element(human_syllable3); + + return syl1 + syl2 + syl3; } @@ -1488,7 +1463,7 @@ static bool_ player_birth_aux_ask() /* Title everything */ put_str("Name :", NAME_ROW, 1); - c_put_str(TERM_L_BLUE, player_name, NAME_ROW, 9); + c_put_str(TERM_L_BLUE, game->player_name.c_str(), NAME_ROW, 9); put_str("Race :", RACE_ROW, 1); @@ -1631,10 +1606,13 @@ static bool_ player_birth_aux_ask() c_put_str(TERM_L_BLUE, rp_ptr->title.c_str(), RACE_ROW, 9); /* Get a random name */ - if (!do_quick_start) create_random_name(p_ptr->prace, player_name); + if (!do_quick_start) + { + game->player_name = create_random_name(); + } /* Display */ - c_put_str(TERM_L_BLUE, player_name, NAME_ROW, 9); + c_put_str(TERM_L_BLUE, game->player_name.c_str(), NAME_ROW, 9); /* Clean up */ clear_from(12); @@ -2539,7 +2517,7 @@ static bool_ player_birth_aux_auto() Term_clear(); put_str("Name :", 2, 1); - c_put_str(TERM_L_BLUE, player_name, 2, 9); + c_put_str(TERM_L_BLUE, game->player_name.c_str(), 2, 9); put_str("Race :", 3, 1); auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); @@ -3195,7 +3173,7 @@ int load_savefile_names() FILE *fff; char buf[1024]; char tmp[50]; - char player_base_save[32]; + std::string player_base_save; int max = 0, fd; @@ -3211,7 +3189,7 @@ int load_savefile_names() /* Save the current 'player_base' */ - strncpy(player_base_save, player_base, 32); + player_base_save = game->player_base; /* @@ -3270,7 +3248,7 @@ int load_savefile_names() strcpy(savefile_desc[max], buf + i); /* Build platform-dependent savefile name */ - strncpy(player_base, savefile_names[max], 32); + game->player_base = savefile_names[max]; process_player_name(TRUE); /* Try to open the savefile */ @@ -3287,7 +3265,7 @@ int load_savefile_names() my_fclose(fff); /* Restore the values of 'player_base' and 'savefile' */ - strncpy(player_base, player_base_save, 32); + game->player_base = player_base_save; process_player_name(TRUE); return (max); @@ -3321,14 +3299,14 @@ void save_savefile_names() */ auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); fprintf(fff, "%s@%c%s@%s, the %s %s is %s\n", game_module, - (death) ? '0' : '1', player_base, player_name, + (death) ? '0' : '1', game->player_base.c_str(), game->player_name.c_str(), player_race_name.c_str(), spp_ptr->title, (!death) ? "alive" : "dead"); for (i = 0; i < max; i++) { - if (!strcmp(savefile_names[i], player_base)) continue; + if (!strcmp(savefile_names[i], game->player_base.c_str())) continue; fprintf(fff, "%s@%c%s@%s\n", savefile_module[i], (savefile_alive[i]) ? '1' : '0', savefile_names[i], savefile_desc[i]); } @@ -3459,22 +3437,20 @@ savefile_try_again: } else if (((k == 0x7F) || (k == '\010')) && (sel >= 2)) { - char player_base_save[32]; - if (!get_check(format("Really delete '%s'?", savefile_names[savefile_idx[sel - 2]]))) continue; /* Save current 'player_base' */ - strncpy(player_base_save, player_base, 32); + std::string player_base_save = game->player_base; /* Build platform-dependent save file name */ - strncpy(player_base, savefile_names[savefile_idx[sel - 2]], 32); + game->player_base = savefile_names[savefile_idx[sel - 2]]; process_player_name(TRUE); /* Remove the savefile */ fd_kill(savefile); /* Restore 'player_base' and 'savefile' */ - strncpy(player_base, player_base_save, 32); + game->player_base = player_base_save; process_player_name(TRUE); /* Reload, gods I hate using goto .. */ @@ -3489,7 +3465,7 @@ savefile_try_again: prt("Enter the name of the savefile that will hold this character: ", 23, 0); /* Ask the user for a string */ - if (!askfor_aux(player_base, 15)) continue; + if (!askfor_aux(&game->player_base, 15)) continue; /* Process the player name */ process_player_name(TRUE); @@ -3502,7 +3478,7 @@ savefile_try_again: prt("Enter the name of a savefile: ", 23, 0); /* Ask the user for a string */ - if (!askfor_aux(player_base, 15)) continue; + if (!askfor_aux(&game->player_base, 15)) continue; /* Process the player name */ process_player_name(TRUE); @@ -3518,7 +3494,7 @@ savefile_try_again: if ((x < 2) || (x >= max)) continue; - strnfmt(player_base, 32, "%s", savefile_names[savefile_idx[x - 2]]); + game->player_base = savefile_names[savefile_idx[x - 2]]; /* Process the player name */ process_player_name(TRUE); diff --git a/src/cmd4.cc b/src/cmd4.cc index 2dcb0beb..afb84def 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -180,7 +180,7 @@ void do_cmd_change_name(void) /* File dump */ else if (c == 'f') { - strnfmt(tmp, 160, "%s.txt", player_name); + strnfmt(tmp, 160, "%s.txt", game->player_name.c_str()); if (get_string("Filename(you can post it to http://angband.oook.cz/): ", tmp, 80)) { if (tmp[0] && (tmp[0] != ' ')) @@ -1094,9 +1094,6 @@ static errr option_dump(cptr fname) */ static void do_cmd_pref_file_hack(int row) { - char ftmp[80]; - - /* Prompt */ prt("Command: Load a user pref file", row, 0); @@ -1104,21 +1101,24 @@ static void do_cmd_pref_file_hack(int row) prt("File: ", row + 2, 0); /* Default filename */ - strnfmt(ftmp, 80, "%s.prf", player_base); + std::string ftmp = fmt::format("{}.prf", game->player_base); /* Ask for a file (or cancel) */ - if (!askfor_aux(ftmp, 80)) return; + if (!askfor_aux(&ftmp, 80)) + { + return; + } /* Process the given filename */ - if (process_pref_file(ftmp)) + if (process_pref_file(ftmp.c_str())) { /* Mention failure */ - msg_format("Failed to load '%s'!", ftmp); + msg_format("Failed to load '%s'!", ftmp.c_str()); } else { /* Mention success */ - msg_format("Loaded '%s'.", ftmp); + msg_format("Loaded '%s'.", ftmp.c_str()); } } @@ -1199,8 +1199,6 @@ void do_cmd_options(void) case 'u': case 'U': { - char ftmp[80]; - /* Prompt */ prt("Command: Append options to a file", 21, 0); @@ -1208,13 +1206,13 @@ void do_cmd_options(void) prt("File: ", 21, 0); /* Default filename */ - strnfmt(ftmp, 80, "%s.prf", player_base); + auto ftmp = fmt::format("{}.prf", game->player_base); /* Ask for a file */ - if (!askfor_aux(ftmp, 80)) continue; + if (!askfor_aux(&ftmp, 80)) continue; /* Dump the options */ - if (option_dump(ftmp)) + if (option_dump(ftmp.c_str())) { /* Failure */ msg_print("Failed!"); @@ -1650,17 +1648,8 @@ static errr keymap_dump(cptr fname) */ void do_cmd_macros(void) { - int i; - - char tmp[1024]; - - char buf[1024]; - - int mode; - - /* Keymap mode */ - mode = get_keymap_mode(); + int mode = get_keymap_mode(); /* Enter "icky" mode */ @@ -1673,6 +1662,8 @@ void do_cmd_macros(void) /* Process requests until done */ while (1) { + char buf[1024]; + /* Clear screen */ Term_clear(); @@ -1706,7 +1697,7 @@ void do_cmd_macros(void) prt("Command: ", 16, 0); /* Get a command */ - i = inkey(); + int i = inkey(); /* Leave */ if (i == ESCAPE) break; @@ -1721,13 +1712,16 @@ void do_cmd_macros(void) prt("File: ", 18, 0); /* Default filename */ - strnfmt(tmp, 1024, "%s.prf", player_name); + auto tmp = fmt::format("{}.prf", game->player_name); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor_aux(&tmp, 80)) + { + continue; + } /* Process the given filename */ - if (0 != process_pref_file(tmp)) + if (0 != process_pref_file(tmp.c_str())) { /* Prompt */ msg_print("Could not load file!"); @@ -1744,13 +1738,16 @@ void do_cmd_macros(void) prt("File: ", 18, 0); /* Default filename */ - strnfmt(tmp, 1024, "%s.prf", player_name); + auto tmp = fmt::format("{}.prf", game->player_name); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor_aux(&tmp, 80)) + { + continue; + } /* Dump the macros */ - (void)macro_dump(tmp); + macro_dump(tmp.c_str()); /* Prompt */ msg_print("Appended macros."); @@ -1800,6 +1797,8 @@ void do_cmd_macros(void) /* Create a macro */ else if (i == '4') { + char tmp[1024]; + /* Prompt */ prt("Command: Create a macro", 16, 0); @@ -1861,13 +1860,16 @@ void do_cmd_macros(void) prt("File: ", 18, 0); /* Default filename */ - strnfmt(tmp, 1024, "%s.prf", player_name); + auto tmp = fmt::format("{}.prf", game->player_name); /* Ask for a file */ - if (!askfor_aux(tmp, 80)) continue; + if (!askfor_aux(&tmp, 80)) + { + continue; + } /* Dump the macros */ - (void)keymap_dump(tmp); + keymap_dump(tmp.c_str()); /* Prompt */ msg_print("Appended keymaps."); @@ -1917,6 +1919,8 @@ void do_cmd_macros(void) /* Create a keymap */ else if (i == '8') { + char tmp[1024]; + /* Prompt */ prt("Command: Create a keymap", 16, 0); @@ -1973,6 +1977,8 @@ void do_cmd_macros(void) /* Enter a new action */ else if (i == '0') { + char tmp[1024]; + /* Prompt */ prt("Command: Enter a new action", 16, 0); diff --git a/src/dungeon.cc b/src/dungeon.cc index c1170c93..ce42ecf4 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -4983,6 +4983,7 @@ static void load_all_pref_files(void) { char buf[1024]; + std::string const &player_name = game->player_name; /* Access the "race" pref file */ sprintf(buf, "%s.prf", rp_ptr->title.c_str()); @@ -4997,7 +4998,7 @@ static void load_all_pref_files(void) process_pref_file(buf); /* Access the "character" pref file */ - sprintf(buf, "%s.prf", player_name); + sprintf(buf, "%s.prf", player_name.c_str()); /* Process that file */ process_pref_file(buf); @@ -5008,7 +5009,7 @@ static void load_all_pref_files(void) * the providence of rules and such to avoid the same * duplication problems as caused when saving macros/keymaps. */ boost::filesystem::path userDirectory(ANGBAND_DIR_USER); - if (automatizer_load(userDirectory / (std::string(player_name) + ".atm"))) + if (automatizer_load(userDirectory / (player_name + ".atm"))) { // Done } diff --git a/src/files.cc b/src/files.cc index 3b9bc875..c460fc5f 100644 --- a/src/files.cc +++ b/src/files.cc @@ -936,7 +936,7 @@ static cptr process_pref_file_expr(char **sp, char *fp) /* Player */ else if (streq(b + 1, "PLAYER")) { - v = player_base; + v = game->player_base.c_str(); // The string SHOULD be stable enough for this } } @@ -2236,7 +2236,7 @@ void display_player(int mode) /* Name, Sex, Race, Class */ put_str("Name :", 2, 1); - c_put_str(TERM_L_BLUE, player_name, 2, 9); + c_put_str(TERM_L_BLUE, game->player_name.c_str(), 2, 9); put_str("Race :", 3, 1); auto const player_race_name = get_player_race_name(p_ptr->prace, p_ptr->pracem); @@ -3757,65 +3757,53 @@ void do_cmd_help(void) -/* - * Process the player name. - * Extract a clean "base name". - * Build the savefile name if needed. - */ void process_player_base() { - char temp[128]; - - /* Rename the savefile, using the player_base */ - (void)sprintf(temp, "%s", player_base); - - /* Build the filename */ - path_build(savefile, 1024, ANGBAND_DIR_SAVE, temp); + path_build(savefile, 1024, ANGBAND_DIR_SAVE, game->player_base.c_str()); } void process_player_name(bool_ sf) { - int i, k = 0; - char tmp[50]; - /* Cannot be too long */ - if (strlen(player_base) > 15) + if (game->player_base.size() > 15) { - /* Name too long */ - quit_fmt("The name '%s' is too long!", player_base); + quit_fmt("The name '%s' is too long!", game->player_base.c_str()); } - /* Cannot contain "icky" characters */ - for (i = 0; player_base[i]; i++) + /* Cannot contain control characters */ + for (auto c : game->player_base) { - /* No control characters */ - if (iscntrl(player_base[i])) + if (iscntrl(c)) { - /* Illegal characters */ - quit_fmt("The name '%s' contains control chars!", player_base); + quit_fmt("The name '%s' contains control chars!", game->player_base.c_str()); } } /* Extract "useful" letters */ - for (i = 0; player_base[i]; i++) + std::string buf; + for (auto c : game->player_base) { - char c = player_base[i]; - /* Accept some letters */ - if (isalpha(c) || isdigit(c)) tmp[k++] = c; + if (isalpha(c) || isdigit(c)) + { + buf += c; + } /* Convert space, dot, and underscore to underscore */ - else if (strchr("@. _", c)) tmp[k++] = '_'; + else if (strchr("@. _", c)) + { + buf += '_'; + } } - /* Terminate */ - tmp[k] = '\0'; - sprintf(player_base, "%s", tmp); + game->player_base = buf; /* Require a "base" name */ - if (!player_base[0]) strcpy(player_base, "PLAYER"); - + if (game->player_base.empty()) + { + game->player_base = "PLAYER"; + } /* Change the savefile name */ if (sf) @@ -3852,10 +3840,13 @@ void get_name(void) move_cursor(2, 9); /* Save the player name */ - strcpy(tmp, player_name); + strcpy(tmp, game->player_name.c_str()); /* Get an input, ignore "Escape" */ - if (askfor_aux(tmp, 31)) strcpy(player_name, tmp); + if (askfor_aux(tmp, 31)) + { + game->player_name = tmp; + } /* Process the player name */ process_player_name(FALSE); @@ -3865,7 +3856,7 @@ void get_name(void) } /* Pad the name (to clear junk) */ - sprintf(tmp, "%-31.31s", player_name); + sprintf(tmp, "%-31.31s", game->player_name.c_str()); /* Re-Draw the name (in light blue) */ c_put_str(TERM_L_BLUE, tmp, 2, 9); @@ -4208,7 +4199,7 @@ static void print_tomb(void) p = cp_ptr->titles[(p_ptr->lev - 1) / 5]; } - center_string(buf, player_name); + center_string(buf, game->player_name.c_str()); put_str(buf, 6, 11); center_string(buf, "the"); @@ -4596,7 +4587,7 @@ void show_highclass(int building) int i = 0, j, m = 0; int pr, pc, clev; high_score the_score; - char buf[1024], out_val[256]; + char buf[1024]; int highscore_fd; switch (building) @@ -4655,6 +4646,9 @@ void show_highclass(int building) j = 0; clev = 0; + auto const format_num = "{:>3d}) {} the {} (Level {:>2d})"; // See also race_score() + auto const format_you = "You) {} the {} (Level {:>2d})"; + while ((m < 9) || (j < MAX_HISCORES)) { if (highscore_seek(highscore_fd, j)) break; @@ -4665,9 +4659,9 @@ void show_highclass(int building) if (((pc == (building - 10)) && (building != 1)) || ((building == 1) && (clev >= PY_MAX_LEVEL))) { - sprintf(out_val, "%3d) %s the %s (Level %2d)", - (m + 1), the_score.who, race_info[pr].title.c_str(), clev); - prt(out_val, (m + 7), 0); + auto out_val = fmt::format(format_num, + (m + 1), the_score.who, race_info[pr].title, clev); + prt(out_val.c_str(), (m + 7), 0); m++; } j++; @@ -4676,17 +4670,21 @@ void show_highclass(int building) /* Now, list the active player if they qualify */ if ((building == 1) && (p_ptr->lev >= PY_MAX_LEVEL)) { - sprintf(out_val, "You) %s the %s (Level %2d)", - player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); - prt(out_val, (m + 8), 0); + auto out_val = fmt::format(format_you, + game->player_name, + race_info[p_ptr->prace].title, + p_ptr->lev); + prt(out_val.c_str(), (m + 8), 0); } else if ((building != 1)) { if ((p_ptr->lev > clev) && (p_ptr->pclass == (building - 10))) { - sprintf(out_val, "You) %s the %s (Level %2d)", - player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); - prt(out_val, (m + 8), 0); + auto out_val = fmt::format(format_you, + game->player_name, + race_info[p_ptr->prace].title, + p_ptr->lev); + prt(out_val.c_str(), (m + 8), 0); } } @@ -4710,7 +4708,7 @@ void race_score(int race_num) int i = 0, j, m = 0; int pr, clev, lastlev; high_score the_score; - char buf[1024], out_val[256], tmp_str[80]; + char buf[1024], tmp_str[80]; int highscore_fd; lastlev = 0; @@ -4742,6 +4740,9 @@ void race_score(int race_num) m = 0; j = 0; + auto const format_num = "{:>3d}) {} the {} (Level {:>2d})"; // See also show_highclass() + auto const format_you = "You) {} the {} (Level {:>2d})"; + while ((m < 10) && (j < i)) { if (highscore_seek(highscore_fd, j)) break; @@ -4750,10 +4751,12 @@ void race_score(int race_num) clev = atoi(the_score.cur_lev); if (pr == race_num) { - sprintf(out_val, "%3d) %s the %s (Level %3d)", - (m + 1), the_score.who, - race_info[pr].title.c_str(), clev); - prt(out_val, (m + 7), 0); + auto out_val = fmt::format(format_num, + (m + 1), + the_score.who, + race_info[pr].title, + clev); + prt(out_val.c_str(), (m + 7), 0); m++; lastlev = clev; } @@ -4763,9 +4766,11 @@ void race_score(int race_num) /* add player if qualified */ if ((p_ptr->prace == race_num) && (p_ptr->lev >= lastlev)) { - sprintf(out_val, "You) %s the %s (Level %3d)", - player_name, race_info[p_ptr->prace].title.c_str(), p_ptr->lev); - prt(out_val, (m + 8), 0); + auto out_val = fmt::format(format_you, + game->player_name, + race_info[p_ptr->prace].title, + p_ptr->lev); + prt(out_val.c_str(), (m + 8), 0); } fd_close(highscore_fd); @@ -4889,7 +4894,7 @@ static errr top_twenty(void) strftime(the_score.day, 9, "%m/%d/%y", localtime(&ct)); /* Save the player name (15 chars) */ - sprintf(the_score.who, "%-.15s", player_name); + sprintf(the_score.who, "%-.15s", game->player_name.c_str()); /* Save the player info XXX XXX XXX */ sprintf(the_score.p_r, "%2d", p_ptr->prace); @@ -4989,7 +4994,7 @@ static errr predict_score(void) strcpy(the_score.day, "TODAY"); /* Save the player name (15 chars) */ - sprintf(the_score.who, "%-.15s", player_name); + sprintf(the_score.who, "%-.15s", game->player_name.c_str()); /* Save the player info XXX XXX XXX */ sprintf(the_score.p_r, "%2d", p_ptr->prace); @@ -5138,7 +5143,7 @@ static void kingly(void) /* Display a message */ put_str("Veni, Vidi, Vici!", 15, 26); put_str("I came, I saw, I conquered!", 16, 21); - put_str(format("All Hail the Mighty %s!", player_name), 17, 22); + put_str(format("All Hail the Mighty %s!", game->player_name.c_str()), 17, 22); /* Flush input */ flush(); @@ -5170,10 +5175,10 @@ void wipe_saved() dungeon_type = d; if (get_dungeon_save(buf)) { - char tmp[80], name[1024]; + auto tmp = fmt::format("{}.{}", game->player_base, buf); - sprintf(tmp, "%s.%s", player_base, buf); - path_build(name, 1024, ANGBAND_DIR_SAVE, tmp); + char name[1024]; + path_build(name, 1024, ANGBAND_DIR_SAVE, tmp.c_str()); /* Remove the dungeon save file */ fd_kill(name); @@ -5234,7 +5239,6 @@ void close_game(void) /* Make a note */ { char long_day[30]; - char buf[80]; time_t ct = time((time_t*)NULL); /* Get the date */ @@ -5242,11 +5246,13 @@ void close_game(void) "%Y-%m-%d at %H:%M:%S", localtime(&ct)); /* Create string */ - sprintf(buf, "\n%s was killed by %s on %s\n", player_name, - died_from, long_day); + auto buf = fmt::format("\n{} was killed by {} on {}\n", + game->player_name, + died_from, + long_day); /* Output to the notes file */ - output_note(buf); + output_note(buf.c_str()); } /* Handle score, show Top scores */ diff --git a/src/game.hpp b/src/game.hpp index 845824b7..daae15c3 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -14,6 +14,16 @@ */ struct Game { + /** + * Player character name + */ + std::string player_name; + + /* + * Stripped version of "player_name" + */ + std::string player_base; + /** * Wilderness map */ diff --git a/src/init1.cc b/src/init1.cc index 427e2d86..96c1b067 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6749,7 +6749,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp) /* Player */ else if (streq(b + 1, "PLAYER")) { - v = player_base; + v = game->player_base.c_str(); // The string SHOULD be stable enough for this } /* Town */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 5c6b24bb..645d479e 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -520,7 +520,7 @@ static bool_ do_extra(ls_flag_t flag) auto const &d_info = game->edit_data.d_info; auto &s_info = game->s_info; - do_string(player_name, 32, flag); + do_std_string(game->player_name, flag); do_string(died_from, 80, flag); @@ -1566,7 +1566,7 @@ void save_dungeon(void) if (!get_dungeon_save(buf) || (!dun_level)) return; /* Construct filename */ - sprintf(tmp, "%s.%s", player_base, buf); + sprintf(tmp, "%s.%s", game->player_base.c_str(), buf); path_build(name, 1024, ANGBAND_DIR_SAVE, tmp); /* Open the file */ @@ -1973,7 +1973,7 @@ bool_ load_dungeon(char *ext) s16b old_dun = dun_level; /* Construct name */ - sprintf(tmp, "%s.%s", player_base, ext); + sprintf(tmp, "%s.%s", game->player_base.c_str(), ext); path_build(name, 1024, ANGBAND_DIR_SAVE, tmp); /* Open the file */ diff --git a/src/main.cc b/src/main.cc index 9dd49aaa..3a08c6b0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -76,16 +76,6 @@ static void init_save_dir(void) } } -static void init_player_name() -{ - /* Get the user id (?) */ - int player_uid = getuid(); - - /* Acquire the "user name" as a default player name */ - user_name(player_name, player_uid); -} - - /* * Initialize and verify the file paths, and the score file. * @@ -139,7 +129,7 @@ int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platf init_file_paths_with_env(); /* Initialize the player name */ - init_player_name(); + game->player_name = user_name(); /* Make sure save directory exists */ init_save_dir(); @@ -179,8 +169,8 @@ int main_real(int argc, char *argv[], char const *platform_sys, int (*init_platf case 'U': { if (!argv[i][2]) goto usage; - strcpy(player_name, &argv[i][2]); - strcpy(player_base, &argv[i][2]); + game->player_name = &argv[i][2]; + game->player_base = &argv[i][2]; no_begin_screen = TRUE; break; } diff --git a/src/notes.cc b/src/notes.cc index 071b02e9..33c6bf76 100644 --- a/src/notes.cc +++ b/src/notes.cc @@ -28,7 +28,7 @@ void show_notes_file(void) char caption[10 + 13]; /* Hack -- extract first 8 characters of name and append an extension */ - (void)strnfmt(basename, sizeof(basename), "%.8s.nte", player_base); + (void)strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); basename[sizeof(basename) - 1] = '\0'; /* Build the path */ @@ -48,14 +48,14 @@ void show_notes_file(void) * Output a string to the notes file. * This is the only function that references that file. */ -void output_note(char *final_note) +void output_note(const char *final_note) { FILE *fff; char basename[13]; char buf[1024]; /* Hack -- extract first 8 characters of name and append an extension */ - (void)strnfmt(basename, sizeof(basename), "%.8s.nte", player_base); + (void)strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); basename[sizeof(basename) - 1] = '\0'; /* Build the path */ @@ -145,7 +145,7 @@ void add_note_type(int note_number) "%s %s\n" "Born on %s\n" "================================================\n", - player_name, player, true_long_day); + game->player_name.c_str(), player, true_long_day); break; } @@ -156,7 +156,7 @@ void add_note_type(int note_number) "%s slew Morgoth on %s\n" "Long live %s!\n" "================================================", - player_name, true_long_day, player_name); + game->player_name.c_str(), true_long_day, game->player_name.c_str()); break; } diff --git a/src/notes.hpp b/src/notes.hpp index e8c22bb7..dbe5c04f 100644 --- a/src/notes.hpp +++ b/src/notes.hpp @@ -1,6 +1,6 @@ #pragma once extern void show_notes_file(void); -extern void output_note(char *final_note); +extern void output_note(char const *final_note); extern void add_note(char *note, char code); extern void add_note_type(int note_number); diff --git a/src/q_library.cc b/src/q_library.cc index 8d2e8a54..c9855591 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -2,6 +2,7 @@ #include "cave_type.hpp" #include "dungeon_flag.hpp" +#include "game.hpp" #include "hooks.hpp" #include "lua_bind.hpp" #include "monster2.hpp" @@ -455,7 +456,7 @@ void quest_library_building(bool_ *paid, bool_ *recreate) object_type forge; object_type *q_ptr = &forge; object_prep(q_ptr, lookup_kind(TV_BOOK, 61)); - q_ptr->artifact_name = player_name; + q_ptr->artifact_name = game->player_name; q_ptr->found = OBJ_FOUND_REWARD; object_aware(q_ptr); object_known(q_ptr); diff --git a/src/randart.cc b/src/randart.cc index 488f11e1..55ffd265 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -358,7 +358,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) } else /* Default name = of 'player name' */ - sprintf(new_name, "of '%s'", player_name); + sprintf(new_name, "of '%s'", game->player_name.c_str()); } else { diff --git a/src/squeltch.cc b/src/squeltch.cc index 747c6beb..8d2db53a 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -170,16 +171,15 @@ static int create_new_rule() static void automatizer_save_rules() { - char name[30] = { '\0' }; char buf[1025]; char ch; int hgt, wid; Term_get_size(&wid, &hgt); - sprintf(name, "%s.atm", player_name); + std::string name = fmt::format("{}.atm", game->player_name); - if (!input_box("Save name?", hgt / 2, wid / 2, name, sizeof(name))) + if (!input_box("Save name?", hgt / 2, wid / 2, &name, 30)) { return; } @@ -201,7 +201,7 @@ static void automatizer_save_rules() }; // Build the filename - path_build(buf, 1024, ANGBAND_DIR_USER, name); + path_build(buf, 1024, ANGBAND_DIR_USER, name.c_str()); if (file_exist(buf)) { diff --git a/src/util.cc b/src/util.cc index ccc61143..604c8793 100644 --- a/src/util.cc +++ b/src/util.cc @@ -37,23 +37,23 @@ using std::chrono::milliseconds; /* * Find a default user name from the system. */ -void user_name(char *buf, int id) +std::string user_name() { #ifdef SET_UID + /* Get the user id (?) */ + int player_uid = getuid(); + struct passwd *pw; /* Look up the user name */ - if ((pw = getpwuid(id))) + if ((pw = getpwuid(player_uid))) { - (void)strcpy(buf, pw->pw_name); - buf[16] = '\0'; - - return; + return pw->pw_name; } #endif /* SET_UID */ - /* Oops. Hack -- default to "PLAYER" */ - strcpy(buf, "PLAYER"); + /* Default to "PLAYER" if we don't have platform support */ + return "PLAYER"; } @@ -3601,7 +3601,7 @@ void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, i /* * Creates an input box */ -bool_ input_box(cptr text, int y, int x, char *buf, int max) +bool input_box(cptr text, int y, int x, char *buf, int max) { int smax = strlen(text); @@ -3615,6 +3615,27 @@ bool_ input_box(cptr text, int y, int x, char *buf, int max) return askfor_aux(buf, max); } +/* + * Creates an input box + */ +bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max) +{ + std::size_t smax = text.size(); + + if (max > smax) + { + smax = max; + } + smax++; + + draw_box(y - 1, x - (smax / 2), 3, smax); + c_put_str(TERM_WHITE, text.c_str(), y, x - (text.size() / 2)); + + Term_gotoxy(x - (smax / 2) + 1, y + 1); + return askfor_aux(buf, max); +} + + /* * Creates a msg bbox and ask a question */ diff --git a/src/util.hpp b/src/util.hpp index c4c7b30c..3c489120 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -8,7 +8,8 @@ #define MAX_IGNORE_KEYMAPS 12 -extern bool_ input_box(cptr text, int y, int x, char *buf, int max); +extern bool input_box(cptr text, int y, int x, char *buf, int max); +extern bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max); extern void draw_box(int y, int x, int h, int w); extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); extern std::string get_player_race_name(int pr, int ps); @@ -78,4 +79,4 @@ extern bool in_bounds2(int y, int x); extern bool panel_contains(int y, int x); extern errr path_parse(char *buf, int max, cptr file); extern void pause_line(int row); -extern void user_name(char *buf, int id); +extern std::string user_name(); diff --git a/src/variable.cc b/src/variable.cc index f1d007ff..e0a31604 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -201,16 +201,6 @@ object_type *tracked_object; -/* - * Current player's character name - */ -char player_name[32]; - -/* - * Stripped version of "player_name" - */ -char player_base[32]; - /* * What killed the player */ diff --git a/src/variable.hpp b/src/variable.hpp index 0fba970d..74569434 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -145,8 +145,6 @@ extern player_race const *rp_ptr; extern player_race_mod const *rmp_ptr; extern player_class const *cp_ptr; extern player_spec const *spp_ptr; -extern char player_name[32]; -extern char player_base[32]; extern int wildc2i[256]; extern cptr DEFAULT_FEAT_TEXT; extern cptr DEFAULT_FEAT_TUNNEL; -- cgit v1.2.3 From a031f2e1b6a8742c44db8cac59d3d8f71f80eea4 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Refactor lua_{msg,input}_box and rename --- src/lua_bind.cc | 25 ------------ src/lua_bind.hpp | 3 -- src/skills.cc | 24 +++++------ src/squelch/condition_metadata.cc | 84 +++++++++++++++++++-------------------- src/squeltch.cc | 38 ++++++------------ src/util.cc | 59 ++++++++++----------------- src/util.hpp | 5 ++- 7 files changed, 86 insertions(+), 152 deletions(-) diff --git a/src/lua_bind.cc b/src/lua_bind.cc index bb305aa3..c2f924ad 100644 --- a/src/lua_bind.cc +++ b/src/lua_bind.cc @@ -230,31 +230,6 @@ void load_map(const char *name, int *y, int *x) process_dungeon_file(name, y, x, cur_hgt, cur_wid, TRUE, TRUE); } -/* - * Some misc functions - */ -char *lua_input_box(cptr title, int max) -{ - static char buf[80]; - int wid, hgt; - - strcpy(buf, ""); - Term_get_size(&wid, &hgt); - if (!input_box(title, hgt / 2, wid / 2, buf, (max > 79) ? 79 : max)) - return buf; - return buf; -} - -char lua_msg_box(cptr title) -{ - int wid, hgt; - - Term_get_size(&wid, &hgt); - return msg_box(title, hgt / 2, wid / 2); -} - - - void increase_mana(int delta) { p_ptr->csp += delta; diff --git a/src/lua_bind.hpp b/src/lua_bind.hpp index 09338949..9882edad 100644 --- a/src/lua_bind.hpp +++ b/src/lua_bind.hpp @@ -24,9 +24,6 @@ extern s32b get_level_use_stick; extern void get_map_size(const char *name, int *ysize, int *xsize); extern void load_map(const char *name, int *y, int *x); -extern char *lua_input_box(cptr title, int max); -extern char lua_msg_box(cptr title); - extern void increase_mana(int delta); extern timer_type *TIMER_AGGRAVATE_EVIL; diff --git a/src/skills.cc b/src/skills.cc index 8572d07f..af5e46c7 100644 --- a/src/skills.cc +++ b/src/skills.cc @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -73,15 +74,11 @@ static void increase_skill(int i, s16b *invest) max_skill_overage = modules[game_module_idx].skills.max_skill_overage; if (((s_info[i].value + s_info[i].mod) / SKILL_STEP) >= (p_ptr->lev + max_skill_overage + 1)) { - int hgt, wid; - char buf[256]; - - sprintf(buf, - "Cannot raise a skill value above " FMTs32b " + player level.", - max_skill_overage); - - Term_get_size(&wid, &hgt); - msg_box(buf, hgt / 2, wid / 2); + msg_box_auto( + fmt::format( + "Cannot raise a skill value above {} + player level.", + max_skill_overage + )); return; } @@ -693,7 +690,7 @@ void do_cmd_skill() flush(); /* Ask we can commit the change */ - if (msg_box("Save and use these skill values? (y/n)", hgt / 2, wid / 2) != 'y') + if (msg_box_auto("Save and use these skill values? (y/n)") != 'y') { /* User declines -- restore the skill values before exiting */ @@ -1629,12 +1626,9 @@ static void gain_ability(int ab) { auto const &ab_info = game->edit_data.ab_info; - int wid, hgt; - Term_get_size(&wid, &hgt); - if (!can_learn_ability(ab)) { - msg_box("You cannot learn this ability.", hgt / 2, wid / 2); + msg_box_auto("You cannot learn this ability."); return; } @@ -1642,7 +1636,7 @@ static void gain_ability(int ab) flush(); /* Ask we can commit the change */ - if (msg_box("Learn this ability (this is permanent)? (y/n)", hgt / 2, wid / 2) != 'y') + if (msg_box_auto("Learn this ability (this is permanent)? (y/n)") != 'y') { return; } diff --git a/src/squelch/condition_metadata.cc b/src/squelch/condition_metadata.cc index 62a90e58..5f91bbfb 100644 --- a/src/squelch/condition_metadata.cc +++ b/src/squelch/condition_metadata.cc @@ -14,8 +14,8 @@ namespace squelch { static std::shared_ptr create_condition_name() { - cptr s = lua_input_box("Object name to match?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Object name to match?", 79); + if (s.empty()) { return nullptr; } @@ -25,8 +25,8 @@ static std::shared_ptr create_condition_name() static std::shared_ptr create_condition_contain() { - cptr s = lua_input_box("Word to find in object name?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Word to find in object name?", 79); + if (s.empty()) { return nullptr; } @@ -36,8 +36,8 @@ static std::shared_ptr create_condition_contain() static std::shared_ptr create_condition_inscribed() { - cptr s = lua_input_box("Word to find in object inscription?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Word to find in object inscription?", 79); + if (s.empty() == 0) { return nullptr; } @@ -50,16 +50,16 @@ static std::shared_ptr create_condition_discount() int min, max; { - cptr s = lua_input_box("Min discount?", 79); - if (sscanf(s, "%d", &min) < 1) + auto s = input_box_auto("Min discount?", 79); + if (sscanf(s.c_str(), "%d", &min) < 1) { return nullptr; } } { - cptr s = lua_input_box("Max discount?", 79); - if (sscanf(s, "%d", &max) < 1) + auto s = input_box_auto("Max discount?", 79); + if (sscanf(s.c_str(), "%d", &max) < 1) { return nullptr; } @@ -70,22 +70,20 @@ static std::shared_ptr create_condition_discount() static std::shared_ptr create_condition_symbol() { - char c; - cptr s = lua_input_box("Symbol to match?", 1); - if (sscanf(s, "%c", &c) < 1) + auto s = input_box_auto("Symbol to match?", 1); + if (s.empty()) { return nullptr; } - return std::make_shared(c); + return std::make_shared(s[0]); } static std::shared_ptr create_condition_status() { status_type status; - char c; - c = lua_msg_box("[t]errible, [v]ery bad, [b]ad, " + auto c = msg_box_auto("[t]errible, [v]ery bad, [b]ad, " "[a]verage, [G]ood, [V]ery good, [S]pecial?"); switch (c) @@ -105,7 +103,7 @@ static std::shared_ptr create_condition_status() static std::shared_ptr create_condition_state() { - char c = lua_msg_box("[i]dentified, [n]on identified?"); + char c = msg_box_auto("[i]dentified, [n]on identified?"); identification_state s; switch (c) @@ -125,9 +123,9 @@ static bool in_byte_range(int x) static std::shared_ptr create_condition_tval() { - cptr s = lua_input_box("Tval to match?", 79); + auto s = input_box_auto("Tval to match?", 79); int tval; - if (sscanf(s, "%d", &tval) < 1) + if (sscanf(s.c_str(), "%d", &tval) < 1) { return nullptr; } @@ -145,8 +143,8 @@ static std::shared_ptr create_condition_sval() int sval_min, sval_max; { - cptr s = lua_input_box("Min sval?", 79); - if ((sscanf(s, "%d", &sval_min) < 1) || + auto s = input_box_auto("Min sval?", 79); + if ((sscanf(s.c_str(), "%d", &sval_min) < 1) || (!in_byte_range(sval_min))) { return nullptr; @@ -154,8 +152,8 @@ static std::shared_ptr create_condition_sval() } { - cptr s = lua_input_box("Max sval?", 79); - if ((sscanf(s, "%d", &sval_max) < 1) || + auto s = input_box_auto("Max sval?", 79); + if ((sscanf(s.c_str(), "%d", &sval_max) < 1) || (!in_byte_range(sval_max))) { return nullptr; @@ -167,8 +165,8 @@ static std::shared_ptr create_condition_sval() static std::shared_ptr create_condition_race() { - cptr s = lua_input_box("Player race to match?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Player race to match?", 79); + if (s.empty()) { return nullptr; } @@ -178,8 +176,8 @@ static std::shared_ptr create_condition_race() static std::shared_ptr create_condition_subrace() { - cptr s = lua_input_box("Player subrace to match?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Player subrace to match?", 79); + if (s.empty()) { return nullptr; } @@ -189,8 +187,8 @@ static std::shared_ptr create_condition_subrace() static std::shared_ptr create_condition_class() { - cptr s = lua_input_box("Player class to match?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Player class to match?", 79); + if (s.empty()) { return nullptr; } @@ -203,16 +201,16 @@ static std::shared_ptr create_condition_level() int min, max; { - cptr s = lua_input_box("Min player level?", 79); - if (sscanf(s, "%d", &min) < 1) + auto s = input_box_auto("Min player level?", 79); + if (sscanf(s.c_str(), "%d", &min) < 1) { return nullptr; } } { - cptr s = lua_input_box("Max player level?", 79); - if (sscanf(s, "%d", &max) < 1) + auto s = input_box_auto("Max player level?", 79); + if (sscanf(s.c_str(), "%d", &max) < 1) { return nullptr; } @@ -226,16 +224,16 @@ static std::shared_ptr create_condition_skill() int min, max; { - cptr s = lua_input_box("Min skill level?", 79); - if (sscanf(s, "%d", &min) < 1) + auto s = input_box_auto("Min skill level?", 79); + if (sscanf(s.c_str(), "%d", &min) < 1) { return nullptr; } } { - cptr s = lua_input_box("Max skill level?", 79); - if (sscanf(s, "%d", &max) < 1) + auto s = input_box_auto("Max skill level?", 79); + if (sscanf(s.c_str(), "%d", &max) < 1) { return nullptr; } @@ -243,13 +241,13 @@ static std::shared_ptr create_condition_skill() s16b skill_idx; { - cptr s = lua_input_box("Skill name?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Skill name?", 79); + if (s.empty() == 0) { return nullptr; } - skill_idx = find_skill_i(s); + skill_idx = find_skill_i(s.c_str()); if (skill_idx < 0) { return nullptr; @@ -261,13 +259,13 @@ static std::shared_ptr create_condition_skill() static std::shared_ptr create_condition_ability() { - cptr s = lua_input_box("Ability name?", 79); - if (strlen(s) == 0) + auto s = input_box_auto("Ability name?", 79); + if (s.empty() == 0) { return nullptr; } - s16b ai = find_ability(s); + s16b ai = find_ability(s.c_str()); if (ai < 0) { return nullptr; diff --git a/src/squeltch.cc b/src/squeltch.cc index 8d2db53a..293eab69 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -121,18 +121,14 @@ void squeltch_inventory(void) static int create_new_rule() { - char name[20] = { '\0' }; - int wid = 0, hgt = 0; + std::string name = "No name"; - Term_get_size(&wid, &hgt); - - sprintf(name, "%s", "No name"); - if (!input_box("Name?", hgt / 2, wid / 2, name, sizeof(name))) + if (!input_box_auto("Name?", &name, 20)) { return -1; } - char typ = lua_msg_box("[D]estroy, [P]ickup, [I]nscribe?"); + char typ = msg_box_auto("[D]estroy, [P]ickup, [I]nscribe?"); std::shared_ptr rule; switch (typ) @@ -150,15 +146,13 @@ static int create_new_rule() case 'i': case 'I': { - cptr i = lua_input_box("Inscription?", 79); - if ((i == nullptr) || (strlen(i) == 0)) + auto s = input_box_auto("Inscription?", 79); + if (s.empty()) { return -1; } - rule = std::make_shared( - name, game_module_idx, nullptr, std::string(i)); - + rule = std::make_shared(name, game_module_idx, nullptr, s); break; } @@ -179,7 +173,7 @@ static void automatizer_save_rules() std::string name = fmt::format("{}.atm", game->player_name); - if (!input_box("Save name?", hgt / 2, wid / 2, &name, 30)) + if (!input_box_auto("Save name?", &name, 30)) { return; } @@ -243,17 +237,12 @@ static void automatizer_save_rules() static void rename_rule(Rule *rule) { - char name[16]; - int wid, hgt; - assert(rule != nullptr); - Term_get_size(&wid, &hgt); - - sprintf(name, "%s", rule->get_name()); - if (input_box("New name?", hgt / 2, wid / 2, name, sizeof(name) - 1)) + std::string name = rule->get_name(); + if (input_box_auto("New name?", &name, 16)) { - rule->set_name(name); + rule->set_name(name.c_str()); } } @@ -261,18 +250,15 @@ static void rename_rule(Rule *rule) #define ACTIVE_RULE 1 void do_cmd_automatizer() { - int wid = 0, hgt = 0; int active = ACTIVE_LIST; cptr keys; cptr keys2; cptr keys3; std::vector rule_names; - Term_get_size(&wid, &hgt); - if (!automatizer_enabled) { - if (msg_box("Automatizer is currently disabled, enable it? (y/n)", hgt / 2, wid / 2) == 'y') + if (msg_box_auto("Automatizer is currently disabled, enable it? (y/n)") == 'y') { automatizer_enabled = TRUE; } @@ -287,6 +273,8 @@ void do_cmd_automatizer() while (1) { Term_clear(); + + int wid, hgt; Term_get_size(&wid, &hgt); automatizer->get_rule_names(&rule_names); diff --git a/src/util.cc b/src/util.cc index 604c8793..1927d050 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3598,59 +3598,40 @@ void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, i } } -/* - * Creates an input box - */ -bool input_box(cptr text, int y, int x, char *buf, int max) +bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max) { - int smax = strlen(text); + int wid, hgt; + Term_get_size(&wid, &hgt); + + auto const y = hgt / 2; + auto const x = wid / 2; - if (max > smax) smax = max; - smax++; + auto const smax = std::max(prompt.size(), max) + 1; draw_box(y - 1, x - (smax / 2), 3, smax); - c_put_str(TERM_WHITE, text, y, x - (strlen(text) / 2)); + c_put_str(TERM_WHITE, prompt.c_str(), y, x - (prompt.size() / 2)); Term_gotoxy(x - (smax / 2) + 1, y + 1); return askfor_aux(buf, max); } -/* - * Creates an input box - */ -bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max) +std::string input_box_auto(std::string const &title, std::size_t max) { - std::size_t smax = text.size(); - - if (max > smax) - { - smax = max; - } - smax++; - - draw_box(y - 1, x - (smax / 2), 3, smax); - c_put_str(TERM_WHITE, text.c_str(), y, x - (text.size() / 2)); - - Term_gotoxy(x - (smax / 2) + 1, y + 1); - return askfor_aux(buf, max); + std::string buf; + input_box_auto(title, &buf, max); + return buf; } - -/* - * Creates a msg bbox and ask a question - */ -char msg_box(cptr text, int y, int x) +char msg_box_auto(std::string const &text) { - if (x == -1) - { - int wid = 0, hgt = 0; - Term_get_size(&wid, &hgt); - x = wid / 2; - y = hgt / 2; - } + int wid, hgt; + Term_get_size(&wid, &hgt); + + auto const y = hgt / 2; + auto const x = wid / 2; - draw_box(y - 1, x - ((strlen(text) + 1) / 2), 2, strlen(text) + 1); - c_put_str(TERM_WHITE, text, y, x - ((strlen(text) + 1) / 2) + 1); + draw_box(y - 1, x - ((text.size() + 1) / 2), 2, text.size() + 1); + c_put_str(TERM_WHITE, text.c_str(), y, x - ((text.size() + 1) / 2) + 1); return inkey(); } diff --git a/src/util.hpp b/src/util.hpp index 3c489120..90999567 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -8,8 +8,9 @@ #define MAX_IGNORE_KEYMAPS 12 -extern bool input_box(cptr text, int y, int x, char *buf, int max); extern bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max); +extern std::string input_box_auto(std::string const &title, std::size_t max); +extern bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max); extern void draw_box(int y, int x, int h, int w); extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); extern std::string get_player_race_name(int pr, int ps); @@ -67,7 +68,7 @@ extern void strlower(char *buf); extern int test_monster_name(cptr name); extern int test_mego_name(cptr name); extern int test_item_name(cptr name); -extern char msg_box(cptr text, int y, int x); +extern char msg_box_auto(std::string const &title); extern timer_type *new_timer(void (*callback)(), s32b delay); extern int get_keymap_mode(); extern void repeat_push(int what); -- cgit v1.2.3 From 90a81c722fa22de210878f7cf708dcc13d2520b9 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Change Rule::{get_set,}name methods to use std::string --- src/include/tome/squelch/automatizer.hpp | 5 ++--- src/include/tome/squelch/rule.hpp | 4 ++-- src/squelch/automatizer.cc | 9 +++++---- src/squelch/condition_metadata.cc | 4 ++-- src/squelch/rule.cc | 7 +++---- src/squeltch.cc | 4 ++-- src/util.cc | 13 +++++++------ src/util.hpp | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/include/tome/squelch/automatizer.hpp b/src/include/tome/squelch/automatizer.hpp index 4361941a..833b5648 100644 --- a/src/include/tome/squelch/automatizer.hpp +++ b/src/include/tome/squelch/automatizer.hpp @@ -114,10 +114,9 @@ public: void add_new_condition(std::function ()> factory); /** - * Get rule names. The names are not stable across multiple - * calls to methods on this class. + * Get rule names. */ - void get_rule_names(std::vector *names) const; + std::vector get_rule_names() const; /** * Get current number of rules. diff --git a/src/include/tome/squelch/rule.hpp b/src/include/tome/squelch/rule.hpp index 752a0c2e..af86dfc8 100644 --- a/src/include/tome/squelch/rule.hpp +++ b/src/include/tome/squelch/rule.hpp @@ -40,12 +40,12 @@ public: /** * Set the name of the rule */ - void set_name(const char *new_name); + void set_name(const std::string &new_name); /** * Get the name of the rule */ - const char *get_name() const; + std::string get_name() const; /** * Get condition diff --git a/src/squelch/automatizer.cc b/src/squelch/automatizer.cc index 2f177ef9..dbf8fa03 100644 --- a/src/squelch/automatizer.cc +++ b/src/squelch/automatizer.cc @@ -205,13 +205,14 @@ void Automatizer::add_new_condition(std::function ()> factory); } -void Automatizer::get_rule_names(std::vector *names) const +std::vector Automatizer::get_rule_names() const { - names->resize(m_rules.size()); - for (size_t i = 0; i < m_rules.size(); i++) + std::vector names(m_rules.size()); + for (auto const &rule: m_rules) { - (*names)[i] = m_rules.at(i)->get_name(); + names.push_back(rule->get_name()); } + return names; } int Automatizer::rules_count() const diff --git a/src/squelch/condition_metadata.cc b/src/squelch/condition_metadata.cc index 5f91bbfb..f6d4370c 100644 --- a/src/squelch/condition_metadata.cc +++ b/src/squelch/condition_metadata.cc @@ -392,7 +392,7 @@ std::shared_ptr new_condition_interactive() match_type::INVENTORY, match_type::EQUIPMENT }; - static std::vector condition_type_names; + static std::vector condition_type_names; // Fill in types names? if (condition_type_names.empty()) @@ -412,7 +412,7 @@ std::shared_ptr new_condition_interactive() Term_clear(); Term_get_size(&wid, &hgt); - display_list(0, 0, hgt - 1, 15, "Rule types", condition_type_names.data(), condition_types.size(), begin, sel, TERM_L_GREEN); + display_list(0, 0, hgt - 1, 15, "Rule types", condition_type_names, begin, sel, TERM_L_GREEN); display_desc(condition_types[sel]); diff --git a/src/squelch/rule.cc b/src/squelch/rule.cc index 50a771ae..e35b3ce1 100644 --- a/src/squelch/rule.cc +++ b/src/squelch/rule.cc @@ -25,15 +25,14 @@ EnumStringMap &action_mapping() return *m; } -void Rule::set_name(const char *new_name) +void Rule::set_name(std::string const &new_name) { - assert(new_name != nullptr); m_name = new_name; } -const char *Rule::get_name() const +std::string Rule::get_name() const { - return m_name.c_str(); + return m_name; } std::shared_ptr Rule::get_condition() const diff --git a/src/squeltch.cc b/src/squeltch.cc index 293eab69..9c0de4be 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -277,9 +277,9 @@ void do_cmd_automatizer() int wid, hgt; Term_get_size(&wid, &hgt); - automatizer->get_rule_names(&rule_names); + auto rule_names = automatizer->get_rule_names(); - display_list(0, 0, hgt - 1, 15, "Rules", rule_names.data(), automatizer->rules_count(), automatizer->rules_begin(), automatizer->selected_rule(), (active == ACTIVE_LIST) ? TERM_L_GREEN : TERM_GREEN); + display_list(0, 0, hgt - 1, 15, "Rules", rule_names, automatizer->rules_begin(), automatizer->selected_rule(), (active == ACTIVE_LIST) ? TERM_L_GREEN : TERM_GREEN); draw_box(0, 15, hgt - 4, wid - 1 - 15); if (active == ACTIVE_RULE) diff --git a/src/util.cc b/src/util.cc index 1927d050..027c6c80 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3580,21 +3580,22 @@ void draw_box(int y, int x, int h, int w) /* * Displays a scrollable boxed list with a selected item */ -void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color) +void display_list(int y, int x, int h, int w, cptr title, std::vector const &list, std::size_t begin, std::size_t sel, byte sel_color) { - int i; - draw_box(y, x, h, w); c_put_str(TERM_L_BLUE, title, y, x + ((w - strlen(title)) / 2)); - for (i = 0; i < h - 1; i++) + for (int i = 0; i < h - 1; i++) { byte color = TERM_WHITE; - if (i + begin >= max) break; + if (i + begin >= list.size()) + { + break; + } if (i + begin == sel) color = sel_color; - c_put_str(color, list[i + begin], y + 1 + i, x + 1); + c_put_str(color, list[i + begin].c_str(), y + 1 + i, x + 1); } } diff --git a/src/util.hpp b/src/util.hpp index 90999567..4c74ad10 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -12,7 +12,7 @@ extern bool input_box(std::string const &text, int y, int x, std::string *buf, s extern std::string input_box_auto(std::string const &title, std::size_t max); extern bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max); extern void draw_box(int y, int x, int h, int w); -extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color); +extern void display_list(int y, int x, int h, int w, cptr title, std::vector const &list, std::size_t begin, std::size_t sel, byte sel_color); extern std::string get_player_race_name(int pr, int ps); extern std::string get_day(s32b day); extern s32b bst(s32b what, s32b t); -- cgit v1.2.3 From 2bf6a6ce72bf3f2038cd383fb7c6d35679ef9341 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Add std::string overloads of c_put_str() and put_str() --- src/util.cc | 22 +++++++++------------- src/util.hpp | 2 ++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/util.cc b/src/util.cc index 027c6c80..ce791015 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1976,29 +1976,25 @@ void cmsg_format(byte color, cptr fmt, ...) cmsg_print(color, buf); } - - -/* -* Display a string on the screen using an attribute. -* -* At the given location, using the given attribute, if allowed, -* add the given string. Do not clear the line. -*/ void c_put_str(byte attr, cptr str, int row, int col) { - /* Position cursor, Dump the attr/text */ Term_putstr(col, row, -1, attr, str); } -/* -* As above, but in "white" -*/ +void c_put_str(byte attr, std::string const &str, int row, int col) +{ + Term_putstr(col, row, -1, attr, str.c_str()); +} + void put_str(cptr str, int row, int col) { - /* Spawn */ Term_putstr(col, row, -1, TERM_WHITE, str); } +void put_str(std::string const &str, int row, int col) +{ + Term_putstr(col, row, -1, TERM_WHITE, str.c_str()); +} /* diff --git a/src/util.hpp b/src/util.hpp index 4c74ad10..cc896e69 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -41,7 +41,9 @@ extern void msg_format(cptr fmt, ...); extern void screen_save(void); extern void screen_load(void); extern void c_put_str(byte attr, cptr str, int row, int col); +extern void c_put_str(byte attr, std::string const &str, int row, int col); extern void put_str(cptr str, int row, int col); +extern void put_str(std::string const &s, int row, int col); extern void c_prt(byte attr, cptr str, int row, int col); extern void c_prt(byte attr, std::string const &s, int row, int col); extern void prt(std::string const &s, int row, int col); -- cgit v1.2.3 From 0f37adeca0e2facfcb32f30e285048fac23c8845 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move died_from to Game struct --- src/dungeon.cc | 14 ++++--- src/files.cc | 122 ++++++++++++------------------------------------------- src/game.hpp | 5 +++ src/loadsave.cc | 4 +- src/q_one.cc | 2 +- src/spells1.cc | 16 +++++--- src/variable.cc | 5 --- src/variable.hpp | 1 - 8 files changed, 51 insertions(+), 118 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index ce42ecf4..26a34815 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1890,10 +1890,12 @@ static void process_world(void) msg_print(death_message); } - /* Note cause of death */ - (void)strcpy(died_from, "being undead too long"); - - if (p_ptr->image) strcat(died_from, "(?)"); + /* Note cause of death; hallucinating characters don't get to know. */ + game->died_from = "being undead too long"; + if (p_ptr->image) + { + game->died_from = "(?)"; + } /* No longer a winner */ total_winner = FALSE; @@ -5390,8 +5392,8 @@ void play_game() p_ptr->word_recall = 0; } - /* Note cause of death XXX XXX XXX */ - (void)strcpy(died_from, "Cheating death"); + /* Note cause of death */ + game->died_from = "Cheating death"; /* Do not die */ death = FALSE; diff --git a/src/files.cc b/src/files.cc index c460fc5f..49505292 100644 --- a/src/files.cc +++ b/src/files.cc @@ -3911,7 +3911,7 @@ void do_cmd_suicide(void) p_ptr->leaving = TRUE; /* Cause of death */ - (void)strcpy(died_from, "Quitting"); + game->died_from = "Quitting"; } @@ -3974,7 +3974,7 @@ void do_cmd_save_game(void) Term_fresh(); /* The player is not dead */ - (void)strcpy(died_from, "(saved)"); + game->died_from = "(saved)"; /* Save the player */ if (save_player()) @@ -3994,7 +3994,7 @@ void do_cmd_save_game(void) Term_fresh(); /* Note that the player is not dead */ - (void)strcpy(died_from, "(alive and well)"); + game->died_from = "(alive and well)"; } /* @@ -4125,50 +4125,26 @@ static long total_points(void) } - -/* - * Centers a string within a 31 character string -JWT- - */ -static void center_string(char *buf, cptr str) -{ - int i, j; - - /* Total length */ - i = strlen(str); - - /* Necessary border */ - j = 15 - i / 2; - - /* Mega-Hack */ - (void)sprintf(buf, "%*s%s%*s", j, "", str, 31 - i - j, ""); -} - - /* * Display a "tomb-stone" */ static void print_tomb(void) { - cptr p; - - char tmp[160]; - - char buf[1024]; - char dummy[80]; - - FILE *fp; - time_t ct = time(nullptr); + auto center = [](std::string const &s) -> std::string { + return fmt::format("{:^31s}", s); + }; /* Clear screen */ Term_clear(); /* Build the filename */ + char buf[1024]; path_build(buf, 1024, ANGBAND_DIR_FILE, "dead.txt"); /* Open the News file */ - fp = my_fopen(buf, "r"); + FILE *fp = my_fopen(buf, "r"); /* Dump */ if (fp) @@ -4186,65 +4162,26 @@ static void print_tomb(void) my_fclose(fp); } - - /* King or Queen */ + std::string p_title; if (total_winner || (p_ptr->lev > PY_MAX_LEVEL)) { - p = "Magnificent"; + p_title = "Magnificent"; } - - /* Normal */ else { - p = cp_ptr->titles[(p_ptr->lev - 1) / 5]; - } - - center_string(buf, game->player_name.c_str()); - put_str(buf, 6, 11); - - center_string(buf, "the"); - put_str(buf, 7, 11); - - center_string(buf, p); - put_str(buf, 8, 11); - - - center_string(buf, spp_ptr->title); - put_str(buf, 10, 11); - - (void)sprintf(tmp, "Level: %d", (int)p_ptr->lev); - center_string(buf, tmp); - put_str(buf, 11, 11); - - (void)sprintf(tmp, "Exp: %ld", (long)p_ptr->exp); - center_string(buf, tmp); - put_str(buf, 12, 11); - - (void)sprintf(tmp, "AU: %ld", (long)p_ptr->au); - center_string(buf, tmp); - put_str(buf, 13, 11); - - (void)sprintf(tmp, "Killed on Level %d", dun_level); - center_string(buf, tmp); - put_str(buf, 14, 11); - - - if (strlen(died_from) > 24) - { - strncpy(dummy, died_from, 24); - dummy[24] = '\0'; - (void)sprintf(tmp, "by %s.", dummy); + p_title = cp_ptr->titles[(p_ptr->lev - 1) / 5]; } - else - (void)sprintf(tmp, "by %s.", died_from); - - center_string(buf, tmp); - put_str(buf, 15, 11); - - (void)sprintf(tmp, "%-.24s", ctime(&ct)); - center_string(buf, tmp); - put_str(buf, 17, 11); + put_str(center(game->player_name), 6, 11); + put_str(center("the"), 7, 11); + put_str(center(p_title), 8, 11); + put_str(center(spp_ptr->title), 10, 11); + put_str(center(fmt::format("Level: {}", p_ptr->lev)), 11, 11); + put_str(center(fmt::format("Exp: {}", p_ptr->exp)), 12, 11); + put_str(center(fmt::format("AU: {}", p_ptr->au)), 13, 11); + put_str(center(fmt::format("Killed on Level {}", dun_level)), 14, 11); + put_str(center(fmt::format("by {}.", game->died_from.substr(0, 24))), 15, 11); + put_str(center(std::string(ctime(&ct)).substr(0, 24)), 17, 11); } @@ -4850,17 +4787,8 @@ static errr top_twenty(void) goto out; } - /* Interupted */ - if (!total_winner && streq(died_from, "Interrupting")) - { - msg_print("Score not registered due to interruption."); - msg_print(NULL); - display_scores_aux(highscore_fd, 0, 10, -1, NULL); - goto out; - } - /* Quitter */ - if (!total_winner && streq(died_from, "Quitting")) + if (!total_winner && (game->died_from == "Quitting")) { msg_print("Score not registered due to quitting."); msg_print(NULL); @@ -4911,7 +4839,7 @@ static errr top_twenty(void) sprintf(the_score.inside_quest, "%3d", p_ptr->inside_quest); /* Save the cause of death (31 chars) */ - sprintf(the_score.how, "%-.31s", died_from); + sprintf(the_score.how, "%-.31s", game->died_from.c_str()); /* Add a new entry to the score list, see where it went */ @@ -5110,7 +5038,7 @@ static void kingly(void) dun_level = 0; /* Fake death */ - (void)strcpy(died_from, "Ripe Old Age"); + game->died_from = "Ripe Old Age"; /* Restore the experience */ p_ptr->exp = p_ptr->max_exp; @@ -5248,7 +5176,7 @@ void close_game(void) /* Create string */ auto buf = fmt::format("\n{} was killed by {} on {}\n", game->player_name, - died_from, + game->died_from, long_day); /* Output to the notes file */ diff --git a/src/game.hpp b/src/game.hpp index daae15c3..00a0c8d5 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -24,6 +24,11 @@ struct Game { */ std::string player_base; + /** + * What did the player die from? + */ + std::string died_from; + /** * Wilderness map */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 645d479e..6e7ae7ff 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -522,7 +522,7 @@ static bool_ do_extra(ls_flag_t flag) do_std_string(game->player_name, flag); - do_string(died_from, 80, flag); + do_std_string(game->died_from, flag); for (std::size_t i = 0; i < 4; i++) { @@ -2752,7 +2752,7 @@ bool_ load_player(void) if (p_ptr->chp >= 0) { /* Reset cause of death */ - (void)strcpy(died_from, "(alive and well)"); + game->died_from = "(alive and well)"; } /* Success */ diff --git a/src/q_one.cc b/src/q_one.cc index e982501c..043e7d0e 100644 --- a/src/q_one.cc +++ b/src/q_one.cc @@ -207,7 +207,7 @@ static bool_ quest_one_die_hook(void *, void *, void *) { cmsg_print(TERM_YELLOW, "The One Ring finally drags you totally to the shadow world."); cmsg_print(TERM_YELLOW, "Your mortal existence ends there."); - strcpy(died_from, "being drawn to the shadow world"); + game->died_from = "being drawn to the shadow world"; } } return (FALSE); diff --git a/src/spells1.cc b/src/spells1.cc index fe620256..5217a803 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -1334,9 +1334,11 @@ void take_hit(int damage, cptr hit_from) } /* Note cause of death */ - (void)strcpy(died_from, hit_from); - - if (p_ptr->image) strcat(died_from, "(?)"); + game->died_from = hit_from; + if (p_ptr->image) + { + game->died_from = "(?)"; + } /* Leaving */ p_ptr->leaving = TRUE; @@ -1508,9 +1510,11 @@ void take_sanity_hit(int damage, cptr hit_from) } /* Note cause of death */ - (void)strcpy(died_from, hit_from); - - if (p_ptr->image) strcat(died_from, "(?)"); + game->died_from = hit_from; + if (p_ptr->image) + { + game->died_from = "(?)"; + } /* Leaving */ p_ptr->leaving = TRUE; diff --git a/src/variable.cc b/src/variable.cc index e0a31604..32f3bbc7 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -201,11 +201,6 @@ object_type *tracked_object; -/* - * What killed the player - */ -char died_from[80]; - /* * Hack -- Textual "history" for the Player */ diff --git a/src/variable.hpp b/src/variable.hpp index 74569434..a752b3f1 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -105,7 +105,6 @@ extern s16b health_who; extern s16b monster_race_idx; extern s16b monster_ego_idx; extern object_type *tracked_object; -extern char died_from[80]; extern char history[4][60]; extern s16b lite_n; extern s16b lite_y[LITE_MAX]; -- cgit v1.2.3 From 598c5887ae589059e4f4a9801ff1e4f7f8385f00 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move previous_char to Game struct --- src/birth.cc | 41 +++++++++++++++++++---------------------- src/game.hpp | 6 ++++++ src/loadsave.cc | 4 ++-- src/variable.cc | 5 ----- src/variable.hpp | 1 - 5 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 3b8c9fda..f18c87fa 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -177,8 +177,7 @@ void print_desc(cptr txt) */ static void save_prev_data(void) { - int i; - + auto &previous_char = game->previous_char; /*** Save the current data ***/ @@ -196,14 +195,14 @@ static void save_prev_data(void) previous_char.au = p_ptr->au; /* Save the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { previous_char.stat[i] = p_ptr->stat_max[i]; } previous_char.luck = p_ptr->luck_base; /* Save the history */ - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { strcpy(previous_char.history[i], history[i]); } @@ -215,8 +214,7 @@ static void save_prev_data(void) */ static void load_prev_data(bool_ save) { - int i; - + auto &previous_char = game->previous_char; birther temp; @@ -226,14 +224,14 @@ static void load_prev_data(bool_ save) temp.au = p_ptr->au; /* Save the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { temp.stat[i] = p_ptr->stat_max[i]; } temp.luck = p_ptr->luck_base; /* Save the history */ - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { strcpy(temp.history[i], history[i]); } @@ -245,7 +243,7 @@ static void load_prev_data(bool_ save) p_ptr->au = previous_char.au; /* Load the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { p_ptr->stat_max[i] = previous_char.stat[i]; p_ptr->stat_cur[i] = previous_char.stat[i]; @@ -254,7 +252,7 @@ static void load_prev_data(bool_ save) p_ptr->luck_max = previous_char.luck; /* Load the history */ - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { strcpy(history[i], previous_char.history[i]); } @@ -267,14 +265,14 @@ static void load_prev_data(bool_ save) previous_char.au = temp.au; /* Save the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { previous_char.stat[i] = temp.stat[i]; } previous_char.luck = temp.luck; /* Save the history */ - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { strcpy(previous_char.history[i], temp.history[i]); } @@ -1484,7 +1482,7 @@ static bool_ player_birth_aux_ask() /*** Quick Start ***/ - if (previous_char.quick_ok) + if (game->previous_char.quick_ok) { /* Choose */ while (1) @@ -1514,10 +1512,9 @@ static bool_ player_birth_aux_ask() /*** Player race ***/ - if (do_quick_start) { - k = previous_char.race; + k = game->previous_char.race; } else { @@ -1621,7 +1618,7 @@ static bool_ player_birth_aux_ask() /*** Player race mod ***/ if (do_quick_start) { - k = previous_char.rmod; + k = game->previous_char.rmod; p_ptr->pracem = k; rmp_ptr = &race_mod_info[p_ptr->pracem]; } @@ -1748,10 +1745,10 @@ static bool_ player_birth_aux_ask() /*** Player class ***/ if (do_quick_start) { - k = previous_char.pclass; + k = game->previous_char.pclass; p_ptr->pclass = k; cp_ptr = &class_info[p_ptr->pclass]; - k = previous_char.spec; + k = game->previous_char.spec; p_ptr->pspec = k; spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec]; } @@ -1943,9 +1940,9 @@ static bool_ player_birth_aux_ask() /*** Player god ***/ if (do_quick_start) { - k = previous_char.god; + k = game->previous_char.god; p_ptr->pgod = k; - set_grace(previous_char.grace); + set_grace(game->previous_char.grace); } else if (race_flags_p(PR_NO_GOD)) { @@ -2120,7 +2117,7 @@ static bool_ player_birth_aux_ask() { if (do_quick_start) { - v = previous_char.quests; + v = game->previous_char.quests; } else { @@ -2895,7 +2892,7 @@ static bool_ player_birth_aux() } /* Save this for the next character */ - previous_char.quick_ok = TRUE; + game->previous_char.quick_ok = TRUE; save_prev_data(); /* Accept */ diff --git a/src/game.hpp b/src/game.hpp index 00a0c8d5..20ca0f86 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -2,6 +2,7 @@ #include "game_fwd.hpp" +#include "birther.hpp" #include "game_edit_data.hpp" #include "grid.hpp" #include "h-basic.h" @@ -29,6 +30,11 @@ struct Game { */ std::string died_from; + /** + * Previous character + */ + birther previous_char; + /** * Wilderness map */ diff --git a/src/loadsave.cc b/src/loadsave.cc index 6e7ae7ff..ad824536 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -385,7 +385,7 @@ static void do_seed(seed_t *seed, ls_flag_t flag) /* * Load/Save quick start data */ -static void do_quick_start(ls_flag_t flag) +static void do_quick_start(ls_flag_t flag, birther &previous_char) { do_s16b(&previous_char.race, flag); do_s16b(&previous_char.rmod, flag); @@ -567,7 +567,7 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&generate_special_feeling, flag); /* Load the quick start data */ - do_quick_start(flag); + do_quick_start(flag, game->previous_char); /* Load/save the special subrace */ do_subrace(flag); diff --git a/src/variable.cc b/src/variable.cc index 32f3bbc7..8395a75e 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -622,11 +622,6 @@ bool_ generate_special_feeling = FALSE; */ DECLARE_FLAG_ZERO_IMPL(dungeon_flag_set, dungeon_flags); -/* - * The last character displayed - */ -birther previous_char; - /* * The spell list of schools */ diff --git a/src/variable.hpp b/src/variable.hpp index a752b3f1..a4678bae 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -179,7 +179,6 @@ extern random_quest random_quests[MAX_RANDOM_QUEST]; extern bool_ *special_lvl[MAX_DUNGEON_DEPTH]; extern bool_ generate_special_feeling; DECLARE_FLAG_ZERO_INTF(dungeon_flag_set, dungeon_flags); -extern birther previous_char; extern s16b schools_count; extern school_type schools[SCHOOLS_MAX]; extern int project_time; -- cgit v1.2.3 From ca47ccdc66d252e0b5791112cac4042e86cefc89 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove character background --- lib/edit/p_info.txt | 415 +++---------------------------------- lib/mods/theme/edit/p_info.txt | 456 +++-------------------------------------- src/birth.cc | 332 +----------------------------- src/birther.hpp | 5 +- src/cmd4.cc | 4 +- src/files.cc | 48 ++--- src/game_edit_data.hpp | 6 - src/hist_type.hpp | 18 -- src/init1.cc | 32 +-- src/loadsave.cc | 10 - src/player_race.hpp | 2 - src/variable.cc | 5 - src/variable.hpp | 1 - 13 files changed, 70 insertions(+), 1264 deletions(-) delete mode 100644 src/hist_type.hpp diff --git a/lib/edit/p_info.txt b/lib/edit/p_info.txt index 2846854f..5cb2e5cd 100644 --- a/lib/edit/p_info.txt +++ b/lib/edit/p_info.txt @@ -725,7 +725,7 @@ C:a:k:+0:+100:Magic-Device # R:D:race desc # R:S:str:int:wis:dex:con:chr:luck # R:K:dis:dev:sav:stl:srh:fos:thn:thb -# R:P:hitdie:xp%:infra:history chart +# R:P:hitdie:xp%:infra # R:E:weapons:torso:arms:finger:head:legs # R:C:allowed classes # R:G:race flags @@ -741,7 +741,7 @@ R:D:Humans are the second born, the Edain. R:D:They are the basic race to which all others are compared. R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 -R:P:10:100:0:1 +R:P:10:100:0 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -753,7 +753,7 @@ R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 -R:P:9:110:2:4 +R:P:9:110:2 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -773,7 +773,7 @@ R:D:Elves are the first born, the Eldar. R:D:More spiritual than physical beings, they are weaker than humans R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 -R:P:8:120:3:5 +R:P:8:120:3 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE @@ -793,7 +793,7 @@ R:N:3:Hobbit R:D:An old but quiet race related to humans. R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 -R:P:7:110:4:10 +R:P:7:110:4 R:E:1:1:1:2:1:1 R:Z:create food R:G:RESIST_BLACK_BREATH @@ -816,7 +816,7 @@ R:N:4:Gnome R:D:Related to dwarves, Gnomes are between Dwarves and Hobbits in size. R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 -R:P:8:135:4:13 +R:P:8:135:4 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 @@ -834,7 +834,7 @@ R:N:5:Dwarf R:D:The children of Aule, a strong but small race. R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 -R:P:11:125:5:16 +R:P:11:125:5 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 @@ -851,7 +851,7 @@ R:k:+500:+000:Archery R:N:6:Orc R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 -R:P:10:110:3:25 +R:P:10:110:3 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 @@ -870,7 +870,7 @@ R:N:7:Troll R:D:They can bear the light of the sun. R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 -R:P:12:137:3:22 +R:P:12:137:3 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 @@ -888,7 +888,7 @@ R:N:8:Dunadan R:D:The greatest of the Edain, humans in all respects but R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 -R:P:10:180:0:1 +R:P:10:180:0 R:E:1:1:1:2:1:1 R:R:1:0 R:F:REGEN @@ -910,7 +910,7 @@ R:D:Elves are the first born, the Eldar. R:D:High elves are the best of the Eldar, strong, fast, intellectual, though R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 -R:P:10:200:4:7 +R:P:10:200:4 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE @@ -931,7 +931,7 @@ R:N:10:Half-Ogre R:D:A crossbreed between a human and an ogre. R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 -R:P:12:130:3:74 +R:P:12:130:3 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 @@ -949,7 +949,7 @@ R:N:11:Beorning R:D:A race of men shapeshifters. R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 -R:P:12:150:3:75 +R:P:12:150:3 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 @@ -969,7 +969,7 @@ R:k:+500:+000:Archery R:N:12:Kobold R:D:A weaker kind of goblin, related to orcs. R:S:1:-1:0:1:0:-4:0 -R:P:9:125:3:82 +R:P:9:125:3 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 @@ -987,7 +987,7 @@ R:N:13:Petty-Dwarf R:D:A nearly extinct subrace of dwarves. R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 -R:P:11:135:5:87 +R:P:11:135:5 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 @@ -1006,7 +1006,7 @@ R:D:Elves are the first born, the Eldar. R:D:Dark elves are rare on Middle-earth and even though not evil R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 -R:P:9:150:5:69 +R:P:9:150:5 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 @@ -1030,7 +1030,7 @@ R:N:15:Ent R:D:Guardian of the forests of Middle-earth, summoned by Yavanna before R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 -R:P:14:210:5:95 +R:P:14:210:5 R:E:1:1:1:2:1:1 R:Z:grow trees R:G:AC_LEVEL @@ -1063,7 +1063,7 @@ R:N:16:RohanKnight R:D:Humans from the land of Rohan, riding the great Mearas. R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 -R:P:10:220:0:84 +R:P:10:220:0 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 @@ -1097,7 +1097,7 @@ R:N:17:Thunderlord R:D:A thunderlord is a Great Eagle of Manwe, ridden by a Maia of Manwe. R:D:They carry the power of wind and thunder. R:S:6:2:1:1:3:8:2 -R:P:12:400:0:89 +R:P:12:400:0 R:E:1:1:1:2:1:1 R:Z:Thunderlord's Powers R:R:1:0 @@ -1130,7 +1130,7 @@ R:N:18:DeathMold R:D:A pure mass of evilness, DeathMolds cannot move, but they have much more R:D:power than an average race. R:S:10:0:10:0:10:-15:-5 -R:P:15:250:10:100 +R:P:15:250:10 R:E:1:1:1:4:0:0 R:Z:Death Mold's Powers R:G:EXPERIMENTAL @@ -1151,7 +1151,7 @@ R:k:+2500:+000:Archery R:N:19:Yeek R:D:The weakest of all the races, bad at everything except gaining levels quickly. R:S:-5:-5:-5:-5:-5:-5:-5 -R:P:6:25:2:29 +R:P:6:25:2 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -1169,7 +1169,7 @@ R:N:20:Wood-Elf R:D:Elves are the first born, the Eldar. R:D:Wood elves live in the great forests of Middle-earth. R:S:-3:2:1:5:-4:1:0 -R:P:7:130:4:5 +R:P:7:130:4 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW R:R:1:1 @@ -1193,7 +1193,7 @@ R:N:21:Maia R:D:An old race, dating from before the creation of Arda, the Maiar were R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 -R:P:10:100:0:91 +R:P:10:100:0 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:1:0 @@ -1562,372 +1562,3 @@ S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S:S:0:0:0:0:0:0:0:100 S:P:0:0:0 S:E:0:0:0:0:0:0 - - -############################################################################## -############################################################################## -############################################################################## -############################################################################## -# H: Race history -# H:chance:chart:next chart:social class bonus:desc - -# Dunadan, Human: 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# RohanKnight: 84 -> 85 -> 50 -> 51 -> 52 -> 53. -# Half-Ogre: 74 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Beorning: 75 -> 76 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Half-elf: 4 -> 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Elf, Wood-elf: 5 -> 6 -> 9 -> 54 -> 55 -> 56. -# High-elf: 7 -> 8 -> 9 -> 54 -> 55 -> 56. -# Dark-elf: 69 -> 70 -> 71 -> 72 -> 73. -# Hobbit: 10 -> 11 -> 3 -> 50 -> 51 -> 52 -> 53. -# Gnome: 13 -> 14 -> 3 -> 50 -> 51 -> 52 -> 53. -# Dwarf: 16 -> 17 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61. -# Petty-Dwarf: 87 -> 88 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61. -# Thunderlord: 89 -> 90 -> 93 -> 94. -# Maia: 91 -> 92 -> 93 -> 94. -# Ent: 95 -> 96. -# Troll: 22 -> 23 -> 24 -> 62 -> 63 -> 64 -> 65 -> 66. -# Orc 25 -> 26 -> 27 -> 28 -> 80 -> 81 -> 65 -> 66. -# Yeek: 29 -> 3 -> 50 -> 51 -> 52 -> 53. -# (not used: 78 -> 79 -> 80 -> 81 -> 65 -> 66.) -# Kobold: 82 -> 83 -> 80 -> 81 -> 65 -> 66. -# Deathmold: 100 -> 101 -> 102 -> 103 -> 104. - -H:10:1:2:25:You are the illegitimate and unacknowledged child -H:20:1:2:35:You are the illegitimate but acknowledged child -H:95:1:2:45:You are one of several children -H:100:1:2:50:You are the first child - -H:40:2:3:65:of a Serf. -H:65:2:3:80:of a Yeoman. -H:80:2:3:90:of a Townsman. -H:90:2:3:105:of a Guildsman. -H:96:2:3:120:of a Landed Knight. -H:99:2:3:130:of a Noble Lord. -H:100:2:3:140:of the Royal Blood Line. - -H:20:3:50:20:You are the black sheep of the family. -H:80:3:50:55:You are a credit to the family. -H:100:3:50:60:You are a well-liked child. - -H:25:4:1:40:Your mother was of the Avari. -H:40:4:1:50:Your father was of the Avari. -H:65:4:1:60:Your mother was of the Nandor. -H:80:4:1:60:Your father was of the Nandor. -H:96:4:1:70:Your mother was of the Sindar. -H:99:4:1:70:Your father was of the Sindar. -H:100:4:1:100:Your ancestry traces to Elrond. - -H:60:5:6:50:You are one of several children -H:100:5:6:55:You are the only child - -H:40:6:9:40:of an Avarin -H:70:6:9:50:of a Nandorin -H:100:6:9:60:of a Sindarin - -H:60:7:8:50:You are one of several children -H:100:7:8:55:You are the only child - -H:75:8:9:50:of a Telerin -H:95:8:9:55:of a Noldorin -H:100:8:9:60:of a Vanyarin - -H:40:9:54:80:Ranger. -H:70:9:54:90:Archer. -H:87:9:54:110:Warrior. -H:95:9:54:125:Mage. -H:99:9:54:140:Prince. -H:100:9:54:145:King. - -H:85:10:11:45:You are one of several children of a Hobbit -H:100:10:11:55:You are the only child of a Hobbit - -H:20:11:3:55:Bum. -H:30:11:3:80:Tavern Owner. -H:40:11:3:90:Miller. -H:50:11:3:100:Home Owner. -H:80:11:3:110:Burglar. -H:95:11:3:115:Warrior. -H:99:11:3:125:Mage. -H:100:11:3:140:Clan Elder. - -H:85:13:14:45:You are one of several children of a Gnome -H:100:13:14:55:You are the only child of a Gnome - -H:20:14:3:55:Beggar. -H:50:14:3:70:Braggart. -H:75:14:3:85:Prankster. -H:95:14:3:100:Warrior. -H:100:14:3:125:Mage. - -H:25:16:17:40:You are one of two children of a Dwarven -H:100:16:17:50:You are the only child of a Dwarven - -H:10:17:18:60:Thief. -H:35:17:18:80:Smith. -H:75:17:18:90:Miner. -H:90:17:18:110:Warrior. -H:99:17:18:130:Priest. -H:100:17:18:150:King. - -H:15:18:57:10:You are the black sheep of the family. -H:85:18:57:50:You are a credit to the family. -H:100:18:57:55:You are a well liked child. - -H:100:20:2:50:You are the adopted child - -H:100:22:23:50:You are the offspring of a - -H:30:23:24:20:Forest-Troll -H:60:23:24:25:Cave-Troll -H:75:23:24:30:Hill-Troll -H:90:23:24:35:Stone-Troll -H:95:23:24:40:Snow-Troll -H:100:23:24:45:Water-Troll - -H:25:24:62:50:Worker. -H:95:24:62:55:Warrior. -H:99:24:62:65:Shaman. -H:100:24:62:80:Clan Chief. - -H:100:25:26:50:You are one of several children of - -H:40:26:27:40:a Snaga -H:80:26:27:50:an Orc -H:100:26:27:60:an Uruk - -H:30:27:28:20:Slave -H:60:27:28:50:Archer -H:90:27:28:60:Warrior -H:95:27:28:80:Shaman -H:100:27:28:100:Chieftain - -H:30:28:80:50:from the Misty Mountains. -H:60:28:80:50:from the Grey Mountains. -H:90:28:80:70:from the orc-hold of Mount Gundabad. -H:100:28:80:80:from the Pits of Angband. - -H:25:29:3:50:You are one of five children of a blue Yeek. -H:75:29:3:75:You are one of five children of a brown Yeek. -H:100:29:3:100:You are one of five children of a master Yeek. - -H:20:50:51:50:You have dark brown eyes, -H:60:50:51:50:You have brown eyes, -H:70:50:51:50:You have hazel eyes, -H:80:50:51:50:You have green eyes, -H:90:50:51:50:You have blue eyes, -H:100:50:51:50:You have blue-gray eyes, - -H:70:51:52:50:straight -H:90:51:52:50:wavy -H:100:51:52:50:curly - -H:30:52:53:50:black hair, -H:70:52:53:50:brown hair, -H:80:52:53:50:auburn hair, -H:90:52:53:50:red hair, -H:100:52:53:50:blond hair, - -H:10:53:0:50:and a very dark complexion. -H:30:53:0:50:and a dark complexion. -H:80:53:0:50:and an average complexion. -H:90:53:0:50:and a fair complexion. -H:100:53:0:50:and a very fair complexion. - -H:85:54:55:50:You have light grey eyes, -H:95:54:55:50:You have light blue eyes, -H:100:54:55:50:You have light green eyes, - -H:75:55:56:50:straight -H:100:55:56:50:wavy - -H:75:56:0:50:black hair, and a fair complexion. -H:85:56:0:50:brown hair, and a fair complexion. -H:95:56:0:50:blond hair, and a fair complexion. -H:100:56:0:50:silver hair, and a fair complexion. - -H:99:57:58:50:You have dark brown eyes, -H:100:57:58:60:You have glowing red eyes, - -H:90:58:59:50:straight -H:100:58:59:50:wavy - -H:75:59:60:50:black hair, -H:100:59:60:50:brown hair, - -H:25:60:61:50:a one foot beard, -H:60:60:61:51:a two foot beard, -H:90:60:61:53:a three foot beard, -H:100:60:61:55:a four foot beard, - -H:100:61:0:50:and a dark complexion. - -H:60:62:63:50:You have slime green eyes, -H:85:62:63:50:You have puke yellow eyes, -H:99:62:63:50:You have blue-bloodshot eyes, -H:100:62:63:55:You have glowing red eyes, - -H:33:63:64:50:dirty -H:66:63:64:50:mangy -H:100:63:64:50:oily - -H:33:64:65:50:sea-weed green hair, -H:66:64:65:50:bright red hair, -H:100:64:65:50:dark purple hair, - -H:25:65:66:50:and green -H:50:65:66:50:and blue -H:75:65:66:50:and white -H:100:65:66:50:and black - -H:33:66:0:50:ulcerous skin. -H:66:66:0:50:scabby skin. -H:100:66:0:50:leprous skin. - -H:85:69:70:45:You are one of several children of a Dark Elven -H:100:69:70:55:You are the only child of a Dark Elven - -H:50:70:71:60:Warrior. -H:80:70:71:75:Warlock. -H:100:70:71:95:Noble. - -H:100:71:72:50:You have black eyes, - -H:70:72:73:50:straight -H:90:72:73:50:wavy -H:100:72:73:50:curly - -H:100:73:0:50:black hair and a very dark complexion. - -H:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. -H:100:74:20:25:Your father was an Ogre, but it is unacknowledged. - -H:90:75:76:50:You are a descendant of Beorn to the -H:100:75:20:100:Your father was Beorn. - -H:13:76:20:55:9th degree. -H:25:76:20:60:8th degree. -H:38:76:20:65:7th degree. -H:50:76:20:70:6th degree. -H:63:76:20:75:5th degree. -H:75:76:20:80:4th degree. -H:88:76:20:85:3rd degree. -H:100:76:20:90:2nd degree. - -H:100:78:79:50:You are one of several children of - -H:50:79:80:50:a Brown Yeek. -H:75:79:80:50:a Blue Yeek. -H:95:79:80:85:a Master Yeek. -H:100:79:80:120:Boldor, the King of the Yeeks. - -H:25:80:81:50:You have pale eyes, -H:50:80:81:50:You have glowing eyes, -H:75:80:81:50:You have tiny black eyes, -H:100:80:81:50:You have shining black eyes, - -H:20:81:65:50:no hair at all, -H:40:81:65:50:short black hair, -H:60:81:65:50:long black hair, -H:80:81:65:50:bright red hair, -H:100:81:65:50:colourless albino hair, - -H:100:82:83:50:You are one of several children of - -H:40:83:80:50:a Small Kobold. -H:75:83:80:55:a Kobold. -H:95:83:80:65:a Large Kobold. -H:100:83:80:100:Mughash, the Kobold Lord. - -H:85:84:85:45:You are one of several children -H:100:84:85:50:You are the first child - -H:60:85:50:40:of a Serf. -H:85:85:50:55:of a Devoted Mercenary. -H:96:85:50:60:of a Landed Knight. -H:99:85:50:100:of a Marshal of the Riddermark. -H:100:85:50:120:of a King of the Rohirrim. - -H:100:87:88:89:You are one of several children of - -H:30:88:18:20:a Petty-Dwarf Slave. -H:50:88:18:40:a Petty-Dwarf Thief. -H:70:88:18:60:a Petty-Dwarf Smith. -H:90:88:18:75:a Petty-Dwarf Miner. -H:95:88:18:100:a Petty-Dwarf Shaman. -H:100:88:18:100:Mim, Betrayer of Turin. - -H:85:89:90:50:You are one of many Manwe Maia. -H:100:89:90:60:You are the one of the most famous Manwe Maia. - -H:90:90:93:100:Your eagle looks very good. -H:100:90:93:120:Your eagle is splendid. - -H:10:91:92:20:You are a unnoticed minion of -H:25:91:92:30:You are a minor servant of -H:45:91:92:40:You are a subject of -H:65:91:92:50:You have attached yourself to -H:85:91:92:65:You are associated with -H:95:91:92:80:You are a notable follower of -H:100:91:92:100:You are a celebrated assistant to - -H:20:92:93:55:Nessa. -H:40:92:93:60:Vana. -H:50:92:93:65:Tulkas. -H:80:92:93:75:Mandos. -H:90:92:93:80:Nienna. -H:95:92:93:90:Varda. -H:100:92:93:95:Manwe. - -H:100:93:94:50:In the past you dwelt on earth in the form of - -H:25:94:0:50:various animals. -H:55:94:0:55:a spirit of forest and river. -H:70:94:0:60:a beneficent but unseen force. -H:96:94:0:70:a wise and ancient counsellor. -H:100:94:0:80:a Wizard of legend. - -H:30:95:96:30:You are of an unknown generation of the Ents. -H:40:95:96:50:You are of the third generation of the Ents. -H:60:95:96:60:You are of the second generation of the Ents. -H:100:95:96:80:You are one of the first beings who awoke on Arda. - -H:50:96:0:50:You have green skin and inflexible members. -H:100:96:0:50:You have brown skin and inflexible members. - -H:10:100:101:30:You were born in dirty bilge-water, -H:20:100:101:35:You were born in dirty straw, -H:30:100:101:40:You were born in wet mud, -H:40:100:101:45:You were born in a pile of dust, -H:50:100:101:50:You were born in sand, -H:60:100:101:50:You were born in pebbles, -H:70:100:101:55:You were born in a kobold corpse, -H:80:100:101:60:You were born in dragon droppings, -H:90:100:101:65:You were born in a pile of bones, -H:100:100:101:70:You were born in a corpse of a mighty hero, - -H:10:101:102:30:created by rotting flesh. -H:20:101:102:35:created by a kobold magician. -H:30:101:102:40:created by a corrupted apprentice. -H:40:101:102:45:created by a curious mage apprentice. -H:50:101:102:50:created by an evil Symbiant. -H:60:101:102:50:created by a practicing Necromancer. -H:70:101:102:55:created by the Mutant Breeders. -H:80:101:102:60:created by a curious adventurer. -H:90:101:102:65:called to life by the Witch-King of Angmar. -H:100:101:102:70:called to life by Sauron himself. - -H:100:102:103:50:Since then you have given life to - -H:10:103:104:30:no -H:20:103:104:35:one weak-willed -H:30:103:104:40:two -H:40:103:104:45:three -H:50:103:104:50:four -H:60:103:104:50:five -H:70:103:104:55:about twenty -H:80:103:104:60:dozens of -H:90:103:104:65:hundreds of -H:100:103:104:70:uncounted multitudes of - -H:100:104:0:50:foul offspring. diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt index 18e638d3..f8a3e25e 100644 --- a/lib/mods/theme/edit/p_info.txt +++ b/lib/mods/theme/edit/p_info.txt @@ -945,7 +945,7 @@ C:a:k:+0:+100:Spell-power # R:D:race desc # R:S:str:int:wis:dex:con:chr:luck # R:K:dis:dev:sav:stl:srh:fos:thn:thb -# R:P:hitdie:xp%:infra:history chart +# R:P:hitdie:xp%:infra # R:E:weapons:torso:arms:finger:head:legs # R:C:allowed classes # R:G:race flags @@ -961,7 +961,7 @@ R:D:Humans are the second born, the Edain. R:D:They are the basic race to which all others are compared. R:D:Average in ability, they can be any class. R:S:0:0:0:0:0:0:0 -R:P:10:100:0:1 +R:P:10:100:0 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -974,7 +974,7 @@ R:C:Warrior R:N:1:Half-Elf R:D:A crossbreed of elf and human, they get the best of the two races. R:S:0:1:1:1:-1:1:0 -R:P:9:110:2:4 +R:P:9:110:2 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -995,7 +995,7 @@ R:D:Elves are the first born, the Eldar. R:D:More spiritual than physical beings, they are weaker than humans R:D:but are more intelligent. R:S:-1:2:2:1:-2:2:0 -R:P:8:120:3:5 +R:P:8:120:3 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE @@ -1016,7 +1016,7 @@ R:N:3:Hobbit R:D:An old but quiet race related to humans. R:D:They are small and quite weak but good at many things. R:S:-2:2:1:3:2:1:5 -R:P:7:110:4:10 +R:P:7:110:4 R:E:1:1:1:2:1:0 R:Z:create food R:G:RESIST_BLACK_BREATH @@ -1040,7 +1040,7 @@ R:N:4:Gnome R:D:Related to dwarves, Gnomes are between Dwarves and Hobbits in size. R:D:Very good at magic use, they are poor as fighters. R:S:-1:2:0:2:1:-2:2 -R:P:8:135:4:13 +R:P:8:135:4 R:E:1:1:1:2:1:1 R:Z:blink R:R:1:0 @@ -1059,7 +1059,7 @@ R:N:5:Dwarf R:D:The children of Aule, a strong but small race. R:D:Miners and fighters of legend. R:S:2:-2:2:-2:2:-3:0 -R:P:11:125:5:16 +R:P:11:125:5 R:E:1:1:1:2:1:1 R:Z:find secret passages R:R:1:0 @@ -1078,7 +1078,7 @@ R:k:+500:+000:Archery R:N:6:Orc R:D:Quite strong but not very smart. R:S:2:-1:0:1:1:-4:-3 -R:P:10:110:3:25 +R:P:10:110:3 R:E:1:1:1:2:1:1 R:Z:remove fear R:R:1:0 @@ -1097,7 +1097,7 @@ R:N:7:Troll R:D:They can bear the light of the sun. R:D:They are extremely strong and dumb. R:S:4:-4:-2:-4:3:-6:-4 -R:P:12:137:3:22 +R:P:12:137:3 R:E:1:1:1:2:1:1 R:Z:berserk R:R:1:0 @@ -1116,7 +1116,7 @@ R:N:8:Dunadan R:D:The greatest of the Edain, humans in all respects but R:D:stronger, smarter and wiser. R:S:1:2:2:2:3:2:2 -R:P:10:180:0:1 +R:P:10:180:0 R:E:1:1:1:2:1:1 R:R:1:0 R:F:REGEN @@ -1139,7 +1139,7 @@ R:D:Elves are the first born, the Eldar. R:D:High elves are the best of the Eldar, strong, fast, intellectual, though R:D:they sometimes lack wisdom. R:S:1:3:2:3:1:5:0 -R:P:10:200:4:7 +R:P:10:200:4 R:E:1:1:1:2:1:1 R:R:1:0 R:F:RES_LITE @@ -1161,7 +1161,7 @@ R:N:10:Half-Ogre R:D:A crossbreed between a human and an ogre. R:D:They are similar to half-trolls, strong and dumb. R:S:3:-1:-1:-1:3:-3:-2 -R:P:12:130:3:74 +R:P:12:130:3 R:E:1:1:1:2:1:1 R:Z:set explosive rune R:R:1:0 @@ -1180,7 +1180,7 @@ R:N:11:Beorning R:D:A race of men shapeshifters. R:D:They have the unique power of being able to polymorph to bear forms. R:S:4:-2:-2:-1:3:-5:1 -R:P:12:150:3:75 +R:P:12:150:3 R:E:1:1:1:2:1:1 R:Z:turn into a bear R:R:1:0 @@ -1204,7 +1204,7 @@ R:D:Druedain are an ancient branch of the race of Men. R:D:Wiser and quicker than the Edain, but weaker and less intelligent. R:D:Not as pretty as their common human cousins, but sturdier. R:S:-2:-3:2:3:2:-2:1 -R:P:9:115:0:82 +R:P:9:115:0 R:E:1:1:1:2:1:1 R:Z:poison dart R:R:1:0 @@ -1225,7 +1225,7 @@ R:N:13:Petty-Dwarf R:D:A nearly extinct subrace of dwarves. R:D:They prefer to live in the darkness. R:S:1:-1:2:0:2:-4:-5 -R:P:11:135:5:87 +R:P:11:135:5 R:E:1:1:1:2:1:1 R:Z:detect doors and traps R:R:1:0 @@ -1245,7 +1245,7 @@ R:D:Elves are the first born, the Eldar. R:D:Dark elves are rare on Middle-earth and even though not evil R:D:they are not good. R:S:-1:3:2:2:-2:1:-2 -R:P:9:150:5:69 +R:P:9:150:5 R:E:1:1:1:2:1:1 R:Z:magic missile R:R:1:0 @@ -1269,7 +1269,7 @@ R:N:15:Ent R:D:Guardian of the forests of Middle-earth, summoned by Yavanna before R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'. R:S:10:-3:2:-5:11:-3:-2 -R:P:14:210:5:95 +R:P:14:210:5 R:E:1:1:1:2:1:1 R:Z:grow trees R:G:AC_LEVEL @@ -1304,7 +1304,7 @@ R:N:16:RohanKnight R:D:Humans from the land of Rohan, riding the great Mearas. R:D:Fast and powerful in battle. R:S:4:-2:3:1:4:2:0 -R:P:10:220:0:84 +R:P:10:220:0 R:E:1:1:1:2:1:1 R:Z:Rohan Knight's Powers R:R:1:3 @@ -1342,7 +1342,7 @@ R:N:17:Eagle R:D:A Great Eagle of Manwe, his most faithful servant. R:D:They have been given many gifts from their master. R:S:6:2:1:-2:3:6:4 -R:P:12:300:5:89 +R:P:12:300:5 R:E:0:1:0:4:1:1 R:R:1:0 R:F:FEATHER @@ -1380,7 +1380,7 @@ R:D:Very strong and smart, but unstealthy. R:D:They cannot play instruments or wield weapons. # R:S:str:int:wis:dex:con:chr:luck R:S:3:2:2:-2:2:-5:-2 -R:P:9:250:5:100 +R:P:9:250:5 R:E:0:1:0:6:1:1 R:R:1:0 R:k:=0:=0:Weaponmastery @@ -1399,7 +1399,7 @@ R:k:-10000:+000:Stealth R:N:19:Yeek R:D:The weakest of all the races, bad at everything except gaining levels quickly. R:S:-5:-5:-5:-5:-5:-5:-5 -R:P:6:25:2:29 +R:P:6:25:2 R:E:1:1:1:2:1:1 R:C:Archer R:C:Loremaster @@ -1421,7 +1421,7 @@ R:D:Elves are the first born, the Eldar. R:D:Wood Elves live in the great forests of Middle-earth. R:D:They are more dangerous but less wise than High Elves. R:S:2:2:-3:5:0:1:0 -R:P:7:130:4:5 +R:P:7:130:4 R:E:1:1:1:2:1:1 R:G:XTRA_MIGHT_BOW R:R:1:1 @@ -1448,7 +1448,7 @@ R:N:21:Maia R:D:An old race, dating from before the creation of Arda, the Maiar were R:D:created by Eru to help the Valar in their task. R:S:0:0:0:0:0:0:4 -R:P:10:100:0:91 +R:P:10:100:0 R:E:1:1:1:2:1:1 R:G:NO_GOD R:R:20:0 @@ -1527,7 +1527,7 @@ R:D:The humans of the Southeast, servants of the Dark. R:D:They are traditional masters of many combat skills. R:D:Fanatical warriors, they do not trust magic. R:S:2:-2:-2:-2:2:-1:-1 -R:P:10:140:0:105 +R:P:10:140:0 R:E:1:1:1:2:1:1 R:C:Archer R:C:Warrior @@ -1559,7 +1559,7 @@ R:D:corrupted by Melkor to serve his ends. # They all get an inherent CHR penalty, other stats depend on subrace. R:S:0:0:0:0:0:-1:0 # Again, here everything depends on subrace -R:P:10:170:3:109 +R:P:10:170:3 # Everything at zero here, depends on type of demon. R:E:0:0:0:0:0:0 R:C:Archer @@ -2482,409 +2482,3 @@ R:k:+1000:+300:Weaponmastery R:k:+1000:+300:Archery R:k:+1000:+200:Stealth R:k:+500:+200:Magic - -############################################################################## -############################################################################## -############################################################################## -############################################################################## -# H: Race history -# H:chance:chart:next chart:social class bonus:desc - -# Dunadan, Human: 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# RohanKnight: 84 -> 85 -> 50 -> 51 -> 52 -> 53. -# Half-Ogre: 74 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Beorning: 75 -> 76 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Half-elf: 4 -> 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53. -# Elf, Wood-elf: 5 -> 6 -> 9 -> 54 -> 55 -> 56. -# High-elf: 7 -> 8 -> 9 -> 54 -> 55 -> 56. -# Dark-elf: 69 -> 70 -> 71 -> 72 -> 73. -# Hobbit: 10 -> 11 -> 3 -> 50 -> 51 -> 52 -> 53. -# Gnome: 13 -> 14 -> 3 -> 50 -> 51 -> 52 -> 53. -# Dwarf: 16 -> 17 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61. -# Petty-Dwarf: 87 -> 88 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61. -# Eagle: 89 -> 90. -# Maia: 91 -> 92 -> 93 -> 94. -# Ent: 95 -> 96. -# Troll: 22 -> 23 -> 24 -> 62 -> 63 -> 64 -> 65 -> 66. -# Orc 25 -> 26 -> 27 -> 28 -> 80 -> 81 -> 65 -> 66. -# Yeek: 29 -> 3 -> 50 -> 51 -> 52 -> 53. -# (not used: 78 -> 79 -> 80 -> 81 -> 65 -> 66.) -# Druadan: 82 -> 83 -> 71 -> 72 -> 73. -# Dragon: 100 -> 101 -> 102 -> 103 -> 104. -# Easterling: 105 -> 106 -> 107 -> 108. -# Demon: 109 -> 110 -> 111 -> 112. - -H:10:1:2:25:You are the illegitimate and unacknowledged child -H:20:1:2:35:You are the illegitimate but acknowledged child -H:95:1:2:45:You are one of several children -H:100:1:2:50:You are the first child - -H:40:2:3:65:of a Serf. -H:65:2:3:80:of a Yeoman. -H:80:2:3:90:of a Townsman. -H:90:2:3:105:of a Guildsman. -H:96:2:3:120:of a Landed Knight. -H:99:2:3:130:of a Noble Lord. -H:100:2:3:140:of the Royal Blood Line. - -H:20:3:50:20:You are the black sheep of the family. -H:80:3:50:55:You are a credit to the family. -H:100:3:50:60:You are a well-liked child. - -H:25:4:1:40:Your mother was of the Avari. -H:40:4:1:50:Your father was of the Avari. -H:65:4:1:60:Your mother was of the Nandor. -H:80:4:1:60:Your father was of the Nandor. -H:96:4:1:70:Your mother was of the Sindar. -H:99:4:1:70:Your father was of the Sindar. -H:100:4:1:100:Your ancestry traces to Elrond. - -H:60:5:6:50:You are one of several children -H:100:5:6:55:You are the only child - -H:40:6:9:40:of an Avarin -H:70:6:9:50:of a Nandorin -H:100:6:9:60:of a Sindarin - -H:60:7:8:50:You are one of several children -H:100:7:8:55:You are the only child - -H:75:8:9:50:of a Telerin -H:95:8:9:55:of a Noldorin -H:100:8:9:60:of a Vanyarin - -H:40:9:54:80:Ranger. -H:70:9:54:90:Archer. -H:87:9:54:110:Warrior. -H:95:9:54:125:Mage. -H:99:9:54:140:Prince. -H:100:9:54:145:King. - -H:85:10:11:45:You are one of several children of a Hobbit -H:100:10:11:55:You are the only child of a Hobbit - -H:20:11:3:55:Bum. -H:30:11:3:80:Tavern Owner. -H:40:11:3:90:Miller. -H:50:11:3:100:Home Owner. -H:80:11:3:110:Burglar. -H:95:11:3:115:Warrior. -H:99:11:3:125:Mage. -H:100:11:3:140:Clan Elder. - -H:85:13:14:45:You are one of several children of a Gnome -H:100:13:14:55:You are the only child of a Gnome - -H:20:14:3:55:Beggar. -H:50:14:3:70:Braggart. -H:75:14:3:85:Prankster. -H:95:14:3:100:Warrior. -H:100:14:3:125:Mage. - -H:25:16:17:40:You are one of two children of a Dwarven -H:100:16:17:50:You are the only child of a Dwarven - -H:10:17:18:60:Thief. -H:35:17:18:80:Smith. -H:75:17:18:90:Miner. -H:90:17:18:110:Warrior. -H:99:17:18:130:Priest. -H:100:17:18:150:King. - -H:15:18:57:10:You are the black sheep of the family. -H:85:18:57:50:You are a credit to the family. -H:100:18:57:55:You are a well liked child. - -H:100:20:2:50:You are the adopted child - -H:100:22:23:50:You are the offspring of a - -H:30:23:24:20:Forest-Troll -H:60:23:24:25:Cave-Troll -H:75:23:24:30:Hill-Troll -H:90:23:24:35:Stone-Troll -H:95:23:24:40:Snow-Troll -H:100:23:24:45:Water-Troll - -H:25:24:62:50:Worker. -H:95:24:62:55:Warrior. -H:99:24:62:65:Shaman. -H:100:24:62:80:Clan Chief. - -H:100:25:26:50:You are one of several children of - -H:40:26:27:40:a Snaga -H:80:26:27:50:an Orc -H:100:26:27:60:an Uruk - -H:30:27:28:20:Slave -H:60:27:28:50:Archer -H:90:27:28:60:Warrior -H:95:27:28:80:Shaman -H:100:27:28:100:Chieftain - -H:30:28:80:50:from the Misty Mountains. -H:60:28:80:50:from the Grey Mountains. -H:90:28:80:70:from the orc-hold of Mount Gundabad. -H:100:28:80:80:from the Pits of Angband. - -H:25:29:3:50:You are one of five children of a blue Yeek. -H:75:29:3:75:You are one of five children of a brown Yeek. -H:100:29:3:100:You are one of five children of a master Yeek. - -H:20:50:51:50:You have dark brown eyes, -H:60:50:51:50:You have brown eyes, -H:70:50:51:50:You have hazel eyes, -H:80:50:51:50:You have green eyes, -H:90:50:51:50:You have blue eyes, -H:100:50:51:50:You have blue-gray eyes, - -H:70:51:52:50:straight -H:90:51:52:50:wavy -H:100:51:52:50:curly - -H:30:52:53:50:black hair, -H:70:52:53:50:brown hair, -H:80:52:53:50:auburn hair, -H:90:52:53:50:red hair, -H:100:52:53:50:blond hair, - -H:10:53:0:50:and a very dark complexion. -H:30:53:0:50:and a dark complexion. -H:80:53:0:50:and an average complexion. -H:90:53:0:50:and a fair complexion. -H:100:53:0:50:and a very fair complexion. - -H:85:54:55:50:You have light grey eyes, -H:95:54:55:50:You have light blue eyes, -H:100:54:55:50:You have light green eyes, - -H:75:55:56:50:straight -H:100:55:56:50:wavy - -H:75:56:0:50:black hair, and a fair complexion. -H:85:56:0:50:brown hair, and a fair complexion. -H:95:56:0:50:blond hair, and a fair complexion. -H:100:56:0:50:silver hair, and a fair complexion. - -H:99:57:58:50:You have dark brown eyes, -H:100:57:58:60:You have glowing red eyes, - -H:90:58:59:50:straight -H:100:58:59:50:wavy - -H:75:59:60:50:black hair, -H:100:59:60:50:brown hair, - -H:25:60:61:50:a one foot beard, -H:60:60:61:51:a two foot beard, -H:90:60:61:53:a three foot beard, -H:100:60:61:55:a four foot beard, - -H:100:61:0:50:and a dark complexion. - -H:60:62:63:50:You have slime green eyes, -H:85:62:63:50:You have puke yellow eyes, -H:99:62:63:50:You have blue-bloodshot eyes, -H:100:62:63:55:You have glowing red eyes, - -H:33:63:64:50:dirty -H:66:63:64:50:mangy -H:100:63:64:50:oily - -H:33:64:65:50:sea-weed green hair, -H:66:64:65:50:bright red hair, -H:100:64:65:50:dark purple hair, - -H:25:65:66:50:and green -H:50:65:66:50:and blue -H:75:65:66:50:and white -H:100:65:66:50:and black - -H:33:66:0:50:ulcerous skin. -H:66:66:0:50:scabby skin. -H:100:66:0:50:leprous skin. - -H:85:69:70:45:You are one of several children of a Dark Elven -H:100:69:70:55:You are the only child of a Dark Elven - -H:50:70:71:60:Warrior. -H:80:70:71:75:Warlock. -H:100:70:71:95:Noble. - -H:100:71:72:50:You have black eyes, - -H:70:72:73:50:straight -H:90:72:73:50:wavy -H:100:72:73:50:curly - -H:100:73:0:50:black hair and a very dark complexion. - -H:25:74:20:25:Your mother was an Ogre, but it is unacknowledged. -H:100:74:20:25:Your father was an Ogre, but it is unacknowledged. - -H:90:75:76:50:You are a descendant of Beorn to the -H:100:75:20:100:Your father was Beorn. - -H:13:76:20:55:9th degree. -H:25:76:20:60:8th degree. -H:38:76:20:65:7th degree. -H:50:76:20:70:6th degree. -H:63:76:20:75:5th degree. -H:75:76:20:80:4th degree. -H:88:76:20:85:3rd degree. -H:100:76:20:90:2nd degree. - -H:100:78:79:50:You are one of several children of - -H:50:79:80:50:a Brown Yeek. -H:75:79:80:50:a Blue Yeek. -H:95:79:80:85:a Master Yeek. -H:100:79:80:120:Boldor, the King of the Yeeks. - -H:25:80:81:50:You have pale eyes, -H:50:80:81:50:You have glowing eyes, -H:75:80:81:50:You have tiny black eyes, -H:100:80:81:50:You have shining black eyes, - -H:20:81:65:50:no hair at all, -H:40:81:65:50:short black hair, -H:60:81:65:50:long black hair, -H:80:81:65:50:bright red hair, -H:100:81:65:50:colourless albino hair, - -H:100:82:83:50:You are one of several children of - -H:40:83:71:50:a Druadan Gatherer. -H:75:83:71:55:a Druadan Hunter. -H:95:83:71:65:a Druadan Shaman. -H:100:83:71:100:Ghan-buri-Ghan. - -H:85:84:85:45:You are one of several children -H:100:84:85:50:You are the first child - -H:60:85:50:40:of a Serf. -H:85:85:50:55:of a Devoted Mercenary. -H:96:85:50:60:of a Landed Knight. -H:99:85:50:100:of a Marshal of the Riddermark. -H:100:85:50:120:of a King of the Mark. - -H:100:87:88:89:You are one of several children of - -H:30:88:18:20:a Petty-Dwarf Slave. -H:50:88:18:40:a Petty-Dwarf Thief. -H:70:88:18:60:a Petty-Dwarf Smith. -H:90:88:18:75:a Petty-Dwarf Miner. -H:95:88:18:100:a Petty-Dwarf Shaman. -H:100:88:18:100:Mim, Betrayer of Turin. - -H:85:89:90:50:You are one of many Eagles of Manwe. -H:100:89:90:60:You are the one of the most known Eagles of Manwe. - -H:90:90:0:100:Your back and breast are dark brown, and you have very large wings. -H:100:90:0:120:Your back and breast are dazzling white, your wings magnificent. - -H:10:91:92:20:You are a unnoticed minion of -H:25:91:92:30:You are a minor servant of -H:45:91:92:40:You are a subject of -H:65:91:92:50:You have attached yourself to -H:85:91:92:65:You are associated with -H:95:91:92:80:You are a notable follower of -H:100:91:92:100:You are a celebrated assistant to - -H:20:92:93:55:Nessa. -H:40:92:93:60:Vana. -H:50:92:93:65:Tulkas. -H:80:92:93:75:Mandos. -H:90:92:93:80:Nienna. -H:95:92:93:90:Varda. -H:100:92:93:95:Manwe. - -H:100:93:94:50:In the past you dwelt on earth in the form of - -H:25:94:0:50:various animals. -H:55:94:0:55:a spirit of forest and river. -H:70:94:0:60:a beneficent but unseen force. -H:96:94:0:70:a wise and ancient counsellor. -H:100:94:0:80:a Wizard of legend. - -H:30:95:96:30:You are of an unknown generation of the Ents. -H:40:95:96:50:You are of the third generation of the Ents. -H:60:95:96:60:You are of the second generation of the Ents. -H:100:95:96:80:You are one of the first beings who awoke on Arda. - -H:50:96:0:50:You have green skin and inflexible members. -H:100:96:0:50:You have brown skin and inflexible members. - -H:10:100:101:30:You were born in the land of Rhun, -H:20:100:101:35:You were born in the Misty Mountains, -H:30:100:101:40:You were born in the Blue Mountains, -H:40:100:101:45:You were born in Dol Guldur, -H:50:100:101:50:You were born in Angmar, -H:60:100:101:50:You were born in Barad-dur, -H:70:100:101:55:You were born at the foot of the Orodruin, -H:80:100:101:60:You were born in Angband, -H:90:100:101:65:You were born in Utumno, -H:100:100:101:70:You were born in the Void, - -H:10:101:102:30:awakened by accident. -H:20:101:102:35:awakened by hunger. -H:30:101:102:40:awakened by the glint of jewels. -H:40:101:102:45:awakened by an unsuspecting traveler. -H:50:101:102:50:awakened by a corrupt Mage. -H:60:101:102:50:awakened by an evil Sorcerer. -H:70:101:102:55:awakened by a powerful evil Wizard. -H:80:101:102:60:awakened by the Witch-King of Angmar. -H:90:101:102:65:awakened by Gorthaur. -H:100:101:102:70:awakened by Melkor Bauglir. - -H:100:102:103:50:Since then you have destroyed - -H:10:103:104:30:no -H:20:103:104:35:one weak-willed -H:30:103:104:40:two -H:40:103:104:45:three -H:50:103:104:50:four -H:60:103:104:50:five -H:70:103:104:55:about twenty -H:80:103:104:60:dozens of -H:90:103:104:65:hundreds of -H:100:103:104:70:uncounted multitudes of - -H:100:104:0:50:enemies of the Dark. - -H:50:105:106:50:You are one of many children of -H:100:105:106:50:You are the only child of - -H:20:106:107:35:an Easterling slave. -H:30:106:107:40:an Easterling landlord. -H:40:106:107:45:an Easterling squire. -H:50:106:107:50:an Easterling warrior. -H:60:106:107:55:a Wainrider from Near Harad. -H:70:106:107:60:a warlord from Far Harad. -H:80:106:107:65:a Corsair of Umbar. -H:90:106:107:70:Ulfast, son of Ulfang. -H:100:106:107:75:Ulwarth, son of Ulfang. - -H:25:107:108:10:You have brown eyes, -H:50:107:108:30:You have piercing black eyes, -H:100:107:108:60:You have alert yellow eyes, - -H:50:108:0:25:chestnut brown hair, and a dark complexion. -H:100:108:0:50:jet-black hair, and a dark complexion. - -H:40:109:110:60:You have only recently been corrupted, -H:60:109:110:70:You've been corrupted for quite a while, -H:100:109:110:80:You were one of the first beings to be corrupted, - -H:40:110:111:60:and your entire being detests this fact. -H:60:110:111:70:but you don't mind it so much anymore. -H:100:110:111:80:and you consider that to have been your true birth. - -H:40:111:112:60:Your watery green eyes -H:60:111:112:70:Your piercing black eyes -H:100:111:112:80:Your glowing red eyes - -H:40:112:0:60:radiate miserable servility. -H:60:112:0:70:radiate contempt. -H:100:112:0:80:radiate pure evil. diff --git a/src/birth.cc b/src/birth.cc index f18c87fa..c94fbf4d 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -19,7 +19,6 @@ #include "game.hpp" #include "gods.hpp" #include "help.hpp" -#include "hist_type.hpp" #include "hooks.hpp" #include "init2.hpp" #include "mimic.hpp" @@ -200,12 +199,6 @@ static void save_prev_data(void) previous_char.stat[i] = p_ptr->stat_max[i]; } previous_char.luck = p_ptr->luck_base; - - /* Save the history */ - for (int i = 0; i < 4; i++) - { - strcpy(previous_char.history[i], history[i]); - } } @@ -230,13 +223,6 @@ static void load_prev_data(bool_ save) } temp.luck = p_ptr->luck_base; - /* Save the history */ - for (int i = 0; i < 4; i++) - { - strcpy(temp.history[i], history[i]); - } - - /*** Load the previous data ***/ /* Load the data */ @@ -251,12 +237,6 @@ static void load_prev_data(bool_ save) p_ptr->luck_base = previous_char.luck; p_ptr->luck_max = previous_char.luck; - /* Load the history */ - for (int i = 0; i < 4; i++) - { - strcpy(history[i], previous_char.history[i]); - } - /*** Save the current data ***/ if (!save) return; @@ -270,12 +250,6 @@ static void load_prev_data(bool_ save) previous_char.stat[i] = temp.stat[i]; } previous_char.luck = temp.luck; - - /* Save the history */ - for (int i = 0; i < 4; i++) - { - strcpy(previous_char.history[i], temp.history[i]); - } } @@ -486,102 +460,6 @@ static void get_extra(void) } -/* - * Get the racial history, and social class, using the "history charts". - */ -static void get_history(void) -{ - auto const &bg = game->edit_data.bg; - - int i, n, chart, roll; - - char *s, *t; - - char buf[240]; - - - /* Clear the previous history strings */ - for (i = 0; i < 4; i++) - { - history[i][0] = '\0'; - } - - /* Clear the history text */ - buf[0] = '\0'; - - /* Starting place */ - chart = rp_ptr->chart; - - /* Process the history */ - while (chart) - { - /* Start over */ - i = 0; - - /* Roll for nobility */ - roll = randint(100); - - /* Access the proper entry in the table */ - while ((chart != bg[i].chart) || (roll > bg[i].roll)) - { - i++; - } - - /* Acquire the textual history */ - strcat(buf, bg[i].info.c_str()); - strcat(buf, " "); - - /* Enter the next chart */ - chart = bg[i].next; - } - - /* Skip leading spaces */ - for (s = buf; *s == ' '; s++) /* loop */; - - /* Get apparent length */ - n = strlen(s); - - /* Kill trailing spaces */ - while ((n > 0) && (s[n - 1] == ' ')) s[--n] = '\0'; - - - /* Start at first line */ - i = 0; - - /* Collect the history */ - while (TRUE) - { - /* Extract remaining length */ - n = strlen(s); - - /* All done */ - if (n < 60) - { - /* Save one line of history */ - strcpy(history[i++], s); - - /* All done */ - break; - } - - /* Find a reasonable break-point */ - for (n = 60; ((n > 0) && (s[n - 1] != ' ')); n--) /* loop */; - - /* Save next location */ - t = s + n; - - /* Wipe trailing spaces */ - while ((n > 0) && (s[n - 1] == ' ')) s[--n] = '\0'; - - /* Save one line of history */ - strcpy(history[i++], s); - - /* Start next line */ - for (s = t; *s == ' '; s++) /* loop */; - } -} - - /* * Fill the random_artifacts array with relevant info. */ @@ -709,16 +587,6 @@ static void player_wipe(void) /* Not dead yet */ p_ptr->lives = 0; - /* Wipe the history */ - for (std::size_t i = 0; i < 4; i++) - { - for (std::size_t j = 0; j < 60; j++) - { - if (j < 59) history[i][j] = ' '; - else history[i][j] = '\0'; - } - } - /* Wipe the towns */ for (std::size_t i = 0; i < d_info.size(); i++) { @@ -2249,8 +2117,6 @@ static bool_ player_birth_aux_point(void) char buf[80]; - int mode = 0; - /* Initialize stats */ for (i = 0; i < 6; i++) @@ -2263,9 +2129,6 @@ static bool_ player_birth_aux_point(void) /* Roll for base hitpoints */ get_extra(); - /* Roll for social class */ - get_history(); - /* Get luck */ p_ptr->luck_base = rp_ptr->luck + rmp_ptr->luck + rand_range( -5, 5); p_ptr->luck_max = p_ptr->luck_base; @@ -2318,7 +2181,7 @@ static bool_ player_birth_aux_point(void) p_ptr->csp = p_ptr->msp; /* Display the player */ - display_player(mode); + display_player(0); /* Display the costs header */ put_str("Cost", row - 2, col + 32); @@ -2388,8 +2251,6 @@ static bool_ player_birth_aux_auto() { int i, j, m, v; - int mode = 0; - bool_ flag = FALSE; bool_ prev = FALSE; @@ -2607,15 +2468,9 @@ static bool_ player_birth_aux_auto() /*** Display ***/ - /* Mode */ - mode = 0; - /* Roll for base hitpoints */ get_extra(); - /* Roll for social class */ - get_history(); - /* Roll for gold */ get_money(); @@ -2635,15 +2490,13 @@ static bool_ player_birth_aux_auto() p_ptr->csp = p_ptr->msp; /* Display the player */ - display_player(mode); + display_player(0); /* Prepare a prompt (must squeeze everything in) */ Term_gotoxy(2, 23); Term_addch(TERM_WHITE, b1); Term_addstr( -1, TERM_WHITE, "'r' to reroll"); if (prev) Term_addstr( -1, TERM_WHITE, ", 'p' for prev"); - if (mode) Term_addstr( -1, TERM_WHITE, ", 'h' for Misc."); - else Term_addstr( -1, TERM_WHITE, ", 'h' for History"); Term_addstr( -1, TERM_WHITE, ", or ESC to accept"); Term_addch(TERM_WHITE, b2); @@ -2669,13 +2522,6 @@ static bool_ player_birth_aux_auto() continue; } - /* Toggle the display */ - if ((c == 'H') || (c == 'h')) - { - mode = ((mode != 0) ? 0 : 1); - continue; - } - /* Help */ if (c == '?') { @@ -2718,10 +2564,6 @@ static bool_ player_birth_aux() char c; - int y = 0, x = 0; - - char old_history[4][60]; - /* Ask */ if (!player_birth_aux_ask()) return (FALSE); @@ -2789,92 +2631,9 @@ static bool_ player_birth_aux() if (!player_birth_aux_auto()) return FALSE; } - /* Edit character background */ - for (std::size_t i = 0; i < 4; i++) - { - strnfmt(old_history[i], 60, "%s", history[i]); - } - - /* Turn NUL to space */ - for (std::size_t i = 0; i < 4; i++) - { - std::size_t j = 0; - - // Search for the NUL - while (history[i][j++]) - ;; - - // Turn into spaces - for (; j < 59; j++) - { - history[i][j] = ' '; - } - } - display_player(1); - c_put_str(TERM_L_GREEN, "(Character Background - Edit Mode)", 15, 20); - while (TRUE) - { - for (std::size_t i = 0; i < 4; i++) - { - put_str(history[i], i + 16, 10); - } - c_put_str(TERM_L_BLUE, format("%c", history[y][x]), y + 16, x + 10); - - /* Place cursor just after cost of current stat */ - Term_gotoxy(x + 10, y + 16); - - c = inkey(); - - if (c == '8') - { - y--; - if (y < 0) y = 3; - } - else if (c == '2') - { - y++; - if (y > 3) y = 0; - } - else if (c == '6') - { - x++; - if (x > 59) x = 0; - } - else if (c == '4') - { - x--; - if (x < 0) x = 59; - } - else if (c == '\r') - { - break; - } - else if (c == ESCAPE) - { - for (std::size_t i = 0; i < 4; i++) - { - strnfmt(history[i], 60, "%s", old_history[i]); - put_str(history[i], i + 16, 10); - } - break; - } - else - { - history[y][x++] = c; - if (x > 58) - { - x = 0; - y++; - if (y > 3) y = 0; - } - } - } - - /*** Finish up ***/ /* Get a name, recolor it, prepare savefile */ - get_name(); @@ -2900,90 +2659,6 @@ static bool_ player_birth_aux() } -/* - * Helper function for validate_bg(). - */ -static void validate_bg_aux(int chart, bool_ chart_checked[], std::string &buf) -{ - auto const &bg = game->edit_data.bg; - - /* Assume the chart does not exist */ - bool_ chart_exists = FALSE; - - /* Assume the chart is not complete */ - bool_ chart_complete = FALSE; - - /* No chart */ - if (!chart) return; - - /* Already saw this chart */ - if (chart_checked[chart]) return; - - /* XXX XXX XXX */ - buf += fmt::format("{:d} --> ", chart); - - /* Check each chart */ - for (auto const &hist: bg) - { - /* Require same chart */ - if (hist.chart != chart) continue; - - /* The chart exists */ - chart_exists = TRUE; - - /* Validate the "next" chart recursively */ - validate_bg_aux(hist.next, chart_checked, buf); - - /* Require a terminator */ - if (hist.roll != 100) continue; - - /* The chart is complete */ - chart_complete = TRUE; - } - - /* Failed: The chart does not exist */ - if (!chart_exists) - { - quit_fmt("birth.c: bg[] chart %d does not exist\n%s", chart, buf.c_str()); - } - - /* Failed: The chart is not complete */ - if (!chart_complete) - { - quit_fmt("birth.c: bg[] chart %d is not complete", chart); - } - - /* Remember we saw this chart */ - chart_checked[chart] = TRUE; -} - - -/* - * Verify that the bg[] table is valid. - */ -static void validate_bg(void) -{ - auto const &race_info = game->edit_data.race_info; - - bool_ chart_checked[512]; - - for (std::size_t i = 0; i < 512; i++) - { - chart_checked[i] = FALSE; - } - - /* Check each race */ - for (auto const &race: race_info) - { - /* Get the first chart for this race */ - int chart = race.chart; - - /* Validate the chart recursively */ - std::string buf; - validate_bg_aux(chart, chart_checked, buf); - } -} - /* * Initialize a random town */ @@ -3015,9 +2690,6 @@ void player_birth(void) /* Starting index for generated towns */ std::size_t rtown = TOWN_RANDOM; - /* Validate the bg[] table */ - validate_bg(); - /* Create a new character */ while (1) { diff --git a/src/birther.hpp b/src/birther.hpp index 566bcb42..7b7baa89 100644 --- a/src/birther.hpp +++ b/src/birther.hpp @@ -2,6 +2,9 @@ #include "h-basic.h" +#include +#include + /** * Player information during the birth process. */ @@ -23,7 +26,5 @@ struct birther s16b stat[6]; s16b luck; - char history[4][60]; - bool_ quick_ok; }; diff --git a/src/cmd4.cc b/src/cmd4.cc index afb84def..59554dc4 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -149,8 +149,8 @@ void do_cmd_change_name(void) /* Forever */ while (1) { - /* keep mode below 7 */ - mode = (mode + 6) % 6; + /* keep mode below 5 */ + mode = (mode + 5) % 5; /* Display the player */ display_player(mode); diff --git a/src/files.cc b/src/files.cc index 49505292..e148a679 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2205,23 +2205,14 @@ static void display_player_ben_one(int page) } // namespace /* - * Display the character on the screen (various modes) - * - * The top two and bottom two lines are left blank. - * - * Mode 0 = standard display with skills - * Mode 1 = standard display with history - * Mode 2 = current flags (part 1) - * Mode 3 = current flags (part 2) - * Mode 4 = current flags (part 3) - * Mode 5 = current flags (part 4) - * Mode 6 = current flags (part 5 -- esp) + * Display the character on the screen */ void display_player(int mode) { auto const &r_info = game->edit_data.r_info; - int i; + assert(mode >= 0); + assert(mode < 5); char buf[80]; @@ -2230,7 +2221,7 @@ void display_player(int mode) clear_from(0); /* Standard */ - if ((mode == 0) || (mode == 1)) + if (mode == 0) { auto r_ptr = &r_info[p_ptr->body_monster]; @@ -2252,7 +2243,7 @@ void display_player(int mode) c_put_str(TERM_L_BLUE, deity_info[p_ptr->pgod].name, 6, 9); /* Display the stats */ - for (i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { char punctuation = p_ptr->stat_max[i] == 18 + 100 ? '!' : ':'; /* Special treatment of "injured" stats */ @@ -2305,30 +2296,15 @@ void display_player(int mode) /* Extra info */ display_player_middle(); - /* Display "history" info */ - if (mode == 1) - { - put_str("(Character Background)", 15, 25); - - for (i = 0; i < 4; i++) - { - put_str(history[i], i + 16, 10); - } - } - /* Display "various" info */ - else - { - put_str("(Miscellaneous Abilities)", 15, 25); - - display_player_various(); - } + put_str("(Miscellaneous Abilities)", 15, 25); + display_player_various(); } /* Special */ else { - display_player_ben_one(mode - 2); + display_player_ben_one(mode - 1); } } @@ -2795,19 +2771,19 @@ errr file_character(cptr name, bool_ full) fprintf (fff, "\n\n"); /* adds and slays */ - display_player (2); + display_player(1); file_character_print_grid(fff, FALSE, TRUE); /* sustains and resistances */ - display_player (3); + display_player(2); file_character_print_grid(fff, TRUE, FALSE); /* stuff */ - display_player (4); + display_player(3); file_character_print_grid(fff, FALSE, FALSE); /* a little bit of stuff */ - display_player (5); + display_player(4); file_character_print_grid(fff, FALSE, FALSE); /* Dump corruptions */ diff --git a/src/game_edit_data.hpp b/src/game_edit_data.hpp index cc3af2dc..a4727d90 100644 --- a/src/game_edit_data.hpp +++ b/src/game_edit_data.hpp @@ -5,7 +5,6 @@ #include "dungeon_info_type.hpp" #include "ego_item_type.hpp" #include "feature_type.hpp" -#include "hist_type.hpp" #include "monster_ego.hpp" #include "monster_race.hpp" #include "object_kind.hpp" @@ -101,11 +100,6 @@ struct GameEditData { */ std::vector race_mod_info; - /** - * Player race histories - */ - std::vector bg; - /** * Player skills */ diff --git a/src/hist_type.hpp b/src/hist_type.hpp deleted file mode 100644 index 07b5a632..00000000 --- a/src/hist_type.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "h-basic.h" - -#include - -/** - * Player background descriptor. - */ -struct hist_type -{ - std::string info; /* Textual History */ - - byte roll; /* Frequency of this entry */ - s16b chart; /* Chart index */ - s16b next; /* Next chart index */ - byte bonus; /* Social Class Bonus + 50 */ -}; diff --git a/src/init1.cc b/src/init1.cc index 96c1b067..056b5b51 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -13,7 +13,6 @@ #include "files.hpp" #include "game.hpp" #include "gods.hpp" -#include "hist_type.hpp" #include "init2.hpp" #include "monster2.hpp" #include "monster_ego.hpp" @@ -880,7 +879,6 @@ errr init_player_info_txt(FILE *fp) auto &class_info = game->edit_data.class_info; auto &race_info = game->edit_data.race_info; auto &race_mod_info = game->edit_data.race_mod_info; - auto &bg = game->edit_data.bg; auto &gen_skill = game->edit_data.gen_skill; int lev = 1; @@ -919,29 +917,6 @@ errr init_player_info_txt(FILE *fp) continue; } - /* Process 'H' for "History" */ - if (buf[0] == 'H') - { - char *zz[5]; - - /* Scan for the values */ - if (tokenize(buf + 2, 5, zz, ':', ':') != 5) return (1); - - /* Create new entry */ - hist_type hist; - hist.roll = atoi(zz[0]); - hist.chart = atoi(zz[1]); - hist.next = atoi(zz[2]); - hist.bonus = atoi(zz[3]); - hist.info = my_strdup(zz[4]); - - /* Append */ - bg.emplace_back(hist); - - /* Next... */ - continue; - } - /* Process 'G:k' for "General skills" */ if ((buf[0] == 'G') && (buf[2] == 'k')) { @@ -1107,16 +1082,15 @@ errr init_player_info_txt(FILE *fp) /* Process 'P' for "xtra" */ if ((buf[0] == 'R') && (buf[2] == 'P')) { - int s[4]; + int s[3]; /* Scan for the values */ - if (4 != sscanf(buf + 4, "%d:%d:%d:%d", - &s[0], &s[1], &s[2], &s[3])) return (1); + if (3 != sscanf(buf + 4, "%d:%d:%d", + &s[0], &s[1], &s[2])) return (1); rp_ptr->ps.mhp = s[0]; rp_ptr->ps.exp = s[1]; rp_ptr->infra = s[2]; - rp_ptr->chart = s[3]; /* Next... */ continue; diff --git a/src/loadsave.cc b/src/loadsave.cc index ad824536..196e8d81 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -403,11 +403,6 @@ static void do_quick_start(ls_flag_t flag, birther &previous_char) do_s16b(&previous_char.luck, flag); do_bool(&previous_char.quick_ok, flag); - - for (std::size_t i = 0; i < 4; i++) - { - do_string(previous_char.history[i], 60, flag); - } } static void do_skill_modifier(skill_modifier *s, ls_flag_t flag) @@ -524,11 +519,6 @@ static bool_ do_extra(ls_flag_t flag) do_std_string(game->died_from, flag); - for (std::size_t i = 0; i < 4; i++) - { - do_string(history[i], 60, flag); - } - /* Handle the special levels info */ { byte tmp8u = d_info.size(); diff --git a/src/player_race.hpp b/src/player_race.hpp index a2f4699c..e0b236db 100644 --- a/src/player_race.hpp +++ b/src/player_race.hpp @@ -34,8 +34,6 @@ struct player_race byte body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */ - s16b chart = 0; /* Chart history */ - player_race_flag_set flags; std::array lflags; diff --git a/src/variable.cc b/src/variable.cc index 8395a75e..3b81a51a 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -201,11 +201,6 @@ object_type *tracked_object; -/* - * Hack -- Textual "history" for the Player - */ -char history[4][60]; - /* * Buffer to hold the current savefile name */ diff --git a/src/variable.hpp b/src/variable.hpp index a4678bae..ebbca153 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -105,7 +105,6 @@ extern s16b health_who; extern s16b monster_race_idx; extern s16b monster_ego_idx; extern object_type *tracked_object; -extern char history[4][60]; extern s16b lite_n; extern s16b lite_y[LITE_MAX]; extern s16b lite_x[LITE_MAX]; -- cgit v1.2.3 From a40e1d524849e22edf2fb65b5c2fedbe47a59b81 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove redundant "extern" on function declarations --- src/birth.hpp | 12 ++-- src/bldg.hpp | 8 +-- src/cave.hpp | 102 +++++++++++++------------- src/cmd1.hpp | 38 +++++----- src/cmd2.hpp | 52 +++++++------- src/cmd3.hpp | 38 +++++----- src/cmd4.hpp | 48 ++++++------- src/cmd5.cc | 2 +- src/cmd5.hpp | 26 +++---- src/cmd6.hpp | 26 +++---- src/cmd7.cc | 2 +- src/cmd7.hpp | 40 +++++------ src/corrupt.hpp | 12 ++-- src/dungeon.h | 2 +- src/dungeon.hpp | 4 +- src/files.h | 4 +- src/files.hpp | 48 ++++++------- src/gen_evol.hpp | 4 +- src/gen_maze.hpp | 2 +- src/generate.hpp | 16 ++--- src/gods.hpp | 18 ++--- src/help.hpp | 14 ++-- src/hooks.hpp | 6 +- src/init1.hpp | 42 +++++------ src/init2.h | 4 +- src/init2.hpp | 6 +- src/joke.hpp | 2 +- src/levels.hpp | 18 ++--- src/loadsave.h | 5 +- src/loadsave.hpp | 6 +- src/lua_bind.hpp | 22 +++--- src/main-x11.c | 4 +- src/melee1.hpp | 6 +- src/melee2.hpp | 12 ++-- src/mimic.hpp | 16 ++--- src/modules.hpp | 16 ++--- src/monster1.hpp | 6 +- src/monster2.hpp | 76 ++++++++++---------- src/monster3.hpp | 30 ++++---- src/notes.hpp | 8 +-- src/object1.hpp | 72 +++++++++---------- src/object2.hpp | 114 ++++++++++++++--------------- src/powers.hpp | 2 +- src/q_bounty.hpp | 8 +-- src/q_fireprof.hpp | 6 +- src/q_thrain.hpp | 2 +- src/quest.hpp | 2 +- src/randart.hpp | 6 +- src/skills.hpp | 42 +++++------ src/spells1.hpp | 54 +++++++------- src/spells2.hpp | 208 ++++++++++++++++++++++++++--------------------------- src/squeltch.hpp | 12 ++-- src/store.hpp | 20 +++--- src/tables.cc | 2 +- src/tables.hpp | 2 +- src/util.cc | 2 +- src/util.h | 12 ++-- src/util.hpp | 146 ++++++++++++++++++------------------- src/variable.hpp | 4 +- src/wild.hpp | 8 +-- src/wizard2.hpp | 8 +-- src/xtra1.hpp | 36 +++++----- src/xtra2.hpp | 154 +++++++++++++++++++-------------------- src/z-form.h | 8 +-- src/z-term.h | 80 ++++++++++----------- src/z-util.h | 12 ++-- 66 files changed, 911 insertions(+), 914 deletions(-) diff --git a/src/birth.hpp b/src/birth.hpp index 7c171610..27ad3d2b 100644 --- a/src/birth.hpp +++ b/src/birth.hpp @@ -2,10 +2,10 @@ #include "h-basic.h" -extern void print_desc_aux(cptr txt, int y, int x); -extern void save_savefile_names(void); -extern bool_ begin_screen(void); -extern void player_birth(void); -extern bool_ no_begin_screen; - +void print_desc_aux(cptr txt, int y, int x); +void save_savefile_names(void); +bool_ begin_screen(void); +void player_birth(void); void roll_player_hp(); + +extern bool_ no_begin_screen; diff --git a/src/bldg.hpp b/src/bldg.hpp index 00eb6a9e..a55d7419 100644 --- a/src/bldg.hpp +++ b/src/bldg.hpp @@ -4,7 +4,7 @@ #include "store_action_type_fwd.hpp" #include "store_type_fwd.hpp" -extern bool_ bldg_process_command(store_type const *s_ptr, store_action_type const *action); -extern void show_building(store_type const *s_ptr); -extern bool_ is_state(store_type const *s_ptr, int state); -extern void enter_quest(void); +bool_ bldg_process_command(store_type const *s_ptr, store_action_type const *action); +void show_building(store_type const *s_ptr); +bool_ is_state(store_type const *s_ptr, int state); +void enter_quest(void); diff --git a/src/cave.hpp b/src/cave.hpp index 5eade816..a014279f 100644 --- a/src/cave.hpp +++ b/src/cave.hpp @@ -4,54 +4,54 @@ #include "cave_type_fwd.hpp" #include "object_type_fwd.hpp" -extern int distance(int y1, int x1, int y2, int x2); -extern bool_ los(int y1, int x1, int y2, int x2); -extern bool_ cave_valid_bold(int y, int x); -extern bool_ no_lite(void); -extern void map_info_default(int y, int x, byte *ap, char *cp); -extern void move_cursor_relative(int row, int col); -extern void print_rel(char c, byte a, int y, int x); -extern void note_spot(int y, int x); -extern void lite_spot(int y, int x); -extern void prt_map(void); -extern void display_map(int *cy, int *cx); -extern void do_cmd_view_map(void); -extern errr vinfo_init(void); -extern void forget_view(void); -extern void update_view(void); -extern void forget_mon_lite(void); -extern void update_mon_lite(void); -extern void update_flow(void); -extern void map_area(void); -extern void wiz_lite(void); -extern void wiz_lite_extra(void); -extern void wiz_dark(void); -extern void cave_set_feat(int y, int x, int feat); -extern void place_floor(int y, int x); -extern void place_floor_convert_glass(int y, int x); -extern void place_filler(int y, int x); -extern void mmove2(int *y, int *x, int y1, int x1, int y2, int x2); -extern bool_ projectable(int y1, int x1, int y2, int x2); -extern void scatter(int *yp, int *xp, int y, int x, int d); -extern void health_track(int m_idx); -extern void monster_race_track(int r_idx, int ego); -extern void object_track(object_type *o_ptr); -extern void disturb(); -extern void disturb_on_state(); -extern void disturb_on_other(); -extern int is_quest(int level); -extern int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags); -extern bool cave_floor_bold(int y, int x); -extern bool cave_floor_grid(cave_type const *c); -extern bool cave_plain_floor_bold(int y, int x); -extern bool cave_plain_floor_grid(cave_type const *c); -extern bool cave_sight_bold(int y, int x); -extern bool cave_sight_grid(cave_type const *c); -extern bool cave_clean_bold(int y, int x); -extern bool cave_empty_bold(int y, int x); -extern bool cave_naked_bold(int y, int x); -extern bool cave_naked_bold2(int y, int x); -extern bool cave_perma_bold(int y, int x); -extern bool cave_perma_grid(cave_type const *c); -extern bool player_has_los_bold(int y, int x); -extern bool player_can_see_bold(int y, int x); +int distance(int y1, int x1, int y2, int x2); +bool_ los(int y1, int x1, int y2, int x2); +bool_ cave_valid_bold(int y, int x); +bool_ no_lite(void); +void map_info_default(int y, int x, byte *ap, char *cp); +void move_cursor_relative(int row, int col); +void print_rel(char c, byte a, int y, int x); +void note_spot(int y, int x); +void lite_spot(int y, int x); +void prt_map(void); +void display_map(int *cy, int *cx); +void do_cmd_view_map(void); +errr vinfo_init(void); +void forget_view(void); +void update_view(void); +void forget_mon_lite(void); +void update_mon_lite(void); +void update_flow(void); +void map_area(void); +void wiz_lite(void); +void wiz_lite_extra(void); +void wiz_dark(void); +void cave_set_feat(int y, int x, int feat); +void place_floor(int y, int x); +void place_floor_convert_glass(int y, int x); +void place_filler(int y, int x); +void mmove2(int *y, int *x, int y1, int x1, int y2, int x2); +bool_ projectable(int y1, int x1, int y2, int x2); +void scatter(int *yp, int *xp, int y, int x, int d); +void health_track(int m_idx); +void monster_race_track(int r_idx, int ego); +void object_track(object_type *o_ptr); +void disturb(); +void disturb_on_state(); +void disturb_on_other(); +int is_quest(int level); +int new_effect(int type, int dam, int time, int cy, int cx, int rad, s32b flags); +bool cave_floor_bold(int y, int x); +bool cave_floor_grid(cave_type const *c); +bool cave_plain_floor_bold(int y, int x); +bool cave_plain_floor_grid(cave_type const *c); +bool cave_sight_bold(int y, int x); +bool cave_sight_grid(cave_type const *c); +bool cave_clean_bold(int y, int x); +bool cave_empty_bold(int y, int x); +bool cave_naked_bold(int y, int x); +bool cave_naked_bold2(int y, int x); +bool cave_perma_bold(int y, int x); +bool cave_perma_grid(cave_type const *c); +bool player_has_los_bold(int y, int x); +bool player_can_see_bold(int y, int x); diff --git a/src/cmd1.hpp b/src/cmd1.hpp index c7c4f064..3d5d72b8 100644 --- a/src/cmd1.hpp +++ b/src/cmd1.hpp @@ -4,22 +4,22 @@ #include "monster_type_fwd.hpp" #include "object_type_fwd.hpp" -extern void attack_special(monster_type *m_ptr, s32b special, int dam); -extern bool_ test_hit_fire(int chance, int ac, int vis); -extern bool_ test_hit_norm(int chance, int ac, int vis); -extern s16b critical_shot(int weight, int plus, int dam, int skill); -extern s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit); -extern s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special); -extern void search(void); -extern void carry(int pickup); -extern void py_attack(int y, int x, int max_blow); -extern bool_ player_can_enter(byte feature); -extern void move_player(int dir, int do_pickup); -extern void move_player_aux(int dir, int do_pickup, int run); -extern void run_step(int dir); -extern void do_cmd_pet(void); -extern void do_cmd_integrate_body(); -extern bool_ do_cmd_leave_body(bool_ drop_body); -extern bool_ execute_inscription(byte i, byte y, byte x); -extern void do_cmd_engrave(void); -extern void do_spin(void); +void attack_special(monster_type *m_ptr, s32b special, int dam); +bool_ test_hit_fire(int chance, int ac, int vis); +bool_ test_hit_norm(int chance, int ac, int vis); +s16b critical_shot(int weight, int plus, int dam, int skill); +s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit); +s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special); +void search(void); +void carry(int pickup); +void py_attack(int y, int x, int max_blow); +bool_ player_can_enter(byte feature); +void move_player(int dir, int do_pickup); +void move_player_aux(int dir, int do_pickup, int run); +void run_step(int dir); +void do_cmd_pet(void); +void do_cmd_integrate_body(); +bool_ do_cmd_leave_body(bool_ drop_body); +bool_ execute_inscription(byte i, byte y, byte x); +void do_cmd_engrave(void); +void do_spin(void); diff --git a/src/cmd2.hpp b/src/cmd2.hpp index b5390c2a..9c903dba 100644 --- a/src/cmd2.hpp +++ b/src/cmd2.hpp @@ -4,29 +4,29 @@ #include "object_type_fwd.hpp" #include -extern std::vector show_monster_inven(int m_idx); -extern int breakage_chance(object_type *o_ptr); -extern void do_cmd_go_up(void); -extern void do_cmd_go_down(void); -extern void do_cmd_search(void); -extern void do_cmd_toggle_search(void); -extern void do_cmd_open(void); -extern void do_cmd_close(void); -extern void do_cmd_chat(void); -extern void do_cmd_give(void); -extern void do_cmd_tunnel(void); -extern void do_cmd_bash(void); -extern void do_cmd_alter(void); -extern void do_cmd_spike(void); -extern void do_cmd_walk(int pickup); -extern void do_cmd_stay(int pickup); -extern void do_cmd_run(void); -extern void do_cmd_rest(void); -extern int get_shooter_mult(object_type *o_ptr); -extern void do_cmd_fire(void); -extern void do_cmd_throw(void); -extern void do_cmd_boomerang(void); -extern void do_cmd_immovable_special(void); -extern void fetch(int dir, int wgt, bool_ require_los); -extern void do_cmd_sacrifice(void); -extern void do_cmd_steal(void); +std::vector show_monster_inven(int m_idx); +int breakage_chance(object_type *o_ptr); +void do_cmd_go_up(void); +void do_cmd_go_down(void); +void do_cmd_search(void); +void do_cmd_toggle_search(void); +void do_cmd_open(void); +void do_cmd_close(void); +void do_cmd_chat(void); +void do_cmd_give(void); +void do_cmd_tunnel(void); +void do_cmd_bash(void); +void do_cmd_alter(void); +void do_cmd_spike(void); +void do_cmd_walk(int pickup); +void do_cmd_stay(int pickup); +void do_cmd_run(void); +void do_cmd_rest(void); +int get_shooter_mult(object_type *o_ptr); +void do_cmd_fire(void); +void do_cmd_throw(void); +void do_cmd_boomerang(void); +void do_cmd_immovable_special(void); +void fetch(int dir, int wgt, bool_ require_los); +void do_cmd_sacrifice(void); +void do_cmd_steal(void); diff --git a/src/cmd3.hpp b/src/cmd3.hpp index 5c664118..4b240dda 100644 --- a/src/cmd3.hpp +++ b/src/cmd3.hpp @@ -2,22 +2,22 @@ #include "h-basic.h" -extern void do_cmd_html_dump(void); -extern void cli_add(cptr active, cptr trigger, cptr descr); -extern void do_cmd_cli(void); -extern void do_cmd_cli_help(void); -extern void do_cmd_inven(void); -extern void do_cmd_equip(void); -extern void do_cmd_wield(void); -extern void do_cmd_takeoff(void); -extern void do_cmd_drop(void); -extern void do_cmd_destroy(void); -extern void do_cmd_observe(void); -extern void do_cmd_uninscribe(void); -extern void do_cmd_inscribe(void); -extern void do_cmd_refill(void); -extern void do_cmd_target(void); -extern void do_cmd_look(void); -extern void do_cmd_locate(void); -extern void do_cmd_query_symbol(void); -extern bool_ do_cmd_sense_grid_mana(void); +void do_cmd_html_dump(void); +void cli_add(cptr active, cptr trigger, cptr descr); +void do_cmd_cli(void); +void do_cmd_cli_help(void); +void do_cmd_inven(void); +void do_cmd_equip(void); +void do_cmd_wield(void); +void do_cmd_takeoff(void); +void do_cmd_drop(void); +void do_cmd_destroy(void); +void do_cmd_observe(void); +void do_cmd_uninscribe(void); +void do_cmd_inscribe(void); +void do_cmd_refill(void); +void do_cmd_target(void); +void do_cmd_look(void); +void do_cmd_locate(void); +void do_cmd_query_symbol(void); +bool_ do_cmd_sense_grid_mana(void); diff --git a/src/cmd4.hpp b/src/cmd4.hpp index 4470c94f..44a7b97c 100644 --- a/src/cmd4.hpp +++ b/src/cmd4.hpp @@ -2,27 +2,27 @@ #include "h-basic.h" -extern void macro_recorder_start(void); -extern void macro_recorder_add(char c); -extern void macro_recorder_stop(void); -extern void do_cmd_macro_recorder(void); -extern void do_cmd_redraw(void); -extern void do_cmd_change_name(void); -extern void do_cmd_message_one(void); -extern void do_cmd_messages(void); -extern void do_cmd_options(void); -extern void do_cmd_pref(void); -extern void do_cmd_macros(void); -extern void do_cmd_visuals(void); -extern void do_cmd_colors(void); -extern void do_cmd_note(void); -extern void do_cmd_version(void); -extern void do_cmd_feeling(void); -extern void do_cmd_load_screen(void); -extern void do_cmd_save_screen(void); -extern void do_cmd_knowledge(void); -extern void do_cmd_checkquest(void); -extern void do_cmd_change_tactic(int i); -extern void do_cmd_change_movement(int i); -extern void do_cmd_time(void); -extern void do_cmd_options_aux(int page, cptr info, bool_ read_only); +void macro_recorder_start(void); +void macro_recorder_add(char c); +void macro_recorder_stop(void); +void do_cmd_macro_recorder(void); +void do_cmd_redraw(void); +void do_cmd_change_name(void); +void do_cmd_message_one(void); +void do_cmd_messages(void); +void do_cmd_options(void); +void do_cmd_pref(void); +void do_cmd_macros(void); +void do_cmd_visuals(void); +void do_cmd_colors(void); +void do_cmd_note(void); +void do_cmd_version(void); +void do_cmd_feeling(void); +void do_cmd_load_screen(void); +void do_cmd_save_screen(void); +void do_cmd_knowledge(void); +void do_cmd_checkquest(void); +void do_cmd_change_tactic(int i); +void do_cmd_change_movement(int i); +void do_cmd_time(void); +void do_cmd_options_aux(int page, cptr info, bool_ read_only); diff --git a/src/cmd5.cc b/src/cmd5.cc index 91c12e83..f9094482 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -225,7 +225,7 @@ static void browse_school_spell(int book, int spell_idx, object_type *o_ptr) * and in the dark, primarily to allow browsing in stores. */ -extern void do_cmd_browse_aux(object_type *o_ptr) +void do_cmd_browse_aux(object_type *o_ptr) { auto const flags = object_flags(o_ptr); diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 89bbab8c..753b8f68 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -8,16 +8,16 @@ #include #include -extern bool_ is_magestaff(void); -extern void do_cmd_browse_aux(object_type *o_ptr); -extern void do_cmd_browse(void); -extern void fetch(int dir, int wgt, bool_ require_los); -extern void do_poly_self(void); -extern std::string symbiote_name(bool capitalize); -extern int use_symbiotic_power(int r_idx, bool great); -extern void use_monster_power(int r_idx, bool great); -extern bool_ is_ok_spell(s32b spell_idx, s32b pval); -extern s32b get_school_spell(cptr do_what, s16b force_book); -extern void do_cmd_copy_spell(void); -extern void cast_school_spell(void); -extern std::vector extract_monster_powers(monster_race const *r_ptr, bool great); +bool_ is_magestaff(void); +void do_cmd_browse_aux(object_type *o_ptr); +void do_cmd_browse(void); +void fetch(int dir, int wgt, bool_ require_los); +void do_poly_self(void); +std::string symbiote_name(bool capitalize); +int use_symbiotic_power(int r_idx, bool great); +void use_monster_power(int r_idx, bool great); +bool_ is_ok_spell(s32b spell_idx, s32b pval); +s32b get_school_spell(cptr do_what, s16b force_book); +void do_cmd_copy_spell(void); +void cast_school_spell(void); +std::vector extract_monster_powers(monster_race const *r_ptr, bool great); diff --git a/src/cmd6.hpp b/src/cmd6.hpp index ad6619f6..6c4b0d47 100644 --- a/src/cmd6.hpp +++ b/src/cmd6.hpp @@ -3,16 +3,16 @@ #include "h-basic.h" #include "object_type_fwd.hpp" -extern void set_stick_mode(object_type *o_ptr); -extern void unset_stick_mode(void); -extern void do_cmd_eat_food(void); -extern void do_cmd_quaff_potion(void); -extern void do_cmd_read_scroll(void); -extern void do_cmd_aim_wand(void); -extern void do_cmd_use_staff(void); -extern void do_cmd_zap_rod(void); -extern const char *activation_aux(object_type *o_ptr, bool_ desc, int item); -extern void do_cmd_activate(void); -extern void do_cmd_cut_corpse(void); -extern void do_cmd_cure_meat(void); -extern void do_cmd_drink_fountain(void); +void set_stick_mode(object_type *o_ptr); +void unset_stick_mode(void); +void do_cmd_eat_food(void); +void do_cmd_quaff_potion(void); +void do_cmd_read_scroll(void); +void do_cmd_aim_wand(void); +void do_cmd_use_staff(void); +void do_cmd_zap_rod(void); +const char *activation_aux(object_type *o_ptr, bool_ desc, int item); +void do_cmd_activate(void); +void do_cmd_cut_corpse(void); +void do_cmd_cure_meat(void); +void do_cmd_drink_fountain(void); diff --git a/src/cmd7.cc b/src/cmd7.cc index 38e5d6cd..b51ba229 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -3296,7 +3296,7 @@ void do_cmd_create_boulder() /* * Clamp failure chance */ -extern int clamp_failure_chance(int chance, int minfail) +int clamp_failure_chance(int chance, int minfail) { if (minfail < 0) minfail = 0; diff --git a/src/cmd7.hpp b/src/cmd7.hpp index 0c650210..4d8b5240 100644 --- a/src/cmd7.hpp +++ b/src/cmd7.hpp @@ -3,23 +3,23 @@ #include "h-basic.h" #include "object_type_fwd.hpp" -extern void do_cmd_pray(void); -extern void do_cmd_create_boulder(void); -extern void necro_info(char *p, int power); -extern void mindcraft_info(char *p, int power); -extern void symbiotic_info(char *p, int power); -extern void mimic_info(char *p, int power); -extern void do_cmd_summoner(void); -extern void do_cmd_mindcraft(void); -extern void do_cmd_mimic(void); -extern void use_ability_blade(void); -extern void do_cmd_beastmaster(void); -extern void do_cmd_powermage(void); -extern void do_cmd_possessor(void); -extern void do_cmd_archer(void); -extern void do_cmd_set_piercing(void); -extern void do_cmd_necromancer(void); -extern void do_cmd_unbeliever(void); -extern void do_cmd_symbiotic(void); -extern s32b sroot(s32b n); -extern int clamp_failure_chance(int chance, int minfail); +void do_cmd_pray(void); +void do_cmd_create_boulder(void); +void necro_info(char *p, int power); +void mindcraft_info(char *p, int power); +void symbiotic_info(char *p, int power); +void mimic_info(char *p, int power); +void do_cmd_summoner(void); +void do_cmd_mindcraft(void); +void do_cmd_mimic(void); +void use_ability_blade(void); +void do_cmd_beastmaster(void); +void do_cmd_powermage(void); +void do_cmd_possessor(void); +void do_cmd_archer(void); +void do_cmd_set_piercing(void); +void do_cmd_necromancer(void); +void do_cmd_unbeliever(void); +void do_cmd_symbiotic(void); +s32b sroot(s32b n); +int clamp_failure_chance(int chance, int minfail); diff --git a/src/corrupt.hpp b/src/corrupt.hpp index d7ab2e97..77a7496e 100644 --- a/src/corrupt.hpp +++ b/src/corrupt.hpp @@ -2,12 +2,12 @@ #include -extern void gain_random_corruption(); -extern std::string dump_corruptions(bool color, bool header); -extern void lose_corruption(); -extern bool_ player_has_corruption(int corruption_idx); -extern void player_gain_corruption(int corruption_idx); -extern s16b get_corruption_power(int corruption_idx); +void gain_random_corruption(); +std::string dump_corruptions(bool color, bool header); +void lose_corruption(); +bool_ player_has_corruption(int corruption_idx); +void player_gain_corruption(int corruption_idx); +s16b get_corruption_power(int corruption_idx); /* * Corruptions diff --git a/src/dungeon.h b/src/dungeon.h index 2a178dd1..b5a81a59 100644 --- a/src/dungeon.h +++ b/src/dungeon.h @@ -5,7 +5,7 @@ extern "C" { #endif -extern void play_game(); +void play_game(); #ifdef __cplusplus } // extern "C" diff --git a/src/dungeon.hpp b/src/dungeon.hpp index bbe6da87..e14f4a12 100644 --- a/src/dungeon.hpp +++ b/src/dungeon.hpp @@ -2,5 +2,5 @@ #include -extern void sense_inventory(); -extern void sense_objects(std::vector const &object_idxs); +void sense_inventory(); +void sense_objects(std::vector const &object_idxs); diff --git a/src/files.h b/src/files.h index 951c3c00..ddb9c5c8 100644 --- a/src/files.h +++ b/src/files.h @@ -7,8 +7,8 @@ extern "C" { #endif -extern void do_cmd_save_game(void); -extern void predict_score_gui(bool_ *initialized, bool_ *game_in_progress); +void do_cmd_save_game(void); +void predict_score_gui(bool_ *initialized, bool_ *game_in_progress); #ifdef __cplusplus } // extern "C" diff --git a/src/files.hpp b/src/files.hpp index bd39c759..d86307e8 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -7,27 +7,27 @@ #include #include -extern void html_screenshot(cptr name); -extern void help_file_screenshot(cptr name); -extern object_flag_set player_flags(); -extern void wipe_saved(void); -extern s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2); -extern void display_player(int mode); -extern std::string describe_player_location(); -extern errr file_character(cptr name, bool_ full); -extern errr process_pref_file_aux(char *buf); -extern errr process_pref_file(cptr name); -extern void show_string(const char *lines, const char *title, int line = 0); -extern void show_file(cptr name, cptr what, int line = 0); -extern void do_cmd_help(void); -extern void process_player_base(void); -extern void get_name(void); -extern void do_cmd_suicide(void); -extern void autosave_checkpoint(); -extern void close_game(void); -extern errr get_rnd_line(const char * file_name, char * output); -extern char *get_line(const char* fname, cptr fdir, char *linbuf, int line); -extern void race_legends(void); -extern void show_highclass(int building); -extern errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output); -extern void process_player_name(bool_ sf); +void html_screenshot(cptr name); +void help_file_screenshot(cptr name); +object_flag_set player_flags(); +void wipe_saved(void); +s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2); +void display_player(int mode); +std::string describe_player_location(); +errr file_character(cptr name, bool_ full); +errr process_pref_file_aux(char *buf); +errr process_pref_file(cptr name); +void show_string(const char *lines, const char *title, int line = 0); +void show_file(cptr name, cptr what, int line = 0); +void do_cmd_help(void); +void process_player_base(void); +void get_name(void); +void do_cmd_suicide(void); +void autosave_checkpoint(); +void close_game(void); +errr get_rnd_line(const char * file_name, char * output); +char *get_line(const char* fname, cptr fdir, char *linbuf, int line); +void race_legends(void); +void show_highclass(int building); +errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output); +void process_player_name(bool_ sf); diff --git a/src/gen_evol.hpp b/src/gen_evol.hpp index 65b1320d..6e5087c8 100644 --- a/src/gen_evol.hpp +++ b/src/gen_evol.hpp @@ -2,5 +2,5 @@ #include "h-basic.h" -extern bool_ level_generate_life(); -extern void evolve_level(bool_ noise); +bool_ level_generate_life(); +void evolve_level(bool_ noise); diff --git a/src/gen_maze.hpp b/src/gen_maze.hpp index 28c092e3..bc03b575 100644 --- a/src/gen_maze.hpp +++ b/src/gen_maze.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -extern bool_ level_generate_maze(); +bool_ level_generate_maze(); diff --git a/src/generate.hpp b/src/generate.hpp index d09907b5..296afb8d 100644 --- a/src/generate.hpp +++ b/src/generate.hpp @@ -2,11 +2,11 @@ #include "h-basic.h" -extern bool_ new_player_spot(int branch); -extern void add_level_generator(cptr name, bool_ (*generator)()); -extern bool_ level_generate_dungeon(); -extern bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room); -extern void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff); -extern bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy); -extern void generate_cave(void); -extern void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info); +bool_ new_player_spot(int branch); +void add_level_generator(cptr name, bool_ (*generator)()); +bool_ level_generate_dungeon(); +bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room); +void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff); +bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy); +void generate_cave(void); +void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info); diff --git a/src/gods.hpp b/src/gods.hpp index 7035dd14..2a5f2bb5 100644 --- a/src/gods.hpp +++ b/src/gods.hpp @@ -2,12 +2,12 @@ #include "h-basic.h" -extern void inc_piety(int god, s32b amt); -extern void abandon_god(int god); -extern int wisdom_scale(int max); -extern int find_god(cptr name); -extern void follow_god(int god, bool_ silent); -extern bool_ god_enabled(struct deity_type *deity); -extern deity_type *god_at(byte god_idx); -extern bool_ show_god_info(); -extern bool praying_to(int god); +void inc_piety(int god, s32b amt); +void abandon_god(int god); +int wisdom_scale(int max); +int find_god(cptr name); +void follow_god(int god, bool_ silent); +bool_ god_enabled(struct deity_type *deity); +deity_type *god_at(byte god_idx); +bool_ show_god_info(); +bool praying_to(int god); diff --git a/src/help.hpp b/src/help.hpp index 5adf1381..a805a62b 100644 --- a/src/help.hpp +++ b/src/help.hpp @@ -4,10 +4,10 @@ #include -extern void init_hooks_help(); -extern void help_race(std::string const &race); -extern void help_subrace(std::string const &subrace); -extern void help_class(std::string const &klass); -extern void help_god(cptr god); -extern void help_skill(std::string const &skill); -extern void help_ability(std::string const &ability); +void init_hooks_help(); +void help_race(std::string const &race); +void help_subrace(std::string const &subrace); +void help_class(std::string const &klass); +void help_god(cptr god); +void help_skill(std::string const &skill); +void help_ability(std::string const &ability); diff --git a/src/hooks.hpp b/src/hooks.hpp index b6124e6a..78896def 100644 --- a/src/hooks.hpp +++ b/src/hooks.hpp @@ -4,7 +4,7 @@ typedef bool_ (*hook_func_t)(void *, void *, void *); -extern void add_hook_new(int h_idx, hook_func_t hook_func, cptr name, void *data); -extern void del_hook_new(int h_idx, hook_func_t hook_func); +void add_hook_new(int h_idx, hook_func_t hook_func, cptr name, void *data); +void del_hook_new(int h_idx, hook_func_t hook_func); extern int process_hooks_restart; -extern bool_ process_hooks_new(int h_idx, void *in, void *out); +bool_ process_hooks_new(int h_idx, void *in, void *out); diff --git a/src/init1.hpp b/src/init1.hpp index 3f0198a7..1c417285 100644 --- a/src/init1.hpp +++ b/src/init1.hpp @@ -3,25 +3,25 @@ #include "h-basic.h" #include "dungeon_flag_set.hpp" -extern int color_char_to_attr(char c); +int color_char_to_attr(char c); extern byte conv_color[16]; -extern errr init_player_info_txt(FILE *fp); -extern errr init_ab_info_txt(FILE *fp); -extern errr init_s_info_txt(FILE *fp); -extern errr init_set_info_txt(FILE *fp); -extern errr init_v_info_txt(FILE *fp); -extern errr init_f_info_txt(FILE *fp); -extern errr init_k_info_txt(FILE *fp); -extern errr init_a_info_txt(FILE *fp); -extern errr init_ra_info_txt(FILE *fp); -extern errr init_e_info_txt(FILE *fp); -extern errr init_r_info_txt(FILE *fp); -extern errr init_re_info_txt(FILE *fp); -extern errr init_d_info_txt(FILE *fp); -extern errr init_t_info_txt(FILE *fp); -extern errr init_ba_info_txt(FILE *fp); -extern errr init_st_info_txt(FILE *fp); -extern errr init_ow_info_txt(FILE *fp); -extern errr init_wf_info_txt(FILE *fp); -extern errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str); -extern errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full); +errr init_player_info_txt(FILE *fp); +errr init_ab_info_txt(FILE *fp); +errr init_s_info_txt(FILE *fp); +errr init_set_info_txt(FILE *fp); +errr init_v_info_txt(FILE *fp); +errr init_f_info_txt(FILE *fp); +errr init_k_info_txt(FILE *fp); +errr init_a_info_txt(FILE *fp); +errr init_ra_info_txt(FILE *fp); +errr init_e_info_txt(FILE *fp); +errr init_r_info_txt(FILE *fp); +errr init_re_info_txt(FILE *fp); +errr init_d_info_txt(FILE *fp); +errr init_t_info_txt(FILE *fp); +errr init_ba_info_txt(FILE *fp); +errr init_st_info_txt(FILE *fp); +errr init_ow_info_txt(FILE *fp); +errr init_wf_info_txt(FILE *fp); +errr grab_one_dungeon_flag(dungeon_flag_set *flags, const char *str); +errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full); diff --git a/src/init2.h b/src/init2.h index ba18f2d7..d99cd62c 100644 --- a/src/init2.h +++ b/src/init2.h @@ -5,8 +5,8 @@ extern "C" { #endif -extern void init_file_paths(char *path); -extern void init_angband(void); +void init_file_paths(char *path); +void init_angband(void); #ifdef __cplusplus } // extern "C" diff --git a/src/init2.hpp b/src/init2.hpp index 707a2706..e1c3b4ef 100644 --- a/src/init2.hpp +++ b/src/init2.hpp @@ -2,8 +2,8 @@ #include "h-basic.h" -extern void init_corruptions(); -extern void create_stores_stock(int t); -extern errr init_v_info(void); +void init_corruptions(); +void create_stores_stock(int t); +errr init_v_info(void); extern s16b error_idx; extern s16b error_line; diff --git a/src/joke.hpp b/src/joke.hpp index 05ac1843..46795e7c 100644 --- a/src/joke.hpp +++ b/src/joke.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -extern bool_ gen_joke_monsters(void *data, void *in, void *out); +bool_ gen_joke_monsters(void *data, void *in, void *out); diff --git a/src/levels.hpp b/src/levels.hpp index 187092b1..fb3169b4 100644 --- a/src/levels.hpp +++ b/src/levels.hpp @@ -2,12 +2,12 @@ #include "h-basic.h" -extern bool_ get_dungeon_generator(char *buf); -extern bool_ get_level_desc(char *buf); -extern void get_level_flags(void); -extern bool_ get_dungeon_name(char *buf); -extern bool_ get_dungeon_special(char *buf); -extern int get_branch(void); -extern int get_fbranch(void); -extern int get_flevel(void); -extern bool_ get_dungeon_save(char *buf); +bool_ get_dungeon_generator(char *buf); +bool_ get_level_desc(char *buf); +void get_level_flags(void); +bool_ get_dungeon_name(char *buf); +bool_ get_dungeon_special(char *buf); +int get_branch(void); +int get_fbranch(void); +int get_flevel(void); +bool_ get_dungeon_save(char *buf); diff --git a/src/loadsave.h b/src/loadsave.h index 61bfced7..0d2c4ff5 100644 --- a/src/loadsave.h +++ b/src/loadsave.h @@ -7,9 +7,8 @@ extern "C" { #endif -/* loadsave.c */ -extern void save_dungeon(void); -extern bool_ save_player(void); +void save_dungeon(void); +bool_ save_player(void); #ifdef __cplusplus } // extern "C" diff --git a/src/loadsave.hpp b/src/loadsave.hpp index a9eb9dc8..d80a3e7e 100644 --- a/src/loadsave.hpp +++ b/src/loadsave.hpp @@ -2,6 +2,6 @@ #include "h-basic.h" -extern bool_ file_exist(cptr buf); -extern bool_ load_dungeon(char *ext); -extern bool_ load_player(void); +bool_ file_exist(cptr buf); +bool_ load_dungeon(char *ext); +bool_ load_player(void); diff --git a/src/lua_bind.hpp b/src/lua_bind.hpp index 9882edad..39fc2159 100644 --- a/src/lua_bind.hpp +++ b/src/lua_bind.hpp @@ -5,26 +5,26 @@ #include "timer_type_fwd.hpp" /** Calculate spell failure rate for a device, i.e. a wand or staff. */ -extern s32b spell_chance_device(spell_type *spell_ptr); +s32b spell_chance_device(spell_type *spell_ptr); /** Calculate spell failure rate for a spell book. */ -extern s32b spell_chance_book(s32b s); +s32b spell_chance_book(s32b s); -extern s32b lua_get_level(struct spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus); -extern int get_mana(s32b s); -extern s32b get_power(s32b s); -extern s32b get_level(s32b s, s32b max); -extern s32b get_level_s(int sp, int max); -extern void get_level_school(struct spell_type *spell, s32b max, s32b min, s32b *level, bool_ *na); +s32b lua_get_level(struct spell_type *spell, s32b lvl, s32b max, s32b min, s32b bonus); +int get_mana(s32b s); +s32b get_power(s32b s); +s32b get_level(s32b s, s32b max); +s32b get_level_s(int sp, int max); +void get_level_school(struct spell_type *spell, s32b max, s32b min, s32b *level, bool_ *na); extern s32b get_level_max_stick; extern s32b get_level_use_stick; -extern void get_map_size(const char *name, int *ysize, int *xsize); -extern void load_map(const char *name, int *y, int *x); +void get_map_size(const char *name, int *ysize, int *xsize); +void load_map(const char *name, int *y, int *x); -extern void increase_mana(int delta); +void increase_mana(int delta); extern timer_type *TIMER_AGGRAVATE_EVIL; diff --git a/src/main-x11.c b/src/main-x11.c index 99778c77..19d2ac94 100644 --- a/src/main-x11.c +++ b/src/main-x11.c @@ -555,7 +555,7 @@ int Term_queue_space(void) * * NB: The keys added here will be interpreted by any macros or keymaps. */ -errr type_string(char *str, uint len) +static errr type_string(char *str, uint len) { char *s; @@ -1740,8 +1740,6 @@ error: XSendEvent(DPY, rq->requestor, FALSE, NoEventMask, &event); } -extern errr type_string(char *str, uint len); - /* * Add the contents of the PRIMARY buffer to the input queue. * diff --git a/src/melee1.hpp b/src/melee1.hpp index e84c8f03..90ece431 100644 --- a/src/melee1.hpp +++ b/src/melee1.hpp @@ -2,6 +2,6 @@ #include "h-basic.h" -extern int get_attack_power(int effect); -extern bool_ carried_make_attack_normal(int r_idx); -extern bool_ make_attack_normal(int m_idx, byte divis); +int get_attack_power(int effect); +bool_ carried_make_attack_normal(int r_idx); +bool_ make_attack_normal(int m_idx, byte divis); diff --git a/src/melee2.hpp b/src/melee2.hpp index fece0564..d3af972f 100644 --- a/src/melee2.hpp +++ b/src/melee2.hpp @@ -4,9 +4,9 @@ #include "monster_type_fwd.hpp" extern int monst_spell_monst_spell; -extern bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note); -extern void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear); -extern int check_hit2(int power, int level, int ac); -extern void process_monsters(void); -extern void curse_equipment(int chance, int heavy_chance); -extern void curse_equipment_dg(int chance, int heavy_chance); +bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note); +void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear); +int check_hit2(int power, int level, int ac); +void process_monsters(void); +void curse_equipment(int chance, int heavy_chance); +void curse_equipment_dg(int chance, int heavy_chance); diff --git a/src/mimic.hpp b/src/mimic.hpp index d9c8f3bd..4ce9a6e8 100644 --- a/src/mimic.hpp +++ b/src/mimic.hpp @@ -1,10 +1,10 @@ #include "h-basic.h" -extern s16b resolve_mimic_name(cptr name); -extern s16b find_random_mimic_shape(byte level, bool_ limit); -extern cptr get_mimic_name(s16b mf_idx); -extern cptr get_mimic_object_name(s16b mf_idx); -extern byte get_mimic_level(s16b mf_idx); -extern s32b get_mimic_random_duration(s16b mf_idx); -extern byte calc_mimic(); -extern void calc_mimic_power(); +s16b resolve_mimic_name(cptr name); +s16b find_random_mimic_shape(byte level, bool_ limit); +cptr get_mimic_name(s16b mf_idx); +cptr get_mimic_object_name(s16b mf_idx); +byte get_mimic_level(s16b mf_idx); +s32b get_mimic_random_duration(s16b mf_idx); +byte calc_mimic(); +void calc_mimic_power(); diff --git a/src/modules.hpp b/src/modules.hpp index 7a8a055f..e8a413df 100644 --- a/src/modules.hpp +++ b/src/modules.hpp @@ -2,12 +2,12 @@ #include "h-basic.h" -extern bool_ select_module(void); -extern bool_ module_savefile_loadable(cptr savefile_mod); -extern void tome_intro(); -extern void theme_intro(); -extern s16b *theme_race_status(int r_idx); -extern void init_hooks_module(); -extern int find_module(cptr name); -extern bool_ private_check_user_directory(cptr dirpath); +bool_ select_module(void); +bool_ module_savefile_loadable(cptr savefile_mod); +void tome_intro(); +void theme_intro(); +s16b *theme_race_status(int r_idx); +void init_hooks_module(); +int find_module(cptr name); +bool_ private_check_user_directory(cptr dirpath); extern cptr force_module; diff --git a/src/monster1.hpp b/src/monster1.hpp index 9f7128ea..34f54346 100644 --- a/src/monster1.hpp +++ b/src/monster1.hpp @@ -1,5 +1,5 @@ #pragma once -extern void screen_roff(int r_idx, int ego); -extern void display_roff(int r_idx, int ego); -extern void monster_description_out(int r_idx, int ego); +void screen_roff(int r_idx, int ego); +void display_roff(int r_idx, int ego); +void monster_description_out(int r_idx, int ego); diff --git a/src/monster2.hpp b/src/monster2.hpp index 5ef5eaf9..552331ef 100644 --- a/src/monster2.hpp +++ b/src/monster2.hpp @@ -6,45 +6,45 @@ #include "object_type_fwd.hpp" #include -extern s32b monster_exp(s16b level); -extern void monster_set_level(int m_idx, int level); -extern s32b modify_aux(s32b a, s32b b, char mod); -extern void monster_msg_simple(cptr s); -extern bool_ mego_ok(monster_race const *r_ptr, int ego); -extern void monster_check_experience(int m_idx, bool_ silent); -extern void monster_gain_exp(int m_idx, u32b exp, bool_ silent); -extern std::shared_ptr race_info_idx(int r_idx, int ego); -extern void delete_monster_idx(int i); -extern void delete_monster(int y, int x); -extern void compact_monsters(int size); -extern void wipe_m_list(void); -extern s16b m_pop(void); -extern errr get_mon_num_prep(void); -extern s16b get_mon_num(int level); -extern void monster_desc(char *desc, monster_type *m_ptr, int mode); -extern void monster_race_desc(char *desc, int r_idx, int ego); -extern void update_mon(int m_idx, bool_ full); -extern void update_monsters(bool_ full); -extern void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr); +s32b monster_exp(s16b level); +void monster_set_level(int m_idx, int level); +s32b modify_aux(s32b a, s32b b, char mod); +void monster_msg_simple(cptr s); +bool_ mego_ok(monster_race const *r_ptr, int ego); +void monster_check_experience(int m_idx, bool_ silent); +void monster_gain_exp(int m_idx, u32b exp, bool_ silent); +std::shared_ptr race_info_idx(int r_idx, int ego); +void delete_monster_idx(int i); +void delete_monster(int y, int x); +void compact_monsters(int size); +void wipe_m_list(void); +s16b m_pop(void); +errr get_mon_num_prep(void); +s16b get_mon_num(int level); +void monster_desc(char *desc, monster_type *m_ptr, int mode); +void monster_race_desc(char *desc, int r_idx, int ego); +void update_mon(int m_idx, bool_ full); +void update_monsters(bool_ full); +void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr); extern bool_ bypass_r_ptr_max_num ; -extern bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status); -extern bool_ place_monster(int y, int x, bool_ slp, bool_ grp); -extern bool_ alloc_horde(int y, int x); -extern bool_ alloc_monster(int dis, bool_ slp); +bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status); +bool_ place_monster(int y, int x, bool_ slp, bool_ grp); +bool_ alloc_horde(int y, int x); +bool_ alloc_monster(int dis, bool_ slp); extern int summon_specific_level; -extern bool_ summon_specific(int y1, int x1, int lev, int type); -extern void monster_swap(int y1, int x1, int y2, int x2); -extern bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone); +bool_ summon_specific(int y1, int x1, int lev, int type); +void monster_swap(int y1, int x1, int y2, int x2); +bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone); extern bool_ hack_message_pain_may_silent; -extern void message_pain(int m_idx, int dam); -extern void update_smart_learn(int m_idx, int what); -extern bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok); +void message_pain(int m_idx, int dam); +void update_smart_learn(int m_idx, int what); +bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok); extern bool_ place_monster_one_no_drop; -extern s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status); -extern s16b player_place(int y, int x); -extern void monster_drop_carried_objects(monster_type *m_ptr); -extern bool_ monster_dungeon(int r_idx); -extern bool_ monster_quest(int r_idx); -extern void set_mon_num_hook(void); -extern void set_mon_num2_hook(int y, int x); -extern bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr); +s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status); +s16b player_place(int y, int x); +void monster_drop_carried_objects(monster_type *m_ptr); +bool_ monster_dungeon(int r_idx); +bool_ monster_quest(int r_idx); +void set_mon_num_hook(void); +void set_mon_num2_hook(int y, int x); +bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr); diff --git a/src/monster3.hpp b/src/monster3.hpp index 7cf8ccd0..2ad6ba30 100644 --- a/src/monster3.hpp +++ b/src/monster3.hpp @@ -3,18 +3,18 @@ #include "h-basic.h" #include "monster_type_fwd.hpp" -extern void dump_companions(FILE *outfile); -extern void do_cmd_companion(void); -extern bool_ do_control_reconnect(void); -extern bool_ do_control_drop(void); -extern bool_ do_control_magic(void); -extern bool_ do_control_pickup(void); -extern bool_ do_control_inven(void); -extern bool_ do_control_walk(void); -extern bool_ can_create_companion(void); -extern void ai_deincarnate(int m_idx); -extern bool_ ai_possessor(int m_idx, int o_idx); -extern bool_ ai_multiply(int m_idx); -extern bool_ change_side(monster_type *m_ptr); -extern int is_friend(monster_type *m_ptr); -extern bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr); +void dump_companions(FILE *outfile); +void do_cmd_companion(void); +bool_ do_control_reconnect(void); +bool_ do_control_drop(void); +bool_ do_control_magic(void); +bool_ do_control_pickup(void); +bool_ do_control_inven(void); +bool_ do_control_walk(void); +bool_ can_create_companion(void); +void ai_deincarnate(int m_idx); +bool_ ai_possessor(int m_idx, int o_idx); +bool_ ai_multiply(int m_idx); +bool_ change_side(monster_type *m_ptr); +int is_friend(monster_type *m_ptr); +bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr); diff --git a/src/notes.hpp b/src/notes.hpp index dbe5c04f..05514635 100644 --- a/src/notes.hpp +++ b/src/notes.hpp @@ -1,6 +1,6 @@ #pragma once -extern void show_notes_file(void); -extern void output_note(char const *final_note); -extern void add_note(char *note, char code); -extern void add_note_type(int note_number); +void show_notes_file(void); +void output_note(char const *final_note); +void add_note(char *note, char code); +void add_note_type(int note_number); diff --git a/src/object1.hpp b/src/object1.hpp index f585b013..2701d1bb 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -9,41 +9,41 @@ typedef std::function(object_filter_t const &filter)> select_by_name_t; -extern byte get_item_letter_color(object_type const *o_ptr); -extern void object_pickup(int this_o_idx); -extern void apply_set(s16b a_idx, s16b set_idx); -extern bool_ takeoff_set(s16b a_idx, s16b set_idx); -extern bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent); -extern bool_ verify(cptr prompt, int item); -extern void flavor_init(void); -extern void reset_visuals(void); -extern int object_power(object_type *o_ptr); +byte get_item_letter_color(object_type const *o_ptr); +void object_pickup(int this_o_idx); +void apply_set(s16b a_idx, s16b set_idx); +bool_ takeoff_set(s16b a_idx, s16b set_idx); +bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent); +bool_ verify(cptr prompt, int item); +void flavor_init(void); +void reset_visuals(void); +int object_power(object_type *o_ptr); extern bool_ object_flags_no_set; -extern object_flag_set object_flags(object_type const *o_ptr); -extern object_flag_set object_flags_known(object_type const *o_ptr); +object_flag_set object_flags(object_type const *o_ptr); +object_flag_set object_flags_known(object_type const *o_ptr); -extern s32b calc_object_need_exp(object_type const *o_ptr); -extern void object_desc(char *buf, object_type const *o_ptr, int pref, int mode); -extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode); -extern bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it); -extern char index_to_label(int i); -extern s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal); -extern s16b wield_slot(object_type const *o_ptr); -extern cptr describe_use(int i); -extern void display_inven(void); -extern void display_equip(void); -extern void show_inven_full(); -extern void show_equip_full(); -extern void toggle_inven_equip(void); -extern bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t()); -extern cptr item_activation(object_type *o_ptr); -extern void py_pickup_floor(int pickup); -extern void object_gain_level(object_type *o_ptr); -extern byte object_attr(object_type const *o_ptr); -extern byte object_attr_default(object_type *o_ptr); -extern char object_char(object_type const *o_ptr); -extern char object_char_default(object_type const *o_ptr); -extern bool artifact_p(object_type const *o_ptr); -extern bool ego_item_p(object_type const *o_ptr); -extern bool is_ego_p(object_type const *o_ptr, s16b ego); -extern bool cursed_p(object_type const *o_ptr); +s32b calc_object_need_exp(object_type const *o_ptr); +void object_desc(char *buf, object_type const *o_ptr, int pref, int mode); +void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode); +bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it); +char index_to_label(int i); +s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal); +s16b wield_slot(object_type const *o_ptr); +cptr describe_use(int i); +void display_inven(void); +void display_equip(void); +void show_inven_full(); +void show_equip_full(); +void toggle_inven_equip(void); +bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t()); +cptr item_activation(object_type *o_ptr); +void py_pickup_floor(int pickup); +void object_gain_level(object_type *o_ptr); +byte object_attr(object_type const *o_ptr); +byte object_attr_default(object_type *o_ptr); +char object_char(object_type const *o_ptr); +char object_char_default(object_type const *o_ptr); +bool artifact_p(object_type const *o_ptr); +bool ego_item_p(object_type const *o_ptr); +bool is_ego_p(object_type const *o_ptr, s16b ego); +bool cursed_p(object_type const *o_ptr); diff --git a/src/object2.hpp b/src/object2.hpp index 7c16be85..8444f408 100644 --- a/src/object2.hpp +++ b/src/object2.hpp @@ -10,60 +10,60 @@ typedef enum { OPTIMIZE, NO_OPTIMIZE } optimize_flag; typedef enum { DESCRIBE, NO_DESCRIBE } describe_flag; -extern void inc_stack_size(int item, int delta); -extern void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc); -extern object_type *get_object(int item); -extern s32b calc_total_weight(void); -extern void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows); -extern bool init_match_theme(obj_theme const &theme); -extern bool_ kind_is_artifactable(int k_idx); -extern bool_ kind_is_legal(int k_idx); -extern void inven_item_charges(int item); -extern void inven_item_describe(int item); -extern void inven_item_increase(int item, int num); -extern bool_ inven_item_optimize(int item); -extern void floor_item_charges(int item); -extern void floor_item_describe(int item); -extern void floor_item_increase(int item, int num); -extern void floor_item_optimize(int item); -extern bool_ inven_carry_okay(object_type const *o_ptr); -extern s16b inven_carry(object_type *o_ptr, bool_ final); -extern s16b inven_takeoff(int item, int amt, bool_ force_drop); -extern void inven_drop(int item, int amt, int dy, int dx, bool_ silent); -extern void excise_object_idx(int o_idx); -extern void delete_object_idx(int o_idx); -extern void delete_object(int y, int x); -extern void compact_objects(int size); -extern void wipe_o_list(void); -extern s16b o_pop(void); -extern errr get_obj_num_prep(void); -extern s16b get_obj_num(int level); -extern void object_known(object_type *o_ptr); -extern bool object_known_p(object_type const *o_ptr); -extern void object_aware(object_type *o_ptr); -extern bool object_aware_p(object_type const *o_ptr); -extern void object_tried(object_type *o_ptr); -extern bool object_tried_p(object_type const *o_ptr); -extern s32b object_value(object_type const *o_ptr); -extern s32b object_value_real(object_type const *o_ptr); -extern bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr); -extern void object_absorb(object_type *o_ptr, object_type *j_ptr); -extern s16b lookup_kind(int tval, int sval); -extern void object_wipe(object_type *o_ptr); -extern void object_prep(object_type *o_ptr, int k_idx); -extern void object_copy(object_type *o_ptr, object_type *j_ptr); -extern void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional force_power = boost::none); -extern bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme); -extern void place_object(int y, int x, bool_ good, bool_ great, int where); -extern bool_ make_gold(object_type *j_ptr); -extern void place_gold(int y, int x); -extern s16b drop_near(object_type *o_ptr, int chance, int y, int x); -extern void acquirement(int y1, int x1, int num, bool_ great, bool_ known); -extern void combine_pack(void); -extern void reorder_pack(void); -extern void random_artifact_resistance (object_type * o_ptr); -extern s16b floor_carry(int y, int x, object_type *j_ptr); -extern void pack_decay(int item); -extern void floor_decay(int item); -extern s16b m_bonus(int max, int level); -extern s32b flag_cost(object_type const *o_ptr, int plusses); +void inc_stack_size(int item, int delta); +void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc); +object_type *get_object(int item); +s32b calc_total_weight(void); +void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows); +bool init_match_theme(obj_theme const &theme); +bool_ kind_is_artifactable(int k_idx); +bool_ kind_is_legal(int k_idx); +void inven_item_charges(int item); +void inven_item_describe(int item); +void inven_item_increase(int item, int num); +bool_ inven_item_optimize(int item); +void floor_item_charges(int item); +void floor_item_describe(int item); +void floor_item_increase(int item, int num); +void floor_item_optimize(int item); +bool_ inven_carry_okay(object_type const *o_ptr); +s16b inven_carry(object_type *o_ptr, bool_ final); +s16b inven_takeoff(int item, int amt, bool_ force_drop); +void inven_drop(int item, int amt, int dy, int dx, bool_ silent); +void excise_object_idx(int o_idx); +void delete_object_idx(int o_idx); +void delete_object(int y, int x); +void compact_objects(int size); +void wipe_o_list(void); +s16b o_pop(void); +errr get_obj_num_prep(void); +s16b get_obj_num(int level); +void object_known(object_type *o_ptr); +bool object_known_p(object_type const *o_ptr); +void object_aware(object_type *o_ptr); +bool object_aware_p(object_type const *o_ptr); +void object_tried(object_type *o_ptr); +bool object_tried_p(object_type const *o_ptr); +s32b object_value(object_type const *o_ptr); +s32b object_value_real(object_type const *o_ptr); +bool_ object_similar(object_type const *o_ptr, object_type const *j_ptr); +void object_absorb(object_type *o_ptr, object_type *j_ptr); +s16b lookup_kind(int tval, int sval); +void object_wipe(object_type *o_ptr); +void object_prep(object_type *o_ptr, int k_idx); +void object_copy(object_type *o_ptr, object_type *j_ptr); +void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great, boost::optional force_power = boost::none); +bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme); +void place_object(int y, int x, bool_ good, bool_ great, int where); +bool_ make_gold(object_type *j_ptr); +void place_gold(int y, int x); +s16b drop_near(object_type *o_ptr, int chance, int y, int x); +void acquirement(int y1, int x1, int num, bool_ great, bool_ known); +void combine_pack(void); +void reorder_pack(void); +void random_artifact_resistance(object_type * o_ptr); +s16b floor_carry(int y, int x, object_type *j_ptr); +void pack_decay(int item); +void floor_decay(int item); +s16b m_bonus(int max, int level); +s32b flag_cost(object_type const *o_ptr, int plusses); diff --git a/src/powers.hpp b/src/powers.hpp index fcb39ef3..aa24e7d0 100644 --- a/src/powers.hpp +++ b/src/powers.hpp @@ -1,6 +1,6 @@ #pragma once -extern void do_cmd_power(); +void do_cmd_power(); /* * Powers (mutation, activations, ...) diff --git a/src/q_bounty.hpp b/src/q_bounty.hpp index 960a391b..e4ebe084 100644 --- a/src/q_bounty.hpp +++ b/src/q_bounty.hpp @@ -4,7 +4,7 @@ #include -extern bool_ quest_bounty_init_hook(); -extern bool_ quest_bounty_drop_item(); -extern bool_ quest_bounty_get_item(); -extern std::string quest_bounty_describe(); +bool_ quest_bounty_init_hook(); +bool_ quest_bounty_drop_item(); +bool_ quest_bounty_get_item(); +std::string quest_bounty_describe(); diff --git a/src/q_fireprof.hpp b/src/q_fireprof.hpp index 7c897954..39b319e5 100644 --- a/src/q_fireprof.hpp +++ b/src/q_fireprof.hpp @@ -4,6 +4,6 @@ #include -extern void quest_fireproof_building(bool_ *paid, bool_ *recreate); -extern bool_ quest_fireproof_init_hook(); -extern std::string quest_fireproof_describe(); +void quest_fireproof_building(bool_ *paid, bool_ *recreate); +bool_ quest_fireproof_init_hook(); +std::string quest_fireproof_describe(); diff --git a/src/q_thrain.hpp b/src/q_thrain.hpp index ab69102f..4e269357 100644 --- a/src/q_thrain.hpp +++ b/src/q_thrain.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -extern bool_ quest_thrain_init_hook(); +bool_ quest_thrain_init_hook(); diff --git a/src/quest.hpp b/src/quest.hpp index 7ff3cd3c..1897bcfa 100644 --- a/src/quest.hpp +++ b/src/quest.hpp @@ -1,3 +1,3 @@ #pragma once -extern void init_hooks_quests(); +void init_hooks_quests(); diff --git a/src/randart.hpp b/src/randart.hpp index 385ee2a5..99e4b9b8 100644 --- a/src/randart.hpp +++ b/src/randart.hpp @@ -3,6 +3,6 @@ #include "h-basic.h" #include "object_type_fwd.hpp" -extern void build_prob(cptr learn); -extern bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name); -extern bool_ artifact_scroll(void); +void build_prob(cptr learn); +bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name); +bool_ artifact_scroll(void); diff --git a/src/skills.hpp b/src/skills.hpp index 4872d448..edb96796 100644 --- a/src/skills.hpp +++ b/src/skills.hpp @@ -5,24 +5,24 @@ #include /* Skill functions */ -extern void dump_skills(FILE *fff); -extern s16b find_skill(cptr name); -extern s16b find_skill_i(cptr name); -extern s16b get_skill(int skill); -extern s16b get_skill_scale(int skill, u32b scale); -extern void do_cmd_skill(void); -extern void do_cmd_activate_skill(void); -extern cptr get_melee_name(); -extern s16b get_melee_skills(void); -extern s16b get_melee_skill(void); -extern bool_ forbid_gloves(void); -extern bool_ forbid_non_blessed(void); -extern void compute_skills(s32b *v, s32b *m, std::size_t i); -extern void select_default_melee(void); -extern void do_get_new_skill(void); -extern void init_skill(s32b value, s32b mod, std::size_t i); -extern s16b find_ability(cptr name); -extern void dump_abilities(FILE *fff); -extern void do_cmd_ability(void); -extern void apply_level_abilities(int level); -extern void recalc_skills(bool_ init); +void dump_skills(FILE *fff); +s16b find_skill(cptr name); +s16b find_skill_i(cptr name); +s16b get_skill(int skill); +s16b get_skill_scale(int skill, u32b scale); +void do_cmd_skill(void); +void do_cmd_activate_skill(void); +cptr get_melee_name(); +s16b get_melee_skills(void); +s16b get_melee_skill(void); +bool_ forbid_gloves(void); +bool_ forbid_non_blessed(void); +void compute_skills(s32b *v, s32b *m, std::size_t i); +void select_default_melee(void); +void do_get_new_skill(void); +void init_skill(s32b value, s32b mod, std::size_t i); +s16b find_ability(cptr name); +void dump_abilities(FILE *fff); +void do_cmd_ability(void); +void apply_level_abilities(int level); +void recalc_skills(bool_ init); diff --git a/src/spells1.hpp b/src/spells1.hpp index b67f73bb..a2996bf8 100644 --- a/src/spells1.hpp +++ b/src/spells1.hpp @@ -5,32 +5,32 @@ #include "h-basic.h" #include "random_spell_fwd.hpp" -extern byte spell_color(int type); -extern s16b poly_r_idx(int r_idx); -extern void get_pos_player(int dis, int *ny, int *nx); +byte spell_color(int type); +s16b poly_r_idx(int r_idx); +void get_pos_player(int dis, int *ny, int *nx); extern bool_ teleport_player_bypass; -extern void teleport_player_directed(int rad, int dir); -extern void teleport_away(int m_idx, int dis); -extern void teleport_player(int dis); -extern void teleport_player_to(int ny, int nx); -extern void teleport_monster_to(int m_idx, int ny, int nx); -extern void teleport_player_level(void); -extern void recall_player(int d, int f); -extern void take_hit(int damage, cptr kb_str); -extern void take_sanity_hit(int damage, cptr hit_from); -extern void acid_dam(int dam, cptr kb_str); -extern void elec_dam(int dam, cptr kb_str); -extern void fire_dam(int dam, cptr kb_str); -extern void cold_dam(int dam, cptr kb_str); -extern bool_ dec_stat(int stat, int amount, int mode); -extern bool_ res_stat(int stat, bool_ full); -extern bool_ apply_disenchant(int mode); -extern bool_ project_m(int who, int r, int y, int x, int dam, int typ); -extern bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg); -extern bool_ potion_smash_effect(int who, int y, int x, int o_sval); -extern void do_poly_self(void); -extern void corrupt_player(void); -extern std::string name_spell(random_spell const *); -extern void generate_spell(int plev); +void teleport_player_directed(int rad, int dir); +void teleport_away(int m_idx, int dis); +void teleport_player(int dis); +void teleport_player_to(int ny, int nx); +void teleport_monster_to(int m_idx, int ny, int nx); +void teleport_player_level(void); +void recall_player(int d, int f); +void take_hit(int damage, cptr kb_str); +void take_sanity_hit(int damage, cptr hit_from); +void acid_dam(int dam, cptr kb_str); +void elec_dam(int dam, cptr kb_str); +void fire_dam(int dam, cptr kb_str); +void cold_dam(int dam, cptr kb_str); +bool_ dec_stat(int stat, int amount, int mode); +bool_ res_stat(int stat, bool_ full); +bool_ apply_disenchant(int mode); +bool_ project_m(int who, int r, int y, int x, int dam, int typ); +bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg); +bool_ potion_smash_effect(int who, int y, int x, int o_sval); +void do_poly_self(void); +void corrupt_player(void); +std::string name_spell(random_spell const *); +void generate_spell(int plev); extern bool_ unsafe; -extern s16b do_poly_monster(int y, int x); +s16b do_poly_monster(int y, int x); diff --git a/src/spells2.hpp b/src/spells2.hpp index 13f2790e..45b3cd7e 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -6,107 +6,107 @@ #include "object_filter.hpp" #include "object_type_fwd.hpp" -extern void curse_artifact(object_type * o_ptr); -extern void grow_things(s16b type, int rad); -extern void grow_grass(int rad); -extern void grow_trees(int rad); -extern bool_ hp_player(int num); -extern bool_ heal_insanity(int val); -extern void warding_glyph(void); -extern void explosive_rune(void); -extern bool_ do_dec_stat(int stat, int mode); -extern bool_ do_res_stat(int stat, bool_ full); -extern bool_ do_inc_stat(int stat); -extern void identify_hooks(int i, object_type *o_ptr, identify_mode type); -extern bool_ identify_pack(void); -extern void identify_pack_fully(void); -extern bool_ remove_curse(void); -extern bool_ remove_all_curse(void); -extern bool_ restore_level(void); -extern bool_ lose_all_info(void); -extern bool_ detect_traps(int rad); -extern bool_ detect_doors(int rad); -extern bool_ detect_stairs(int rad); -extern bool_ detect_treasure(int rad); -extern bool detect_objects_gold(int rad); -extern bool detect_objects_normal(int rad); -extern bool_ detect_monsters_normal(int rad); -extern bool_ detect_monsters_invis(int rad); -extern void detect_monsters_orcs(int rad); -extern bool_ detect_all(int rad); -extern void stair_creation(void); -extern bool_ wall_stone(int y, int x); -extern bool_ enchant(object_type *o_ptr, int n, int eflag); -extern bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval); -extern bool_ ident_spell(void); -extern bool_ ident_all(void); -extern bool_ identify_fully(void); -extern bool_ recharge(int num); -extern void aggravate_monsters(int who); -extern bool_ genocide_aux(bool_ player_cast, char typ); -extern bool_ genocide(bool_ player_cast); -extern bool_ mass_genocide(bool_ player_cast); -extern void change_wild_mode(void); -extern bool_ banish_evil(int dist); -extern bool_ dispel_evil(int dam); -extern bool_ dispel_good(int dam); -extern bool_ dispel_undead(int dam); -extern bool_ dispel_monsters(int dam); -extern void destroy_area(int y1, int x1, int r); -extern void earthquake(int cy, int cx, int r); -extern void lite_room(int y1, int x1); -extern void unlite_room(int y1, int x1); -extern bool_ lite_area(int dam, int rad); -extern bool_ unlite_area(int dam, int rad); -extern bool_ fire_cloud(int typ, int dir, int dam, int rad, int time); -extern bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff); -extern bool_ fire_wall(int typ, int dir, int dam, int time); -extern bool_ fire_ball(int typ, int dir, int dam, int rad); -extern bool_ fire_bolt(int typ, int dir, int dam); -extern bool_ fire_beam(int typ, int dir, int dam); -extern void call_chaos(void); -extern bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam); -extern bool_ lite_line(int dir); -extern bool_ drain_life(int dir, int dam); -extern bool_ wall_to_mud(int dir); -extern bool_ wizard_lock(int dir); -extern bool_ slow_monster(int dir); -extern bool_ sleep_monster(int dir); -extern bool_ confuse_monster(int dir, int plev); -extern bool_ fear_monster(int dir, int plev); -extern bool_ poly_monster(int dir); -extern bool_ teleport_monster(int dir); -extern bool_ trap_creation(void); -extern bool_ destroy_doors_touch(void); -extern bool_ destroy_traps_touch(void); -extern bool_ sleep_monsters_touch(void); -extern bool_ alchemy(void); -extern void activate_ty_curse(void); -extern void activate_dg_curse(void); -extern void summon_cyber(void); -extern bool_ confuse_monsters(int dam); -extern bool_ charm_monsters(int dam); -extern bool_ charm_animals(int dam); -extern bool_ stun_monsters(int dam); -extern bool_ banish_monsters(int dist); -extern bool_ turn_monsters(int dam); -extern bool_ charm_monster(int dir, int plev); -extern bool_ control_one_undead(int dir, int plev); -extern bool_ charm_animal(int dir, int plev); -extern bool_ mindblast_monsters(int dam); -extern void alter_reality(void); -extern void report_magics(void); -extern void teleport_swap(int dir); -extern void swap_position(int lty, int ltx); -extern object_filter_t const &item_tester_hook_recharge(); -extern bool_ project_hack(int typ, int dam); -extern void project_meteor(int radius, int typ, int dam, u32b flg); -extern object_filter_t const &item_tester_hook_artifactable(); -extern bool_ passwall(int dir, bool_ safe); -extern bool_ project_hook(int typ, int dir, int dam, int flg); -extern bool_ reset_recall(bool_ no_trepas_max_depth); -extern void geomancy_random_wall(int y, int x); -extern void geomancy_random_floor(int y, int x, bool_ kill_wall); -extern void geomancy_dig(int oy, int ox, int dir, int length); -extern void channel_the_elements(int y, int x, int level); -extern void random_resistance(object_type *o_ptr, int specific); +void curse_artifact(object_type * o_ptr); +void grow_things(s16b type, int rad); +void grow_grass(int rad); +void grow_trees(int rad); +bool_ hp_player(int num); +bool_ heal_insanity(int val); +void warding_glyph(void); +void explosive_rune(void); +bool_ do_dec_stat(int stat, int mode); +bool_ do_res_stat(int stat, bool_ full); +bool_ do_inc_stat(int stat); +void identify_hooks(int i, object_type *o_ptr, identify_mode type); +bool_ identify_pack(void); +void identify_pack_fully(void); +bool_ remove_curse(void); +bool_ remove_all_curse(void); +bool_ restore_level(void); +bool_ lose_all_info(void); +bool_ detect_traps(int rad); +bool_ detect_doors(int rad); +bool_ detect_stairs(int rad); +bool_ detect_treasure(int rad); +bool detect_objects_gold(int rad); +bool detect_objects_normal(int rad); +bool_ detect_monsters_normal(int rad); +bool_ detect_monsters_invis(int rad); +void detect_monsters_orcs(int rad); +bool_ detect_all(int rad); +void stair_creation(void); +bool_ wall_stone(int y, int x); +bool_ enchant(object_type *o_ptr, int n, int eflag); +bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval); +bool_ ident_spell(void); +bool_ ident_all(void); +bool_ identify_fully(void); +bool_ recharge(int num); +void aggravate_monsters(int who); +bool_ genocide_aux(bool_ player_cast, char typ); +bool_ genocide(bool_ player_cast); +bool_ mass_genocide(bool_ player_cast); +void change_wild_mode(void); +bool_ banish_evil(int dist); +bool_ dispel_evil(int dam); +bool_ dispel_good(int dam); +bool_ dispel_undead(int dam); +bool_ dispel_monsters(int dam); +void destroy_area(int y1, int x1, int r); +void earthquake(int cy, int cx, int r); +void lite_room(int y1, int x1); +void unlite_room(int y1, int x1); +bool_ lite_area(int dam, int rad); +bool_ unlite_area(int dam, int rad); +bool_ fire_cloud(int typ, int dir, int dam, int rad, int time); +bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff); +bool_ fire_wall(int typ, int dir, int dam, int time); +bool_ fire_ball(int typ, int dir, int dam, int rad); +bool_ fire_bolt(int typ, int dir, int dam); +bool_ fire_beam(int typ, int dir, int dam); +void call_chaos(void); +bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam); +bool_ lite_line(int dir); +bool_ drain_life(int dir, int dam); +bool_ wall_to_mud(int dir); +bool_ wizard_lock(int dir); +bool_ slow_monster(int dir); +bool_ sleep_monster(int dir); +bool_ confuse_monster(int dir, int plev); +bool_ fear_monster(int dir, int plev); +bool_ poly_monster(int dir); +bool_ teleport_monster(int dir); +bool_ trap_creation(void); +bool_ destroy_doors_touch(void); +bool_ destroy_traps_touch(void); +bool_ sleep_monsters_touch(void); +bool_ alchemy(void); +void activate_ty_curse(void); +void activate_dg_curse(void); +void summon_cyber(void); +bool_ confuse_monsters(int dam); +bool_ charm_monsters(int dam); +bool_ charm_animals(int dam); +bool_ stun_monsters(int dam); +bool_ banish_monsters(int dist); +bool_ turn_monsters(int dam); +bool_ charm_monster(int dir, int plev); +bool_ control_one_undead(int dir, int plev); +bool_ charm_animal(int dir, int plev); +bool_ mindblast_monsters(int dam); +void alter_reality(void); +void report_magics(void); +void teleport_swap(int dir); +void swap_position(int lty, int ltx); +object_filter_t const &item_tester_hook_recharge(); +bool_ project_hack(int typ, int dam); +void project_meteor(int radius, int typ, int dam, u32b flg); +object_filter_t const &item_tester_hook_artifactable(); +bool_ passwall(int dir, bool_ safe); +bool_ project_hook(int typ, int dir, int dam, int flg); +bool_ reset_recall(bool_ no_trepas_max_depth); +void geomancy_random_wall(int y, int x); +void geomancy_random_floor(int y, int x, bool_ kill_wall); +void geomancy_dig(int oy, int ox, int dir, int length); +void channel_the_elements(int y, int x, int level); +void random_resistance(object_type *o_ptr, int specific); diff --git a/src/squeltch.hpp b/src/squeltch.hpp index 65ddfb51..d0ec8b8c 100644 --- a/src/squeltch.hpp +++ b/src/squeltch.hpp @@ -4,10 +4,10 @@ #include "object_type_fwd.hpp" #include -extern void squeltch_inventory(void); -extern void squeltch_grid(void); -extern void do_cmd_automatizer(void); -extern void automatizer_add_rule(object_type *o_ptr); +void squeltch_inventory(void); +void squeltch_grid(void); +void do_cmd_automatizer(void); +void automatizer_add_rule(object_type *o_ptr); extern bool_ automatizer_create; -extern void automatizer_init(); -extern bool automatizer_load(boost::filesystem::path const &path); +void automatizer_init(); +bool automatizer_load(boost::filesystem::path const &path); diff --git a/src/store.hpp b/src/store.hpp index f67d94eb..0f189167 100644 --- a/src/store.hpp +++ b/src/store.hpp @@ -1,12 +1,12 @@ #pragma once -extern void do_cmd_store(); -extern void store_shuffle(int which); -extern void store_maint(int town_num, int store_num); -extern void store_init(int town_num, int store_num); -extern void do_cmd_home_trump(); -extern void store_sell(); -extern void store_purchase(); -extern void store_examine(); -extern void store_stole(); -extern void store_prt_gold(); +void do_cmd_store(); +void store_shuffle(int which); +void store_maint(int town_num, int store_num); +void store_init(int town_num, int store_num); +void do_cmd_home_trump(); +void store_sell(); +void store_purchase(); +void store_examine(); +void store_stole(); +void store_prt_gold(); diff --git a/src/tables.cc b/src/tables.cc index 22e9a98b..1caa4bcf 100644 --- a/src/tables.cc +++ b/src/tables.cc @@ -2332,7 +2332,7 @@ cptr sense_desc[] = * Flags 4, * ESP, */ -extern std::vector const &flags_groups() +std::vector const &flags_groups() { static auto *instance = new std::vector { flags_group { diff --git a/src/tables.hpp b/src/tables.hpp index 58dfaae2..613dbddb 100644 --- a/src/tables.hpp +++ b/src/tables.hpp @@ -63,7 +63,7 @@ extern tactic_info_type tactic_info[9]; extern activation activation_info[MAX_T_ACT]; extern inscription_info_type inscription_info[MAX_INSCRIPTIONS]; extern cptr sense_desc[]; -extern std::vector const &flags_groups(); +std::vector const &flags_groups(); extern power_type powers_type[POWER_MAX]; extern cptr artifact_names_list; extern monster_power monster_powers[MONSTER_POWERS_MAX]; diff --git a/src/util.cc b/src/util.cc index ce791015..f049d79c 100644 --- a/src/util.cc +++ b/src/util.cc @@ -2349,7 +2349,7 @@ static int complete_command(char *buf, int clen, int mlen) } -extern bool askfor_aux(std::string *buf, std::size_t max_len) +bool askfor_aux(std::string *buf, std::size_t max_len) { // Buffer char cstr[1024]; diff --git a/src/util.h b/src/util.h index 6d9d4655..e341a058 100644 --- a/src/util.h +++ b/src/util.h @@ -7,12 +7,12 @@ extern "C" { #endif -extern errr path_build(char *buf, int max, cptr path, cptr file); -extern void bell(void); -extern errr macro_add(cptr pat, cptr act); -extern sint macro_find_exact(cptr pat); -extern char inkey(void); -extern void prt(cptr str, int row, int col); +errr path_build(char *buf, int max, cptr path, cptr file); +void bell(void); +errr macro_add(cptr pat, cptr act); +sint macro_find_exact(cptr pat); +char inkey(void); +void prt(cptr str, int row, int col); #ifdef __cplusplus } // extern "C" diff --git a/src/util.hpp b/src/util.hpp index cc896e69..e57235a9 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -8,78 +8,78 @@ #define MAX_IGNORE_KEYMAPS 12 -extern bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max); -extern std::string input_box_auto(std::string const &title, std::size_t max); -extern bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max); -extern void draw_box(int y, int x, int h, int w); -extern void display_list(int y, int x, int h, int w, cptr title, std::vector const &list, std::size_t begin, std::size_t sel, byte sel_color); -extern std::string get_player_race_name(int pr, int ps); -extern std::string get_day(s32b day); -extern s32b bst(s32b what, s32b t); -extern FILE *my_fopen(cptr file, cptr mode); -extern errr my_fgets(FILE *fff, char *buf, huge n); -extern errr my_fclose(FILE *fff); -extern errr fd_kill(cptr file); -extern errr fd_move(cptr file, cptr what); -extern int fd_make(cptr file, int mode); -extern int fd_open(cptr file, int flags); -extern errr fd_seek(int fd, huge n); -extern errr fd_read(int fd, char *buf, huge n); -extern errr fd_write(int fd, cptr buf, huge n); -extern errr fd_close(int fd); -extern void flush(void); -extern void flush_on_failure(); -extern void move_cursor(int row, int col); -extern void text_to_ascii(char *buf, cptr str); -extern void ascii_to_text(char *buf, cptr str); -extern char inkey_scan(void); -extern void display_message(int x, int y, int split, byte color, cptr t); -extern void cmsg_print(byte color, cptr msg); -extern void msg_print(cptr msg); -extern void cmsg_format(byte color, cptr fmt, ...); -extern void msg_format(cptr fmt, ...); -extern void screen_save(void); -extern void screen_load(void); -extern void c_put_str(byte attr, cptr str, int row, int col); -extern void c_put_str(byte attr, std::string const &str, int row, int col); -extern void put_str(cptr str, int row, int col); -extern void put_str(std::string const &s, int row, int col); -extern void c_prt(byte attr, cptr str, int row, int col); -extern void c_prt(byte attr, std::string const &s, int row, int col); -extern void prt(std::string const &s, int row, int col); -extern void text_out_to_screen(byte a, cptr str); -extern void text_out_to_file(byte a, cptr str); -extern void text_out(cptr str); -extern void text_out_c(byte a, cptr str); -extern void clear_from(int row); -extern int ask_menu(cptr ask, const std::vector &items); -extern bool askfor_aux(std::string *buf, std::size_t max_len); -extern bool_ askfor_aux(char *buf, int len); -extern bool_ askfor_aux_with_completion(char *buf, int len); -extern bool_ get_string(cptr prompt, char *buf, int len); -extern bool_ get_check(cptr prompt); -extern bool_ get_com(cptr prompt, char *command); -extern s32b get_quantity(cptr prompt, s32b max); +bool input_box(std::string const &text, int y, int x, std::string *buf, std::size_t max); +std::string input_box_auto(std::string const &title, std::size_t max); +bool input_box_auto(std::string const &prompt, std::string *buf, std::size_t max); +void draw_box(int y, int x, int h, int w); +void display_list(int y, int x, int h, int w, cptr title, std::vector const &list, std::size_t begin, std::size_t sel, byte sel_color); +std::string get_player_race_name(int pr, int ps); +std::string get_day(s32b day); +s32b bst(s32b what, s32b t); +FILE *my_fopen(cptr file, cptr mode); +errr my_fgets(FILE *fff, char *buf, huge n); +errr my_fclose(FILE *fff); +errr fd_kill(cptr file); +errr fd_move(cptr file, cptr what); +int fd_make(cptr file, int mode); +int fd_open(cptr file, int flags); +errr fd_seek(int fd, huge n); +errr fd_read(int fd, char *buf, huge n); +errr fd_write(int fd, cptr buf, huge n); +errr fd_close(int fd); +void flush(void); +void flush_on_failure(); +void move_cursor(int row, int col); +void text_to_ascii(char *buf, cptr str); +void ascii_to_text(char *buf, cptr str); +char inkey_scan(void); +void display_message(int x, int y, int split, byte color, cptr t); +void cmsg_print(byte color, cptr msg); +void msg_print(cptr msg); +void cmsg_format(byte color, cptr fmt, ...); +void msg_format(cptr fmt, ...); +void screen_save(void); +void screen_load(void); +void c_put_str(byte attr, cptr str, int row, int col); +void c_put_str(byte attr, std::string const &str, int row, int col); +void put_str(cptr str, int row, int col); +void put_str(std::string const &s, int row, int col); +void c_prt(byte attr, cptr str, int row, int col); +void c_prt(byte attr, std::string const &s, int row, int col); +void prt(std::string const &s, int row, int col); +void text_out_to_screen(byte a, cptr str); +void text_out_to_file(byte a, cptr str); +void text_out(cptr str); +void text_out_c(byte a, cptr str); +void clear_from(int row); +int ask_menu(cptr ask, const std::vector &items); +bool askfor_aux(std::string *buf, std::size_t max_len); +bool_ askfor_aux(char *buf, int len); +bool_ askfor_aux_with_completion(char *buf, int len); +bool_ get_string(cptr prompt, char *buf, int len); +bool_ get_check(cptr prompt); +bool_ get_com(cptr prompt, char *command); +s32b get_quantity(cptr prompt, s32b max); extern char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS]; extern bool_ request_command_inven_mode; -extern void request_command(int shopping); -extern bool_ is_a_vowel(int ch); -extern int get_keymap_dir(char ch); -extern byte count_bits(u32b array); -extern void strlower(char *buf); -extern int test_monster_name(cptr name); -extern int test_mego_name(cptr name); -extern int test_item_name(cptr name); -extern char msg_box_auto(std::string const &title); -extern timer_type *new_timer(void (*callback)(), s32b delay); -extern int get_keymap_mode(); -extern void repeat_push(int what); -extern bool_ repeat_pull(int *what); -extern void repeat_check(void); -extern void get_count(int number, int max); -extern bool in_bounds(int y, int x); -extern bool in_bounds2(int y, int x); -extern bool panel_contains(int y, int x); -extern errr path_parse(char *buf, int max, cptr file); -extern void pause_line(int row); -extern std::string user_name(); +void request_command(int shopping); +bool_ is_a_vowel(int ch); +int get_keymap_dir(char ch); +byte count_bits(u32b array); +void strlower(char *buf); +int test_monster_name(cptr name); +int test_mego_name(cptr name); +int test_item_name(cptr name); +char msg_box_auto(std::string const &title); +timer_type *new_timer(void (*callback)(), s32b delay); +int get_keymap_mode(); +void repeat_push(int what); +bool_ repeat_pull(int *what); +void repeat_check(void); +void get_count(int number, int max); +bool in_bounds(int y, int x); +bool in_bounds2(int y, int x); +bool panel_contains(int y, int x); +errr path_parse(char *buf, int max, cptr file); +void pause_line(int row); +std::string user_name(); diff --git a/src/variable.hpp b/src/variable.hpp index ebbca153..38db36b4 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -35,7 +35,7 @@ extern char *macro_trigger_keycode[2][MAX_MACRO_TRIG]; extern bool_ character_dungeon; extern bool_ character_loaded; extern bool_ character_xtra; -extern seed_t &seed_flavor(); +seed_t &seed_flavor(); extern s16b command_cmd; extern s16b command_arg; extern s16b command_rep; @@ -198,7 +198,7 @@ extern s32b DUNGEON_ASTRAL_WILD_X; extern s32b DUNGEON_ASTRAL_WILD_Y; extern deity_type deity_info[MAX_GODS]; extern timer_type *gl_timers; -extern const char *get_version_string(); +const char *get_version_string(); extern bool_ arg_wizard; extern bool_ arg_force_original; extern bool_ arg_force_roguelike; diff --git a/src/wild.hpp b/src/wild.hpp index 4cd9f0e7..54dd9526 100644 --- a/src/wild.hpp +++ b/src/wild.hpp @@ -1,6 +1,6 @@ #pragma once -extern void wilderness_gen(); -extern void wilderness_gen_small(void); -extern void reveal_wilderness_around_player(int y, int x, int h, int w); -extern void town_gen(int t_idx); +void wilderness_gen(); +void wilderness_gen_small(void); +void reveal_wilderness_around_player(int y, int x, int h, int w); +void town_gen(int t_idx); diff --git a/src/wizard2.hpp b/src/wizard2.hpp index d1061d45..b406c9ef 100644 --- a/src/wizard2.hpp +++ b/src/wizard2.hpp @@ -4,7 +4,7 @@ #include -extern void do_cmd_rerate(void); -extern void do_cmd_wiz_cure_all(void); -extern void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp); -extern void do_cmd_debug(); +void do_cmd_rerate(void); +void do_cmd_wiz_cure_all(void); +void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp); +void do_cmd_debug(); diff --git a/src/xtra1.hpp b/src/xtra1.hpp index 0c1b93bf..7f685fdc 100644 --- a/src/xtra1.hpp +++ b/src/xtra1.hpp @@ -6,22 +6,22 @@ #include -extern void fix_message(void); -extern void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); -extern int luck(int min, int max); -extern int weight_limit(void); +void fix_message(void); +void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); +int luck(int min, int max); +int weight_limit(void); extern bool_ calc_powers_silent; -extern void cnv_stat(int i, char *out_val); -extern s16b modify_stat_value(int value, int amount); -extern void calc_hitpoints(void); -extern void notice_stuff(void); -extern void update_stuff(void); -extern void redraw_stuff(void); -extern void window_stuff(void); -extern void handle_stuff(void); -extern bool_ monk_heavy_armor(void); -extern void calc_bonuses(bool_ silent); -extern void gain_fate(byte fate); -extern std::string fate_desc(int fate); -extern std::string dump_fates(); -extern bool race_flags_p(player_race_flag_set const &flags_mask); +void cnv_stat(int i, char *out_val); +s16b modify_stat_value(int value, int amount); +void calc_hitpoints(void); +void notice_stuff(void); +void update_stuff(void); +void redraw_stuff(void); +void window_stuff(void); +void handle_stuff(void); +bool_ monk_heavy_armor(void); +void calc_bonuses(bool_ silent); +void gain_fate(byte fate); +std::string fate_desc(int fate); +std::string dump_fates(); +bool race_flags_p(player_race_flag_set const &flags_mask); diff --git a/src/xtra2.hpp b/src/xtra2.hpp index c81bef73..b61114a4 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -7,83 +7,83 @@ #include -extern void do_rebirth(void); -extern void switch_subrace(std::size_t racem, bool_ copy_old); -extern void drop_from_wild(void); -extern bool_ set_roots(int v, s16b ac, s16b dam); -extern bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag); -extern bool_ set_parasite(int v, int r); -extern bool_ set_disrupt_shield(int v); -extern bool_ set_prob_travel(int v); -extern bool_ set_absorb_soul(int v); -extern bool_ set_tim_breath(int v, bool_ magical); -extern bool_ set_tim_precognition(int v); -extern bool_ set_tim_deadly(int v); -extern bool_ set_tim_reflect(int v); -extern bool_ set_tim_thunder(int v, int p1, int p2); -extern bool_ set_strike(int v); -extern bool_ set_tim_regen(int v, int p); -extern bool_ set_tim_ffall(int v); -extern bool_ set_tim_fly(int v); -extern bool_ set_poison(int v); -extern bool_ set_holy(int v); -extern void set_grace(s32b v); -extern bool_ set_mimic(int v, int p, int level); -extern bool_ set_no_breeders(int v); -extern bool_ set_invis(int v,int p); -extern bool_ set_lite(int v); -extern bool_ set_blind(int v); -extern bool_ set_confused(int v); -extern bool_ set_poisoned(int v); -extern bool_ set_afraid(int v); -extern bool_ set_paralyzed(int v); -extern void dec_paralyzed(); -extern bool_ set_image(int v); -extern bool_ set_fast(int v, int p); -extern bool_ set_light_speed(int v); -extern bool_ set_slow(int v); -extern bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2); -extern bool_ set_blessed(int v); -extern bool_ set_hero(int v); -extern bool_ set_shero(int v); -extern bool_ set_protevil(int v); -extern bool_ set_invuln(int v); -extern bool_ set_tim_invis(int v); -extern bool_ set_tim_infra(int v); -extern bool_ set_mental_barrier(int v); -extern bool_ set_oppose_acid(int v); -extern bool_ set_oppose_elec(int v); -extern bool_ set_oppose_fire(int v); -extern bool_ set_oppose_cold(int v); -extern bool_ set_oppose_pois(int v); -extern bool_ set_oppose_cc(int v); -extern bool_ set_stun(int v); -extern bool_ set_cut(int v); -extern bool_ set_food(int v); -extern void check_experience(void); -extern void check_experience_obj(object_type *o_ptr); -extern void gain_exp(s32b amount); -extern void lose_exp(s32b amount); -extern int get_coin_type(std::shared_ptr r_ptr); -extern void monster_death(int m_idx); -extern bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note); -extern bool_ change_panel(int dy, int dx); -extern void verify_panel(void); -extern bool_ target_okay(void); -extern bool_ target_set(int mode); -extern bool_ get_aim_dir(int *dp); -extern bool_ get_rep_dir(int *dp); -extern bool_ set_shadow(int v); -extern bool_ set_tim_esp(int v); -extern bool_ tgp_pt(int *x, int * y); -extern bool_ tgt_pt (int *x, int *y); -extern void do_poly_self(void); -extern bool_ curse_weapon(void); -extern bool_ curse_armor(void); -extern void make_wish(void); -extern void create_between_gate(int dist, int y, int x); +void do_rebirth(void); +void switch_subrace(std::size_t racem, bool_ copy_old); +void drop_from_wild(void); +bool_ set_roots(int v, s16b ac, s16b dam); +bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag); +bool_ set_parasite(int v, int r); +bool_ set_disrupt_shield(int v); +bool_ set_prob_travel(int v); +bool_ set_absorb_soul(int v); +bool_ set_tim_breath(int v, bool_ magical); +bool_ set_tim_precognition(int v); +bool_ set_tim_deadly(int v); +bool_ set_tim_reflect(int v); +bool_ set_tim_thunder(int v, int p1, int p2); +bool_ set_strike(int v); +bool_ set_tim_regen(int v, int p); +bool_ set_tim_ffall(int v); +bool_ set_tim_fly(int v); +bool_ set_poison(int v); +bool_ set_holy(int v); +void set_grace(s32b v); +bool_ set_mimic(int v, int p, int level); +bool_ set_no_breeders(int v); +bool_ set_invis(int v,int p); +bool_ set_lite(int v); +bool_ set_blind(int v); +bool_ set_confused(int v); +bool_ set_poisoned(int v); +bool_ set_afraid(int v); +bool_ set_paralyzed(int v); +void dec_paralyzed(); +bool_ set_image(int v); +bool_ set_fast(int v, int p); +bool_ set_light_speed(int v); +bool_ set_slow(int v); +bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2); +bool_ set_blessed(int v); +bool_ set_hero(int v); +bool_ set_shero(int v); +bool_ set_protevil(int v); +bool_ set_invuln(int v); +bool_ set_tim_invis(int v); +bool_ set_tim_infra(int v); +bool_ set_mental_barrier(int v); +bool_ set_oppose_acid(int v); +bool_ set_oppose_elec(int v); +bool_ set_oppose_fire(int v); +bool_ set_oppose_cold(int v); +bool_ set_oppose_pois(int v); +bool_ set_oppose_cc(int v); +bool_ set_stun(int v); +bool_ set_cut(int v); +bool_ set_food(int v); +void check_experience(void); +void check_experience_obj(object_type *o_ptr); +void gain_exp(s32b amount); +void lose_exp(s32b amount); +int get_coin_type(std::shared_ptr r_ptr); +void monster_death(int m_idx); +bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note); +bool_ change_panel(int dy, int dx); +void verify_panel(void); +bool_ target_okay(void); +bool_ target_set(int mode); +bool_ get_aim_dir(int *dp); +bool_ get_rep_dir(int *dp); +bool_ set_shadow(int v); +bool_ set_tim_esp(int v); +bool_ tgp_pt(int *x, int * y); +bool_ tgt_pt (int *x, int *y); +void do_poly_self(void); +bool_ curse_weapon(void); +bool_ curse_armor(void); +void make_wish(void); +void create_between_gate(int dist, int y, int x); extern "C" { - extern void resize_map(void); - extern void resize_window(void); + void resize_map(void); + void resize_window(void); } diff --git a/src/z-form.h b/src/z-form.h index ac49c658..f67d1484 100644 --- a/src/z-form.h +++ b/src/z-form.h @@ -21,16 +21,16 @@ extern "C" { /**** Available Functions ****/ /* Format arguments into given bounded-length buffer */ -extern uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp); +uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp); /* Simple interface to "vstrnfmt()" */ -extern uint strnfmt(char *buf, uint max, cptr fmt, ...); +uint strnfmt(char *buf, uint max, cptr fmt, ...); /* Simple interface to "vformat()" */ -extern char *format(cptr fmt, ...); +char *format(cptr fmt, ...); /* Vararg interface to "quit()", using "format()" */ -extern void quit_fmt(cptr fmt, ...); +void quit_fmt(cptr fmt, ...); #ifdef __cplusplus } /* extern "C" */ diff --git a/src/z-term.h b/src/z-term.h index 01795629..fc9c0598 100644 --- a/src/z-term.h +++ b/src/z-term.h @@ -220,46 +220,46 @@ extern term *Term; /**** Available Functions ****/ -extern errr Term_xtra(int n, int v); - -extern void Term_queue_char(int x, int y, byte a, char c); -extern void Term_queue_chars(int x, int y, int n, byte a, cptr s); - -extern errr Term_fresh(void); -extern errr Term_set_cursor(int v); -extern errr Term_gotoxy(int x, int y); -extern errr Term_draw(int x, int y, byte a, char c); -extern errr Term_addch(byte a, char c); -extern errr Term_addstr(int n, byte a, cptr s); -extern errr Term_putch(int x, int y, byte a, char c); -extern errr Term_putstr(int x, int y, int n, byte a, cptr s); -extern errr Term_erase(int x, int y, int n); -extern errr Term_clear(void); -extern errr Term_redraw(void); -extern errr Term_redraw_section(int x1, int y1, int x2, int y2); -extern void Term_bell(); - -extern errr Term_get_cursor(int *v); -extern errr Term_get_size(int *w, int *h); -extern errr Term_locate(int *x, int *y); -extern errr Term_what(int x, int y, byte *a, char *c); - -extern errr Term_flush(void); -extern errr Term_keypress(int k); -extern errr Term_key_push(int k); -extern errr Term_inkey(char *ch, bool_ wait, bool_ take); - -extern errr Term_save(void); -extern term_win* Term_save_to(void); -extern errr Term_load(void); -extern errr Term_load_from(term_win *save); - -extern errr Term_resize(int w, int h); - -extern errr Term_activate(term *t); - -extern errr term_nuke(term *t); -extern errr term_init(term *t, int w, int h, int k); +errr Term_xtra(int n, int v); + +void Term_queue_char(int x, int y, byte a, char c); +void Term_queue_chars(int x, int y, int n, byte a, cptr s); + +errr Term_fresh(void); +errr Term_set_cursor(int v); +errr Term_gotoxy(int x, int y); +errr Term_draw(int x, int y, byte a, char c); +errr Term_addch(byte a, char c); +errr Term_addstr(int n, byte a, cptr s); +errr Term_putch(int x, int y, byte a, char c); +errr Term_putstr(int x, int y, int n, byte a, cptr s); +errr Term_erase(int x, int y, int n); +errr Term_clear(void); +errr Term_redraw(void); +errr Term_redraw_section(int x1, int y1, int x2, int y2); +void Term_bell(); + +errr Term_get_cursor(int *v); +errr Term_get_size(int *w, int *h); +errr Term_locate(int *x, int *y); +errr Term_what(int x, int y, byte *a, char *c); + +errr Term_flush(void); +errr Term_keypress(int k); +errr Term_key_push(int k); +errr Term_inkey(char *ch, bool_ wait, bool_ take); + +errr Term_save(void); +term_win* Term_save_to(void); +errr Term_load(void); +errr Term_load_from(term_win *save); + +errr Term_resize(int w, int h); + +errr Term_activate(term *t); + +errr term_nuke(term *t); +errr term_init(term *t, int w, int h, int k); #ifdef __cplusplus } /* extern "C" */ diff --git a/src/z-util.h b/src/z-util.h index 914a64e7..d2fa79dc 100644 --- a/src/z-util.h +++ b/src/z-util.h @@ -21,19 +21,19 @@ extern void (*quit_aux)(cptr); /* Test equality, prefix, suffix */ -extern bool_ streq(cptr s, cptr t); -extern bool_ prefix(cptr s, cptr t); -extern bool_ suffix(cptr s, cptr t); +bool_ streq(cptr s, cptr t); +bool_ prefix(cptr s, cptr t); +bool_ suffix(cptr s, cptr t); /* Capitalize the first letter of string. Ignores whitespace at the start of string. */ -extern void capitalize(char *s); +void capitalize(char *s); /* Print an error message */ -extern void plog(cptr str); +void plog(cptr str); /* Exit, with optional message */ -extern void quit(cptr str); +void quit(cptr str); #ifdef __cplusplus -- cgit v1.2.3 From 536adca4d3937216e4c7191366ae2bd43a961f87 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove unused global variable 'unsafe' --- src/spells1.cc | 44 ++++++++++++++++++-------------------------- src/spells1.hpp | 1 - 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/spells1.cc b/src/spells1.cc index 5217a803..3c7999d1 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -6794,10 +6794,6 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } -/* Is the spell unsafe for the player ? */ -bool_ unsafe = FALSE; - - /* * Helper function for "project()" below. * @@ -6851,7 +6847,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad if ((x != p_ptr->px) || (y != p_ptr->py)) return (FALSE); /* Player cannot hurt himself */ - if ((!who) && (!unsafe)) return (FALSE); + if (!who) return (FALSE); /* Bolt attack from a monster */ if ((!a_rad) && get_skill(SKILL_DODGE) && (who > 0)) @@ -7557,30 +7553,26 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad if (dungeon_flags & DF_NO_TELEPORT) break; /* No teleport on special levels */ if (fuzzy) msg_print("You are hit by something heavy!"); msg_print("Gravity warps around you."); - if (!unsafe) - { - teleport_player(5); - if (!p_ptr->ffall) - (void)set_slow(p_ptr->slow + rand_int(4) + 4); - if (!(p_ptr->resist_sound || p_ptr->ffall)) - { - int k = (randint((dam > 90) ? 35 : (dam / 3 + 5))); - (void)set_stun(p_ptr->stun + k); - } - if (p_ptr->ffall) - { - dam = (dam * 2) / 3; - } - if ((!p_ptr->ffall) || (randint(13) == 1)) - { - inven_damage(set_cold_destroy, 2); - } + teleport_player(5); + if (!p_ptr->ffall) + (void)set_slow(p_ptr->slow + rand_int(4) + 4); + if (!(p_ptr->resist_sound || p_ptr->ffall)) + { + int k = (randint((dam > 90) ? 35 : (dam / 3 + 5))); + (void)set_stun(p_ptr->stun + k); + } + if (p_ptr->ffall) + { + dam = (dam * 2) / 3; + } - take_hit(dam, killer); + if ((!p_ptr->ffall) || (randint(13) == 1)) + { + inven_damage(set_cold_destroy, 2); } - else - teleport_player(dam); + + take_hit(dam, killer); break; } diff --git a/src/spells1.hpp b/src/spells1.hpp index a2996bf8..9760c5e9 100644 --- a/src/spells1.hpp +++ b/src/spells1.hpp @@ -32,5 +32,4 @@ void do_poly_self(void); void corrupt_player(void); std::string name_spell(random_spell const *); void generate_spell(int plev); -extern bool_ unsafe; s16b do_poly_monster(int y, int x); -- cgit v1.2.3 From 6a35e3de332df186eab39c3b67506882409a3ca2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Remove redundant (void) parameters and return value casts --- src/birth.cc | 26 ++-- src/birth.hpp | 6 +- src/bldg.cc | 10 +- src/bldg.hpp | 2 +- src/cave.cc | 32 ++--- src/cave.hpp | 26 ++-- src/cmd1.cc | 4 +- src/cmd1.hpp | 8 +- src/cmd2.cc | 36 +++--- src/cmd2.hpp | 40 +++--- src/cmd3.cc | 40 +++--- src/cmd3.hpp | 36 +++--- src/cmd4.cc | 72 +++++------ src/cmd4.hpp | 40 +++--- src/cmd5.cc | 18 +-- src/cmd5.hpp | 10 +- src/cmd6.cc | 386 +++++++++++++++++++++++++++---------------------------- src/cmd6.hpp | 22 ++-- src/cmd7.cc | 60 ++++----- src/cmd7.hpp | 28 ++-- src/dungeon.cc | 176 ++++++++++++------------- src/files.cc | 74 +++++------ src/files.h | 2 +- src/files.hpp | 14 +- src/generate.cc | 24 ++-- src/generate.hpp | 2 +- src/init1.cc | 2 +- src/init2.cc | 20 +-- src/init2.h | 2 +- src/init2.hpp | 2 +- src/levels.hpp | 8 +- src/loadsave.cc | 16 +-- src/loadsave.h | 4 +- src/loadsave.hpp | 2 +- src/main.cc | 2 +- src/melee1.cc | 8 +- src/melee2.cc | 52 ++++---- src/melee2.hpp | 2 +- src/messages.cc | 2 +- src/modules.hpp | 2 +- src/monster1.cc | 2 +- src/monster2.cc | 48 +++---- src/monster2.hpp | 8 +- src/monster3.cc | 14 +- src/monster3.hpp | 16 +-- src/notes.cc | 6 +- src/notes.hpp | 2 +- src/object1.cc | 22 ++-- src/object1.hpp | 10 +- src/object2.cc | 12 +- src/object2.hpp | 12 +- src/powers.cc | 60 ++++----- src/q_betwen.cc | 2 +- src/q_eol.cc | 2 +- src/q_hobbit.cc | 2 +- src/q_nazgul.cc | 2 +- src/q_poison.cc | 4 +- src/q_shroom.cc | 2 +- src/q_spider.cc | 2 +- src/randart.cc | 4 +- src/randart.hpp | 2 +- src/skills.hpp | 18 +-- src/spells1.cc | 70 +++++----- src/spells1.hpp | 6 +- src/spells2.cc | 102 +++++++-------- src/spells2.hpp | 48 +++---- src/squeltch.cc | 4 +- src/squeltch.hpp | 6 +- src/store.cc | 32 ++--- src/util.cc | 46 +++---- src/util.h | 4 +- src/util.hpp | 10 +- src/wild.cc | 2 +- src/wild.hpp | 2 +- src/wizard2.cc | 66 +++++----- src/wizard2.hpp | 4 +- src/xtra1.cc | 84 ++++++------ src/xtra1.hpp | 18 +-- src/xtra2.cc | 28 ++-- src/xtra2.hpp | 22 ++-- src/z-term.h | 16 +-- 81 files changed, 1070 insertions(+), 1070 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index c94fbf4d..36f319d6 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -174,7 +174,7 @@ void print_desc(cptr txt) /* * Save the current data for later */ -static void save_prev_data(void) +static void save_prev_data() { auto &previous_char = game->previous_char; @@ -318,7 +318,7 @@ static int adjust_stat(int value, int amount, int auto_roll) * * For efficiency, we include a chunk of "calc_bonuses()". */ -static void get_stats(void) +static void get_stats() { int i, j; @@ -434,7 +434,7 @@ void roll_player_hp() /* * Roll for some info that the auto-roller ignores */ -static void get_extra(void) +static void get_extra() { /* Level one */ p_ptr->max_plv = p_ptr->lev = 1; @@ -463,7 +463,7 @@ static void get_extra(void) /* * Fill the random_artifacts array with relevant info. */ -static errr init_randart(void) +static errr init_randart() { int i; @@ -502,7 +502,7 @@ static errr init_randart(void) /* * Get the player's starting money */ -static void get_money(void) +static void get_money() { /* Starting gold */ int gold = randint(100) + 300; @@ -531,7 +531,7 @@ static void get_money(void) * * See 'display_player()' for basic method. */ -static void birth_put_stats(void) +static void birth_put_stats() { int i, p; @@ -568,7 +568,7 @@ static void birth_put_stats(void) /* * Clear all the global "character" data */ -static void player_wipe(void) +static void player_wipe() { auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; @@ -770,7 +770,7 @@ static void outfit_obj(object_proto const *proto) object_aware(q_ptr); object_known(q_ptr); - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); } @@ -794,7 +794,7 @@ static void player_outfit_object(int qty, int tval, int sval) q_ptr->number = qty; object_aware(q_ptr); object_known(q_ptr); - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); } @@ -817,7 +817,7 @@ static void player_outfit_spellbook(cptr spell_name) * * Having an item makes the player "aware" of its purpose. */ -static void player_outfit(void) +static void player_outfit() { // Shorthand names for convenience cptr class_name = spp_ptr->title; @@ -980,7 +980,7 @@ static void player_outfit(void) q_ptr->timeout = rand_range(3, 7) * 500; object_aware(q_ptr); object_known(q_ptr); - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); } /* Outfit the player with starting items */ @@ -2099,7 +2099,7 @@ static const int birth_stat_costs[(18-10) + 1] = * * Taken from V 2.9.0 */ -static bool_ player_birth_aux_point(void) +static bool_ player_birth_aux_point() { int i; @@ -2682,7 +2682,7 @@ static void init_town(int t_idx) * Note that we may be called with "junk" leftover in the various * fields, so we must be sure to clear them first. */ -void player_birth(void) +void player_birth() { auto const &st_info = game->edit_data.st_info; auto &d_info = game->edit_data.d_info; diff --git a/src/birth.hpp b/src/birth.hpp index 27ad3d2b..82bdfcf6 100644 --- a/src/birth.hpp +++ b/src/birth.hpp @@ -3,9 +3,9 @@ #include "h-basic.h" void print_desc_aux(cptr txt, int y, int x); -void save_savefile_names(void); -bool_ begin_screen(void); -void player_birth(void); +void save_savefile_names(); +bool_ begin_screen(); +void player_birth(); void roll_player_hp(); extern bool_ no_begin_screen; diff --git a/src/bldg.cc b/src/bldg.cc index 8f681744..9b3750a6 100644 --- a/src/bldg.cc +++ b/src/bldg.cc @@ -551,7 +551,7 @@ static bool_ inn_comm(int cmd) { msg_print("The barkeep gives you some gruel and a beer."); msg_print(NULL); - (void) set_food(PY_FOOD_MAX - 1); + set_food(PY_FOOD_MAX - 1); } else msg_print("You're a vampire and I don't have any food for you!"); @@ -754,7 +754,7 @@ static bool_ castle_quest(int y, int x) /* * Displaying town history -KMW- */ -static void town_history(void) +static void town_history() { /* Save screen */ screen_save(); @@ -902,7 +902,7 @@ static bool item_tester_hook_melee_weapon(object_type const *o_ptr) /* * compare_weapons -KMW- */ -static bool_ compare_weapons(void) +static bool_ compare_weapons() { int item, i; @@ -1080,7 +1080,7 @@ static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac) /* * Research Item */ -static bool_ research_item(void) +static bool_ research_item() { clear_bldg(5, 18); return (identify_fully()); @@ -1425,7 +1425,7 @@ bool_ bldg_process_command(const store_type *s_ptr, store_action_type const *ba_ /* * Enter quest level */ -void enter_quest(void) +void enter_quest() { if (!(cave[p_ptr->py][p_ptr->px].feat == FEAT_QUEST_ENTER)) { diff --git a/src/bldg.hpp b/src/bldg.hpp index a55d7419..3b3412fa 100644 --- a/src/bldg.hpp +++ b/src/bldg.hpp @@ -7,4 +7,4 @@ bool_ bldg_process_command(store_type const *s_ptr, store_action_type const *action); void show_building(store_type const *s_ptr); bool_ is_state(store_type const *s_ptr, int state); -void enter_quest(void); +void enter_quest(); diff --git a/src/cave.cc b/src/cave.cc index 4e804d81..cad1506e 100644 --- a/src/cave.cc +++ b/src/cave.cc @@ -358,7 +358,7 @@ bool_ los(int y1, int x1, int y2, int x2) /* * Returns true if the player's grid is dark */ -bool_ no_lite(void) +bool_ no_lite() { return (!player_can_see_bold(p_ptr->py, p_ptr->px)); } @@ -1781,17 +1781,17 @@ void lite_spot(int y, int x) * of both "lite_spot()" and "print_rel()", and that we use the * "lite_spot()" function to display the player grid, if needed. */ -void prt_map(void) +void prt_map() { int x, y; int v; /* Access the cursor state */ - (void)Term_get_cursor(&v); + Term_get_cursor(&v); /* Hide the cursor */ - (void)Term_set_cursor(0); + Term_set_cursor(0); /* Dump the map */ for (y = panel_row_min; y <= panel_row_max; y++) @@ -1814,7 +1814,7 @@ void prt_map(void) lite_spot(p_ptr->py, p_ptr->px); /* Restore the cursor */ - (void)Term_set_cursor(v); + Term_set_cursor(v); } @@ -2098,7 +2098,7 @@ void display_map(int *cy, int *cx) * * Currently, the "player" is displayed on the map. XXX XXX XXX */ -void do_cmd_view_map(void) +void do_cmd_view_map() { int cy, cx; int wid, hgt; @@ -2761,7 +2761,7 @@ static void vinfo_init_aux(vinfo_hack *hack, int y, int x, long m) * a number which is too high, running this function, and using the * error messages to obtain the correct values. */ -errr vinfo_init(void) +errr vinfo_init() { int i, y, x; @@ -2983,7 +2983,7 @@ errr vinfo_init(void) /* * Forget the "CAVE_VIEW" grids, redrawing as needed */ -void forget_view(void) +void forget_view() { int i; @@ -3091,7 +3091,7 @@ void forget_view(void) * special grids. Because the actual number of required grids is bizarre, * we simply allocate twice as many as we would normally need. XXX XXX XXX */ -void update_view(void) +void update_view() { int i, o; int y, x; @@ -3410,7 +3410,7 @@ void update_view(void) /* * Clear monster light */ -void forget_mon_lite(void) +void forget_mon_lite() { int i, y, x; @@ -3475,7 +3475,7 @@ void forget_mon_lite(void) * or brighter light, and it doesn't work well with PernAngband's already * colourful terrain features in aesthetically pleasing ways... -- pelpel */ -void update_mon_lite(void) +void update_mon_lite() { auto const &f_info = game->edit_data.f_info; @@ -3791,7 +3791,7 @@ static void update_flow_aux(int y, int x, int n) * We do not need a priority queue because the cost from grid * to grid is always "one" and we process them in order. */ -void update_flow(void) +void update_flow() { int x, y, d; @@ -3859,7 +3859,7 @@ void update_flow(void) /* * Hack -- map the current panel (plus some) ala "magic mapping" */ -void map_area(void) +void map_area() { /* Scan the whole map */ for (int y = 1; y < cur_hgt - 1; y++) @@ -3919,7 +3919,7 @@ void map_area(void) * since this would prevent the use of "view_torch_grids" as a method to * keep track of what grids have been observed directly. */ -void wiz_lite(void) +void wiz_lite() { int i, y, x; @@ -4002,7 +4002,7 @@ void wiz_lite(void) p_ptr->window |= (PW_OVERHEAD); } -void wiz_lite_extra(void) +void wiz_lite_extra() { int y, x; for (y = 0; y < cur_hgt; y++) @@ -4018,7 +4018,7 @@ void wiz_lite_extra(void) /* * Forget the dungeon map (ala "Thinking of Maud..."). */ -void wiz_dark(void) +void wiz_dark() { int i, y, x; diff --git a/src/cave.hpp b/src/cave.hpp index a014279f..ce1631a1 100644 --- a/src/cave.hpp +++ b/src/cave.hpp @@ -7,25 +7,25 @@ int distance(int y1, int x1, int y2, int x2); bool_ los(int y1, int x1, int y2, int x2); bool_ cave_valid_bold(int y, int x); -bool_ no_lite(void); +bool_ no_lite(); void map_info_default(int y, int x, byte *ap, char *cp); void move_cursor_relative(int row, int col); void print_rel(char c, byte a, int y, int x); void note_spot(int y, int x); void lite_spot(int y, int x); -void prt_map(void); +void prt_map(); void display_map(int *cy, int *cx); -void do_cmd_view_map(void); -errr vinfo_init(void); -void forget_view(void); -void update_view(void); -void forget_mon_lite(void); -void update_mon_lite(void); -void update_flow(void); -void map_area(void); -void wiz_lite(void); -void wiz_lite_extra(void); -void wiz_dark(void); +void do_cmd_view_map(); +errr vinfo_init(); +void forget_view(); +void update_view(); +void forget_mon_lite(); +void update_mon_lite(); +void update_flow(); +void map_area(); +void wiz_lite(); +void wiz_lite_extra(); +void wiz_dark(); void cave_set_feat(int y, int x, int feat); void place_floor(int y, int x); void place_floor_convert_glass(int y, int x); diff --git a/src/cmd1.cc b/src/cmd1.cc index 6b2214c3..13edf0ff 100644 --- a/src/cmd1.cc +++ b/src/cmd1.cc @@ -3417,7 +3417,7 @@ static void run_init(int dir) * * Return TRUE if the running should be stopped */ -static bool_ run_test(void) +static bool_ run_test() { auto const &f_info = game->edit_data.f_info; @@ -3835,7 +3835,7 @@ void run_step(int dir) /* * Issue a pet command */ -void do_cmd_pet(void) +void do_cmd_pet() { auto const &r_info = game->edit_data.r_info; diff --git a/src/cmd1.hpp b/src/cmd1.hpp index 3d5d72b8..19b40ebf 100644 --- a/src/cmd1.hpp +++ b/src/cmd1.hpp @@ -10,16 +10,16 @@ bool_ test_hit_norm(int chance, int ac, int vis); s16b critical_shot(int weight, int plus, int dam, int skill); s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit); s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special); -void search(void); +void search(); void carry(int pickup); void py_attack(int y, int x, int max_blow); bool_ player_can_enter(byte feature); void move_player(int dir, int do_pickup); void move_player_aux(int dir, int do_pickup, int run); void run_step(int dir); -void do_cmd_pet(void); +void do_cmd_pet(); void do_cmd_integrate_body(); bool_ do_cmd_leave_body(bool_ drop_body); bool_ execute_inscription(byte i, byte y, byte x); -void do_cmd_engrave(void); -void do_spin(void); +void do_cmd_engrave(); +void do_spin(); diff --git a/src/cmd2.cc b/src/cmd2.cc index 11e70583..e3d7cafe 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -60,7 +60,7 @@ using std::this_thread::sleep_for; using std::chrono::milliseconds; -void do_cmd_immovable_special(void); +void do_cmd_immovable_special(); /* * Try to bash an altar @@ -162,7 +162,7 @@ static bool ask_leave() /* * Go up one level */ -void do_cmd_go_up(void) +void do_cmd_go_up() { auto const &d_info = game->edit_data.d_info; @@ -314,7 +314,7 @@ void do_cmd_go_up(void) /* * Returns TRUE if we are in the Between... */ -static bool_ between_effect(void) +static bool_ between_effect() { byte bx, by; @@ -358,7 +358,7 @@ static bool_ between_effect(void) /* * Go down one level */ -void do_cmd_go_down(void) +void do_cmd_go_down() { auto const &d_info = game->edit_data.d_info; @@ -1005,7 +1005,7 @@ static bool_ do_cmd_open_aux(int y, int x, int dir) * * Unlocking a locked door/chest is worth one experience point. */ -void do_cmd_open(void) +void do_cmd_open() { auto const &r_info = game->edit_data.r_info; @@ -1180,7 +1180,7 @@ static bool_ do_cmd_close_aux(int y, int x, int dir) /* * Close an open door. */ -void do_cmd_close(void) +void do_cmd_close() { int y, x, dir; @@ -1631,7 +1631,7 @@ static bool_ do_cmd_tunnel_aux(int y, int x, int dir) * Digging is very difficult without a "digger" weapon, but can be * accomplished by strong players using heavy weapons. */ -void do_cmd_tunnel(void) +void do_cmd_tunnel() { int y, x, dir; @@ -1791,7 +1791,7 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) msg_print("You are off-balance."); /* Hack -- Lose balance ala paralysis */ - (void)set_paralyzed(2 + rand_int(2)); + set_paralyzed(2 + rand_int(2)); } /* Result */ @@ -1813,7 +1813,7 @@ static bool_ do_cmd_bash_aux(int y, int x, int dir) * * Creatures can also open or bash doors, see elsewhere. */ -void do_cmd_bash(void) +void do_cmd_bash() { auto const &r_info = game->edit_data.r_info; @@ -1912,7 +1912,7 @@ void do_cmd_bash(void) * This command must always take a turn, to prevent free detection * of invisible monsters. */ -void do_cmd_alter(void) +void do_cmd_alter() { auto const &f_info = game->edit_data.f_info; @@ -2024,7 +2024,7 @@ static bool_ get_spike(int *ip) * * This command may NOT be repeated */ -void do_cmd_spike(void) +void do_cmd_spike() { int y, x, dir, item; @@ -2372,7 +2372,7 @@ void do_cmd_run_run() /* * Start running. */ -void do_cmd_run(void) +void do_cmd_run() { if (p_ptr->immovable) { @@ -2430,7 +2430,7 @@ void do_cmd_stay(int pickup) /* * Resting allows a player to safely restore his hp -RAK- */ -void do_cmd_rest(void) +void do_cmd_rest() { auto const &f_info = game->edit_data.f_info; @@ -2659,7 +2659,7 @@ int get_shooter_mult(object_type *o_ptr) * * Note that Bows of "Extra Shots" give an extra shot. */ -void do_cmd_fire(void) +void do_cmd_fire() { int dir, item; @@ -3090,7 +3090,7 @@ void do_cmd_fire(void) * to hit bonus of the weapon to have an effect? Should it ever cause * the item to be destroyed? Should it do any damage at all? */ -void do_cmd_throw(void) +void do_cmd_throw() { auto const &k_info = game->edit_data.k_info; @@ -3466,7 +3466,7 @@ void do_cmd_throw(void) * to hit bonus of the weapon to have an effect? Should it ever cause * the item to be destroyed? Should it do any damage at all? */ -void do_cmd_boomerang(void) +void do_cmd_boomerang() { auto const &k_info = game->edit_data.k_info; @@ -3841,7 +3841,7 @@ static bool_ tport_vertically(bool_ how) * Do a special ``movement'' action. Meant to be used for ``immovable'' * characters. */ -void do_cmd_immovable_special(void) +void do_cmd_immovable_special() { int i, ii, ij, dir; @@ -4071,7 +4071,7 @@ static void do_cmd_sacrifice_aule() * Handle sacrifices. * Grace is increased by value of sacrifice. */ -void do_cmd_sacrifice(void) +void do_cmd_sacrifice() { auto const &r_info = game->edit_data.r_info; diff --git a/src/cmd2.hpp b/src/cmd2.hpp index 9c903dba..9641dc72 100644 --- a/src/cmd2.hpp +++ b/src/cmd2.hpp @@ -6,27 +6,27 @@ std::vector show_monster_inven(int m_idx); int breakage_chance(object_type *o_ptr); -void do_cmd_go_up(void); -void do_cmd_go_down(void); -void do_cmd_search(void); -void do_cmd_toggle_search(void); -void do_cmd_open(void); -void do_cmd_close(void); -void do_cmd_chat(void); -void do_cmd_give(void); -void do_cmd_tunnel(void); -void do_cmd_bash(void); -void do_cmd_alter(void); -void do_cmd_spike(void); +void do_cmd_go_up(); +void do_cmd_go_down(); +void do_cmd_search(); +void do_cmd_toggle_search(); +void do_cmd_open(); +void do_cmd_close(); +void do_cmd_chat(); +void do_cmd_give(); +void do_cmd_tunnel(); +void do_cmd_bash(); +void do_cmd_alter(); +void do_cmd_spike(); void do_cmd_walk(int pickup); void do_cmd_stay(int pickup); -void do_cmd_run(void); -void do_cmd_rest(void); +void do_cmd_run(); +void do_cmd_rest(); int get_shooter_mult(object_type *o_ptr); -void do_cmd_fire(void); -void do_cmd_throw(void); -void do_cmd_boomerang(void); -void do_cmd_immovable_special(void); +void do_cmd_fire(); +void do_cmd_throw(); +void do_cmd_boomerang(); +void do_cmd_immovable_special(); void fetch(int dir, int wgt, bool_ require_los); -void do_cmd_sacrifice(void); -void do_cmd_steal(void); +void do_cmd_sacrifice(); +void do_cmd_steal(); diff --git a/src/cmd3.cc b/src/cmd3.cc index 259efd67..cbf58820 100644 --- a/src/cmd3.cc +++ b/src/cmd3.cc @@ -49,7 +49,7 @@ /* * Display p_ptr->inventory */ -void do_cmd_inven(void) +void do_cmd_inven() { char out_val[160]; @@ -104,7 +104,7 @@ void do_cmd_inven(void) /* * Display equipment */ -void do_cmd_equip(void) +void do_cmd_equip() { char out_val[160]; @@ -204,7 +204,7 @@ bool_ is_slot_ok(int slot) /* * Wield or wear a single item from the pack or floor */ -void do_cmd_wield(void) +void do_cmd_wield() { auto const &a_info = game->edit_data.a_info; @@ -347,7 +347,7 @@ void do_cmd_wield(void) if (o_ptr->k_idx) { /* Take off existing item */ - (void)inven_takeoff(slot, 255, FALSE); + inven_takeoff(slot, 255, FALSE); } } else @@ -357,7 +357,7 @@ void do_cmd_wield(void) if (!object_similar(o_ptr, q_ptr)) { /* Take off existing item */ - (void)inven_takeoff(slot, 255, FALSE); + inven_takeoff(slot, 255, FALSE); } else { @@ -449,7 +449,7 @@ void do_cmd_wield(void) /* * Take off an item */ -void do_cmd_takeoff(void) +void do_cmd_takeoff() { /* Get an item */ int item; @@ -479,7 +479,7 @@ void do_cmd_takeoff(void) energy_use = 50; /* Take off the item */ - (void)inven_takeoff(item, 255, FALSE); + inven_takeoff(item, 255, FALSE); /* Recalculate hitpoint */ p_ptr->update |= (PU_HP); @@ -491,7 +491,7 @@ void do_cmd_takeoff(void) /* * Drop an item */ -void do_cmd_drop(void) +void do_cmd_drop() { /* Get an item */ int item; @@ -557,7 +557,7 @@ void do_cmd_drop(void) /* * Destroy an item */ -void do_cmd_destroy(void) +void do_cmd_destroy() { auto const &k_info = game->edit_data.k_info; @@ -688,7 +688,7 @@ void do_cmd_destroy(void) /* * Observe an item which has been *identify*-ed */ -void do_cmd_observe(void) +void do_cmd_observe() { /* Get an item */ int item; @@ -720,7 +720,7 @@ void do_cmd_observe(void) * Remove the inscription from an object * XXX Mention item (when done)? */ -void do_cmd_uninscribe(void) +void do_cmd_uninscribe() { /* Get an item */ int item; @@ -759,7 +759,7 @@ void do_cmd_uninscribe(void) /* * Inscribe an object with a comment */ -void do_cmd_inscribe(void) +void do_cmd_inscribe() { /* Get an item */ int item; @@ -820,7 +820,7 @@ static object_filter_t const &item_tester_refill_lantern() /* * Refill the players lamp (from the pack or floor) */ -static void do_cmd_refill_lamp(void) +static void do_cmd_refill_lamp() { /* Get an item */ int item; @@ -883,7 +883,7 @@ static object_filter_t const &item_tester_refill_torch() /* * Refuel the players torch (from the pack or floor) */ -static void do_cmd_refill_torch(void) +static void do_cmd_refill_torch() { /* Get an item */ int item; @@ -935,7 +935,7 @@ static void do_cmd_refill_torch(void) /* * Refill the players lamp, or restock his torches */ -void do_cmd_refill(void) +void do_cmd_refill() { /* Get the light */ auto o_ptr = &p_ptr->inventory[INVEN_LITE]; @@ -978,7 +978,7 @@ void do_cmd_refill(void) /* * Target command */ -void do_cmd_target(void) +void do_cmd_target() { /* Target set */ if (target_set(TARGET_KILL)) @@ -998,7 +998,7 @@ void do_cmd_target(void) /* * Look command */ -void do_cmd_look(void) +void do_cmd_look() { /* Look around */ if (target_set(TARGET_LOOK)) @@ -1012,7 +1012,7 @@ void do_cmd_look(void) /* * Allow the player to examine other sectors on the map */ -void do_cmd_locate(void) +void do_cmd_locate() { int dir, y1, x1, y2, x2; int panel_hgt, panel_wid; @@ -1341,7 +1341,7 @@ static void roff_top(int r_idx) * * Note that the player ghosts are ignored. XXX XXX XXX */ -void do_cmd_query_symbol(void) +void do_cmd_query_symbol() { auto const &r_info = game->edit_data.r_info; @@ -1740,7 +1740,7 @@ static bool_ get_string_cli(cptr prompt, char *buf, int len) * * See defines.h for a list of the codes used. */ -void do_cmd_cli(void) +void do_cmd_cli() { char buff[80]; diff --git a/src/cmd3.hpp b/src/cmd3.hpp index 4b240dda..97d3e22f 100644 --- a/src/cmd3.hpp +++ b/src/cmd3.hpp @@ -2,22 +2,22 @@ #include "h-basic.h" -void do_cmd_html_dump(void); +void do_cmd_html_dump(); void cli_add(cptr active, cptr trigger, cptr descr); -void do_cmd_cli(void); -void do_cmd_cli_help(void); -void do_cmd_inven(void); -void do_cmd_equip(void); -void do_cmd_wield(void); -void do_cmd_takeoff(void); -void do_cmd_drop(void); -void do_cmd_destroy(void); -void do_cmd_observe(void); -void do_cmd_uninscribe(void); -void do_cmd_inscribe(void); -void do_cmd_refill(void); -void do_cmd_target(void); -void do_cmd_look(void); -void do_cmd_locate(void); -void do_cmd_query_symbol(void); -bool_ do_cmd_sense_grid_mana(void); +void do_cmd_cli(); +void do_cmd_cli_help(); +void do_cmd_inven(); +void do_cmd_equip(); +void do_cmd_wield(); +void do_cmd_takeoff(); +void do_cmd_drop(); +void do_cmd_destroy(); +void do_cmd_observe(); +void do_cmd_uninscribe(); +void do_cmd_inscribe(); +void do_cmd_refill(); +void do_cmd_target(); +void do_cmd_look(); +void do_cmd_locate(); +void do_cmd_query_symbol(); +bool_ do_cmd_sense_grid_mana(); diff --git a/src/cmd4.cc b/src/cmd4.cc index 59554dc4..3216e339 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -60,7 +60,7 @@ * selecting various things, such as graphics mode, so it must call * the "TERM_XTRA_REACT" hook before redrawing the windows. */ -void do_cmd_redraw(void) +void do_cmd_redraw() { int j; @@ -131,7 +131,7 @@ void do_cmd_redraw(void) /* * Hack -- change name */ -void do_cmd_change_name(void) +void do_cmd_change_name() { char c; @@ -205,11 +205,11 @@ void do_cmd_change_name(void) /* Change tactic */ if (c == 't') { - (void)do_cmd_change_tactic( -1); + do_cmd_change_tactic( -1); } else if (c == 'T') { - (void)do_cmd_change_tactic(1); + do_cmd_change_tactic(1); } /* Change movement */ @@ -253,7 +253,7 @@ void do_cmd_change_name(void) /* * Recall the most recent message */ -void do_cmd_message_one(void) +void do_cmd_message_one() { auto message = message_at(0); @@ -282,7 +282,7 @@ void do_cmd_message_one(void) * * Now taking advantages of big-screen. -pav- */ -void do_cmd_messages(void) +void do_cmd_messages() { int i, j, k, n; u32b q; @@ -815,7 +815,7 @@ void do_cmd_options_aux(int page, cptr info, bool_ read_only) /* * Modify the "window" options */ -static void do_cmd_options_win(void) +static void do_cmd_options_win() { int i, j, d; @@ -1129,7 +1129,7 @@ static void do_cmd_pref_file_hack(int row) * The user must use the "Ctrl-R" command to "adapt" to changes * in any options which control "visual" aspects of the game. */ -void do_cmd_options(void) +void do_cmd_options() { int k; @@ -1405,7 +1405,7 @@ void do_cmd_options(void) * * XXX XXX XXX Allow absolute file names? */ -void do_cmd_pref(void) +void do_cmd_pref() { char buf[80]; @@ -1417,7 +1417,7 @@ void do_cmd_pref(void) if (!get_string("Pref: ", buf, 80)) return; /* Process that pref command */ - (void)process_pref_file_aux(buf); + process_pref_file_aux(buf); } @@ -1646,7 +1646,7 @@ static errr keymap_dump(cptr fname) * * Could use some helpful instructions on this page. XXX XXX XXX */ -void do_cmd_macros(void) +void do_cmd_macros() { /* Keymap mode */ int mode = get_keymap_mode(); @@ -2017,7 +2017,7 @@ void do_cmd_macros(void) /* * Interact with "visuals" */ -void do_cmd_visuals(void) +void do_cmd_visuals() { auto &r_info = game->edit_data.r_info; auto &f_info = game->edit_data.f_info; @@ -2085,7 +2085,7 @@ void do_cmd_visuals(void) if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ - (void)process_pref_file(tmp); + process_pref_file(tmp); } /* Dump monster attr/chars */ @@ -2453,7 +2453,7 @@ void do_cmd_visuals(void) /* * Interact with "colors" */ -void do_cmd_colors(void) +void do_cmd_colors() { int i; @@ -2510,7 +2510,7 @@ void do_cmd_colors(void) if (!askfor_aux(tmp, 70)) continue; /* Process the given filename */ - (void)process_pref_file(tmp); + process_pref_file(tmp); /* Mega-Hack -- react to changes */ Term_xtra(TERM_XTRA_REACT, 0); @@ -2675,7 +2675,7 @@ void do_cmd_colors(void) * Take notes. There are two ways this can happen, either in the message * recall or a file. */ -void do_cmd_note(void) +void do_cmd_note() { char buf[80]; @@ -2696,7 +2696,7 @@ void do_cmd_note(void) /* * Mention the current version */ -void do_cmd_version(void) +void do_cmd_version() { /* Silly message */ msg_format("You are playing %s made by %s (%s).", @@ -2730,7 +2730,7 @@ static cptr do_cmd_feeling_text[11] = * Note that "feeling" is set to zero unless some time has passed. * Note that this is done when the level is GENERATED, not entered. */ -void do_cmd_feeling(void) +void do_cmd_feeling() { auto const &d_info = game->edit_data.d_info; @@ -2802,7 +2802,7 @@ static char hack[17] = "dwsorgbuDWvyRGBU"; /* * Hack -- load a screen dump from a file */ -void do_cmd_load_screen(void) +void do_cmd_load_screen() { int i, y, x; @@ -2890,7 +2890,7 @@ void do_cmd_load_screen(void) for (x = 0; x < len; x++) { /* Get the attr/char */ - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); /* Look up the attr */ for (i = 0; i < 16; i++) @@ -2926,7 +2926,7 @@ void do_cmd_load_screen(void) /* * Hack -- save a screen dump to a file */ -void do_cmd_save_screen(void) +void do_cmd_save_screen() { int y, x; int wid, hgt; @@ -2966,7 +2966,7 @@ void do_cmd_save_screen(void) for (x = 0; x < wid; x++) { /* Get the attr/char */ - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; @@ -2990,7 +2990,7 @@ void do_cmd_save_screen(void) for (x = 0; x < wid; x++) { /* Get the attr/char */ - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = hack[a & 0x0F]; @@ -3027,7 +3027,7 @@ void do_cmd_save_screen(void) /* * Check the status of "artifacts" */ -void do_cmd_knowledge_artifacts(void) +void do_cmd_knowledge_artifacts() { auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; @@ -3257,7 +3257,7 @@ static int monster_get_race_level(int r_idx) /* * Display known uniques */ -static void do_cmd_knowledge_uniques(void) +static void do_cmd_knowledge_uniques() { auto const &r_info = game->edit_data.r_info; @@ -3409,7 +3409,7 @@ static void plural_aux(char *name) /* * Display current pets */ -static void do_cmd_knowledge_pets(void) +static void do_cmd_knowledge_pets() { int t_friends = 0; int t_levels = 0; @@ -3470,7 +3470,7 @@ static void do_cmd_knowledge_pets(void) /* * Total kill count */ -static void do_cmd_knowledge_kill_count(void) +static void do_cmd_knowledge_kill_count() { auto const &r_info = game->edit_data.r_info; @@ -3572,7 +3572,7 @@ static void do_cmd_knowledge_kill_count(void) /* * Display known objects */ -static void do_cmd_knowledge_objects(void) +static void do_cmd_knowledge_objects() { auto const &k_info = game->edit_data.k_info; @@ -3614,7 +3614,7 @@ static void do_cmd_knowledge_objects(void) /* * List recall depths */ -static void do_cmd_knowledge_dungeons(void) +static void do_cmd_knowledge_dungeons() { auto const &d_info = game->edit_data.d_info; @@ -3642,7 +3642,7 @@ static void do_cmd_knowledge_dungeons(void) /* * List known towns */ -void do_cmd_knowledge_towns(void) +void do_cmd_knowledge_towns() { auto const &d_info = game->edit_data.d_info; @@ -3680,7 +3680,7 @@ void do_cmd_knowledge_towns(void) /* * List corruptions */ -static void do_cmd_knowledge_corruptions(void) +static void do_cmd_knowledge_corruptions() { show_string(dump_corruptions(true, false).c_str(), "Corruptions"); } @@ -3689,7 +3689,7 @@ static void do_cmd_knowledge_corruptions(void) /* * Print quest status of all active quests */ -static void do_cmd_knowledge_quests(void) +static void do_cmd_knowledge_quests() { /* Figure out display order of quests */ int order[MAX_Q_IDX]; @@ -3746,7 +3746,7 @@ static void do_cmd_knowledge_quests(void) /* * Print fate status */ -static void do_cmd_knowledge_fates(void) +static void do_cmd_knowledge_fates() { show_string(dump_fates().c_str(), "Fate status"); } @@ -3755,7 +3755,7 @@ static void do_cmd_knowledge_fates(void) /* * Print the note file */ -void do_cmd_knowledge_notes(void) +void do_cmd_knowledge_notes() { /* Spawn */ show_notes_file(); @@ -3768,7 +3768,7 @@ void do_cmd_knowledge_notes(void) /* * Interact with "knowledge" */ -void do_cmd_knowledge(void) +void do_cmd_knowledge() { int i; @@ -3926,7 +3926,7 @@ void do_cmd_knowledge(void) * Check on the status of an active quest -KMW- * TODO: Spill out status when not a simple kill # monster. */ -void do_cmd_checkquest(void) +void do_cmd_checkquest() { /* Enter "icky" mode */ character_icky = TRUE; diff --git a/src/cmd4.hpp b/src/cmd4.hpp index 44a7b97c..39f1c16c 100644 --- a/src/cmd4.hpp +++ b/src/cmd4.hpp @@ -2,27 +2,27 @@ #include "h-basic.h" -void macro_recorder_start(void); +void macro_recorder_start(); void macro_recorder_add(char c); -void macro_recorder_stop(void); -void do_cmd_macro_recorder(void); -void do_cmd_redraw(void); -void do_cmd_change_name(void); -void do_cmd_message_one(void); -void do_cmd_messages(void); -void do_cmd_options(void); -void do_cmd_pref(void); -void do_cmd_macros(void); -void do_cmd_visuals(void); -void do_cmd_colors(void); -void do_cmd_note(void); -void do_cmd_version(void); -void do_cmd_feeling(void); -void do_cmd_load_screen(void); -void do_cmd_save_screen(void); -void do_cmd_knowledge(void); -void do_cmd_checkquest(void); +void macro_recorder_stop(); +void do_cmd_macro_recorder(); +void do_cmd_redraw(); +void do_cmd_change_name(); +void do_cmd_message_one(); +void do_cmd_messages(); +void do_cmd_options(); +void do_cmd_pref(); +void do_cmd_macros(); +void do_cmd_visuals(); +void do_cmd_colors(); +void do_cmd_note(); +void do_cmd_version(); +void do_cmd_feeling(); +void do_cmd_load_screen(); +void do_cmd_save_screen(); +void do_cmd_knowledge(); +void do_cmd_checkquest(); void do_cmd_change_tactic(int i); void do_cmd_change_movement(int i); -void do_cmd_time(void); +void do_cmd_time(); void do_cmd_options_aux(int page, cptr info, bool_ read_only); diff --git a/src/cmd5.cc b/src/cmd5.cc index f9094482..a93759b0 100644 --- a/src/cmd5.cc +++ b/src/cmd5.cc @@ -239,7 +239,7 @@ void do_cmd_browse_aux(object_type *o_ptr) } } -void do_cmd_browse(void) +void do_cmd_browse() { /* Get an item */ int item; @@ -286,7 +286,7 @@ static void do_poly_wounds() } } -void do_poly_self(void) +void do_poly_self() { auto const &race_info = game->edit_data.race_info; @@ -314,14 +314,14 @@ void do_poly_self(void) { if ( rand_int(2) == 0) { - (void)dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0)); + dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0)); power -= 1; } tmp++; } /* Deformities are discriminated against! */ - (void)dec_stat(A_CHR, randint(6), TRUE); + dec_stat(A_CHR, randint(6), TRUE); if (effect_msg[0]) { @@ -409,7 +409,7 @@ void do_poly_self(void) msg_print("Your internal organs are rearranged!"); while (tmp < 6) { - (void)dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0)); + dec_stat(tmp, randint(6) + 6, (rand_int(3) == 0)); tmp++; } if (rand_int(6) == 0) @@ -1438,11 +1438,11 @@ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_s { if (!p_ptr->fast) { - (void)set_fast(randint(20 + (plev) ) + plev, 10); + set_fast(randint(20 + (plev) ) + plev, 10); } else { - (void)set_fast(p_ptr->fast + randint(5), 10); + set_fast(p_ptr->fast + randint(5), 10); } break; @@ -1541,7 +1541,7 @@ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_s int dir; if (!get_aim_dir(&dir)) break; - (void)fire_beam(GF_AWAY_ALL, dir, plev); + fire_beam(GF_AWAY_ALL, dir, plev); break; } @@ -1561,7 +1561,7 @@ static void apply_monster_power(monster_race const *r_ptr, std::size_t monster_s case SF_DARKNESS_IDX: { - (void)project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK, + project( -1, 3, p_ptr->py, p_ptr->px, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL); /* Unlite the room */ diff --git a/src/cmd5.hpp b/src/cmd5.hpp index 753b8f68..d25efb73 100644 --- a/src/cmd5.hpp +++ b/src/cmd5.hpp @@ -8,16 +8,16 @@ #include #include -bool_ is_magestaff(void); +bool_ is_magestaff(); void do_cmd_browse_aux(object_type *o_ptr); -void do_cmd_browse(void); +void do_cmd_browse(); void fetch(int dir, int wgt, bool_ require_los); -void do_poly_self(void); +void do_poly_self(); std::string symbiote_name(bool capitalize); int use_symbiotic_power(int r_idx, bool great); void use_monster_power(int r_idx, bool great); bool_ is_ok_spell(s32b spell_idx, s32b pval); s32b get_school_spell(cptr do_what, s16b force_book); -void do_cmd_copy_spell(void); -void cast_school_spell(void); +void do_cmd_copy_spell(); +void cast_school_spell(); std::vector extract_monster_powers(monster_race const *r_ptr, bool great); diff --git a/src/cmd6.cc b/src/cmd6.cc index 80a033eb..d609298d 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -638,7 +638,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) if (!(p_ptr->resist_pois || p_ptr->oppose_pois)) { - (void)set_poisoned(p_ptr->poisoned + rand_int(brdam) + 10); + set_poisoned(p_ptr->poisoned + rand_int(brdam) + 10); } /* Take damage */ @@ -713,12 +713,12 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(20) + 10); + set_confused(p_ptr->confused + rand_int(20) + 10); } if (!p_ptr->resist_chaos) { - (void)set_image(p_ptr->image + randint(10)); + set_image(p_ptr->image + randint(10)); } if (!p_ptr->resist_neth && !p_ptr->resist_chaos) @@ -758,7 +758,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } else { - (void)apply_disenchant(0); + apply_disenchant(0); } /* Take damage */ @@ -779,7 +779,7 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) if (!p_ptr->resist_sound) { int k = (randint((brdam > 40) ? 35 : (brdam * 3 / 4 + 5))); - (void)set_stun(p_ptr->stun + k); + set_stun(p_ptr->stun + k); } /* Take damage */ @@ -856,30 +856,30 @@ static void corpse_effect(object_type *o_ptr, bool_ cutting) } if (r_ptr->flags & RF_SHAPECHANGER) { - /* DGDGDG (void)set_mimic(20 , rand_int(MIMIC_VALAR)); */ + /* DGDGDG set_mimic(20 , rand_int(MIMIC_VALAR)); */ } if (r_ptr->flags & RF_DEMON) { - /* DGDGDG (void)set_mimic(30 , MIMIC_DEMON); */ + /* DGDGDG set_mimic(30 , MIMIC_DEMON); */ } if (r_ptr->flags & RF_UNDEAD) { - /* DGDGDG (void)set_mimic(30 , MIMIC_VAMPIRE); */ + /* DGDGDG set_mimic(30 , MIMIC_VAMPIRE); */ } if (r_ptr->flags & RF_NO_FEAR) { - (void)set_afraid(0); + set_afraid(0); } if (r_ptr->flags & RF_NO_STUN) { - (void)set_stun(0); + set_stun(0); } if (r_ptr->flags & RF_NO_CONF) { - (void)set_confused(0); + set_confused(0); } if (r_ptr->spells & SF_S_THUNDERLORD) { @@ -974,7 +974,7 @@ static object_filter_t const &item_tester_hook_eatable() /* * Eat some food (from the pack or floor) */ -void do_cmd_eat_food(void) +void do_cmd_eat_food() { auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; @@ -1113,7 +1113,7 @@ void do_cmd_eat_food(void) case SV_FOOD_WEAKNESS: { take_hit(damroll(6, 6), "poisonous food"); - (void)do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_STR, STAT_DEC_NORMAL); ident = TRUE; @@ -1123,7 +1123,7 @@ void do_cmd_eat_food(void) case SV_FOOD_SICKNESS: { take_hit(damroll(6, 6), "poisonous food"); - (void)do_dec_stat(A_CON, STAT_DEC_NORMAL); + do_dec_stat(A_CON, STAT_DEC_NORMAL); ident = TRUE; @@ -1133,7 +1133,7 @@ void do_cmd_eat_food(void) case SV_FOOD_STUPIDITY: { take_hit(damroll(8, 8), "poisonous food"); - (void)do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); ident = TRUE; @@ -1143,7 +1143,7 @@ void do_cmd_eat_food(void) case SV_FOOD_NAIVETY: { take_hit(damroll(8, 8), "poisonous food"); - (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); ident = TRUE; @@ -1153,7 +1153,7 @@ void do_cmd_eat_food(void) case SV_FOOD_UNHEALTH: { take_hit(damroll(10, 10), "poisonous food"); - (void)do_dec_stat(A_CON, STAT_DEC_NORMAL); + do_dec_stat(A_CON, STAT_DEC_NORMAL); ident = TRUE; @@ -1163,7 +1163,7 @@ void do_cmd_eat_food(void) case SV_FOOD_DISEASE: { take_hit(damroll(10, 10), "poisonous food"); - (void)do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_STR, STAT_DEC_NORMAL); ident = TRUE; @@ -1307,8 +1307,8 @@ void do_cmd_eat_food(void) case SV_FOOD_WAYBREAD: { msg_print("That tastes very good."); - (void)set_poisoned(0); - (void)hp_player(damroll(4, 8)); + set_poisoned(0); + hp_player(damroll(4, 8)); set_food(PY_FOOD_MAX - 1); ident = TRUE; @@ -1329,7 +1329,7 @@ void do_cmd_eat_food(void) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); break; } @@ -1338,9 +1338,9 @@ void do_cmd_eat_food(void) { msg_print("A fresh, clean essence rises, driving away wounds and poison."); - (void)set_poisoned(0); - (void)set_stun(0); - (void)set_cut(0); + set_poisoned(0); + set_stun(0); + set_cut(0); if (p_ptr->black_breath) { msg_print("The hold of the Black Breath on you is broken!"); @@ -1493,7 +1493,7 @@ void do_cmd_eat_food(void) if ((race_flags_p(PR_VAMPIRE)) || (p_ptr->mimic_form == resolve_mimic_name("Vampire"))) { /* Reduced nutritional benefit */ - /* (void)set_food(p_ptr->food + (fval / 10)); -- No more */ + /* set_food(p_ptr->food + (fval / 10)); -- No more */ msg_print("Mere victuals hold scant sustenance for a being such as yourself."); /* Hungry */ @@ -1519,7 +1519,7 @@ void do_cmd_eat_food(void) /* Those living in fresh */ else { - (void)set_food(p_ptr->food + fval); + set_food(p_ptr->food + fval); } @@ -1534,7 +1534,7 @@ void do_cmd_eat_food(void) /* * Cut a corpse up for convenient storage */ -void do_cmd_cut_corpse(void) +void do_cmd_cut_corpse() { auto const &r_info = game->edit_data.r_info; @@ -1635,7 +1635,7 @@ void do_cmd_cut_corpse(void) * * Salt water works well. */ -void do_cmd_cure_meat(void) +void do_cmd_cure_meat() { int item, num, cure; @@ -1814,9 +1814,9 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) case SV_POTION_SALT_WATER: { msg_print("The potion makes you vomit!"); - (void)set_food(PY_FOOD_STARVE - 1); - (void)set_poisoned(0); - (void)set_paralyzed(4); + set_food(PY_FOOD_STARVE - 1); + set_poisoned(0); + set_paralyzed(4); ident = TRUE; break; @@ -1908,12 +1908,12 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) { msg_print("Your nerves and muscles feel weak and lifeless!"); take_hit(damroll(10, 10), "a potion of Ruination"); - (void)dec_stat(A_DEX, 25, TRUE); - (void)dec_stat(A_WIS, 25, TRUE); - (void)dec_stat(A_CON, 25, TRUE); - (void)dec_stat(A_STR, 25, TRUE); - (void)dec_stat(A_CHR, 25, TRUE); - (void)dec_stat(A_INT, 25, TRUE); + dec_stat(A_DEX, 25, TRUE); + dec_stat(A_WIS, 25, TRUE); + dec_stat(A_CON, 25, TRUE); + dec_stat(A_STR, 25, TRUE); + dec_stat(A_CHR, 25, TRUE); + dec_stat(A_INT, 25, TRUE); ident = TRUE; break; @@ -1965,8 +1965,8 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) { msg_print("Massive explosions rupture your body!"); take_hit(damroll(50, 20), "a potion of Detonation"); - (void)set_stun(p_ptr->stun + 75); - (void)set_cut(p_ptr->cut + 5000); + set_stun(p_ptr->stun + 75); + set_cut(p_ptr->cut + 5000); ident = TRUE; break; @@ -2030,7 +2030,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } break; @@ -2134,18 +2134,18 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) msg_print("You feel life flow through your body!"); restore_level(); hp_player(5000); - (void)set_poisoned(0); - (void)set_blind(0); - (void)set_confused(0); - (void)set_image(0); - (void)set_stun(0); - (void)set_cut(0); - (void)do_res_stat(A_STR, TRUE); - (void)do_res_stat(A_CON, TRUE); - (void)do_res_stat(A_DEX, TRUE); - (void)do_res_stat(A_WIS, TRUE); - (void)do_res_stat(A_INT, TRUE); - (void)do_res_stat(A_CHR, TRUE); + set_poisoned(0); + set_blind(0); + set_confused(0); + set_image(0); + set_stun(0); + set_cut(0); + do_res_stat(A_STR, TRUE); + do_res_stat(A_CON, TRUE); + do_res_stat(A_DEX, TRUE); + do_res_stat(A_WIS, TRUE); + do_res_stat(A_INT, TRUE); + do_res_stat(A_CHR, TRUE); if (p_ptr->black_breath) { msg_print("The hold of the Black Breath on you is broken!"); @@ -2288,13 +2288,13 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) msg_print("You begin to feel more enlightened..."); msg_print(NULL); wiz_lite_extra(); - (void)do_inc_stat(A_INT); - (void)do_inc_stat(A_WIS); - (void)detect_doors(DEFAULT_RADIUS); - (void)detect_stairs(DEFAULT_RADIUS); - (void)detect_treasure(DEFAULT_RADIUS); - (void)detect_objects_gold(DEFAULT_RADIUS); - (void)detect_objects_normal(DEFAULT_RADIUS); + do_inc_stat(A_INT); + do_inc_stat(A_WIS); + detect_doors(DEFAULT_RADIUS); + detect_stairs(DEFAULT_RADIUS); + detect_treasure(DEFAULT_RADIUS); + detect_objects_gold(DEFAULT_RADIUS); + detect_objects_normal(DEFAULT_RADIUS); identify_pack(); ident = TRUE; @@ -2315,11 +2315,11 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) case SV_POTION_RESISTANCE: { - (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); - (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); - (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); - (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); - (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); + set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); + set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); + set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); + set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); + set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); ident = TRUE; break; @@ -2341,7 +2341,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) case SV_POTION_INVULNERABILITY: { - (void)set_invuln(p_ptr->invuln + randint(7) + 7); + set_invuln(p_ptr->invuln + randint(7) + 7); ident = TRUE; break; @@ -2478,7 +2478,7 @@ static bool_ quaff_potion(int tval, int sval, int pval, int pval2) /* * Quaff a potion (from the pack or the floor) */ -void do_cmd_quaff_potion(void) +void do_cmd_quaff_potion() { auto const &k_info = game->edit_data.k_info; @@ -2539,7 +2539,7 @@ void do_cmd_quaff_potion(void) /* Potions can feed the player */ - (void)set_food(p_ptr->food + o_ptr->pval); + set_food(p_ptr->food + o_ptr->pval); /* Destroy potion */ @@ -2550,7 +2550,7 @@ void do_cmd_quaff_potion(void) /* * Fill an empty bottle */ -static void do_cmd_fill_bottle(void) +static void do_cmd_fill_bottle() { cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px]; @@ -2636,7 +2636,7 @@ static void do_cmd_fill_bottle(void) /* * Drink from a fountain */ -void do_cmd_drink_fountain(void) +void do_cmd_drink_fountain() { auto const &k_info = game->edit_data.k_info; @@ -2711,7 +2711,7 @@ void do_cmd_drink_fountain(void) /* * Curse the players armor */ -bool_ curse_armor(void) +bool_ curse_armor() { object_type *o_ptr; @@ -2773,7 +2773,7 @@ bool_ curse_armor(void) /* * Curse the players weapon */ -bool_ curse_weapon(void) +bool_ curse_weapon() { object_type *o_ptr; @@ -2855,7 +2855,7 @@ static object_filter_t const &item_tester_hook_readable() * include scrolls with no effects but recharge or identify, which are * cancelled before use. XXX Reading them still takes a turn, though. */ -void do_cmd_read_scroll(void) +void do_cmd_read_scroll() { auto const &d_info = game->edit_data.d_info; auto const &k_info = game->edit_data.k_info; @@ -3009,7 +3009,7 @@ void do_cmd_read_scroll(void) { if (!(p_ptr->resist_blind) && !(p_ptr->resist_dark)) { - (void)set_blind(p_ptr->blind + 3 + randint(5)); + set_blind(p_ptr->blind + 3 + randint(5)); } if (unlite_area(10, 3)) ident = TRUE; @@ -3096,7 +3096,7 @@ void do_cmd_read_scroll(void) case SV_SCROLL_TELEPORT_LEVEL: { - (void)teleport_player_level(); + teleport_player_level(); ident = TRUE; @@ -3354,7 +3354,7 @@ void do_cmd_read_scroll(void) case SV_SCROLL_GENOCIDE: { - (void)genocide(TRUE); + genocide(TRUE); ident = TRUE; @@ -3363,7 +3363,7 @@ void do_cmd_read_scroll(void) case SV_SCROLL_MASS_GENOCIDE: { - (void)mass_genocide(TRUE); + mass_genocide(TRUE); ident = TRUE; @@ -3657,7 +3657,7 @@ static void activate_stick(object_type *o_ptr, bool_ *obvious, bool_ *use_charge * * Hack -- staffs of identify can be "cancelled". */ -void do_cmd_use_staff(void) +void do_cmd_use_staff() { bool_ obvious, use_charge; @@ -3828,7 +3828,7 @@ void do_cmd_use_staff(void) * basic "bolt" rods, but the basic "ball" wands do the same damage * as the basic "ball" rods. */ -void do_cmd_aim_wand(void) +void do_cmd_aim_wand() { bool_ obvious, use_charge; @@ -4040,7 +4040,7 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item) /* * Zap a rod, or attack a rod tip to a rod */ -void do_cmd_zap_rod(void) +void do_cmd_zap_rod() { auto const &k_info = game->edit_data.k_info; @@ -4314,7 +4314,7 @@ void do_cmd_zap_rod(void) } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } break; @@ -4588,7 +4588,7 @@ int ring_of_power() /* * Enchant some bolts */ -bool_ brand_bolts(void) +bool_ brand_bolts() { int i; @@ -4794,7 +4794,7 @@ static void activate_valaroma() * Note that it always takes a turn to activate an object, even if * the user hits "escape" at the "direction" prompt. */ -void do_cmd_activate(void) +void do_cmd_activate() { auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; @@ -5097,12 +5097,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("The phial wells with dark light..."); unlite_area(damroll(2, 15), 3); take_hit(damroll(10, 10), "activating The Phial of Undeath"); - (void)dec_stat(A_DEX, 25, STAT_DEC_PERMANENT); - (void)dec_stat(A_WIS, 25, STAT_DEC_PERMANENT); - (void)dec_stat(A_CON, 25, STAT_DEC_PERMANENT); - (void)dec_stat(A_STR, 25, STAT_DEC_PERMANENT); - (void)dec_stat(A_CHR, 25, STAT_DEC_PERMANENT); - (void)dec_stat(A_INT, 25, STAT_DEC_PERMANENT); + dec_stat(A_DEX, 25, STAT_DEC_PERMANENT); + dec_stat(A_WIS, 25, STAT_DEC_PERMANENT); + dec_stat(A_CON, 25, STAT_DEC_PERMANENT); + dec_stat(A_STR, 25, STAT_DEC_PERMANENT); + dec_stat(A_CHR, 25, STAT_DEC_PERMANENT); + dec_stat(A_INT, 25, STAT_DEC_PERMANENT); o_ptr->timeout = rand_int(10) + 10; @@ -5124,7 +5124,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "dispel small life every 55+d55 turns"; msg_print("You exterminate small life."); - (void)dispel_monsters(4); + dispel_monsters(4); o_ptr->timeout = rand_int(55) + 55; @@ -5137,11 +5137,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("The ring glows brightly..."); if (!p_ptr->fast) { - (void)set_fast(randint(75) + 75, 10); + set_fast(randint(75) + 75, 10); } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } o_ptr->timeout = rand_int(150) + 150; @@ -5242,10 +5242,10 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("You are too weak to control the stone!"); /* Hack -- Bypass free action */ - (void)set_paralyzed(randint(5 * oops + 1)); + set_paralyzed(randint(5 * oops + 1)); /* Confusing. */ - (void)set_confused(p_ptr->confused + + set_confused(p_ptr->confused + randint(5 * oops + 1)); } @@ -5258,7 +5258,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) /* Confusing. */ if (rand_int(5) == 0) { - (void)set_confused(p_ptr->confused + randint(10)); + set_confused(p_ptr->confused + randint(10)); } /* Exercise a little care... */ @@ -5300,15 +5300,15 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("You breathe the elements."); fire_ball(GF_MISSILE, dir, 300, 4); msg_print("Your armor glows many colours..."); - (void)set_afraid(0); - (void)set_shero(p_ptr->shero + randint(50) + 50); - (void)hp_player(30); - (void)set_blessed(p_ptr->blessed + randint(50) + 50); - (void)set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50); - (void)set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50); - (void)set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50); - (void)set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50); - (void)set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50); + set_afraid(0); + set_shero(p_ptr->shero + randint(50) + 50); + hp_player(30); + set_blessed(p_ptr->blessed + randint(50) + 50); + set_oppose_acid(p_ptr->oppose_acid + randint(50) + 50); + set_oppose_elec(p_ptr->oppose_elec + randint(50) + 50); + set_oppose_fire(p_ptr->oppose_fire + randint(50) + 50); + set_oppose_cold(p_ptr->oppose_cold + randint(50) + 50); + set_oppose_pois(p_ptr->oppose_pois + randint(50) + 50); o_ptr->timeout = 400; @@ -5319,13 +5319,13 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return ("heal (777), curing and heroism every 300 turns"); msg_print("A heavenly choir sings..."); - (void)set_poisoned(0); - (void)set_cut(0); - (void)set_stun(0); - (void)set_confused(0); - (void)set_blind(0); - (void)set_hero(p_ptr->hero + randint(25) + 25); - (void)hp_player(777); + set_poisoned(0); + set_cut(0); + set_stun(0); + set_confused(0); + set_blind(0); + set_hero(p_ptr->hero + randint(25) + 25); + hp_player(777); o_ptr->timeout = 300; @@ -5346,11 +5346,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "resistance (20+d20 turns) every 111 turns"; msg_print("Your cloak glows many colours..."); - (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); - (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); - (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); - (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); - (void)set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); + set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); + set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); + set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); + set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); + set_oppose_pois(p_ptr->oppose_pois + randint(20) + 20); o_ptr->timeout = 111; @@ -5400,7 +5400,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case 11: case 12: { - (void)stair_creation(); + stair_creation(); break; } @@ -5446,7 +5446,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "summon the Legion of the Dawn every 500+d500 turns"; msg_print("You summon the Legion of the Dawn."); - (void)summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DAWN, TRUE); + summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_DAWN, TRUE); o_ptr->timeout = 500 + randint(500); @@ -5481,7 +5481,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "fire branding of bolts every 999 turns"; msg_print("Your crossbow glows deep red..."); - (void)brand_bolts(); + brand_bolts(); o_ptr->timeout = 999; @@ -5552,8 +5552,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return "clairvoyance every 100+d100 turns"; msg_print("The stone glows a deep green..."); wiz_lite_extra(); - (void)detect_doors(DEFAULT_RADIUS); - (void)detect_stairs(DEFAULT_RADIUS); + detect_doors(DEFAULT_RADIUS); + detect_stairs(DEFAULT_RADIUS); o_ptr->timeout = rand_int(100) + 100; @@ -5638,11 +5638,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return "berserker and +10 to speed (50) every 100+d200 turns"; if (!p_ptr->fast) { - (void)set_fast(randint(50) + 50, 10); + set_fast(randint(50) + 50, 10); } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } hp_player(30); set_afraid(0); @@ -6097,7 +6097,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "teleport away every 200 turns"; if (!get_aim_dir(&dir)) break; - (void)fire_beam(GF_AWAY_ALL, dir, plev); + fire_beam(GF_AWAY_ALL, dir, plev); o_ptr->timeout = 200; @@ -6121,7 +6121,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "genocide every 500 turns"; msg_print("It glows deep blue..."); - (void)genocide(TRUE); + genocide(TRUE); o_ptr->timeout = 500; @@ -6132,7 +6132,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "mass genocide every 1000 turns"; msg_print("It lets out a long, shrill note..."); - (void)mass_genocide(TRUE); + mass_genocide(TRUE); o_ptr->timeout = 1000; @@ -6145,7 +6145,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "charm animal every 300 turns"; if (!get_aim_dir(&dir)) break; - (void) charm_animal(dir, plev); + charm_animal(dir, plev); o_ptr->timeout = 300; @@ -6156,7 +6156,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "enslave undead every 333 turns"; if (!get_aim_dir(&dir)) break; - (void)control_one_undead(dir, plev); + control_one_undead(dir, plev); o_ptr->timeout = 333; @@ -6167,7 +6167,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "charm monster every 400 turns"; if (!get_aim_dir(&dir)) break; - (void) charm_monster(dir, plev); + charm_monster(dir, plev); o_ptr->timeout = 400; @@ -6177,7 +6177,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_CHARM_ANIMALS: { if (!doit) return "animal friendship every 500 turns"; - (void) charm_animals(plev * 2); + charm_animals(plev * 2); o_ptr->timeout = 500; @@ -6197,7 +6197,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_SUMMON_ANIMAL: { if (!doit) return "summon animal every 200+d300 turns"; - (void)summon_specific_friendly(p_ptr->py, p_ptr->px, plev, SUMMON_ANIMAL_RANGER, TRUE); + summon_specific_friendly(p_ptr->py, p_ptr->px, plev, SUMMON_ANIMAL_RANGER, TRUE); o_ptr->timeout = 200 + randint(300); @@ -6208,7 +6208,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "summon phantasmal servant every 200+d200 turns"; msg_print("You summon a phantasmal servant."); - (void)summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_PHANTOM, TRUE); + summon_specific_friendly(p_ptr->py, p_ptr->px, dun_level, SUMMON_PHANTOM, TRUE); o_ptr->timeout = 200 + randint(200); @@ -6300,8 +6300,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_CURE_LW: { if (!doit) return format("cure light wounds every %d turns", (is_junkart ? 50 : 10)); - (void)set_afraid(0); - (void)hp_player(30); + set_afraid(0); + hp_player(30); o_ptr->timeout = 10; @@ -6313,7 +6313,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return format("cure serious wounds every %s turns", (is_junkart? "75" : "3+d3")); msg_print("It radiates deep purple..."); hp_player(damroll(4, 8)); - (void)set_cut((p_ptr->cut / 2) - 50); + set_cut((p_ptr->cut / 2) - 50); o_ptr->timeout = rand_int(3) + 3; @@ -6324,8 +6324,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "remove fear and cure poison every 5 turns"; msg_print("It glows deep blue..."); - (void)set_afraid(0); - (void)set_poisoned(0); + set_afraid(0); + set_poisoned(0); o_ptr->timeout = 5; @@ -6347,13 +6347,13 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return format("restore stats and life levels every %d turns", (is_junkart ? 200 : 750)); msg_print("It glows a deep green..."); - (void)do_res_stat(A_STR, TRUE); - (void)do_res_stat(A_INT, TRUE); - (void)do_res_stat(A_WIS, TRUE); - (void)do_res_stat(A_DEX, TRUE); - (void)do_res_stat(A_CON, TRUE); - (void)do_res_stat(A_CHR, TRUE); - (void)restore_level(); + do_res_stat(A_STR, TRUE); + do_res_stat(A_INT, TRUE); + do_res_stat(A_WIS, TRUE); + do_res_stat(A_DEX, TRUE); + do_res_stat(A_CON, TRUE); + do_res_stat(A_CHR, TRUE); + restore_level(); o_ptr->timeout = 750; @@ -6365,8 +6365,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return format("heal 700 hit points every %d turns", (is_junkart ? 100 : 250)); msg_print("It glows deep blue..."); msg_print("You feel a warm tingling inside..."); - (void)hp_player(700); - (void)set_cut(0); + hp_player(700); + set_cut(0); o_ptr->timeout = 250; @@ -6378,8 +6378,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return "heal 1000 hit points every 888 turns"; msg_print("It glows a bright white..."); msg_print("You feel much better..."); - (void)hp_player(1000); - (void)set_cut(0); + hp_player(1000); + set_cut(0); o_ptr->timeout = 888; @@ -6389,7 +6389,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_ESP: { if (!doit) return "temporary ESP (dur 25+d30) every 200 turns"; - (void)set_tim_esp(p_ptr->tim_esp + randint(30) + 25); + set_tim_esp(p_ptr->tim_esp + randint(30) + 25); o_ptr->timeout = 200; @@ -6399,8 +6399,8 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_BERSERK: { if (!doit) return "heroism and berserk (dur 50+d50) every 100+d100 turns"; - (void)set_shero(p_ptr->shero + randint(50) + 50); - (void)set_blessed(p_ptr->blessed + randint(50) + 50); + set_shero(p_ptr->shero + randint(50) + 50); + set_blessed(p_ptr->blessed + randint(50) + 50); o_ptr->timeout = 100 + randint(100); @@ -6412,7 +6412,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!doit) return "protection from evil (dur level*3 + d25) every 225+d225 turns"; msg_print("It lets out a shrill wail..."); k = 3 * p_ptr->lev; - (void)set_protevil(p_ptr->protevil + randint(25) + k); + set_protevil(p_ptr->protevil + randint(25) + k); o_ptr->timeout = rand_int(225) + 225; @@ -6423,11 +6423,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "resist elements (dur 40+d40) every 200 turns"; msg_print("It glows many colours..."); - (void)set_oppose_acid(p_ptr->oppose_acid + randint(40) + 40); - (void)set_oppose_elec(p_ptr->oppose_elec + randint(40) + 40); - (void)set_oppose_fire(p_ptr->oppose_fire + randint(40) + 40); - (void)set_oppose_cold(p_ptr->oppose_cold + randint(40) + 40); - (void)set_oppose_pois(p_ptr->oppose_pois + randint(40) + 40); + set_oppose_acid(p_ptr->oppose_acid + randint(40) + 40); + set_oppose_elec(p_ptr->oppose_elec + randint(40) + 40); + set_oppose_fire(p_ptr->oppose_fire + randint(40) + 40); + set_oppose_cold(p_ptr->oppose_cold + randint(40) + 40); + set_oppose_pois(p_ptr->oppose_pois + randint(40) + 40); o_ptr->timeout = 200; @@ -6440,11 +6440,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("It glows bright green..."); if (!p_ptr->fast) { - (void)set_fast(randint(20) + 20, 10); + set_fast(randint(20) + 20, 10); } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } o_ptr->timeout = 250; @@ -6458,11 +6458,11 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("It glows brightly..."); if (!p_ptr->fast) { - (void)set_fast(randint(75) + 75, 10); + set_fast(randint(75) + 75, 10); } else { - (void)set_fast(p_ptr->fast + 5, 10); + set_fast(p_ptr->fast + 5, 10); } o_ptr->timeout = rand_int(200) + 200; @@ -6483,7 +6483,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_INVULN: { if (!doit) return "invulnerability (dur 8+d8) every 1000 turns"; - (void)set_invuln(p_ptr->invuln + randint(8) + 8); + set_invuln(p_ptr->invuln + randint(8) + 8); o_ptr->timeout = 1000; @@ -6585,7 +6585,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_SATIATE: { if (!doit) return "satisfy hunger every 200 turns"; - (void)set_food(PY_FOOD_MAX - 1); + set_food(PY_FOOD_MAX - 1); o_ptr->timeout = 200; @@ -6629,7 +6629,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) { if (!doit) return "alchemy every 500 turns"; msg_print("It glows bright yellow..."); - (void) alchemy(); + alchemy(); o_ptr->timeout = 500; @@ -6710,12 +6710,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) msg_print("Your nerves and muscles feel weak and lifeless!"); take_hit(damroll(10, 10), "activating Ruination"); - (void)dec_stat(A_DEX, 25, TRUE); - (void)dec_stat(A_WIS, 25, TRUE); - (void)dec_stat(A_CON, 25, TRUE); - (void)dec_stat(A_STR, 25, TRUE); - (void)dec_stat(A_CHR, 25, TRUE); - (void)dec_stat(A_INT, 25, TRUE); + dec_stat(A_DEX, 25, TRUE); + dec_stat(A_WIS, 25, TRUE); + dec_stat(A_CON, 25, TRUE); + dec_stat(A_STR, 25, TRUE); + dec_stat(A_CHR, 25, TRUE); + dec_stat(A_INT, 25, TRUE); /* Timeout is set before return */ @@ -6735,7 +6735,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNINT: { if (!doit) return "decreasing Intelligence"; - (void)dec_stat(A_INT, 25, FALSE); + dec_stat(A_INT, 25, FALSE); /* Timeout is set before return */ @@ -6745,7 +6745,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNSTR: { if (!doit) return "decreasing Strength"; - (void)dec_stat(A_STR, 25, FALSE); + dec_stat(A_STR, 25, FALSE); /* Timeout is set before return */ @@ -6755,7 +6755,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNCON: { if (!doit) return "decreasing Constitution"; - (void)dec_stat(A_CON, 25, FALSE); + dec_stat(A_CON, 25, FALSE); /* Timeout is set before return */ @@ -6765,7 +6765,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNCHR: { if (!doit) return "decreasing Charisma"; - (void)dec_stat(A_CHR, 25, FALSE); + dec_stat(A_CHR, 25, FALSE); /* Timeout is set before return */ @@ -6775,7 +6775,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNDEX: { if (!doit) return "decreasing Dexterity"; - (void)dec_stat(A_DEX, 25, FALSE); + dec_stat(A_DEX, 25, FALSE); /* Timeout is set before return */ @@ -6785,7 +6785,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_UNWIS: { if (!doit) return "decreasing Wisdom"; - (void)dec_stat(A_WIS, 25, FALSE); + dec_stat(A_WIS, 25, FALSE); /* Timeout is set before return */ @@ -6795,12 +6795,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_STATLOSS: { if (!doit) return "stat loss"; - (void)dec_stat(A_STR, 15, FALSE); - (void)dec_stat(A_INT, 15, FALSE); - (void)dec_stat(A_WIS, 15, FALSE); - (void)dec_stat(A_DEX, 15, FALSE); - (void)dec_stat(A_CON, 15, FALSE); - (void)dec_stat(A_CHR, 15, FALSE); + dec_stat(A_STR, 15, FALSE); + dec_stat(A_INT, 15, FALSE); + dec_stat(A_WIS, 15, FALSE); + dec_stat(A_DEX, 15, FALSE); + dec_stat(A_CON, 15, FALSE); + dec_stat(A_CHR, 15, FALSE); /* Timeout is set before return */ @@ -6810,12 +6810,12 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_HISTATLOSS: { if (!doit) return "high stat loss"; - (void)dec_stat(A_STR, 25, FALSE); - (void)dec_stat(A_INT, 25, FALSE); - (void)dec_stat(A_WIS, 25, FALSE); - (void)dec_stat(A_DEX, 25, FALSE); - (void)dec_stat(A_CON, 25, FALSE); - (void)dec_stat(A_CHR, 25, FALSE); + dec_stat(A_STR, 25, FALSE); + dec_stat(A_INT, 25, FALSE); + dec_stat(A_WIS, 25, FALSE); + dec_stat(A_DEX, 25, FALSE); + dec_stat(A_CON, 25, FALSE); + dec_stat(A_CHR, 25, FALSE); /* Timeout is set before return */ @@ -6885,7 +6885,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_HUNGER: { if (!doit) return "create hunger"; - (void)set_food(PY_FOOD_WEAK); + set_food(PY_FOOD_WEAK); /* Timeout is set before return */ @@ -6986,7 +6986,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) case ACT_CURE_HUNGER: { if (!doit) return "satisfy hunger every 100 turns"; - (void)set_food(PY_FOOD_MAX - 1); + set_food(PY_FOOD_MAX - 1); /* Timeout is set before return */ @@ -7350,7 +7350,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!get_aim_dir(&dir)) break; fire_ball(GF_COLD, dir, 50, 2); - (void)set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); + set_oppose_cold(p_ptr->oppose_cold + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; @@ -7364,7 +7364,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!get_aim_dir(&dir)) break; fire_ball(GF_FIRE, dir, 50, 2); - (void)set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); + set_oppose_fire(p_ptr->oppose_fire + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; @@ -7377,7 +7377,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!get_aim_dir(&dir)) break; fire_ball(GF_ACID, dir, 50, 2); - (void)set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); + set_oppose_acid(p_ptr->oppose_acid + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; @@ -7391,7 +7391,7 @@ const char *activation_aux(object_type * o_ptr, bool_ doit, int item) if (!get_aim_dir(&dir)) break; fire_ball(GF_ELEC, dir, 50, 2); - (void)set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); + set_oppose_elec(p_ptr->oppose_elec + randint(20) + 20); o_ptr->timeout = rand_int(50) + 50; diff --git a/src/cmd6.hpp b/src/cmd6.hpp index 6c4b0d47..076a9abb 100644 --- a/src/cmd6.hpp +++ b/src/cmd6.hpp @@ -4,15 +4,15 @@ #include "object_type_fwd.hpp" void set_stick_mode(object_type *o_ptr); -void unset_stick_mode(void); -void do_cmd_eat_food(void); -void do_cmd_quaff_potion(void); -void do_cmd_read_scroll(void); -void do_cmd_aim_wand(void); -void do_cmd_use_staff(void); -void do_cmd_zap_rod(void); +void unset_stick_mode(); +void do_cmd_eat_food(); +void do_cmd_quaff_potion(); +void do_cmd_read_scroll(); +void do_cmd_aim_wand(); +void do_cmd_use_staff(); +void do_cmd_zap_rod(); const char *activation_aux(object_type *o_ptr, bool_ desc, int item); -void do_cmd_activate(void); -void do_cmd_cut_corpse(void); -void do_cmd_cure_meat(void); -void do_cmd_drink_fountain(void); +void do_cmd_activate(); +void do_cmd_cut_corpse(); +void do_cmd_cure_meat(); +void do_cmd_drink_fountain(); diff --git a/src/cmd7.cc b/src/cmd7.cc index b51ba229..312c657e 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -347,7 +347,7 @@ static bool_ get_magic_power(int *sn, magic_power *powers, int max_powers, * do_cmd_cast calls this function if the player's class * is 'mindcrafter'. */ -void do_cmd_mindcraft(void) +void do_cmd_mindcraft() { int n = 0, b = 0; @@ -629,7 +629,7 @@ void do_cmd_mindcraft(void) } else { - (void)mindblast_monsters(plev * ((plev - 5) / 10 + 1)); + mindblast_monsters(plev * ((plev - 5) / 10 + 1)); } break; @@ -656,11 +656,11 @@ void do_cmd_mindcraft(void) if (!p_ptr->fast) { /* Haste */ - (void)set_fast(b, plev / 5); + set_fast(b, plev / 5); } else { - (void)set_fast(p_ptr->fast + b, plev / 5); + set_fast(p_ptr->fast + b, plev / 5); } break; @@ -724,7 +724,7 @@ void do_cmd_mindcraft(void) msg_print("You faint from the effort!"); /* Hack -- Bypass free action */ - (void)set_paralyzed(randint(5 * oops + 1)); + set_paralyzed(randint(5 * oops + 1)); /* Damage WIS (possibly permanently) */ if (rand_int(100) < 50) @@ -735,7 +735,7 @@ void do_cmd_mindcraft(void) msg_print("You have damaged your mind!"); /* Reduce constitution */ - (void)dec_stat(A_WIS, 15 + randint(10), perm); + dec_stat(A_WIS, 15 + randint(10), perm); } } @@ -862,7 +862,7 @@ static bool_ mimic_forbid_travel(void *, void *, void *) * do_cmd_cast calls this function if the player's class * is 'mimic'. */ -void do_cmd_mimic(void) +void do_cmd_mimic() { int n = 0, b = 0; @@ -1131,7 +1131,7 @@ void do_cmd_mimic(void) msg_print("You faint from the effort!"); /* Hack -- Bypass free action */ - (void)set_paralyzed(randint(5 * oops + 1)); + set_paralyzed(randint(5 * oops + 1)); /* Damage WIS (possibly permanently) */ if (rand_int(100) < 50) @@ -1142,7 +1142,7 @@ void do_cmd_mimic(void) msg_print("You have damaged your mind!"); /* Reduce constitution */ - (void)dec_stat(A_DEX, 15 + randint(10), perm); + dec_stat(A_DEX, 15 + randint(10), perm); } } @@ -1158,7 +1158,7 @@ void do_cmd_mimic(void) * do_cmd_cast calls this function if the player's class * is 'beastmaster'. */ -void do_cmd_beastmaster(void) +void do_cmd_beastmaster() { int plev = p_ptr->lev, i, num; @@ -1200,7 +1200,7 @@ void do_cmd_beastmaster(void) /* * Command to ask favors from your god. */ -void do_cmd_pray(void) +void do_cmd_pray() { if (p_ptr->pgod == GOD_NONE) { @@ -1472,7 +1472,7 @@ static random_spell* select_spell() } -void do_cmd_powermage(void) +void do_cmd_powermage() { random_spell *s_ptr; @@ -1820,7 +1820,7 @@ static object_filter_t const &item_tester_hook_convertible() * do_cmd_cast calls this function if the player's class * is 'archer'. */ -void do_cmd_archer(void) +void do_cmd_archer() { int ext = 0; char ch; @@ -1912,11 +1912,11 @@ void do_cmd_archer(void) q_ptr->discount = 90; q_ptr->found = OBJ_FOUND_SELFMADE; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); msg_print("You make some ammo."); - (void)wall_to_mud(dir); + wall_to_mud(dir); p_ptr->update |= (PU_VIEW | PU_FLOW | PU_MON_LITE); p_ptr->window |= (PW_OVERHEAD); } @@ -1955,7 +1955,7 @@ void do_cmd_archer(void) inc_stack_size(item, -1); - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); } /**********Create bolts*********/ @@ -1991,14 +1991,14 @@ void do_cmd_archer(void) inc_stack_size(item, -1); - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); } } /* * Control whether shots are allowed to pierce */ -void do_cmd_set_piercing(void) +void do_cmd_set_piercing() { char ch; char com[80]; @@ -2068,7 +2068,7 @@ void necro_info(char *p, int power) /* * Cast a Necromancy spell */ -void do_cmd_necromancer(void) +void do_cmd_necromancer() { int n = 0, b = 0; int chance; @@ -2252,7 +2252,7 @@ void do_cmd_necromancer(void) object_aware(o_ptr); object_known(o_ptr); - (void)inven_carry(o_ptr, FALSE); + inven_carry(o_ptr, FALSE); k_allow_special[k_idx] = FALSE; @@ -2342,7 +2342,7 @@ void do_cmd_necromancer(void) msg_print("You faint from the effort!"); /* Hack -- Bypass free action */ - (void)set_paralyzed(randint(5 * oops + 1)); + set_paralyzed(randint(5 * oops + 1)); /* Damage CON (possibly permanently) */ if (rand_int(100) < 50) @@ -2353,7 +2353,7 @@ void do_cmd_necromancer(void) msg_print("You have damaged your body!"); /* Reduce constitution */ - (void)dec_stat(A_CON, 15 + randint(10), perm); + dec_stat(A_CON, 15 + randint(10), perm); } } @@ -2553,7 +2553,7 @@ void do_cmd_summoner_extract() object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_MENTAL; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); msg_print("You extract a totem from the dead corpse."); energy_use += 100; @@ -2731,7 +2731,7 @@ void do_cmd_summoner_summon() } -void do_cmd_summoner(void) +void do_cmd_summoner() { int ext = 0; @@ -2805,7 +2805,7 @@ void do_cmd_summoner(void) /* * Dodge Chance Feedback. */ -void use_ability_blade(void) +void use_ability_blade() { int chance = p_ptr->dodge_chance - ((dun_level * 5) / 6); @@ -2871,7 +2871,7 @@ void symbiotic_info(char *p, int power) /* * Cast a symbiotic spell */ -void do_cmd_symbiotic(void) +void do_cmd_symbiotic() { int n = 0; int chance; @@ -3223,7 +3223,7 @@ void do_cmd_symbiotic(void) msg_print("You faint from the effort!"); /* Hack -- Bypass free action */ - (void)set_paralyzed(randint(5 * oops + 1)); + set_paralyzed(randint(5 * oops + 1)); /* Damage CON (possibly permanently) */ if (rand_int(100) < 50) @@ -3234,7 +3234,7 @@ void do_cmd_symbiotic(void) msg_print("You have damaged your body!"); /* Reduce constitution */ - (void)dec_stat(A_CHR, 15 + randint(10), perm); + dec_stat(A_CHR, 15 + randint(10), perm); } } @@ -3267,7 +3267,7 @@ void do_cmd_create_boulder() object_type forge; object_type *q_ptr; - (void)wall_to_mud(dir); + wall_to_mud(dir); /* Get local object */ q_ptr = &forge; @@ -3281,7 +3281,7 @@ void do_cmd_create_boulder() q_ptr->discount = 90; q_ptr->found = OBJ_FOUND_SELFMADE; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); msg_print("You make some boulders."); diff --git a/src/cmd7.hpp b/src/cmd7.hpp index 4d8b5240..b9d518b2 100644 --- a/src/cmd7.hpp +++ b/src/cmd7.hpp @@ -3,23 +3,23 @@ #include "h-basic.h" #include "object_type_fwd.hpp" -void do_cmd_pray(void); -void do_cmd_create_boulder(void); +void do_cmd_pray(); +void do_cmd_create_boulder(); void necro_info(char *p, int power); void mindcraft_info(char *p, int power); void symbiotic_info(char *p, int power); void mimic_info(char *p, int power); -void do_cmd_summoner(void); -void do_cmd_mindcraft(void); -void do_cmd_mimic(void); -void use_ability_blade(void); -void do_cmd_beastmaster(void); -void do_cmd_powermage(void); -void do_cmd_possessor(void); -void do_cmd_archer(void); -void do_cmd_set_piercing(void); -void do_cmd_necromancer(void); -void do_cmd_unbeliever(void); -void do_cmd_symbiotic(void); +void do_cmd_summoner(); +void do_cmd_mindcraft(); +void do_cmd_mimic(); +void use_ability_blade(); +void do_cmd_beastmaster(); +void do_cmd_powermage(); +void do_cmd_possessor(); +void do_cmd_archer(); +void do_cmd_set_piercing(); +void do_cmd_necromancer(); +void do_cmd_unbeliever(); +void do_cmd_symbiotic(); s32b sroot(s32b n); int clamp_failure_chance(int chance, int minfail); diff --git a/src/dungeon.cc b/src/dungeon.cc index 26a34815..e7bdf34b 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -292,7 +292,7 @@ static byte value_check_aux2_magic(object_type const *o_ptr) /* * Can a player be resurrected? */ -static bool_ granted_resurrection(void) +static bool_ granted_resurrection() { if (praying_to(GOD_ERU)) { @@ -480,7 +480,7 @@ void sense_objects(std::vector const &object_idxs) squeltch_inventory(); } -void sense_inventory(void) +void sense_inventory() { static std::vector idxs; // Initialize static vector if necessary @@ -498,7 +498,7 @@ void sense_inventory(void) /* * Go to any level (ripped off from wiz_jump) */ -static void pattern_teleport(void) +static void pattern_teleport() { /* Ask for level */ if (get_check("Teleport level? ")) @@ -551,27 +551,27 @@ static void pattern_teleport(void) /* * Returns TRUE if we are on the Straight Road... */ -static bool_ pattern_effect(void) +static bool_ pattern_effect() { if ((cave[p_ptr->py][p_ptr->px].feat < FEAT_PATTERN_START) || (cave[p_ptr->py][p_ptr->px].feat > FEAT_PATTERN_XTRA2)) return (FALSE); if (cave[p_ptr->py][p_ptr->px].feat == FEAT_PATTERN_END) { - (void)set_poisoned(0); - (void)set_image(0); - (void)set_stun(0); - (void)set_cut(0); - (void)set_blind(0); - (void)set_afraid(0); - (void)do_res_stat(A_STR, TRUE); - (void)do_res_stat(A_INT, TRUE); - (void)do_res_stat(A_WIS, TRUE); - (void)do_res_stat(A_DEX, TRUE); - (void)do_res_stat(A_CON, TRUE); - (void)do_res_stat(A_CHR, TRUE); - (void)restore_level(); - (void)hp_player(1000); + set_poisoned(0); + set_image(0); + set_stun(0); + set_cut(0); + set_blind(0); + set_afraid(0); + do_res_stat(A_STR, TRUE); + do_res_stat(A_INT, TRUE); + do_res_stat(A_WIS, TRUE); + do_res_stat(A_DEX, TRUE); + do_res_stat(A_CON, TRUE); + do_res_stat(A_CHR, TRUE); + restore_level(); + hp_player(1000); cave_set_feat(p_ptr->py, p_ptr->px, FEAT_PATTERN_OLD); msg_print("This section of the Straight Road looks less powerful."); } @@ -776,7 +776,7 @@ static void regenmana(int percent) * * XXX XXX XXX Should probably be done during monster turns. */ -static void regen_monsters(void) +static void regen_monsters() { auto const &r_info = game->edit_data.r_info; @@ -1220,7 +1220,7 @@ static void process_world_gods() * Note that a single movement in the overhead wilderness mode * consumes 132 times as much energy as a normal one... */ -static void process_world(void) +static void process_world() { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; @@ -1413,7 +1413,7 @@ static void process_world(void) /* Make a new monster */ if (!(dungeon_flags & DF_NO_NEW_MONSTER)) { - (void)alloc_monster(MAX_SIGHT + 5, FALSE); + alloc_monster(MAX_SIGHT + 5, FALSE); } } @@ -1601,7 +1601,7 @@ static void process_world(void) if (i < 1) i = 1; /* Digest some food */ - (void)set_food(p_ptr->food - i); + set_food(p_ptr->food - i); } } @@ -1609,7 +1609,7 @@ static void process_world(void) else { /* Digest a lot of food */ - (void)set_food(p_ptr->food - 100); + set_food(p_ptr->food - 100); } /* Starve to death (slowly) */ @@ -1653,7 +1653,7 @@ static void process_world(void) disturb(); /* Hack -- faint (bypass free action) */ - (void)set_paralyzed(1 + rand_int(5)); + set_paralyzed(1 + rand_int(5)); } } } @@ -1841,19 +1841,19 @@ static void process_world(void) /* Hack -- Hallucinating */ if (p_ptr->image) { - (void)set_image(p_ptr->image - 1); + set_image(p_ptr->image - 1); } /* Holy Aura */ if (p_ptr->holy) { - (void)set_holy(p_ptr->holy - 1); + set_holy(p_ptr->holy - 1); } /* Soul absorbtion */ if (p_ptr->absorb_soul) { - (void)set_absorb_soul(p_ptr->absorb_soul - 1); + set_absorb_soul(p_ptr->absorb_soul - 1); } /* Undead loose Death Points */ @@ -1886,7 +1886,7 @@ static void process_world(void) { char death_message[80]; - (void)get_rnd_line("death.txt", death_message); + get_rnd_line("death.txt", death_message); msg_print(death_message); } @@ -1935,29 +1935,29 @@ static void process_world(void) /* True Strike */ if (p_ptr->strike) { - (void)set_strike(p_ptr->strike - 1); + set_strike(p_ptr->strike - 1); } /* Timed project */ if (p_ptr->tim_project) { - (void)set_project(p_ptr->tim_project - 1, p_ptr->tim_project_gf, p_ptr->tim_project_dam, p_ptr->tim_project_rad, p_ptr->tim_project_flag); + set_project(p_ptr->tim_project - 1, p_ptr->tim_project_gf, p_ptr->tim_project_dam, p_ptr->tim_project_rad, p_ptr->tim_project_flag); } /* Timed roots */ if (p_ptr->tim_roots) { - (void)set_roots(p_ptr->tim_roots - 1, p_ptr->tim_roots_ac, p_ptr->tim_roots_dam); + set_roots(p_ptr->tim_roots - 1, p_ptr->tim_roots_ac, p_ptr->tim_roots_dam); } /* Timed breath */ if (p_ptr->tim_water_breath) { - (void)set_tim_breath(p_ptr->tim_water_breath - 1, FALSE); + set_tim_breath(p_ptr->tim_water_breath - 1, FALSE); } if (p_ptr->tim_magic_breath) { - (void)set_tim_breath(p_ptr->tim_magic_breath - 1, TRUE); + set_tim_breath(p_ptr->tim_magic_breath - 1, TRUE); } /* Timed precognition */ @@ -1969,41 +1969,41 @@ static void process_world(void) /* Timed regen */ if (p_ptr->tim_regen) { - (void)set_tim_regen(p_ptr->tim_regen - 1, p_ptr->tim_regen_pow); + set_tim_regen(p_ptr->tim_regen - 1, p_ptr->tim_regen_pow); } /* Timed Disrupt shield */ if (p_ptr->disrupt_shield) { - (void)set_disrupt_shield(p_ptr->disrupt_shield - 1); + set_disrupt_shield(p_ptr->disrupt_shield - 1); } /* Timed Parasite */ if (p_ptr->parasite) { - (void)set_parasite(p_ptr->parasite - 1, p_ptr->parasite_r_idx); + set_parasite(p_ptr->parasite - 1, p_ptr->parasite_r_idx); } /* Timed Reflection */ if (p_ptr->tim_reflect) { - (void)set_tim_reflect(p_ptr->tim_reflect - 1); + set_tim_reflect(p_ptr->tim_reflect - 1); } /* Timed Prob Travel */ if (p_ptr->prob_travel) { - (void)set_prob_travel(p_ptr->prob_travel - 1); + set_prob_travel(p_ptr->prob_travel - 1); } /* Timed Levitation */ if (p_ptr->tim_ffall) { - (void)set_tim_ffall(p_ptr->tim_ffall - 1); + set_tim_ffall(p_ptr->tim_ffall - 1); } if (p_ptr->tim_fly) { - (void)set_tim_fly(p_ptr->tim_fly - 1); + set_tim_fly(p_ptr->tim_fly - 1); } /* Thunderstorm */ @@ -2045,37 +2045,37 @@ static void process_world(void) PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE); } - (void)set_tim_thunder(p_ptr->tim_thunder - 1, p_ptr->tim_thunder_p1, p_ptr->tim_thunder_p2); + set_tim_thunder(p_ptr->tim_thunder - 1, p_ptr->tim_thunder_p1, p_ptr->tim_thunder_p2); } /* Poisonned hands */ if (p_ptr->tim_poison) { - (void)set_poison(p_ptr->tim_poison - 1); + set_poison(p_ptr->tim_poison - 1); } /* Brightness */ if (p_ptr->tim_lite) { - (void)set_lite(p_ptr->tim_lite - 1); + set_lite(p_ptr->tim_lite - 1); } /* Blindness */ if (p_ptr->blind) { - (void)set_blind(p_ptr->blind - 1); + set_blind(p_ptr->blind - 1); } /* Timed no_breeds */ if (no_breeds) { - (void)set_no_breeders(no_breeds - 1); + set_no_breeders(no_breeds - 1); } /* Timed mimic */ if (p_ptr->tim_mimic) { - (void)set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, p_ptr->mimic_level); + set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, p_ptr->mimic_level); } /* Timed special move commands */ @@ -2087,25 +2087,25 @@ static void process_world(void) /* Timed invisibility */ if (p_ptr->tim_invisible) { - (void)set_invis(p_ptr->tim_invisible - 1, p_ptr->tim_inv_pow); + set_invis(p_ptr->tim_invisible - 1, p_ptr->tim_inv_pow); } /* Times see-invisible */ if (p_ptr->tim_invis) { - (void)set_tim_invis(p_ptr->tim_invis - 1); + set_tim_invis(p_ptr->tim_invis - 1); } /* Timed esp */ if (p_ptr->tim_esp) { - (void)set_tim_esp(p_ptr->tim_esp - 1); + set_tim_esp(p_ptr->tim_esp - 1); } /* Timed infra-vision */ if (p_ptr->tim_infra) { - (void)set_tim_infra(p_ptr->tim_infra - 1); + set_tim_infra(p_ptr->tim_infra - 1); } /* Paralysis */ @@ -2117,109 +2117,109 @@ static void process_world(void) /* Confusion */ if (p_ptr->confused) { - (void)set_confused(p_ptr->confused - 1); + set_confused(p_ptr->confused - 1); } /* Afraid */ if (p_ptr->afraid) { - (void)set_afraid(p_ptr->afraid - 1); + set_afraid(p_ptr->afraid - 1); } /* Fast */ if (p_ptr->fast) { - (void)set_fast(p_ptr->fast - 1, p_ptr->speed_factor); + set_fast(p_ptr->fast - 1, p_ptr->speed_factor); } /* Light speed */ if (p_ptr->lightspeed) { - (void)set_light_speed(p_ptr->lightspeed - 1); + set_light_speed(p_ptr->lightspeed - 1); } /* Slow */ if (p_ptr->slow) { - (void)set_slow(p_ptr->slow - 1); + set_slow(p_ptr->slow - 1); } /* Protection from evil */ if (p_ptr->protevil) { - (void)set_protevil(p_ptr->protevil - 1); + set_protevil(p_ptr->protevil - 1); } /* Invulnerability */ if (p_ptr->invuln) { - (void)set_invuln(p_ptr->invuln - 1); + set_invuln(p_ptr->invuln - 1); } /* Wraith form */ if (p_ptr->tim_wraith) { - (void)set_shadow(p_ptr->tim_wraith - 1); + set_shadow(p_ptr->tim_wraith - 1); } /* Heroism */ if (p_ptr->hero) { - (void)set_hero(p_ptr->hero - 1); + set_hero(p_ptr->hero - 1); } /* Super Heroism */ if (p_ptr->shero) { - (void)set_shero(p_ptr->shero - 1); + set_shero(p_ptr->shero - 1); } /* Blessed */ if (p_ptr->blessed) { - (void)set_blessed(p_ptr->blessed - 1); + set_blessed(p_ptr->blessed - 1); } /* Shield */ if (p_ptr->shield) { - (void)set_shield(p_ptr->shield - 1, p_ptr->shield_power, p_ptr->shield_opt, p_ptr->shield_power_opt, p_ptr->shield_power_opt2); + set_shield(p_ptr->shield - 1, p_ptr->shield_power, p_ptr->shield_opt, p_ptr->shield_power_opt, p_ptr->shield_power_opt2); } /* Oppose Acid */ if (p_ptr->oppose_acid) { - (void)set_oppose_acid(p_ptr->oppose_acid - 1); + set_oppose_acid(p_ptr->oppose_acid - 1); } /* Oppose Lightning */ if (p_ptr->oppose_elec) { - (void)set_oppose_elec(p_ptr->oppose_elec - 1); + set_oppose_elec(p_ptr->oppose_elec - 1); } /* Oppose Fire */ if (p_ptr->oppose_fire) { - (void)set_oppose_fire(p_ptr->oppose_fire - 1); + set_oppose_fire(p_ptr->oppose_fire - 1); } /* Oppose Cold */ if (p_ptr->oppose_cold) { - (void)set_oppose_cold(p_ptr->oppose_cold - 1); + set_oppose_cold(p_ptr->oppose_cold - 1); } /* Oppose Poison */ if (p_ptr->oppose_pois) { - (void)set_oppose_pois(p_ptr->oppose_pois - 1); + set_oppose_pois(p_ptr->oppose_pois - 1); } /* Oppose Chaos & Confusion */ if (p_ptr->oppose_cc) { - (void)set_oppose_cc(p_ptr->oppose_cc - 1); + set_oppose_cc(p_ptr->oppose_cc - 1); } /* Timed mimicry */ @@ -2261,7 +2261,7 @@ static void process_world(void) int adjust = (adj_con_fix[p_ptr->stat_ind[A_CON]] + 1); /* Apply some healing */ - (void)set_poisoned(p_ptr->poisoned - adjust); + set_poisoned(p_ptr->poisoned - adjust); } /* Stun */ @@ -2270,7 +2270,7 @@ static void process_world(void) int adjust = (adj_con_fix[p_ptr->stat_ind[A_CON]] + 1); /* Apply some healing */ - (void)set_stun(p_ptr->stun - adjust); + set_stun(p_ptr->stun - adjust); } /* Cut */ @@ -2282,7 +2282,7 @@ static void process_world(void) if (p_ptr->cut > 1000) adjust = 0; /* Apply some healing */ - (void)set_cut(p_ptr->cut - adjust); + set_cut(p_ptr->cut - adjust); } /* Hack - damage done by the dungeon -SC- */ @@ -2657,7 +2657,7 @@ static void process_world(void) { p_ptr->exp -= 1 + plev / 5; p_ptr->max_exp -= 1 + plev / 5; - (void)do_dec_stat(rand_int(6), STAT_DEC_NORMAL); + do_dec_stat(rand_int(6), STAT_DEC_NORMAL); check_experience(); } } @@ -3162,7 +3162,7 @@ static void process_world(void) /* * Verify use of "wizard" mode */ -static bool_ enter_wizard_mode(void) +static bool_ enter_wizard_mode() { /* Ask first time, but not while loading a dead char with the -w option */ if (!noscore && !(p_ptr->chp < 0)) @@ -3190,7 +3190,7 @@ static bool_ enter_wizard_mode(void) /* * Verify use of "debug" commands */ -static bool_ enter_debug_mode(void) +static bool_ enter_debug_mode() { /* Ask first time */ if (!noscore && !wizard) @@ -3221,7 +3221,7 @@ static bool_ enter_debug_mode(void) * * XXX XXX XXX Make some "blocks" */ -static void process_command(void) +static void process_command() { auto const &wf_info = game->edit_data.wf_info; @@ -4151,7 +4151,7 @@ static void process_command(void) * must come first just in case somebody manages to corrupt * the savefiles by clever use of menu commands or something. */ -static void process_player(void) +static void process_player() { auto const &f_info = game->edit_data.f_info; auto const &k_info = game->edit_data.k_info; @@ -4603,7 +4603,7 @@ static void process_player(void) * This function will not exit until the level is completed, * the user dies, or the game is terminated. */ -static void dungeon(void) +static void dungeon() { auto const &d_info = game->edit_data.d_info; @@ -4981,7 +4981,7 @@ static void dungeon(void) /* * Load some "user pref files" */ -static void load_all_pref_files(void) +static void load_all_pref_files() { char buf[1024]; @@ -5055,7 +5055,7 @@ void play_game() /* Hack -- turn off the cursor */ - (void)Term_set_cursor(0); + Term_set_cursor(0); /* Character list */ bool_ new_game = FALSE; @@ -5363,14 +5363,14 @@ void play_game() p_ptr->csp_frac = 0; /* Hack -- Healing */ - (void)set_blind(0); - (void)set_confused(0); - (void)set_poisoned(0); - (void)set_afraid(0); - (void)set_paralyzed(0); - (void)set_image(0); - (void)set_stun(0); - (void)set_cut(0); + set_blind(0); + set_confused(0); + set_poisoned(0); + set_afraid(0); + set_paralyzed(0); + set_image(0); + set_stun(0); + set_cut(0); /* accounting for a new ailment. -LM- */ p_ptr->black_breath = FALSE; @@ -5379,7 +5379,7 @@ void play_game() p_ptr->necro_extra &= ~CLASS_UNDEAD; /* Hack -- Prevent starvation */ - (void)set_food(PY_FOOD_MAX - 1); + set_food(PY_FOOD_MAX - 1); /* Hack -- cancel recall */ if (p_ptr->word_recall) diff --git a/src/files.cc b/src/files.cc index e148a679..81fdeeec 100644 --- a/src/files.cc +++ b/src/files.cc @@ -1045,7 +1045,7 @@ errr process_pref_file(cptr name) if (buf[0] == '%') { /* Process that file if allowed */ - (void)process_pref_file(buf + 2); + process_pref_file(buf + 2); /* Continue */ continue; @@ -1088,7 +1088,7 @@ static void prt_lnum(cptr header, s32b num, int row, int col, byte color) char out_val[32]; put_str(header, row, col); - (void)sprintf(out_val, "%9ld", (long)num); + sprintf(out_val, "%9ld", (long)num); c_put_str(color, out_val, row, col + len); } @@ -1104,7 +1104,7 @@ static void prt_num(cptr header, int num, int row, int col, byte color, put_str(header, row, col); put_str(space, row, col + len); - (void)sprintf(out_val, "%6ld", (long)num); + sprintf(out_val, "%6ld", (long)num); c_put_str(color, out_val, row, col + len + strlen(space)); } @@ -1119,7 +1119,7 @@ static void prt_str(cptr header, cptr str, int row, int col, byte color) put_str(header, row, col); put_str(" ", row, col + len); - (void)sprintf(out_val, "%6s", str); + sprintf(out_val, "%6s", str); c_put_str(color, out_val, row, col + len + 3); } @@ -1130,7 +1130,7 @@ static void prt_str(cptr header, cptr str, int row, int col, byte color) * For this to look right, the following should be spaced the * same as in the prt_lnum code... -CFT */ -static void display_player_middle(void) +static void display_player_middle() { int show_tohit = p_ptr->dis_to_h; int show_todam = p_ptr->dis_to_d; @@ -1207,10 +1207,10 @@ static void display_player_middle(void) { color = TERM_L_RED; } - (void)sprintf(num, "%6ld", (long)p_ptr->chp); + sprintf(num, "%6ld", (long)p_ptr->chp); c_put_str(color, num, 9, 65); put_str("/", 9, 71); - (void)sprintf(num, "%6ld", (long)p_ptr->mhp); + sprintf(num, "%6ld", (long)p_ptr->mhp); c_put_str(TERM_L_BLUE, num, 9, 72); } else @@ -1228,10 +1228,10 @@ static void display_player_middle(void) { color = TERM_RED; } - (void)sprintf(num, "%6ld", (long)p_ptr->chp); + sprintf(num, "%6ld", (long)p_ptr->chp); c_put_str(color, num, 9, 65); put_str("/", 9, 71); - (void)sprintf(num, "%6ld", (long)p_ptr->mhp); + sprintf(num, "%6ld", (long)p_ptr->mhp); c_put_str(TERM_L_GREEN, num, 9, 72); } @@ -1248,10 +1248,10 @@ static void display_player_middle(void) { color = TERM_RED; } - (void)sprintf(num, "%6ld", (long)p_ptr->csp); + sprintf(num, "%6ld", (long)p_ptr->csp); c_put_str(color, num, 10, 65); put_str("/", 10, 71); - (void)sprintf(num, "%6ld", (long)p_ptr->msp); + sprintf(num, "%6ld", (long)p_ptr->msp); c_put_str(TERM_L_GREEN, num, 10, 72); put_str("Sanity ", 11, 52); @@ -1267,10 +1267,10 @@ static void display_player_middle(void) { color = TERM_RED; } - (void)sprintf(num, "%6ld", (long)p_ptr->csane); + sprintf(num, "%6ld", (long)p_ptr->csane); c_put_str(color, num, 11, 65); put_str("/", 11, 71); - (void)sprintf(num, "%6ld", (long)p_ptr->msane); + sprintf(num, "%6ld", (long)p_ptr->msane); c_put_str(TERM_L_GREEN, num, 11, 72); if (p_ptr->pgod != GOD_NONE) @@ -1283,13 +1283,13 @@ static void display_player_middle(void) if (speed > 110) { char s[11]; - (void)sprintf(s, "Fast (+%d)", speed - 110); + sprintf(s, "Fast (+%d)", speed - 110); c_put_str(TERM_L_GREEN, s, 13, (speed >= 120) ? 68 : 69); } else if (speed < 110) { char s[11]; - (void)sprintf(s, "Slow (-%d)", 110 - speed); + sprintf(s, "Slow (-%d)", 110 - speed); c_put_str(TERM_L_UMBER, s, 13, (speed <= 100) ? 68 : 69); } else @@ -1392,7 +1392,7 @@ static cptr likert(int x, int y) * * This code is "imitated" elsewhere to "dump" a character sheet. */ -static void display_player_various(void) +static void display_player_various() { auto const &r_info = game->edit_data.r_info; @@ -2454,7 +2454,7 @@ static void file_character_print_grid(FILE *fff, bool_ show_gaps, bool_ show_leg { for (x = 0; x < 40; x++) { - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); buf[x] = c; } @@ -2467,7 +2467,7 @@ static void file_character_print_grid(FILE *fff, bool_ show_gaps, bool_ show_leg { for (x = 40; x < 80; x++) { - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); buf[x - 40] = c; } @@ -2579,10 +2579,10 @@ errr file_character(cptr name, bool_ full) char out_val[160]; /* Close the file */ - (void)fd_close(fd); + fd_close(fd); /* Build query */ - (void)sprintf(out_val, "Replace existing file %s? ", buf); + sprintf(out_val, "Replace existing file %s? ", buf); /* Ask */ if (get_check(out_val)) fd = -1; @@ -2617,7 +2617,7 @@ errr file_character(cptr name, bool_ full) for (x = 0; x < 79; x++) { /* Get the attr/char */ - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; @@ -2640,7 +2640,7 @@ errr file_character(cptr name, bool_ full) for (x = 0; x < 79; x++) { /* Get the attr/char */ - (void)(Term_what(x, y, &a, &c)); + (Term_what(x, y, &a, &c)); /* Dump it */ buf[x] = c; @@ -3381,7 +3381,7 @@ static bool_ show_file_aux(cptr name, cptr what, int line) { /* Get "h_ptr->shower" */ prt("Show: ", hgt - 1, 0); - (void)askfor_aux(h_ptr->shower, 80); + askfor_aux(h_ptr->shower, 80); } /* Hack -- try finding */ @@ -3718,7 +3718,7 @@ void html_screenshot(cptr name) /* * Peruse the On-Line-Help */ -void do_cmd_help(void) +void do_cmd_help() { /* Save screen */ screen_save(); @@ -3799,7 +3799,7 @@ void process_player_name(bool_ sf) * * What a horrible name for a global function. XXX XXX XXX */ -void get_name(void) +void get_name() { char tmp[32]; @@ -3846,7 +3846,7 @@ void get_name(void) /* * Hack -- commit suicide */ -void do_cmd_suicide(void) +void do_cmd_suicide() { int i; @@ -3923,7 +3923,7 @@ void remove_cave_view(bool_ remove) /* * Save the game */ -void do_cmd_save_game(void) +void do_cmd_save_game() { remove_cave_view(TRUE); @@ -3990,7 +3990,7 @@ void autosave_checkpoint() /* * Hack -- Calculates the total number of points earned -JWT- */ -static long total_points(void) +static long total_points() { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; @@ -4104,7 +4104,7 @@ static long total_points(void) /* * Display a "tomb-stone" */ -static void print_tomb(void) +static void print_tomb() { time_t ct = time(nullptr); @@ -4164,7 +4164,7 @@ static void print_tomb(void) /* * Display some character info */ -static void show_info(void) +static void show_info() { /* Hack -- Know everything in the inven/equip */ for (auto &o_ref: p_ptr->inventory) @@ -4235,7 +4235,7 @@ static void show_info(void) Term_save(); /* Dump a character file */ - (void)file_character(out_val, TRUE); + file_character(out_val, TRUE); /* Load screen */ Term_load(); @@ -4694,7 +4694,7 @@ void race_score(int race_num) * Race Legends * -KMW- */ -void race_legends(void) +void race_legends() { auto const &race_info = game->edit_data.race_info; @@ -4717,7 +4717,7 @@ void race_legends(void) * Enters a players name on a hi-score table, if "legal", and in any * case, displays some relevant portion of the high score list. */ -static errr top_twenty(void) +static errr top_twenty() { int j; @@ -4850,7 +4850,7 @@ out: /* * Predict the players location, and display it. */ -static errr predict_score(void) +static errr predict_score() { int j; @@ -4989,7 +4989,7 @@ void predict_score_gui(bool_ *initialized_p, bool_ *game_in_progress_p) } /* Close the high score file */ - (void)fd_close(highscore_fd); + fd_close(highscore_fd); /* Forget the fd */ highscore_fd = -1; @@ -5008,7 +5008,7 @@ void predict_score_gui(bool_ *initialized_p, bool_ *game_in_progress_p) /* * Change the player into a King! -RAK- */ -static void kingly(void) +static void kingly() { /* Hack -- retire in town */ dun_level = 0; @@ -5100,7 +5100,7 @@ void wipe_saved() * * This function is called only from "main.c" and "signals.c". */ -void close_game(void) +void close_game() { /* Handle stuff */ handle_stuff(); diff --git a/src/files.h b/src/files.h index ddb9c5c8..78521f4c 100644 --- a/src/files.h +++ b/src/files.h @@ -7,7 +7,7 @@ extern "C" { #endif -void do_cmd_save_game(void); +void do_cmd_save_game(); void predict_score_gui(bool_ *initialized, bool_ *game_in_progress); #ifdef __cplusplus diff --git a/src/files.hpp b/src/files.hpp index d86307e8..f431eb69 100644 --- a/src/files.hpp +++ b/src/files.hpp @@ -10,7 +10,7 @@ void html_screenshot(cptr name); void help_file_screenshot(cptr name); object_flag_set player_flags(); -void wipe_saved(void); +void wipe_saved(); s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2); void display_player(int mode); std::string describe_player_location(); @@ -19,15 +19,15 @@ errr process_pref_file_aux(char *buf); errr process_pref_file(cptr name); void show_string(const char *lines, const char *title, int line = 0); void show_file(cptr name, cptr what, int line = 0); -void do_cmd_help(void); -void process_player_base(void); -void get_name(void); -void do_cmd_suicide(void); +void do_cmd_help(); +void process_player_base(); +void get_name(); +void do_cmd_suicide(); void autosave_checkpoint(); -void close_game(void); +void close_game(); errr get_rnd_line(const char * file_name, char * output); char *get_line(const char* fname, cptr fdir, char *linbuf, int line); -void race_legends(void); +void race_legends(); void show_highclass(int building); errr get_xtra_line(const char * file_name, monster_type *m_ptr, char * output); void process_player_name(bool_ sf); diff --git a/src/generate.cc b/src/generate.cc index 714238a8..5286532d 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -1594,7 +1594,7 @@ static void build_streamer2(int feat, int killwall) /* * Build a destroyed level */ -static void destroy_level(void) +static void destroy_level() { int y1, x1, y, x, k, t, n; @@ -1865,7 +1865,7 @@ static void vault_monsters(int y1, int x1, int num) /* Place the monster (allow groups) */ monster_level = dun_level + 2; - (void)place_monster(y, x, TRUE, TRUE); + place_monster(y, x, TRUE, TRUE); monster_level = dun_level; } } @@ -3030,7 +3030,7 @@ static void build_type5(int by0, int bx0) int r_idx = what[rand_int(64)]; /* Place that "random" monster (no groups) */ - (void)place_monster_aux(y, x, r_idx, FALSE, FALSE, MSTATUS_ENEMY); + place_monster_aux(y, x, r_idx, FALSE, FALSE, MSTATUS_ENEMY); } } } @@ -4435,7 +4435,7 @@ bool_ generate_fracave(int y0, int x0, int xsize, int ysize, /* * Makes a cave system in the center of the dungeon */ -static void build_cavern(void) +static void build_cavern() { int grd, roug, cutoff, xsize, ysize, x0, y0; bool_ done, light, room; @@ -6868,7 +6868,7 @@ bool_ level_generate_dungeon() while (dun->cent_n == 0) { /* ...force the creation of a small rectangular room */ - (void)room_build(0, 0, 1); + room_build(0, 0, 1); } /* Hack -- Scramble the room order */ @@ -7184,7 +7184,7 @@ static void save_all_friends() * *hint* *hint* with this made extern, and we no longer have to * store fill_type and floor_type in the savefile... */ -static void init_feat_info(void) +static void init_feat_info() { auto const &d_info = game->edit_data.d_info; @@ -7546,7 +7546,7 @@ static void supersize_grid_tile(int sy, int sx, int ty, int tx) * * Note that "dun_body" adds about 4000 bytes of memory to the stack. */ -static bool_ cave_gen(void) +static bool_ cave_gen() { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; @@ -7696,7 +7696,7 @@ static bool_ cave_gen(void) /* Put some monsters in the dungeon */ for (i = i + k; i > 0; i--) { - (void)alloc_monster(0, TRUE); + alloc_monster(0, TRUE); } } @@ -8066,7 +8066,7 @@ static bool_ cave_gen(void) /* Mega-Hack */ #define REGEN_HACK 0x02 -bool_ build_special_level(void) +bool_ build_special_level() { auto const &d_info = game->edit_data.d_info; @@ -8129,7 +8129,7 @@ bool_ build_special_level(void) * Prepare regeneration of a special level, which should not happen, * but just in case... */ -static void wipe_special_level(void) +static void wipe_special_level() { auto const &d_info = game->edit_data.d_info; @@ -8157,7 +8157,7 @@ static void wipe_special_level(void) /* * Finalise generation of a special level */ -static void finalise_special_level(void) +static void finalise_special_level() { auto const &d_info = game->edit_data.d_info; @@ -8229,7 +8229,7 @@ static void generate_grid_mana() * * Hack -- allow auto-scumming via a gameplay option. */ -void generate_cave(void) +void generate_cave() { auto const &d_info = game->edit_data.d_info; auto &a_info = game->edit_data.a_info; diff --git a/src/generate.hpp b/src/generate.hpp index 296afb8d..a21ba069 100644 --- a/src/generate.hpp +++ b/src/generate.hpp @@ -8,5 +8,5 @@ bool_ level_generate_dungeon(); bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room); void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff); bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy); -void generate_cave(void); +void generate_cave(); void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info); diff --git a/src/init1.cc b/src/init1.cc index 056b5b51..e367f603 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -6910,7 +6910,7 @@ errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, b if (buf[0] == '%') { /* Process that file if allowed */ - (void)process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full); + process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full); /* Continue */ continue; diff --git a/src/init2.cc b/src/init2.cc index 88fd5470..e79ba87c 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -528,7 +528,7 @@ static void init_basic() /* * Initialise misc. values */ -static errr init_misc(void) +static errr init_misc() { int xstart = 0; int ystart = 0; @@ -558,7 +558,7 @@ static errr init_misc(void) /* * Initialise town array */ -static errr init_towns(void) +static errr init_towns() { auto const &st_info = game->edit_data.st_info; @@ -614,7 +614,7 @@ void create_stores_stock(int t) /* * Initialise some other arrays */ -static errr init_other(void) +static errr init_other() { auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; @@ -632,7 +632,7 @@ static errr init_other(void) /*** Prepare "vinfo" array ***/ /* Used by "update_view()" */ - (void)vinfo_init(); + vinfo_init(); /* Allocate and Wipe the object list */ @@ -687,7 +687,7 @@ static errr init_other(void) /*** Pre-allocate space for the "format()" buffer ***/ /* Hack -- Just call the "format()" function */ - (void)format("%s (%s).", "Dark God ", MAINTAINER); + format("%s (%s).", "Dark God ", MAINTAINER); /* Success */ return (0); @@ -698,7 +698,7 @@ static errr init_other(void) /* * Initialise some other arrays */ -static errr init_alloc(void) +static errr init_alloc() { auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; @@ -910,7 +910,7 @@ static void init_sets_aux() /* * Mark guardians and their artifacts with SPECIAL_GENE flag */ -static void init_guardians(void) +static void init_guardians() { auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; @@ -1026,7 +1026,7 @@ static void init_angband_aux(cptr why) * Note that the "graf-xxx.prf" file must be loaded separately, * if needed, in the first (?) pass through "TERM_XTRA_REACT". */ -void init_angband(void) +void init_angband() { int fd = -1; @@ -1083,7 +1083,7 @@ void init_angband(void) } /* Close it */ - (void)fd_close(fd); + fd_close(fd); /*** Display the "news" file ***/ @@ -1145,7 +1145,7 @@ void init_angband(void) } /* Close it */ - (void)fd_close(fd); + fd_close(fd); /*** Initialise some arrays ***/ diff --git a/src/init2.h b/src/init2.h index d99cd62c..bdc525bf 100644 --- a/src/init2.h +++ b/src/init2.h @@ -6,7 +6,7 @@ extern "C" { #endif void init_file_paths(char *path); -void init_angband(void); +void init_angband(); #ifdef __cplusplus } // extern "C" diff --git a/src/init2.hpp b/src/init2.hpp index e1c3b4ef..de575e77 100644 --- a/src/init2.hpp +++ b/src/init2.hpp @@ -4,6 +4,6 @@ void init_corruptions(); void create_stores_stock(int t); -errr init_v_info(void); +errr init_v_info(); extern s16b error_idx; extern s16b error_line; diff --git a/src/levels.hpp b/src/levels.hpp index fb3169b4..a48f1d95 100644 --- a/src/levels.hpp +++ b/src/levels.hpp @@ -4,10 +4,10 @@ bool_ get_dungeon_generator(char *buf); bool_ get_level_desc(char *buf); -void get_level_flags(void); +void get_level_flags(); bool_ get_dungeon_name(char *buf); bool_ get_dungeon_special(char *buf); -int get_branch(void); -int get_fbranch(void); -int get_flevel(void); +int get_branch(); +int get_fbranch(); +int get_flevel(); bool_ get_dungeon_save(char *buf); diff --git a/src/loadsave.cc b/src/loadsave.cc index 196e8d81..86c67956 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -94,7 +94,7 @@ struct option_value { * not to save it. There's no point. -- takkaria */ -static byte sf_get(void) +static byte sf_get() { byte c; @@ -108,7 +108,7 @@ static byte sf_get(void) static void sf_put(byte v) { - (void)putc((int)v, fff); + putc((int)v, fff); } /* @@ -1547,7 +1547,7 @@ static bool_ do_dungeon(ls_flag_t flag, bool no_companions) } /* Save the current persistent dungeon -SC- */ -void save_dungeon(void) +void save_dungeon() { char tmp[16]; char name[1024], buf[5]; @@ -2579,7 +2579,7 @@ static bool_ do_savefile_aux(ls_flag_t flag) /* * Actually read the savefile */ -static errr rd_savefile(void) +static errr rd_savefile() { errr err = 0; @@ -2617,7 +2617,7 @@ static errr rd_savefile(void) * Note that we always try to load the "current" savefile, even if * there is no such file, so we must check for "empty" savefile names. */ -bool_ load_player(void) +bool_ load_player() { errr err = 0; @@ -2780,7 +2780,7 @@ static bool_ save_player_aux(char *name) if (fd >= 0) { /* Close the "fd" */ - (void)fd_close(fd); + fd_close(fd); /* Open the savefile */ fff = my_fopen(name, "wb"); @@ -2799,7 +2799,7 @@ static bool_ save_player_aux(char *name) if (!ok) { /* Remove "broken" files */ - (void)fd_kill(name); + fd_kill(name); } } @@ -2813,7 +2813,7 @@ static bool_ save_player_aux(char *name) /* * Attempt to save the player in a savefile */ -bool_ save_player(void) +bool_ save_player() { int result = FALSE; char safe[1024]; diff --git a/src/loadsave.h b/src/loadsave.h index 0d2c4ff5..52782dac 100644 --- a/src/loadsave.h +++ b/src/loadsave.h @@ -7,8 +7,8 @@ extern "C" { #endif -void save_dungeon(void); -bool_ save_player(void); +void save_dungeon(); +bool_ save_player(); #ifdef __cplusplus } // extern "C" diff --git a/src/loadsave.hpp b/src/loadsave.hpp index d80a3e7e..01a3cb87 100644 --- a/src/loadsave.hpp +++ b/src/loadsave.hpp @@ -4,4 +4,4 @@ bool_ file_exist(cptr buf); bool_ load_dungeon(char *ext); -bool_ load_player(void); +bool_ load_player(); diff --git a/src/main.cc b/src/main.cc index 3a08c6b0..c0ac3826 100644 --- a/src/main.cc +++ b/src/main.cc @@ -47,7 +47,7 @@ static void quit_hook(cptr s) * home directory or try to create it if it doesn't exist. * Returns FALSE if all the attempts fail. */ -static void init_save_dir(void) +static void init_save_dir() { char dirpath[1024]; char versionpath[1024]; diff --git a/src/melee1.cc b/src/melee1.cc index 1b20588a..58ebfbaa 100644 --- a/src/melee1.cc +++ b/src/melee1.cc @@ -1100,7 +1100,7 @@ bool_ carried_make_attack_normal(int r_idx) } /* Apply the cut */ - if (k) (void)set_cut(p_ptr->cut + k); + if (k) set_cut(p_ptr->cut + k); } /* Handle stun */ @@ -1141,7 +1141,7 @@ bool_ carried_make_attack_normal(int r_idx) } /* Apply the stun */ - if (k) (void)set_stun(p_ptr->stun + k); + if (k) set_stun(p_ptr->stun + k); } } @@ -2518,7 +2518,7 @@ bool_ make_attack_normal(int m_idx, byte divis) } /* Apply the cut */ - if (k) (void)set_cut(p_ptr->cut + k); + if (k) set_cut(p_ptr->cut + k); } /* Handle stun */ @@ -2559,7 +2559,7 @@ bool_ make_attack_normal(int m_idx, byte divis) } /* Apply the stun */ - if (k) (void)set_stun(p_ptr->stun + k); + if (k) set_stun(p_ptr->stun + k); } if (explode) diff --git a/src/melee2.cc b/src/melee2.cc index fbc793bd..3ab3cc1c 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -607,7 +607,7 @@ static void bolt(int m_idx, int typ, int dam_hp) int flg = PROJECT_STOP | PROJECT_KILL; /* Target the player with a bolt attack */ - (void)project(m_idx, 0, p_ptr->py, p_ptr->px, dam_hp, typ, flg); + project(m_idx, 0, p_ptr->py, p_ptr->px, dam_hp, typ, flg); } @@ -837,7 +837,7 @@ static void breath(int m_idx, int typ, int dam_hp, int rad) if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2; /* Target the player with a ball attack */ - (void)project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg); + project(m_idx, rad, p_ptr->py, p_ptr->px, dam_hp, typ, flg); } @@ -856,7 +856,7 @@ static void monst_breath_monst(int m_idx, int y, int x, int typ, int dam_hp, int /* Determine the radius of the blast */ if (rad < 1) rad = (r_ptr->flags & RF_POWERFUL) ? 3 : 2; - (void)project(m_idx, rad, y, x, dam_hp, typ, flg); + project(m_idx, rad, y, x, dam_hp, typ, flg); } @@ -869,7 +869,7 @@ static void monst_bolt_monst(int m_idx, int y, int x, int typ, int dam_hp) { int flg = PROJECT_STOP | PROJECT_KILL; - (void)project(m_idx, 0, y, x, dam_hp, typ, flg); + project(m_idx, 0, y, x, dam_hp, typ, flg); } @@ -883,7 +883,7 @@ static void monster_msg(cptr fmt, ...) va_start(vp, fmt); /* Format the args, save the length */ - (void)vstrnfmt(buf, 1024, fmt, vp); + vstrnfmt(buf, 1024, fmt, vp); /* End the Varargs Stuff */ va_end(vp); @@ -916,7 +916,7 @@ void cmonster_msg(char a, cptr fmt, ...) va_start(vp, fmt); /* Format the args, save the length */ - (void)vstrnfmt(buf, 1024, fmt, vp); + vstrnfmt(buf, 1024, fmt, vp); /* End the Varargs Stuff */ va_end(vp); @@ -2119,7 +2119,7 @@ static bool_ monst_spell_monst(int m_idx) else monster_msg("%^s gestures in shadow.", m_name); if (seen) monster_msg("%^s is surrounded by darkness.", t_name); - (void)project(m_idx, 3, y, x, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL); + project(m_idx, 3, y, x, 0, GF_DARK_WEAK, PROJECT_GRID | PROJECT_KILL); /* Lite up the room */ unlite_room(y, x); break; @@ -3103,12 +3103,12 @@ static bool_ make_attack_spell(int m_idx) if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(4) + 4); + set_confused(p_ptr->confused + rand_int(4) + 4); } if ((!p_ptr->resist_chaos) && (randint(3) == 1)) { - (void) set_image(p_ptr->image + rand_int(250) + 150); + set_image(p_ptr->image + rand_int(250) + 150); } take_sanity_hit(damroll(8, 8), ddesc); @@ -3138,26 +3138,26 @@ static bool_ make_attack_spell(int m_idx) take_sanity_hit(damroll(12, 15), ddesc); if (!p_ptr->resist_blind) { - (void)set_blind(p_ptr->blind + 8 + rand_int(8)); + set_blind(p_ptr->blind + 8 + rand_int(8)); } if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(4) + 4); + set_confused(p_ptr->confused + rand_int(4) + 4); } if (!p_ptr->free_act) { - (void)set_paralyzed(rand_int(4) + 4); + set_paralyzed(rand_int(4) + 4); } - (void)set_slow(p_ptr->slow + rand_int(4) + 4); + set_slow(p_ptr->slow + rand_int(4) + 4); while (rand_int(100) > p_ptr->skill_sav) - (void)do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); while (rand_int(100) > p_ptr->skill_sav) - (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); if (!p_ptr->resist_chaos) { - (void) set_image(p_ptr->image + rand_int(250) + 150); + set_image(p_ptr->image + rand_int(250) + 150); } } break; @@ -3226,7 +3226,7 @@ static bool_ make_attack_spell(int m_idx) else { take_hit(damroll(15, 15), ddesc); - (void)set_cut(p_ptr->cut + damroll(10, 10)); + set_cut(p_ptr->cut + damroll(10, 10)); } break; } @@ -3358,7 +3358,7 @@ static bool_ make_attack_spell(int m_idx) } else { - (void)set_afraid(p_ptr->afraid + rand_int(4) + 4); + set_afraid(p_ptr->afraid + rand_int(4) + 4); } update_smart_learn(m_idx, DRS_FEAR); break; @@ -3379,7 +3379,7 @@ static bool_ make_attack_spell(int m_idx) } else { - (void)set_blind(12 + rand_int(4)); + set_blind(12 + rand_int(4)); } update_smart_learn(m_idx, DRS_BLIND); break; @@ -3400,7 +3400,7 @@ static bool_ make_attack_spell(int m_idx) } else { - (void)set_confused(p_ptr->confused + rand_int(4) + 4); + set_confused(p_ptr->confused + rand_int(4) + 4); } update_smart_learn(m_idx, DRS_CONF); break; @@ -3420,7 +3420,7 @@ static bool_ make_attack_spell(int m_idx) } else { - (void)set_slow(p_ptr->slow + rand_int(4) + 4); + set_slow(p_ptr->slow + rand_int(4) + 4); } update_smart_learn(m_idx, DRS_FREE); break; @@ -3441,7 +3441,7 @@ static bool_ make_attack_spell(int m_idx) } else { - (void)set_paralyzed(rand_int(4) + 4); + set_paralyzed(rand_int(4) + 4); } update_smart_learn(m_idx, DRS_FREE); break; @@ -3617,7 +3617,7 @@ static bool_ make_attack_spell(int m_idx) disturb(); if (blind) msg_format("%^s mumbles.", m_name); else msg_format("%^s gestures in shadow.", m_name); - (void)unlite_area(0, 3); + unlite_area(0, 3); break; } @@ -4443,7 +4443,7 @@ static bool_ get_moves(int m_idx, int *mm) if (options->flow_by_sound) { /* Adjust movement */ - (void)get_fear_moves_aux(m_idx, &y, &x); + get_fear_moves_aux(m_idx, &y, &x); } } } @@ -5974,7 +5974,7 @@ static void process_monster(int m_idx, bool_ is_frien) if (do_move && (ny == p_ptr->py) && (nx == p_ptr->px)) { /* Do the attack */ - (void)make_attack_normal(m_idx, 1); + make_attack_normal(m_idx, 1); /* Do not move */ do_move = FALSE; @@ -6370,7 +6370,7 @@ void summon_maint(int m_idx) * changes (flags, attacks, spells), we induce a redraw of the monster * recall window. */ -void process_monsters(void) +void process_monsters() { auto const &r_info = game->edit_data.r_info; diff --git a/src/melee2.hpp b/src/melee2.hpp index d3af972f..d5106850 100644 --- a/src/melee2.hpp +++ b/src/melee2.hpp @@ -7,6 +7,6 @@ extern int monst_spell_monst_spell; bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note); void mon_handle_fear(monster_type *m_ptr, int dam, bool_ *fear); int check_hit2(int power, int level, int ac); -void process_monsters(void); +void process_monsters(); void curse_equipment(int chance, int heavy_chance); void curse_equipment_dg(int chance, int heavy_chance); diff --git a/src/messages.cc b/src/messages.cc index c2f8d079..637fa991 100644 --- a/src/messages.cc +++ b/src/messages.cc @@ -19,7 +19,7 @@ static boost::circular_buffer *buffer() return instance; } -s16b message_num(void) +s16b message_num() { return buffer()->size(); } diff --git a/src/modules.hpp b/src/modules.hpp index e8a413df..b57120c3 100644 --- a/src/modules.hpp +++ b/src/modules.hpp @@ -2,7 +2,7 @@ #include "h-basic.h" -bool_ select_module(void); +bool_ select_module(); bool_ module_savefile_loadable(cptr savefile_mod); void tome_intro(); void theme_intro(); diff --git a/src/monster1.cc b/src/monster1.cc index 244fbf94..50c8c548 100644 --- a/src/monster1.cc +++ b/src/monster1.cc @@ -1559,7 +1559,7 @@ static bool_ monster_lava(int r_idx) } -void set_mon_num_hook(void) +void set_mon_num_hook() { auto const &wf_info = game->edit_data.wf_info; diff --git a/src/monster2.cc b/src/monster2.cc index 9fee393e..ab60a9e3 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -711,7 +711,7 @@ void compact_monsters(int size) * This is an efficient method of simulating multiple calls to the * "delete_monster()" function, with no visual effects. */ -void wipe_m_list(void) +void wipe_m_list() { int i; @@ -759,7 +759,7 @@ void wipe_m_list(void) * * This routine should almost never fail, but it *can* happen. */ -s16b m_pop(void) +s16b m_pop() { int i; @@ -813,7 +813,7 @@ s16b m_pop(void) /* * Apply a "monster restriction function" to the "monster allocation table" */ -errr get_mon_num_prep(void) +errr get_mon_num_prep() { int i; @@ -1327,7 +1327,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) } /* Copy the result */ - (void)strcpy(desc, res); + strcpy(desc, res); } @@ -1348,7 +1348,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) if ((r_ptr->flags & RF_UNIQUE) && !(p_ptr->image)) { /* Start with the name (thus nominative and objective) */ - (void)strcpy(desc, name); + strcpy(desc, name); } /* It could be an indefinite monster */ @@ -1357,8 +1357,8 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) /* XXX Check plurality for "some" */ /* Indefinite monsters need an indefinite article */ - (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a "); - (void)strcat(desc, name); + strcpy(desc, is_a_vowel(name[0]) ? "an " : "a "); + strcat(desc, name); } /* It could be a normal, definite, monster */ @@ -1366,11 +1366,11 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) { /* Definite monsters need a definite article */ if (m_ptr->status >= MSTATUS_PET) - (void)strcpy(desc, "your "); + strcpy(desc, "your "); else - (void)strcpy(desc, "the "); + strcpy(desc, "the "); - (void)strcat(desc, name); + strcat(desc, name); } /* Handle the Possessive as a special afterthought */ @@ -1379,7 +1379,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode) /* XXX Check for trailing "s" */ /* Simply append "apostrophe" and "s" */ - (void)strcat(desc, "'s"); + strcat(desc, "'s"); } } } @@ -1414,16 +1414,16 @@ void monster_race_desc(char *desc, int r_idx, int ego) if (r_ptr->flags & RF_UNIQUE) { /* Start with the name (thus nominative and objective) */ - (void)strcpy(desc, name); + strcpy(desc, name); } /* It could be a normal, definite, monster */ else { /* Definite monsters need a definite article */ - (void)strcpy(desc, is_a_vowel(name[0]) ? "an " : "a "); + strcpy(desc, is_a_vowel(name[0]) ? "an " : "a "); - (void)strcat(desc, name); + strcat(desc, name); } } @@ -1510,11 +1510,11 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) { if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(4) + 4); + set_confused(p_ptr->confused + rand_int(4) + 4); } if ((!p_ptr->resist_chaos) && (randint(3) == 1)) { - (void) set_image(p_ptr->image + rand_int(250) + 150); + set_image(p_ptr->image + rand_int(250) + 150); } return; } @@ -1531,19 +1531,19 @@ static void sanity_blast(monster_type * m_ptr, bool_ necro) { if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(4) + 4); + set_confused(p_ptr->confused + rand_int(4) + 4); } if (!p_ptr->free_act) { - (void)set_paralyzed(rand_int(4) + 4); + set_paralyzed(rand_int(4) + 4); } while (rand_int(100) > p_ptr->skill_sav) - (void)do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); while (rand_int(100) > p_ptr->skill_sav) - (void)do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); if (!p_ptr->resist_chaos) { - (void) set_image(p_ptr->image + rand_int(250) + 150); + set_image(p_ptr->image + rand_int(250) + 150); } return; } @@ -2689,7 +2689,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu if (r_ptr->flags & RF_FRIENDS) { /* Attempt to place a group */ - (void)place_monster_group(y, x, r_idx, slp, status); + place_monster_group(y, x, r_idx, slp, status); } @@ -2743,7 +2743,7 @@ bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int statu (r_ptr->flags & RF_ESCORTS)) { /* Place a group of monsters */ - (void)place_monster_group(ny, nx, z, slp, status); + place_monster_group(ny, nx, z, slp, status); } } @@ -2847,7 +2847,7 @@ bool_ alloc_horde(int y, int x) for (attempts = randint(10) + 5; attempts; attempts--) { - (void) summon_specific(m_ptr->fy, m_ptr->fx, dun_level, SUMMON_KIN); + summon_specific(m_ptr->fy, m_ptr->fx, dun_level, SUMMON_KIN); } return TRUE; diff --git a/src/monster2.hpp b/src/monster2.hpp index 552331ef..ddd0b6bc 100644 --- a/src/monster2.hpp +++ b/src/monster2.hpp @@ -17,9 +17,9 @@ std::shared_ptr race_info_idx(int r_idx, int ego); void delete_monster_idx(int i); void delete_monster(int y, int x); void compact_monsters(int size); -void wipe_m_list(void); -s16b m_pop(void); -errr get_mon_num_prep(void); +void wipe_m_list(); +s16b m_pop(); +errr get_mon_num_prep(); s16b get_mon_num(int level); void monster_desc(char *desc, monster_type *m_ptr, int mode); void monster_race_desc(char *desc, int r_idx, int ego); @@ -45,6 +45,6 @@ s16b player_place(int y, int x); void monster_drop_carried_objects(monster_type *m_ptr); bool_ monster_dungeon(int r_idx); bool_ monster_quest(int r_idx); -void set_mon_num_hook(void); +void set_mon_num_hook(); void set_mon_num2_hook(int y, int x); bool_ monster_can_cross_terrain(byte feat, std::shared_ptr r_ptr); diff --git a/src/monster3.cc b/src/monster3.cc index 9a7921a7..6dd1f74e 100644 --- a/src/monster3.cc +++ b/src/monster3.cc @@ -307,7 +307,7 @@ void ai_deincarnate(int m_idx) } /* Returns if a new companion is allowed */ -bool_ can_create_companion(void) +bool_ can_create_companion() { int i, mcnt = 0; @@ -328,7 +328,7 @@ bool_ can_create_companion(void) /* Player controlled monsters */ -bool_ do_control_walk(void) +bool_ do_control_walk() { /* Get a "repeated" direction */ if (p_ptr->control) @@ -349,18 +349,18 @@ bool_ do_control_walk(void) return FALSE; } -bool_ do_control_inven(void) +bool_ do_control_inven() { if (!p_ptr->control) return FALSE; screen_save(); prt("Carried items", 0, 0); - (void) show_monster_inven(p_ptr->control); + show_monster_inven(p_ptr->control); inkey(); screen_load(); return TRUE; } -bool_ do_control_pickup(void) +bool_ do_control_pickup() { if (!p_ptr->control) return FALSE; @@ -411,7 +411,7 @@ bool_ do_control_pickup(void) return TRUE; } -bool_ do_control_drop(void) +bool_ do_control_drop() { monster_type *m_ptr = &m_list[p_ptr->control]; @@ -420,7 +420,7 @@ bool_ do_control_drop(void) return TRUE; } -bool_ do_control_magic(void) +bool_ do_control_magic() { auto const &r_info = game->edit_data.r_info; diff --git a/src/monster3.hpp b/src/monster3.hpp index 2ad6ba30..ac26b102 100644 --- a/src/monster3.hpp +++ b/src/monster3.hpp @@ -4,14 +4,14 @@ #include "monster_type_fwd.hpp" void dump_companions(FILE *outfile); -void do_cmd_companion(void); -bool_ do_control_reconnect(void); -bool_ do_control_drop(void); -bool_ do_control_magic(void); -bool_ do_control_pickup(void); -bool_ do_control_inven(void); -bool_ do_control_walk(void); -bool_ can_create_companion(void); +void do_cmd_companion(); +bool_ do_control_reconnect(); +bool_ do_control_drop(); +bool_ do_control_magic(); +bool_ do_control_pickup(); +bool_ do_control_inven(); +bool_ do_control_walk(); +bool_ can_create_companion(); void ai_deincarnate(int m_idx); bool_ ai_possessor(int m_idx, int o_idx); bool_ ai_multiply(int m_idx); diff --git a/src/notes.cc b/src/notes.cc index 33c6bf76..17990992 100644 --- a/src/notes.cc +++ b/src/notes.cc @@ -21,14 +21,14 @@ /* * Show the notes file on the screen */ -void show_notes_file(void) +void show_notes_file() { char basename[13]; char buf[1024]; char caption[10 + 13]; /* Hack -- extract first 8 characters of name and append an extension */ - (void)strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); + strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); basename[sizeof(basename) - 1] = '\0'; /* Build the path */ @@ -55,7 +55,7 @@ void output_note(const char *final_note) char buf[1024]; /* Hack -- extract first 8 characters of name and append an extension */ - (void)strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); + strnfmt(basename, sizeof(basename), "%.8s.nte", game->player_base.c_str()); basename[sizeof(basename) - 1] = '\0'; /* Build the path */ diff --git a/src/notes.hpp b/src/notes.hpp index 05514635..5c182858 100644 --- a/src/notes.hpp +++ b/src/notes.hpp @@ -1,6 +1,6 @@ #pragma once -void show_notes_file(void); +void show_notes_file(); void output_note(char const *final_note); void add_note(char *note, char code); void add_note_type(int note_number); diff --git a/src/object1.cc b/src/object1.cc index 8d2a2bb0..d10f3042 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -496,7 +496,7 @@ static void shuffle_flavors(cptr adj[], byte col[]) * * Note that the "hacked seed" may provide an RNG with alternating parity! */ -void flavor_init(void) +void flavor_init() { auto &k_info = game->edit_data.k_info; @@ -627,7 +627,7 @@ void flavor_init(void) * * The "prefs" parameter is no longer meaningful. XXX XXX XXX */ -void reset_visuals(void) +void reset_visuals() { auto &st_info = game->edit_data.st_info; auto &race_mod_info = game->edit_data.race_mod_info; @@ -3908,7 +3908,7 @@ static void show_inven_aux(bool_ mirror, object_filter_t const &filter); /* * Choice window "shadow" of the "show_inven()" function */ -void display_inven(void) +void display_inven() { show_inven_aux(TRUE, object_filter::True()); } @@ -3918,7 +3918,7 @@ void display_inven(void) /* * Choice window "shadow" of the "show_equip()" function */ -void display_equip(void) +void display_equip() { show_equip_aux(TRUE, object_filter::True()); } @@ -4018,7 +4018,7 @@ void show_inven_aux(bool_ mirror, const object_filter_t &filter) /* Save the object color, and description */ out_color[k] = tval_to_attr[o_ptr->tval % 128]; - (void)strcpy(out_desc[k], o_name); + strcpy(out_desc[k], o_name); /* Find the predicted "line length" */ l = strlen(out_desc[k]) + 5; @@ -4211,7 +4211,7 @@ void show_equip_aux(bool_ mirror, object_filter_t const &filter) /* Save the color */ out_color[k] = TERM_L_RED; - (void)strcpy(out_desc[k], o_name); + strcpy(out_desc[k], o_name); continue; } } @@ -4231,7 +4231,7 @@ void show_equip_aux(bool_ mirror, object_filter_t const &filter) /* Save the color */ out_color[k] = TERM_L_BLUE; - (void)strcpy(out_desc[k], o_name); + strcpy(out_desc[k], o_name); } else { @@ -4256,7 +4256,7 @@ void show_equip_aux(bool_ mirror, object_filter_t const &filter) /* Save the color */ out_color[k] = tval_to_attr[o_ptr->tval % 128]; - (void)strcpy(out_desc[k], o_name); + strcpy(out_desc[k], o_name); } /* Extract the maximal length (see below) */ @@ -4318,7 +4318,7 @@ void show_equip_aux(bool_ mirror, object_filter_t const &filter) /* Use labels */ { /* Mention the use */ - (void)sprintf(tmp_val, "%-14s: ", mention_use(out_rindex[j])); + sprintf(tmp_val, "%-14s: ", mention_use(out_rindex[j])); put_str(tmp_val, row + j, col + 5); /* Display the entry itself */ @@ -4361,7 +4361,7 @@ void show_equip_aux(bool_ mirror, object_filter_t const &filter) /* * Flip "inven" and "equip" in any sub-windows */ -void toggle_inven_equip(void) +void toggle_inven_equip() { int j; @@ -4417,7 +4417,7 @@ bool_ verify(cptr prompt, int item) object_desc(o_name, o_ptr, TRUE, 3); /* Prompt */ - (void)sprintf(out_val, "%s %s? ", prompt, o_name); + sprintf(out_val, "%s %s? ", prompt, o_name); /* Query */ return (get_check(out_val)); diff --git a/src/object1.hpp b/src/object1.hpp index 2701d1bb..8b9d6dc9 100644 --- a/src/object1.hpp +++ b/src/object1.hpp @@ -15,8 +15,8 @@ void apply_set(s16b a_idx, s16b set_idx); bool_ takeoff_set(s16b a_idx, s16b set_idx); bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent); bool_ verify(cptr prompt, int item); -void flavor_init(void); -void reset_visuals(void); +void flavor_init(); +void reset_visuals(); int object_power(object_type *o_ptr); extern bool_ object_flags_no_set; object_flag_set object_flags(object_type const *o_ptr); @@ -30,11 +30,11 @@ char index_to_label(int i); s16b wield_slot_ideal(object_type const *o_ptr, bool_ ideal); s16b wield_slot(object_type const *o_ptr); cptr describe_use(int i); -void display_inven(void); -void display_equip(void); +void display_inven(); +void display_equip(); void show_inven_full(); void show_equip_full(); -void toggle_inven_equip(void); +void toggle_inven_equip(); bool_ get_item(int *cp, cptr pmt, cptr str, int mode, object_filter_t const &filter = object_filter::True(), select_by_name_t const &select_by_name = select_by_name_t()); cptr item_activation(object_type *o_ptr); void py_pickup_floor(int pickup); diff --git a/src/object2.cc b/src/object2.cc index 51fdcb95..a9f0f7ce 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -54,7 +54,7 @@ /* * Calculate the player's total inventory weight. */ -s32b calc_total_weight(void) +s32b calc_total_weight() { int i; s32b total; @@ -376,7 +376,7 @@ void compact_objects(int size) * clear those fields for grids/monsters containing objects, * and we clear it once for every such object. */ -void wipe_o_list(void) +void wipe_o_list() { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; @@ -457,7 +457,7 @@ void wipe_o_list(void) * This routine should almost never fail, but in case it does, * we must be sure to handle "failure" of this routine. */ -s16b o_pop(void) +s16b o_pop() { int i; @@ -510,7 +510,7 @@ s16b o_pop(void) /* * Apply a "object restriction function" to the "object allocation table" */ -errr get_obj_num_prep(void) +errr get_obj_num_prep() { int i; @@ -5973,7 +5973,7 @@ void inven_drop(int item, int amt, int dy, int dx, bool_ silent) * * Note special handling of the "overflow" slot */ -void combine_pack(void) +void combine_pack() { int i, j, k; object_type *o_ptr; @@ -6040,7 +6040,7 @@ void combine_pack(void) * * Note special handling of the "overflow" slot */ -void reorder_pack(void) +void reorder_pack() { int i, j, k; s32b o_value; diff --git a/src/object2.hpp b/src/object2.hpp index 8444f408..a91631aa 100644 --- a/src/object2.hpp +++ b/src/object2.hpp @@ -13,7 +13,7 @@ typedef enum { DESCRIBE, NO_DESCRIBE } describe_flag; void inc_stack_size(int item, int delta); void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc); object_type *get_object(int item); -s32b calc_total_weight(void); +s32b calc_total_weight(); void add_random_ego_flag(object_type *o_ptr, ego_flag_set const &fego, bool_ *limit_blows); bool init_match_theme(obj_theme const &theme); bool_ kind_is_artifactable(int k_idx); @@ -34,9 +34,9 @@ void excise_object_idx(int o_idx); void delete_object_idx(int o_idx); void delete_object(int y, int x); void compact_objects(int size); -void wipe_o_list(void); -s16b o_pop(void); -errr get_obj_num_prep(void); +void wipe_o_list(); +s16b o_pop(); +errr get_obj_num_prep(); s16b get_obj_num(int level); void object_known(object_type *o_ptr); bool object_known_p(object_type const *o_ptr); @@ -59,8 +59,8 @@ bool_ make_gold(object_type *j_ptr); void place_gold(int y, int x); s16b drop_near(object_type *o_ptr, int chance, int y, int x); void acquirement(int y1, int x1, int num, bool_ great, bool_ known); -void combine_pack(void); -void reorder_pack(void); +void combine_pack(); +void reorder_pack(); void random_artifact_resistance(object_type * o_ptr); s16b floor_carry(int y, int x, object_type *j_ptr); void pack_decay(int item); diff --git a/src/powers.cc b/src/powers.cc index 5d26b7dd..f3ffe668 100644 --- a/src/powers.cc +++ b/src/powers.cc @@ -235,17 +235,17 @@ static void power_activate(int power) case PWR_UNFEAR: { msg_print("You play tough."); - (void)set_afraid(0); + set_afraid(0); } break; case PWR_BERSERK: { msg_print("RAAAGH!"); - (void)set_afraid(0); + set_afraid(0); - (void)set_shero(p_ptr->shero + 10 + randint(plev)); - (void)hp_player(30); + set_shero(p_ptr->shero + 10 + randint(plev)); + hp_player(30); } break; @@ -260,7 +260,7 @@ static void power_activate(int power) { if (!get_aim_dir(&dir)) break; msg_print("You bash at a stone wall."); - (void)wall_to_mud(dir); + wall_to_mud(dir); } break; @@ -311,7 +311,7 @@ static void power_activate(int power) x_ptr_foo.diff = 7; if (power_chance(&x_ptr_foo)) { - (void)set_light_speed(p_ptr->lightspeed + 3); + set_light_speed(p_ptr->lightspeed + 3); } } break; @@ -328,8 +328,8 @@ static void power_activate(int power) case PWR_DETECT_TD: { msg_print("You examine your surroundings."); - (void)detect_doors(DEFAULT_RADIUS); - (void)detect_stairs(DEFAULT_RADIUS); + detect_doors(DEFAULT_RADIUS); + detect_stairs(DEFAULT_RADIUS); } break; @@ -510,7 +510,7 @@ static void power_activate(int power) { if (p_ptr->food < PY_FOOD_FULL) /* No heal if we are "full" */ - (void)hp_player(dummy); + hp_player(dummy); else msg_print("You were not hungry."); /* Gain nutritional sustenance: 150/hp drained */ @@ -519,7 +519,7 @@ static void power_activate(int power) /* But if we ARE Gorged, it won't cure us */ dummy = p_ptr->food + MIN(5000, 100 * dummy); if (p_ptr->food < PY_FOOD_MAX) /* Not gorged already */ - (void)set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy); + set_food(dummy >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dummy); } else msg_print("Yechh. That tastes foul."); @@ -530,14 +530,14 @@ static void power_activate(int power) { msg_print("You emit an eldritch howl!"); if (!get_aim_dir(&dir)) break; - (void)fear_monster(dir, plev); + fear_monster(dir, plev); } break; case PWR_REST_LIFE: { msg_print("You attempt to restore your lost energies."); - (void)restore_level(); + restore_level(); } break; @@ -653,7 +653,7 @@ static void power_activate(int power) { msg_print("Your eyes look mesmerising..."); if (get_aim_dir(&dir)) - (void) charm_monster(dir, p_ptr->lev); + charm_monster(dir, p_ptr->lev); } break; @@ -689,13 +689,13 @@ static void power_activate(int power) case PWR_SMELL_MET: { - (void)detect_treasure(DEFAULT_RADIUS); + detect_treasure(DEFAULT_RADIUS); } break; case PWR_SMELL_MON: { - (void)detect_monsters_normal(DEFAULT_RADIUS); + detect_monsters_normal(DEFAULT_RADIUS); } break; @@ -739,25 +739,25 @@ static void power_activate(int power) if ((c_ptr->feat >= FEAT_DOOR_HEAD) && (c_ptr->feat <= FEAT_RUBBLE)) { - (void)set_food(p_ptr->food + 3000); + set_food(p_ptr->food + 3000); } else if ((c_ptr->feat >= FEAT_MAGMA) && (c_ptr->feat <= FEAT_QUARTZ_K)) { - (void)set_food(p_ptr->food + 5000); + set_food(p_ptr->food + 5000); } else if ((c_ptr->feat >= FEAT_SANDWALL) && (c_ptr->feat <= FEAT_SANDWALL_K)) { - (void)set_food(p_ptr->food + 500); + set_food(p_ptr->food + 500); } else { msg_print("This granite is very filling!"); - (void)set_food(p_ptr->food + 10000); + set_food(p_ptr->food + 10000); } } - (void)wall_to_mud(dir); + wall_to_mud(dir); oy = p_ptr->py; ox = p_ptr->px; @@ -779,20 +779,20 @@ static void power_activate(int power) case PWR_SWAP_POS: { if (!get_aim_dir(&dir)) return; - (void)teleport_swap(dir); + teleport_swap(dir); } break; case PWR_SHRIEK: { - (void)fire_ball(GF_SOUND, 0, 4 * p_ptr->lev, 8); - (void)aggravate_monsters(0); + fire_ball(GF_SOUND, 0, 4 * p_ptr->lev, 8); + aggravate_monsters(0); } break; case PWR_ILLUMINE: { - (void)lite_area(damroll(2, (p_ptr->lev / 2)), (p_ptr->lev / 10) + 1); + lite_area(damroll(2, (p_ptr->lev / 2)), (p_ptr->lev / 10) + 1); } break; @@ -820,7 +820,7 @@ static void power_activate(int power) case PWR_MIDAS_TCH: { - (void)alchemy(); + alchemy(); } break; @@ -841,27 +841,27 @@ static void power_activate(int power) if (rand_int(5) < num) { - (void)set_oppose_acid(p_ptr->oppose_acid + dur); + set_oppose_acid(p_ptr->oppose_acid + dur); num--; } if (rand_int(4) < num) { - (void)set_oppose_elec(p_ptr->oppose_elec + dur); + set_oppose_elec(p_ptr->oppose_elec + dur); num--; } if (rand_int(3) < num) { - (void)set_oppose_fire(p_ptr->oppose_fire + dur); + set_oppose_fire(p_ptr->oppose_fire + dur); num--; } if (rand_int(2) < num) { - (void)set_oppose_cold(p_ptr->oppose_cold + dur); + set_oppose_cold(p_ptr->oppose_cold + dur); num--; } if (num) { - (void)set_oppose_pois(p_ptr->oppose_pois + dur); + set_oppose_pois(p_ptr->oppose_pois + dur); num--; } } diff --git a/src/q_betwen.cc b/src/q_betwen.cc index ac4b665e..8deb6667 100644 --- a/src/q_betwen.cc +++ b/src/q_betwen.cc @@ -129,7 +129,7 @@ static bool_ quest_between_finish_hook(void *, void *in_, void *) object_known(q_ptr); q_ptr->discount = 100; q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NULL; diff --git a/src/q_eol.cc b/src/q_eol.cc index 24825da3..ae1cd96a 100644 --- a/src/q_eol.cc +++ b/src/q_eol.cc @@ -125,7 +125,7 @@ static bool_ quest_eol_finish_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NIRNAETH; diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc index c32510ec..04cd3064 100644 --- a/src/q_hobbit.cc +++ b/src/q_hobbit.cc @@ -168,7 +168,7 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); cquest.status = QUEST_STATUS_FINISHED; diff --git a/src/q_nazgul.cc b/src/q_nazgul.cc index 119c39d9..a59a8df3 100644 --- a/src/q_nazgul.cc +++ b/src/q_nazgul.cc @@ -76,7 +76,7 @@ static bool_ quest_nazgul_finish_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); /* End the plot */ *(quest[q_idx].plot) = QUEST_NULL; diff --git a/src/q_poison.cc b/src/q_poison.cc index 24d0320c..c1a637e9 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -143,7 +143,7 @@ static bool_ quest_poison_finish_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); /* Continue the plot */ *(quest[q_idx].plot) = QUEST_NULL; @@ -182,7 +182,7 @@ static bool_ quest_poison_quest_hook(void *, void *in_, void *) q_ptr->ident |= IDENT_STOREB; q_ptr->inscription = "quest"; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); del_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook); process_hooks_restart = TRUE; diff --git a/src/q_shroom.cc b/src/q_shroom.cc index ee5f9d1f..8834e0f7 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -199,7 +199,7 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) object_known(q_ptr); q_ptr->discount = 100; q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); delete_monster_idx(m_idx); diff --git a/src/q_spider.cc b/src/q_spider.cc index 9fcf37c3..a39c60d5 100644 --- a/src/q_spider.cc +++ b/src/q_spider.cc @@ -103,7 +103,7 @@ static bool_ quest_spider_finish_hook(void *, void *in_, void *) object_aware(q_ptr); object_known(q_ptr); q_ptr->ident |= IDENT_STOREB; - (void)inven_carry(q_ptr, FALSE); + inven_carry(q_ptr, FALSE); /* Continue the plot */ *(quest[q_idx].plot) = QUEST_POISON; diff --git a/src/randart.cc b/src/randart.cc index 55ffd265..a902d734 100644 --- a/src/randart.cc +++ b/src/randart.cc @@ -174,7 +174,7 @@ void build_prob(cptr learn) * set. Relies on European vowels (a, e, i, o, u). The generated name should * be copied/used before calling this function again. */ -static char *make_word(void) +static char *make_word() { static char word_buf[90]; int r, totalfreq; @@ -391,7 +391,7 @@ bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name) } -bool_ artifact_scroll(void) +bool_ artifact_scroll() { bool_ okay = FALSE; diff --git a/src/randart.hpp b/src/randart.hpp index 99e4b9b8..6f91f36d 100644 --- a/src/randart.hpp +++ b/src/randart.hpp @@ -5,4 +5,4 @@ void build_prob(cptr learn); bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name); -bool_ artifact_scroll(void); +bool_ artifact_scroll(); diff --git a/src/skills.hpp b/src/skills.hpp index edb96796..8b1437d9 100644 --- a/src/skills.hpp +++ b/src/skills.hpp @@ -10,19 +10,19 @@ s16b find_skill(cptr name); s16b find_skill_i(cptr name); s16b get_skill(int skill); s16b get_skill_scale(int skill, u32b scale); -void do_cmd_skill(void); -void do_cmd_activate_skill(void); +void do_cmd_skill(); +void do_cmd_activate_skill(); cptr get_melee_name(); -s16b get_melee_skills(void); -s16b get_melee_skill(void); -bool_ forbid_gloves(void); -bool_ forbid_non_blessed(void); +s16b get_melee_skills(); +s16b get_melee_skill(); +bool_ forbid_gloves(); +bool_ forbid_non_blessed(); void compute_skills(s32b *v, s32b *m, std::size_t i); -void select_default_melee(void); -void do_get_new_skill(void); +void select_default_melee(); +void do_get_new_skill(); void init_skill(s32b value, s32b mod, std::size_t i); s16b find_ability(cptr name); void dump_abilities(FILE *fff); -void do_cmd_ability(void); +void do_cmd_ability(); void apply_level_abilities(int level); void recalc_skills(bool_ init); diff --git a/src/spells1.cc b/src/spells1.cc index 3c7999d1..4df1a7c6 100644 --- a/src/spells1.cc +++ b/src/spells1.cc @@ -855,7 +855,7 @@ void teleport_player_to(int ny, int nx) /* * Teleport the player one level up or down (random when legal) */ -void teleport_player_level(void) +void teleport_player_level() { /* No effect in arena or quest */ if (p_ptr->inside_quest) @@ -1329,7 +1329,7 @@ void take_hit(int damage, cptr hit_from) } else { - (void)get_rnd_line("death.txt", death_message); + get_rnd_line("death.txt", death_message); cmsg_print(TERM_RED, death_message); } @@ -1505,7 +1505,7 @@ void take_sanity_hit(int damage, cptr hit_from) } else { - (void)get_rnd_line("death.txt", death_message); + get_rnd_line("death.txt", death_message); cmsg_print(TERM_RED, death_message); } @@ -1828,7 +1828,7 @@ static int inven_damage(inven_func typ, int perc) /* Potions smash open */ if (k_info[o_ptr->k_idx].tval == TV_POTION) { - (void)potion_smash_effect(0, p_ptr->py, p_ptr->px, o_ptr->sval); + potion_smash_effect(0, p_ptr->py, p_ptr->px, o_ptr->sval); } /* @@ -1865,7 +1865,7 @@ static int inven_damage(inven_func typ, int perc) * * If any armor is damaged (or resists), the player takes less damage. */ -static int minus_ac(void) +static int minus_ac() { object_type *o_ptr = NULL; @@ -1949,7 +1949,7 @@ void acid_dam(int dam, cptr kb_str) if ((!(p_ptr->oppose_acid || p_ptr->resist_acid)) && randint(HURT_CHANCE) == 1) - (void) do_dec_stat(A_CHR, STAT_DEC_NORMAL); + do_dec_stat(A_CHR, STAT_DEC_NORMAL); /* If any armor gets hit, defend the player */ if (minus_ac()) dam = (dam + 1) / 2; @@ -1979,7 +1979,7 @@ void elec_dam(int dam, cptr kb_str) if ((!(p_ptr->oppose_elec || p_ptr->resist_elec)) && randint(HURT_CHANCE) == 1) - (void) do_dec_stat(A_DEX, STAT_DEC_NORMAL); + do_dec_stat(A_DEX, STAT_DEC_NORMAL); /* Take damage */ take_hit(dam, kb_str); @@ -2009,7 +2009,7 @@ void fire_dam(int dam, cptr kb_str) if ((!(p_ptr->oppose_fire || p_ptr->resist_fire)) && randint(HURT_CHANCE) == 1) - (void) do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_STR, STAT_DEC_NORMAL); /* Take damage */ @@ -2037,7 +2037,7 @@ void cold_dam(int dam, cptr kb_str) if ((!(p_ptr->oppose_cold || p_ptr->resist_cold)) && randint(HURT_CHANCE) == 1) - (void) do_dec_stat(A_STR, STAT_DEC_NORMAL); + do_dec_stat(A_STR, STAT_DEC_NORMAL); /* Take damage */ take_hit(dam, kb_str); @@ -2356,7 +2356,7 @@ bool_ apply_disenchant(int mode) } -void corrupt_player(void) +void corrupt_player() { int max1, cur1, max2, cur2, ii, jj; @@ -3692,7 +3692,7 @@ static bool_ project_f(int who, int r, int y, int x, int dam, int typ) if (!p_ptr->resist_blind && !p_ptr->resist_lite) { /* Become blind */ - (void)set_blind(p_ptr->blind + 10 + randint(10)); + set_blind(p_ptr->blind + 10 + randint(10)); } } @@ -4080,7 +4080,7 @@ static bool_ project_o(int who, int r, int y, int x, int dam, int typ) /* Potions produce effects when 'shattered' */ if (is_potion) { - (void)potion_smash_effect(who, y, x, o_sval); + potion_smash_effect(who, y, x, o_sval); } @@ -5126,7 +5126,7 @@ bool_ project_m(int who, int r, int y, int x, int dam, int typ) } default: if (!p_ptr->free_act) - (void)set_paralyzed(randint(dam)); + set_paralyzed(randint(dam)); break; } } @@ -7069,7 +7069,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad if (!p_ptr->resist_sound) { int k = (randint((dam > 40) ? 35 : (dam * 3 / 4 + 5))); - (void)set_stun(p_ptr->stun + k); + set_stun(p_ptr->stun + k); } if (!(p_ptr->resist_fire || @@ -7154,11 +7154,11 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + rand_int(20) + 10); + set_confused(p_ptr->confused + rand_int(20) + 10); } if (!p_ptr->resist_chaos) { - (void)set_image(p_ptr->image + randint(10)); + set_image(p_ptr->image + randint(10)); } if (!p_ptr->resist_neth && !p_ptr->resist_chaos) { @@ -7197,7 +7197,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } else { - (void)set_cut(p_ptr->cut + dam); + set_cut(p_ptr->cut + dam); } if ((!p_ptr->resist_shard) || (randint(13) == 1)) @@ -7221,7 +7221,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad else { int k = (randint((dam > 90) ? 35 : (dam / 3 + 5))); - (void)set_stun(p_ptr->stun + k); + set_stun(p_ptr->stun + k); } if ((!p_ptr->resist_sound) || (randint(13) == 1)) @@ -7244,7 +7244,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } if (!p_ptr->resist_conf) { - (void)set_confused(p_ptr->confused + randint(20) + 10); + set_confused(p_ptr->confused + randint(20) + 10); } take_hit(dam, killer); break; @@ -7261,7 +7261,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } else { - (void)apply_disenchant(0); + apply_disenchant(0); } take_hit(dam, killer); break; @@ -7290,7 +7290,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad if (fuzzy) msg_print("You are hit by kinetic force!"); if (!p_ptr->resist_sound) { - (void)set_stun(p_ptr->stun + randint(20)); + set_stun(p_ptr->stun + randint(20)); /* * If fired by player, try pushing monster. * First get vector from player to monster. @@ -7380,7 +7380,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad if (fuzzy) msg_print("There is an explosion!"); if (!p_ptr->resist_sound) { - (void)set_stun(p_ptr->stun + randint(20)); + set_stun(p_ptr->stun + randint(20)); } if (p_ptr->resist_shard) { @@ -7388,7 +7388,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } else { - (void)set_cut(p_ptr-> cut + ( dam / 2) ); + set_cut(p_ptr-> cut + ( dam / 2) ); } if ((!p_ptr->resist_shard) || (randint(12) == 1)) @@ -7404,7 +7404,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad case GF_INERTIA: { if (fuzzy) msg_print("You are hit by something slow!"); - (void)set_slow(p_ptr->slow + rand_int(4) + 4); + set_slow(p_ptr->slow + rand_int(4) + 4); take_hit(dam, killer); break; } @@ -7420,7 +7420,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } else if (!blind && !p_ptr->resist_blind) { - (void)set_blind(p_ptr->blind + randint(5) + 2); + set_blind(p_ptr->blind + randint(5) + 2); } if (p_ptr->sensible_lite) { @@ -7455,7 +7455,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad } else if (!blind && !p_ptr->resist_blind) { - (void)set_blind(p_ptr->blind + randint(5) + 2); + set_blind(p_ptr->blind + randint(5) + 2); } if (p_ptr->wraith_form) hp_player(dam); else take_hit(dam, killer); @@ -7556,11 +7556,11 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad teleport_player(5); if (!p_ptr->ffall) - (void)set_slow(p_ptr->slow + rand_int(4) + 4); + set_slow(p_ptr->slow + rand_int(4) + 4); if (!(p_ptr->resist_sound || p_ptr->ffall)) { int k = (randint((dam > 90) ? 35 : (dam / 3 + 5))); - (void)set_stun(p_ptr->stun + k); + set_stun(p_ptr->stun + k); } if (p_ptr->ffall) { @@ -7587,7 +7587,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad case GF_OLD_HEAL: { if (fuzzy) msg_print("You are hit by something invigorating!"); - (void)hp_player(dam); + hp_player(dam); dam = 0; break; } @@ -7595,7 +7595,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad case GF_OLD_SPEED: { if (fuzzy) msg_print("You are hit by something!"); - (void)set_fast(p_ptr->fast + randint(5), 10); + set_fast(p_ptr->fast + randint(5), 10); dam = 0; break; } @@ -7603,7 +7603,7 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad case GF_OLD_SLOW: { if (fuzzy) msg_print("You are hit by something slow!"); - (void)set_slow(p_ptr->slow + rand_int(4) + 4); + set_slow(p_ptr->slow + rand_int(4) + 4); break; } @@ -7645,11 +7645,11 @@ static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad cold_dam(dam, killer); if (!p_ptr->resist_shard) { - (void)set_cut(p_ptr->cut + damroll(5, 8)); + set_cut(p_ptr->cut + damroll(5, 8)); } if (!p_ptr->resist_sound) { - (void)set_stun(p_ptr->stun + randint(15)); + set_stun(p_ptr->stun + randint(15)); } if ((!(p_ptr->resist_cold || p_ptr->oppose_cold)) || (randint(12) == 1)) @@ -8601,12 +8601,12 @@ bool_ potion_smash_effect(int who, int y, int x, int o_sval) ; } - (void) project(who, radius, y, x, dam, dt, + project(who, radius, y, x, dam, dt, (PROJECT_JUMP | PROJECT_ITEM | PROJECT_KILL)); // Silence warning. We may want to introuce an actual implementation // and I want to preserve the original "ident" values if we do so. - (void) ident; + ident; /* XXX those potions that explode need to become "known" */ return angry; diff --git a/src/spells1.hpp b/src/spells1.hpp index 9760c5e9..ec8f2cc9 100644 --- a/src/spells1.hpp +++ b/src/spells1.hpp @@ -14,7 +14,7 @@ void teleport_away(int m_idx, int dis); void teleport_player(int dis); void teleport_player_to(int ny, int nx); void teleport_monster_to(int m_idx, int ny, int nx); -void teleport_player_level(void); +void teleport_player_level(); void recall_player(int d, int f); void take_hit(int damage, cptr kb_str); void take_sanity_hit(int damage, cptr hit_from); @@ -28,8 +28,8 @@ bool_ apply_disenchant(int mode); bool_ project_m(int who, int r, int y, int x, int dam, int typ); bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg); bool_ potion_smash_effect(int who, int y, int x, int o_sval); -void do_poly_self(void); -void corrupt_player(void); +void do_poly_self(); +void corrupt_player(); std::string name_spell(random_spell const *); void generate_spell(int plev); s16b do_poly_monster(int y, int x); diff --git a/src/spells2.cc b/src/spells2.cc index e0f0512e..c0d435ea 100644 --- a/src/spells2.cc +++ b/src/spells2.cc @@ -205,7 +205,7 @@ bool_ hp_player(int num) /* * Leave a "glyph of warding" which prevents monster movement */ -void warding_glyph(void) +void warding_glyph() { /* XXX XXX XXX */ if (!cave_clean_bold(p_ptr->py, p_ptr->px)) @@ -218,7 +218,7 @@ void warding_glyph(void) cave_set_feat(p_ptr->py, p_ptr->px, FEAT_GLYPH); } -void explosive_rune(void) +void explosive_rune() { /* XXX XXX XXX */ if (!cave_clean_bold(p_ptr->py, p_ptr->px)) @@ -476,7 +476,7 @@ void identify_hooks(int i, object_type *o_ptr, identify_mode mode) * Identify everything being carried. * Done by a potion of "self knowledge". */ -bool_ identify_pack(void) +bool_ identify_pack() { int i; @@ -518,7 +518,7 @@ static void make_item_fully_identified(object_type *o_ptr) * Identify everything being carried. * Done by a potion of "self knowledge". */ -void identify_pack_fully(void) +void identify_pack_fully() { int i; @@ -641,7 +641,7 @@ static int remove_curse_aux(int all) /* * Remove most curses */ -bool_ remove_curse(void) +bool_ remove_curse() { return (remove_curse_aux(FALSE) ? TRUE : FALSE); } @@ -649,7 +649,7 @@ bool_ remove_curse(void) /* * Remove all curses */ -bool_ remove_all_curse(void) +bool_ remove_all_curse() { return (remove_curse_aux(TRUE) ? TRUE : FALSE); } @@ -659,7 +659,7 @@ bool_ remove_all_curse(void) /* * Restores any drained experience */ -bool_ restore_level(void) +bool_ restore_level() { /* Restore experience */ if (p_ptr->exp < p_ptr->max_exp) @@ -682,7 +682,7 @@ bool_ restore_level(void) } -bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a shop */ +bool_ alchemy() /* Turns an object into gold, gain some of its value in a shop */ { int item, amt = 1; int old_number; @@ -834,7 +834,7 @@ static cptr report_magic_durations[] = }; -void report_magics(void) +void report_magics() { int i = 0, j, k; @@ -981,7 +981,7 @@ void report_magics(void) /* * Forget everything */ -bool_ lose_all_info(void) +bool_ lose_all_info() { int i; @@ -1489,7 +1489,7 @@ bool_ detect_all(int rad) /* * Create stairs at the player location */ -void stair_creation(void) +void stair_creation() { /* XXX XXX XXX */ if (!cave_valid_bold(p_ptr->py, p_ptr->px)) @@ -2181,7 +2181,7 @@ static void note_found_object(object_type *o_ptr) * This routine does *not* automatically combine objects. * Returns TRUE if something was identified, else FALSE. */ -bool_ ident_spell(void) +bool_ ident_spell() { /* Get an item */ int item; @@ -2241,7 +2241,7 @@ bool_ ident_spell(void) /* * Identify all objects in the level */ -bool_ ident_all(void) +bool_ ident_all() { int i; @@ -2281,7 +2281,7 @@ static bool item_tester_hook_no_mental(object_type const *o_ptr) * Fully "identify" an object in the inventory -BEN- * This routine returns TRUE if an item was identified. */ -bool_ identify_fully(void) +bool_ identify_fully() { /* Get an item */ int item; @@ -3186,7 +3186,7 @@ void destroy_area(int y1, int x1, int r) if (!p_ptr->resist_blind && !p_ptr->resist_lite) { /* Become blind */ - (void)set_blind(p_ptr->blind + 10 + randint(10)); + set_blind(p_ptr->blind + 10 + randint(10)); } } @@ -3361,14 +3361,14 @@ void earthquake(int cy, int cx, int r) { msg_print("You are bashed by rubble!"); damage = damroll(10, 4); - (void)set_stun(p_ptr->stun + randint(50)); + set_stun(p_ptr->stun + randint(50)); break; } case 3: { msg_print("You are crushed between the floor and ceiling!"); damage = damroll(10, 4); - (void)set_stun(p_ptr->stun + randint(50)); + set_stun(p_ptr->stun + randint(50)); break; } } @@ -3625,7 +3625,7 @@ void earthquake(int cy, int cx, int r) * NORMAL monsters wake up 1/4 the time when illuminated * STUPID monsters wake up 1/10 the time when illuminated */ -static void cave_temp_room_lite(void) +static void cave_temp_room_lite() { int i; @@ -3719,7 +3719,7 @@ static void cave_temp_room_lite(void) * * Also, process all affected monsters */ -static void cave_temp_room_unlite(void) +static void cave_temp_room_unlite() { int i; @@ -3887,7 +3887,7 @@ bool_ lite_area(int dam, int rad) } /* Hook into the "project()" function */ - (void)project(0, rad, p_ptr->py, p_ptr->px, dam, GF_LITE_WEAK, flg); + project(0, rad, p_ptr->py, p_ptr->px, dam, GF_LITE_WEAK, flg); /* Lite up the room */ lite_room(p_ptr->py, p_ptr->px); @@ -3912,7 +3912,7 @@ bool_ unlite_area(int dam, int rad) } /* Hook into the "project()" function */ - (void)project(0, rad, p_ptr->py, p_ptr->px, dam, GF_DARK_WEAK, flg); + project(0, rad, p_ptr->py, p_ptr->px, dam, GF_DARK_WEAK, flg); /* Lite up the room */ unlite_room(p_ptr->py, p_ptr->px); @@ -4369,20 +4369,20 @@ bool_ wall_stone(int y, int x) } -bool_ destroy_doors_touch(void) +bool_ destroy_doors_touch() { int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE; return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_DOOR, flg)); } -bool_ sleep_monsters_touch(void) +bool_ sleep_monsters_touch() { int flg = PROJECT_KILL | PROJECT_HIDE; return (project(0, 1, p_ptr->py, p_ptr->px, p_ptr->lev, GF_OLD_SLEEP, flg)); } -void call_chaos(void) +void call_chaos() { int Chaos_type, dummy, dir; int plev = p_ptr->lev; @@ -4431,7 +4431,7 @@ void call_chaos(void) } -static void activate_hi_summon(void) +static void activate_hi_summon() { int i; @@ -4441,57 +4441,57 @@ static void activate_hi_summon(void) { case 1: case 2: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANT); break; case 3: case 4: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_SPIDER); break; case 5: case 6: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HOUND); break; case 7: case 8: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HYDRA); break; case 9: case 10: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_ANGEL); break; case 11: case 12: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNDEAD); break; case 13: case 14: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DRAGON); break; case 15: case 16: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_DEMON); break; case 17: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_WRAITH); break; case 18: case 19: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_UNIQUE); break; case 20: case 21: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_UNDEAD); break; case 22: case 23: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON); + summon_specific(p_ptr->py, p_ptr->px, dun_level, SUMMON_HI_DRAGON); break; case 24: case 25: - (void) summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON); + summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON); break; default: - (void) summon_specific(p_ptr->py, p_ptr->px, (((dun_level * 3) / 2) + 5), 0); + summon_specific(p_ptr->py, p_ptr->px, (((dun_level * 3) / 2) + 5), 0); } } } @@ -4502,7 +4502,7 @@ static void activate_hi_summon(void) * rr9: Stop the nasty things when a Cyberdemon is summoned * or the player gets paralyzed. */ -void activate_ty_curse(void) +void activate_ty_curse() { int i = 0; bool_ stop_ty = FALSE; @@ -4524,7 +4524,7 @@ void activate_ty_curse(void) activate_hi_summon(); if (randint(6) != 1) break; case 7: case 8: case 9: case 18: - (void) summon_specific(p_ptr->py, p_ptr->px, dun_level, 0); + summon_specific(p_ptr->py, p_ptr->px, dun_level, 0); if (randint(6) != 1) break; case 10: case 11: case 12: msg_print("You feel your life draining away..."); @@ -4546,7 +4546,7 @@ case 13: case 14: case 15: case 19: case 20: } if (randint(6) != 1) break; case 21: case 22: case 23: - (void)do_dec_stat((randint(6)) - 1, STAT_DEC_NORMAL); + do_dec_stat((randint(6)) - 1, STAT_DEC_NORMAL); if (randint(6) != 1) break; case 24: msg_print("Huh? Who am I? What am I doing here?"); @@ -4567,7 +4567,7 @@ case 21: case 22: case 23: { do { - (void)do_dec_stat(i, STAT_DEC_NORMAL); + do_dec_stat(i, STAT_DEC_NORMAL); } while (randint(2) == 1); @@ -4581,7 +4581,7 @@ case 21: case 22: case 23: /* * Activate the ultra evil Dark God curse */ -void activate_dg_curse(void) +void activate_dg_curse() { int i = 0; bool_ stop_dg = FALSE; @@ -4648,7 +4648,7 @@ void activate_dg_curse(void) case 21: case 22: case 23: - (void)do_dec_stat((randint(6)) - 1, STAT_DEC_PERMANENT); + do_dec_stat((randint(6)) - 1, STAT_DEC_PERMANENT); if (randint(7) != 1) break; case 24: msg_print("Huh? Who am I? What am I doing here?"); @@ -4679,7 +4679,7 @@ case 27: case 28: case 29: { do { - (void)do_dec_stat(i, STAT_DEC_NORMAL); + do_dec_stat(i, STAT_DEC_NORMAL); } while (randint(2) == 1); @@ -4691,14 +4691,14 @@ case 27: case 28: case 29: } -void summon_cyber(void) +void summon_cyber() { int i; int max_cyber = (dun_level / 50) + randint(6); for (i = 0; i < max_cyber; i++) { - (void)summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON); + summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_HI_DEMON); } } @@ -4709,7 +4709,7 @@ static void summon_dragon_riders() for (i = 0; i < max_dr; i++) { - (void)summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_THUNDERLORD); + summon_specific(p_ptr->py, p_ptr->px, 100, SUMMON_THUNDERLORD); } } @@ -4797,7 +4797,7 @@ bool_ charm_animal(int dir, int plev) return (project_hook(GF_CONTROL_ANIMAL, dir, plev, flg)); } -void change_wild_mode(void) +void change_wild_mode() { if (p_ptr->immovable && !p_ptr->wild_mode) { @@ -4819,7 +4819,7 @@ void change_wild_mode(void) } -void alter_reality(void) +void alter_reality() { msg_print("The world changes!"); diff --git a/src/spells2.hpp b/src/spells2.hpp index 45b3cd7e..0eeb3f5b 100644 --- a/src/spells2.hpp +++ b/src/spells2.hpp @@ -12,18 +12,18 @@ void grow_grass(int rad); void grow_trees(int rad); bool_ hp_player(int num); bool_ heal_insanity(int val); -void warding_glyph(void); -void explosive_rune(void); +void warding_glyph(); +void explosive_rune(); bool_ do_dec_stat(int stat, int mode); bool_ do_res_stat(int stat, bool_ full); bool_ do_inc_stat(int stat); void identify_hooks(int i, object_type *o_ptr, identify_mode type); -bool_ identify_pack(void); -void identify_pack_fully(void); -bool_ remove_curse(void); -bool_ remove_all_curse(void); -bool_ restore_level(void); -bool_ lose_all_info(void); +bool_ identify_pack(); +void identify_pack_fully(); +bool_ remove_curse(); +bool_ remove_all_curse(); +bool_ restore_level(); +bool_ lose_all_info(); bool_ detect_traps(int rad); bool_ detect_doors(int rad); bool_ detect_stairs(int rad); @@ -34,19 +34,19 @@ bool_ detect_monsters_normal(int rad); bool_ detect_monsters_invis(int rad); void detect_monsters_orcs(int rad); bool_ detect_all(int rad); -void stair_creation(void); +void stair_creation(); bool_ wall_stone(int y, int x); bool_ enchant(object_type *o_ptr, int n, int eflag); bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval); -bool_ ident_spell(void); -bool_ ident_all(void); -bool_ identify_fully(void); +bool_ ident_spell(); +bool_ ident_all(); +bool_ identify_fully(); bool_ recharge(int num); void aggravate_monsters(int who); bool_ genocide_aux(bool_ player_cast, char typ); bool_ genocide(bool_ player_cast); bool_ mass_genocide(bool_ player_cast); -void change_wild_mode(void); +void change_wild_mode(); bool_ banish_evil(int dist); bool_ dispel_evil(int dam); bool_ dispel_good(int dam); @@ -64,7 +64,7 @@ bool_ fire_wall(int typ, int dir, int dam, int time); bool_ fire_ball(int typ, int dir, int dam, int rad); bool_ fire_bolt(int typ, int dir, int dam); bool_ fire_beam(int typ, int dir, int dam); -void call_chaos(void); +void call_chaos(); bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam); bool_ lite_line(int dir); bool_ drain_life(int dir, int dam); @@ -76,14 +76,14 @@ bool_ confuse_monster(int dir, int plev); bool_ fear_monster(int dir, int plev); bool_ poly_monster(int dir); bool_ teleport_monster(int dir); -bool_ trap_creation(void); -bool_ destroy_doors_touch(void); -bool_ destroy_traps_touch(void); -bool_ sleep_monsters_touch(void); -bool_ alchemy(void); -void activate_ty_curse(void); -void activate_dg_curse(void); -void summon_cyber(void); +bool_ trap_creation(); +bool_ destroy_doors_touch(); +bool_ destroy_traps_touch(); +bool_ sleep_monsters_touch(); +bool_ alchemy(); +void activate_ty_curse(); +void activate_dg_curse(); +void summon_cyber(); bool_ confuse_monsters(int dam); bool_ charm_monsters(int dam); bool_ charm_animals(int dam); @@ -94,8 +94,8 @@ bool_ charm_monster(int dir, int plev); bool_ control_one_undead(int dir, int plev); bool_ charm_animal(int dir, int plev); bool_ mindblast_monsters(int dam); -void alter_reality(void); -void report_magics(void); +void alter_reality(); +void report_magics(); void teleport_swap(int dir); void swap_position(int lty, int ltx); object_filter_t const &item_tester_hook_recharge(); diff --git a/src/squeltch.cc b/src/squeltch.cc index 9c0de4be..61ccb1f3 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -58,7 +58,7 @@ using squelch::StatusCondition; static squelch::Automatizer *automatizer = nullptr; -void squeltch_grid(void) +void squeltch_grid() { auto const &k_info = game->edit_data.k_info; @@ -87,7 +87,7 @@ void squeltch_grid(void) } } -void squeltch_inventory(void) +void squeltch_inventory() { if (!automatizer_enabled) { diff --git a/src/squeltch.hpp b/src/squeltch.hpp index d0ec8b8c..c4525e7d 100644 --- a/src/squeltch.hpp +++ b/src/squeltch.hpp @@ -4,9 +4,9 @@ #include "object_type_fwd.hpp" #include -void squeltch_inventory(void); -void squeltch_grid(void); -void do_cmd_automatizer(void); +void squeltch_inventory(); +void squeltch_grid(); +void do_cmd_automatizer(); void automatizer_add_rule(object_type *o_ptr); extern bool_ automatizer_create; void automatizer_init(); diff --git a/src/store.cc b/src/store.cc index 9d4e7f81..fea51410 100644 --- a/src/store.cc +++ b/src/store.cc @@ -96,7 +96,7 @@ static cptr comment_4b[MAX_COMMENT_4B] = /* * Successful haggle. */ -static void say_comment_1(void) +static void say_comment_1() { char rumour[80]; @@ -114,7 +114,7 @@ static void say_comment_1(void) /* * Kick 'da bum out. -RAK- */ -static void say_comment_4(void) +static void say_comment_4() { msg_print(comment_4a[rand_int(MAX_COMMENT_4A)]); msg_print(comment_4b[rand_int(MAX_COMMENT_4B)]); @@ -1103,7 +1103,7 @@ static bool_ black_market_crap(object_type *o_ptr) * Attempt to delete (some of) a random item from the store * Hack -- we attempt to "maintain" piles of items when possible. */ -static void store_delete(void) +static void store_delete() { /* Pick a random slot */ int const what = rand_int(st_ptr->stock.size()); @@ -1187,7 +1187,7 @@ static bool_ kind_is_storeok(int k_idx) * * Should we check for "permission" to have the given item? */ -static void store_create(void) +static void store_create() { auto const &st_info = game->edit_data.st_info; auto const &k_info = game->edit_data.k_info; @@ -1392,7 +1392,7 @@ static void store_create(void) } /* Attempt to carry the (known) item */ - (void)store_carry(q_ptr); + store_carry(q_ptr); /* Definitely done */ break; @@ -1497,7 +1497,7 @@ static void display_entry(int pos) * Displays a store's inventory -RAK- * All prices are listed as "per individual object". -BEN- */ -static void display_inventory(void) +static void display_inventory() { int k; @@ -1535,7 +1535,7 @@ static void display_inventory(void) /* * Displays players gold -RAK- */ -void store_prt_gold(void) +void store_prt_gold() { char out_val[64]; @@ -1549,7 +1549,7 @@ void store_prt_gold(void) /* * Displays store (after clearing screen) -RAK- */ -void display_store(void) +void display_store() { auto const &st_info = game->edit_data.st_info; @@ -1829,7 +1829,7 @@ static bool_ sell_haggle(object_type *o_ptr, s32b *price) /* * Will the owner retire? */ -static bool retire_owner_p(void) +static bool retire_owner_p() { auto const &st_info = game->edit_data.st_info; @@ -1876,7 +1876,7 @@ static void adjust_store_top_item_removed() /* * Stole an item from a store -DG- */ -void store_stole(void) +void store_stole() { if (cur_store_num == 7) { @@ -2076,7 +2076,7 @@ void store_stole(void) /* * Buy an item from a store -RAK- */ -void store_purchase(void) +void store_purchase() { auto const &st_info = game->edit_data.st_info; @@ -2387,7 +2387,7 @@ void store_purchase(void) /* * Sell an item to the store (or home) */ -void store_sell(void) +void store_sell() { auto const &st_info = game->edit_data.st_info; @@ -2688,7 +2688,7 @@ void store_sell(void) /* * Examine an item in a store -JDL- */ -void store_examine(void) +void store_examine() { auto const &st_info = game->edit_data.st_info; @@ -2804,7 +2804,7 @@ static store_action_type const *find_store_action(s16b command_cmd) * must disable some commands which are allowed in the dungeon * but not in the stores, to prevent chaos. */ -static bool_ store_process_command(void) +static bool_ store_process_command() { bool_ recreate = FALSE; @@ -3112,7 +3112,7 @@ static bool_ store_process_command(void) * into other commands, normally, we convert "p" (pray) and "m" * (cast magic) into "g" (get), and "s" (search) into "d" (drop). */ -void do_cmd_store(void) +void do_cmd_store() { auto const &ow_info = game->edit_data.ow_info; auto const &ba_info = game->edit_data.ba_info; @@ -3568,7 +3568,7 @@ void store_init(int town_num, int store_num) * into other commands, normally, we convert "p" (pray) and "m" * (cast magic) into "g" (get), and "s" (search) into "d" (drop). */ -void do_cmd_home_trump(void) +void do_cmd_home_trump() { auto const &ow_info = game->edit_data.ow_info; auto const &ba_info = game->edit_data.ba_info; diff --git a/src/util.cc b/src/util.cc index f049d79c..9190f4a1 100644 --- a/src/util.cc +++ b/src/util.cc @@ -125,7 +125,7 @@ errr path_parse(char *buf, int max, cptr file) if (!u) return (1); - (void)strcpy(buf, u); + strcpy(buf, u); #else /* Look up password data for user */ pw = getpwuid(getuid()); @@ -134,11 +134,11 @@ errr path_parse(char *buf, int max, cptr file) if (!pw) return (1); /* Make use of the info */ - (void)strcpy(buf, pw->pw_dir); + strcpy(buf, pw->pw_dir); #endif /* Append the rest of the filename, if any */ - if (s) (void)strcat(buf, s); + if (s) strcat(buf, s); /* Success */ return (0); @@ -344,7 +344,7 @@ errr fd_kill(cptr file) if (path_parse(buf, 1024, file)) return ( -1); /* Remove */ - (void)remove(buf); + remove(buf); /* XXX XXX XXX */ return (0); @@ -366,7 +366,7 @@ errr fd_move(cptr file, cptr what) if (path_parse(aux, 1024, what)) return ( -1); /* Rename */ - (void)rename(buf, aux); + rename(buf, aux); /* XXX XXX XXX */ return (0); @@ -514,7 +514,7 @@ errr fd_close(int fd) if (fd < 0) return ( -1); /* Close */ - (void)close(fd); + close(fd); /* XXX XXX XXX */ return (0); @@ -1213,7 +1213,7 @@ static bool_ parse_under = FALSE; * This is not only more efficient, but also necessary to make sure * that various "inkey()" codes are not "lost" along the way. */ -void flush(void) +void flush() { /* Do it later */ flush_later = TRUE; @@ -1235,7 +1235,7 @@ void flush_on_failure() /* * Flush the screen, make a noise */ -void bell(void) +void bell() { /* Mega-Hack -- Flush the output */ Term_fresh(); @@ -1269,7 +1269,7 @@ void bell(void) * macro trigger, 500 milliseconds must pass before the key sequence is * known not to be that macro trigger. XXX XXX XXX */ -static char inkey_aux(void) +static char inkey_aux() { int k = 0, n, p = 0, w = 0; @@ -1281,7 +1281,7 @@ static char inkey_aux(void) /* Wait for a keypress */ - (void)(Term_inkey(&ch, TRUE, TRUE)); + (Term_inkey(&ch, TRUE, TRUE)); /* End "macro action" */ @@ -1358,7 +1358,7 @@ static char inkey_aux(void) } /* Wait for (and remove) a pending key */ - (void)Term_inkey(&ch, TRUE, TRUE); + Term_inkey(&ch, TRUE, TRUE); /* Return the key */ return (ch); @@ -1503,13 +1503,13 @@ static char inkey_real(bool_ inkey_scan) /* Access cursor state */ - (void)Term_get_cursor(&v); + Term_get_cursor(&v); /* Show the cursor if waiting, except sometimes in "command" mode */ if (!inkey_scan && (!inkey_flag || options->hilite_player || character_icky)) { /* Show the cursor */ - (void)Term_set_cursor(1); + Term_set_cursor(1); } @@ -1669,7 +1669,7 @@ static char inkey_real(bool_ inkey_scan) return (ch); } -char inkey(void) { +char inkey() { return inkey_real(FALSE); } @@ -1904,7 +1904,7 @@ static int screen_depth = 0; * * This function must match exactly one call to "screen_load()". */ -void screen_save(void) +void screen_save() { /* Hack -- Flush messages */ msg_print(NULL); @@ -1922,7 +1922,7 @@ void screen_save(void) * * This function must match exactly one call to "screen_save()". */ -void screen_load(void) +void screen_load() { /* Hack -- Flush messages */ msg_print(NULL); @@ -1948,7 +1948,7 @@ void msg_format(cptr fmt, ...) va_start(vp, fmt); /* Format the args, save the length */ - (void)vstrnfmt(buf, 1024, fmt, vp); + vstrnfmt(buf, 1024, fmt, vp); /* End the Varargs Stuff */ va_end(vp); @@ -1967,7 +1967,7 @@ void cmsg_format(byte color, cptr fmt, ...) va_start(vp, fmt); /* Format the args, save the length */ - (void)vstrnfmt(buf, 1024, fmt, vp); + vstrnfmt(buf, 1024, fmt, vp); /* End the Varargs Stuff */ va_end(vp); @@ -2051,10 +2051,10 @@ void text_out_to_screen(byte a, cptr str) /* Obtain the size */ - (void)Term_get_size(&wid, &h); + Term_get_size(&wid, &h); /* Obtain the cursor */ - (void)Term_locate(&x, &y); + Term_locate(&x, &y); /* Wrapping boundary */ wrap = wid; @@ -2161,7 +2161,7 @@ void text_out_to_file(byte a, cptr str) cptr s = str; /* Unused parameter */ - (void)a; + a; /* Process the string */ while (*s) @@ -2909,7 +2909,7 @@ void request_command(int shopping) if (cmd == '\\') { /* Get a real command */ - (void)get_com("Command: ", &cmd_char); + get_com("Command: ", &cmd_char); cmd = cmd_char; @@ -3137,7 +3137,7 @@ bool_ repeat_pull(int *what) return (TRUE); } -void repeat_check(void) +void repeat_check() { int what; diff --git a/src/util.h b/src/util.h index e341a058..7be705a0 100644 --- a/src/util.h +++ b/src/util.h @@ -8,10 +8,10 @@ extern "C" { #endif errr path_build(char *buf, int max, cptr path, cptr file); -void bell(void); +void bell(); errr macro_add(cptr pat, cptr act); sint macro_find_exact(cptr pat); -char inkey(void); +char inkey(); void prt(cptr str, int row, int col); #ifdef __cplusplus diff --git a/src/util.hpp b/src/util.hpp index e57235a9..8b8b2e3c 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -27,19 +27,19 @@ errr fd_seek(int fd, huge n); errr fd_read(int fd, char *buf, huge n); errr fd_write(int fd, cptr buf, huge n); errr fd_close(int fd); -void flush(void); +void flush(); void flush_on_failure(); void move_cursor(int row, int col); void text_to_ascii(char *buf, cptr str); void ascii_to_text(char *buf, cptr str); -char inkey_scan(void); +char inkey_scan(); void display_message(int x, int y, int split, byte color, cptr t); void cmsg_print(byte color, cptr msg); void msg_print(cptr msg); void cmsg_format(byte color, cptr fmt, ...); void msg_format(cptr fmt, ...); -void screen_save(void); -void screen_load(void); +void screen_save(); +void screen_load(); void c_put_str(byte attr, cptr str, int row, int col); void c_put_str(byte attr, std::string const &str, int row, int col); void put_str(cptr str, int row, int col); @@ -75,7 +75,7 @@ timer_type *new_timer(void (*callback)(), s32b delay); int get_keymap_mode(); void repeat_push(int what); bool_ repeat_pull(int *what); -void repeat_check(void); +void repeat_check(); void get_count(int number, int max); bool in_bounds(int y, int x); bool in_bounds2(int y, int x); diff --git a/src/wild.cc b/src/wild.cc index fd9ed6fd..3d86c0b7 100644 --- a/src/wild.cc +++ b/src/wild.cc @@ -554,7 +554,7 @@ void wilderness_gen() for (i = 0; i < lim; i++) { /* Make a resident */ - (void)alloc_monster((generate_encounter == TRUE) ? 0 : 3, (generate_encounter == TRUE) ? FALSE : TRUE); + alloc_monster((generate_encounter == TRUE) ? 0 : 3, (generate_encounter == TRUE) ? FALSE : TRUE); } if (generate_encounter) ambush_flag = TRUE; diff --git a/src/wild.hpp b/src/wild.hpp index 54dd9526..d6a40e8d 100644 --- a/src/wild.hpp +++ b/src/wild.hpp @@ -1,6 +1,6 @@ #pragma once void wilderness_gen(); -void wilderness_gen_small(void); +void wilderness_gen_small(); void reveal_wilderness_around_player(int y, int x, int h, int w); void town_gen(int t_idx); diff --git a/src/wizard2.cc b/src/wizard2.cc index a291fd63..cf7c699d 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -116,7 +116,7 @@ static void teleport_player_town(int town) /* * Hack -- Rerate Hitpoints */ -void do_cmd_rerate(void) +void do_cmd_rerate() { auto &player_hp = game->player_hp; @@ -220,14 +220,14 @@ static void do_cmd_summon_horde() if (cave_naked_bold(wy, wx)) break; } - (void)alloc_horde(wy, wx); + alloc_horde(wy, wx); } /* * Hack -- Teleport to the target */ -static void do_cmd_wiz_bamf(void) +static void do_cmd_wiz_bamf() { /* Must have a target */ if (!target_who) return; @@ -240,7 +240,7 @@ static void do_cmd_wiz_bamf(void) /* * Aux function for "do_cmd_wiz_change()". -RAK- */ -static void do_cmd_wiz_change_aux(void) +static void do_cmd_wiz_change_aux() { int i; int tmp_int; @@ -343,7 +343,7 @@ static void do_cmd_wiz_change_aux(void) /* * Change various "permanent" player variables. */ -static void do_cmd_wiz_change(void) +static void do_cmd_wiz_change() { /* Interact */ do_cmd_wiz_change_aux(); @@ -534,7 +534,7 @@ static void wci_string(cptr string, int num) * * List up to 50 choices in three columns */ -static int wiz_create_itemtype(void) +static int wiz_create_itemtype() { auto const &k_info = game->edit_data.k_info; @@ -1036,7 +1036,7 @@ static void wiz_quantity_item(object_type *o_ptr) * - Change properties (via wiz_tweak_item) * - Change the number of items (via wiz_quantity_item) */ -static void do_cmd_wiz_play(void) +static void do_cmd_wiz_play() { /* Get an item */ int item; @@ -1167,7 +1167,7 @@ static void do_cmd_wiz_play(void) * Hack -- this routine always makes a "dungeon object", and applies * magic to it, and attempts to decline cursed items. */ -static void wiz_create_item(void) +static void wiz_create_item() { object_type forge; object_type *q_ptr; @@ -1213,7 +1213,7 @@ static void wiz_create_item(void) /* * As above, but takes the k_idx as a parameter instead of using menus. */ -static void wiz_create_item_2(void) +static void wiz_create_item_2() { auto const &k_info = game->edit_data.k_info; @@ -1250,23 +1250,23 @@ static void wiz_create_item_2(void) /* * Cure everything instantly */ -void do_cmd_wiz_cure_all(void) +void do_cmd_wiz_cure_all() { object_type *o_ptr; /* Remove curses */ - (void)remove_all_curse(); + remove_all_curse(); /* Restore stats */ - (void)res_stat(A_STR, TRUE); - (void)res_stat(A_INT, TRUE); - (void)res_stat(A_WIS, TRUE); - (void)res_stat(A_CON, TRUE); - (void)res_stat(A_DEX, TRUE); - (void)res_stat(A_CHR, TRUE); + res_stat(A_STR, TRUE); + res_stat(A_INT, TRUE); + res_stat(A_WIS, TRUE); + res_stat(A_CON, TRUE); + res_stat(A_DEX, TRUE); + res_stat(A_CHR, TRUE); /* Restore the level */ - (void)restore_level(); + restore_level(); /* Heal the player */ p_ptr->chp = p_ptr->mhp; @@ -1289,19 +1289,19 @@ void do_cmd_wiz_cure_all(void) p_ptr->csp_frac = 0; /* Cure stuff */ - (void)set_blind(0); - (void)set_confused(0); - (void)set_poisoned(0); - (void)set_afraid(0); - (void)set_paralyzed(0); - (void)set_image(0); - (void)set_stun(0); - (void)set_cut(0); - (void)set_slow(0); + set_blind(0); + set_confused(0); + set_poisoned(0); + set_afraid(0); + set_paralyzed(0); + set_image(0); + set_stun(0); + set_cut(0); + set_slow(0); p_ptr->black_breath = FALSE; /* No longer hungry */ - (void)set_food(PY_FOOD_MAX - 1); + set_food(PY_FOOD_MAX - 1); /* Redraw everything */ do_cmd_redraw(); @@ -1311,7 +1311,7 @@ void do_cmd_wiz_cure_all(void) /* * Go to any level */ -static void do_cmd_wiz_jump(void) +static void do_cmd_wiz_jump() { auto const &d_info = game->edit_data.d_info; @@ -1362,7 +1362,7 @@ static void do_cmd_wiz_jump(void) /* * Become aware of a lot of objects */ -static void do_cmd_wiz_learn(void) +static void do_cmd_wiz_learn() { auto const &k_info = game->edit_data.k_info; @@ -1397,7 +1397,7 @@ static void do_cmd_wiz_summon(int num) for (i = 0; i < num; i++) { - (void)summon_specific(p_ptr->py, p_ptr->px, dun_level, 0); + summon_specific(p_ptr->py, p_ptr->px, dun_level, 0); } } @@ -1490,7 +1490,7 @@ void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp) /* * Hack -- Delete all nearby monsters */ -static void do_cmd_wiz_zap(void) +static void do_cmd_wiz_zap() { int i; @@ -1630,7 +1630,7 @@ void do_cmd_debug() /* Identify */ case 'i': - (void)ident_spell(); + ident_spell(); break; /* Go up or down in the dungeon */ diff --git a/src/wizard2.hpp b/src/wizard2.hpp index b406c9ef..9bad7f92 100644 --- a/src/wizard2.hpp +++ b/src/wizard2.hpp @@ -4,7 +4,7 @@ #include -void do_cmd_rerate(void); -void do_cmd_wiz_cure_all(void); +void do_cmd_rerate(); +void do_cmd_wiz_cure_all(); void do_cmd_wiz_named_friendly(std::size_t r_idx, bool_ slp); void do_cmd_debug(); diff --git a/src/xtra1.cc b/src/xtra1.cc index 3ed902dd..9f12fa3a 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -189,7 +189,7 @@ static void prt_field(cptr info, int row, int col) /* * Prints players max/cur piety */ -static void prt_piety(void) +static void prt_piety() { char tmp[32]; @@ -208,7 +208,7 @@ static void prt_piety(void) /* * Prints the player's current sanity. */ -static void prt_sane(void) +static void prt_sane() { char tmp[32]; byte color; @@ -294,7 +294,7 @@ static void prt_stat(int stat) /* * Prints "title", including "wizard" or "winner" as needed. */ -static void prt_title(void) +static void prt_title() { cptr p = ""; @@ -336,7 +336,7 @@ static void prt_title(void) /* * Prints level */ -static void prt_level(void) +static void prt_level() { char tmp[32]; @@ -358,17 +358,17 @@ static void prt_level(void) /* * Display the experience */ -static void prt_exp(void) +static void prt_exp() { char out_val[32]; if (p_ptr->lev >= PY_MAX_LEVEL) { - (void)sprintf(out_val, "********"); + sprintf(out_val, "********"); } else { - (void)sprintf(out_val, "%8ld", (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp); + sprintf(out_val, "%8ld", (long)(player_exp[p_ptr->lev - 1] * p_ptr->expfact / 100L) - p_ptr->exp); } if (p_ptr->exp >= p_ptr->max_exp) @@ -387,7 +387,7 @@ static void prt_exp(void) /* * Prints current gold */ -static void prt_gold(void) +static void prt_gold() { char tmp[32]; @@ -401,7 +401,7 @@ static void prt_gold(void) /* * Prints current AC */ -static void prt_ac(void) +static void prt_ac() { char tmp[32]; @@ -414,7 +414,7 @@ static void prt_ac(void) /* * Prints Cur/Max hit points */ -static void prt_hp(void) +static void prt_hp() { char tmp[32]; @@ -470,7 +470,7 @@ static void prt_hp(void) /* * Prints Cur/Max monster hit points */ -static void prt_mh(void) +static void prt_mh() { char tmp[32]; @@ -509,7 +509,7 @@ static void prt_mh(void) /* * Prints players max/cur spell points */ -static void prt_sp(void) +static void prt_sp() { char tmp[32]; byte color; @@ -578,7 +578,7 @@ static void prt_depth(int row, int col) { if (dungeon_flags & DF_TOWER) { - (void)strnfmt(depths, 32, "%c%c%c -%d", + strnfmt(depths, 32, "%c%c%c -%d", d_ptr->short_name[0], d_ptr->short_name[1], d_ptr->short_name[2], @@ -586,7 +586,7 @@ static void prt_depth(int row, int col) } else { - (void)strnfmt(depths, 32, "%c%c%c %d", + strnfmt(depths, 32, "%c%c%c %d", d_ptr->short_name[0], d_ptr->short_name[1], d_ptr->short_name[2], @@ -693,11 +693,11 @@ static void prt_state(int row, int col) { if (command_rep > 999) { - (void)sprintf(text, "Rep. %3d00", command_rep / 100); + sprintf(text, "Rep. %3d00", command_rep / 100); } else { - (void)sprintf(text, "Repeat %3d", command_rep); + sprintf(text, "Repeat %3d", command_rep); } } @@ -745,7 +745,7 @@ static void prt_speed(int row, int col) /* * Prints status line */ -static void prt_status_line(void) +static void prt_status_line() { int wid, hgt; Term_get_size(&wid, &hgt); @@ -848,7 +848,7 @@ static void prt_status_line(void) -static void prt_cut(void) +static void prt_cut() { int c = p_ptr->cut; int hgt; @@ -892,7 +892,7 @@ static void prt_cut(void) -static void prt_stun(void) +static void prt_stun() { int s = p_ptr->stun; int hgt; @@ -934,7 +934,7 @@ static void prt_stun(void) * Auto-track current target monster when bored. Note that the * health-bar stops tracking any monster that "disappears". */ -static void health_redraw(void) +static void health_redraw() { int hgt; Term_get_size(nullptr, &hgt); @@ -1028,7 +1028,7 @@ static void health_redraw(void) /* * Display basic info (mostly left of map) */ -static void prt_frame(void) +static void prt_frame() { int i; @@ -1082,7 +1082,7 @@ static void prt_frame(void) /* * Hack -- display inventory in sub-windows */ -static void fix_inven(void) +static void fix_inven() { int j; @@ -1116,7 +1116,7 @@ static void fix_inven(void) /* * Hack -- display equipment in sub-windows */ -static void fix_equip(void) +static void fix_equip() { int j; @@ -1148,7 +1148,7 @@ static void fix_equip(void) /* * Hack -- display character in sub-windows */ -static void fix_player(void) +static void fix_player() { int j; @@ -1184,7 +1184,7 @@ static void fix_player(void) * * XXX XXX XXX Adjust for width and split messages */ -void fix_message(void) +void fix_message() { int j, i; int w, h; @@ -1237,7 +1237,7 @@ void fix_message(void) * * Note that the "player" symbol does NOT appear on the map. */ -static void fix_overhead(void) +static void fix_overhead() { int j; @@ -1272,7 +1272,7 @@ static void fix_overhead(void) /* * Hack -- display monster recall in sub-windows */ -static void fix_monster(void) +static void fix_monster() { int j; @@ -1308,7 +1308,7 @@ static void fix_monster(void) /* * Hack -- display object recall in sub-windows */ -static void fix_object(void) +static void fix_object() { int j; @@ -1343,7 +1343,7 @@ static void fix_object(void) /* Show the monster list in a window */ -static void fix_m_list(void) +static void fix_m_list() { auto const &r_info = game->edit_data.r_info; @@ -1427,7 +1427,7 @@ static void fix_m_list(void) { int w, h, num = 0; - (void)Term_get_size(&w, &h); + Term_get_size(&w, &h); c_prt(TERM_WHITE, format("You can see %d monster%s", c, (c > 1 ? "s:" : ":")), 0, 0); @@ -1534,7 +1534,7 @@ static void add_powers(std::vector const &powers) } /* Calc the player powers */ -static void calc_powers(void) +static void calc_powers() { int i, p = 0; bool_ old_powers[POWER_MAX]; @@ -1647,7 +1647,7 @@ static void calc_sanity() * * This function induces status messages. */ -static void calc_mana(void) +static void calc_mana() { auto const &r_info = game->edit_data.r_info; @@ -1827,7 +1827,7 @@ static void calc_mana(void) * Calculate the players (maximal) hit points * Adjust current hitpoints if necessary */ -void calc_hitpoints(void) +void calc_hitpoints() { auto const &player_hp = game->player_hp; auto const &r_info = game->edit_data.r_info; @@ -1951,7 +1951,7 @@ static void calc_torch_gods() * SWD: Experimental modification: multiple light sources have additive effect. * */ -static void calc_torch(void) +static void calc_torch() { int i; object_type *o_ptr; @@ -2034,7 +2034,7 @@ static void calc_torch(void) /* * Computes current weight limit. */ -int weight_limit(void) +int weight_limit() { int i; @@ -2746,7 +2746,7 @@ static void apply_lflags(LF const &lflags) /** * Are barehand fighter's hands empty? */ -static bool_ monk_empty_hands(void) +static bool_ monk_empty_hands() { int i; object_type *o_ptr; @@ -4040,7 +4040,7 @@ void calc_bonuses(bool_ silent) /* * Handle "p_ptr->notice" */ -void notice_stuff(void) +void notice_stuff() { /* Notice stuff */ if (!p_ptr->notice) return; @@ -4065,7 +4065,7 @@ void notice_stuff(void) /* * Handle "p_ptr->update" */ -void update_stuff(void) +void update_stuff() { /* Update stuff */ if (!p_ptr->update) return; @@ -4172,7 +4172,7 @@ void update_stuff(void) /* * Handle "p_ptr->redraw" */ -void redraw_stuff(void) +void redraw_stuff() { /* Redraw stuff */ if (!p_ptr->redraw) return; @@ -4213,7 +4213,7 @@ void redraw_stuff(void) /* * Handle "p_ptr->window" */ -void window_stuff(void) +void window_stuff() { int j; @@ -4298,7 +4298,7 @@ void window_stuff(void) /* * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ -void handle_stuff(void) +void handle_stuff() { /* Update stuff */ if (p_ptr->update) update_stuff(); @@ -4311,7 +4311,7 @@ void handle_stuff(void) } -bool_ monk_heavy_armor(void) +bool_ monk_heavy_armor() { u16b monk_arm_wgt = 0; diff --git a/src/xtra1.hpp b/src/xtra1.hpp index 7f685fdc..4fde1619 100644 --- a/src/xtra1.hpp +++ b/src/xtra1.hpp @@ -6,20 +6,20 @@ #include -void fix_message(void); +void fix_message(); void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a); int luck(int min, int max); -int weight_limit(void); +int weight_limit(); extern bool_ calc_powers_silent; void cnv_stat(int i, char *out_val); s16b modify_stat_value(int value, int amount); -void calc_hitpoints(void); -void notice_stuff(void); -void update_stuff(void); -void redraw_stuff(void); -void window_stuff(void); -void handle_stuff(void); -bool_ monk_heavy_armor(void); +void calc_hitpoints(); +void notice_stuff(); +void update_stuff(); +void redraw_stuff(); +void window_stuff(); +void handle_stuff(); +bool_ monk_heavy_armor(); void calc_bonuses(bool_ silent); void gain_fate(byte fate); std::string fate_desc(int fate); diff --git a/src/xtra2.cc b/src/xtra2.cc index bbc82c68..d8b87f51 100644 --- a/src/xtra2.cc +++ b/src/xtra2.cc @@ -70,7 +70,7 @@ using boost::algorithm::iequals; -static void corrupt_corrupted(void); +static void corrupt_corrupted(); /* * Set "p_ptr->parasite" and "p_ptr->parasite_r_idx" @@ -1373,25 +1373,25 @@ bool_ set_stun(int v) { if (!p_ptr->sustain_int) { - (void) do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); } if (!p_ptr->sustain_wis) { - (void) do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); } } else if (randint(2) == 1) { if (!p_ptr->sustain_int) { - (void) do_dec_stat(A_INT, STAT_DEC_NORMAL); + do_dec_stat(A_INT, STAT_DEC_NORMAL); } } else { if (!p_ptr->sustain_wis) { - (void) do_dec_stat(A_WIS, STAT_DEC_NORMAL); + do_dec_stat(A_WIS, STAT_DEC_NORMAL); } } } @@ -1865,7 +1865,7 @@ bool_ set_food(int v) /* * Advance experience levels and print experience */ -void check_experience(void) +void check_experience() { int gained = 0; bool_ level_corruption = FALSE; @@ -2588,7 +2588,7 @@ void monster_death(int m_idx) else if (strstr(r_ptr->name, "Unmaker")) { int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL; - (void)project(m_idx, 6, y, x, 100, GF_CHAOS, flg); + project(m_idx, 6, y, x, 100, GF_CHAOS, flg); } /* Pink horrors are replaced with 2 Blue horrors */ else if (strstr(r_ptr->name, "ink horror")) @@ -3255,7 +3255,7 @@ void get_screen_size(int *wid_p, int *hgt_p) * Calculates current boundaries * Called below. */ -static void panel_bounds(void) +static void panel_bounds() { int wid, hgt; @@ -3338,7 +3338,7 @@ bool_ change_panel(int dy, int dx) * * The map is reprinted if necessary, and "TRUE" is returned. */ -void verify_panel(void) +void verify_panel() { int y = p_ptr->py; int x = p_ptr->px; @@ -3473,7 +3473,7 @@ void verify_panel(void) /* * Map resizing whenever the main term changes size */ -void resize_map(void) +void resize_map() { /* Only if the dungeon exists */ if (!character_dungeon) return; @@ -3522,7 +3522,7 @@ void resize_map(void) /* * Redraw a term when it is resized */ -void resize_window(void) +void resize_window() { /* Only if the dungeon exists */ if (!character_dungeon) return; @@ -3656,7 +3656,7 @@ static bool target_able(int m_idx) * * We return TRUE if the target is "okay" and FALSE otherwise. */ -bool_ target_okay(void) +bool_ target_okay() { /* Accept stationary targets */ if (target_who < 0) return (TRUE); @@ -5130,7 +5130,7 @@ static void clean_wish_name(char *buf, char *name) /* * Allow the player to make a wish */ -void make_wish(void) +void make_wish() { auto const &re_info = game->edit_data.re_info; auto const &r_info = game->edit_data.r_info; @@ -5269,7 +5269,7 @@ void make_wish(void) * Corrupted have a 1/3 chance of losing a mutation each time this is called, * assuming they have any in the first place */ -static void corrupt_corrupted(void) +static void corrupt_corrupted() { if (magik(45)) { diff --git a/src/xtra2.hpp b/src/xtra2.hpp index b61114a4..9edcec1e 100644 --- a/src/xtra2.hpp +++ b/src/xtra2.hpp @@ -7,9 +7,9 @@ #include -void do_rebirth(void); +void do_rebirth(); void switch_subrace(std::size_t racem, bool_ copy_old); -void drop_from_wild(void); +void drop_from_wild(); bool_ set_roots(int v, s16b ac, s16b dam); bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag); bool_ set_parasite(int v, int r); @@ -60,7 +60,7 @@ bool_ set_oppose_cc(int v); bool_ set_stun(int v); bool_ set_cut(int v); bool_ set_food(int v); -void check_experience(void); +void check_experience(); void check_experience_obj(object_type *o_ptr); void gain_exp(s32b amount); void lose_exp(s32b amount); @@ -68,8 +68,8 @@ int get_coin_type(std::shared_ptr r_ptr); void monster_death(int m_idx); bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note); bool_ change_panel(int dy, int dx); -void verify_panel(void); -bool_ target_okay(void); +void verify_panel(); +bool_ target_okay(); bool_ target_set(int mode); bool_ get_aim_dir(int *dp); bool_ get_rep_dir(int *dp); @@ -77,13 +77,13 @@ bool_ set_shadow(int v); bool_ set_tim_esp(int v); bool_ tgp_pt(int *x, int * y); bool_ tgt_pt (int *x, int *y); -void do_poly_self(void); -bool_ curse_weapon(void); -bool_ curse_armor(void); -void make_wish(void); +void do_poly_self(); +bool_ curse_weapon(); +bool_ curse_armor(); +void make_wish(); void create_between_gate(int dist, int y, int x); extern "C" { - void resize_map(void); - void resize_window(void); + void resize_map(); + void resize_window(); } diff --git a/src/z-term.h b/src/z-term.h index fc9c0598..92f09577 100644 --- a/src/z-term.h +++ b/src/z-term.h @@ -150,7 +150,7 @@ struct term errr (*text_hook)(int x, int y, int n, byte a, cptr s); - void (*resize_hook)(void); + void (*resize_hook)(); }; @@ -225,7 +225,7 @@ errr Term_xtra(int n, int v); void Term_queue_char(int x, int y, byte a, char c); void Term_queue_chars(int x, int y, int n, byte a, cptr s); -errr Term_fresh(void); +errr Term_fresh(); errr Term_set_cursor(int v); errr Term_gotoxy(int x, int y); errr Term_draw(int x, int y, byte a, char c); @@ -234,8 +234,8 @@ errr Term_addstr(int n, byte a, cptr s); errr Term_putch(int x, int y, byte a, char c); errr Term_putstr(int x, int y, int n, byte a, cptr s); errr Term_erase(int x, int y, int n); -errr Term_clear(void); -errr Term_redraw(void); +errr Term_clear(); +errr Term_redraw(); errr Term_redraw_section(int x1, int y1, int x2, int y2); void Term_bell(); @@ -244,14 +244,14 @@ errr Term_get_size(int *w, int *h); errr Term_locate(int *x, int *y); errr Term_what(int x, int y, byte *a, char *c); -errr Term_flush(void); +errr Term_flush(); errr Term_keypress(int k); errr Term_key_push(int k); errr Term_inkey(char *ch, bool_ wait, bool_ take); -errr Term_save(void); -term_win* Term_save_to(void); -errr Term_load(void); +errr Term_save(); +term_win* Term_save_to(); +errr Term_load(); errr Term_load_from(term_win *save); errr Term_resize(int w, int h); -- cgit v1.2.3 From fdb532aec5234db77a9111d219f8a870d660c4fc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Change away from bool_ for hooks --- src/cmd7.cc | 6 +-- src/help.cc | 8 +-- src/hooks.cc | 6 +-- src/hooks.hpp | 4 +- src/joke.cc | 2 +- src/joke.hpp | 2 +- src/modules.cc | 62 +++++++++++------------ src/q_betwen.cc | 65 +++++++++++++++--------- src/q_betwen.hpp | 2 +- src/q_bounty.cc | 4 +- src/q_bounty.hpp | 2 +- src/q_dragons.cc | 31 ++++++++---- src/q_dragons.hpp | 2 +- src/q_eol.cc | 62 +++++++++++++++-------- src/q_eol.hpp | 2 +- src/q_evil.cc | 34 ++++++++----- src/q_evil.hpp | 2 +- src/q_fireprof.cc | 26 ++++------ src/q_fireprof.hpp | 2 +- src/q_god.cc | 44 ++++++++-------- src/q_god.hpp | 2 +- src/q_haunted.cc | 43 ++++++++++------ src/q_haunted.hpp | 2 +- src/q_hobbit.cc | 50 ++++++++++-------- src/q_hobbit.hpp | 2 +- src/q_invas.cc | 54 ++++++++++++-------- src/q_invas.hpp | 2 +- src/q_library.cc | 35 +++++-------- src/q_library.hpp | 2 +- src/q_main.cc | 51 +++++++++++-------- src/q_main.hpp | 6 +-- src/q_narsil.cc | 30 +++++++---- src/q_narsil.hpp | 2 +- src/q_nazgul.cc | 52 ++++++++++++------- src/q_nazgul.hpp | 2 +- src/q_nirna.cc | 41 +++++++++------ src/q_nirna.hpp | 2 +- src/q_one.cc | 145 +++++++++++++++++++++++++++++++++++------------------ src/q_one.hpp | 2 +- src/q_poison.cc | 136 ++++++++++++++++++++++++++++++++++++------------- src/q_poison.hpp | 2 +- src/q_rand.cc | 131 ++++++++++++++++++++++++++--------------------- src/q_rand.hpp | 2 +- src/q_shroom.cc | 75 +++++++++++++++++++-------- src/q_shroom.hpp | 2 +- src/q_spider.cc | 42 ++++++++++------ src/q_spider.hpp | 2 +- src/q_thief.cc | 55 ++++++++++++++------ src/q_thief.hpp | 2 +- src/q_thrain.cc | 85 +++++++++++++++++++------------ src/q_thrain.hpp | 2 +- src/q_troll.cc | 39 +++++++++----- src/q_troll.hpp | 2 +- src/q_ultrae.cc | 4 +- src/q_ultrae.hpp | 2 +- src/q_ultrag.cc | 61 ++++++++++++++-------- src/q_ultrag.hpp | 2 +- src/q_wight.cc | 34 ++++++++----- src/q_wight.hpp | 2 +- src/q_wolves.cc | 34 ++++++++----- src/q_wolves.hpp | 2 +- src/quest_type.hpp | 2 +- 62 files changed, 1002 insertions(+), 611 deletions(-) diff --git a/src/cmd7.cc b/src/cmd7.cc index 312c657e..ec13c908 100644 --- a/src/cmd7.cc +++ b/src/cmd7.cc @@ -844,7 +844,7 @@ void do_cmd_mimic_lore() p_ptr->update |= (PU_BONUS); } -static bool_ mimic_forbid_travel(void *, void *, void *) +static bool mimic_forbid_travel(void *, void *, void *) { u32b value = p_ptr->mimic_extra >> 16; u32b att = p_ptr->mimic_extra & 0xFFFF; @@ -852,10 +852,10 @@ static bool_ mimic_forbid_travel(void *, void *, void *) if(value > 0 && (att & CLASS_ARMS || att & CLASS_LEGS)) { msg_print("You had best not travel with your extra limbs."); - return TRUE; + return true; } - return FALSE; + return false; } /* diff --git a/src/help.cc b/src/help.cc index 43d4873f..08956f70 100644 --- a/src/help.cc +++ b/src/help.cc @@ -558,7 +558,7 @@ static triggered_help_type triggered_help[TRIGGERED_HELP_MAX] = } }; -static bool_ triggered_help_hook(void *data, void *in, void *out) +static bool triggered_help_hook(void *data, void *in, void *out) { triggered_help_type *triggered_help = (triggered_help_type *) data; /* Not triggered before and trigger now? */ @@ -576,13 +576,13 @@ static bool_ triggered_help_hook(void *data, void *in, void *out) } } /* Don't stop processing */ - return FALSE; + return false; } -static bool_ hook_game_start(void *data, void *in, void *out) +static bool hook_game_start(void *data, void *in, void *out) { game_started = TRUE; - return FALSE; + return false; } static void setup_triggered_help_hook(int i) diff --git a/src/hooks.cc b/src/hooks.cc index 4fcc39d3..bd2ea905 100644 --- a/src/hooks.cc +++ b/src/hooks.cc @@ -81,7 +81,7 @@ void del_hook_new(int h_idx, hook_func_t hook_func) } } -bool_ process_hooks_new(int h_idx, void *in, void *out) +bool process_hooks_new(int h_idx, void *in, void *out) { auto const &hooks = hooks_instance()[h_idx]; @@ -94,7 +94,7 @@ bool_ process_hooks_new(int h_idx, void *in, void *out) returns TRUE */ if (hook_data.invoke(in, out)) { - return TRUE; + return true; } /* Should we restart processing at the beginning? */ @@ -109,5 +109,5 @@ bool_ process_hooks_new(int h_idx, void *in, void *out) } } - return FALSE; + return false; } diff --git a/src/hooks.hpp b/src/hooks.hpp index 78896def..7cf4285b 100644 --- a/src/hooks.hpp +++ b/src/hooks.hpp @@ -2,9 +2,9 @@ #include "h-basic.h" -typedef bool_ (*hook_func_t)(void *, void *, void *); +typedef bool (*hook_func_t)(void *, void *, void *); void add_hook_new(int h_idx, hook_func_t hook_func, cptr name, void *data); void del_hook_new(int h_idx, hook_func_t hook_func); extern int process_hooks_restart; -bool_ process_hooks_new(int h_idx, void *in, void *out); +bool process_hooks_new(int h_idx, void *in, void *out); diff --git a/src/joke.cc b/src/joke.cc index eefee404..07149b3f 100644 --- a/src/joke.cc +++ b/src/joke.cc @@ -22,7 +22,7 @@ static void gen_joke_place_monster(int r_idx) } } -bool_ gen_joke_monsters(void *data, void *in, void *out) +bool gen_joke_monsters(void *data, void *in, void *out) { if (options->joke_monsters) { diff --git a/src/joke.hpp b/src/joke.hpp index 46795e7c..2721636e 100644 --- a/src/joke.hpp +++ b/src/joke.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ gen_joke_monsters(void *data, void *in, void *out); +bool gen_joke_monsters(void *data, void *in, void *out); diff --git a/src/modules.cc b/src/modules.cc index 4d60c960..aba71731 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -557,7 +557,7 @@ exit: screen_load(); } -static bool_ auto_stat_gain_hook(void *data, void *in, void *out) +static bool auto_stat_gain_hook(void *data, void *in, void *out) { while (p_ptr->last_rewarded_level * 5 <= p_ptr->lev) { @@ -571,10 +571,10 @@ static bool_ auto_stat_gain_hook(void *data, void *in, void *out) p_ptr->last_rewarded_level += 1; } - return FALSE; + return false; } -static bool_ drunk_takes_wine(void *data, void *in_, void *out) +static bool drunk_takes_wine(void *, void *in_, void *) { hook_give_in *in = (hook_give_in *) in_; monster_type *m_ptr = &m_list[in->m_idx]; @@ -604,7 +604,7 @@ static bool_ drunk_takes_wine(void *data, void *in_, void *out) } } -static bool_ hobbit_food(void *data, void *in_, void *out) +static bool hobbit_food(void *, void *in_, void *) { hook_give_in *in = (hook_give_in *) in_; monster_type *m_ptr = &m_list[in->m_idx]; @@ -617,15 +617,15 @@ static bool_ hobbit_food(void *data, void *in_, void *out) inc_stack_size_ex(in->item, -1, OPTIMIZE, NO_DESCRIBE); - return TRUE; + return true; } else { - return FALSE; + return false; } } -static bool_ smeagol_ring(void *data, void *in_, void *out) +static bool smeagol_ring(void *data, void *in_, void *out) { hook_give_in *in = (hook_give_in *) in_; monster_type *m_ptr = &m_list[in->m_idx]; @@ -638,15 +638,15 @@ static bool_ smeagol_ring(void *data, void *in_, void *out) inc_stack_size_ex(in->item, -1, OPTIMIZE, NO_DESCRIBE); - return TRUE; + return true; } else { - return FALSE; + return false; } } -static bool_ longbottom_leaf(void *data, void *in_, void *out_) +static bool longbottom_leaf(void *, void *in_, void *) { hook_eat_in *in = (hook_eat_in *) in_; @@ -655,13 +655,13 @@ static bool_ longbottom_leaf(void *data, void *in_, void *out_) { msg_print("What a stress reliever!"); heal_insanity(1000); - return TRUE; + return true; } - return FALSE; + return false; } -static bool_ food_vessel(void *data, void *in_, void *out) +static bool food_vessel(void *, void *in_, void *ut) { hook_eat_in *in = (hook_eat_in *) in_; @@ -675,16 +675,16 @@ static bool_ food_vessel(void *data, void *in_, void *out) forge.ident |= IDENT_MENTAL | IDENT_KNOWN; inven_carry(&forge, FALSE); - return TRUE; + return true; } - return FALSE; + return false; } /* * Player must have appropriate keys to enter Erebor. */ -static bool_ erebor_stair(void *data, void *in_, void *out_) +static bool erebor_stair(void *, void *in_, void *out_) { hook_stair_in *in = (hook_stair_in *) in_; hook_stair_out *out = (hook_stair_out *) out_; @@ -719,13 +719,13 @@ static bool_ erebor_stair(void *data, void *in_, void *out_) } } - return FALSE; + return false; } /* * Orthanc requires a key. */ -static bool_ orthanc_stair(void *data, void *in_, void *out_) +static bool orthanc_stair(void *, void *in_, void *out_) { hook_stair_in *in = (hook_stair_in *) in_; hook_stair_out *out = (hook_stair_out *) out_; @@ -757,13 +757,13 @@ static bool_ orthanc_stair(void *data, void *in_, void *out_) } } - return FALSE; + return false; } /* * Movement from Theme */ -static bool_ theme_push_past(void *data, void *in_, void *out_) +static bool theme_push_past(void *data, void *in_, void *out_) { hook_move_in *p = (hook_move_in *) in_; cave_type *c_ptr = &cave[p->y][p->x]; @@ -796,19 +796,19 @@ static bool_ theme_push_past(void *data, void *in_, void *out_) msg_print(format("%s is in your way!", buf)); energy_use = 0; - return TRUE; + return true; } } } - return FALSE; + return false; } /* * Check if monster race is in list. The list is terminated * with a -1. */ -static bool_ race_in_list(int r_idx, int race_idxs[]) +static bool race_in_list(int r_idx, int race_idxs[]) { int i; @@ -816,11 +816,11 @@ static bool_ race_in_list(int r_idx, int race_idxs[]) { if (r_idx == race_idxs[i]) { - return TRUE; + return true; } } - return FALSE; + return false; } /* @@ -1155,11 +1155,9 @@ s16b *theme_race_status(int r_idx) return NULL; } -static bool_ theme_level_end_gen(void *data, void *in, void *out) +static bool theme_level_end_gen(void *, void *, void *) { - int i = 0; - - for (i = 0; i < m_max; i++) + for (int i = 0; i < m_max; i++) { monster_type *m_ptr = &m_list[i]; int r_idx = m_ptr->r_idx; @@ -1170,10 +1168,10 @@ static bool_ theme_level_end_gen(void *data, void *in, void *out) } } - return FALSE; + return false; } -static bool_ theme_new_monster_end(void *data, void *in_, void *out) +static bool theme_new_monster_end(void *, void *in_, void *) { hook_new_monster_end_in *in = (hook_new_monster_end_in *) in_; s16b *status = theme_race_status(in->m_ptr->r_idx); @@ -1183,7 +1181,7 @@ static bool_ theme_new_monster_end(void *data, void *in_, void *out) in->m_ptr->status = *status; } - return FALSE; + return false; } void init_hooks_module() diff --git a/src/q_betwen.cc b/src/q_betwen.cc index 8deb6667..ca8243b4 100644 --- a/src/q_betwen.cc +++ b/src/q_betwen.cc @@ -19,7 +19,7 @@ #define cquest (quest[QUEST_BETWEEN]) -static bool_ quest_between_move_hook(void *, void *in_, void *) +static bool quest_between_move_hook(void *, void *in_, void *) { struct hook_move_in *in = static_cast(in_); s32b y = in->y; @@ -28,7 +28,10 @@ static bool_ quest_between_move_hook(void *, void *in_, void *) c_ptr = &cave[y][x]; - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } /* The tower of Turgon */ if ((c_ptr->feat == FEAT_SHOP) && (c_ptr->special == 27)) @@ -38,19 +41,28 @@ static bool_ quest_between_move_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_COMPLETED; - return TRUE; + return true; } /* Only 1 ambush */ - if (cquest.data[0]) return (FALSE); + if (cquest.data[0]) + { + return false; + } if (!p_ptr->wild_mode) { - if (p_ptr->wilderness_y > 19) return (FALSE); + if (p_ptr->wilderness_y > 19) + { + return false; + } } else { - if (p_ptr->py > 19) return (FALSE); + if (p_ptr->py > 19) + { + return false; + } } /* Mark as entered */ @@ -64,16 +76,19 @@ static bool_ quest_between_move_hook(void *, void *in_, void *) cmsg_print(TERM_YELLOW, "Trone steps forth and speaks: 'The secret of the Void Jumpgates"); cmsg_print(TERM_YELLOW, "will not be used by any but the thunderlords!'"); - return FALSE; + return false; } -static bool_ quest_between_gen_hook(void *, void *, void *) +static bool quest_between_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_BETWEEN) return FALSE; + if (p_ptr->inside_quest != QUEST_BETWEEN) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -99,16 +114,16 @@ static bool_ quest_between_gen_hook(void *, void *, void *) dungeon_flags |= DF_NO_GENO; - return TRUE; + return true; } -static bool_ quest_between_finish_hook(void *, void *in_, void *) +static bool quest_between_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; object_type forge, *q_ptr; - if (q_idx != QUEST_BETWEEN) return FALSE; + if (q_idx != QUEST_BETWEEN) return false; c_put_str(TERM_YELLOW, "Ah you finally arrived, I hope your travel wasn't too hard.", 8, 0); c_put_str(TERM_YELLOW, "As a reward you can freely use the Void Jumpgates for quick travel.", 9, 0); @@ -137,14 +152,17 @@ static bool_ quest_between_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_between_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_between_death_hook(void *, void *, void *) +static bool quest_between_death_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_BETWEEN) return FALSE; + if (p_ptr->inside_quest != QUEST_BETWEEN) + { + return false; + } for (i = m_max - 1; i >= 1; i--) { @@ -163,14 +181,14 @@ static bool_ quest_between_death_hook(void *, void *, void *) cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS); cave[p_ptr->py][p_ptr->px].special = 0; - return FALSE; + return false; } - return FALSE; + return false; } -static bool_ quest_between_dump_hook(void *, void *in_, void *) +static bool quest_between_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -180,10 +198,10 @@ static bool_ quest_between_dump_hook(void *, void *in_, void *) fprintf(f, "\n You established a permanent void jumpgates liaison between Minas Anor and Gondolin,"); fprintf(f, "\n thus allowing the last alliance to exist."); } - return (FALSE); + return false; } -static bool_ quest_between_forbid_hook(void *, void *in_, void *) +static bool quest_between_forbid_hook(void *, void *in_, void *) { hook_init_quest_in *in = static_cast(in_); s32b q_idx = in->q_idx; @@ -193,12 +211,12 @@ static bool_ quest_between_forbid_hook(void *, void *in_, void *) if (p_ptr->lev < 45) { c_put_str(TERM_WHITE, "I fear you are not ready for the next quest, come back later.", 8, 0); - return (TRUE); + return true; } - return (FALSE); + return false; } -bool_ quest_between_init_hook() +void quest_between_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -209,5 +227,4 @@ bool_ quest_between_init_hook() } add_hook_new(HOOK_CHAR_DUMP, quest_between_dump_hook, "between_dump", NULL); add_hook_new(HOOK_INIT_QUEST, quest_between_forbid_hook, "between_forbid", NULL); - return (FALSE); } diff --git a/src/q_betwen.hpp b/src/q_betwen.hpp index 1171d138..54042a24 100644 --- a/src/q_betwen.hpp +++ b/src/q_betwen.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_between_init_hook(); +void quest_between_init_hook(); diff --git a/src/q_bounty.cc b/src/q_bounty.cc index 1bdb1fe6..f0a431de 100644 --- a/src/q_bounty.cc +++ b/src/q_bounty.cc @@ -81,9 +81,9 @@ static bool bounty_item_tester_hook(object_type const *o_ptr) return ((o_ptr->tval == TV_CORPSE) && (o_ptr->pval2 == bounty_quest_monster)); } -bool_ quest_bounty_init_hook() +void quest_bounty_init_hook() { - return FALSE; + // Initialized by building action } bool_ quest_bounty_drop_item() diff --git a/src/q_bounty.hpp b/src/q_bounty.hpp index e4ebe084..fe9742ef 100644 --- a/src/q_bounty.hpp +++ b/src/q_bounty.hpp @@ -4,7 +4,7 @@ #include -bool_ quest_bounty_init_hook(); +void quest_bounty_init_hook(); bool_ quest_bounty_drop_item(); bool_ quest_bounty_get_item(); std::string quest_bounty_describe(); diff --git a/src/q_dragons.cc b/src/q_dragons.cc index 1ed5a97b..9f89089c 100644 --- a/src/q_dragons.cc +++ b/src/q_dragons.cc @@ -19,7 +19,7 @@ #define cquest (quest[QUEST_DRAGONS]) -static bool_ quest_dragons_gen_hook(void *, void *, void *) +static bool quest_dragons_gen_hook(void *, void *, void *) { auto const &f_info = game->edit_data.f_info; @@ -107,7 +107,7 @@ static bool_ quest_dragons_gen_hook(void *, void *, void *) return TRUE; } -static bool_ quest_dragons_death_hook(void *, void *, void *) +static bool quest_dragons_death_hook(void *, void *, void *) { int i, mcnt = 0; @@ -120,9 +120,15 @@ static bool_ quest_dragons_death_hook(void *, void *, void *) monster_type *m_ptr = &m_list[i]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!m_ptr->r_idx) + { + continue; + } - if (m_ptr->status <= MSTATUS_ENEMY) mcnt++; + if (m_ptr->status <= MSTATUS_ENEMY) + { + mcnt++; + } } /* Nobody left ? */ @@ -134,17 +140,21 @@ static bool_ quest_dragons_death_hook(void *, void *, void *) process_hooks_restart = TRUE; cmsg_print(TERM_YELLOW, "Gondolin is safer now."); - return (FALSE); + return false; } - return FALSE; + + return false; } -static bool_ quest_dragons_finish_hook(void *, void *in_, void *) +static bool quest_dragons_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_DRAGONS) return FALSE; + if (q_idx != QUEST_DRAGONS) + { + return false; + } c_put_str(TERM_YELLOW, "Thank you for killing the dragons!", 8, 0); c_put_str(TERM_YELLOW, "You can use the cave as your house as a reward.", 9, 0); @@ -152,10 +162,10 @@ static bool_ quest_dragons_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_EOL; - return TRUE; + return true; } -bool_ quest_dragons_init_hook() +void quest_dragons_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -163,5 +173,4 @@ bool_ quest_dragons_init_hook() add_hook_new(HOOK_QUEST_FINISH, quest_dragons_finish_hook, "dragons_finish", NULL); add_hook_new(HOOK_GEN_QUEST, quest_dragons_gen_hook, "dragons_geb", NULL); } - return (FALSE); } diff --git a/src/q_dragons.hpp b/src/q_dragons.hpp index af1bef20..cda41321 100644 --- a/src/q_dragons.hpp +++ b/src/q_dragons.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_dragons_init_hook(); +void quest_dragons_init_hook(); diff --git a/src/q_eol.cc b/src/q_eol.cc index ae1cd96a..815b3107 100644 --- a/src/q_eol.cc +++ b/src/q_eol.cc @@ -25,14 +25,17 @@ GENERATE_MONSTER_LOOKUP_FN(get_eol, "Eol, the Dark Elf") -static bool_ quest_eol_gen_hook(void *, void *, void *) +static bool quest_eol_gen_hook(void *, void *, void *) { int x, y; bool_ done = FALSE; int xsize = 50, ysize = 30, y0, x0; int m_idx = 0; - if (p_ptr->inside_quest != QUEST_EOL) return FALSE; + if (p_ptr->inside_quest != QUEST_EOL) + { + return false; + } x0 = 2 + (xsize / 2); y0 = 2 + (ysize / 2); @@ -102,16 +105,19 @@ static bool_ quest_eol_gen_hook(void *, void *, void *) cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS); - return TRUE; + return true; } -static bool_ quest_eol_finish_hook(void *, void *in_, void *) +static bool quest_eol_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; object_type forge, *q_ptr; - if (q_idx != QUEST_EOL) return FALSE; + if (q_idx != QUEST_EOL) + { + return false; + } c_put_str(TERM_YELLOW, "A tragedy, but the deed needed to be done.", 8, 0); c_put_str(TERM_YELLOW, "Accept my thanks, and that reward.", 9, 0); @@ -134,15 +140,18 @@ static bool_ quest_eol_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_eol_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_eol_fail_hook(void *, void *in_, void *) +static bool quest_eol_fail_hook(void *, void *in_, void *) { struct hook_quest_fail_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_EOL) return FALSE; + if (q_idx != QUEST_EOL) + { + return false; + } c_put_str(TERM_YELLOW, "You fled ! I did not think you would flee...", 8, 0); @@ -152,16 +161,19 @@ static bool_ quest_eol_fail_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FAIL, quest_eol_fail_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_eol_death_hook(void *, void *in_, void *) +static bool quest_eol_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - if (p_ptr->inside_quest != QUEST_EOL) return FALSE; + if (p_ptr->inside_quest != QUEST_EOL) + { + return false; + } if (r_idx == get_eol()) { @@ -171,22 +183,28 @@ static bool_ quest_eol_death_hook(void *, void *in_, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_eol_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } - return FALSE; + return false; } -static bool_ quest_eol_stair_hook(void *, void *in_, void *) +static bool quest_eol_stair_hook(void *, void *in_, void *) { auto const &r_info = game->edit_data.r_info; struct hook_stair_in *in = static_cast(in_); auto r_ptr = &r_info[get_eol()]; - if (p_ptr->inside_quest != QUEST_EOL) return FALSE; + if (p_ptr->inside_quest != QUEST_EOL) + { + return false; + } - if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) return TRUE; + if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) + { + return true; + } if (r_ptr->max_num) { @@ -195,21 +213,24 @@ static bool_ quest_eol_stair_hook(void *, void *in_, void *) /* Flush input */ flush(); - if (!get_check("Really abandon the quest?")) return TRUE; + if (!get_check("Really abandon the quest?")) + { + return true; + } cmsg_print(TERM_YELLOW, "You flee away from Eol..."); cquest.status = QUEST_STATUS_FAILED; del_hook_new(HOOK_STAIR, quest_eol_stair_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } } - return FALSE; + return false; } -bool_ quest_eol_init_hook() +void quest_eol_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -219,5 +240,4 @@ bool_ quest_eol_init_hook() add_hook_new(HOOK_QUEST_FAIL, quest_eol_fail_hook, "eol_fail", NULL); add_hook_new(HOOK_QUEST_FINISH, quest_eol_finish_hook, "eol_finish", NULL); } - return (FALSE); } diff --git a/src/q_eol.hpp b/src/q_eol.hpp index 6043b3ba..19af3583 100644 --- a/src/q_eol.hpp +++ b/src/q_eol.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_eol_init_hook(); +void quest_eol_init_hook(); diff --git a/src/q_evil.cc b/src/q_evil.cc index 21d608e7..4636356a 100644 --- a/src/q_evil.cc +++ b/src/q_evil.cc @@ -19,7 +19,7 @@ #define cquest (quest[QUEST_EVIL]) -static bool_ quest_evil_gen_hook(void *, void *, void *) +static bool quest_evil_gen_hook(void *, void *, void *) { auto const &f_info = game->edit_data.f_info; @@ -27,11 +27,16 @@ static bool_ quest_evil_gen_hook(void *, void *, void *) int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_EVIL) return FALSE; + if (p_ptr->inside_quest != QUEST_EVIL) + { + return false; + } /* Just in case we didnt talk the the mayor */ if (cquest.status == QUEST_STATUS_UNTAKEN) + { cquest.status = QUEST_STATUS_TAKEN; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -70,14 +75,17 @@ static bool_ quest_evil_gen_hook(void *, void *, void *) process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_evil_death_hook(void *, void *, void *) +static bool quest_evil_death_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_EVIL) return FALSE; + if (p_ptr->inside_quest != QUEST_EVIL) + { + return false; + } /* Process the monsters (backwards) */ for (i = m_max - 1; i >= 1; i--) @@ -103,17 +111,20 @@ static bool_ quest_evil_death_hook(void *, void *, void *) process_hooks_restart = TRUE; cmsg_print(TERM_YELLOW, "Khazad-Dum is safer now."); - return (FALSE); + return false; } - return FALSE; + return false; } -static bool_ quest_evil_finish_hook(void *, void *in_, void *) +static bool quest_evil_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_EVIL) return FALSE; + if (q_idx != QUEST_EVIL) + { + return false; + } c_put_str(TERM_YELLOW, "Thank you for saving us!", 8, 0); c_put_str(TERM_YELLOW, "You can use the cave as your house as a reward.", 9, 0); @@ -121,10 +132,10 @@ static bool_ quest_evil_finish_hook(void *, void *in_, void *) /* End the plot */ *(quest[q_idx].plot) = QUEST_NULL; - return TRUE; + return true; } -bool_ quest_evil_init_hook() +void quest_evil_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -132,5 +143,4 @@ bool_ quest_evil_init_hook() add_hook_new(HOOK_QUEST_FINISH, quest_evil_finish_hook, "evil_finish", NULL); add_hook_new(HOOK_GEN_QUEST, quest_evil_gen_hook, "evil_geb", NULL); } - return (FALSE); } diff --git a/src/q_evil.hpp b/src/q_evil.hpp index 5346afe4..0079e56c 100644 --- a/src/q_evil.hpp +++ b/src/q_evil.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_evil_init_hook(); +void quest_evil_init_hook(); diff --git a/src/q_fireprof.cc b/src/q_fireprof.cc index 9e36ce5c..26bf75af 100644 --- a/src/q_fireprof.cc +++ b/src/q_fireprof.cc @@ -359,7 +359,7 @@ void quest_fireproof_building(bool_ *paid, bool_ *recreate) } } -static bool_ fireproof_get_hook(void *, void *in_, void *) +static bool fireproof_get_hook(void *, void *in_, void *) { struct hook_get_in *in = static_cast(in_); object_type *o_ptr = in->o_ptr; @@ -376,17 +376,17 @@ static bool_ fireproof_get_hook(void *, void *in_, void *) cmsg_print(TERM_YELLOW, "Fine! Looks like you've found it."); } - return FALSE; + return false; } -static bool_ fireproof_stair_hook(void *, void *, void *) +static bool fireproof_stair_hook(void *, void *, void *) { /* only ask this if player about to go up stairs of quest and * hasn't retrieved item */ if ((p_ptr->inside_quest != QUEST_FIREPROOF) || (cquest.status == QUEST_STATUS_COMPLETED)) { - return FALSE; + return false; } else { @@ -394,7 +394,7 @@ static bool_ fireproof_stair_hook(void *, void *, void *) if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) { - return FALSE; + return false; } /* flush all pending input */ @@ -408,12 +408,12 @@ static bool_ fireproof_stair_hook(void *, void *, void *) { /* fail the quest */ cquest.status = QUEST_STATUS_FAILED; - return FALSE; + return false; } else { /* if no, they stay in the quest */ - return TRUE; + return true; } } } @@ -458,14 +458,14 @@ std::string quest_fireproof_describe() return w.str(); } -static bool_ fireproof_gen_hook(void *, void *, void *) +static bool fireproof_gen_hook(void *, void *, void *) { fireproof_settings const *settings = fireproof_get_settings(); /* Only if player doing this quest */ if (p_ptr->inside_quest != QUEST_FIREPROOF) { - return FALSE; + return false; } /* Go ahead */ @@ -497,11 +497,11 @@ static bool_ fireproof_gen_hook(void *, void *, void *) drop_near(&forge, -1, y, x); } - return TRUE; + return true; } } -bool_ quest_fireproof_init_hook() +void quest_fireproof_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && @@ -511,8 +511,4 @@ bool_ quest_fireproof_init_hook() add_hook_new(HOOK_GET , fireproof_get_hook , "fireproof_get_hook", NULL); add_hook_new(HOOK_STAIR , fireproof_stair_hook, "fireproof_stair_hook", NULL); } - - return FALSE; } - -#undef print_hook diff --git a/src/q_fireprof.hpp b/src/q_fireprof.hpp index 39b319e5..361d45ad 100644 --- a/src/q_fireprof.hpp +++ b/src/q_fireprof.hpp @@ -5,5 +5,5 @@ #include void quest_fireproof_building(bool_ *paid, bool_ *recreate); -bool_ quest_fireproof_init_hook(); +void quest_fireproof_init_hook(); std::string quest_fireproof_describe(); diff --git a/src/q_god.cc b/src/q_god.cc index 14052fe4..68296f36 100644 --- a/src/q_god.cc +++ b/src/q_god.cc @@ -901,13 +901,13 @@ static void quest_god_set_god_dungeon_attributes_mandos() d_info[DUNGEON_GOD].rules[0].mflags = RF_UNDEAD | RF_EVIL; } -static bool_ quest_god_level_end_gen_hook(void *, void *, void *) +static bool quest_god_level_end_gen_hook(void *, void *, void *) { /* Check for dungeon */ if ((dungeon_type != DUNGEON_GOD) || (cquest.status == QUEST_STATUS_UNTAKEN)) { - return FALSE; + return false; } /* if the relic has been created at this point, then it was @@ -955,17 +955,17 @@ static bool_ quest_god_level_end_gen_hook(void *, void *, void *) } } - return FALSE; + return false; } -static bool_ quest_god_player_level_hook(void *, void *in_, void *) +static bool quest_god_player_level_hook(void *, void *in_, void *) { struct hook_player_level_in *in = static_cast(in_); s32b gained = in->gained_levels; if (gained <= 0) { - return FALSE; + return false; } /* check player is worshipping a god, not already on a god quest. */ @@ -984,7 +984,7 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *) { cquest_dun_minplev = p_ptr->lev; } - return FALSE; + return false; } else { @@ -1017,10 +1017,10 @@ static bool_ quest_god_player_level_hook(void *, void *in_, void *) cquest_dun_maxdepth = cquest_dun_mindepth + 4; } - return FALSE; + return false; } -static bool_ quest_god_get_hook(void *, void *in_, void *) +static bool quest_god_get_hook(void *, void *in_, void *) { auto &s_info = game->s_info; @@ -1071,13 +1071,13 @@ static bool_ quest_god_get_hook(void *, void *in_, void *) /* Prevent further processing of 'take' action; we've destroyed the item. */ - return TRUE; + return true; } - return FALSE; + return false; } -static bool_ quest_god_char_dump_hook(void *, void *in_, void *) +static bool quest_god_char_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -1110,7 +1110,7 @@ static bool_ quest_god_char_dump_hook(void *, void *in_, void *) fprintf(f, "\n You found %s of the relic pieces%s.", relics_text, append_text); } - return FALSE; + return false; } static void set_god_dungeon_attributes() @@ -1181,26 +1181,26 @@ static void quest_god_dungeon_setup(int d_idx) set_god_dungeon_attributes(); } -static bool_ quest_god_enter_dungeon_hook(void *, void *in_, void *) +static bool quest_god_enter_dungeon_hook(void *, void *in_, void *) { struct hook_enter_dungeon_in *in = static_cast(in_); quest_god_dungeon_setup(in->d_idx); - return FALSE; + return false; } -static bool_ quest_god_gen_level_begin_hook(void *, void *, void *) +static bool quest_god_gen_level_begin_hook(void *, void *, void *) { quest_god_dungeon_setup(dungeon_type); - return FALSE; + return false; } -static bool_ quest_god_stair_hook(void *, void *, void *) +static bool quest_god_stair_hook(void *, void *, void *) { quest_god_dungeon_setup(dungeon_type); - return FALSE; + return false; } -static bool_ quest_god_birth_objects_hook(void *, void *, void *) +static bool quest_god_birth_objects_hook(void *, void *, void *) { cquest_quests_given = 0; cquest_relics_found = 0; @@ -1210,10 +1210,10 @@ static bool_ quest_god_birth_objects_hook(void *, void *, void *) cquest_relic_gen_tries = 0; cquest_relic_generated = FALSE; - return FALSE; + return false; } -bool_ quest_god_init_hook() +void quest_god_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && @@ -1231,6 +1231,4 @@ bool_ quest_god_init_hook() /* Need this to re-initialize at birth; the quest data is * zeroed which isn't quite right. */ add_hook_new(HOOK_BIRTH_OBJECTS, quest_god_birth_objects_hook, "q_god_birth_objects", NULL); - - return FALSE; } diff --git a/src/q_god.hpp b/src/q_god.hpp index 9feef832..839d4eaa 100644 --- a/src/q_god.hpp +++ b/src/q_god.hpp @@ -5,4 +5,4 @@ #include std::string quest_god_describe(); -bool_ quest_god_init_hook(); +void quest_god_init_hook(); diff --git a/src/q_haunted.cc b/src/q_haunted.cc index f3725830..f460ee80 100644 --- a/src/q_haunted.cc +++ b/src/q_haunted.cc @@ -19,7 +19,7 @@ #define cquest (quest[QUEST_HAUNTED]) -static bool_ quest_haunted_gen_hook(void *, void *, void *) +static bool quest_haunted_gen_hook(void *, void *, void *) { auto const &f_info = game->edit_data.f_info; @@ -27,7 +27,10 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_HAUNTED) return FALSE; + if (p_ptr->inside_quest != QUEST_HAUNTED) + { + return false; + } /* Just in case we didnt talk the the mayor */ if (cquest.status == QUEST_STATUS_UNTAKEN) @@ -87,14 +90,17 @@ static bool_ quest_haunted_gen_hook(void *, void *, void *) process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_haunted_death_hook(void *, void *, void *) +static bool quest_haunted_death_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_HAUNTED) return FALSE; + if (p_ptr->inside_quest != QUEST_HAUNTED) + { + return false; + } /* Process the monsters (backwards) */ for (i = m_max - 1; i >= 1; i--) @@ -103,9 +109,15 @@ static bool_ quest_haunted_death_hook(void *, void *, void *) monster_type *m_ptr = &m_list[i]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!m_ptr->r_idx) + { + continue; + } - if (m_ptr->status <= MSTATUS_ENEMY) mcnt++; + if (m_ptr->status <= MSTATUS_ENEMY) + { + mcnt++; + } } /* Nobody left ? */ @@ -118,17 +130,21 @@ static bool_ quest_haunted_death_hook(void *, void *, void *) process_hooks_restart = TRUE; cmsg_print(TERM_YELLOW, "Minas Anor is safer now."); - return (FALSE); + return false; } - return FALSE; + + return false; } -static bool_ quest_haunted_finish_hook(void *, void *in_, void *) +static bool quest_haunted_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_HAUNTED) return FALSE; + if (q_idx != QUEST_HAUNTED) + { + return false; + } c_put_str(TERM_YELLOW, "Thank you for saving us!", 8, 0); c_put_str(TERM_YELLOW, "You can use the building as your house as a reward.", 9, 0); @@ -136,10 +152,10 @@ static bool_ quest_haunted_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_BETWEEN; - return TRUE; + return true; } -bool_ quest_haunted_init_hook() +void quest_haunted_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -147,5 +163,4 @@ bool_ quest_haunted_init_hook() add_hook_new(HOOK_QUEST_FINISH, quest_haunted_finish_hook, "haunted_finish", NULL); add_hook_new(HOOK_GEN_QUEST, quest_haunted_gen_hook, "haunted_geb", NULL); } - return (FALSE); } diff --git a/src/q_haunted.hpp b/src/q_haunted.hpp index 9df36239..3965f0c3 100644 --- a/src/q_haunted.hpp +++ b/src/q_haunted.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_haunted_init_hook(); +void quest_haunted_init_hook(); diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc index 04cd3064..011269eb 100644 --- a/src/q_hobbit.cc +++ b/src/q_hobbit.cc @@ -25,13 +25,16 @@ GENERATE_MONSTER_LOOKUP_FN(get_melinda_proudfoot, "Melinda Proudfoot") GENERATE_MONSTER_LOOKUP_FN(get_merton_proudfoot, "Merton Proudfoot, the lost hobbit") -static bool_ quest_hobbit_town_gen_hook(void *, void *in_, void *) +static bool quest_hobbit_town_gen_hook(void *, void *in_, void *) { struct hook_wild_gen_in *in = static_cast(in_); int x = 1, y = 1, tries = 10000; bool_ small = in->small; - if ((turn < (cquest.data[1] + (DAY * 10L))) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE); + if ((turn < (cquest.data[1] + (DAY * 10L))) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) + { + return false; + } /* Find a good position */ while (tries) @@ -55,14 +58,17 @@ static bool_ quest_hobbit_town_gen_hook(void *, void *in_, void *) place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_ENEMY); m_allow_special[r_idx] = FALSE; - return FALSE; + return false; } -static bool_ quest_hobbit_gen_hook(void *, void *, void *) +static bool quest_hobbit_gen_hook(void *, void *, void *) { int x = 1, y = 1, tries = 10000; - if ((cquest.status != QUEST_STATUS_TAKEN) || (dun_level != cquest.data[0]) || (dungeon_type != DUNGEON_MAZE)) return FALSE; + if ((cquest.status != QUEST_STATUS_TAKEN) || (dun_level != cquest.data[0]) || (dungeon_type != DUNGEON_MAZE)) + { + return false; + } /* Find a good position */ while (tries) @@ -84,10 +90,10 @@ static bool_ quest_hobbit_gen_hook(void *, void *, void *) place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_FRIEND); m_allow_special[r_idx] = FALSE; - return FALSE; + return false; } -static bool_ quest_hobbit_give_hook(void *, void *in_, void *) +static bool quest_hobbit_give_hook(void *, void *in_, void *) { struct hook_give_in *in = static_cast(in_); object_type *o_ptr; @@ -98,9 +104,9 @@ static bool_ quest_hobbit_give_hook(void *, void *in_, void *) o_ptr = &p_ptr->inventory[item]; m_ptr = &m_list[m_idx]; - if (m_ptr->r_idx != get_merton_proudfoot()) return (FALSE); + if (m_ptr->r_idx != get_merton_proudfoot()) return false; - if ((o_ptr->tval != TV_SCROLL) || (o_ptr->sval != SV_SCROLL_WORD_OF_RECALL)) return (FALSE); + if ((o_ptr->tval != TV_SCROLL) || (o_ptr->sval != SV_SCROLL_WORD_OF_RECALL)) return false; msg_print("'Oh, thank you, noble one!'"); msg_print("Merton Proudfoot reads the scroll and is recalled to the safety of his home."); @@ -114,27 +120,27 @@ static bool_ quest_hobbit_give_hook(void *, void *in_, void *) del_hook_new(HOOK_GIVE, quest_hobbit_give_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_hobbit_speak_hook(void *, void *in_, void *) +static bool quest_hobbit_speak_hook(void *, void *in_, void *) { struct hook_mon_speak_in *in = static_cast(in_); s32b m_idx = in->m_idx; if (m_list[m_idx].r_idx != get_melinda_proudfoot()) { - return (FALSE); + return false; } if (cquest.status < QUEST_STATUS_COMPLETED) { msg_format("%^s begs for your help.", in->m_name); } - return (TRUE); + return true; } -static bool_ quest_hobbit_chat_hook(void *, void *in_, void *) +static bool quest_hobbit_chat_hook(void *, void *in_, void *) { struct hook_chat_in *in = static_cast(in_); s32b m_idx = in->m_idx; @@ -142,7 +148,10 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *) m_ptr = &m_list[m_idx]; - if (m_ptr->r_idx != get_melinda_proudfoot()) return (FALSE); + if (m_ptr->r_idx != get_melinda_proudfoot()) + { + return false; + } if (cquest.status < QUEST_STATUS_COMPLETED) { @@ -176,17 +185,17 @@ static bool_ quest_hobbit_chat_hook(void *, void *in_, void *) process_hooks_restart = TRUE; delete_monster_idx(m_idx); - return TRUE; + return true; } else { msg_print("Thanks again."); } - return TRUE; + return true; } -static bool_ quest_hobbit_dump_hook(void *, void *in_, void *) +static bool quest_hobbit_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -195,10 +204,10 @@ static bool_ quest_hobbit_dump_hook(void *, void *in_, void *) { fprintf(f, "\n You saved a young hobbit from an horrible fate."); } - return (FALSE); + return false; } -bool_ quest_hobbit_init_hook() +void quest_hobbit_init_hook() { /* Get a level to place the hobbit */ if (!cquest.data[0]) @@ -226,5 +235,4 @@ bool_ quest_hobbit_init_hook() add_hook_new(HOOK_CHAT, quest_hobbit_chat_hook, "hobbit_chat", NULL); } add_hook_new(HOOK_CHAR_DUMP, quest_hobbit_dump_hook, "hobbit_dump", NULL); - return (FALSE); } diff --git a/src/q_hobbit.hpp b/src/q_hobbit.hpp index 283ba0dd..c3482fd9 100644 --- a/src/q_hobbit.hpp +++ b/src/q_hobbit.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_hobbit_init_hook(); +void quest_hobbit_init_hook(); diff --git a/src/q_invas.cc b/src/q_invas.cc index f1cf43da..60ca0b65 100644 --- a/src/q_invas.cc +++ b/src/q_invas.cc @@ -19,13 +19,16 @@ #define cquest (quest[QUEST_INVASION]) -static bool_ quest_invasion_gen_hook(void *, void *, void *) +static bool quest_invasion_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_INVASION) return FALSE; + if (p_ptr->inside_quest != QUEST_INVASION) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -47,6 +50,7 @@ static bool_ quest_invasion_gen_hook(void *, void *, void *) process_dungeon_file("maeglin.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); for (x = 3; x < xstart; x++) + { for (y = 3; y < ystart; y++) { if (cave[y][x].feat == FEAT_MARKER) @@ -58,18 +62,22 @@ static bool_ quest_invasion_gen_hook(void *, void *, void *) cave_set_feat(p_ptr->py, p_ptr->px, FEAT_LESS); } } + } - return TRUE; + return true; } -static bool_ quest_invasion_ai_hook(void *, void *in_, void *out_) +static bool quest_invasion_ai_hook(void *, void *in_, void *out_) { struct hook_monster_ai_in *in = static_cast(in_); struct hook_monster_ai_out *out = static_cast(out_); monster_type *m_ptr = in->m_ptr; s32b m_idx = in->m_idx; - if (p_ptr->inside_quest != QUEST_INVASION) return FALSE; + if (p_ptr->inside_quest != QUEST_INVASION) + { + return false; + } /* Ugly but thats better than a call to test_monster_name which is SLOW */ if (m_ptr->r_idx == 825) @@ -82,26 +90,26 @@ static bool_ quest_invasion_ai_hook(void *, void *in_, void *out_) cmsg_print(TERM_YELLOW, "Maeglin found the way to Gondolin! All hope is lost now!"); cquest.status = QUEST_STATUS_FAILED; town_info[2].destroyed = TRUE; - return (FALSE); + return false; } /* Attack or flee ?*/ if (distance(m_ptr->fy, m_ptr->fx, p_ptr->py, p_ptr->px) <= 2) { - return (FALSE); + return false; } else { out->y = cquest.data[0]; out->x = cquest.data[1]; - return (TRUE); + return true; } } - return (FALSE); + return false; } -static bool_ quest_invasion_turn_hook(void *, void *, void *) +static bool quest_invasion_turn_hook(void *, void *, void *) { if (cquest.status != QUEST_STATUS_UNTAKEN) return (FALSE); if (p_ptr->lev < 45) return (FALSE); @@ -124,10 +132,10 @@ static bool_ quest_invasion_turn_hook(void *, void *, void *) del_hook_new(HOOK_END_TURN, quest_invasion_turn_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } -static bool_ quest_invasion_dump_hook(void *, void *in_, void *) +static bool quest_invasion_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -140,16 +148,19 @@ static bool_ quest_invasion_dump_hook(void *, void *in_, void *) { fprintf(f, "\n You saved Gondolin from destruction."); } - return (FALSE); + return false; } -static bool_ quest_invasion_death_hook(void *, void *in_, void *) +static bool quest_invasion_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - if (p_ptr->inside_quest != QUEST_INVASION) return FALSE; + if (p_ptr->inside_quest != QUEST_INVASION) + { + return false; + } if (r_idx == test_monster_name("Maeglin, the Traitor of Gondolin")) { @@ -159,13 +170,13 @@ static bool_ quest_invasion_death_hook(void *, void *in_, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_invasion_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } - return FALSE; + return false; } -static bool_ quest_invasion_stair_hook(void *, void *in_, void *) +static bool quest_invasion_stair_hook(void *, void *in_, void *) { struct hook_stair_in *in = static_cast(in_); @@ -201,13 +212,13 @@ static bool_ quest_invasion_stair_hook(void *, void *in_, void *) } del_hook_new(HOOK_STAIR, quest_invasion_stair_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } - return TRUE; + return true; } -bool_ quest_invasion_init_hook() +void quest_invasion_init_hook() { add_hook_new(HOOK_END_TURN, quest_invasion_turn_hook, "invasion_turn", NULL); add_hook_new(HOOK_CHAR_DUMP, quest_invasion_dump_hook, "invasion_dump", NULL); @@ -218,5 +229,4 @@ bool_ quest_invasion_init_hook() add_hook_new(HOOK_MONSTER_DEATH, quest_invasion_death_hook, "invasion_death", NULL); add_hook_new(HOOK_STAIR, quest_invasion_stair_hook, "invasion_stair", NULL); } - return (FALSE); } diff --git a/src/q_invas.hpp b/src/q_invas.hpp index 9993ac2b..dc2d8780 100644 --- a/src/q_invas.hpp +++ b/src/q_invas.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_invasion_init_hook(); +void quest_invasion_init_hook(); diff --git a/src/q_library.cc b/src/q_library.cc index c9855591..e267e2b7 100644 --- a/src/q_library.cc +++ b/src/q_library.cc @@ -312,12 +312,12 @@ static void library_quest_fill_book() screen_load(); } -static bool_ quest_library_gen_hook(void *, void *, void *) +static bool quest_library_gen_hook(void *, void *, void *) { /* Only if player doing this quest */ if (p_ptr->inside_quest != QUEST_LIBRARY) { - return FALSE; + return false; } { @@ -352,46 +352,41 @@ static bool_ quest_library_gen_hook(void *, void *, void *) library_quest_place_nrandom( 10, 10, 37, 67, MONSTER_MITHRIL_GOLEM, 1); - return TRUE; + return true; } -static bool_ quest_library_stair_hook(void *, void *, void *) +static bool quest_library_stair_hook(void *, void *, void *) { - bool_ ret; - /* only ask this if player about to go up stairs of quest and hasn't won yet */ if ((p_ptr->inside_quest != QUEST_LIBRARY) || (cquest.status == QUEST_STATUS_COMPLETED)) { - return FALSE; + return false; } if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) { - return FALSE; + return false; } /* flush all pending input */ flush(); /* confirm */ - ret = get_check("Really abandon the quest?"); - - /* if yes, then */ - if (ret == TRUE) + if (get_check("Really abandon the quest?")) { /* fail the quest */ cquest.status = QUEST_STATUS_FAILED; - return FALSE; + return false; } else { /* if no, they stay in the quest */ - return TRUE; + return true; } } -static bool_ quest_library_monster_death_hook(void *, void *, void *) +static bool quest_library_monster_death_hook(void *, void *, void *) { int i, count = -1; @@ -399,7 +394,7 @@ static bool_ quest_library_monster_death_hook(void *, void *, void *) if ((p_ptr->inside_quest != QUEST_LIBRARY) || (cquest.status == QUEST_STATUS_COMPLETED)) { - return FALSE; + return false; } /* Count all the enemies left alive */ @@ -421,7 +416,7 @@ static bool_ quest_library_monster_death_hook(void *, void *, void *) } /* Normal processing */ - return FALSE; + return false; } void quest_library_building(bool_ *paid, bool_ *recreate) @@ -500,7 +495,7 @@ std::string quest_library_describe() return w.str(); } -bool_ quest_library_init_hook() +void quest_library_init_hook() { /* Only need hooks if the quest is unfinished. */ if ((cquest.status >= QUEST_STATUS_UNTAKEN) && @@ -516,8 +511,4 @@ bool_ quest_library_init_hook() { quest_library_finalize_book(); } - - return FALSE; } - -#undef print_hook diff --git a/src/q_library.hpp b/src/q_library.hpp index 467fac5e..266accc3 100644 --- a/src/q_library.hpp +++ b/src/q_library.hpp @@ -4,7 +4,7 @@ #include -bool_ quest_library_init_hook(); +void quest_library_init_hook(); std::string quest_library_describe(); void quest_library_building(bool_ *paid, bool_ *recreate); void initialize_bookable_spells(); diff --git a/src/q_main.cc b/src/q_main.cc index 159d0f7b..2d3473f1 100644 --- a/src/q_main.cc +++ b/src/q_main.cc @@ -29,7 +29,7 @@ static void quest_describe(int q_idx) } } -static bool_ quest_main_monsters_hook(void *, void *in_, void *) +static bool quest_main_monsters_hook(void *, void *in_, void *) { auto const &r_info = game->edit_data.r_info; @@ -40,18 +40,24 @@ static bool_ quest_main_monsters_hook(void *, void *in_, void *) if (r_idx == get_sauron()) { /* No Sauron until Necromancer dies */ - if (r_info[get_necromancer()].max_num) return TRUE; + if (r_info[get_necromancer()].max_num) + { + return true; + } } /* Morgoth */ else if (r_idx == get_morgoth()) { /* No Morgoth until Sauron dies */ - if (r_info[get_sauron()].max_num) return TRUE; + if (r_info[get_sauron()].max_num) + { + return true; + } } - return FALSE; + return false; } -static bool_ quest_morgoth_hook(void *, void *, void *) +static bool quest_morgoth_hook(void *, void *, void *) { auto const &r_info = game->edit_data.r_info; @@ -100,10 +106,10 @@ static bool_ quest_morgoth_hook(void *, void *, void *) *(quest[QUEST_MORGOTH].plot) = QUEST_ULTRA_EVIL; quest[*(quest[QUEST_MORGOTH].plot)].init(); } - return (FALSE); + return false; } -static bool_ quest_morgoth_dump_hook(void *, void *in_, void *) +static bool quest_morgoth_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -111,14 +117,18 @@ static bool_ quest_morgoth_dump_hook(void *, void *in_, void *) if (quest[QUEST_MORGOTH].status >= QUEST_STATUS_COMPLETED) { if (quest[QUEST_ONE].status == QUEST_STATUS_FINISHED) + { fprintf(f, "\n You saved Arda and became a famed hero."); + } else + { fprintf(f, "\n You became a new force of darkness and enslaved all free people."); + } } - return (FALSE); + return false; } -bool_ quest_morgoth_init_hook() +void quest_morgoth_init_hook() { if ((quest[QUEST_MORGOTH].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED)) { @@ -126,10 +136,9 @@ bool_ quest_morgoth_init_hook() } add_hook_new(HOOK_CHAR_DUMP, quest_morgoth_dump_hook, "morgoth_dump", NULL); add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL); - return (FALSE); } -static bool_ quest_sauron_hook(void *, void *, void *) +static bool quest_sauron_hook(void *, void *, void *) { auto const &r_info = game->edit_data.r_info; @@ -151,10 +160,11 @@ static bool_ quest_sauron_hook(void *, void *, void *) process_hooks_restart = TRUE; } - return (FALSE); + + return false; } -static bool_ quest_sauron_resurect_hook(void *, void *in_, void *) +static bool quest_sauron_resurrect_hook(void *, void *in_, void *) { auto &r_info = game->edit_data.r_info; @@ -173,21 +183,20 @@ static bool_ quest_sauron_resurect_hook(void *, void *in_, void *) msg_print("Sauron will not be permanently defeated until the One Ring is either destroyed or used..."); r_ptr->max_num = 1; } - return FALSE; + return false; } -bool_ quest_sauron_init_hook() +void quest_sauron_init_hook() { if ((quest[QUEST_SAURON].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_SAURON].status < QUEST_STATUS_FINISHED)) { add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_hook, "sauron_death", NULL); } add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL); - add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_resurect_hook, "sauron_resurect_death", NULL); - return (FALSE); + add_hook_new(HOOK_MONSTER_DEATH, quest_sauron_resurrect_hook, "sauron_resurect_death", NULL); } -static bool_ quest_necro_hook(void *, void *, void *) +static bool quest_necro_hook(void *, void *, void *) { auto const &r_info = game->edit_data.r_info; @@ -208,15 +217,15 @@ static bool_ quest_necro_hook(void *, void *, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_necro_hook); process_hooks_restart = TRUE; } - return (FALSE); + + return false; } -bool_ quest_necro_init_hook() +void quest_necro_init_hook() { if ((quest[QUEST_NECRO].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED)) { add_hook_new(HOOK_MONSTER_DEATH, quest_necro_hook, "necro_death", NULL); } add_hook_new(HOOK_NEW_MONSTER, quest_main_monsters_hook, "main_new_monster", NULL); - return (FALSE); } diff --git a/src/q_main.hpp b/src/q_main.hpp index f677586e..be33897b 100644 --- a/src/q_main.hpp +++ b/src/q_main.hpp @@ -2,6 +2,6 @@ #include "h-basic.h" -bool_ quest_necro_init_hook(); -bool_ quest_sauron_init_hook(); -bool_ quest_morgoth_init_hook(); +void quest_necro_init_hook(); +void quest_sauron_init_hook(); +void quest_morgoth_init_hook(); diff --git a/src/q_narsil.cc b/src/q_narsil.cc index 4f358451..8d3c2775 100644 --- a/src/q_narsil.cc +++ b/src/q_narsil.cc @@ -14,7 +14,7 @@ #define cquest (quest[QUEST_NARSIL]) -static bool_ quest_narsil_move_hook(void *, void *in_, void *) +static bool quest_narsil_move_hook(void *, void *in_, void *) { struct hook_move_in *in = static_cast(in_); s32b y = in->y; @@ -23,10 +23,16 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *) int i; object_type *o_ptr; - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } /* The castle of Aragorn */ - if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 14)) return FALSE; + if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 14)) + { + return false; + } /* Look out for Narsil */ for (i = 0; i < INVEN_TOTAL; i++) @@ -38,7 +44,10 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *) if (o_ptr->name1 == ART_NARSIL) break; } - if (i == INVEN_TOTAL) return FALSE; + if (i == INVEN_TOTAL) + { + return false; + } cmsg_print(TERM_YELLOW, "I heard that the broken sword had been found!"); cmsg_print(TERM_YELLOW, "I thought it was only a rumor... until now."); @@ -65,10 +74,10 @@ static bool_ quest_narsil_move_hook(void *, void *in_, void *) del_hook_new(HOOK_MOVE, quest_narsil_move_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_narsil_dump_hook(void *, void *in_, void *) +static bool quest_narsil_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -77,10 +86,10 @@ static bool_ quest_narsil_dump_hook(void *, void *in_, void *) { fprintf(f, "\n The sword that was broken is now reforged."); } - return (FALSE); + return false; } -static bool_ quest_narsil_identify_hook(void *, void *in_, void *) +static bool quest_narsil_identify_hook(void *, void *in_, void *) { struct hook_identify_in *in = static_cast(in_); @@ -104,10 +113,10 @@ static bool_ quest_narsil_identify_hook(void *, void *in_, void *) } } - return (FALSE); + return false; } -bool_ quest_narsil_init_hook() +void quest_narsil_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -118,5 +127,4 @@ bool_ quest_narsil_init_hook() add_hook_new(HOOK_IDENTIFY, quest_narsil_identify_hook, "narsil_id", NULL); } add_hook_new(HOOK_CHAR_DUMP, quest_narsil_dump_hook, "narsil_dump", NULL); - return (FALSE); } diff --git a/src/q_narsil.hpp b/src/q_narsil.hpp index 7dd6cd15..da0fa85d 100644 --- a/src/q_narsil.hpp +++ b/src/q_narsil.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_narsil_init_hook(); +void quest_narsil_init_hook(); diff --git a/src/q_nazgul.cc b/src/q_nazgul.cc index a59a8df3..99735eed 100644 --- a/src/q_nazgul.cc +++ b/src/q_nazgul.cc @@ -22,13 +22,16 @@ GENERATE_MONSTER_LOOKUP_FN(get_uvatha, "Uvatha the Horseman") -static bool_ quest_nazgul_gen_hook(void *, void *in_, void *) +static bool quest_nazgul_gen_hook(void *, void *in_, void *) { struct hook_wild_gen_in *in = static_cast(in_); int m_idx, x = 1, y = 1, tries = 10000; bool_ small = in->small; - if ((cquest.status != QUEST_STATUS_TAKEN) || (small) || (p_ptr->town_num != 1)) return (FALSE); + if ((cquest.status != QUEST_STATUS_TAKEN) || (small) || (p_ptr->town_num != 1)) + { + return false; + } /* Find a good position */ while (tries) @@ -54,16 +57,19 @@ static bool_ quest_nazgul_gen_hook(void *, void *in_, void *) if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; - return FALSE; + return false; } -static bool_ quest_nazgul_finish_hook(void *, void *in_, void *) +static bool quest_nazgul_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; object_type forge, *q_ptr; - if (q_idx != QUEST_NAZGUL) return FALSE; + if (q_idx != QUEST_NAZGUL) + { + return false; + } c_put_str(TERM_YELLOW, "I believe he will not come back! Thank you.", 8, 0); c_put_str(TERM_YELLOW, "Some time ago a ranger gave me this.", 9, 0); @@ -84,10 +90,10 @@ static bool_ quest_nazgul_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_nazgul_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_nazgul_dump_hook(void *, void *in_, void *) +static bool quest_nazgul_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -96,42 +102,53 @@ static bool_ quest_nazgul_dump_hook(void *, void *in_, void *) { fprintf(f, "\n You saved Bree from a dreadful Nazgul."); } - return (FALSE); + return false; } -static bool_ quest_nazgul_forbid_hook(void *, void *in_, void *) +static bool quest_nazgul_forbid_hook(void *, void *in_, void *) { struct hook_init_quest_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_NAZGUL) return (FALSE); + if (q_idx != QUEST_NAZGUL) + { + return false; + } if (p_ptr->lev < 30) { c_put_str(TERM_WHITE, "I fear you are not ready for the next quest, come back later.", 8, 0); - return (TRUE); + return true; } - return (FALSE); + + return false; } -static bool_ quest_nazgul_death_hook(void *, void *in_, void *) +static bool quest_nazgul_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE); - if (r_idx != get_uvatha()) return (FALSE); + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } + + if (r_idx != get_uvatha()) + { + return false; + } cquest.status = QUEST_STATUS_COMPLETED; del_hook_new(HOOK_MONSTER_DEATH, quest_nazgul_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } -bool_ quest_nazgul_init_hook() +void quest_nazgul_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -141,5 +158,4 @@ bool_ quest_nazgul_init_hook() } add_hook_new(HOOK_CHAR_DUMP, quest_nazgul_dump_hook, "nazgul_dump", NULL); add_hook_new(HOOK_INIT_QUEST, quest_nazgul_forbid_hook, "nazgul_forbid", NULL); - return (FALSE); } diff --git a/src/q_nazgul.hpp b/src/q_nazgul.hpp index 7efcd5a6..ad35e5b3 100644 --- a/src/q_nazgul.hpp +++ b/src/q_nazgul.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_nazgul_init_hook(); +void quest_nazgul_init_hook(); diff --git a/src/q_nirna.cc b/src/q_nirna.cc index 7609bd06..822d8b6c 100644 --- a/src/q_nirna.cc +++ b/src/q_nirna.cc @@ -13,13 +13,16 @@ #define cquest (quest[QUEST_NIRNAETH]) -static bool_ quest_nirnaeth_gen_hook(void *, void *, void *) +static bool quest_nirnaeth_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE; + if (p_ptr->inside_quest != QUEST_NIRNAETH) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -44,20 +47,25 @@ static bool_ quest_nirnaeth_gen_hook(void *, void *, void *) cquest.data[0] = 0; cquest.data[1] = 0; for (x = 2; x < xstart; x++) + { for (y = 2; y < ystart; y++) { if (cave[y][x].m_idx) cquest.data[0]++; } + } - return TRUE; + return true; } -static bool_ quest_nirnaeth_finish_hook(void *, void *in_, void *) +static bool quest_nirnaeth_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_NIRNAETH) return FALSE; + if (q_idx != QUEST_NIRNAETH) + { + return false; + } /* Killed at least 2/3 of them ? better reward ! */ if (cquest.data[1] >= (2 * cquest.data[0] / 3)) @@ -86,33 +94,39 @@ static bool_ quest_nirnaeth_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_nirnaeth_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_nirnaeth_death_hook(void *, void *, void *) +static bool quest_nirnaeth_death_hook(void *, void *, void *) { if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE; cquest.data[1]++; - return FALSE; + return false; } -static bool_ quest_nirnaeth_stair_hook(void *, void *, void *) +static bool quest_nirnaeth_stair_hook(void *, void *, void *) { - if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE; + if (p_ptr->inside_quest != QUEST_NIRNAETH) + { + return false; + } - if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) return (FALSE); + if (cave[p_ptr->py][p_ptr->px].feat != FEAT_LESS) + { + return false; + } cmsg_print(TERM_YELLOW, "You found a way out!"); cquest.status = QUEST_STATUS_COMPLETED; del_hook_new(HOOK_STAIR, quest_nirnaeth_stair_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } -bool_ quest_nirnaeth_init_hook() +void quest_nirnaeth_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -121,5 +135,4 @@ bool_ quest_nirnaeth_init_hook() add_hook_new(HOOK_STAIR, quest_nirnaeth_stair_hook, "nirnaeth_stair", NULL); add_hook_new(HOOK_QUEST_FINISH, quest_nirnaeth_finish_hook, "nirnaeth_finish", NULL); } - return (FALSE); } diff --git a/src/q_nirna.hpp b/src/q_nirna.hpp index 0076dcd2..1aaeae54 100644 --- a/src/q_nirna.hpp +++ b/src/q_nirna.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_nirnaeth_init_hook(); +void quest_nirnaeth_init_hook(); diff --git a/src/q_one.cc b/src/q_one.cc index 043e7d0e..8985b695 100644 --- a/src/q_one.cc +++ b/src/q_one.cc @@ -27,7 +27,7 @@ #define cquest (quest[QUEST_ONE]) -static bool_ quest_one_move_hook(void *, void *in_, void *) +static bool quest_one_move_hook(void *, void *in_, void *) { struct hook_move_in *in = static_cast(in_); s32b y = in->y; @@ -36,10 +36,16 @@ static bool_ quest_one_move_hook(void *, void *in_, void *) if (cquest.status == QUEST_STATUS_UNTAKEN) { - if (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED) return (FALSE); + if (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED) + { + return false; + } /* The mirror of Galadriel */ - if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) return (FALSE); + if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) + { + return false; + } cmsg_print(TERM_YELLOW, "You meet Galadriel; she seems worried."); cmsg_print(TERM_YELLOW, "'So it was Sauron that lurked in Dol Guldur...'"); @@ -85,22 +91,32 @@ static bool_ quest_one_move_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_TAKEN; cquest.init(); - return TRUE; + return true; } - return FALSE; + return false; } -static bool_ quest_one_drop_hook(void *, void *in_, void *) +static bool quest_one_drop_hook(void *, void *in_, void *) { struct hook_drop_in *in = static_cast(in_); s32b o_idx = in->o_idx; object_type *o_ptr = &p_ptr->inventory[o_idx]; - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } - if (o_ptr->name1 != ART_POWER) return FALSE; - if (cave[p_ptr->py][p_ptr->px].feat != FEAT_GREAT_FIRE) return FALSE; + if (o_ptr->name1 != ART_POWER) + { + return false; + } + + if (cave[p_ptr->py][p_ptr->px].feat != FEAT_GREAT_FIRE) + { + return false; + } cmsg_print(TERM_YELLOW, "You throw the One Ring into the #RGreat Fire#y; it is rapidly consumed"); cmsg_print(TERM_YELLOW, "by the searing flames."); @@ -117,32 +133,44 @@ static bool_ quest_one_drop_hook(void *, void *in_, void *) quest[*(quest[QUEST_ONE].plot)].status = QUEST_STATUS_TAKEN; quest[*(quest[QUEST_ONE].plot)].init(); - return TRUE; + return true; } -static bool_ quest_one_wield_hook(void *, void *in_, void *) +static bool quest_one_wield_hook(void *, void *in_, void *) { struct hook_wield_in *in = static_cast(in_); object_type *o_ptr = in->o_ptr; - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } - if (o_ptr->name1 != ART_POWER) return FALSE; + if (o_ptr->name1 != ART_POWER) + { + return false; + } - /* Flush input */ + // Make sure player is **really** warned flush(); + if (!get_check("You were warned not to wear it; are you sure?")) + { + return true; + } - if (!get_check("You were warned not to wear it; are you sure?")) return TRUE; - /* Flush input */ flush(); + if (!get_check("You were warned not to wear it; are you *REALLY* sure?")) + { + return true; + } - if (!get_check("You were warned not to wear it; are you *REALLY* sure?")) return TRUE; - - /* Flush input */ flush(); + if (!get_check("You were *WARNED* not to wear it; are you *R*E*A*L*L*Y* sure?")) + { + return true; + } - if (!get_check("You were *WARNED* not to wear it; are you *R*E*A*L*L*Y* sure?")) return TRUE; - + // Ok, that's enough warning cmsg_print(TERM_YELLOW, "As you put it on your finger you feel #Ddark powers #ysapping your soul."); cmsg_print(TERM_YELLOW, "The ring firmly binds to your finger!"); cmsg_print(TERM_YELLOW, "You feel you are drawn to the shadow world! Your material form weakens."); @@ -172,10 +200,10 @@ static bool_ quest_one_wield_hook(void *, void *in_, void *) /* Ok lets reset the lives counter */ p_ptr->lives = 0; - return FALSE; + return false; } -static bool_ quest_one_hp_hook(void *, void *in_, void *out_) +static bool quest_one_hp_hook(void *, void *in_, void *out_) { struct hook_calculate_hp_in *in = static_cast(in_); struct hook_calculate_hp_out *out = static_cast(out_); @@ -185,15 +213,18 @@ static bool_ quest_one_hp_hook(void *, void *in_, void *out_) s32b mhp = in->mhp; for (int i = 0; i < p_ptr->lives + 1; i++) + { mhp = (mhp * 2) / 3; + } out->mhp = mhp; - return (TRUE); + return true; } - return (FALSE); + + return false; } -static bool_ quest_one_die_hook(void *, void *, void *) +static bool quest_one_die_hook(void *, void *, void *) { if (cquest.status == QUEST_STATUS_FAILED_DONE) { @@ -201,7 +232,7 @@ static bool_ quest_one_die_hook(void *, void *, void *) { cmsg_print(TERM_YELLOW, "You feel the power of the One Ring sustaining your life,"); cmsg_print(TERM_YELLOW, "but it drags you even more into the shadow world."); - return (TRUE); + return true; } else { @@ -210,10 +241,10 @@ static bool_ quest_one_die_hook(void *, void *, void *) game->died_from = "being drawn to the shadow world"; } } - return (FALSE); + return false; } -static bool_ quest_one_identify_hook(void *, void *in_, void *) +static bool quest_one_identify_hook(void *, void *in_, void *) { struct hook_identify_in *in = static_cast(in_); object_type *o_ptr = in->o_ptr; @@ -228,46 +259,52 @@ static bool_ quest_one_identify_hook(void *, void *in_, void *) } } - return (FALSE); + return false; } -static bool_ quest_one_death_hook(void *, void *in_, void *) +static bool quest_one_death_hook(void *, void *in_, void *) { auto const &a_info = game->edit_data.a_info; struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - bool_ ok = FALSE; + bool ok = false; - if (a_info[ART_POWER].cur_num) return FALSE; + if (a_info[ART_POWER].cur_num) + { + return false; + } /* Paranoia */ - if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE); + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } if (magik(30) && (r_idx == test_monster_name("Sauron, the Sorcerer"))) { - ok = TRUE; + ok = true; } else if (magik(10) && (r_idx == test_monster_name("Ar-Pharazon the Golden"))) { - ok = TRUE; + ok = true; } else if (magik(10) && (r_idx == test_monster_name("Shelob, Spider of Darkness"))) { - ok = TRUE; + ok = true; } else if (magik(10) && (r_idx == test_monster_name("The Watcher in the Water"))) { - ok = TRUE; + ok = true; } else if (magik(10) && (r_idx == test_monster_name("Glaurung, Father of the Dragons"))) { - ok = TRUE; + ok = true; } else if (magik(10) && (r_idx == test_monster_name("Feagwath, the Undead Sorcerer"))) { - ok = TRUE; + ok = true; } if (ok) @@ -290,7 +327,10 @@ static bool_ quest_one_death_hook(void *, void *in_, void *) for (i = 0; i < INVEN_PACK; i++) { /* Skip non-objects */ - if (!p_ptr->inventory[i].k_idx) break; + if (!p_ptr->inventory[i].k_idx) + { + break; + } } /* Arg, no space ! */ if (i == INVEN_PACK) @@ -310,10 +350,10 @@ static bool_ quest_one_death_hook(void *, void *in_, void *) inven_carry(q_ptr, FALSE); } - return (FALSE); + return false; } -static bool_ quest_one_dump_hook(void *, void *in_, void *) +static bool quest_one_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -326,16 +366,22 @@ static bool_ quest_one_dump_hook(void *, void *in_, void *) { fprintf(f, "\n You fell under the evil influence of the One Ring and decided to wear it."); } - return (FALSE); + return false; } -static bool_ quest_one_gen_hook(void *, void *, void *) +static bool quest_one_gen_hook(void *, void *, void *) { s32b x, y, tries = 10000; /* Paranoia */ - if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE); - if ((dungeon_type != DUNGEON_ANGBAND) || (dun_level != 99)) return (FALSE); + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } + if ((dungeon_type != DUNGEON_ANGBAND) || (dun_level != 99)) + { + return false; + } /* Find a good position */ while (tries) @@ -357,10 +403,10 @@ static bool_ quest_one_gen_hook(void *, void *, void *) if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; } - return (FALSE); + return false; } -bool_ quest_one_init_hook() +void quest_one_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -377,5 +423,4 @@ bool_ quest_one_init_hook() add_hook_new(HOOK_CHAR_DUMP, quest_one_dump_hook, "one_dump", NULL); add_hook_new(HOOK_CALC_HP, quest_one_hp_hook, "one_hp", NULL); add_hook_new(HOOK_DIE, quest_one_die_hook, "one_die", NULL); - return (FALSE); } diff --git a/src/q_one.hpp b/src/q_one.hpp index 0ad4e851..13389968 100644 --- a/src/q_one.hpp +++ b/src/q_one.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_one_init_hook(); +void quest_one_init_hook(); diff --git a/src/q_poison.cc b/src/q_poison.cc index c1a637e9..a0d9e025 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -45,15 +45,27 @@ static bool_ create_molds_hook(int r_idx) else return FALSE; } -static bool_ quest_poison_gen_hook(void *, void *, void *) +static bool quest_poison_gen_hook(void *, void *, void *) { int cy = 1, cx = 1, x, y, tries = 10000, r_idx; bool_ (*old_get_mon_num_hook)(int r_idx); - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; - if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) return FALSE; - if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) return FALSE; - if (p_ptr->wild_mode) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } + if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) + { + return false; + } + if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) + { + return false; + } + if (p_ptr->wild_mode) + { + return false; + } /* Find a good position */ while (tries) @@ -63,7 +75,10 @@ static bool_ quest_poison_gen_hook(void *, void *, void *) cx = randint(cur_wid - 34) + 32; /* Is it a good spot ? */ - if (cave_empty_bold(cy, cx)) break; + if (cave_empty_bold(cy, cx)) + { + break; + } /* One less try */ tries--; @@ -82,15 +97,28 @@ static bool_ quest_poison_gen_hook(void *, void *, void *) /* Pick a monster, using the level calculation */ for (x = cx - 25; x <= cx + 25; x++) + { for (y = cy - 25; y <= cy + 25; y++) { - if (!in_bounds(y, x)) continue; + if (!in_bounds(y, x)) + { + continue; + } - if (distance(cy, cx, y, x) > 25) continue; + if (distance(cy, cx, y, x) > 25) + { + continue; + } - if (magik(80) && ((cave[y][x].feat == FEAT_DEEP_WATER) || (cave[y][x].feat == FEAT_SHAL_WATER))) cave_set_feat(y, x, FEAT_TAINTED_WATER); + if (magik(80) && ((cave[y][x].feat == FEAT_DEEP_WATER) || (cave[y][x].feat == FEAT_SHAL_WATER))) + { + cave_set_feat(y, x, FEAT_TAINTED_WATER); + } - if (distance(cy, cx, y, x) > 10) continue; + if (distance(cy, cx, y, x) > 10) + { + continue; + } if (magik(60)) { @@ -113,6 +141,7 @@ static bool_ quest_poison_gen_hook(void *, void *, void *) } } } + } /* Reset restriction */ get_mon_num_hook = old_get_mon_num_hook; @@ -120,16 +149,19 @@ static bool_ quest_poison_gen_hook(void *, void *, void *) /* Prepare allocation table */ get_mon_num_prep(); - return FALSE; + return false; } -static bool_ quest_poison_finish_hook(void *, void *in_, void *) +static bool quest_poison_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; object_type forge, *q_ptr; - if (q_idx != QUEST_POISON) return FALSE; + if (q_idx != QUEST_POISON) + { + return false; + } c_put_str(TERM_YELLOW, "The water is clean again! Thank you so much.", 8, 0); c_put_str(TERM_YELLOW, "The beautiful Mallorns are safe. Take this as a proof of our gratitude.", 9, 0); @@ -151,10 +183,10 @@ static bool_ quest_poison_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_poison_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_poison_dump_hook(void *, void *in_, void *) +static bool quest_poison_dump_hook(void *, void *in_, void *) { hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -163,16 +195,19 @@ static bool_ quest_poison_dump_hook(void *, void *in_, void *) { fprintf(f, "\n You saved the beautiful Mallorns of Lothlorien."); } - return (FALSE); + return false; } -static bool_ quest_poison_quest_hook(void *, void *in_, void *) +static bool quest_poison_quest_hook(void *, void *in_, void *) { struct hook_init_quest_in *in = static_cast(in_); s32b q_idx = in->q_idx; object_type forge, *q_ptr; - if (q_idx != QUEST_POISON) return FALSE; + if (q_idx != QUEST_POISON) + { + return false; + } q_ptr = &forge; object_prep(q_ptr, lookup_kind(TV_POTION2, SV_POTION2_CURE_WATER)); @@ -187,23 +222,41 @@ static bool_ quest_poison_quest_hook(void *, void *in_, void *) del_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook); process_hooks_restart = TRUE; - return FALSE; + return false; } -static bool_ quest_poison_drop_hook(void *, void *in_, void *) +static bool quest_poison_drop_hook(void *, void *in_, void *) { struct hook_drop_in *in = static_cast(in_); s32b mcnt = 0, i, x, y; s32b o_idx = in->o_idx; object_type *o_ptr = &p_ptr->inventory[o_idx]; - if (cquest.status != QUEST_STATUS_TAKEN) return FALSE; - if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) return FALSE; - if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) return FALSE; - if (p_ptr->wild_mode) return FALSE; + if (cquest.status != QUEST_STATUS_TAKEN) + { + return false; + } + if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) + { + return false; + } + if (p_ptr->wilderness_x != wild_locs[cquest.data[0]][1]) + { + return false; + } + if (p_ptr->wild_mode) + { + return false; + } - if (o_ptr->tval != TV_POTION2) return FALSE; - if (o_ptr->sval != SV_POTION2_CURE_WATER) return FALSE; + if (o_ptr->tval != TV_POTION2) + { + return false; + } + if (o_ptr->sval != SV_POTION2_CURE_WATER) + { + return false; + } for (i = m_max - 1; i >= 1; i--) { @@ -211,20 +264,34 @@ static bool_ quest_poison_drop_hook(void *, void *in_, void *) monster_type *m_ptr = &m_list[i]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!m_ptr->r_idx) + { + continue; + } - if (m_ptr->status <= MSTATUS_NEUTRAL) mcnt++; + if (m_ptr->status <= MSTATUS_NEUTRAL) + { + mcnt++; + } } if (mcnt < 10) { for (x = 1; x < cur_wid - 1; x++) + { for (y = 1; y < cur_hgt - 1; y++) { - if (!in_bounds(y, x)) continue; + if (!in_bounds(y, x)) + { + continue; + } - if (cave[y][x].feat == FEAT_TAINTED_WATER) cave_set_feat(y, x, FEAT_SHAL_WATER); + if (cave[y][x].feat == FEAT_TAINTED_WATER) + { + cave_set_feat(y, x, FEAT_SHAL_WATER); + } } + } cmsg_print(TERM_YELLOW, "Well done! The water seems to be clean now."); @@ -233,17 +300,17 @@ static bool_ quest_poison_drop_hook(void *, void *in_, void *) del_hook_new(HOOK_DROP, quest_poison_drop_hook); process_hooks_restart = TRUE; - return FALSE; + return false; } else { msg_print("There are too many monsters left to cure the water."); - return TRUE; + return true; } - return FALSE; + return false; } -bool_ quest_poison_init_hook() +void quest_poison_init_hook() { /* Get a place to place the poison */ if (!cquest.data[1]) @@ -264,5 +331,4 @@ bool_ quest_poison_init_hook() add_hook_new(HOOK_INIT_QUEST, quest_poison_quest_hook, "poison_iquest", NULL); } add_hook_new(HOOK_CHAR_DUMP, quest_poison_dump_hook, "poison_dump", NULL); - return (FALSE); } diff --git a/src/q_poison.hpp b/src/q_poison.hpp index 0c054e0c..6c4e771b 100644 --- a/src/q_poison.hpp +++ b/src/q_poison.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_poison_init_hook(); +void quest_poison_init_hook(); diff --git a/src/q_rand.cc b/src/q_rand.cc index 7f0b2503..177ba7a9 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -404,51 +404,60 @@ static void hero_death(s32b m_idx, s32b r_idx) } } -static bool_ quest_random_death_hook(void *, void *in_, void *) +static bool quest_random_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; int r_idx = m_list[m_idx].r_idx; - if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); - if (!random_quests[dun_level].type) return (FALSE); - if (random_quests[dun_level].done) return (FALSE); - if (p_ptr->inside_quest) return (FALSE); - if (random_quests[dun_level].r_idx != r_idx) return (FALSE); - - if (!(m_list[m_idx].mflag & MFLAG_QUEST)) return (FALSE); + if ((!(dungeon_flags & DF_PRINCIPAL)) || + ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) || + (!random_quests[dun_level].type) || + (random_quests[dun_level].done) || + (p_ptr->inside_quest) || + (random_quests[dun_level].r_idx != r_idx) || + (!(m_list[m_idx].mflag & MFLAG_QUEST))) + { + return false; + } /* Killed enough ?*/ quest[QUEST_RANDOM].data[0]++; if (quest[QUEST_RANDOM].data[0] == random_quests[dun_level].type) { if (is_randhero(dun_level)) + { hero_death(m_idx, r_idx); + } else + { princess_death(m_idx, r_idx); + } } - return (FALSE); + return false; } -static bool_ quest_random_turn_hook(void *, void *, void *) +static bool quest_random_turn_hook(void *, void *, void *) { quest[QUEST_RANDOM].data[0] = 0; quest[QUEST_RANDOM].data[1] = 0; - return (FALSE); + return false; } -static bool_ quest_random_feeling_hook(void *, void *, void *) +static bool quest_random_feeling_hook(void *, void *, void *) { auto const &r_info = game->edit_data.r_info; - if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); - if (!random_quests[dun_level].type) return (FALSE); - if (random_quests[dun_level].done) return (FALSE); - if (p_ptr->inside_quest) return (FALSE); - if (!dun_level) return (FALSE); + if ((!(dungeon_flags & DF_PRINCIPAL)) || + ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) || + (!random_quests[dun_level].type) || + (random_quests[dun_level].done) || + (p_ptr->inside_quest) || + (!dun_level)) + { + return false; + } if (is_randhero(dun_level)) { @@ -456,22 +465,25 @@ static bool_ quest_random_feeling_hook(void *, void *, void *) cmsg_format(TERM_YELLOW, "'Oh, please help me! A horrible %s stole my sword! I'm nothing without it.'", r_info[random_quests[dun_level].r_idx].name); } else + { cmsg_format(TERM_YELLOW, "You hear someone shouting: 'Leave me alone, stupid %s'", r_info[random_quests[dun_level].r_idx].name); - return (FALSE); + } + return false; } -static bool_ quest_random_gen_hero_hook(void *, void *, void *) +static bool quest_random_gen_hero_hook(void *, void *, void *) { - int i; - - if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); - if (!random_quests[dun_level].type) return (FALSE); - if (random_quests[dun_level].done) return (FALSE); - if (p_ptr->inside_quest) return (FALSE); - if (!is_randhero(dun_level)) return (FALSE); + if ((!(dungeon_flags & DF_PRINCIPAL)) || + ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) || + (!random_quests[dun_level].type) || + (random_quests[dun_level].done) || + (p_ptr->inside_quest) || + (!is_randhero(dun_level))) + { + return false; + } - i = random_quests[dun_level].type; + int i = random_quests[dun_level].type; m_allow_special[random_quests[dun_level].r_idx] = TRUE; while (i) @@ -488,10 +500,10 @@ static bool_ quest_random_gen_hero_hook(void *, void *, void *) } m_allow_special[random_quests[dun_level].r_idx] = FALSE; - return (FALSE); + return false; } -static bool_ quest_random_gen_hook(void *, void *in_, void *) +static bool quest_random_gen_hook(void *, void *in_, void *) { struct hook_build_room1_in *in = static_cast(in_); s32b bx0 = in->x; @@ -502,19 +514,25 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *) int y2, x2, yval, xval; int y1, x1, xsize, ysize; - if (!(dungeon_flags & DF_PRINCIPAL)) return (FALSE); - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE); - if (!random_quests[dun_level].type) return (FALSE); - if (random_quests[dun_level].done) return (FALSE); - if (p_ptr->inside_quest) return (FALSE); - if (quest[QUEST_RANDOM].data[1]) return (FALSE); - if (is_randhero(dun_level)) return (FALSE); + if ((!(dungeon_flags & DF_PRINCIPAL)) || + ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) || + (!random_quests[dun_level].type) || + (random_quests[dun_level].done) || + (p_ptr->inside_quest) || + (quest[QUEST_RANDOM].data[1]) || + (is_randhero(dun_level))) + { + return false; + } /* Pick a room size */ get_map_size(format("qrand%d.map", random_quests[dun_level].type), &ysize, &xsize); /* Try to allocate space for room. If fails, exit */ - if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE; + if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) + { + return false; + } /* Get corner values */ y1 = yval - ysize / 2; @@ -546,24 +564,23 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *) process_dungeon_file(format("qrand%d.map", random_quests[dun_level].type), &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); for (x = x1; x < xstart; x++) + { for (y = y1; y < ystart; y++) { cave[y][x].info |= CAVE_ICKY | CAVE_ROOM; if (cave[y][x].feat == FEAT_MARKER) { - monster_type *m_ptr; - int i; - m_allow_special[random_quests[dun_level].r_idx] = TRUE; - i = place_monster_one(y, x, random_quests[dun_level].r_idx, 0, FALSE, MSTATUS_ENEMY); + int i = place_monster_one(y, x, random_quests[dun_level].r_idx, 0, FALSE, MSTATUS_ENEMY); m_allow_special[random_quests[dun_level].r_idx] = FALSE; if (i) { - m_ptr = &m_list[i]; + auto m_ptr = &m_list[i]; m_ptr->mflag |= MFLAG_QUEST; } } } + } /* Dont try another one for this generation */ quest[QUEST_RANDOM].data[1] = 1; @@ -571,10 +588,10 @@ static bool_ quest_random_gen_hook(void *, void *in_, void *) /* Boost level feeling a bit - a la pits */ rating += 10; - return (TRUE); + return true; } -static bool_ quest_random_dump_hook(void *, void *in_, void *) +static bool quest_random_dump_hook(void *, void *in_, void *) { static const char *number[] = { "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" }; struct hook_chardump_in *in = static_cast(in_); @@ -617,7 +634,7 @@ static bool_ quest_random_dump_hook(void *, void *in_, void *) fprintf(f, "\n You haven't completed a single lost sword quest."); } - return (FALSE); + return false; } std::string quest_random_describe() @@ -626,12 +643,15 @@ std::string quest_random_describe() // Only emit description if we're actually on a // random quest level. - if (!(dungeon_flags & DF_PRINCIPAL)) return ""; - if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return ""; - if (!random_quests[dun_level].type) return ""; - if (random_quests[dun_level].done) return ""; - if (p_ptr->inside_quest) return ""; - if (!dun_level) return ""; + if ((!(dungeon_flags & DF_PRINCIPAL)) || + ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) || + (!random_quests[dun_level].type) || + (random_quests[dun_level].done) || + (p_ptr->inside_quest) || + (!dun_level)) + { + return ""; + } fmt::MemoryWriter w; @@ -655,7 +675,7 @@ std::string quest_random_describe() return w.str(); } -bool_ quest_random_init_hook() +void quest_random_init_hook() { add_hook_new(HOOK_MONSTER_DEATH, quest_random_death_hook, "rand_death", NULL); add_hook_new(HOOK_NEW_LEVEL, quest_random_turn_hook, "rand_new_lvl", NULL); @@ -664,5 +684,4 @@ bool_ quest_random_init_hook() add_hook_new(HOOK_BUILD_ROOM1, quest_random_gen_hook, "rand_gen", NULL); add_hook_new(HOOK_FEELING, quest_random_feeling_hook, "rand_feel", NULL); add_hook_new(HOOK_CHAR_DUMP, quest_random_dump_hook, "rand_dump", NULL); - return (FALSE); } diff --git a/src/q_rand.hpp b/src/q_rand.hpp index 02961c8c..a992aa98 100644 --- a/src/q_rand.hpp +++ b/src/q_rand.hpp @@ -6,5 +6,5 @@ void initialize_random_quests(int n); bool_ is_randhero(int level); -bool_ quest_random_init_hook(); +void quest_random_init_hook(); std::string quest_random_describe(); diff --git a/src/q_shroom.cc b/src/q_shroom.cc index 8834e0f7..f14c7faf 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -23,15 +23,15 @@ #define cquest (quest[QUEST_SHROOM]) -static bool_ quest_shroom_speak_hook(void *, void *, void *); -static bool_ quest_shroom_chat_hook(void *, void *, void *); +static bool quest_shroom_speak_hook(void *, void *, void *); +static bool quest_shroom_chat_hook(void *, void *, void *); GENERATE_MONSTER_LOOKUP_FN(get_grip, "Grip, Farmer Maggot's dog") GENERATE_MONSTER_LOOKUP_FN(get_wolf, "Wolf, Farmer Maggot's dog") GENERATE_MONSTER_LOOKUP_FN(get_fang, "Fang, Farmer Maggot's dog") GENERATE_MONSTER_LOOKUP_FN(get_farmer_maggot, "Farmer Maggot") -static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *) +static bool quest_shroom_town_gen_hook(void *, void *in_, void *) { struct hook_wild_gen_in *in = static_cast(in_); int m_idx, x = 1, y = 1, tries = 10000; @@ -42,8 +42,12 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *) { /* Create the field */ for (x = (cur_wid / 2) - 7; x <= (cur_wid / 2) + 7; x++) + { for (y = (cur_hgt / 2) - 5; y <= (cur_hgt / 2) + 5; y++) + { cave_set_feat(y, x, 181); + } + } /* Throw in some 'shrooms */ for (x = 0; x < (cquest.data[1] - cquest.data[0]); x++) @@ -83,7 +87,10 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *) } /* Generate maggot in town, in daylight */ - if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE); + if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) + { + return false; + } /* Find a good position */ while (tries) @@ -95,7 +102,10 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *) /* Is it a good spot ? */ /* Not in player los, and avoid shop grids */ if (!los(p_ptr->py, p_ptr->px, y, x) && cave_empty_bold(y, x) && - cave_plain_floor_bold(y, x)) break; + cave_plain_floor_bold(y, x)) + { + break; + } /* One less try */ tries--; @@ -106,16 +116,19 @@ static bool_ quest_shroom_town_gen_hook(void *, void *in_, void *) place_monster_one(y, x, get_farmer_maggot(), 0, FALSE, MSTATUS_ENEMY); m_allow_special[get_farmer_maggot()] = FALSE; - return FALSE; + return false; } -static bool_ quest_shroom_death_hook(void *, void *in_, void *) +static bool quest_shroom_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - if (cquest.status > QUEST_STATUS_COMPLETED) return FALSE; + if (cquest.status > QUEST_STATUS_COMPLETED) + { + return false; + } if ((r_idx == get_wolf()) || (r_idx == get_grip()) || @@ -124,10 +137,10 @@ static bool_ quest_shroom_death_hook(void *, void *in_, void *) msg_print("The dog yells a last time and drops dead on the grass."); } - return FALSE; + return false; } -static bool_ quest_shroom_give_hook(void *, void *in_, void *) +static bool quest_shroom_give_hook(void *, void *in_, void *) { auto const &r_info = game->edit_data.r_info; @@ -141,7 +154,10 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) o_ptr = &p_ptr->inventory[item]; m_ptr = &m_list[m_idx]; - if (m_ptr->r_idx != get_farmer_maggot()) return (FALSE); + if (m_ptr->r_idx != get_farmer_maggot()) + { + return false; + } /* If one is dead .. its bad */ if ((r_info[get_grip()].max_num == 0) || @@ -157,10 +173,13 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) del_hook_new(HOOK_CHAT, quest_shroom_speak_hook); del_hook_new(HOOK_WILD_GEN, quest_shroom_town_gen_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } - if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1)) return (FALSE); + if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1)) + { + return false; + } /* Take a mushroom */ inc_stack_size_ex(item, -1, OPTIMIZE, NO_DESCRIBE); @@ -184,9 +203,13 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) q_ptr->discount = 100; q_ptr->ident |= IDENT_STOREB; if (inven_carry_okay(q_ptr)) + { inven_carry(q_ptr, FALSE); + } else + { drop_near(q_ptr, 0, p_ptr->py, p_ptr->px); + } /* The sling of farmer maggot */ q_ptr = &forge; @@ -209,9 +232,11 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *) process_hooks_restart = TRUE; } else + { msg_format("Oh thank you, but you still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]); + } - return TRUE; + return true; } static void check_dogs_alive(s32b m_idx) @@ -239,12 +264,15 @@ static void check_dogs_alive(s32b m_idx) } } -static bool_ quest_shroom_speak_hook(void *, void *in_, void *) +static bool quest_shroom_speak_hook(void *, void *in_, void *) { struct hook_mon_speak_in *in = static_cast(in_); s32b m_idx = in->m_idx; - if (m_list[m_idx].r_idx != get_farmer_maggot()) return (FALSE); + if (m_list[m_idx].r_idx != get_farmer_maggot()) + { + return false; + } if (cquest.status == QUEST_STATUS_UNTAKEN) { @@ -255,16 +283,20 @@ static bool_ quest_shroom_speak_hook(void *, void *in_, void *) { check_dogs_alive(m_idx); } - return (TRUE); + + return true; } -static bool_ quest_shroom_chat_hook(void *, void *in_, void *) +static bool quest_shroom_chat_hook(void *, void *in_, void *) { struct hook_chat_in *in = static_cast(in_); s32b m_idx = in->m_idx; monster_type *m_ptr = &m_list[m_idx]; - if (m_ptr->r_idx != get_farmer_maggot()) return (FALSE); + if (m_ptr->r_idx != get_farmer_maggot()) + { + return false; + } if (cquest.status == QUEST_STATUS_UNTAKEN) { @@ -282,10 +314,10 @@ static bool_ quest_shroom_chat_hook(void *, void *in_, void *) check_dogs_alive(m_idx); } - return TRUE; + return true; } -bool_ quest_shroom_init_hook() +void quest_shroom_init_hook() { /* Get a number of 'shrooms */ if (!cquest.data[1]) @@ -312,5 +344,4 @@ bool_ quest_shroom_init_hook() add_hook_new(HOOK_WILD_GEN, quest_shroom_town_gen_hook, "shroom_town_gen", NULL); add_hook_new(HOOK_CHAT, quest_shroom_chat_hook, "shroom_chat", NULL); } - return (FALSE); } diff --git a/src/q_shroom.hpp b/src/q_shroom.hpp index f729e29e..4478aee2 100644 --- a/src/q_shroom.hpp +++ b/src/q_shroom.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_shroom_init_hook(); +void quest_shroom_init_hook(); diff --git a/src/q_spider.cc b/src/q_spider.cc index a39c60d5..a5fa3486 100644 --- a/src/q_spider.cc +++ b/src/q_spider.cc @@ -16,13 +16,16 @@ #define cquest (quest[QUEST_SPIDER]) -static bool_ quest_spider_gen_hook(void *, void *, void *) +static bool quest_spider_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_SPIDER) return FALSE; + if (p_ptr->inside_quest != QUEST_SPIDER) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -43,14 +46,17 @@ static bool_ quest_spider_gen_hook(void *, void *, void *) init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("spiders.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); - return TRUE; + return true; } -static bool_ quest_spider_death_hook(void *, void *, void *) +static bool quest_spider_death_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_SPIDER) return FALSE; + if (p_ptr->inside_quest != QUEST_SPIDER) + { + return false; + } for (i = m_max - 1; i >= 1; i--) { @@ -58,9 +64,15 @@ static bool_ quest_spider_death_hook(void *, void *, void *) monster_type *m_ptr = &m_list[i]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!m_ptr->r_idx) + { + continue; + } - if (m_ptr->status <= MSTATUS_ENEMY) mcnt++; + if (m_ptr->status <= MSTATUS_ENEMY) + { + mcnt++; + } } if (mcnt <= 1) @@ -79,19 +91,22 @@ static bool_ quest_spider_death_hook(void *, void *, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_spider_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } - return (FALSE); + return false; } -static bool_ quest_spider_finish_hook(void *, void *in_, void *) +static bool quest_spider_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); object_type forge, *q_ptr; s32b q_idx = in->q_idx; - if (q_idx != QUEST_SPIDER) return FALSE; + if (q_idx != QUEST_SPIDER) + { + return false; + } c_put_str(TERM_YELLOW, "All of us praise your mighty deed in driving back the", 8, 0); c_put_str(TERM_YELLOW, "menace. Take this as a reward.", 9, 0); @@ -112,10 +127,10 @@ static bool_ quest_spider_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_spider_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -bool_ quest_spider_init_hook() +void quest_spider_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -123,5 +138,4 @@ bool_ quest_spider_init_hook() add_hook_new(HOOK_GEN_QUEST, quest_spider_gen_hook, "spider_gen", NULL); add_hook_new(HOOK_QUEST_FINISH, quest_spider_finish_hook, "spider_finish", NULL); } - return (FALSE); } diff --git a/src/q_spider.hpp b/src/q_spider.hpp index d76cccf1..bd16c06a 100644 --- a/src/q_spider.hpp +++ b/src/q_spider.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_spider_init_hook(); +void quest_spider_init_hook(); diff --git a/src/q_thief.cc b/src/q_thief.cc index e471aeab..a4505d2a 100644 --- a/src/q_thief.cc +++ b/src/q_thief.cc @@ -22,18 +22,23 @@ #define cquest (quest[QUEST_THIEVES]) -static bool_ quest_thieves_gen_hook(void *, void *, void *) +static bool quest_thieves_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; bool_ again = TRUE; - if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE; + if (p_ptr->inside_quest != QUEST_THIEVES) + { + return false; + } /* Just in case we didnt talk the the mayor */ if (cquest.status == QUEST_STATUS_UNTAKEN) + { cquest.status = QUEST_STATUS_TAKEN; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -65,9 +70,15 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *) { object_type *o_ptr = &p_ptr->inventory[x]; - if (!o_ptr->k_idx) continue; + if (!o_ptr->k_idx) + { + continue; + } - if ((x >= INVEN_WIELD) && cursed_p(o_ptr)) continue; + if ((x >= INVEN_WIELD) && cursed_p(o_ptr)) + { + continue; + } inven_drop(x, 99, 4, 24, TRUE); @@ -83,11 +94,14 @@ static bool_ quest_thieves_gen_hook(void *, void *, void *) return TRUE; } -static bool_ quest_thieves_hook(void *, void *, void *) +static bool quest_thieves_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE; + if (p_ptr->inside_quest != QUEST_THIEVES) + { + return false; + } /* ALARM !!! */ if ((cave[17][22].feat == FEAT_OPEN) || @@ -132,19 +146,22 @@ static bool_ quest_thieves_hook(void *, void *, void *) process_hooks_restart = TRUE; cmsg_print(TERM_YELLOW, "You stopped the thieves and saved Bree!"); - return (FALSE); + return false; } - return FALSE; + return false; } -static bool_ quest_thieves_finish_hook(void *, void *in_, void *) +static bool quest_thieves_finish_hook(void *, void *in_, void *) { auto const &s_info = game->s_info; struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_THIEVES) return FALSE; + if (q_idx != QUEST_THIEVES) + { + return false; + } c_put_str(TERM_YELLOW, "Thank you for killing the band of thieves!", 8, 0); c_put_str(TERM_YELLOW, "You can use the hideout as your house as a reward.", 9, 0); @@ -159,21 +176,28 @@ static bool_ quest_thieves_finish_hook(void *, void *in_, void *) else { if (s_info[SKILL_COMBAT].value > s_info[SKILL_MAGIC].value) + { *(quest[q_idx].plot) = QUEST_TROLL; + } else + { *(quest[q_idx].plot) = QUEST_WIGHT; + } } quest[*(quest[q_idx].plot)].init(); del_hook_new(HOOK_QUEST_FINISH, quest_thieves_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_thieves_feeling_hook(void *, void *, void *) +static bool quest_thieves_feeling_hook(void *, void *, void *) { - if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE; + if (p_ptr->inside_quest != QUEST_THIEVES) + { + return false; + } msg_print("You wake up in a prison cell."); msg_print("All your possessions have been stolen!"); @@ -181,10 +205,10 @@ static bool_ quest_thieves_feeling_hook(void *, void *, void *) del_hook_new(HOOK_FEELING, quest_thieves_feeling_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -bool_ quest_thieves_init_hook() +void quest_thieves_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -193,5 +217,4 @@ bool_ quest_thieves_init_hook() add_hook_new(HOOK_GEN_QUEST, quest_thieves_gen_hook, "thieves_geb", NULL); add_hook_new(HOOK_FEELING, quest_thieves_feeling_hook, "thieves_feel", NULL); } - return (FALSE); } diff --git a/src/q_thief.hpp b/src/q_thief.hpp index 1ff74fac..0e191db7 100644 --- a/src/q_thief.hpp +++ b/src/q_thief.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_thieves_init_hook(); +void quest_thieves_init_hook(); diff --git a/src/q_thrain.cc b/src/q_thrain.cc index 2ec46cda..025ff01f 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -30,33 +30,52 @@ GENERATE_MONSTER_LOOKUP_FN(get_thrain, "Thrain, the King Under the Mountain") GENERATE_MONSTER_LOOKUP_FN(get_dwar, "Dwar, Dog Lord of Waw") GENERATE_MONSTER_LOOKUP_FN(get_hoarmurath, "Hoarmurath of Dir") -static bool_ quest_thrain_death_hook(void *, void *in_, void *) +static bool quest_thrain_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; int r, x, y; monster_type *m_ptr; - if ((cquest.status >= QUEST_STATUS_FINISHED) || (dun_level !=cquest.data[0]) || (dungeon_type != DUNGEON_DOL_GULDUR)) return (FALSE); + if ((cquest.status >= QUEST_STATUS_FINISHED) || (dun_level !=cquest.data[0]) || (dungeon_type != DUNGEON_DOL_GULDUR)) + { + return false; + } + m_ptr = &m_list[m_idx]; - if ((m_ptr->r_idx != get_dwar()) && (m_ptr->r_idx != get_hoarmurath())) return (FALSE); + if ((m_ptr->r_idx != get_dwar()) && (m_ptr->r_idx != get_hoarmurath())) + { + return false; + } cquest.data[2]++; - if (cquest.data[2] < 2) return (FALSE); + if (cquest.data[2] < 2) + { + return false; + } cmsg_print(TERM_YELLOW, "The magic hiding the room dissipates."); for (x = 0; x < cur_wid; x++) + { for (y = 0; y < cur_hgt; y++) { cave_type *c_ptr = &cave[y][x]; - if (c_ptr->mimic != 61) continue; - if (!(c_ptr->info & CAVE_FREE)) continue; + if (c_ptr->mimic != 61) + { + continue; + } + + if (!(c_ptr->info & CAVE_FREE)) + { + continue; + } c_ptr->mimic = 0; lite_spot(y, x); } + } cquest.status = QUEST_STATUS_FINISHED; cmsg_print(TERM_YELLOW, "Thrain speaks:"); @@ -72,7 +91,10 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *) monster_type *m_ptr = &m_list[r]; /* Ignore "dead" monsters */ - if (!m_ptr->r_idx) continue; + if (!m_ptr->r_idx) + { + continue; + } /* Is it the princess? */ if (m_ptr->r_idx == get_thrain()) @@ -114,10 +136,10 @@ static bool_ quest_thrain_death_hook(void *, void *in_, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_thrain_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } -static bool_ quest_thrain_gen_hook(void *, void *in_, void *) +static bool quest_thrain_gen_hook(void *, void *in_, void *) { struct hook_build_room1_in *in = static_cast(in_); s32b bx0 = in->x; @@ -128,16 +150,16 @@ static bool_ quest_thrain_gen_hook(void *, void *in_, void *) int y2, x2, yval, xval; int y1, x1, xsize, ysize; - if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE); - if (cquest.data[0] != dun_level) return (FALSE); - if (cquest.data[1]) return (FALSE); - if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return (FALSE); + if (dungeon_type != DUNGEON_DOL_GULDUR) return false; + if (cquest.data[0] != dun_level) return false; + if (cquest.data[1]) return false; + if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return false; /* Pick a room size */ get_map_size("thrain.map", &ysize, &xsize); /* Try to allocate space for room. If fails, exit */ - if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE; + if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return false; /* Get corner values */ y1 = yval - ysize / 2; @@ -185,37 +207,38 @@ static bool_ quest_thrain_gen_hook(void *, void *in_, void *) /* Don't try another one for this generation */ cquest.data[1] = 1; - return (TRUE); + return true; } -static bool_ quest_thrain_feeling_hook(void *, void *, void *) +static bool quest_thrain_feeling_hook(void *, void *, void *) { - if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE); - if (cquest.data[0] != dun_level) return (FALSE); - if (cquest.status != QUEST_STATUS_UNTAKEN) return (FALSE); + if (dungeon_type != DUNGEON_DOL_GULDUR) return false; + if (cquest.data[0] != dun_level) return false; + if (cquest.status != QUEST_STATUS_UNTAKEN) return false; cmsg_format(TERM_YELLOW, "You hear someone shouting under the torture."); cquest.status = QUEST_STATUS_TAKEN; cquest.init(); - return (FALSE); + return false; } -static bool_ quest_thrain_move_hook(void *, void *in_, void *) +static bool quest_thrain_move_hook(void *, void *in_, void *) { struct hook_move_in *in = static_cast(in_); s32b y = in->y; s32b x = in->x; cave_type *c_ptr = &cave[y][x]; - if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE); - if (cquest.data[0] != dun_level) return (FALSE); - if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return (FALSE); - if (!(c_ptr->info & CAVE_FREE)) return (FALSE); - if (c_ptr->mimic != 61) return (FALSE); + if (dungeon_type != DUNGEON_DOL_GULDUR) return false; + if (cquest.data[0] != dun_level) return false; + if ((cquest.status < QUEST_STATUS_TAKEN) || (cquest.status >= QUEST_STATUS_FINISHED)) return false; + if (!(c_ptr->info & CAVE_FREE)) return false; + if (c_ptr->mimic != 61) return false; cmsg_print(TERM_YELLOW, "The magic hiding the room dissipates."); for (x = 0; x < cur_wid; x++) + { for (y = 0; y < cur_hgt; y++) { c_ptr = &cave[y][x]; @@ -226,18 +249,19 @@ static bool_ quest_thrain_move_hook(void *, void *in_, void *) c_ptr->mimic = 0; lite_spot(y, x); } + } - return (FALSE); + return false; } -static bool_ quest_thrain_turn_hook(void *, void *, void *) +static bool quest_thrain_turn_hook(void *, void *, void *) { cquest.data[1] = 0; cquest.data[2] = 0; - return (FALSE); + return false; } -bool_ quest_thrain_init_hook() +void quest_thrain_init_hook() { auto const &d_info = game->edit_data.d_info; @@ -261,5 +285,4 @@ bool_ quest_thrain_init_hook() add_hook_new(HOOK_FEELING, quest_thrain_feeling_hook, "thrain_feel", NULL); add_hook_new(HOOK_MONSTER_DEATH, quest_thrain_death_hook, "thrain_death", NULL); } - return (FALSE); } diff --git a/src/q_thrain.hpp b/src/q_thrain.hpp index 4e269357..aa42385d 100644 --- a/src/q_thrain.hpp +++ b/src/q_thrain.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_thrain_init_hook(); +void quest_thrain_init_hook(); diff --git a/src/q_troll.cc b/src/q_troll.cc index dfb5a867..54eb3406 100644 --- a/src/q_troll.cc +++ b/src/q_troll.cc @@ -26,7 +26,7 @@ GENERATE_MONSTER_LOOKUP_FN(get_tom, "Tom the Stone Troll") GENERATE_MONSTER_LOOKUP_FN(get_stone_troll, "Stone troll") GENERATE_MONSTER_LOOKUP_FN(get_forest_troll, "Forest troll") -static bool_ quest_troll_gen_hook(void *, void *, void *) +static bool quest_troll_gen_hook(void *, void *, void *) { auto &a_info = game->edit_data.a_info; @@ -34,7 +34,10 @@ static bool_ quest_troll_gen_hook(void *, void *, void *) int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_TROLL) return FALSE; + if (p_ptr->inside_quest != QUEST_TROLL) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -113,15 +116,18 @@ static bool_ quest_troll_gen_hook(void *, void *, void *) /* Reinitialize the ambush ... hehehe */ cquest.data[0] = FALSE; - return TRUE; + return true; } -static bool_ quest_troll_finish_hook(void *, void *in_, void *) +static bool quest_troll_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_TROLL) return FALSE; + if (q_idx != QUEST_TROLL) + { + return false; + } c_put_str(TERM_YELLOW, "I heard about your noble deeds.", 8, 0); c_put_str(TERM_YELLOW, "Keep what you found... may it serve you well.", 9, 0); @@ -133,17 +139,20 @@ static bool_ quest_troll_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_troll_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_troll_death_hook(void *, void *in_, void *) +static bool quest_troll_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; int x, y, xstart = 2, ystart = 2; - if (p_ptr->inside_quest != QUEST_TROLL) return FALSE; + if (p_ptr->inside_quest != QUEST_TROLL) + { + return false; + } if (r_idx == get_tom()) { @@ -154,19 +163,23 @@ static bool_ quest_troll_death_hook(void *, void *in_, void *) cquest.status = QUEST_STATUS_COMPLETED; del_hook_new(HOOK_MONSTER_DEATH, quest_troll_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } init_flags = INIT_GET_SIZE; process_dungeon_file("trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); - if (cquest.data[0]) return FALSE; + if (cquest.data[0]) + { + return false; + } cquest.data[0] = TRUE; msg_print("Oops, seems like an ambush..."); for (x = 3; x < xstart; x++) + { for (y = 3; y < ystart; y++) { cave_type *c_ptr = &cave[y][x]; @@ -181,11 +194,12 @@ static bool_ quest_troll_death_hook(void *, void *in_, void *) place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_ENEMY); } } + } - return FALSE; + return false; } -bool_ quest_troll_init_hook() +void quest_troll_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -193,5 +207,4 @@ bool_ quest_troll_init_hook() add_hook_new(HOOK_GEN_QUEST, quest_troll_gen_hook, "troll_gen", NULL); add_hook_new(HOOK_QUEST_FINISH, quest_troll_finish_hook, "troll_finish", NULL); } - return (FALSE); } diff --git a/src/q_troll.hpp b/src/q_troll.hpp index 4564ace2..08bba3dd 100644 --- a/src/q_troll.hpp +++ b/src/q_troll.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_troll_init_hook(); +void quest_troll_init_hook(); diff --git a/src/q_ultrae.cc b/src/q_ultrae.cc index de0d5f16..ff2a6a48 100644 --- a/src/q_ultrae.cc +++ b/src/q_ultrae.cc @@ -2,7 +2,7 @@ #define cquest (quest[QUEST_ULTRA_EVIL]) -bool_ quest_ultra_evil_init_hook() +void quest_ultra_evil_init_hook() { - return FALSE; + // Initialized by other hook. } diff --git a/src/q_ultrae.hpp b/src/q_ultrae.hpp index 42584387..77ec2e38 100644 --- a/src/q_ultrae.hpp +++ b/src/q_ultrae.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_ultra_evil_init_hook(); +void quest_ultra_evil_init_hook(); diff --git a/src/q_ultrag.cc b/src/q_ultrag.cc index 9e250146..e3da974f 100644 --- a/src/q_ultrag.cc +++ b/src/q_ultrag.cc @@ -20,7 +20,7 @@ #define cquest (quest[QUEST_ULTRA_GOOD]) -static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) +static bool quest_ultra_good_move_hook(void *, void *in_, void *) { struct hook_move_in *in = static_cast(in_); s32b y = in->y; @@ -29,10 +29,16 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) if (cquest.status == QUEST_STATUS_UNTAKEN) { - if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED) return (FALSE); + if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED) + { + return false; + } /* The mirror of Galadriel */ - if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) return (FALSE); + if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 23)) + { + return false; + } auto old_quick_messages = options->quick_messages; options->quick_messages = FALSE; @@ -85,33 +91,37 @@ static bool_ quest_ultra_good_move_hook(void *, void *in_, void *) options->quick_messages = old_quick_messages; - return TRUE; + return true; } - return FALSE; + return false; } -static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *) +static bool quest_ultra_good_stair_hook(void *, void *in_, void *) { struct hook_stair_in *in = static_cast(in_); stairs_direction dir = in->direction; if (dungeon_type != DUNGEON_VOID) - return FALSE; + { + return false; + } /* Cant leave */ if ((dir == STAIRS_UP) && (dun_level == 128)) { cmsg_print(TERM_YELLOW, "The portal to Arda is now closed."); - return TRUE; + return true; } + /* there is no coming back */ if ((dir == STAIRS_UP) && (dun_level == 150)) { cmsg_print(TERM_YELLOW, "The barrier seems to be impenetrable from this side."); cmsg_print(TERM_YELLOW, "You will have to move on."); - return TRUE; + return true; } + /* Cant enter without the flame imperishable */ if ((dir == STAIRS_DOWN) && (dun_level == 149)) { @@ -123,7 +133,10 @@ static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *) { object_type *o_ptr = get_object(i); - if (!o_ptr->k_idx) continue; + if (!o_ptr->k_idx) + { + continue; + } auto const flags = object_flags(o_ptr); @@ -148,19 +161,21 @@ static bool_ quest_ultra_good_stair_hook(void *, void *in_, void *) } } - return FALSE; + return false; } -static bool_ quest_ultra_good_recall_hook(void *, void *, void *) +static bool quest_ultra_good_recall_hook(void *, void *, void *) { if ((dungeon_type != DUNGEON_VOID) && (dungeon_type != DUNGEON_NETHER_REALM)) - return FALSE; + { + return false; + } cmsg_print(TERM_YELLOW, "You cannot recall. The portal to Arda is closed."); - return TRUE; + return true; } -static bool_ quest_ultra_good_death_hook(void *, void *in_, void *) +static bool quest_ultra_good_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; @@ -226,7 +241,10 @@ static bool_ quest_ultra_good_death_hook(void *, void *in_, void *) for (i = 0; i < INVEN_PACK; i++) { /* Skip non-objects */ - if (!p_ptr->inventory[i].k_idx) break; + if (!p_ptr->inventory[i].k_idx) + { + break; + } } /* Arg, no space ! */ if (i == INVEN_PACK) @@ -245,10 +263,11 @@ static bool_ quest_ultra_good_death_hook(void *, void *in_, void *) cmsg_format(TERM_VIOLET, "You feel the urge to pick up the Flame Imperishable."); inven_carry(q_ptr, FALSE); } - return (FALSE); + + return false; } -static bool_ quest_ultra_good_dump_hook(void *, void *in_, void *) +static bool quest_ultra_good_dump_hook(void *, void *in_, void *) { struct hook_chardump_in *in = static_cast(in_); FILE *f = in->file; @@ -271,11 +290,12 @@ static bool_ quest_ultra_good_dump_hook(void *, void *in_, void *) } } } - return (FALSE); + + return false; } -bool_ quest_ultra_good_init_hook() +void quest_ultra_good_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -288,5 +308,4 @@ bool_ quest_ultra_good_init_hook() add_hook_new(HOOK_MOVE, quest_ultra_good_move_hook, "ultrag_move", NULL); } add_hook_new(HOOK_CHAR_DUMP, quest_ultra_good_dump_hook, "ultrag_dump", NULL); - return (FALSE); } diff --git a/src/q_ultrag.hpp b/src/q_ultrag.hpp index 32c4a1ae..cef81fa5 100644 --- a/src/q_ultrag.hpp +++ b/src/q_ultrag.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_ultra_good_init_hook(); +void quest_ultra_good_init_hook(); diff --git a/src/q_wight.cc b/src/q_wight.cc index f635ed29..ced87277 100644 --- a/src/q_wight.cc +++ b/src/q_wight.cc @@ -22,13 +22,16 @@ GENERATE_MONSTER_LOOKUP_FN(get_wight_king, "The Wight-King of the Barrow-downs") -static bool_ quest_wight_gen_hook(void *, void *, void *) +static bool quest_wight_gen_hook(void *, void *, void *) { int x, y; int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_WIGHT) return FALSE; + if (p_ptr->inside_quest != QUEST_WIGHT) + { + return false; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -50,6 +53,7 @@ static bool_ quest_wight_gen_hook(void *, void *, void *) process_dungeon_file("wights.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); for (x = 3; x < xstart; x++) + { for (y = 3; y < ystart; y++) { if (cave[y][x].feat == FEAT_MARKER) @@ -123,17 +127,21 @@ static bool_ quest_wight_gen_hook(void *, void *, void *) } } } + } - return TRUE; + return true; } -static bool_ quest_wight_death_hook(void *, void *in_, void *) +static bool quest_wight_death_hook(void *, void *in_, void *) { struct hook_monster_death_in *in = static_cast(in_); s32b m_idx = in->m_idx; s32b r_idx = m_list[m_idx].r_idx; - if (p_ptr->inside_quest != QUEST_WIGHT) return FALSE; + if (p_ptr->inside_quest != QUEST_WIGHT) + { + return false; + } if (r_idx == get_wight_king()) { @@ -147,18 +155,21 @@ static bool_ quest_wight_death_hook(void *, void *in_, void *) del_hook_new(HOOK_MONSTER_DEATH, quest_wight_death_hook); process_hooks_restart = TRUE; - return (FALSE); + return false; } - return (FALSE); + return false; } -static bool_ quest_wight_finish_hook(void *, void *in_, void *) +static bool quest_wight_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_WIGHT) return FALSE; + if (q_idx != QUEST_WIGHT) + { + return false; + } c_put_str(TERM_YELLOW, "I heard about your noble deeds.", 8, 0); c_put_str(TERM_YELLOW, "Keep what you found .. may it serve you well.", 9, 0); @@ -170,10 +181,10 @@ static bool_ quest_wight_finish_hook(void *, void *in_, void *) del_hook_new(HOOK_QUEST_FINISH, quest_wight_finish_hook); process_hooks_restart = TRUE; - return TRUE; + return true; } -bool_ quest_wight_init_hook() +void quest_wight_init_hook() { if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -181,5 +192,4 @@ bool_ quest_wight_init_hook() add_hook_new(HOOK_GEN_QUEST, quest_wight_gen_hook, "wight_gen", NULL); add_hook_new(HOOK_QUEST_FINISH, quest_wight_finish_hook, "wight_finish", NULL); } - return (FALSE); } diff --git a/src/q_wight.hpp b/src/q_wight.hpp index d3c0a912..16713332 100644 --- a/src/q_wight.hpp +++ b/src/q_wight.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_wight_init_hook(); +void quest_wight_init_hook(); diff --git a/src/q_wolves.cc b/src/q_wolves.cc index 637003dc..0e811ce6 100644 --- a/src/q_wolves.cc +++ b/src/q_wolves.cc @@ -20,7 +20,7 @@ #define cquest (quest[QUEST_WOLVES]) -static bool_ quest_wolves_gen_hook(void *, void *, void *) +static bool quest_wolves_gen_hook(void *, void *, void *) { auto const &f_info = game->edit_data.f_info; @@ -28,11 +28,16 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) int xstart = 2; int ystart = 2; - if (p_ptr->inside_quest != QUEST_WOLVES) return FALSE; + if (p_ptr->inside_quest != QUEST_WOLVES) + { + return false; + } /* Just in case we didnt talk the the mayor */ if (cquest.status == QUEST_STATUS_UNTAKEN) + { cquest.status = QUEST_STATUS_TAKEN; + } /* Start with perm walls */ for (y = 0; y < cur_hgt; y++) @@ -85,14 +90,17 @@ static bool_ quest_wolves_gen_hook(void *, void *, void *) process_hooks_restart = TRUE; - return TRUE; + return true; } -static bool_ quest_wolves_death_hook(void *, void *, void *) +static bool quest_wolves_death_hook(void *, void *, void *) { int i, mcnt = 0; - if (p_ptr->inside_quest != QUEST_WOLVES) return FALSE; + if (p_ptr->inside_quest != QUEST_WOLVES) + { + return false; + } /* Process the monsters (backwards) */ for (i = m_max - 1; i >= 1; i--) @@ -116,17 +124,20 @@ static bool_ quest_wolves_death_hook(void *, void *, void *) process_hooks_restart = TRUE; cmsg_print(TERM_YELLOW, "Lothlorien is safer now."); - return (FALSE); + return false; } - return FALSE; + return false; } -static bool_ quest_wolves_finish_hook(void *, void *in_, void *) +static bool quest_wolves_finish_hook(void *, void *in_, void *) { struct hook_quest_finish_in *in = static_cast(in_); s32b q_idx = in->q_idx; - if (q_idx != QUEST_WOLVES) return FALSE; + if (q_idx != QUEST_WOLVES) + { + return false; + } c_put_str(TERM_YELLOW, "Thank you for killing the pack of wolves!", 8, 0); c_put_str(TERM_YELLOW, "You can use the hut as your house as a reward.", 9, 0); @@ -134,10 +145,10 @@ static bool_ quest_wolves_finish_hook(void *, void *in_, void *) /* Continue the plot */ *(quest[q_idx].plot) = QUEST_SPIDER; - return TRUE; + return true; } -bool_ quest_wolves_init_hook() +void quest_wolves_init_hook() { if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { @@ -145,5 +156,4 @@ bool_ quest_wolves_init_hook() add_hook_new(HOOK_QUEST_FINISH, quest_wolves_finish_hook, "wolves_finish", NULL); add_hook_new(HOOK_GEN_QUEST, quest_wolves_gen_hook, "wolves_geb", NULL); } - return (FALSE); } diff --git a/src/q_wolves.hpp b/src/q_wolves.hpp index 27d9b0f3..c5596fc6 100644 --- a/src/q_wolves.hpp +++ b/src/q_wolves.hpp @@ -2,4 +2,4 @@ #include "h-basic.h" -bool_ quest_wolves_init_hook(); +void quest_wolves_init_hook(); diff --git a/src/quest_type.hpp b/src/quest_type.hpp index 267ba4d2..ae97af35 100644 --- a/src/quest_type.hpp +++ b/src/quest_type.hpp @@ -21,7 +21,7 @@ struct quest_type s16b *plot; /* Which plot does it belongs to? */ - bool_ (*init)(); /* Function that takes care of generating hardcoded quests */ + void (*init)(); /* Function that takes care of generating hardcoded quests */ s32b data[9]; /* Various datas used by the quests */ -- cgit v1.2.3 From 2c8b8579faf729b9cf21b8b2d827f0e482570bd3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move random_artifacts to Game struct --- src/birth.cc | 40 ++++++++++++++++++---------------------- src/cmd6.cc | 2 +- src/game.hpp | 6 ++++++ src/loadsave.cc | 35 ++++++++++++----------------------- src/monster2.cc | 6 +++--- src/object1.cc | 3 +++ src/object2.cc | 25 +++++++++++++------------ src/q_rand.cc | 2 +- src/random_artifact.hpp | 6 ++++-- src/variable.cc | 2 -- src/variable.hpp | 2 -- src/wizard2.cc | 1 + 12 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 36f319d6..2f56ec28 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -56,6 +56,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include #include #include @@ -465,33 +466,28 @@ static void get_extra() */ static errr init_randart() { - int i; - - long cost; - - random_artifact* ra_ptr; - char buf[80]; - - for (i = 0; i < MAX_RANDARTS; i++) + for (int i = 0; i < MAX_RANDARTS; i++) { - ra_ptr = &random_artifacts[i]; - - strcpy(ra_ptr->name_short, - get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i)); - strcpy(ra_ptr->name_full, - get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i)); - - ra_ptr->attr = randint(15); - ra_ptr->activation = rand_int(MAX_T_ACT); - ra_ptr->generated = FALSE; - - cost = randnor(0, 250); + // Generate a 'cost' + auto cost = randnor(0, 250); + if (cost < 0) + { + cost = 0; + } - if (cost < 0) cost = 0; + // Generate the random artifact + random_artifact ra; + ra.name_short = get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i); + ra.name_full = get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i); + ra.attr = randint(15); + ra.activation = rand_int(MAX_T_ACT); + ra.generated = FALSE; + ra.cost = cost; - ra_ptr->cost = cost; + // Push + game->random_artifacts.push_back(ra); } return 0; diff --git a/src/cmd6.cc b/src/cmd6.cc index d609298d..e36f0cb6 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -4839,7 +4839,7 @@ void do_cmd_activate() { if (o_ptr->tval == TV_RANDART) { - lev = random_artifacts[o_ptr->sval].level; + lev = game->random_artifacts[o_ptr->sval].level; } else { diff --git a/src/game.hpp b/src/game.hpp index 20ca0f86..631e16b1 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -7,6 +7,7 @@ #include "grid.hpp" #include "h-basic.h" #include "player_defs.hpp" +#include "random_artifact.hpp" #include "skill_type.hpp" #include "wilderness_map.hpp" @@ -40,6 +41,11 @@ struct Game { */ grid wilderness; + /** + * Random artifacts + */ + std::vector random_artifacts; + /** * Player's un-adjusted HP at every level. * Stored to avoid shenanigans with draininging levels diff --git a/src/loadsave.cc b/src/loadsave.cc index 86c67956..ef554f19 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2266,31 +2266,20 @@ static bool do_wilderness(ls_flag_t flag) return true; } +static void do_randart(random_artifact *ra_ptr, ls_flag_t flag) +{ + do_std_string(ra_ptr->name_full, flag); + do_std_string(ra_ptr->name_short, flag); + do_byte(&ra_ptr->level, flag); + do_byte(&ra_ptr->attr, flag); + do_u32b(&ra_ptr->cost, flag); + do_byte(&ra_ptr->activation, flag); + do_byte(&ra_ptr->generated, flag); +} + static bool do_randarts(ls_flag_t flag) { - u16b n_randarts = MAX_RANDARTS; - - do_u16b(&n_randarts, flag); - - if ((flag == ls_flag_t::LOAD) && (n_randarts > MAX_RANDARTS)) - { - note("Too many random artifacts!"); - return false; - } - - for (std::size_t i = 0; i < n_randarts; i++) - { - random_artifact *ra_ptr = &random_artifacts[i]; - - do_string(ra_ptr->name_full, 80, flag); - do_string(ra_ptr->name_short, 80, flag); - do_byte(&ra_ptr->level, flag); - do_byte(&ra_ptr->attr, flag); - do_u32b(&ra_ptr->cost, flag); - do_byte(&ra_ptr->activation, flag); - do_byte(&ra_ptr->generated, flag); - } - + do_vector(flag, game->random_artifacts, do_randart); return true; } diff --git a/src/monster2.cc b/src/monster2.cc index ab60a9e3..8e866796 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -432,6 +432,7 @@ void delete_monster_idx(int i) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; /* Get location */ monster_type *m_ptr = &m_list[i]; @@ -1892,8 +1893,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; - - object_type *o_ptr; + auto &random_artifacts = game->random_artifacts; /* Get new object */ int o_idx = o_pop(); @@ -1901,7 +1901,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) if (o_idx) { /* Get the item */ - o_ptr = &o_list[o_idx]; + object_type *o_ptr = &o_list[o_idx]; /* Structure copy */ object_copy(o_ptr, q_ptr); diff --git a/src/object1.cc b/src/object1.cc index d10f3042..34c22a4a 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1022,6 +1022,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; auto const &e_info = game->edit_data.e_info; + auto const &random_artifacts = game->random_artifacts; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -6125,6 +6126,7 @@ static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) byte object_attr(object_type const *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &random_artifacts = game->random_artifacts; if (o_ptr->tval == TV_RANDART) { @@ -6143,6 +6145,7 @@ byte object_attr(object_type const *o_ptr) byte object_attr_default(object_type *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &random_artifacts = game->random_artifacts; if (o_ptr->tval == TV_RANDART) { diff --git a/src/object2.cc b/src/object2.cc index a9f0f7ce..32ab6de1 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -400,7 +400,7 @@ void wipe_o_list() /* Mega-Hack -- Preserve the artifact */ if (o_ptr->tval == TV_RANDART) { - random_artifacts[o_ptr->sval].generated = FALSE; + game->random_artifacts[o_ptr->sval].generated = FALSE; } else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { @@ -1098,7 +1098,7 @@ s32b object_value_real(object_type const *o_ptr) if (o_ptr->tval == TV_RANDART) { - return random_artifacts[o_ptr->sval].cost; + return game->random_artifacts[o_ptr->sval].cost; } /* Hack -- "worthless" items */ @@ -1998,20 +1998,21 @@ s16b m_bonus(int max, int level) */ static void finalize_randart(object_type* o_ptr, int lev) { - int r; - int i = 0; - bool_ flag = TRUE; + auto &random_artifacts = game->random_artifacts; /* Paranoia */ - if (o_ptr->tval != TV_RANDART) return; + if (o_ptr->tval != TV_RANDART) + { + return; + } - while (flag) + for (int i = 0; ; i++) { - r = rand_int(MAX_RANDARTS); + auto const r = rand_int(MAX_RANDARTS); if (!(random_artifacts[r].generated) || i > 2000) { - random_artifact* ra_ptr = &random_artifacts[r]; + auto ra_ptr = &random_artifacts[r]; o_ptr->sval = r; o_ptr->pval2 = ra_ptr->activation; @@ -2019,10 +2020,8 @@ static void finalize_randart(object_type* o_ptr, int lev) ra_ptr->level = lev; ra_ptr->generated = TRUE; - flag = FALSE; + return; } - - i++; } } @@ -4751,6 +4750,7 @@ void place_object(int y, int x, bool_ good, bool_ great, int where) auto const &d_info = game->edit_data.d_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; s16b o_idx; @@ -4987,6 +4987,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) auto const &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; int i, k, d, s; diff --git a/src/q_rand.cc b/src/q_rand.cc index 177ba7a9..e3860dd2 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -270,7 +270,7 @@ static void do_get_new_obj(int y, int x) /* Mega-Hack -- Preserve the artifact */ if (o_ptr->tval == TV_RANDART) { - random_artifacts[o_ptr->sval].generated = FALSE; + game->random_artifacts[o_ptr->sval].generated = FALSE; } else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { diff --git a/src/random_artifact.hpp b/src/random_artifact.hpp index a3fc1c66..618f1102 100644 --- a/src/random_artifact.hpp +++ b/src/random_artifact.hpp @@ -2,13 +2,15 @@ #include "h-basic.h" +#include + /** * Random artifact descriptor. */ struct random_artifact { - char name_full[80]; /* Full name for the artifact */ - char name_short[80]; /* Un-Id'd name */ + std::string name_full; /* Full name for the artifact */ + std::string name_short; /* Un-Id'd name */ byte level; /* Level of the artifact */ byte attr; /* Color that is used on the screen */ u32b cost; /* Object's value */ diff --git a/src/variable.cc b/src/variable.cc index 3b81a51a..7aae4187 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -558,8 +558,6 @@ bool_ carried_monster_hit = FALSE; /* * Random artifacts. */ -random_artifact random_artifacts[MAX_RANDARTS]; -/* These three used to be constants but now are set by modules */ s32b RANDART_WEAPON; s32b RANDART_ARMOR; s32b RANDART_JEWEL; diff --git a/src/variable.hpp b/src/variable.hpp index 38db36b4..3cb54d3a 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -17,7 +17,6 @@ #include "player_race_mod_fwd.hpp" #include "player_spec_fwd.hpp" #include "player_type_fwd.hpp" -#include "random_artifact.hpp" #include "random_quest.hpp" #include "school_type.hpp" #include "skill_modifiers_fwd.hpp" @@ -161,7 +160,6 @@ extern bool_ ambush_flag; extern bool_ fate_flag; extern s16b no_breeds; extern bool_ carried_monster_hit; -extern random_artifact random_artifacts[MAX_RANDARTS]; extern s32b RANDART_WEAPON; extern s32b RANDART_ARMOR; extern s32b RANDART_JEWEL; diff --git a/src/wizard2.cc b/src/wizard2.cc index cf7c699d..890c6fbe 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -825,6 +825,7 @@ static void wiz_reroll_item(object_type *o_ptr) static void wiz_statistics(object_type *o_ptr) { auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; long i, matches, better, worse, other; -- cgit v1.2.3 From 87a6c654d3f83837319f7459c07bd2c31d70fa63 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unnecessary save file fields --- src/loadsave.cc | 41 ++--------------------------------------- 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index ef554f19..dacd0e15 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -44,20 +44,6 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ -/* - * Savefile version - */ -static byte sf_major; -static byte sf_minor; -static byte sf_patch; - -/* - * Savefile information - */ -static u32b sf_when; /* Time when savefile created */ -static u16b sf_lives; /* Number of past "lives" with this file */ -static u16b sf_saves; /* Number of "saves" during this life */ - /** * Load/save flag */ @@ -2401,11 +2387,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) return FALSE; } } - if (flag == ls_flag_t::SAVE) - { - sf_when = time((time_t *) 0); /* Note when file was saved */ - sf_saves++; /* Increment the saves ctr */ - } /* Handle version bytes */ if (flag == ls_flag_t::LOAD) @@ -2421,15 +2402,6 @@ static bool_ do_savefile_aux(ls_flag_t flag) do_u32b(&saver, flag); } - /* Time of last save */ - do_u32b(&sf_when, flag); - - /* Number of past lives */ - do_u16b(&sf_lives, flag); - - /* Number of times saved */ - do_u16b(&sf_saves, flag); - /* Game module */ if (flag == ls_flag_t::SAVE) { @@ -2668,12 +2640,6 @@ bool_ load_player() /* Process file */ if (!err) { - - /* Extract version */ - sf_major = VERSION_MAJOR; - sf_minor = VERSION_MINOR; - sf_patch = VERSION_PATCH; - /* Clear screen */ Term_clear(); @@ -2714,9 +2680,6 @@ bool_ load_player() return (TRUE); } - /* Count lives */ - sf_lives++; - /* Forget turns */ turn = old_turn = 0; @@ -2740,8 +2703,8 @@ bool_ load_player() /* Message */ - msg_format("Error (%s) reading %d.%d.%d savefile.", - what, sf_major, sf_minor, sf_patch); + msg_format("Error (%s) reading savefile (version " FMTu32b ").", + what, vernum); msg_print(NULL); /* Oops */ -- cgit v1.2.3 From 0595b2fa946619d29624505f8edc0f9c00146e61 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove pointless comment --- src/loadsave.cc | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index dacd0e15..a085283d 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -66,20 +66,8 @@ struct option_value { /* - * Basic byte-level reading from savefile. This provides a single point - * of interface to the pseudoencryption that ToME (and Angband) - * uses. I'm thinking about if it might be faster/better to modify all - * the do_* functions to directly do this stuff -- it'd make the code - * somewhat uglier to maintain, but concievably might be much faster. Or - * is it better maybe to scrap the pseudoencryption entirely and adopt - * some other means of obfuscation, should it still prove useful in any - * way? -- Improv - * - * What's the point of encryption on savefiles anyway? If I wanted to - * make a cheater savefile, I'd activate debug mode, and hack the game - * not to save it. There's no point. -- takkaria + * Basic byte-level reading from savefile. */ - static byte sf_get() { byte c; -- cgit v1.2.3 From 554ff9a63d5d9bc64f668a00b6baa9b91dc41306 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Move "messages" to Game struct --- src/birth.cc | 13 ++++++------ src/cmd4.cc | 23 +++++++++++--------- src/game.hpp | 8 +++++++ src/loadsave.cc | 8 ++++--- src/melee2.cc | 7 +++++-- src/messages.cc | 53 ++++++++++++++++++---------------------------- src/messages.hpp | 64 ++++++++++++++++++++++++++++++++++++++++---------------- src/q_hobbit.cc | 5 ++++- src/q_poison.cc | 7 ++++++- src/q_rand.cc | 6 +++--- src/q_shroom.cc | 4 +++- src/q_thrain.cc | 3 ++- src/util.cc | 16 +++++++------- src/xtra1.cc | 4 +++- 14 files changed, 133 insertions(+), 88 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 2f56ec28..42a004bc 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2682,6 +2682,7 @@ void player_birth() { auto const &st_info = game->edit_data.st_info; auto &d_info = game->edit_data.d_info; + auto &messages = game->messages; /* Starting index for generated towns */ std::size_t rtown = TOWN_RANDOM; @@ -2720,11 +2721,11 @@ void player_birth() add_note_type(NOTE_BIRTH); /* Note player birth in the message recall */ - message_add(" ", TERM_L_BLUE); - message_add(" ", TERM_L_BLUE); - message_add("====================", TERM_L_BLUE); - message_add(" ", TERM_L_BLUE); - message_add(" ", TERM_L_BLUE); + messages.add(" ", TERM_L_BLUE); + messages.add(" ", TERM_L_BLUE); + messages.add("====================", TERM_L_BLUE); + messages.add(" ", TERM_L_BLUE); + messages.add(" ", TERM_L_BLUE); /* Hack -- outfit the player */ player_outfit(); @@ -2773,7 +2774,7 @@ void player_birth() if (wizard) { - message_add(format("Random dungeon town: d_idx:%d, lev:%d", i, lev), TERM_WHITE); + messages.add(format("Random dungeon town: d_idx:%d, lev:%d", i, lev), TERM_WHITE); } /* Create the town */ diff --git a/src/cmd4.cc b/src/cmd4.cc index 3216e339..c4adab54 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -255,7 +255,9 @@ void do_cmd_change_name() */ void do_cmd_message_one() { - auto message = message_at(0); + auto const &messages = game->messages; + + auto message = messages.at(0); cptr msg = format("> %s", message.text_with_count().c_str()); @@ -284,21 +286,19 @@ void do_cmd_message_one() */ void do_cmd_messages() { - int i, j, k, n; - u32b q; - int wid, hgt; + auto const &messages = game->messages; /* String to highlight */ std::string shower; /* Total messages */ - n = message_num(); + const int n = messages.size(); /* Start on first message */ - i = 0; + int i = 0; /* Start at leftmost edge */ - q = 0; + u32b q = 0; /* Enter "icky" mode */ character_icky = TRUE; @@ -313,12 +313,15 @@ void do_cmd_messages() Term_clear(); /* Retrieve current screen size */ + int wid; + int hgt; Term_get_size(&wid, &hgt); /* Dump up to 20 (or more in bigscreen) lines of messages */ + int j; for (j = 0; (j < (hgt - 4)) && (i + j < n); j++) { - auto message = message_at(i + j); + auto message = messages.at(i + j); auto text = message.text_with_count(); auto color = message.color; @@ -354,7 +357,7 @@ void do_cmd_messages() prt("[Press 'p' for older, 'n' for newer, ..., or ESCAPE]", hgt - 1, 0); /* Get a command */ - k = inkey(); + const auto k = inkey(); /* Exit on Escape */ if (k == ESCAPE) break; @@ -419,7 +422,7 @@ void do_cmd_messages() /* Scan messages */ for (z = i + 1; z < n; z++) { - auto message = message_at(z); + auto message = messages.at(z); /* Search for it */ if (message.text_with_count().find(finder) != std::string::npos) diff --git a/src/game.hpp b/src/game.hpp index 631e16b1..37da1cc0 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -6,11 +6,14 @@ #include "game_edit_data.hpp" #include "grid.hpp" #include "h-basic.h" +#include "messages.hpp" #include "player_defs.hpp" #include "random_artifact.hpp" #include "skill_type.hpp" #include "wilderness_map.hpp" +#include + /** * All structures for the game itself. */ @@ -53,6 +56,11 @@ struct Game { */ std::array player_hp { }; + /** + * Message buffer. + */ + messages messages { 2048 }; + /** * Game edit data */ diff --git a/src/loadsave.cc b/src/loadsave.cc index a085283d..5968e7c5 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1905,8 +1905,10 @@ static void do_message(message &msg, ls_flag_t flag) */ static void do_messages(ls_flag_t flag) { + auto &messages = game->messages; + /* Save/load number of messages */ - s16b num = message_num(); + s16b num = messages.size(); do_s16b(&num, flag); /* Read the messages */ @@ -1916,14 +1918,14 @@ static void do_messages(ls_flag_t flag) if (flag == ls_flag_t::SAVE) { - message = message_at(i); + message = messages.at(i); } do_message(message, flag); if (flag == ls_flag_t::LOAD) { - message_add(message); + messages.add(message); } } } diff --git a/src/melee2.cc b/src/melee2.cc index 3ab3cc1c..10807b44 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -894,6 +894,8 @@ static void monster_msg(cptr fmt, ...) void monster_msg_simple(cptr s) { + auto &messages = game->messages; + /* Display */ if (options->disturb_other) { @@ -901,7 +903,7 @@ void monster_msg_simple(cptr s) } else { - message_add(s, TERM_WHITE); + messages.add(s, TERM_WHITE); p_ptr->window |= PW_MESSAGE; } } @@ -910,6 +912,7 @@ void cmonster_msg(char a, cptr fmt, ...) { va_list vp; + auto &messages = game->messages; char buf[1024]; /* Begin the Varargs Stuff */ @@ -928,7 +931,7 @@ void cmonster_msg(char a, cptr fmt, ...) } else { - message_add(buf, a); + messages.add(buf, a); p_ptr->window |= PW_MESSAGE; } } diff --git a/src/messages.cc b/src/messages.cc index 637fa991..ea80451b 100644 --- a/src/messages.cc +++ b/src/messages.cc @@ -1,54 +1,41 @@ #include "messages.hpp" -#include +#include "game.hpp" + #include #include -/* - * OPTION: Maximum number of messages to remember (see "io.c") - * Default: assume maximal memorization of 2048 total messages - */ -#define MESSAGE_MAX 2048 - -/** - * Circular buffer for the messages - */ -static boost::circular_buffer *buffer() -{ - static auto *instance = new boost::circular_buffer(MESSAGE_MAX); - return instance; -} - -s16b message_num() +s16b messages::size() const { - return buffer()->size(); + return buffer.size(); } -message const &message_at(int age) +message const &messages::at(int age) const { assert(age >= 0); - assert(age < message_num()); + assert(age < size()); // Age indexes backward through history and is zero-based, so... - std::size_t i = buffer()->size() - 1 - age; + std::size_t i = buffer.size() - 1 - age; // Get the message - return buffer()->at(i); + return buffer.at(i); } -void message_add(cptr str, byte color) +void messages::add(cptr msg, byte color) { - assert(str != nullptr); - - // Shorthand to avoid syntactic clutter - auto buf = buffer(); + assert(msg != nullptr); + add(std::string(msg), color); +} +void messages::add(std::string const &msg, byte color) +{ // If the message is the same as the last message, // we just increment the counter instead of adding // the message. - if ((!buf->empty()) && (buf->back().text == str)) + if ((!buffer.empty()) && (buffer.back().text == msg)) { - buf->back().count += 1; + buffer.back().count += 1; return; } @@ -56,11 +43,11 @@ void message_add(cptr str, byte color) message message; message.color = color; message.count = 1; - message.text = str; - buf->push_back(message); + message.text = msg; + buffer.push_back(message); } -void message_add(message const &message) +void messages::add(message const &m) { - buffer()->push_back(message); + buffer.push_back(m); } diff --git a/src/messages.hpp b/src/messages.hpp index 99edd0e2..4c6fb2d3 100644 --- a/src/messages.hpp +++ b/src/messages.hpp @@ -3,26 +3,54 @@ #include "h-basic.h" #include "message.hpp" -/** - * Get the current number of messages. - */ -s16b message_num(); +#include /** - * Get message of given age. Age must be - * in the half-open interval [0, message_num). - * - * The reference is only valid as long as - * no messages are added. + * Game message buffer */ -message const &message_at(int age); +struct messages final { -/** - * Add a message. - */ -void message_add(cptr msg, byte color); +private: + boost::circular_buffer buffer; -/** - * Add a message. - */ -void message_add(message const &); +public: + + /** + * Create message buffer with space for given + * number of messages. + */ + explicit messages(std::size_t n) + : buffer(n) + { + } + + /** + * Get the current number of messages. + */ + s16b size() const; + + /** + * Get message of given age. Age must be + * in the half-open interval [0, message_num). + * + * The reference is only valid as long as + * no messages are added. + */ + message const &at(int age) const; + + /** + * Add a message. + */ + void add(cptr msg, byte color); + + /** + * Add a message. + */ + void add(std::string const &msg, byte color); + + /** + * Add a message. + */ + void add(message const &); + +}; diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc index 011269eb..655755a3 100644 --- a/src/q_hobbit.cc +++ b/src/q_hobbit.cc @@ -1,6 +1,7 @@ #include "q_hobbit.hpp" #include "cave.hpp" +#include "game.hpp" #include "hook_chardump_in.hpp" #include "hook_chat_in.hpp" #include "hook_give_in.hpp" @@ -209,6 +210,8 @@ static bool quest_hobbit_dump_hook(void *, void *in_, void *) void quest_hobbit_init_hook() { + auto &messages = game->messages; + /* Get a level to place the hobbit */ if (!cquest.data[0]) { @@ -216,7 +219,7 @@ void quest_hobbit_init_hook() cquest.data[1] = turn; if (wizard) { - message_add(format("Hobbit level %d", cquest.data[0]), TERM_BLUE); + messages.add(format("Hobbit level %d", cquest.data[0]), TERM_BLUE); } } diff --git a/src/q_poison.cc b/src/q_poison.cc index a0d9e025..e7f1c71b 100644 --- a/src/q_poison.cc +++ b/src/q_poison.cc @@ -312,12 +312,17 @@ static bool quest_poison_drop_hook(void *, void *in_, void *) void quest_poison_init_hook() { + auto &messages = game->messages; + /* Get a place to place the poison */ if (!cquest.data[1]) { cquest.data[1] = TRUE; cquest.data[0] = rand_int(4); - if (wizard) message_add(format("Wilderness poison %d, %d", wild_locs[cquest.data[0]][0], wild_locs[cquest.data[0]][1]), TERM_BLUE); + if (wizard) + { + messages.add(format("Wilderness poison %d, %d", wild_locs[cquest.data[0]][0], wild_locs[cquest.data[0]][1]), TERM_BLUE); + } } if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) diff --git a/src/q_rand.cc b/src/q_rand.cc index e3860dd2..b643ca39 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -57,6 +57,7 @@ void initialize_random_quests(int n) { auto const &d_info = game->edit_data.d_info; auto &r_info = game->edit_data.r_info; + auto &messages = game->messages; int step, lvl, i, k; int old_type = dungeon_type; @@ -173,7 +174,7 @@ void initialize_random_quests(int n) { if (wizard) { - message_add(format("Could not find quest monster on lvl %d", rl), TERM_RED); + messages.add(format("Could not find quest monster on lvl %d", rl), TERM_RED); } q_ptr->type = 0; } @@ -188,8 +189,7 @@ void initialize_random_quests(int n) if (wizard) { - message_add(format("Quest for %d on lvl %d", - q_ptr->r_idx, rl), TERM_RED); + messages.add(format("Quest for %d on lvl %d", q_ptr->r_idx, rl), TERM_RED); } } diff --git a/src/q_shroom.cc b/src/q_shroom.cc index f14c7faf..627f2b39 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -319,6 +319,8 @@ static bool quest_shroom_chat_hook(void *, void *in_, void *) void quest_shroom_init_hook() { + auto &messages = game->messages; + /* Get a number of 'shrooms */ if (!cquest.data[1]) { @@ -326,7 +328,7 @@ void quest_shroom_init_hook() cquest.data[1] = rand_range(7, 14); if (wizard) { - message_add(format("Shrooms number %d", cquest.data[1]), TERM_BLUE); + messages.add(format("Shrooms number %d", cquest.data[1]), TERM_BLUE); } } diff --git a/src/q_thrain.cc b/src/q_thrain.cc index 025ff01f..7b895695 100644 --- a/src/q_thrain.cc +++ b/src/q_thrain.cc @@ -264,13 +264,14 @@ static bool quest_thrain_turn_hook(void *, void *, void *) void quest_thrain_init_hook() { auto const &d_info = game->edit_data.d_info; + auto &messages = game->messages; if (!cquest.data[0]) { cquest.data[0] = rand_range(d_info[DUNGEON_DOL_GULDUR].mindepth + 1, d_info[DUNGEON_DOL_GULDUR].maxdepth - 1); if (wizard) { - message_add(format("Thrain lvl %d", cquest.data[0]), TERM_BLUE); + messages.add(format("Thrain lvl %d", cquest.data[0]), TERM_BLUE); } } if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) diff --git a/src/util.cc b/src/util.cc index 9190f4a1..9005c04f 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1758,15 +1758,15 @@ void display_message(int x, int y, int split, byte color, cptr t) */ void cmsg_print(byte color, cptr msg) { - static int p = 0; + auto &messages = game->messages; - int n; - int wid; + static int p = 0; char *t; char buf[1024]; + int wid; Term_get_size(&wid, nullptr); int lim = wid - 8; @@ -1774,7 +1774,7 @@ void cmsg_print(byte color, cptr msg) if (!msg_flag) p = 0; /* Message Length */ - n = (msg ? strlen(msg) : 0); + int n = (msg ? strlen(msg) : 0); /* Hack -- flush when requested or needed */ if (p && (!msg || ((p + n) > lim))) @@ -1798,7 +1798,10 @@ void cmsg_print(byte color, cptr msg) /* Memorize the message */ - if (character_generated) message_add(msg, color); + if (character_generated) + { + messages.add(msg, color); + } /* Handle "auto_more" */ if (options->auto_more) @@ -1867,9 +1870,6 @@ void cmsg_print(byte color, cptr msg) /* Display the tail of the message */ display_message(p, 0, n, color, t); - /* Memorize the tail */ - /* if (character_generated) message_add(t); */ - /* Window stuff */ if (p_ptr) { diff --git a/src/xtra1.cc b/src/xtra1.cc index 9f12fa3a..7141630e 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1186,6 +1186,8 @@ static void fix_player() */ void fix_message() { + auto const &messages = game->messages; + int j, i; int w, h; int x, y; @@ -1210,7 +1212,7 @@ void fix_message() /* Dump messages */ for (i = 0; i < h; i++) { - auto message = message_at(i); + auto message = messages.at(i); auto text_with_count = message.text_with_count(); /* Dump the message on the appropriate line */ -- cgit v1.2.3 From 5c1aeec4bc33dab46300d2f2b09f7679a0380a44 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Add std::string overload for cmsg_print() --- src/util.cc | 5 +++++ src/util.hpp | 1 + 2 files changed, 6 insertions(+) diff --git a/src/util.cc b/src/util.cc index 9005c04f..fc8f4080 100644 --- a/src/util.cc +++ b/src/util.cc @@ -1886,6 +1886,11 @@ void cmsg_print(byte color, cptr msg) if (options->fresh_message) Term_fresh(); } +void cmsg_print(byte color, std::string const &msg) +{ + cmsg_print(color, msg.c_str()); +} + /* Hack -- for compatibility and easy sake */ void msg_print(cptr msg) { diff --git a/src/util.hpp b/src/util.hpp index 8b8b2e3c..1f5c3aed 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -35,6 +35,7 @@ void ascii_to_text(char *buf, cptr str); char inkey_scan(); void display_message(int x, int y, int split, byte color, cptr t); void cmsg_print(byte color, cptr msg); +void cmsg_print(byte color, std::string const &msg); void msg_print(cptr msg); void cmsg_format(byte color, cptr fmt, ...); void msg_format(cptr fmt, ...); -- cgit v1.2.3 From 6f14a3a6846868dc07e60ba1350ffe0cea5ad4ae Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Clean up cmonster_msg() --- src/melee2.cc | 66 ++++++++++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/melee2.cc b/src/melee2.cc index 10807b44..d769355a 100644 --- a/src/melee2.cc +++ b/src/melee2.cc @@ -56,7 +56,6 @@ #define FOLLOW_DISTANCE 6 -static void cmonster_msg(char a, cptr fmt, ...); /* * Based on mon_take_hit... all monster attacks on @@ -66,6 +65,28 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) { monster_type *m_ptr = &m_list[m_idx], *s_ptr = &m_list[s_idx]; + /* Output */ + auto cmonster_msg = [m_ptr](std::string const &suffix) { + auto &messages = game->messages; + // Build monster name + char m_name[80]; + monster_desc(m_name, m_ptr, 0); + capitalize(m_name); + // Add suffix + auto msg = std::string(m_name); + msg += suffix; + // Display + if (options->disturb_other) + { + cmsg_print(TERM_L_RED, msg); + } + else + { + messages.add(msg, TERM_L_RED); + p_ptr->window |= PW_MESSAGE; + } + }; + /* Redraw (later) if needed */ if (health_who == m_idx) p_ptr->redraw |= (PR_FRAME); @@ -89,18 +110,17 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) } else { - char m_name[80]; s32b dive = s_ptr->level; - if (!dive) dive = 1; - - /* Extract monster name */ - monster_desc(m_name, m_ptr, 0); + if (!dive) + { + dive = 1; + } /* Death by Missile/Spell attack */ if (note) { - cmonster_msg(TERM_L_RED, "%^s%s", m_name, note); + cmonster_msg(note); } /* Death by Physical attack -- living monster */ else if (!m_ptr->ml) @@ -114,11 +134,11 @@ bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note) (r_ptr->flags & RF_NONLIVING) || (strchr("Evg", r_ptr->d_char))) { - cmonster_msg(TERM_L_RED, "%^s is destroyed.", m_name); + cmonster_msg(" is destroyed."); } else { - cmonster_msg(TERM_L_RED, "%^s is killed.", m_name); + cmonster_msg(" is killed."); } dive = r_ptr->mexp * m_ptr->level / dive; @@ -908,34 +928,6 @@ void monster_msg_simple(cptr s) } } -void cmonster_msg(char a, cptr fmt, ...) -{ - va_list vp; - - auto &messages = game->messages; - char buf[1024]; - - /* Begin the Varargs Stuff */ - va_start(vp, fmt); - - /* Format the args, save the length */ - vstrnfmt(buf, 1024, fmt, vp); - - /* End the Varargs Stuff */ - va_end(vp); - - /* Display */ - if (options->disturb_other) - { - cmsg_print(a, buf); - } - else - { - messages.add(buf, a); - p_ptr->window |= PW_MESSAGE; - } -} - /** * Extract list of spell indexes from a flag set. */ -- cgit v1.2.3 From 29dce5dd3fadafc1f4b775ecbf7980ce5223dd1e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Make a few globals static --- src/birth.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 42a004bc..d880f443 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -2825,11 +2825,11 @@ void player_birth() -char savefile_module[46][80]; -char savefile_names[46][30]; -char savefile_desc[46][80]; -bool_ savefile_alive[46]; -int savefile_idx[46]; +static char savefile_module[46][80]; +static char savefile_names[46][30]; +static char savefile_desc[46][80]; +static bool_ savefile_alive[46]; +static int savefile_idx[46]; /* * Grab all the names from an index -- cgit v1.2.3 From dd900258b2c67562dc58840722b0223f68769b3c Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Rework loadsave.c:loaded_game_module to use std::string --- src/loadsave.cc | 39 ++++++++++++++++++++------------------- src/modules.cc | 4 ++-- src/modules.hpp | 3 ++- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 5968e7c5..8413086d 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -39,6 +39,7 @@ #include "z-rand.hpp" #include +#include #include static u32b vernum; /* Version flag */ @@ -483,7 +484,6 @@ static void note(cptr msg) /* * Misc. other data */ -static char loaded_game_module[80]; static bool_ do_extra(ls_flag_t flag) { auto const &d_info = game->edit_data.d_info; @@ -864,21 +864,6 @@ static bool_ do_extra(ls_flag_t flag) /* Write death */ do_bool(&death, flag); - /* Incompatible module? */ - if (flag == ls_flag_t::LOAD) - { - s32b ok; - - ok = module_savefile_loadable(loaded_game_module); - - /* Argh bad game module! */ - if (!ok) - { - note(format("Bad game module. Savefile was saved with module '%s' but game is '%s'.", loaded_game_module, game_module)); - return (FALSE); - } - } - /* Level feeling */ do_s16b(&feeling, flag); @@ -2393,11 +2378,27 @@ static bool_ do_savefile_aux(ls_flag_t flag) } /* Game module */ - if (flag == ls_flag_t::SAVE) { - strcpy(loaded_game_module, game_module); + std::string loaded_game_module; + + if (flag == ls_flag_t::SAVE) + { + loaded_game_module = game_module; + } + do_std_string(loaded_game_module, flag); + + // Check for incompatible module + if (flag == ls_flag_t::LOAD) + { + if (!module_savefile_loadable(loaded_game_module)) + { + note(fmt::format("Bad game module. Savefile was saved with module '{:s}' but game is '{:s}'.", + loaded_game_module, + game_module).c_str()); + return FALSE; + } + } } - do_string(loaded_game_module, 80, flag); /* Timers */ do_timers(flag); diff --git a/src/modules.cc b/src/modules.cc index aba71731..de9ad1ad 100644 --- a/src/modules.cc +++ b/src/modules.cc @@ -232,9 +232,9 @@ static void init_module(module_type *module_ptr) } } -bool_ module_savefile_loadable(cptr savefile_mod) +bool module_savefile_loadable(std::string const &tag) { - return (strcmp(savefile_mod, modules[game_module_idx].meta.save_file_tag) == 0); + return tag == modules[game_module_idx].meta.save_file_tag; } /* Did the player force a module on command line */ diff --git a/src/modules.hpp b/src/modules.hpp index b57120c3..867955c9 100644 --- a/src/modules.hpp +++ b/src/modules.hpp @@ -1,9 +1,10 @@ #pragma once #include "h-basic.h" +#include bool_ select_module(); -bool_ module_savefile_loadable(cptr savefile_mod); +bool module_savefile_loadable(std::string const &savefile_mod); void tome_intro(); void theme_intro(); s16b *theme_race_status(int r_idx); -- cgit v1.2.3 From 7a98afaeee09141ab36607e898d0e00072d9d930 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove loadsave:do_string() --- src/loadsave.cc | 49 ------------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 8413086d..fc473e0c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -196,55 +196,6 @@ static void do_s32b(s32b *ip, ls_flag_t flag) do_u32b((u32b *)ip, flag); } -static void save_string(const char *str) -{ - while (*str) - { - do_byte((byte*)str, ls_flag_t::SAVE); - str++; - } - do_byte((byte*)str, ls_flag_t::SAVE); -} - -static void load_string(char *str, int max) -{ - int i; - - /* Read the string */ - for (i = 0; TRUE; i++) - { - byte tmp8u; - - /* Read a byte */ - do_byte(&tmp8u, ls_flag_t::LOAD); - - /* Collect string while legal */ - if (i < max) str[i] = tmp8u; - - /* End of string */ - if (!tmp8u) break; - } - /* Terminate */ - str[max - 1] = '\0'; -} - -static void do_string(char *str, int max, ls_flag_t flag) -/* Max is ignored for writing */ -{ - switch(flag) { - case ls_flag_t::LOAD: - { - load_string(str, max); - return; - } - case ls_flag_t::SAVE: - { - save_string(str); - return; - } - } -} - static void save_std_string(std::string const *s) { // Length prefix. -- cgit v1.2.3 From 1fb9b3961781e5bca533c6876615cb67d5a455b0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Use boost::fs::exists() instead of "homebaked" file_exist() --- src/loadsave.cc | 24 ++---------------------- src/loadsave.hpp | 1 - src/squeltch.cc | 2 +- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index fc473e0c..541fbbec 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -38,6 +38,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include #include #include @@ -1478,27 +1479,6 @@ void save_dungeon() my_fclose(fff); } -bool_ file_exist(cptr buf) -{ - int fd; - bool_ result; - - /* Open savefile */ - fd = fd_open(buf, O_RDONLY); - - /* File exists */ - if (fd >= 0) - { - fd_close(fd); - result = TRUE; - } - else - result = FALSE; - - return result; -} - - /* * Handle monster lore */ @@ -2540,7 +2520,7 @@ bool_ load_player() /* XXX XXX XXX Fix this */ /* Verify the existance of the savefile */ - if (!file_exist(savefile)) + if (!boost::filesystem::exists(savefile)) { /* Give a message */ msg_format("Savefile does not exist: %s", savefile); diff --git a/src/loadsave.hpp b/src/loadsave.hpp index 01a3cb87..d28d437e 100644 --- a/src/loadsave.hpp +++ b/src/loadsave.hpp @@ -2,6 +2,5 @@ #include "h-basic.h" -bool_ file_exist(cptr buf); bool_ load_dungeon(char *ext); bool_ load_player(); diff --git a/src/squeltch.cc b/src/squeltch.cc index 61ccb1f3..1db8ff74 100644 --- a/src/squeltch.cc +++ b/src/squeltch.cc @@ -197,7 +197,7 @@ static void automatizer_save_rules() // Build the filename path_build(buf, 1024, ANGBAND_DIR_USER, name.c_str()); - if (file_exist(buf)) + if (boost::filesystem::exists(buf)) { show_message("File exists, continue? [y/n]"); ch = inkey(); -- cgit v1.2.3 From aac97ab5f017e5f0fd312c721d76c534ae318321 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Reduce redundancy in load/save --- src/loadsave.cc | 444 ++++++++++++++++++++------------------------------------ 1 file changed, 154 insertions(+), 290 deletions(-) diff --git a/src/loadsave.cc b/src/loadsave.cc index 541fbbec..2ef44ca8 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -46,6 +46,25 @@ static u32b vernum; /* Version flag */ static FILE *fff; /* Local savefile ptr */ +/* + * Show information on the screen, one line at a time. + * + * Avoid the top two lines, to avoid interference with "msg_print()". + */ +static void note(cptr msg) +{ + static int y = 2; + + /* Draw the message */ + prt(msg, y, 0); + + /* Advance one line (wrap if needed) */ + if (++y >= 24) y = 2; + + /* Flush it */ + Term_fresh(); +} + /** * Load/save flag */ @@ -281,6 +300,28 @@ template void do_vector(ls_flag_t flag, std::vector & } } +template void do_array(std::string const &what, ls_flag_t flag, A &array, std::size_t size, F f) +{ + // Save/load size. + u32b n = size; + do_u32b(&n, flag); + + // Check that we don't overflow the array. + if (flag == ls_flag_t::LOAD) + { + if (n > size) + { + note(fmt::format("Too many {:s}: {:d} > {:d}! Game may act strangely or crash.", what, n, size).c_str()); + } + } + + // Load/save the contents of the array. + for (std::size_t i = 0; i < n; i++) + { + f(&array[i], flag); + } +} + static void do_bytes(ls_flag_t flag, std::uint8_t *buf, std::size_t n) { for (std::size_t i = 0; i < n; i++) @@ -413,26 +454,6 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } -/* - * Show information on the screen, one line at a time. - * - * Avoid the top two lines, to avoid interference with "msg_print()". - */ -static void note(cptr msg) -{ - static int y = 2; - - /* Draw the message */ - prt(msg, y, 0); - - /* Advance one line (wrap if needed) */ - if (++y >= 24) y = 2; - - /* Flush it */ - Term_fresh(); -} - - /* * Misc. other data */ @@ -513,22 +534,14 @@ static bool_ do_extra(ls_flag_t flag) do_s16b(&p_ptr->melee_style, flag); do_s16b(&p_ptr->use_piercing_shots, flag); - u16b tmp16u = s_info.size(); - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u != s_info.size())) - { - quit("Too few/many skills"); - } - - for (std::size_t i = 0; i < tmp16u; i++) - { - do_s32b(&s_info[i].value, flag); - do_s32b(&s_info[i].mod, flag); - do_std_bool(&s_info[i].dev, flag); - do_std_bool(&s_info[i].hidden, flag); - } + do_array("skills", flag, s_info, s_info.size(), + [](auto skill, auto flag) -> void { + do_s32b(&skill->value, flag); + do_s32b(&skill->mod, flag); + do_std_bool(&skill->dev, flag); + do_std_bool(&skill->hidden, flag); + } + ); } // Abilities @@ -555,46 +568,21 @@ static bool_ do_extra(ls_flag_t flag) do_byte(&p_ptr->spellbinder.trigger, flag); do_vector(flag, p_ptr->spellbinder.spell_idxs, do_u32b); - // Quests - { - byte tmp8u; - - // Number of quests - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_PLOTS; - } - do_byte(&tmp8u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_PLOTS)) - { - quit(format("Too many plots, %d %d", tmp8u, MAX_PLOTS)); - } - - // Quest status - for (std::size_t i = 0; i < tmp8u; i++) - { - do_s16b(&plots[i], flag); - } - - // Number of random quests - if (flag == ls_flag_t::SAVE) - { - tmp8u = MAX_RANDOM_QUEST; - } - do_byte(&tmp8u, flag); - if ((flag == ls_flag_t::LOAD) && (tmp8u > MAX_RANDOM_QUEST)) - { - quit("Too many random quests"); + // Quest status + do_array("plot quests", flag, plots, MAX_PLOTS, + [](auto plot, auto flag) -> void { + do_s16b(plot, flag); } - - // Random quest data - for (std::size_t i = 0; i < tmp8u; i++) - { - do_byte(&random_quests[i].type, flag); - do_s16b(&random_quests[i].r_idx, flag); - do_std_bool(&random_quests[i].done, flag); + ); + + // Random quests + do_array("random quests", flag, random_quests, MAX_RANDOM_QUEST, + [](auto q, auto flag) -> void { + do_byte(&q->type, flag); + do_s16b(&q->r_idx, flag); + do_std_bool(&q->done, flag); } - } + ); do_s16b(&p_ptr->oldpx, flag); do_s16b(&p_ptr->oldpy, flag); @@ -733,22 +721,11 @@ static bool_ do_extra(ls_flag_t flag) do_s32b(&p_ptr->inertia_controlled_spell, flag); do_s16b(&p_ptr->last_rewarded_level, flag); - // Corruptions - { - u16b tmp16u = CORRUPTIONS_MAX; - - do_u16b(&tmp16u, flag); - - if (tmp16u > CORRUPTIONS_MAX) - { - quit("Too many corruptions"); - } - - for (std::size_t i = 0; i < tmp16u; i++) - { - do_bool(&p_ptr->corruptions[i], flag); + do_array("corruptions", flag, p_ptr->corruptions, CORRUPTIONS_MAX, + [](auto corruption, auto flag) -> void { + do_bool(corruption, flag); } - } + ); do_bool(&p_ptr->corrupt_anti_teleport_stopped, flag); @@ -774,21 +751,11 @@ static bool_ do_extra(ls_flag_t flag) do_bool(&p_ptr->astral, flag); // Powers - { - u16b tmp16u = POWER_MAX; - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u != POWER_MAX)) - { - quit("Too few/many powers!"); + do_array("powers", flag, p_ptr->powers_mod, POWER_MAX, + [](auto pwr, auto flag) -> void { + do_bool(pwr, flag); } - - for (std::size_t i = 0; i < POWER_MAX; i++) - { - do_bool(&p_ptr->powers_mod[i], flag); - } - } + ); /* The tactic */ do_char(&p_ptr->tactic, flag); @@ -872,13 +839,14 @@ static void do_monster(monster_type *m_ptr, ls_flag_t flag) } /* Attacks */ - for (std::size_t i = 0; i < 4; i++) - { - do_byte(&m_ptr->blow[i].method, flag); - do_byte(&m_ptr->blow[i].effect, flag); - do_byte(&m_ptr->blow[i].d_dice, flag); - do_byte(&m_ptr->blow[i].d_side, flag); - } + do_array("attacks", flag, m_ptr->blow, 4, + [](auto blow, auto flag) { + do_byte(&blow->method, flag); + do_byte(&blow->effect, flag); + do_byte(&blow->d_dice, flag); + do_byte(&blow->d_side, flag); + } + ); } @@ -1341,24 +1309,14 @@ static bool do_monsters(ls_flag_t flag, bool no_companions) /* Save/load pets */ { - u16b tmp16u = (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; + const std::size_t sz = + (flag == ls_flag_t::SAVE && !no_companions) ? max_m_idx : 0; - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > max_m_idx)) - { - note("Too many monster entries!"); - return false; - } - - for (std::size_t i = 1; i < tmp16u; i++) - { - /* Acquire monster */ - auto m_ptr = &km_list[i]; - - /* Read the monster */ - do_monster(m_ptr, flag); - } + do_array("pets", flag, km_list, sz, + [](auto m_ptr, auto flag) { + do_monster(m_ptr, flag); + } + ); } return true; @@ -1390,26 +1348,17 @@ static bool_ do_dungeon(ls_flag_t flag, bool no_companions) do_s16b(&last_teleportation_y, flag); /* Spell effects */ - { - u16b n_effects = MAX_EFFECTS; - do_u16b(&n_effects, flag); - - if ((flag == ls_flag_t::LOAD) && (n_effects > MAX_EFFECTS)) - { - quit("Too many spell effects"); + do_array("spell effects", flag, effects, MAX_EFFECTS, + [](auto effect, auto flag) -> void { + do_s16b(&effect->type, flag); + do_s16b(&effect->dam, flag); + do_s16b(&effect->time, flag); + do_u32b(&effect->flags, flag); + do_s16b(&effect->cx, flag); + do_s16b(&effect->cy, flag); + do_s16b(&effect->rad, flag); } - - for (std::size_t i = 0; i < n_effects; ++i) - { - do_s16b(&effects[i].type, flag); - do_s16b(&effects[i].dam, flag); - do_s16b(&effects[i].time, flag); - do_u32b(&effects[i].flags, flag); - do_s16b(&effects[i].cx, flag); - do_s16b(&effects[i].cy, flag); - do_s16b(&effects[i].rad, flag); - } - } + ); /* To prevent bugs with evolving dungeons */ for (std::size_t i = 0; i < 100; i++) @@ -1479,22 +1428,6 @@ void save_dungeon() my_fclose(fff); } -/* - * Handle monster lore - */ -static void do_lore(std::size_t r_idx, ls_flag_t flag) -{ - auto &r_info = game->edit_data.r_info; - - auto r_ptr = &r_info[r_idx]; - - do_s16b(&r_ptr->r_pkills, flag); - do_s16b(&r_ptr->max_num, flag); - do_bool(&r_ptr->on_saved, flag); -} - - - /* * Read a store @@ -1954,22 +1887,15 @@ static void do_stores(ls_flag_t flag) */ static bool do_monster_lore(ls_flag_t flag) { - auto const &r_info = game->edit_data.r_info; - - u16b tmp16u = r_info.size(); - - do_u16b(&tmp16u, flag); - - if ((flag == ls_flag_t::LOAD) && (tmp16u > r_info.size())) - { - note("Too many monster races!"); - return false; - } + auto &r_info = game->edit_data.r_info; - for (std::size_t i = 0; i < tmp16u; i++) - { - do_lore(i, flag); - } + do_array("monster races", flag, r_info, r_info.size(), + [](auto r_ptr, auto flag) -> void { + do_s16b(&r_ptr->r_pkills, flag); + do_s16b(&r_ptr->max_num, flag); + do_bool(&r_ptr->on_saved, flag); + } + ); return true; } @@ -1982,23 +1908,13 @@ static bool do_object_lore(ls_flag_t flag) { auto &k_info = game->edit_data.k_info; - u16b n_kinds = k_info.size(); - - do_u16b(&n_kinds, flag); - - if ((flag == ls_flag_t::LOAD) && (n_kinds > k_info.size())) - { - note("Too many object kinds!"); - return false; - } - - for (std::size_t i = 0; i < n_kinds; i++) - { - object_kind *k_ptr = &k_info[i]; - do_bool(&k_ptr->aware, flag); - do_bool(&k_ptr->tried, flag); - do_bool(&k_ptr->artifact, flag); - } + do_array("object kinds", flag, k_info, k_info.size(), + [](auto k_ptr, auto flag) -> void { + do_bool(&k_ptr->aware, flag); + do_bool(&k_ptr->tried, flag); + do_bool(&k_ptr->artifact, flag); + } + ); return true; } @@ -2088,32 +2004,21 @@ static bool do_towns(ls_flag_t flag) static bool do_quests(ls_flag_t flag) { - u16b max_quests_ldsv = MAX_Q_IDX; - - do_u16b(&max_quests_ldsv, flag); - - if ((flag == ls_flag_t::LOAD) && (max_quests_ldsv != MAX_Q_IDX)) - { - note("Invalid number of quests!"); - return false; - } - - for (std::size_t i = 0; i < MAX_Q_IDX; i++) - { - auto q = &quest[i]; - - do_s16b(&q->status, flag); - for (auto &quest_data : q->data) - { - do_s32b(&quest_data, flag); - } - - // Initialize the quest if necessary - if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) - { - q->init(); + do_array("quests", flag, quest, MAX_Q_IDX, + [](auto q, auto flag) { + // Load/save the data + do_s16b(&q->status, flag); + for (auto &quest_data : q->data) + { + do_s32b(&quest_data, flag); + } + // Initialize if necessary + if ((flag == ls_flag_t::LOAD) && (q->init != NULL)) + { + q->init(); + } } - } + ); return true; } @@ -2179,75 +2084,43 @@ static bool do_artifacts(ls_flag_t flag) { auto &a_info = game->edit_data.a_info; - u16b n_artifacts; - - if (flag == ls_flag_t::SAVE) - { - n_artifacts = a_info.size(); - } - - do_u16b(&n_artifacts, flag); - - if ((flag == ls_flag_t::LOAD) && (n_artifacts > a_info.size())) - { - note("Too many artifacts!"); - return false; - } - - for (std::size_t i = 0; i < n_artifacts; i++) - { - do_byte(&(&a_info[i])->cur_num, flag); - } + do_array("artifacts", flag, a_info, a_info.size(), + [](auto a_ptr, auto flag) { + do_byte(&a_ptr->cur_num, flag); + } + ); return true; } static bool do_fates(ls_flag_t flag) { - u16b n_fates = MAX_FATES; - - do_u16b(&n_fates, flag); - - if ((flag == ls_flag_t::LOAD) && (n_fates > MAX_FATES)) - { - note("Too many fates!"); - return false; - } - - for (std::size_t i = 0; i < n_fates; i++) - { - auto fate = &fates[i]; - do_byte(&fate->fate, flag); - do_byte(&fate->level, flag); - do_byte(&fate->serious, flag); - do_s16b(&fate->o_idx, flag); - do_s16b(&fate->e_idx, flag); - do_s16b(&fate->a_idx, flag); - do_s16b(&fate->v_idx, flag); - do_s16b(&fate->r_idx, flag); - do_s16b(&fate->count, flag); - do_s16b(&fate->time, flag); - do_bool(&fate->know, flag); - } + do_array("fates", flag, fates, MAX_FATES, + [](auto fate, auto flag) { + do_byte(&fate->fate, flag); + do_byte(&fate->level, flag); + do_byte(&fate->serious, flag); + do_s16b(&fate->o_idx, flag); + do_s16b(&fate->e_idx, flag); + do_s16b(&fate->a_idx, flag); + do_s16b(&fate->v_idx, flag); + do_s16b(&fate->r_idx, flag); + do_s16b(&fate->count, flag); + do_s16b(&fate->time, flag); + do_bool(&fate->know, flag); + } + ); return true; } static bool do_floor_inscriptions(ls_flag_t flag) { - u16b n_inscriptions = MAX_INSCRIPTIONS; - do_u16b(&n_inscriptions, flag); - - if ((flag == ls_flag_t::LOAD) && (n_inscriptions > MAX_INSCRIPTIONS)) - { - note("Too many inscriptions!"); - return false; - } - - for (std::size_t i = 0; i < n_inscriptions; i++) - { - do_std_bool(&p_ptr->inscriptions[i], flag); - } + do_array("inscriptions", flag, p_ptr->inscriptions, MAX_INSCRIPTIONS, + [](auto i_ptr, auto flag) { + do_std_bool(i_ptr, flag); + } + ); return true; } @@ -2256,20 +2129,11 @@ static bool do_player_hd(ls_flag_t flag) { auto &player_hp = game->player_hp; - u16b max_level = PY_MAX_LEVEL; - - do_u16b(&max_level, flag); - - if ((flag == ls_flag_t::LOAD) && (max_level > PY_MAX_LEVEL)) - { - note("Too many hitpoint entries!"); - return false; - } - - for (std::size_t i = 0; i < max_level; i++) - { - do_s16b(&player_hp[i], flag); - } + do_array("hit dice entries", flag, player_hp, PY_MAX_LEVEL, + [](auto hp_ptr, auto flag) { + do_s16b(hp_ptr, flag); + } + ); return true; } -- cgit v1.2.3 From dc8fa8a9232fa02be448db269d97a2e15e5e7cb5 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Rework CMakeLists to show REQUIRED packages all at once This also avoids a few deprecation warnings for PRINT_ENABLED_FEATURES(). --- CMakeLists.txt | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61b8dda7..cf31d878 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ # Project definition. PROJECT (tome2) -CMAKE_MINIMUM_REQUIRED (VERSION 2.8) +CMAKE_MINIMUM_REQUIRED (VERSION 3.1) # We want a readable feature summary. INCLUDE(FeatureSummary) @@ -57,7 +57,8 @@ SET(LIBS ${LIBS} m) # # BOOST # -FIND_PACKAGE(Boost 1.54.0 REQUIRED COMPONENTS system filesystem) +FIND_PACKAGE(Boost 1.54.0 COMPONENTS system filesystem) +SET_PACKAGE_PROPERTIES(Boost PROPERTIES TYPE REQUIRED) IF(Boost_FOUND) ADD_DEFINITIONS(-DBOOST_FILESYSTEM_NO_DEPRECATED) @@ -80,27 +81,12 @@ FIND_PACKAGE(GTK2) # FIND_PACKAGE(SDL) IF(SDL_FOUND) - # This is a bit roundabout, but we're working around - # the FindSDL_* scripts not respecting the REQUIRED - # flag. - # - # the SDL port also requires SDL_image and SDL_ttf + # We assume that if we want to compile for SDL that + # any required dependencies should be installed. FIND_PACKAGE(SDL_image) FIND_PACKAGE(SDL_ttf) - IF(SDLIMAGE_FOUND AND SDLTTF_FOUND) - # Handled in src/CMakeLists.txt - ELSE() - # Let user know that (and why) we haven't enabled SDL. - IF(SDLIMAGE_FOUND) - MESSAGE(STATUS "Found SDL and SDL_image, but not SDL_ttf!") - ELSEIF(SDLTTF_FOUND) - MESSAGE(STATUS "Found SDL and SDL_ttf, but not SDL_image!") - ELSE() - MESSAGE(STATUS "Found SDL, but not SDL_image nor SDL_ttf!") - ENDIF() - # add info about finding but not enabling SDL - SET_FEATURE_INFO(SDL "not enabled") - ENDIF() + SET_PACKAGE_PROPERTIES(SDL_image PROPERTIES TYPE REQUIRED) + SET_PACKAGE_PROPERTIES(SDL_ttf PROPERTIES TYPE REQUIRED) ENDIF() # @@ -128,7 +114,7 @@ ENDIF() ADD_DEFINITIONS(-DDEFAULT_PATH="${DEFAULT_PATH}") # Print out a summary of features. -PRINT_ENABLED_FEATURES() +FEATURE_SUMMARY(FATAL_ON_MISSING_REQUIRED_PACKAGES WHAT PACKAGES_FOUND PACKAGES_NOT_FOUND) # Add the source subdirectory. ADD_SUBDIRECTORY (src) -- cgit v1.2.3 From 11041734794444255bcf4d5e9041bf3f13c14f2d Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Fix a potential infinite loop using random race modifier choice --- src/birth.cc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index d880f443..77ff56f3 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -1537,11 +1537,19 @@ static bool_ player_birth_aux_ask() if (c == 'S') return (FALSE); if (c == '*') { - do - { - k = rand_int(max_racem); + // Which choices are legal? + std::vector valid_choices(max_racem); + for (int i = 0; i < max_racem; i++) { + if ((BIT(racem[i]) & rmp_ptr->choice[racem[i] / 32])) + { + valid_choices.push_back(i); + } } - while (!(BIT(racem[k]) & rmp_ptr->choice[racem[k] / 32])); + + // Choose + assert(!valid_choices.empty()); + k = *uniform_element(valid_choices); + break; } else if (c == '?') -- cgit v1.2.3 From be427adc0203262e535faba9161c5336e19ffd77 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove "feet" display --- src/cmd2.cc | 4 ++-- src/cmd4.cc | 9 ++++----- src/files.cc | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/cmd2.cc b/src/cmd2.cc index e3d7cafe..a348c221 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -3902,8 +3902,8 @@ void do_cmd_immovable_special() /* Give some choices */ prt("(a) Teleport to a specific place.", 4, 5); prt("(b) Fetch an item.", 5, 5); - prt("(c) Go up 50'", 6, 5); - prt("(d) Go down 50'", 7, 5); + prt("(c) Go up one level", 6, 5); + prt("(d) Go down one level", 7, 5); /* Prompt */ prt("Command: ", 9, 0); diff --git a/src/cmd4.cc b/src/cmd4.cc index c4adab54..f7317cb1 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -3630,10 +3630,10 @@ static void do_cmd_knowledge_dungeons() if (max_dlv[y]) { /* Describe the recall depth */ - w.write(" {}{}: Level {} ({}')\n", + w.write(" {}{}: Level {}\n", (p_ptr->recall_dungeon == y) ? '*' : ' ', d_info[y].name, - max_dlv[y], 50 * (max_dlv[y])); + max_dlv[y]); } } @@ -3668,10 +3668,9 @@ void do_cmd_knowledge_towns() if (!(town_info[town_idx].flags & (TOWN_KNOWN))) continue; /* Describe the dungeon town */ - w.write(" {}: Level {} ({}')\n", + w.write(" {}: Level {}\n", d_ptr->name, - d_ptr->t_level[j], - 50 * d_ptr->t_level[j]); + d_ptr->t_level[j]); } } diff --git a/src/files.cc b/src/files.cc index 81fdeeec..6b3de0f0 100644 --- a/src/files.cc +++ b/src/files.cc @@ -2691,9 +2691,9 @@ errr file_character(cptr name, bool_ full) for (y = 1; y < static_cast(d_info.size()); y++) { if (max_dlv[y]) - fprintf(fff, "\n %s: Level %d (%d')", + fprintf(fff, "\n %s: Level %d", d_info[y].name.c_str(), - max_dlv[y], 50 * (max_dlv[y])); + max_dlv[y]); } fprintf(fff, "\n"); -- cgit v1.2.3 From 796f29b346bcad753b2e2b96e4454de0e9adb0cc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove ZANGBAND and CTHANGBAND monsters There was no way to enable them anyway, so we might as well remove them + the code for them. --- lib/edit/r_info.txt | 7355 ++-------------------------------------- src/monster2.cc | 9 - src/monster_race_flag_list.hpp | 2 - 3 files changed, 375 insertions(+), 6991 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index 8af0e634..c7c79083 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -874,24 +874,6 @@ F:WILD_MOUNTAIN F:WILD_TOO D:It is a small lizard with a hardened hide. -N:34:Grid bug -G:I:v -I:110:2d4:10:2:10 -W:1:1:10:2 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:BITE:ELEC:1d4 -F:ANIMAL -F:CAN_FLY -F:FRIENDS -F:IM_ELEC -F:NO_FEAR -F:RAND_25 -F:STUPID -F:WEIRD_MIND -F:ZANGBAND -D:A strange electric bug. - N:35:Jackal G:C:U I:110:1d4:10:3:10 @@ -1343,23 +1325,6 @@ F:WILD_ONLY F:WILD_SHORE D:It is as big as a wolf. -N:57:Freesia -G:f:u -I:120:6d5:30:30:0 -W:2:1:450:32 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CLAW:HURT:1d3 -B:CLAW:HURT:1d4 -F:ANIMAL -F:BASH_DOOR -F:DROP_SKELETON -F:FORCE_MAXHP -F:MORTAL -F:UNIQUE -F:ZANGBAND -D:A striped housecat who enjoys hunting. - N:58:Green worm mass G:w:g I:100:6d4:7:3:10 @@ -2180,24 +2145,6 @@ S:SCARE D:An adventurer both devoutly religious and skilful in combat. D:He seems to consider you an agent of the devil. -N:98:Zog -G:h:b -I:110:13d9:20:20:20 -W:5:1:600:25 -E:0:1:0:2:1:0 -O:50:0:25:20 -B:HIT:HURT:1d8 -B:HIT:HURT:1d8 -B:DROOL:* -F:BASH_DOOR -F:DROP_90 -F:DROP_SKELETON -F:EVIL -F:MORTAL -F:OPEN_DOOR -F:ZANGBAND -D:Drooling, insectoid aliens with disgusting habits. - N:99:Blue ooze G:j:b I:110:3d4:8:16:80 @@ -2459,53 +2406,6 @@ F:OPEN_DOOR F:WILD_TOO D:He looks inexperienced but tough. -N:111:Nibelung -G:h:D -I:110:8d4:20:12:5 -W:6:1:900:6 -E:1:1:1:2:1:1 -O:90:0:0:5 -B:HIT:HURT:1d6 -B:TOUCH:EAT_GOLD -F:BASH_DOOR -F:DROP_60 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:HAS_LITE -F:HURT_LITE -F:MALE -F:MORTAL -F:OPEN_DOOR -F:RES_DISE -F:TAKE_ITEM -F:ZANGBAND -D:Night dwarfs collecting riches. - -N:112:The disembodied hand that strangled people -G:z:g -I:130:7d8:30:15:20 -W:6:2:300:20 -E:0:0:0:1:0:0 -O:0:0:0:0 -B:CRUSH:HURT:1d8 -F:BASH_DOOR -F:CAN_FLY -F:COLD_BLOOD -F:EMPTY_MIND -F:EVIL -F:IM_POIS -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:UNDEAD -F:UNIQUE -F:ZANGBAND -D:Even today, nobody knows where it lurks... - N:113:Brown mold G:m:u I:110:15d8:2:12:99 @@ -2544,25 +2444,6 @@ F:WILD_TOO F:WILD_WOOD D:It screeches as it attacks. -N:115:Rat-thing -G:r:R -I:120:9d9:12:20:20 -W:6:1:1000:10 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:HURT:3d2 -B:BITE:HURT:3d1 -B:BITE:HURT:3d2 -F:ANIMAL -F:DROP_CORPSE -F:EVIL -F:MORTAL -F:ZANGBAND -S:1_IN_9 -S:CONF -S:SCARE -D:A ratlike creature with a humanlike face. - N:116:Novice rogue G:p:b I:110:8d4:20:12:5 @@ -3061,61 +2942,6 @@ S:HEAL S:SLOW D:He's been spying for Saruman. He is a snivelling wretch with no morals. -N:138:Robin Hood, the Outlaw -G:p:G -I:120:16d12:20:30:20 -W:10:2:1600:150 -E:1:1:1:2:1:1 -O:20:80:0:0 -B:HIT:HURT:1d5 -B:HIT:HURT:1d5 -B:TOUCH:EAT_GOLD -B:TOUCH:EAT_ITEM -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_GOOD -F:DROP_GREAT -F:DROP_SKELETON -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:MALE -F:MORTAL -F:ONLY_ITEM -F:OPEN_DOOR -F:TAKE_ITEM -F:UNIQUE -F:WILD_TOO -F:WILD_WOOD -F:ZANGBAND -S:1_IN_5 -S:ARROW_2 -S:HEAL -D:The legendary archer steals from the rich (you qualify). - -N:139:Nurgling -G:u:o -I:110:9d8:20:32:30 -W:8:2:800:19 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:BITE:DISEASE:1d8 -F:BASH_DOOR -F:DEMON -F:EVIL -F:FRIEND -F:FRIENDS -F:IM_FIRE -F:IM_POIS -F:NO_FEAR -F:OPEN_DOOR -F:ZANGBAND -D:It is a minor demon servitor of Nurgle. It looks like a hairless -D:teddy bear, with twisted eyes and rotting, ghoulish skin. - N:140:Lagduf, the Snaga G:o:y I:110:22d10:20:32:30 @@ -3225,26 +3051,6 @@ F:NO_SLEEP F:PASS_WALL D:A black hole in the fabric of reality. -N:145:Carnivorous flying monkey -G:H:R -I:110:20d8:30:20:20 -W:8:2:800:30 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:HURT:1d8 -B:CLAW:HURT:1d8 -B:BITE:HURT:5d1 -F:ANIMAL -F:CAN_FLY -F:DROP_CORPSE -F:HAS_LITE -F:MORTAL -F:WILD_MOUNTAIN -F:WILD_TOO -F:WILD_WOOD -F:ZANGBAND -D:It looks fantastic, yet frightening. - N:146:Green mold G:m:g I:110:21d8:2:14:75 @@ -3393,27 +3199,6 @@ F:NO_SLEEP F:PASS_WALL D:Spectral creatures that are half real, half illusion. -N:153:Gremlin -G:u:u -I:110:5d5:30:30:20 -W:8:3:500:6 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:EAT_FOOD:1d2 -B:CLAW:EAT_FOOD:1d2 -B:BITE:EAT_FOOD:1d3 -F:CAN_SWIM -F:DEMON -F:EVIL -F:HURT_LITE -F:IM_POIS -F:MORTAL -F:OPEN_DOOR -F:TAKE_ITEM -F:ZANGBAND -S:MULTIPLY -D:Don't feed them after midnight! - N:154:Yeti G:Y:w I:110:11d9:20:24:10 @@ -3489,30 +3274,6 @@ F:WILD_MOUNTAIN F:WILD_TOO D:A woman's face on the body of a vicious black bird. -N:158:Skaven -G:r:G -I:110:11d8:15:25:20 -W:9:1:600:20 -E:1:1:1:2:1:1 -O:35:35:20:0 -B:HIT:HURT:1d4 -B:HIT:HURT:1d4 -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:MALE -F:MORTAL -F:OPEN_DOOR -F:WILD_TOO -F:WILD_WASTE -F:ZANGBAND -D:A mutated rat-creature from the great waste, it is vaguely -D:humanoid in appearance and walks on its hind legs. This race -D:serves chaos fervently and is greatly feared by others. - N:159:The wounded bear G:q:r I:110:11d10:10:35:10 @@ -3945,35 +3706,6 @@ F:MORTAL F:WEIRD_MIND D:It is moving slowly towards you. -N:177:The Borshin -G:g:w -I:110:12d20:40:30:0 -W:10:2:600:45 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:HIT:HURT:2d12 -B:CRUSH:HURT:2d15 -B:TOUCH:TERRIFY -F:BASH_DOOR -F:CTHANGBAND -F:FORCE_MAXHP -F:IM_COLD -F:IM_POIS -F:MORTAL -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:UNIQUE -D:Pallid and twisted, this creature hates the very sight of you. -D:"It looked like something that had started out to be a man but had never -D:quite made it. It had been stepped on, twisted, had holes poked into the -D:sickly dough of its head-bulge. Bones showed through the transparent flesh -D:of its torso and its short legs were as thick as trees, terminating in -D:disk-shaped pads from which dozens of long toes hung like roots or worms. -D:its arms were longer than its entire body. it was a crushed slug, a thing -D:that had been frozen and thawed before it was fully baked. It was - -D:'It is the Borshin', said the Lord of Bats." - N:178:Dark elven mage G:h:r I:120:7d10:20:16:20 @@ -4003,21 +3735,6 @@ S:DARKNESS S:MISSILE D:A dark elven figure, dressed all in black, hurling spells at you. -N:179:Kamikaze yeek -G:y:r -I:113:4d8:18:18:10 -W:10:1:800:10 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:EXPLODE:HURT:15d2 -F:ANIMAL -F:BASH_DOOR -F:IM_ACID -F:MORTAL -F:OPEN_DOOR -F:ZANGBAND -D:The evil wizard Bruce has trained them to be living weapons. - N:180:Orfax, Son of Boldor G:y:B I:120:14d10:18:20:10 @@ -4057,34 +3774,6 @@ S:TELE_TO D:He's just like his daddy! He knows mighty spells, but fortunately he is a D:yeek. -N:181:Servant of Glaaki -G:z:G -I:110:9d9:20:20:20 -W:10:1:600:25 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:HURT:1d8 -B:CLAW:DISEASE:1d3 -F:BASH_DOOR -F:COLD_BLOOD -F:CTHANGBAND -F:EVIL -F:FRIENDS -F:HURT_LITE -F:IM_COLD -F:IM_POIS -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:UNDEAD -S:1_IN_12 -S:CAUSE_1 -S:SCARE -D:"...the hand of a corpse -- bloodless and skeletal, and with -D:impossibly long, cracked nails." - N:182:Dark elven warrior G:h:u I:110:10d11:20:16:20 @@ -4107,31 +3796,6 @@ S:1_IN_12 S:MISSILE D:A dark elven figure in armour, ready with his sword. -N:183:Sand-dweller -G:u:y -I:110:9d9:20:20:20 -W:10:1:600:30 -E:1:1:1:2:1:1 -O:20:50:20:5 -B:CLAW:HURT:1d6 -B:CLAW:HURT:1d6 -F:BASH_DOOR -F:CTHANGBAND -F:DROP_60 -F:DROP_90 -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:HURT_LITE -F:MALE -F:MORTAL -F:OPEN_DOOR -F:WILD_TOO -F:WILD_WASTE -D:"Rough-skinned, large-eyed, large-eared, with a horrible, -D:distorted resemblance to the koala bear facially, though -D:his body had an appearance of emaciation." - N:184:Clear mushroom patch G:,:B I:120:1d1:4:1:0 @@ -4249,25 +3913,6 @@ F:MORTAL F:OPEN_DOOR D:A bizarre bear-creature with the claws and the face of an owl. -N:189:Blue horror -G:u:B -I:110:14d9:20:35:20 -W:10:3:1200:25 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:TERRIFY:1d8 -B:CLAW:TERRIFY:1d8 -F:BASH_DOOR -F:DEMON -F:EVIL -F:FRIENDS -F:IM_FIRE -F:NO_CONF -F:NO_FEAR -F:OPEN_DOOR -F:ZANGBAND -D:An ugly screaming little demon servant of Tzeentch. - N:190:Hairy mold G:m:o I:110:15d8:2:15:70 @@ -4501,34 +4146,6 @@ F:MORTAL F:UNIQUE D:Fast-moving, with a taste for tuna sandwiches. -N:201:Shadow Creature of Fiona -G:h:s -I:110:11d8:12:12:16 -W:10:2:1000:35 -E:1:1:1:2:1:1 -O:20:30:50:0 -B:HIT:HURT:1d8 -B:HIT:HURT:1d8 -F:BASH_DOOR -F:DROP_60 -F:DROP_SKELETON -F:FRIENDS -F:IM_POIS -F:MALE -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -D:"There was something unusual about their appearance... For one thing, -D:all had uniformly bloodshot eyes. Very, very bloodshot eyes. With them, -D:though, the condition seemed normal. For another, all had an extra joint -D:to each finger and thumb, and sharp, forward-curving spurs on the backs -D:of their hands. All of them had prominent jaws and forty-four teeth, -D:most of them longer than human teeth, and several looking to be much -D:sharper. Their flesh was grayish and hard and shiny. There were -D:undoubtedly other differences also, but those were sufficient to prove -D:a point of some sort." - N:202:Undead mass G:j:u I:110:8d8:70:12:5 @@ -4554,28 +4171,6 @@ S:MULTIPLY D:A sickening mound of decaying flesh, bones, hands and so on. It seems to D:be growing. -N:203:Chaos shapechanger -G:H:v -I:110:20d9:10:14:12 -W:11:2:0:38 -E:1:1:1:2:1:1 -O:20:50:20:6 -B:HIT:HURT:1d5 -B:HIT:HURT:1d5 -B:HIT:CONFUSE:1d3 -F:ATTR_ANY -F:ATTR_MULTI -F:DROP_60 -F:EVIL -F:MORTAL -F:SHAPECHANGER -F:ZANGBAND -S:1_IN_5 -S:BO_COLD -S:BO_FIRE -S:CONF -D:A vaguely humanoid form constantly changing its appearance. - N:204:Baby multi-hued dragon G:d:v I:110:13d10:20:30:70 @@ -4615,26 +4210,6 @@ S:BR_POIS D:This hatchling dragon is still soft, its eyes unaccustomed to light and D:its scales shimmering with a hint of colour. -N:205:Vorpal bunny -G:r:w -I:120:10d10:40:40:0 -W:11:3:600:40 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:HURT:6d1 -B:BITE:HURT:7d1 -F:ANIMAL -F:BASH_DOOR -F:DROP_CORPSE -F:MORTAL -F:WILD_MOUNTAIN -F:WILD_TOO -F:ZANGBAND -S:1_IN_8 -S:BLINK -D:It looks very cute, except for the razor sharp teeth. It moans -D:ominously as it jumps at your throat! - N:206:Old Man Willow G:#:s I:110:32d30:20:20:20 @@ -4820,32 +4395,6 @@ S:MULTIPLY D:It is a disgusting mass of dark worms, eating each other, the floor, D:the air, you... -N:214:Abyss worm mass -G:w:D -I:100:5d8:10:15:3 -W:12:4:200:7 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRAWL:EXP_10 -F:ANIMAL -F:BASH_DOOR -F:CAN_SWIM -F:COLD_BLOOD -F:EVIL -F:HURT_LITE -F:INVISIBLE -F:KILL_WALL -F:MORTAL -F:NO_CUT -F:NO_FEAR -F:RAND_25 -F:RAND_50 -F:STUPID -F:WEIRD_MIND -F:ZANGBAND -S:MULTIPLY -D:Even more disgusting dark worms, their essence that of unbeing. - N:215:Golfimbul, the Hill Orc Chief G:o:y I:110:26d10:20:60:20 @@ -4901,35 +4450,6 @@ F:OPEN_DOOR F:WILD_TOO D:A warrior of considerable skill. -N:217:Skaven shaman -G:r:g -I:110:10d8:20:15:20 -W:12:1:600:36 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:HIT:HURT:1d7 -B:HIT:HURT:1d7 -F:BASH_DOOR -F:DROP_90 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FORCE_SLEEP -F:MALE -F:MORTAL -F:OPEN_DOOR -F:WILD_TOO -F:WILD_WASTE -F:ZANGBAND -S:1_IN_8 -S:BLINK -S:CAUSE_1 -S:CONF -S:MISSILE -S:SCARE -D:The shaman of a skaven tribe gets his powers from a mystic -D:stone corrupted by chaos, called a Warp Stone. - N:218:Baby bronze dragon G:d:U I:110:10d10:20:30:70 @@ -5014,73 +4534,6 @@ D:A huge disembodied eye. As you stare into the black nothingness of its pupil, D:you feel your will and vitality draining away, and are unable to do anything D:except approach it in horrified fascination. -N:221:Mine-dog -G:C:u -I:120:6d6:30:30:20 -W:12:4:500:40 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:EXPLODE:HURT:6d6 -F:ANIMAL -F:BASH_DOOR -F:FRIENDS -F:MORTAL -F:RAND_50 -F:ZANGBAND -D:An explosive charge has been attached to this poor animal, who -D:has been trained to search for its target and detonate. - -N:222:Hellcat -G:f:R -I:120:9d8:20:30:30 -W:12:1:400:40 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CLAW:HURT:1d5 -B:CLAW:HURT:1d5 -B:BITE:HURT:1d8 -F:ANIMAL -F:EVIL -F:FRIENDS -F:HAS_LITE -F:IM_FIRE -F:MORTAL -F:RAND_25 -F:SUSCEP_COLD -F:WEIRD_MIND -F:ZANGBAND -D:It is as large as a tiger, and its yellow eyes are pupilless. - -N:223:Moon beast -G:q:W -I:120:9d10:30:30:20 -W:12:1:800:57 -E:0:1:0:2:1:0 -O:50:0:40:5 -B:CLAW:HURT:1d3 -B:CLAW:HURT:1d3 -B:BUTT:HURT:1d6 -F:ANIMAL -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:EVIL -F:IM_FIRE -F:MORTAL -F:ONLY_ITEM -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_6 -S:BLIND -S:CAUSE_2 -S:CONF -S:DARKNESS -S:HEAL -D:"Great greyish-white slippery things which could expand and -D:contract at will, and whose principle shape... was that of a -D:sort of toad without any eyes, but with a curious vibrating mass -D:of short pink tentacles on the end of its blunt, vague snout." - N:224:Master yeek G:y:g I:110:12d9:18:24:10 @@ -5537,29 +4990,6 @@ S:SLOW S:S_ANIMAL D:A priest devoted to Nature. -N:242:Pink horror -G:u:R -I:110:15d9:20:35:20 -W:13:3:1200:64 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:TERRIFY:1d8 -B:CLAW:TERRIFY:1d8 -B:BITE:CONFUSE:1d6 -F:BASH_DOOR -F:DEMON -F:EVIL -F:FRIENDS -F:IM_FIRE -F:NO_CONF -F:NO_FEAR -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_8 -S:CONF -S:SCARE -D:An ugly screaming little demon servant of Tzeentch. - N:243:Cloaker G:(:g I:130:7d7:20:40:0 @@ -5709,23 +5139,6 @@ D:A mass of vegetation. As you pass near it, it reaches out tendrils to D:ensnare you. You can just make out skeletons of its previous victims D:deep within the thickets. -N:249:Vlasta -G:R:B -I:120:12d6:12:20:12 -W:14:3:1000:40 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:BLIND:1d10 -B:BITE:BLIND:1d10 -F:DROP_CORPSE -F:DROP_SKELETON -F:MORTAL -F:OPEN_DOOR -F:ZANGBAND -D:This strange creature looks like a miniature tyrannosaur. It has -D:empty, pale eyes and a sharp beak, which it aims at your eyes -D:as it jumps at you! - N:250:Giant white dragon fly G:F:w I:110:3d8:12:20:50 @@ -5749,28 +5162,6 @@ S:1_IN_10 S:BR_COLD D:It is a large fly that drips frost. -N:251:Snaga sapper -G:o:U -I:111:8d8:20:32:30 -W:14:1:80:15 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:HIT:HURT:1d8 -B:EXPLODE:HURT:20d2 -F:BASH_DOOR -F:EVIL -F:HAS_LITE -F:HURT_LITE -F:MALE -F:MORTAL -F:OPEN_DOOR -F:ORC -F:SUSCEP_FIRE -F:WILD_TOO -F:ZANGBAND -D:He is one of the many weaker 'slave' orcs, often mistakenly known as a -D:goblin. He is equipped with an explosive charge. - N:252:Blue icky thing G:i:b I:100:10d6:15:20:20 @@ -5820,23 +5211,6 @@ S:MULTIPLY S:SCARE D:A chaotic mass of pulsating flesh, mouths and eyes. -N:254:Wolfhound of Flora -G:C:s -I:120:9d9:20:20:0 -W:14:2:1600:40 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:HURT:1d5 -B:BITE:HURT:1d5 -F:ANIMAL -F:DROP_CORPSE -F:DROP_SKELETON -F:FRIENDS -F:MORTAL -F:NO_FEAR -F:ZANGBAND -D:Well-trained watchdogs, obedient to death. - N:255:Hill giant G:P:U I:110:30d15:20:45:50 @@ -5904,27 +5278,6 @@ F:WILD_TOO F:WILD_WOOD D:It is a large wolf with eyes full of cunning. -N:258:Cheerful leprechaun -G:h:G -I:120:2d5:8:6:6 -W:14:2:800:23 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:TOUCH:EAT_GOLD -B:TOUCH:EAT_FOOD -F:DROP_60 -F:GOOD -F:MALE -F:MORTAL -F:ONLY_GOLD -F:OPEN_DOOR -F:RAND_50 -F:ZANGBAND -S:1_IN_6 -S:BLINK -S:MULTIPLY -D:A merry little gnome. - N:259:Giant flea G:I:s I:120:1d2:6:7:10 @@ -6020,35 +5373,6 @@ F:WILD_MOUNTAIN F:WILD_TOO D:A massive orc-like figure with black skin and powerful arms. -N:263:Dweller on the threshold -G:Y:s -I:110:30d8:30:30:20 -W:15:5:3000:50 -E:1:1:1:2:1:1 -O:45:0:40:10 -B:GAZE:PARALYZE:4d4 -B:GAZE:TERRIFY:3d3 -B:GAZE:CONFUSE:3d3 -F:DEMON -F:DROP_60 -F:DROP_CORPSE -F:EVIL -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:NEVER_MOVE -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:ZANGBAND -S:1_IN_6 -S:BO_ACID -S:DRAIN_MANA -S:SCARE -S:S_MONSTER -D:A gorilla-shaped arcane guardian with an appetite for mages. - N:264:Half-orc G:o:s I:110:16d10:20:40:20 @@ -6162,37 +5486,6 @@ S:SCARE S:SLOW D:Yum! It looks quite tasty. It seems to glow with an unusual light. -N:268:Plaguebearer of Nurgle -G:z:o -I:110:9d10:20:50:20 -W:15:2:2800:75 -E:1:1:1:2:1:1 -O:50:20:20:10 -B:CLAW:DISEASE:2d5 -B:CLAW:DISEASE:2d5 -B:BUTT:HURT:3d5 -F:BASH_DOOR -F:DEMON -F:DROP_60 -F:EVIL -F:FORCE_MAXHP -F:IM_COLD -F:IM_POIS -F:NONLIVING -F:NO_CUT -F:OPEN_DOOR -F:UNDEAD -F:ZANGBAND -S:1_IN_8 -S:CAUSE_2 -S:SCARE -S:SLOW -S:S_ANT -D:An unfortunate individual, who was killed by the incurable -D:disease known as Nurgle's Rot, and was transformed into a -D:rotting demon zombie. It has but one eye, and a single -D:pale horn in its forehead. - N:269:Guardian naga G:n:y I:110:24d11:20:65:120 @@ -6311,34 +5604,6 @@ F:UNDEAD F:WEIRD_MIND D:A pack of skulls animated by necromantic spells. -N:274:Mi-Go -G:I:R -I:120:13d8:20:30:20 -W:15:2:800:80 -E:0:0:0:0:1:0 -O:0:0:0:0 -B:STING:POISON:1d4 -B:BITE:LOSE_STR:1d2 -F:ANIMAL -F:CAN_FLY -F:COLD_BLOOD -F:CTHANGBAND -F:DROP_SKELETON -F:EVIL -F:IM_COLD -F:IM_POIS -F:NO_CONF -F:NO_SLEEP -S:1_IN_6 -S:CONF -S:S_DEMON -S:S_MONSTER -D:"They were pinkish things about five feet long; with crustaceous -D:bodies bearing vast pairs of dorsal fins or membranous wings and -D:several sets of articulate limbs, and with a sort of convoluted -D:ellipsoid, covered with multitudes of very short antenna, where -D:a head would ordinarily be..." - N:275:Giant tarantula G:S:o I:120:10d15:8:32:80 @@ -7405,79 +6670,18 @@ F:WILD_WOOD D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut D:around its prey and releases paralysing enzymes to stop its struggles. -N:318:Chaos beastman -G:H:u -I:110:20d8:20:50:30 -W:18:2:2300:75 -E:0:0:0:0:0:0 -O:25:45:20:0 -B:HIT:CONFUSE:3d5 -B:HIT:EXP_20:3d5 -F:ATTR_ANY -F:ATTR_MULTI +N:320:Giant bronze dragon fly +G:F:U +I:120:3d8:12:20:50 +W:18:2:150:80 +E:0:1:0:2:1:0 +O:0:0:0:0 +B:BITE:CONFUSE:1d6 +F:ANIMAL +F:BASEANGBAND F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:EVIL -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_8 -S:BO_FIRE -S:CONF -S:MISSILE -S:TPORT -D:A truly loathsome thing, twisted by chaos, it is a mixture -D:of several different kinds of creature. - -N:319:Daemonette of Slaanesh -G:u:R -I:120:12d8:20:50:30 -W:18:2:2000:75 -E:1:1:1:0:1:1 -O:30:0:30:40 -B:CLAW:CONFUSE:3d5 -B:CLAW:CONFUSE:3d5 -F:BASH_DOOR -F:DEMON -F:DROP_60 -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_8 -S:BO_COLD -S:BO_FIRE -S:CAUSE_2 -S:CONF -S:SCARE -S:S_DEMON -D:It is minor female demon, vaguely human-like, but with crab-like -D:pincers instead of hands. She wears a rather indecent skimpy -D:leather bikini, moves quickly and casts deadly spells! - -N:320:Giant bronze dragon fly -G:F:U -I:120:3d8:12:20:50 -W:18:2:150:80 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:CONFUSE:1d6 -F:ANIMAL -F:BASEANGBAND -F:BASH_DOOR -F:CAN_FLY -F:FORCE_SLEEP +F:CAN_FLY +F:FORCE_SLEEP F:MORTAL F:NO_CONF F:NO_SLEEP @@ -7605,31 +6809,6 @@ S:BR_SOUN D:Large beating wings support this dazzling insect. A loud buzzing noise D:pervades the air. -N:326:Stunwall -G:#:W -I:110:4d8:45:25:0 -W:18:5:1000:50 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:TOUCH:PARALYZE:10d1 -B:TOUCH:PARALYZE:10d1 -F:CHAR_MULTI -F:COLD_BLOOD -F:EMPTY_MIND -F:HURT_ROCK -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ZANGBAND -D:A sentient section of wall. - N:327:Ghast G:z:u I:120:30d10:40:40:20 @@ -8060,26 +7239,6 @@ F:WILD_WASTE F:WILD_WOOD D:A tall shaggy, furry humanoid, it could call the yeti brother. -N:344:Weir -G:C:W -I:110:10d12:15:30:40 -W:20:2:2010:150 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:BITE:HURT:1d8 -B:BITE:HURT:1d8 -F:ANIMAL -F:BASH_DOOR -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:MORTAL -F:OPEN_DOOR -F:RAND_25 -F:ZANGBAND -D:It is a tracker; half human, half beast. - N:345:Ranger G:p:W I:110:15d11:20:40:40 @@ -8405,35 +7564,6 @@ F:ORC F:UNIQUE D:A large and powerful orc, captain of one of Saruman's orcish regiments. -N:357:Arch-vile -G:u:W -I:130:11d11:100:30:0 -W:21:1:100:300 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:HURT:3d9 -B:CLAW:HURT:3d9 -F:BASH_DOOR -F:COLD_BLOOD -F:DEMON -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_FIRE -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:NO_STUN -F:OPEN_DOOR -F:POWERFUL -F:RAND_50 -F:RES_NETH -F:ZANGBAND -S:1_IN_3 -S:BA_FIRE -D:A pale, corpse-like lesser demon, who moves very fast and spawns evil -D:everywhere. - N:358:Cold vortex G:v:w I:110:9d9:100:30:0 @@ -8577,37 +7707,6 @@ S:DARKNESS D:A great wolf-chieftain whose pack is in the service of the Dark Lord, D:and whose howls strike fear into even the boldest heart. -N:364:Serpent man -G:J:G -I:120:15d10:20:40:20 -W:22:3:900:75 -E:1:1:1:2:1:1 -O:25:20:25:20 -B:BITE:POISON:5d5 -B:BITE:POISON:5d5 -F:BASH_DOOR -F:CAN_SWIM -F:DROP_2D2 -F:DROP_60 -F:DROP_CORPSE -F:EVIL -F:FRIENDS -F:IM_ACID -F:IM_POIS -F:MALE -F:MORTAL -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_8 -S:BA_POIS -S:HOLD -S:SCARE -S:S_MONSTER -D:"They walked lithely and sinuously erect on pre-mammalian -D:members, their pied and hairless bodies bending with great -D:suppleness. There was a loud hissing of formulae as they -D:went to and fro." - N:365:Vampiric mist G:#:D I:110:10d8:12:55:30 @@ -8721,34 +7820,6 @@ F:WEIRD_MIND F:WILD_TOO D:It is a giant scorpion with a sharp stinger. -N:370:Jade monk -G:p:G -I:120:10d9:22:45:5 -W:23:1:1200:100 -E:1:1:1:2:1:1 -O:30:0:60:10 -B:KICK:HURT:4d1 -B:KICK:HURT:4d1 -B:HIT:HURT:4d5 -B:HIT:HURT:4d5 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_60 -F:DROP_CORPSE -F:DROP_SKELETON -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MALE -F:MORTAL -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -D:A monk trained in martial arts. - N:371:Black ooze G:j:D I:90:6d8:10:6:1 @@ -8828,33 +7899,6 @@ F:UNIQUE D:He is also known as the King of Khazad-dum. His ego is renowned to be D:bigger than his head. -N:374:Fleshhound of Khorne -G:C:R -I:120:25d25:15:30:70 -W:30:3:700:150 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CLAW:HURT:4d1 -B:CLAW:HURT:4d1 -B:BITE:HURT:6d1 -B:BITE:HURT:6d1 -F:ANIMAL -F:BASH_DOOR -F:DEMON -F:EVIL -F:IM_FIRE -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:ZANGBAND -D:A revolting canine creature, a huge demon hound with a somewhat -D:reptilian head. - N:375:Dark elven warlock G:h:v I:120:7d10:20:16:20 @@ -9229,26 +8273,6 @@ S:TELE_AWAY S:TPORT D:This creature just might crush you. -N:389:Tyrannosaur -G:R:g -I:120:200d3:20:70:20 -W:24:2:5000:350 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CLAW:HURT:1d6 -B:CLAW:HURT:1d6 -B:BITE:HURT:3d6 -B:BITE:HURT:3d6 -F:ANIMAL -F:BASH_DOOR -F:DROP_CORPSE -F:FORCE_SLEEP -F:MORTAL -F:MOVE_BODY -F:OPEN_DOOR -F:ZANGBAND -D:A horror from prehistory, reawakened by chaos. - N:390:Mummified human G:z:w I:110:17d9:20:34:60 @@ -9332,58 +8356,6 @@ S:FORGET S:SLOW D:A Black Numenorean with a blacker heart. -N:393:It -G:.:W -I:110:77d9:25:80:25 -W:24:3:500:400 -E:0:0:0:0:0:0 -O:10:0:90:0 -B:GAZE:BLIND:8d8 -B:TOUCH:TERRIFY -B:GAZE:EXP_40 -B:TOUCH:EAT_ITEM -F:ATTR_CLEAR -F:CAN_FLY -F:CAN_SPEAK -F:CHAR_CLEAR -F:CHAR_MULTI -F:COLD_BLOOD -F:DROP_1D2 -F:DROP_90 -F:DROP_CORPSE -F:DROP_GOOD -F:DROP_GREAT -F:EMPTY_MIND -F:EVIL -F:FORCE_MAXHP -F:IM_ELEC -F:IM_FIRE -F:INVISIBLE -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:REFLECTING -F:RES_TELE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_4 -S:BLIND -S:BLINK -S:CONF -S:DARKNESS -S:DRAIN_MANA -S:FORGET -S:HEAL -S:SCARE -S:SHRIEK -S:S_HYDRA -S:S_MONSTER -S:S_UNDEAD -S:TELE_AWAY -S:TELE_TO -D:Nobody has ever seen It. - N:394:Banshee G:G:b I:120:6d8:20:24:10 @@ -9432,30 +8404,6 @@ F:WEIRD_MIND D:A hideous centipede covered in slime and with glowing tentacles around its D:head. -N:396:Xiclotlan -G:#:D -I:110:25d13:15:60:10 -W:25:2:6000:60 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:HURT:6d4 -B:CRUSH:HURT:6d4 -B:BITE:HURT:3d2 -F:BASH_DOOR -F:CTHANGBAND -F:EMPTY_MIND -F:IM_ELEC -F:IM_POIS -F:MORTAL -F:NO_CUT -F:RAND_25 -F:SUSCEP_ACID -D:"...a metallically grey tree... about sixteen feet high with -D:very thick cylindrical branches... cylinders further -D:divided into six flat circular extensions... and from the top -D:of what I had taken for a trunk rose a featureless oval... an -D:orifice gaping at the top." - N:397:Silent watcher G:g:s I:110:80d25:60:80:0 @@ -9525,28 +8473,6 @@ S:CONF S:SLOW D:A stumpy figure carved from stone, with glittering eyes. -N:399:Disenchanter beast -G:q:v -I:110:30d30:12:60:12 -W:25:2:2000:250 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:TOUCH:UN_BONUS:1d10 -B:TOUCH:UN_BONUS:1d10 -B:TOUCH:UN_BONUS:1d10 -B:TOUCH:UN_BONUS:1d10 -F:ATTR_MULTI -F:DROP_CORPSE -F:IM_ACID -F:IM_POIS -F:NO_CONF -F:RES_DISE -F:STUPID -F:WEIRD_MIND -F:ZANGBAND -D:It looks like an anteater, and there is a static feeling -D:crackling around its long trunk. - N:400:Dark elven druid G:h:G I:120:20d20:15:75:10 @@ -9605,29 +8531,6 @@ F:REGENERATE F:TROLL D:He is a giant troll with scabrous black skin. -N:402:Black -G:j:d -I:111:12d12:12:65:30 -W:25:1:0:50 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:ENGULF:EXP_40:2d6 -B:ENGULF:EXP_40:2d6 -F:COLD_BLOOD -F:CTHANGBAND -F:EMPTY_MIND -F:EVIL -F:FRIENDS -F:IM_ACID -F:IM_COLD -F:IM_POIS -F:NO_CUT -F:RAND_25 -F:RES_NETH -D:The eldritch blood of Yibb-Tstll is know only as "the Black": it is -D:an amorphous substance, which will suck your life and deliver it to -D:Yibb-Tstll. - N:403:Hill troll G:T:s I:110:21d10:20:65:40 @@ -9715,44 +8618,15 @@ F:RAND_50 F:WEIRD_MIND D:A giant bat which feeds on raw magical energy. -N:407:Gnoph-Keh -G:q:s -I:110:20d8:12:50:25 -W:26:2:1500:95 +N:408:Giant grey ant +G:a:s +I:110:19d8:10:40:40 +W:26:1:700:90 E:0:1:0:2:1:0 -O:20:40:20:10 -B:CLAW:COLD:2d4 -B:CLAW:COLD:2d4 -B:BUTT:HURT:2d9 +O:0:0:0:0 +B:BITE:HURT:2d12 F:ANIMAL -F:AURA_COLD -F:BASH_DOOR -F:CTHANGBAND -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:IM_COLD -F:OPEN_DOOR -F:RAND_25 -F:SUSCEP_FIRE -S:1_IN_8 -S:BA_COLD -S:BO_COLD -S:BO_ICEE -S:BR_COLD -D:A creature with a sharp horn: "the hairy myth-thing of the -D:Greenland ice, that walked sometimes on two legs, sometimes -D:on four, and sometimes on six." - -N:408:Giant grey ant -G:a:s -I:110:19d8:10:40:40 -W:26:1:700:90 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:HURT:2d12 -F:ANIMAL -F:BASEANGBAND +F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:KILL_BODY @@ -10127,27 +9001,6 @@ F:WILD_TOO F:WILD_VOLCANO D:It is a giant beetle wreathed in flames. -N:422:Beast of Nurgle -G:q:y -I:110:15d7:14:50:30 -W:27:2:2300:100 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:TOUCH:POISON:3d3 -B:TOUCH:DISEASE:3d3 -B:BITE:ACID:4d5 -F:BASH_DOOR -F:CAN_FLY -F:DEMON -F:EVIL -F:IM_ACID -F:IM_FIRE -F:IM_POIS -F:WEIRD_MIND -F:ZANGBAND -D:It walks on four legs, but mostly resembles a slug-shaped jelly. -D:It even has two disgusting antennae in its head. Yecch! - N:423:Creeping adamantite coins G:$:G I:120:20d25:5:50:10 @@ -10197,34 +9050,6 @@ F:WILD_TOO F:WILD_WOOD D:A powerful troll form. Venom drips from its needlelike claws. -N:425:Flamer of Tzeentch -G:,:r -I:110:60d15:10:70:20 -W:27:2:0:500 -E:1:0:1:2:0:0 -O:0:0:0:0 -B:ENGULF:FIRE:3d6 -B:ENGULF:FIRE:3d6 -F:AURA_FIRE -F:BASH_DOOR -F:DEMON -F:EVIL -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:RES_PLAS -F:SUSCEP_COLD -F:ZANGBAND -S:1_IN_3 -S:BA_FIRE -S:BO_FIRE -D:It looks like an inverted mushroom, with two flexible arms. - N:426:Roper G:#:D I:115:30d10:30:60:255 @@ -10265,29 +9090,6 @@ D:inspection reveals a glaring eye and powerful tentacles, D:which crush its prey and feed it to the creature's hungry D:mouth. -N:427:Headless -G:H:u -I:110:25d12:20:50:40 -W:27:1:1600:175 -E:1:1:1:2:0:1 -O:0:100:0:0 -B:HIT:HURT:1d8 -B:HIT:HURT:1d8 -F:BASH_DOOR -F:DROP_60 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:OPEN_DOOR -F:WILD_MOUNTAIN -F:WILD_TOO -F:WILD_WASTE -F:ZANGBAND -S:1_IN_6 -S:SCARE -D:Headless humanoid abominations created by a magical mutation. - N:428:Vibration hound G:Z:y I:110:25d10:30:30:0 @@ -10454,28 +9256,6 @@ D:The result of evil experiments, this travesty of nature should never be D:alive. It has three heads - goat, dragon and gorgon - all attached to a D:lion's body. -N:434:Shantak -G:H:D -I:120:25d20:12:55:10 -W:27:2:6000:280 -E:0:1:1:0:1:0 -O:0:0:0:0 -B:BITE:HURT:1d6 -B:BITE:HURT:1d6 -B:BITE:HURT:1d6 -F:ANIMAL -F:CAN_FLY -F:DROP_CORPSE -F:ELDRITCH_HORROR -F:EVIL -F:IM_ACID -F:MORTAL -F:ZANGBAND -S:1_IN_6 -S:HASTE -S:SCARE -D:A scaly bird larger than an elephant, with a horse-like head. - N:435:Colbran G:g:y I:120:80d12:12:80:10 @@ -10537,47 +9317,6 @@ S:MIND_BLAST D:A wraithly snake-like form with the torso of a beautiful woman, it is the D:most powerful of its kind. -N:437:Corpser -G:,:D -I:112:30d15:20:75:120 -W:28:2:0:65 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:HURT:2d8 -B:CRUSH:HURT:2d8 -B:CRUSH:HURT:2d8 -B:CRUSH:HURT:2d8 -F:BASH_DOOR -F:EVIL -F:INVISIBLE -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:WILD_GRASS -F:WILD_TOO -F:ZANGBAND -D:A creature who lives underground and eats surface dwellers that it catches -D:with its poisonous tentacle, which is the only part of the creature that -D:is ever seen. Perhaps it is better not to see the part which remains -D:underground... - -N:438:Fiend of Slaanesh -G:S:R -I:120:15d20:12:50:40 -W:28:4:0:225 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:STING:POISON:8d1 -B:STING:LOSE_STR:8d1 -B:WAIL:TERRIFY:1d4 -F:BASH_DOOR -F:DEMON -F:EVIL -F:ZANGBAND -D:Slaanesh's pet, a large scorpion-like creature with a human face and -D:reptile skin. - N:439:Stairway to Hell G:>:W I:120:15d8:90:40:20 @@ -10973,41 +9712,6 @@ F:UNIQUE D:It looks like a huge spiked roller. It was designed to keep this dungeon D:clean, and you are the biggest spot of dirt in sight. -N:452:Deep one -G:u:g -I:120:35d12:20:50:20 -W:28:5:4000:150 -E:1:1:1:2:1:1 -O:20:80:0:0 -B:CLAW:POISON:2d4 -B:CLAW:POISON:2d4 -B:BITE:HURT:4d4 -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:ELDRITCH_HORROR -F:EVIL -F:FRIENDS -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:RAND_25 -F:RES_TELE -F:RES_WATE -F:WILD_SHORE -F:WILD_TOO -D:"I thought their predominant color was a greyish-green, -D:though they had white bellies. They were mostly shiny and -D:slippery, but the ridges of their backs were scaly. Their -D:forms vaguely suggested the anthropoid, while their heads were -D:the heads of fish, with prodigious bulging eyes that never -D:closed. At the sides of their necks were palpitating gills and -D:their long paws were webbed." - N:453:Basilisk G:R:s I:120:20d30:15:90:30 @@ -11066,31 +9770,6 @@ F:WILD_TOO F:WILD_WASTE D:He is a white troll with powerful clawed hands. -N:455:Dhole -G:w:s -I:110:65d8:14:64:25 -W:29:4:1000:555 -E:0:0:0:0:1:0 -O:0:0:0:0 -B:SPIT:ACID:1d8 -B:ENGULF:ACID:2d8 -B:CRUSH:HURT:4d8 -F:ANIMAL -F:CAN_SWIM -F:CTHANGBAND -F:DROP_CORPSE -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:IM_ACID -F:KILL_WALL -F:MORTAL -S:1_IN_6 -S:BR_ACID -D:A gigantic worm dripping with acid. "...even as he looked, one -D:reared up several hundred feet and leveled a bleached, viscous end -D:at him." - N:456:Archangel G:A:B I:110:60d10:30:68:255 @@ -11165,36 +9844,6 @@ S:S_MONSTER D:A strange creature that disguises itself as an object to lure D:unsuspecting adventurers within reach of its venomous claws. -N:458:Chaos tile -G:.:v -I:120:3d5:30:60:100 -W:29:6:100:200 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:HIT:POISON:3d4 -B:HIT:CONFUSE:3d4 -F:ATTR_ANY -F:ATTR_MULTI -F:CHAR_MULTI -F:COLD_BLOOD -F:EMPTY_MIND -F:FORCE_SLEEP -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ZANGBAND -S:1_IN_4 -S:BLIND -S:BLINK -S:CAUSE_2 -S:CONF -S:MULTIPLY -S:SCARE -S:S_MONSTER -D:It is a floor tile corrupted by chaos. - N:459:Young blue dragon G:d:b I:110:27d10:20:50:70 @@ -11316,32 +9965,6 @@ S:SCARE D:It has a form out of legend. Its still-tender scales are a D:rich bronze hue, and its shape masks its true form. -N:463:Aklash -G:T:R -I:110:30d8:14:64:25 -W:29:4:4000:300 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:HURT:1d6 -B:CLAW:HURT:1d6 -B:BITE:POISON:1d20 -B:CRUSH:HURT:2d9 -F:BASH_DOOR -F:DROP_CORPSE -F:EVIL -F:FRIENDS -F:IM_ACID -F:IM_POIS -F:OPEN_DOOR -F:REGENERATE -F:REGENERATE -F:TROLL -F:ZANGBAND -S:1_IN_9 -S:BR_POIS -D:Pale, bald, fat, hairless troll creatures. Ugly beyond description. -D:Not to mention how bad their breath smells... - N:464:Mithril golem G:g:B I:110:80d15:12:100:10 @@ -11395,32 +10018,6 @@ F:TROLL F:UNDEAD D:It is a troll skeleton animated by dark dweomers. -N:466:Skeletal tyrannosaur -G:R:w -I:120:50d10:20:55:20 -W:30:2:6000:225 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CLAW:HURT:1d8 -B:CLAW:HURT:1d8 -B:BITE:LOSE_CON:4d6 -B:GAZE:TERRIFY -F:ANIMAL -F:BASH_DOOR -F:COLD_BLOOD -F:EMPTY_MIND -F:EVIL -F:IM_COLD -F:IM_POIS -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:UNDEAD -F:ZANGBAND -D:It is the skeleton of a tyrannosaur, animated by dark dweomers. - N:467:Beorn, the Shape-Changer G:q:D I:120:20d70:25:60:25 @@ -11655,32 +10252,6 @@ S:BR_POIS D:A bull-like creature whose skin is made of steel plates. Watch out for D:its deadly breath! -N:476:Gug -G:P:G -I:110:22d11:14:60:30 -W:31:2:1500:210 -E:2:0:2:4:1:1 -O:0:50:50:0 -B:BITE:HURT:10d4 -B:CLAW:HURT:2d7 -B:CLAW:HURT:2d7 -B:CLAW:HURT:2d7 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:EVIL -F:FORCE_SLEEP -F:GIANT -F:IM_ACID -F:IM_POIS -F:OPEN_DOOR -F:TAKE_ITEM -F:ZANGBAND -D:A hideous, beastly, four-armed unclean giant: "...large as a -D:barrel... The eyes jutted two inches from each side, shaded by -D:bony protuberances overgrown of the mouth. That mouth had great -D:yellow fangs and ran from the top to the tally." - N:477:Ghost G:G:w I:120:13d8:20:30:10 @@ -12019,127 +10590,31 @@ D:A lesser relative of the beholder: a globular body with a large toothy mouth, D:a large central eye, and four smaller eyes on stalks protruding from the top D:of its body. -N:489:Bokrug -G:R:v -I:110:11d90:20:70:50 -W:33:7:0:2200 +N:491:Half-troll +G:T:U +I:110:25d14:20:50:50 +W:34:2:3000:400 E:1:1:1:2:1:1 -O:20:0:80:0 -B:BITE:HURT:5d5 -B:CRUSH:HURT:2d10 -B:CRUSH:HURT:2d10 +O:20:80:0:0 +B:CLAW:HURT:1d5 +B:CLAW:HURT:1d5 +B:BITE:HURT:2d6 +B:BITE:HURT:2d6 +F:BASEANGBAND F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:ESCORT -F:ESCORTS +F:DROP_90 +F:DROP_CORPSE +F:DROP_SKELETON F:EVIL -F:FORCE_MAXHP -F:IM_COLD +F:FRIENDS F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_FEAR -F:ONLY_ITEM -F:OPEN_DOOR -F:UNIQUE -S:1_IN_5 -S:BO_WATE -S:CAUSE_3 -S:MIND_BLAST -S:SCARE -S:S_KIN -S:S_UNDEAD -D:A lizard-like Great Old One worshipped by the men of Sarnath. - -N:490:Biclops -G:P:u -I:120:65d20:20:90:20 -W:48:5:3000:1700 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:HURT:10d9 -B:HIT:HURT:10d9 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:EVIL -F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:MOVE_BODY -F:OPEN_DOOR -F:TAKE_ITEM -F:ZANGBAND -S:1_IN_8 -S:ARROW_4 -D:Oh, no! Aaargh! It is the most unnatural, most disgusting -D:creature imaginable: a two-eyed cyclops! This perversion -D:of nature must be exterminated! - -N:491:Half-troll -G:T:U -I:110:25d14:20:50:50 -W:34:2:3000:400 -E:1:1:1:2:1:1 -O:20:80:0:0 -B:CLAW:HURT:1d5 -B:CLAW:HURT:1d5 -B:BITE:HURT:2d6 -B:BITE:HURT:2d6 -F:BASEANGBAND -F:BASH_DOOR -F:DROP_90 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:IM_POIS -F:MALE +F:MALE F:ONLY_ITEM F:OPEN_DOOR F:REGENERATE F:TROLL D:A huge, ugly, half-human in search of plunder. -N:492:Ivory monk -G:p:w -I:120:38d9:22:55:5 -W:33:1:1600:900 -E:1:1:1:2:1:1 -O:40:0:50:10 -B:KICK:HURT:8d1 -B:HIT:HURT:8d4 -B:KICK:HURT:8d1 -B:HIT:HURT:8d4 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_60 -F:DROP_CORPSE -F:DROP_SKELETON -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MALE -F:MORTAL -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -D:A monk trained in the most lethal martial arts. - N:493:Bert the Stone Troll G:T:W I:120:11d100:20:70:50 @@ -12277,77 +10752,6 @@ F:SUSCEP_FIRE F:TROLL D:He is a vicious monster, feared for his ferocity. -N:497:Anti-paladin -G:p:D -I:120:30d20:30:50:30 -W:33:2:2400:450 -E:1:1:1:2:1:1 -O:0:50:50:0 -B:HIT:HURT:2d6 -B:HIT:HURT:1d6 -B:HIT:HURT:1d6 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:HAS_LITE -F:IM_COLD -F:IM_POIS -F:MALE -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:TAKE_ITEM -F:ZANGBAND -S:1_IN_4 -S:BLIND -S:CAUSE_3 -S:DARKNESS -S:FORGET -S:HASTE -S:HOLD -S:SCARE -D:An embodiment of all the cardinal vices, he beholds you scornfully. - -N:498:Chaos master -G:p:v -I:120:30d10:30:50:5 -W:37:3:2300:550 -E:1:1:1:2:1:1 -O:10:60:10:10 -B:HIT:HURT:10d2 -B:KICK:HURT:10d2 -B:PUNCH:HURT:10d2 -B:KICK:HURT:10d2 -F:ATTR_ANY -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_POIS -F:INVISIBLE -F:MALE -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_6 -S:BA_CHAO -S:HEAL -S:S_DEMON -S:S_SPIDER -D:An adept of chaos, feared for his skill of invoking raw Chaos. - N:499:Barrow wight G:W:v I:110:15d10:20:40:10 @@ -12549,35 +10953,6 @@ S:SLOW D:A dragon of great power with control over light and dark, the D:ethereal drake's eyes glare with white hatred from the shadows. -N:505:Groo, the Wanderer -G:p:U -I:120:13d113:20:70:50 -W:35:7:5000:2000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:HURT:9d1 -B:HIT:HURT:6d5 -B:HIT:HURT:25d1 -B:HIT:HURT:6d5 -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_CHOSEN -F:DROP_CORPSE -F:DROP_GOOD -F:FORCE_MAXHP -F:IM_COLD -F:IM_POIS -F:MALE -F:ONLY_ITEM -F:OPEN_DOOR -F:UNIQUE -F:WEIRD_MIND -F:WILD_TOO -F:ZANGBAND -D:He who laughs at Groo's brains will find there is nothing to laugh -D:about... erm, nobody laughs at Groo and lives. - N:506:Fasolt the Giant G:P:u I:110:11d111:20:70:50 @@ -13160,35 +11535,6 @@ S:SCARE S:S_UNDEAD D:Once a powerful ruler, now an even more powerful undead menace. -N:523:Bloodletter of Khorne -G:U:r -I:120:30d8:20:40:30 -W:34:1:0:450 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:EXP_20:13d1 -B:HIT:EXP_20:13d1 -B:HIT:EXP_20:13d1 -F:DEMON -F:DROP_60 -F:DROP_CHOSEN -F:EVIL -F:FORCE_MAXHP -F:FRIENDS -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_FEAR -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:ZANGBAND -D:Slender, red-skinned demons twisting in nightmarish shapes. -D:They are armed with hellblades, which will suck the life from -D:your body. - N:524:Giant grey scorpion G:S:s I:120:18d20:12:50:40 @@ -13496,24 +11842,6 @@ D:It is a form that screams its presence against the eye. Death incarnate, D:its hideous black body seems to struggle against reality as the universe D:itself struggles to banish it. -N:535:Leng spider -G:S:v -I:120:16d20:12:50:40 -W:35:4:600:250 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:POISON:1d6 -B:STING:POISON:1d6 -F:ANIMAL -F:BASH_DOOR -F:CTHANGBAND -F:DROP_CORPSE -F:ELDRITCH_HORROR -F:FRIENDS -F:SPIDER -F:WEIRD_MIND -D:Bloated purple spiders with long, bristly legs. - N:536:Gauth G:e:s I:110:15d20:20:50:20 @@ -13944,36 +12272,6 @@ F:UNIQUE D:A massive and cruel troll of great power, drool slides caustically down D:his muscular frame. Despite his bulk, he strikes with stunning speed. -N:552:Mist giant -G:#:B -I:120:35d10:20:50:50 -W:36:2:0:450 -E:0:0:0:0:0:0 -O:10:90:0:0 -B:CRUSH:HURT:4d8 -B:CRUSH:HURT:4d8 -B:CRUSH:HURT:4d8 -B:BITE:EXP_40:3d9 -F:BASH_DOOR -F:CAN_FLY -F:CTHANGBAND -F:DROP_60 -F:EVIL -F:FORCE_MAXHP -F:GIANT -F:IM_POIS -F:NO_CUT -F:OPEN_DOOR -F:SMART -F:WILD_TOO -D:"Two eyes, the colour of a thin, yellow wine, were set high in the -D:thing's body; though it had no separate head. A mouthing, obscene slit, -D:filled with fangs lay just beneath the eyes. It had no nose or ears... -D:Four appendages sprang from its upper parts and its lower body -D:slithered along the ground, unsupported by any limbs... incredibly -D:disgusting to behold and its amorphous body gave off a stench of death -D:and decay..." - N:553:Phantom G:G:v I:120:20d25:30:30:20 @@ -14113,47 +12411,6 @@ S:SCARE D:It has a form out of legend. Beautiful scales of shimmering D:and magical colours cover it. -N:557:Raal's Tome of Destruction -G:?:r -I:120:50d15:20:150:15 -W:36:4:0:1500 -E:0:0:0:0:0:0 -O:20:0:80:0 -F:CHAR_MULTI -F:COLD_BLOOD -F:DROP_90 -F:DROP_GOOD -F:EMPTY_MIND -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:NEVER_BLOW -F:NEVER_MOVE -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:RES_NETH -F:RES_TELE -F:SUSCEP_FIRE -F:ZANGBAND -S:1_IN_2 -S:BA_POIS -S:BO_ACID -S:BO_MANA -S:BO_WATE -S:BR_COLD -S:BR_FIRE -S:BR_NETH -S:BR_POIS -D:A sentient arcane tome casting spells with malevolent intent. - N:558:Colossus G:g:G I:110:30d100:15:150:10 @@ -14340,30 +12597,6 @@ S:SCARE D:It has a form out of legend. Its still-tender scales are a D:deepest red hue. Heat radiates from its form. -N:564:Nightblade -G:h:D -I:120:19d13:20:60:10 -W:36:2:1600:315 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:POISON:3d4 -B:HIT:POISON:3d4 -B:HIT:LOSE_CON:3d4 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:HURT_LITE -F:INVISIBLE -F:MALE -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -D:A dark elven assassin, so stealthy that he is almost impossible to see. - N:565:Trapper G:.:w I:120:60d10:30:75:10 @@ -14469,57 +12702,17 @@ S:DARKNESS S:S_DEMON D:An ugly demon with insect-like extremities and large bulbous eyes. -N:569:Elder thing -G:u:G -I:110:35d10:10:70:50 -W:36:3:0:800 +N:570:Ice elemental +G:E:w +I:110:35d10:10:60:90 +W:37:3:0:650 E:0:0:0:0:0:0 O:0:0:0:0 -B:CRUSH:HURT:4d6 -B:CRUSH:HURT:4d6 -B:CRUSH:HURT:4d6 -B:TOUCH:LOSE_WIS -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_SLEEP -F:IM_ACID -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:RES_TELE -S:1_IN_4 -S:BA_NUKE -S:BA_POIS -S:CAUSE_4 -S:CONF -S:SCARE -S:S_DEMON -S:S_UNDEAD -S:TELE_AWAY -D:"...some ridged barrel-shaped objects with thin -D:horizontal arms radiating spoke-like from a central ring and with -D:vertical knobs or bulbs projecting from the head and base of the -D:barrel. Each of these knobs was the hub of a system of five long, -D:flat, triangularly tapering arms arranged around it like the arms -D:of a starfish." - -N:570:Ice elemental -G:E:w -I:110:35d10:10:60:90 -W:37:3:0:650 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:TOUCH:COLD:4d3 -B:HIT:HURT:4d6 -B:TOUCH:COLD:4d3 -F:AURA_COLD -F:BASEANGBAND +B:TOUCH:COLD:4d3 +B:HIT:HURT:4d6 +B:TOUCH:COLD:4d3 +F:AURA_COLD +F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -14669,23 +12862,6 @@ S:TELE_TO D:A mighty warrior from the east, Lorgan hates everything that he cannot D:control. -N:574:Chaos spawn -G:e:s -I:110:21d21:20:50:20 -W:38:2:1900:700 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:GAZE:HURT:10d10 -B:GAZE:UN_BONUS:5d2 -B:GAZE:EXP_40:5d2 -B:GAZE:PARALYZE:5d2 -F:BASH_DOOR -F:CAN_FLY -F:EVIL -F:FORCE_MAXHP -F:ZANGBAND -D:It has two eyestalks and a large central eye. Its gaze can kill. - N:575:Mummified troll G:z:w I:110:25d10:20:50:50 @@ -14780,88 +12956,6 @@ S:TELE_LEVEL S:TELE_TO D:It is a skeletal form dressed in robes. It looks evil and devious... -N:578:Chaos butterfly -G:I:G -I:120:60d10:40:60:10 -W:37:2:0:1000 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:HURT:3d7 -B:CLAW:HURT:3d7 -B:CRUSH:HURT:10d5 -F:ATTR_ANY -F:ATTR_MULTI -F:BASH_DOOR -F:CAN_FLY -F:FORCE_SLEEP -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:WEIRD_MIND -F:ZANGBAND -S:1_IN_9 -S:BR_CHAO -S:BR_CONF -D:With fractal patterns on its wings, it is clearly one of those butterflies -D:that mathematicians keep talking about - the ones that flap their wings on the -D:other side of the world to cause storms here. Now's your chance to stop it... - -N:579:Time elemental -G:E:G -I:120:35d10:90:70:10 -W:39:2:0:1000 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:TOUCH:TIME:3d4 -B:TOUCH:TIME:3d4 -F:CAN_FLY -F:EMPTY_MIND -F:IM_ACID -F:IM_ELEC -F:IM_FIRE -F:IM_FIRE -F:IM_POIS -F:KILL_ITEM -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:PASS_WALL -F:RAND_50 -F:ZANGBAND -S:1_IN_7 -S:BR_TIME -S:SLOW -D:You have not seen it yet. - -N:580:Flying polyp -G:~:R -I:120:35d10:90:70:10 -W:37:2:0:1000 -E:3:0:3:6:1:0 -O:0:0:0:0 -B:CRUSH:PARALYZE:8d4 -B:CRUSH:PARALYZE:8d4 -B:CRUSH:PARALYZE:8d4 -F:CAN_FLY -F:CTHANGBAND -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:IM_ACID -F:IM_COLD -F:IM_POIS -F:INVISIBLE -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:PASS_WALL -F:RES_DISE -S:1_IN_7 -S:BR_WALL -D:"They were only partly material and had the power of aerial motion, -D:despite the absence of wings... Suggestions of monstrous plasticity -D:and of temporary lapses of visibility..." - N:581:The Queen Ant G:a:v I:120:15d100:30:100:10 @@ -14935,37 +13029,6 @@ D:A strange ball of glowing light. It disappears and reappears and seems to D:draw you to it. You seem somehow compelled to stand still and watch its D:strange dancing motion. -N:583:Shan -G:I:B -I:120:20d8:20:120:20 -W:37:4:0:250 -E:0:0:0:0:0:0 -O:0:0:0:0 -F:ANIMAL -F:CAN_FLY -F:COLD_BLOOD -F:CTHANGBAND -F:EVIL -F:IM_COLD -F:IM_POIS -F:NEVER_BLOW -F:NO_CONF -F:NO_SLEEP -S:1_IN_2 -S:CONF -S:DRAIN_MANA -S:FORGET -S:HOLD -S:MIND_BLAST -S:SHRIEK -D:"Those huge lidless eyes which stared with hate at me, the jointed -D:tendrils which seemed to twist from the head in cosmic rhythms, -D:the ten legs, covered with black shining tentacles and folded into -D:the pallid underbelly, and the semi-circular ridged wings covered -D:with triangular scales -- all this cannot convey the soul-ripping -D:horror of the shape which darted at me. I saw the three mouths -D:of the thing move moistly, and then it was upon me." - N:584:Magma elemental G:E:o I:110:35d10:10:70:90 @@ -15284,42 +13347,6 @@ S:CONF S:SCARE D:A large dragon, scales shimmering many colours. -N:594:Sky whale -G:~:G -I:110:80d10:20:75:30 -W:38:6:4000:1750 -E:0:0:0:0:1:0 -O:50:50:0:0 -B:CRUSH:HURT:20d2 -B:CRUSH:HURT:20d2 -B:CRUSH:HURT:20d2 -F:BASH_DOOR -F:CAN_FLY -F:DROP_2D2 -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GOOD -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:RES_DISE -F:RES_NEXU -F:RES_TELE -F:SMART -F:ZANGBAND -S:1_IN_9 -S:BRAIN_SMASH -S:CONF -S:FORGET -S:SCARE -S:SHRIEK -S:TELE_AWAY -S:TELE_TO -D:A vastly intelligent whale-like being from the stars. - N:595:Draebor, the Imp G:u:v I:120:19d99:12:80:50 @@ -15367,51 +13394,6 @@ S:TELE_TO S:TPORT D:An intensely irritating git of a monster. -N:596:Mother Hydra -G:u:v -I:120:25d99:12:80:50 -W:40:3:30000:3250 -E:0:1:0:2:2:0 -O:0:50:50:0 -B:CLAW:POISON:8d4 -B:CLAW:POISON:8d4 -B:BITE:HURT:8d8 -F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:DROP_GOOD -F:ELDRITCH_HORROR -F:ESCORT -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:NO_CONF -F:ONLY_ITEM -F:POWERFUL -F:RES_TELE -F:RES_WATE -F:UNIQUE -S:1_IN_7 -S:BA_ACID -S:BA_WATE -S:BO_ACID -S:DARKNESS -S:S_DEMON -S:S_HYDRA -D:The queen of the deep ones. "Vast, Polyphemus-like, and loathsome, it -D:darted like a stupendous monster of nightmares..." - N:597:Death knight G:p:D I:120:60d10:20:100:10 @@ -15797,101 +13779,6 @@ S:SCARE D:A figure that seems made of void, its strangely human shape is cloaked in D:shadow. It reaches out at you. -N:608:Nightgaunt -G:U:D -I:110:24d10:20:50:80 -W:38:2:0:1000 -E:0:0:0:0:0:0 -O:50:0:50:0 -B:STING:LOSE_STR:1d5 -B:TOUCH:PARALYZE:3d4 -F:BASH_DOOR -F:CAN_FLY -F:DEMON -F:DROP_60 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_FIRE -F:IM_POIS -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:ZANGBAND -S:1_IN_7 -S:BLIND -S:BO_FIRE -S:CONF -D:It is a black, horned humanoid with wings. - -N:609:Baron of hell -G:U:U -I:110:150d12:10:130:40 -W:38:3:0:1000 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:CLAW:HURT:11d2 -B:CLAW:HURT:11d2 -B:CLAW:HURT:22d1 -F:BASH_DOOR -F:DEMON -F:EVIL -F:FORCE_MAXHP -F:HAS_LITE -F:IM_FIRE -F:IM_FIRE -F:IM_POIS -F:MALE -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:OPEN_DOOR -F:RES_PLAS -F:RES_TELE -F:ZANGBAND -S:1_IN_2 -S:BO_PLAS -D:A minor demon lord with a goat's head, tough to kill. - -N:610:Scylla -G:M:B -I:125:100d20:20:100:70 -W:42:1:15000:13000 -E:0:1:0:2:2:0 -O:0:0:0:0 -B:BITE:POISON:10d3 -B:BITE:POISON:10d3 -B:BITE:POISON:10d3 -B:BITE:POISON:10d3 -F:ANIMAL -F:AQUATIC -F:BASH_DOOR -F:COLD_BLOOD -F:DROP_2D2 -F:DROP_4D2 -F:DROP_CORPSE -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:ONLY_GOLD -F:RES_WATE -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BR_FIRE -S:BR_POIS -S:CONF -S:SCARE -S:S_HYDRA -D:A many-headed sea-monster, this foul creature preys on all those who -D:escape the clutches of Charybdis. - N:611:Monastic lich G:L:u I:120:12d100:30:80:30 @@ -16182,47 +14069,6 @@ S:CONF S:SCARE D:A huge draconic form enveloped in clouds of poisonous vapour. -N:619:Chthonian -G:w:D -I:120:100d10:20:90:20 -W:39:2:12000:2300 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:SHATTER:3d11 -B:CRUSH:SHATTER:3d11 -B:TOUCH:LOSE_CON:1d2 -B:TOUCH:LOSE_CON:1d2 -F:CAN_SWIM -F:CTHANGBAND -F:DROP_2D2 -F:DROP_4D2 -F:DROP_CORPSE -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:KILL_WALL -F:ONLY_GOLD -F:RES_PLAS -F:RES_TELE -S:1_IN_5 -S:BRAIN_SMASH -S:CONF -S:FORGET -S:HASTE -S:HEAL -S:HOLD -S:MIND_BLAST -S:SCARE -S:S_DEMON -D:"Flowing tentacles and a pulpy gray-black elongated sack of a body... -D:no distinguishing features at all other than the reaching, groping -D:tentacles. Or was there -- yes! -- a lump in the upper body of -D:the thing... a container of sorts for the brain, ganglia, or -D:whichever diseased organ governed this horror's loathsome life!" - N:620:Eldrak G:T:r I:110:75d10:20:80:50 @@ -16388,68 +14234,6 @@ S:CONF S:SCARE D:A huge draconic form. Pools of acid melt the floor around it. -N:625:Weird fume -G:#:v -I:120:35d10:100:40:0 -W:40:2:0:800 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:ENGULF:CONFUSE:8d4 -B:ENGULF:CONFUSE:8d4 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_ELEC -F:BASH_DOOR -F:CAN_FLY -F:EMPTY_MIND -F:FORCE_SLEEP -F:IM_ELEC -F:IM_FIRE -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:POWERFUL -F:RAND_25 -F:RAND_50 -F:RES_NEXU -F:ZANGBAND -S:1_IN_6 -S:BR_CHAO -S:BR_NEXU -S:BR_NUKE -D:A swirling spiral of mist, constantly changing its appearance. - -N:626:Spawn of Ubbo-Sathla -G:j:v -I:120:30d10:100:40:0 -W:40:5:0:300 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:ACID:8d4 -B:CRUSH:ACID:8d4 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_ELEC -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:EMPTY_MIND -F:EVIL -F:FORCE_SLEEP -F:IM_ELEC -F:IM_FIRE -F:KILL_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:POWERFUL -F:RAND_25 -F:RES_NEXU -S:MULTIPLY -D:Weird, jelly like creatures. No two look the same. - N:627:Fat Man G:{:D I:120:14d14:10:80:12 @@ -16478,52 +14262,6 @@ F:RES_TELE F:UNIQUE D:A shining machine of death and destruction. -N:628:Malekith the Accursed -G:h:v -I:125:25d100:20:70:10 -W:44:2:3500:7500 -E:1:1:1:2:1:1 -O:50:0:50:0 -B:HIT:HURT:12d9 -B:HIT:HURT:12d9 -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_4D2 -F:DROP_90 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:HURT_LITE -F:MALE -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_2 -S:BA_NETH -S:BLIND -S:CAUSE_3 -S:CONF -S:DARKNESS -S:FORGET -S:HEAL -S:HOLD -S:MIND_BLAST -S:S_DEMON -S:S_KIN -S:S_MONSTER -S:S_MONSTERS -S:TELE_TO -S:TPORT -D:One of the oldest and most powerful dark elves, Malekith is a master -D:sorcerer devoted to evil. The left side of his face is pale, and the other -D:is dark. His hair is long and white. - N:629:Shadowfax, steed of Gandalf G:q:v I:130:30d100:20:100:50 @@ -17092,38 +14830,6 @@ D:A huge crystalline dragon. Its claws could cut you to shreds and its D:teeth are razor sharp. Strange colours ripple through it as it moves in D:the light. -N:647:Wyrd sister -G:p:v -I:125:50d11:20:60:10 -W:40:4:1600:1900 -E:1:1:1:2:1:1 -O:10:0:80:0 -B:CLAW:HURT:2d6 -B:CLAW:HURT:2d6 -B:CLAW:HURT:2d8 -F:BASH_DOOR -F:DROP_2D2 -F:DROP_SKELETON -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_2 -S:BA_CHAO -S:BLIND -S:CONF -S:DARKNESS -S:SCARE -S:S_DEMON -D:This old crone is rumoured to be a witch of chaos... but you don't -D:really believe in witches, do you? - N:648:Vrock G:U:s I:110:40d10:20:50:80 @@ -17191,87 +14897,6 @@ S:S_DEMON D:It is a demon of small stature, but its armoured frame moves with D:lightning speed and its powers make it a tornado of death and destruction. -N:650:Giganto, the Gargantuan -G:~:s -I:110:80d10:20:75:30 -W:38:6:8000:1750 -E:0:1:0:0:1:0 -O:60:40:0:0 -B:CRUSH:HURT:30d2 -B:CRUSH:HURT:30d2 -B:CRUSH:HURT:30d2 -F:BASH_DOOR -F:CAN_SWIM -F:DROP_2D2 -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:MORTAL -F:RES_WATE -F:SMART -F:UNIQUE -F:WEIRD_MIND -F:WILD_OCEAN -F:ZANGBAND -S:1_IN_9 -S:BA_WATE -S:BR_NUKE -D:A gargantuan mutant whale, who has grown legs that enable it to walk -D:on dry land as well. - -N:651:Strygalldwir -G:U:W -I:120:12d100:90:60:10 -W:41:3:5000:8000 -E:1:1:1:2:1:1 -O:20:0:80:0 -B:CLAW:HURT:5d5 -B:CLAW:HURT:5d5 -B:HIT:LOSE_STR:4d4 -B:TOUCH:EXP_80:8d1 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:COLD_BLOOD -F:DEMON -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_POIS -F:INVISIBLE -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BLIND -S:BO_ACID -S:BO_NETH -S:CAUSE_3 -S:DARKNESS -S:FORGET -S:HOLD -S:MIND_BLAST -S:SCARE -S:S_DEMON -D:"it was well over six feet in height, with great branches of antlers -D:growing out of its forehead. Nude, its flesh was a uniform ash-gray -D:in color. It appeared to be sexless, and it had gray, leathery wings -D:extending far out behind it." - N:652:Fallen angel G:A:s I:130:100d25:30:90:255 @@ -17316,30 +14941,6 @@ S:S_DEMON S:TELE_TO D:An angelic being, who was mighty once, but dared defy its Creator. -N:653:Giant headless -G:H:u -I:110:30d12:20:50:40 -W:41:2:4000:900 -E:1:1:1:2:1:0 -O:0:100:0:0 -B:HIT:HURT:4d8 -B:HIT:HURT:4d8 -B:HIT:HURT:4d8 -F:BASH_DOOR -F:DROP_60 -F:DROP_90 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FRIENDS -F:OPEN_DOOR -F:ZANGBAND -S:1_IN_6 -S:BA_NUKE -S:BLIND -S:SCARE -D:Giant headless humanoid abominations created by a magical mutation. - N:654:Judge Fire G:s:R I:120:18d100:90:70:10 @@ -17391,45 +14992,6 @@ S:TPORT D:One of the Dark Judges, he has come to punish your crime of living. D:He looks like a skeleton enveloped in flames. -N:655:Ubbo-Sathla, the Unbegotten Source -G:j:W -I:120:20d100:90:80:10 -W:41:3:0:13500 -E:0:0:0:0:0:0 -O:30:50:0:10 -B:CRUSH:ACID:5d5 -B:HIT:POISON:5d5 -B:CRUSH:ACID:5d5 -B:HIT:POISON:5d5 -F:BASH_DOOR -F:CAN_SPEAK -F:COLD_BLOOD -F:CTHANGBAND -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_POIS -F:KILL_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:NO_STUN -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:SUSCEP_FIRE -F:SUSCEP_FIRE -F:UNIQUE -D:"There, in the gray beginning of Earth, the formless mass that was -D:Ubbo-Sathla reposed amid the slime and the vapors. Headless, -D:without organs or members..." - N:656:Judge Mortis G:z:G I:120:18d100:90:70:10 @@ -17565,50 +15127,17 @@ S:TELE_TO D:A skeletal form wrapped in robes. Powerful magic crackles along its D:bony fingers. -N:659:Byakhee -G:U:D -I:110:40d10:20:40:80 -W:41:3:1300:1500 -E:0:0:0:0:0:0 -O:0:50:50:0 -B:CLAW:LOSE_STR:3d4 -B:BITE:EXP_20:3d4 -F:BASH_DOOR -F:CAN_FLY -F:CTHANGBAND -F:DEMON -F:DROP_2D2 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:FRIENDS -F:IM_FIRE -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -S:1_IN_9 -S:BO_FIRE -S:CONF -S:S_DEMON -D:"There flapped rhythmically a horde of tame, trained, hybrid -D:winged things... not altogether crows, nor moles, nor buzzards, -D:nor ants, nor decomposed human beings, but something I cannot -D:and must not recall." - -N:660:Eol, the Dark Elf -G:h:D -I:130:80d30:20:100:60 -W:49:2:1400:25000 -E:1:1:1:2:1:1 -O:10:40:40:10 -A:84:50 -B:HIT:HURT:3d8 -B:HIT:HURT:3d8 -B:HIT:HURT:3d8 -F:BASEANGBAND +N:660:Eol, the Dark Elf +G:h:D +I:130:80d30:20:100:60 +W:49:2:1400:25000 +E:1:1:1:2:1:1 +O:10:40:40:10 +A:84:50 +B:HIT:HURT:3d8 +B:HIT:HURT:3d8 +B:HIT:HURT:3d8 +F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -17698,83 +15227,6 @@ D:Never a more heavenly being have you seen. The very holiness of its D:presence makes you deeply respect it. Few creatures can match the powers D:of an Archon; fewer still live to tell the tale after attacking one. -N:662:Formless spawn of Tsathoggua -G:U:D -I:110:22d20:20:40:80 -W:41:2:0:1850 -E:0:0:0:0:0:0 -O:35:45:0:10 -B:HIT:ACID:2d4 -B:HIT:ACID:2d4 -B:CRUSH:HURT:3d4 -B:BITE:ACID:6d6 -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_90 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:REGENERATE -F:RES_TELE -F:SUSCEP_FIRE -S:1_IN_9 -S:BO_ACID -S:BO_FIRE -S:DARKNESS -S:MIND_BLAST -S:S_DEMON -D:"...living things that oozed along stone channels... -D:But they were not toads like Tsathoggua himself. Far worse -- -D:they were amorphous lumps of viscous black slime that took -D:temporary shapes for various purposes." - -N:663:Hunting horror -G:U:D -I:110:30d17:20:90:80 -W:42:2:0:2300 -E:0:0:0:0:0:0 -O:45:35:0:10 -B:BITE:LOSE_DEX:1d3 -B:BITE:POISON:1d3 -B:CRUSH:HURT:9d4 -F:BASH_DOOR -F:CAN_FLY -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_FIRE -F:IM_POIS -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -S:1_IN_9 -S:BLIND -S:BR_DARK -S:CONF -S:S_DEMON -D:"And in the air there were great viperine creatures, -D:which had curiously distorted heads, and grotesquely great -D:clawed appendages, supporting themselves with ease by the aid -D:of black rubbery wings of singularly monstrous dimensions." - N:664:Undead beholder G:e:u I:120:27d100:30:100:10 @@ -17971,149 +15423,6 @@ S:BR_NEXU S:BR_POIS D:A large basilisk, whose shape resembles that of a great wyrm. -N:669:Charybdis -G:~:r -I:120:20d100:20:100:70 -W:42:1:15000:13000 -E:0:0:0:0:1:0 -O:50:50:0:0 -B:ENGULF:HURT:10d8 -B:ENGULF:HURT:10d8 -B:ENGULF:HURT:10d8 -F:AQUATIC -F:COLD_BLOOD -F:DROP_3D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NEVER_MOVE -F:NO_STUN -F:ONLY_ITEM -F:POWERFUL -F:RES_WATE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BA_WATE -D:A monstrous dweller of the depths; its hungry maw has been the doom -D:of innumerable sailors! - -N:670:Jack of Shadows -G:p:s -I:150:30d100:70:150:4 -W:60:4:2300:10000 -E:1:1:1:2:1:1 -O:20:80:0:0 -B:HIT:HURT:5d10 -B:HIT:HURT:5d10 -B:HIT:EAT_ITEM:2d10 -B:HIT:EAT_ITEM:2d10 -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_3D2 -F:DROP_CORPSE -F:DROP_GOOD -F:DROP_GREAT -F:DROP_SKELETON -F:FORCE_MAXHP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:MORTAL -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:REFLECTING -F:REGENERATE -F:RES_TELE -F:SMART -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_DARK -S:BLIND -S:CONF -S:HASTE -S:HEAL -D:Deriving his strength from the shadows, this king of thieves -D:steals only for the challenge. - -N:671:Zephyr Lord -G:W:v -I:130:80d10:20:70:10 -W:43:2:600:3000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:EXP_20:8d2 -B:HIT:LOSE_STR:8d2 -B:HIT:LOSE_CON:8d2 -F:ATTR_MULTI -F:BASH_DOOR -F:CAN_FLY -F:DROP_4D2 -F:DROP_90 -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:ONLY_ITEM -F:OPEN_DOOR -F:SMART -F:UNDEAD -F:ZANGBAND -S:1_IN_5 -S:SHRIEK -S:S_HOUND -D:An undead master of the vicious Zephyr hounds. - -N:672:Juggernaut of Khorne -G:g:D -I:120:90d19:12:90:10 -W:43:3:6000:2500 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:BUTT:HURT:6d6 -B:CRUSH:HURT:8d6 -B:CRUSH:HURT:8d6 -B:BUTT:HURT:6d6 -F:BASH_DOOR -F:COLD_BLOOD -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_ITEM -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:REFLECTING -F:ZANGBAND -D:A great, vicious beast whose flesh is made of steel and whose -D:blood is fire. It charges at you ignoring everything else. - N:673:Mumak G:q:s I:110:90d10:20:55:100 @@ -18257,89 +15566,6 @@ D:A huge dragon emanating from the ethereal plane, this terrible creature is D:a master of light and dark. Its form disappears from sight as it cloaks D:itself in unearthly shadows. -N:677:Dark young of Shub-Niggurath -G:U:g -I:120:12d100:20:75:80 -W:43:2:0:5000 -E:0:0:0:0:0:0 -O:0:40:30:20 -B:CRUSH:HURT:5d6 -B:CRUSH:HURT:5d6 -B:BITE:LOSE_STR:1d6 -B:BITE:LOSE_STR:1d6 -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_FIRE -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_TELE -S:1_IN_9 -S:BLIND -S:CAUSE_2 -S:HEAL -S:S_DEMON -D:"Something black in the road, something that wasn't a tree. -D:Something big and black and ropy, just squatting there, waiting, -D:with ropy arms squirming and reaching... It came crawling up the -D:hillside... and it was the black thing of my dreams... that black, -D:ropy, slimy jelly tree-thing out of the woods. It crawled up and it -D:flowed up on its hoofs and mouths and snaky arms." - -N:678:Colour out of space -G:.:v -I:120:12d100:20:100:10 -W:43:2:0:8000 -E:0:0:0:0:0:0 -O:35:35:10:10 -B:TOUCH:LOSE_ALL:7d6 -B:TOUCH:LOSE_ALL:7d6 -F:ATTR_ANY -F:ATTR_MULTI -F:CAN_FLY -F:CHAR_CLEAR -F:COLD_BLOOD -F:CTHANGBAND -F:DROP_1D2 -F:DROP_4D2 -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:ONLY_ITEM -F:PASS_WALL -F:RAND_25 -F:SMART -S:1_IN_9 -S:BR_DISE -S:BR_NETH -S:DRAIN_MANA -S:TPORT -D:"The shaft of phosphorescence from the well... was no longer shining -D:out, it was pouring out; and as the shapeless stream of unplaceable -D:colour left the well it seemed to flow directly into the sky." - N:679:Quaker, Master of Earth G:E:u I:110:28d100:10:97:90 @@ -18379,253 +15605,10 @@ S:BO_ACID D:A towering stone elemental stands before you. The walls and ceiling are D:reduced to rubble as Quaker advances. -N:680:Death leprechaun -G:h:D -I:120:6d6:8:13:8 -W:44:6:0:85 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:TOUCH:EXP_40:1d10 -B:TOUCH:EAT_GOLD -B:TOUCH:EAT_ITEM -F:COLD_BLOOD -F:EVIL -F:HURT_LITE -F:INVISIBLE -F:MALE -F:NO_CUT -F:OPEN_DOOR -F:RAND_25 -F:RES_NETH -F:SMART -F:TAKE_ITEM -F:UNDEAD -F:ZANGBAND -S:1_IN_6 -S:BLINK -S:CAUSE_3 -S:MULTIPLY -S:TELE_TO -S:TPORT -D:Nasty undead little creatures. They are chanting the name of the -D:sinister wizard who created them: 'Bruce! Bruce..!' - -N:681:Chaugnar Faugn, Horror from the Hills -G:q:D -I:110:20d100:10:125:90 -W:44:4:0:6250 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:HURT:10d10 -B:CRUSH:HURT:10d10 -B:BITE:LOSE_CON:8d2 -B:BITE:LOSE_CON:8d1 -F:CAN_SPEAK -F:CTHANGBAND -F:DEMON -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_ROCK -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:NEVER_MOVE -F:NO_CONF -F:NO_FEAR -F:POWERFUL -F:UNIQUE -S:1_IN_6 -S:BRAIN_SMASH -S:CAUSE_3 -S:CAUSE_4 -S:CONF -S:FORGET -S:HOLD -S:MIND_BLAST -S:SCARE -S:S_DEMON -S:S_MONSTERS -D:"The ears were webbed and tentacled, the trunk terminated in -D:a huge flaring disk at least a foot in diameter... Its forelimbs -D:were bent stiffly at the elbow, and its hands... rested palms -D:upward on its lap." - -N:682:Lloigor -G:v:B -I:120:100d15:20:100:20 -W:44:2:0:6000 -E:0:0:0:0:0:0 -O:90:0:10:0 -B:ENGULF:LOSE_CON:4d10 -B:ENGULF:LOSE_CON:4d10 -B:ENGULF:LOSE_CON:4d10 -F:BASH_DOOR -F:CAN_FLY -F:CTHANGBAND -F:DROP_2D2 -F:DROP_4D2 -F:ELDRITCH_HORROR -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:MORTAL -F:MOVE_BODY -F:NO_CUT -F:OPEN_DOOR -F:PASS_WALL -F:POWERFUL -F:SMART -S:1_IN_4 -S:BLIND -S:BLINK -S:BR_GRAV -S:BR_WALL -S:MIND_BLAST -S:S_KIN -S:TELE_AWAY -D:"Invisible ones from the stars... They sometimes took forms... -D:but existed as vortices of power in their natural state." - -N:683:Utgard-Loke -G:P:v -I:120:40d100:30:125:15 -W:44:3:0:13500 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:COLD:12d12 -B:HIT:COLD:12d12 -B:HIT:COLD:12d12 -B:HIT:COLD:12d12 -F:AURA_COLD -F:BASH_DOOR -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:IM_COLD -F:MALE -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:SMART -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BR_COLD -S:HEAL -S:S_KIN -S:TELE_TO -D:A frost giant chieftain, unusually smart for a giant. - -N:684:Quachil Uttaus, Treader of the Dust -G:z:D -I:120:50d66:30:80:15 -W:44:3:0:20000 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:CLAW:HURT:50d1 -B:TOUCH:TIME:1d50 -B:TOUCH:TIME:1d50 -F:BASH_DOOR -F:CTHANGBAND -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:DROP_GREAT -F:ELDRITCH_HORROR -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:KILL_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:RES_NETH -F:SMART -F:TAKE_ITEM -F:UNDEAD -F:UNIQUE -S:1_IN_3 -S:BR_TIME -S:HASTE -S:HEAL -S:SLOW -D:"It was a figure no larger than a young child, but severe and -D:shriveled as some millenial mummy. Its hairless head, its -D:unfeatured face, borne on a neck of skeleton thinness, were -D:lined with a thousand reticulated wrinkles. The body was like -D:that of some monstrous, withered abortion that had never drawn -D:breath. The pipelike arms, ending in bony claws, were outhrust as if -D:enclosed in a posture of an eternal dreadful grasping." - -N:685:Shoggoth -G:j:D -I:140:50d20:20:80:20 -W:44:2:0:2500 -E:0:0:0:0:0:0 -O:30:70:0:0 -B:CRUSH:ACID:5d6 -B:CRUSH:ACID:5d6 -B:CRUSH:ACID:5d6 -B:CRUSH:HURT:9d9 -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DROP_2D2 -F:DROP_60 -F:DROP_90 -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:HURT_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:POWERFUL -F:REGENERATE -F:RES_PLAS -F:RES_TELE -D:"The nightmare, plastic column of fetid, black iridescence oozed -D:tightly onward... A shapeless congerie of protoplasmic bubbles, -D:faintly self-luminous and with myriads of temporary eyes forming -D:and unforming as pustules of greenish light all over the -D:tunnel-filling front that bore down upon us, crushing the frantic -D:penguins and slithering over glistening floor that it and its -D:kind had swept so evilly free of all litter. Still came that eldritch -D:mocking cry -- 'Tekeli-li! Tekeli-li!'" - -N:686:Judge Death -G:W:D -I:120:45d50:90:90:10 -W:43:3:0:14000 +N:686:Judge Death +G:W:D +I:120:45d50:90:90:10 +W:43:3:0:14000 E:1:1:1:2:1:1 O:0:20:80:0 B:CLAW:POISON:10d5 @@ -18901,31 +15884,6 @@ D:An ancient and wise dragon, Scatha has grown clever over the long years. D:His scales are covered with frost, and his breath sends a shower of ice D:into the air. -N:693:Warrior of the Dawn -G:p:R -I:120:25d25:20:70:20 -W:45:2:1600:500 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:HIT:HURT:5d5 -B:HIT:HURT:5d5 -F:BASH_DOOR -F:FRIENDS -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:ZANGBAND -D:Fierce, barbaric warriors, armed with great spiked clubs, and surrounded -D:in an aura of scarlet. Whenever one of them is slain, another appears -D:out of nowhere to take his place. - N:694:Lesser black reaver G:L:D I:120:25d100:20:120:50 @@ -18969,54 +15927,6 @@ S:MIND_BLAST S:TELE_TO D:A humanoid form, black as night, advancing steadily and unstoppably. -N:695:Zoth-Ommog -G:R:v -I:120:25d100:12:50:50 -W:45:4:0:18000 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:HURT:25d3 -B:CRUSH:HURT:25d3 -B:BITE:LOSE_DEX:2d10 -B:BITE:LOSE_CON:2d10 -F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:KILL_ITEM -F:NO_FEAR -F:POWERFUL -F:RAND_25 -F:UNIQUE -S:1_IN_5 -S:BA_ACID -S:BA_NETH -S:BA_POIS -S:CAUSE_3 -S:CAUSE_4 -S:HOLD -S:MIND_BLAST -S:SCARE -S:S_HYDRA -S:S_MONSTER -S:S_SPIDER -D:"A body shaped like a road-based, truncated cone. A flat, blunt, -D:wedge-shaped, vaguely reptilian head surmounts this conical torso, -D:and the head is almost entirely hidden behind swirling tresses. -D:This hair, or beard and mane, consists of thickly carved and -D:coiling ropes, like serpents or worms... Through this repulsive -D:Medusa-mane of ropy tendrils, two fierce, serpent-like eyes -D:glare in a horrible intermingling of cold, inhuman mockery and -D:what I can only describe as gloating menace." - N:696:Grand master thief G:p:b I:130:15d100:50:75:40 @@ -19085,39 +15995,6 @@ D:dragons, his dragonfire is legendary, and his hide is D:armoured with diamonds. He is believed to be the greatest dragon still D:surviving into the Third Age. -N:698:The Stormbringer -G:|:D -I:120:13d123:20:99:20 -W:45:2:0:13333 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:WAIL:TERRIFY -B:HIT:EXP_80:64d1 -B:HIT:EXP_80:64d1 -B:HIT:EXP_80:8d8 -F:BASH_DOOR -F:CAN_FLY -F:CHAR_MULTI -F:COLD_BLOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:RES_NETH -F:UNIQUE -F:ZANGBAND -D:The mightiest of hellblades, a black runesword which thirsts for -D:your soul. - N:699:Knight Templar G:p:w I:120:60d20:20:60:10 @@ -19168,29 +16045,6 @@ D:powerful of the religious knightly orders, but noted for their intolerance. D:Thus it is Morgoth's will that is unwittingly done, as the forces of good D:are set against each other. -N:700:Leprechaun fanatic -G:h:r -I:123:6d6:8:13:8 -W:46:6:800:80 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:EXPLODE:HURT:20d3 -F:EVIL -F:MALE -F:MORTAL -F:OPEN_DOOR -F:RAND_25 -F:SMART -F:TAKE_ITEM -F:ZANGBAND -S:1_IN_6 -S:BLINK -S:MULTIPLY -S:TELE_TO -S:TPORT -D:These leprechauns are not afraid to die for their cause. They are -D:carrying explosives and making terrorist strikes... - N:701:Dracolich G:D:G I:120:35d100:25:120:80 @@ -19334,140 +16188,6 @@ D:seen, and with no feathers on its horrid black leathery wings. Descended D:from a creature of an older world perhaps, bred by Sauron to be a winged D:steed for his Ringwraiths. -N:705:Spectral tyrannosaur -G:R:G -I:120:70d50:25:120:30 -W:46:3:0:15000 -E:0:0:0:0:0:0 -O:20:20:20:20 -B:BITE:EXP_40:2d13 -B:BITE:EXP_40:2d13 -B:BITE:LOSE_STR:5d8 -B:GAZE:TERRIFY -F:ANIMAL -F:BASH_DOOR -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_POIS -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_NEXU -F:RES_TELE -F:UNDEAD -F:ZANGBAND -S:1_IN_6 -S:BR_NETH -S:BR_NEXU -S:BR_POIS -S:HOLD -S:SCARE -D:A deadly undead horror which looks like a skeletal tyrannosaur -D:surrounded by a sickly green glow. - -N:706:Yibb-Tstll, the Patient One -G:P:D -I:120:99d21:20:100:20 -W:46:2:0:16000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:LOSE_ALL:1d166 -B:TOUCH:LOSE_ALL:1d166 -F:CTHANGBAND -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:NEVER_MOVE -F:ONLY_ITEM -F:POWERFUL -F:REGENERATE -F:SMART -F:UNIQUE -S:1_IN_4 -S:BR_CHAO -S:BR_NEXU -S:BR_NUKE -S:DARKNESS -S:S_DEMON -S:S_UNDEAD -D:"There, about the pulsating body of the Ancient One, hugely -D:winged reptilian creatures without faces cluttered and clutched -D:at a multitude of blackly writhing, pendulous breasts! Its eyes -D:moved quickly, independently -- sliding with vile viscosity over -D:the whole rotten surface of Yib-Tstll's pulpy, glistening head!" - -N:707:Ghatanothoa -G:v:D -I:120:100d20:20:100:20 -W:46:2:0:16000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:CLAW:LOSE_INT:5d10 -B:CLAW:LOSE_WIS:5d10 -B:BITE:CONFUSE:5d10 -F:BASH_DOOR -F:CAN_FLY -F:CTHANGBAND -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:MORTAL -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:POWERFUL -F:SMART -F:UNIQUE -S:1_IN_4 -S:BLIND -S:BLINK -S:BRAIN_SMASH -S:BR_GRAV -S:BR_INER -S:BR_WALL -S:CAUSE_3 -S:CAUSE_4 -S:HASTE -S:S_DEMON -S:S_KIN -S:S_UNDEAD -S:TELE_AWAY -S:TELE_LEVEL -D:The chief among the creatures known as Lloigor. Ghatanothoa, unlike most of -D:his kind, has assumed a shape, and one which is too horrible to describe: -D:"Nothing I could say could even adumbrate the loathsome, unholy, non-human, -D:extra-galactic horror and hatefulness and unutterable evil of that forbidden -D:spawn of black chaos, and illimitable night." - N:708:Ent G:#:G I:110:40d100:30:120:15 @@ -19588,98 +16308,6 @@ D:It is the epitome of all that is evil, in a mold. Its lifeless form draws D:power from sucking the souls of those that approach it; a nimbus of pure D:evil surrounds it. Luckily for you, it can't move... -N:712:Fafner the Dragon -G:D:G -I:120:25d110:30:130:80 -W:48:2:170000:25000 -E:0:1:0:6:1:0 -O:50:50:0:0 -B:CLAW:HURT:4d12 -B:CLAW:HURT:4d12 -B:BITE:FIRE:5d14 -B:BITE:POISON:5d14 -F:BASH_DOOR -F:CAN_SPEAK -F:DRAGON -F:DROP_3D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:MALE -F:MOVE_BODY -F:ONLY_ITEM -F:POWERFUL -F:SUSCEP_COLD -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BR_FIRE -S:BR_POIS -S:CAUSE_3 -S:CAUSE_3 -S:CONF -S:CONF -S:SCARE -D:The mighty dragon of myth, Fafner was a giant who slew his -D:brother to win a treasure hoard, and then transformed himself -D:into a dragon, greedily watching over his gold. - -N:713:Charon, Boatman of the Styx -G:W:B -I:120:28d100:30:100:10 -W:47:3:0:25000 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:WAIL:LOSE_ALL -B:TOUCH:UN_POWER -B:HIT:EXP_80:8d12 -B:HIT:EAT_GOLD:8d12 -F:BASH_DOOR -F:CAN_SWIM -F:COLD_BLOOD -F:DROP_3D2 -F:DROP_4D2 -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_POIS -F:MALE -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:ONLY_GOLD -F:OPEN_DOOR -F:PASS_WALL -F:RES_TELE -F:SMART -F:UNDEAD -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_COLD -S:BA_NETH -S:BA_WATE -S:BLIND -S:BO_ICEE -S:BO_NETH -S:CAUSE_3 -S:DARKNESS -S:HOLD -S:SCARE -S:S_UNDEAD -D:The ferryman across the river Styx to the land of the dead. -D:He wishes to receive payment for your entry. - N:714:Quickbeam, the Ent G:#:G I:120:40d100:30:120:15 @@ -19787,41 +16415,6 @@ S:1_IN_9 S:BR_FIRE D:A great water-beast, with an almost impenetrable skin. -N:717:Garm, Guardian of Hel -G:C:b -I:120:30d100:20:120:70 -W:49:2:0:25000 -E:0:1:0:2:1:0 -O:50:50:0:0 -B:CLAW:HURT:7d13 -B:CLAW:HURT:7d13 -B:BITE:HURT:8d13 -B:BITE:HURT:8d13 -F:ANIMAL -F:BASH_DOOR -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_FIRE -F:MOVE_BODY -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_NETH -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BR_COLD -S:BR_DARK -S:BR_NETH -S:S_HOUND -S:S_UNDEAD -D:Garm is a gigantic hound, whose job is to guard that none escapes -D:the tortures of Hel, the place of punishment for the wicked -D:and cowardly dead. - N:718:Greater wall monster G:#:W I:120:15d40:20:80:20 @@ -19925,49 +16518,6 @@ D:A foul, humanoid creature with a long tail, clawed hands and feet, D:and a disgusting, wiry, snaky beard. They are the elite shock troops D:of the hells, capable of a terrifying berserk fury. -N:721:Goat of Mendes -G:q:D -I:120:18d111:30:66:40 -W:50:3:0:6666 -E:0:1:0:2:1:0 -O:0:0:100:0 -B:GAZE:TERRIFY -B:BUTT:HURT:6d6 -B:BITE:EXP_40 -B:BITE:LOSE_CON -F:BASH_DOOR -F:DEMON -F:DROP_2D2 -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_COLD -F:IM_FIRE -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:SMART -F:ZANGBAND -S:1_IN_4 -S:BA_COLD -S:BA_NETH -S:BLIND -S:BRAIN_SMASH -S:CAUSE_4 -S:CONF -S:DRAIN_MANA -S:FORGET -S:SCARE -S:S_DEMON -S:S_UNDEAD -D:It is a demonic creature from the lowest hell, vaguely resembling a -D:large black he-goat. - N:722:Nightwing G:W:D I:120:60d60:20:120:10 @@ -20393,211 +16943,16 @@ S:TELE_AWAY D:Why would anybody want to kill Santa Claus? To get all the presents, D:of course! -N:734:Eihort, the Thing in the Labyrinth -G:j:R -I:120:33d100:50:90:10 -W:53:3:0:45000 -E:0:0:0:0:0:0 +N:738:Old Sorcerer +G:p:R +I:130:52d25:20:60:10 +W:54:2:0:5000:0 +E:1:1:1:2:1:1 O:0:0:100:0 -B:BITE:PARALYZE:8d1 -B:CRUSH:HURT:10d10 -B:CRUSH:HURT:10d10 -B:CRUSH:HURT:10d10 -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_4 -S:BA_ACID -S:BLINK -S:FORGET -S:S_DEMON -S:S_MONSTER -S:S_UNDEAD -D:"Then came pale movement in the well, and something clambered -D:up from the dark, a bloated blanched oval supported on myriad -D:fleshless legs. Eyes formed in the gelatinous oval and stared -D:at him." - -N:735:The King in Yellow -G:L:y -I:120:32d100:90:100:10 -W:53:3:0:50000 -E:0:0:0:0:0:0 -O:50:0:40:10 -B:CRUSH:HURT:12d12 -B:CRUSH:HURT:12d12 -B:GAZE:LOSE_WIS:5d10 -B:GAZE:TERRIFY:5d10 -F:ATTR_ANY -F:ATTR_MULTI -F:BASH_DOOR -F:CAN_SPEAK -F:COLD_BLOOD -F:CTHANGBAND -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_TELE -F:SMART -F:UNDEAD -F:UNIQUE -S:1_IN_2 -S:BRAIN_SMASH -S:CAUSE_3 -S:CAUSE_4 -S:CONF -S:SCARE -S:S_DEMON -S:S_KIN -S:S_UNDEAD -S:TELE_AWAY -S:TPORT -D:The King in Yellow is an Avatar of Hastur: "He has no -D:face, and is twice as tall as a man. He wears pointed shoes under -D:his tattered, fantastically colored robes, and a streamer of silk -D:appears to fall from the pointed tip of his hood. At times he appears -D:to be winged; at others, haloed." - -N:736:Great unclean one -G:U:g -I:120:80d80:30:150:20 -W:53:3:0:17500 -E:0:0:0:0:0:0 -O:50:0:50:0 -B:BITE:DISEASE:10d10 -B:BITE:ACID:10d10 -B:BITE:POISON:10d10 -B:BITE:CONFUSE:10d10 -F:BASH_DOOR -F:CAN_SWIM -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:SMART -F:ZANGBAND -S:1_IN_3 -S:BR_ACID -S:BR_NUKE -S:BR_POIS -S:CAUSE_3 -S:CAUSE_4 -S:SCARE -S:S_DEMON -S:S_UNDEAD -D:This disgusting demon resembles a shambling pile of rotting -D:green flesh, with dozens of mouths drooling and leaving a -D:trail of foul-smelling goo behind. Nurgle must be -D:proud of himself to have created this atrocity! - -N:737:Lord of Chaos -G:p:v -I:130:45d55:30:80:5 -W:60:3:0:17500 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:KICK:HURT:20d2 -B:KICK:HURT:10d2 -B:HIT:POISON:20d1 -B:HIT:LOSE_ALL:15d1 -F:ATTR_ANY -F:ATTR_MULTI -F:BASH_DOOR -F:DROP_4D2 -F:DROP_SKELETON -F:EVIL -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:MALE -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:SHAPECHANGER -F:SMART -F:ZANGBAND -S:1_IN_2 -S:BA_CHAO -S:HEAL -S:MIND_BLAST -S:S_DEMON -S:S_HOUND -S:S_SPIDER -D:He is one of the few true masters of the art, being extremely skillful in -D:all forms of unarmed combat and controlling the Chaos -D:with disdainful ease. - -N:738:Old Sorcerer -G:p:R -I:130:52d25:20:60:10 -W:54:2:0:5000:0 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:HIT:HURT:6d8 -B:HIT:HURT:6d8 -B:HIT:HURT:6d8 -F:BASEANGBAND +B:HIT:HURT:6d8 +B:HIT:HURT:6d8 +B:HIT:HURT:6d8 +F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:EVIL @@ -20877,220 +17232,76 @@ D:Its gaping maw is a void of blackness, and acid drips from its steely hide. D:It is like nothing you have ever seen before, and a terrible chill runs D:down your spine as you face it. -N:745:Lord of Change -G:U:v -I:130:50d70:30:150:20 -W:54:3:0:17000 -E:0:1:1:0:1:0 -O:0:0:100:0 -B:CLAW:CONFUSE:10d10 -B:CLAW:CONFUSE:10d10 -B:BITE:BLIND:12d12 -F:ATTR_MULTI -F:BASH_DOOR -F:CAN_FLY -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:ELDRITCH_HORROR +N:748:Hand druj +G:s:y +I:130:60d10:20:110:10 +W:57:2:10:18000 +E:0:0:0:1:0:0 +O:0:0:0:0 +F:BASEANGBAND +F:CAN_SWIM +F:COLD_BLOOD F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:IM_ACID F:IM_COLD -F:IM_ELEC -F:IM_FIRE F:IM_POIS -F:INVISIBLE -F:MOVE_BODY -F:NONLIVING +F:NEVER_BLOW +F:NEVER_MOVE F:NO_CONF +F:NO_CUT +F:NO_FEAR F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL +F:RES_TELE F:SMART -F:ZANGBAND -S:1_IN_3 -S:BA_CHAO -S:BRAIN_SMASH +F:UNDEAD +S:1_IN_1 +S:BLIND +S:BO_ACID +S:BO_COLD +S:BO_ELEC +S:BO_FIRE +S:CAUSE_3 S:CONF -S:DRAIN_MANA +S:DARKNESS S:FORGET -S:HASTE -S:MIND_BLAST -S:SCARE S:SCARE -S:S_DEMON -S:S_DRAGON -S:S_HOUND S:TELE_AWAY -S:TPORT -D:The most powerful of Tzeentch's servitors. This demon looks like -D:a huge bird-creature, with the head of a predatory bird and -D:fantastically multi-coloured wings. - -N:746:Keeper of Secrets -G:H:G -I:130:60d70:30:150:20 -W:54:3:0:17000 -E:2:0:2:2:1:1 -O:0:0:100:0 -B:HIT:CONFUSE:10d10 -B:HIT:TERRIFY:10d10 -B:HIT:BLIND:10d10 -B:HIT:TERRIFY:10d10 -F:BASH_DOOR +D:A skeletal hand floating in the air, motionless except for its flexing +D:fingers. + +N:749:Eye druj +G:s:r +I:130:10d100:20:90:10 +W:58:2:2:21000 +E:0:0:0:0:0:0 +O:0:0:0:0 +F:BASEANGBAND F:CAN_SWIM -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:ELDRITCH_HORROR +F:COLD_BLOOD F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:IM_ACID F:IM_COLD F:IM_FIRE F:IM_POIS -F:MOVE_BODY -F:NONLIVING +F:NEVER_BLOW +F:NEVER_MOVE F:NO_CONF +F:NO_CUT +F:NO_FEAR F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL +F:RES_TELE F:SMART -F:ZANGBAND -S:1_IN_3 +F:UNDEAD +S:1_IN_1 +S:BA_NETH +S:BO_MANA +S:BO_NETH S:BRAIN_SMASH -S:BR_CONF -S:DRAIN_MANA -S:HEAL -S:SCARE -S:S_DEMON S:S_UNDEAD -S:TELE_AWAY -S:TPORT -D:This demonic keeper of forbidden secrets looks like a hairless -D:minotaur with extra arms, decorated with tattoos and nose rings. -D:It is the embodiment of Slaanesh's perverted magic. - -N:747:Shudde M'ell -G:w:s -I:125:100d40:20:90:20 -W:59:2:0:23000 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:CRUSH:SHATTER:55d2 -B:CRUSH:SHATTER:55d2 -B:TOUCH:LOSE_CON:1d2 -B:TOUCH:LOSE_CON:1d2 -F:CAN_SWIM -F:CTHANGBAND -F:DROP_2D2 -F:DROP_4D2 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:KILL_WALL -F:NO_STUN -F:ONLY_GOLD -F:RES_PLAS -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_5 -S:BRAIN_SMASH -S:BR_ACID -S:BR_DARK -S:BR_DISE -S:CONF -S:FORGET -S:HASTE -S:HEAL -S:HOLD -S:SCARE -S:S_DEMON -S:S_KIN -D:The most powerful and most evil of all Chthonians. -D:"A great gray thing a mile long chanting and exuding strange acids... -D:charging through the depths of the earth at a fantastic speed, in a -D:dreadful fury... melting basaltic rocks like butter under a blowtorch." - -N:748:Hand druj -G:s:y -I:130:60d10:20:110:10 -W:57:2:10:18000 -E:0:0:0:1:0:0 -O:0:0:0:0 -F:BASEANGBAND -F:CAN_SWIM -F:COLD_BLOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_POIS -F:NEVER_BLOW -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:RES_TELE -F:SMART -F:UNDEAD -S:1_IN_1 -S:BLIND -S:BO_ACID -S:BO_COLD -S:BO_ELEC -S:BO_FIRE -S:CAUSE_3 -S:CONF -S:DARKNESS -S:FORGET -S:SCARE -S:TELE_AWAY -D:A skeletal hand floating in the air, motionless except for its flexing -D:fingers. - -N:749:Eye druj -G:s:r -I:130:10d100:20:90:10 -W:58:2:2:21000 -E:0:0:0:0:0:0 -O:0:0:0:0 -F:BASEANGBAND -F:CAN_SWIM -F:COLD_BLOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NEVER_BLOW -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:RES_TELE -F:SMART -F:UNDEAD -S:1_IN_1 -S:BA_NETH -S:BO_MANA -S:BO_NETH -S:BRAIN_SMASH -S:S_UNDEAD -D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it -D:harmless. +D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it +D:harmless. N:750:Skull druj G:s:o @@ -21215,50 +17426,6 @@ S:BR_TIME S:BR_WALL D:An awesome vortex of pure magic, power radiates from its frame. -N:753:Nidhogg, the Hel-Drake -G:D:D -I:120:39d111:20:133:70 -W:55:2:260000:25000 -E:0:1:0:6:1:0 -O:50:50:0:0 -B:CLAW:LOSE_CON:8d12 -B:CLAW:LOSE_CON:8d12 -B:BITE:EXP_80:8d15 -B:BITE:EXP_80:8d15 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DRAGON -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NO_SLEEP -F:ONLY_ITEM -F:POWERFUL -F:RES_NETH -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BR_ACID -S:BR_COLD -S:BR_NETH -S:BR_POIS -S:CAUSE_3 -S:S_DRAGON -S:S_UNDEAD -D:In the bowels of Hel, the dread Nidhogg, a dragon blacker than the -D:night, feasts on the essences of the dead. - N:754:The Lernaean Hydra G:M:v I:120:45d100:20:140:20 @@ -21401,103 +17568,6 @@ D:A vast dragon of immense power. Fire leaps continuously from its huge D:form. The air around it scalds you. Its slightest glance burns you, and D:you realise how truly insignificant you are. -N:757:Hastur the Unspeakable -G:H:b -I:120:55d95:20:150:10 -W:55:4:0:23000 -E:2:0:2:4:1:0 -O:25:25:25:10 -B:CRUSH:HURT:14d8 -B:CRUSH:HURT:14d8 -B:BITE:EXP_80:6d6 -B:BITE:EXP_80:6d6 -F:AURA_ELEC -F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:COLD_BLOOD -F:CTHANGBAND -F:DEMON -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_COLD -F:IM_POIS -F:NONLIVING -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_TELE -F:SMART -F:SMART -F:UNIQUE -S:1_IN_3 -S:BA_WATE -S:BLIND -S:BRAIN_SMASH -S:BR_DARK -S:BR_NETH -S:CAUSE_4 -S:DRAIN_MANA -S:HASTE -S:HEAL -S:HOLD -S:SCARE -S:S_DEMON -S:TELE_AWAY -S:TELE_TO -S:TPORT -D:His form is partially that of a reptile, partially that of a gigantic -D:octopus. He will destroy you. - -N:758:Bloodthirster -G:U:r -I:130:60d70:30:180:20 -W:55:3:0:18500 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:HURT:50d1 -B:HIT:HURT:50d1 -B:HIT:HURT:50d1 -F:BASH_DOOR -F:CAN_FLY -F:CAN_FLY -F:DEMON -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:RES_NETH -F:RES_NEXU -F:RES_TELE -F:ZANGBAND -D:Khorne's mightiest servant, a winged hound-demon walking on -D:two paws and wielding a mighty axe and a whip in the other -D:two. Intelligent, bloodthirsty eyes leer at you from inside -D:the blood-soaked demon armour. - N:759:Draconic quylthulg G:Q:g I:120:48d10:20:1:0 @@ -21522,149 +17592,41 @@ S:TPORT D:It looks like it was once a dragon corpse, now deeply infected with D:magical bacteria that make it pulse in a foul and degrading way. -N:760:Nyogtha, the Thing that Should not Be -G:j:D -I:130:55d99:20:120:20 -W:56:2:0:20000 -E:0:0:0:0:0:0 -O:50:0:40:10 -B:CRUSH:ACID:10d6 -B:CRUSH:ACID:10d6 -B:CRUSH:ACID:10d6 -B:CRUSH:HURT:16d16 +N:762:Fundin Bluecloak +G:h:B +I:130:50d100:25:195:10 +W:56:2:1400:20000 +E:1:1:1:2:1:1 +O:0:80:20:0 +B:HIT:HURT:10d10 +B:HIT:HURT:8d6 +B:HIT:HURT:8d6 +B:HIT:HURT:8d6 +F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND F:DROP_1D2 -F:DROP_2D2 F:DROP_4D2 -F:DROP_60 -F:DROP_90 +F:DROP_CORPSE F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL F:FORCE_MAXHP -F:FORCE_MAXHP -F:FORCE_SLEEP F:FORCE_SLEEP -F:HURT_LITE +F:HAS_LITE F:IM_ACID F:IM_COLD F:IM_ELEC F:IM_FIRE F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:NONLIVING +F:MALE +F:MORTAL F:NO_CONF -F:NO_CUT F:NO_SLEEP F:ONLY_ITEM -F:ONLY_ITEM -F:POWERFUL -F:REGENERATE -F:RES_NETH -F:RES_PLAS -F:RES_TELE -F:SMART +F:OPEN_DOOR +F:PET F:UNIQUE -S:1_IN_5 -S:BRAIN_SMASH -S:BR_ACID -S:BR_DARK -S:BR_NUKE -S:BR_POIS -S:HASTE -S:MIND_BLAST -S:S_DEMON -S:S_HI_UNDEAD -S:S_KIN -S:S_UNDEAD -S:TPORT -D:"...a little finger of blackness crept out from beneath its edge -D:a great wave of iridescent blackness, neither liquid nor solid, -D:a frightful gelatinous mass." - -N:761:Ahtu, Avatar of Nyarlathotep -G:#:D -I:130:50d110:30:120:15 -W:56:3:0:22500 -E:1:1:1:2:1:1 -O:0:30:60:10 -B:CRUSH:HURT:13d13 -B:CRUSH:FIRE:10d10 -B:CRUSH:HURT:13d13 -B:CRUSH:FIRE:10d10 -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DEMON -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:ONLY_ITEM -F:OPEN_DOOR -F:SMART -F:TAKE_ITEM -F:UNIQUE -S:1_IN_6 -S:BA_DARK -S:BRAIN_SMASH -S:BR_FIRE -S:BR_NETH -S:BR_PLAS -S:CAUSE_4 -S:S_DEMON -S:S_UNDEAD -D:"Higher already than the giants of the forest ringing it, the -D:fifty-foot-thick column... sprouted a ring of tendrils, ruddy and -D:golden and glittering overall with inclusions of quartz." - -N:762:Fundin Bluecloak -G:h:B -I:130:50d100:25:195:10 -W:56:2:1400:20000 -E:1:1:1:2:1:1 -O:0:80:20:0 -B:HIT:HURT:10d10 -B:HIT:HURT:8d6 -B:HIT:HURT:8d6 -B:HIT:HURT:8d6 -F:BASEANGBAND -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:PET -F:UNIQUE -S:1_IN_4 -S:BLIND +S:1_IN_4 +S:BLIND S:BRAIN_SMASH S:CAUSE_3 S:CAUSE_4 @@ -21870,56 +17832,6 @@ S:S_KIN D:"Rushing Jaws" is his name, and death is his game; the greatest and most D:terrible of all dragonkind, his power dismayed even the Valar for a time. -N:767:Daoloth, the Render of the Veils -G:U:s -I:120:72d100:20:125:70 -W:58:3:0:27500 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:CONFUSE:5d12 -B:TOUCH:CONFUSE:5d12 -B:TOUCH:CONFUSE:5d12 -B:TOUCH:CONFUSE:5d12 -F:CAN_FLY -F:CAN_SPEAK -F:CTHANGBAND -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:ONLY_ITEM -F:PASS_WALL -F:REFLECTING -F:RES_NEXU -F:UNIQUE -S:1_IN_3 -S:BLINK -S:BR_NEXU -S:S_MONSTERS -S:TELE_AWAY -S:TELE_LEVEL -S:TPORT -D:"Not shapeless, but so complex that the eye could recognise no -D:describable shape. There were hemispheres and shining metal, -D:coupled by long plastic rods. The rods were of a flat gray color, -D:so that he could not make out which were nearer; they merged into -D:a flat mass from which protruded individual cylinders. As he looked -D:at it, he had a curious feeling that eyes gleamed from between -D:these rods; but wherever he glanced at the construction, he saw -D:only the spaces between them." - N:768:Nightwalker G:W:D I:130:80d70:20:175:10 @@ -22018,52 +17930,6 @@ D:will crush you like the pitiful insignificant being he sees you to be. D:Your very soul will be taken into judgement by his supreme authority as he D:cleanses the world of evil. -N:770:Artsi, the Champion of Chaos -G:h:v -I:130:11d666:25:175:10 -W:59:2:1600:20000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:EXP_80:10d10 -B:HIT:EXP_80:10d10 -B:HIT:EXP_80:10d10 -F:ATTR_MULTI -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_NETH -F:RES_NEXU -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_4 -S:BA_CHAO -S:BA_FIRE -S:BA_MANA -S:BR_CHAO -S:CONF -S:S_DEMON -S:TPORT -D:He is one of the greatest warriors of chaos to walk the earth. -D:His bloody blade has slain thousands and tens of thousands, and still -D:hungers for more. - N:771:Saruman of Many Colours G:p:v I:120:70d100:100:100:0 @@ -22431,57 +18297,6 @@ D:A constantly changing canine form, this hound rushes towards you as if D:expecting mayhem and chaos ahead. It appears to have an almost kamikaze D:relish for combat. You suspect all may not be as it seems. -N:780:Vlad Dracula, Prince of Darkness -G:V:D -I:130:70d100:20:166:10 -W:76:4:1800:33333 -E:1:1:1:2:1:1 -O:0:10:90:0 -B:BITE:EXP_80:8d8 -B:BITE:EXP_80:8d8 -B:HIT:CONFUSE:8d8 -B:HIT:CONFUSE:8d8 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:COLD_BLOOD -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_COLD -F:IM_POIS -F:MALE -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:RES_TELE -F:SMART -F:UNDEAD -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_DARK -S:BA_NETH -S:BLIND -S:BRAIN_SMASH -S:CAUSE_3 -S:CAUSE_4 -S:DARKNESS -S:DRAIN_MANA -S:HOLD -S:SCARE -S:S_HI_UNDEAD -S:S_KIN -D:The most feared of all vampires, the Prince of Darkness himself. - N:781:Beholder hive-mother G:e:y I:120:40d100:30:80:10 @@ -22691,38 +18506,6 @@ D:A massive dragon, it is thousands of D:years old and seeks to maintain the Cosmic Balance. It sees you as an D:upstart troublemaker without the wisdom to control your actions. -N:786:Shambler -G:E:W -I:130:50d100:40:150:50 -W:67:4:9000:22500 -E:0:0:0:0:0:0 -O:20:20:60:0 -B:CLAW:HURT:3d12 -B:CLAW:HURT:3d12 -B:CRUSH:HURT:8d12 -B:CRUSH:HURT:8d12 -F:BASH_DOOR -F:CAN_SWIM -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_TELE -F:ZANGBAND -S:1_IN_3 -S:BR_ELEC -D:This elemental creature is power incarnate; it looks like a huge polar bear -D:with a huge gaping maw instead of a head. - N:787:Gelugon G:U:w I:130:45d100:20:100:80 @@ -22765,57 +18548,6 @@ D:great claws on its hands and pincers on its mouth, and its head bulges D:with great multi-faceted eyes. Its tail is covered with razor-sharp D:spikes. -N:788:Glaaki -G:~:v -I:130:52d99:20:150:10 -W:67:2:0:36000 -E:0:0:0:0:1:0 -O:0:0:100:0 -B:STING:HURT:20d1 -B:STING:DISEASE:20d1 -B:CRUSH:HURT:3d20 -F:ATTR_MULTI -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_POIS -F:NO_STUN -F:NO_STUN -F:ONLY_ITEM -F:REGENERATE -F:RES_NEXU -F:RES_WATE -F:SMART -F:UNIQUE -S:1_IN_5 -S:BA_WATE -S:BLIND -S:BR_POIS -S:CAUSE_4 -S:CONF -S:SCARE -S:S_DEMON -S:S_DRAGON -S:S_HYDRA -D:"From an oval body protruded countless thin, pointed spines of -D:multi-colored metal; at the more rounded end of the oval a -D:circular, thick-lipped mouth formed the centre of a spongy -D:face, from which rose three yellow eyes on thin stalks. Around -D:the underside of the body were many white pyramids, presumably -D:used for locomotion. The diameter of the body must have been -D:at least ten feet at its least wide..." - N:789:Trone, the Rebel Thunderlord G:B:D I:130:80d100:20:120:80 @@ -23049,52 +18781,10 @@ S:S_DRAGON S:S_HI_DRAGON D:The mightiest elemental dragon of air, it can destroy you with ease. -N:794:Eilinel the Entrapped -G:p:D -I:120:90d10:10:40:1 -W:42:10:0:3500 -E:1:1:1:2:1:1 -O:20:20:50:10 -B:HIT:HURT:3d5 -B:HIT:HURT:3d5 -B:TOUCH:UN_POWER:3d3 -B:TOUCH:UN_BONUS:3d3 -F:BASH_DOOR -F:DROP_1D2 -F:DROP_2D2 -F:DROP_3D2 -F:DROP_GOOD -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:IM_COLD -F:IM_FIRE -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:OPEN_DOOR -F:SMART -F:UNDEAD -F:UNIQUE -F:ZANGBAND -S:1_IN_2 -S:BLINK -S:BO_ACID -S:BO_MANA -S:CAUSE_3 -S:HEAL -S:S_MONSTER -S:TELE_TO -D:In life, she was the wife of Gorlim. In death, her shade was -D:entrapped by Morgoth and used to trick her husband into betraying -D:Barahir. Now she is totally entrapped by Morgoth's power, and uses -D:her magic to do his bidding. - -N:795:Horned Reaper -G:U:B -I:130:50d100:40:120:80 -W:72:3:0:18000 +N:795:Horned Reaper +G:U:B +I:130:50d100:40:120:80 +W:72:3:0:18000 E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:11d11 @@ -23134,109 +18824,6 @@ D:by foes and friends alike when it flies into one of its berserk rages, the D:Horned Reaper will cut down anything in its path between it and you - even D:the minions it has just summoned. -N:796:The Norsa -G:H:B -I:130:100d100:20:125:70 -W:70:4:16000:47500 -E:0:1:0:2:1:0 -O:50:0:50:0 -B:CRUSH:ACID:8d12 -B:CRUSH:FIRE:8d12 -B:CRUSH:ELEC:8d12 -B:CRUSH:POISON:10d14 -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:DROP_GREAT -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:UNIQUE -F:ZANGBAND -S:1_IN_2 -S:BLIND -S:BR_CHAO -S:BR_DISI -S:BR_GRAV -S:BR_NETH -S:BR_TIME -S:CONF -S:SCARE -S:S_HI_DRAGON -S:S_MONSTERS -D:An elephantine horror with five trunks, each capable of breathing -D:destructive blasts. It is said that it is better to face the fury -D:of a thousand raging lions than the Norsa! - -N:797:Rhan-Tegoth -G:S:b -I:130:90d100:20:125:70 -W:70:4:0:42500 -E:0:1:0:2:1:0 -O:0:50:50:0 -B:CLAW:HURT:8d12 -B:CRUSH:LOSE_STR:5d12 -B:CLAW:HURT:8d12 -B:CRUSH:ACID:5d12 -F:AURA_ELEC -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_ELEC -F:IM_POIS -F:MOVE_BODY -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_WATE -F:UNIQUE -S:1_IN_5 -S:BR_ACID -S:BR_CONF -S:CONF -S:MIND_BLAST -S:SCARE -S:S_DEMON -S:S_KIN -S:S_UNDEAD -D:"An almost globular torso, with six long, sinuous limbs terminating -D:in crab-like claws. From the upper end a subsidiary globe bulged -D:forward bubble-like; its triangle of three staring, fishy eyes, -D:its foot-long and evidently flexible proboscis, and a distended -D:lateral system analogous to gills, suggested that it was a head." - N:798:Black reaver G:L:D I:120:50d100:20:170:50 @@ -23406,46 +18993,6 @@ S:TELE_TO D:A massive pile of rotting flesh. A disgusting stench fills the air as it D:throbs and writhes. -N:803:Null, the Living Void -G:.:d -I:110:50d100:30:100:20 -W:72:2:0:32500 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:TOUCH:LOSE_ALL:6d16 -B:TOUCH:EXP_80:6d16 -B:TOUCH:UN_POWER:6d16 -F:CAN_FLY -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EMPTY_MIND -F:IM_ACID -F:IM_COLD -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:ONLY_ITEM -F:PASS_WALL -F:REGENERATE -F:RES_NETH -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BRAIN_SMASH -S:BR_NETH -S:DRAIN_MANA -S:HEAL -S:SCARE -S:S_HI_UNDEAD -S:S_UNDEAD -D:A black hole in the fabric of reality. It simply is not there. - N:804:Feagwath, the Undead Sorcerer G:L:y I:130:60d100:20:85:50 @@ -23537,55 +19084,6 @@ D:A beholder of great size and age, floating in the air. His gaze seems to D:shred your soul and his spells crush your will. He is ancient, his history D:steeped in forgotten evils, his atrocities numerous and sickening. -N:806:Tsathoggua, the Sleeper of N'kai -G:R:D -I:130:66d100:30:80:100 -W:74:4:0:16500 -E:0:0:0:0:0:0 -O:0:50:50:0 -B:CRUSH:LOSE_ALL:5d6 -B:CRUSH:ACID:5d6 -B:CRUSH:LOSE_ALL:5d6 -B:CRUSH:ACID:5d6 -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:DROP_2D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_POIS -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_2 -S:BR_ACID -S:BR_NETH -S:CAUSE_4 -S:HOLD -S:MIND_BLAST -S:SCARE -S:S_DEMON -S:S_MONSTERS -S:S_UNDEAD -D:"...the formless bulking of a couchant mass. And the mass stirred -D:a little... and put forth with infinite slothfulness a huge and -D:toad-shaped head. And the head opened its eyes very slowly, as if -D:half awakened from slumber, so that they were visible as two slits -D:of oozing phosphor in the black browless face." - N:807:Greater Balrog G:U:v I:130:75d100:40:140:40 @@ -23682,98 +19180,6 @@ D:in all living light into her bloated body, and breathes out the blackest of D:darkness. She is always ravenously hungry and would even eat herself to D:avoid starvation. -N:809:Atlach-Nacha, the Spider God -G:S:D -I:120:110d100:8:160:80 -W:73:1:2000:31000 -E:0:1:0:2:1:0 -O:60:0:40:0 -B:BITE:POISON:3d9 -B:BITE:LOSE_STR:3d9 -B:STING:POISON:2d9 -B:STING:LOSE_STR:2d9 -F:ANIMAL -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HURT_LITE -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:RES_TELE -F:SMART -F:SPIDER -F:UNIQUE -S:1_IN_3 -S:BLIND -S:BR_DARK -S:BR_POIS -S:CONF -S:DARKNESS -S:HOLD -S:SCARE -S:S_HI_DEMON -S:S_KIN -D:"...there was a kind of face on the squat ebon body, low down amid -D:the several-jointed legs. The face peered up with a weird expression -D:of doubt and inquiry..." - -N:810:Y'golonac -G:H:R -I:120:130d99:8:160:80 -W:75:1:0:37500 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:LOSE_INT:1d20 -B:BITE:HURT:40d1 -B:TOUCH:LOSE_WIS:1d20 -B:BITE:HURT:40d1 -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:ONLY_ITEM -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_3 -S:BLIND -S:CAUSE_3 -S:CAUSE_4 -S:CONF -S:DARKNESS -S:DRAIN_MANA -S:FORGET -S:HASTE -S:HASTE -S:HOLD -S:SCARE -S:S_DEMON -S:S_HOUND -S:TELE_TO -S:TPORT -D:"He saw why the shadow on the frosted pane yesterday had been -D:headless and he screamed... but before he could scream out his -D:protest his breath was cut off, as the hands descended on his -D:face and the wet red mouths opened in their palms." - N:811:Aether hound G:Z:v I:120:60d40:30:100:0 @@ -23878,235 +19284,6 @@ D:and massive fangs dripping a foul green liquid, the Pit Fiend is a D:dreadful enemy from the lowest depths of the hells. They are often the D:commanders of vast demon armies. -N:813:The Serpent of Chaos -G:J:v -I:130:66d100:30:180:150 -W:75:2:0:25000 -E:0:0:0:0:1:0 -O:40:40:20:0 -B:CRUSH:POISON:15d10 -B:CRUSH:CONFUSE:15d10 -B:CRUSH:UN_BONUS:10d15 -B:CRUSH:UN_POWER:10d15 -F:ANIMAL -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_COLD -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:DROP_GREAT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:OPEN_DOOR -F:POWERFUL -F:REGENERATE -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_CHAO -S:BR_CHAO -S:BR_DISI -S:BR_MANA -S:BR_NETH -S:S_HI_DEMON -S:S_HI_DRAGON -S:S_MONSTERS -D:Writhing coil upon coil, this mighty spawn of Chaos constantly disintegrates -D:and reforms before your dazzled eyes. It gazes balefully upon you with its -D:one remaining eye, and seeks to destroy you utterly. - -N:814:Yig, Father of Serpents -G:J:b -I:130:111d60:100:100:15 -W:76:1:2300:37500 -E:0:0:0:0:1:0 -O:80:0:20:0 -B:CLAW:POISON:8d10 -B:CLAW:POISON:8d10 -B:CRUSH:HURT:8d15 -B:BITE:HURT:100d1 -F:ANIMAL -F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:DROP_1D2 -F:DROP_4D2 -F:DROP_60 -F:DROP_90 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:ESCORT -F:ESCORTS -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_ELEC -F:IM_POIS -F:MALE -F:ONLY_ITEM -F:OPEN_DOOR -F:REGENERATE -F:RES_TELE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_4 -S:BR_ACID -S:BR_NUKE -S:BR_POIS -S:S_DEMON -S:S_HYDRA -S:S_KIN -D:"The half-human father of serpents... the snake-god of the central -D:plains tribes -- presumably the primal source of the more -D:southerly Quetzalcoatl or Kukulcan -- was odd, half-anthropomorphic -D:devil." - -N:815:Unmaker -G:E:v -I:120:6d66:60:50:60 -W:77:4:0:10000 -E:0:0:0:0:0:0 -O:20:50:20:0 -B:TOUCH:LOSE_ALL:10d10 -B:TOUCH:UN_BONUS:10d10 -B:TOUCH:UN_POWER:10d10 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:COLD_BLOOD -F:DROP_60 -F:DROP_GOOD -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:KILL_WALL -F:NONLIVING -F:NO_CUT -F:NO_FEAR -F:POWERFUL -F:RAND_50 -F:RES_DISE -F:RES_NEXU -F:RES_PLAS -F:SHAPECHANGER -F:ZANGBAND -S:1_IN_5 -S:BR_CHAO -S:MULTIPLY -D:Spawned from the Pits of the Abyss, it is a mass of sentient Chaos, -D:spreading uncontrollably and destroying everything in its path. - -N:816:Cyberdemon -G:U:u -I:120:70d101:90:90:90 -W:77:4:15000:30000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:HURT:1d50 -B:HIT:HURT:1d50 -B:HIT:HURT:1d50 -B:HIT:HURT:1d50 -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:NONLIVING -F:ONLY_ITEM -F:RAND_25 -F:RES_TELE -F:SUSCEP_ACID -F:ZANGBAND -S:1_IN_4 -S:ROCKET -D:Reverbrant metal steps announce the arrival of this huge creature, -D:half demon half machine. It has an unsurpassable firepower. - -N:817:Hela, Queen of the Dead -G:p:G -I:130:74d100:60:110:10 -W:74:3:8000:45000 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:TOUCH:LOSE_ALL:50d1 -B:TOUCH:EXP_80:50d1 -B:TOUCH:UN_BONUS:50d1 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_GOOD -F:DROP_GREAT -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_NETH -F:RES_TELE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_DARK -S:BA_NETH -S:BLIND -S:CAUSE_3 -S:CAUSE_4 -S:FORGET -S:HAND_DOOM -S:HEAL -S:HOLD -S:SCARE -S:S_HI_DRAGON -S:S_HI_UNDEAD -S:S_UNDEAD -S:TELE_TO -D:The Norse ruler of Hel is a merciless queen, who ever hunts for more -D:souls to add to her collection of tortured spirits. She arrives in -D:an ominous green robe, a certain sign of impending doom, to claim -D:as her own those who die an ignoble death. - N:818:The Mouth of Sauron G:p:v I:130:90d100:60:100:10 @@ -24322,45 +19499,6 @@ D:A gigantic seething mass of flesh, Qlzqqlzuup changes colours in front D:of your eyes. Pulsating first one colour then the next, it knows only it D:must bring help to protect itself. -N:823:Cthugha, the Living Flame -G:E:R -I:133:50d100:30:1:20 -W:78:3:0:17500 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:BLIND -B:TOUCH:FIRE:12d10 -B:TOUCH:FIRE:12d10 -B:TOUCH:FIRE:12d10 -F:AURA_FIRE -F:CAN_FLY -F:CTHANGBAND -F:DROP_4D2 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:KILL_BODY -F:KILL_ITEM -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:RES_PLAS -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_4 -S:BR_FIRE -S:S_KIN -D:"But even though we had shielded our eyes, it was impossible not -D:to see the great amorphous shapes streaming skyward from the -D:accursed place, nor the equally great being hovering like a cloud -D:of living fire above the trees." - N:824:Flare, rider of bronze Moonth G:B:U I:130:70d100:100:100:15 @@ -24462,62 +19600,6 @@ D:and more. His greed for gold led him to betray the Hidden Kingdom of D:Gondolin to Morgoth's forces. He is a mighty warrior himself, and some D:of Morgoth's greatest servants answer to his call. -N:826:Cyaegha -G:e:G -I:130:64d100:90:120:10 -W:80:3:0:44444 -E:0:0:0:0:0:0 -O:20:50:30:0 -B:CRUSH:HURT:15d15 -B:CRUSH:HURT:15d15 -B:CRUSH:HURT:15d15 -B:CRUSH:HURT:15d15 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:COLD_BLOOD -F:CTHANGBAND -F:DEMON -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_3 -S:BA_DARK -S:BLIND -S:BRAIN_SMASH -S:BR_DARK -S:BR_NETH -S:HAND_DOOM -S:HOLD -S:SCARE -S:S_DEMON -S:S_HI_UNDEAD -S:S_HYDRA -S:S_MONSTERS -S:TELE_AWAY -D:"...it was a gigantic eye staring down at them. Around the eye, -D:the sky split; deep clefts opened through which the darkness -D:began to ooze, a darkness blacker than the night, which crawled -D:down as a set of slimy tentacles, taking on more form, more -D:definite shape... something was standing, outlined against -D:the black sky, something which had tentacles of darkness -D:and a green-glowing eye." - N:827:Pazuzu, Lord of Air G:U:b I:140:55d100:40:125:10 @@ -24558,70 +19640,18 @@ S:S_HI_DEMON D:A winged humanoid demon from the Planes of Hell, Pazuzu grins inhumanely at you D:as he decides your fate. -N:828:Ithaqua the Windwalker -G:Y:B -I:140:55d100:40:125:10 -W:82:2:0:32500 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:CLAW:COLD:12d12 -B:CLAW:COLD:12d12 -B:CRUSH:ELEC:12d12 -B:CRUSH:ELEC:12d12 -F:AURA_COLD -F:AURA_ELEC -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:CTHANGBAND -F:DEMON -F:DROP_4D2 -F:DROP_GOOD -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:INVISIBLE -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_TELE -F:UNIQUE -S:1_IN_3 -S:BA_CHAO -S:BA_ELEC -S:BA_WATE -S:BO_ELEC -S:BO_MANA -S:BR_COLD -S:CAUSE_4 -S:MIND_BLAST -S:SCARE -S:S_DEMON -S:S_HI_UNDEAD -S:S_KIN -D:The Wendigo, moving so fast that you can see little except two -D:glowing eyes burning with hatred. - -N:829:Greater Hellhound -G:C:r -I:120:48d30:25:80:30 -W:78:2:600:600 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:FIRE:5d12 -B:BITE:FIRE:5d12 -B:BITE:FIRE:5d12 -F:ANIMAL -F:AURA_FIRE -F:BASEANGBAND +N:829:Greater Hellhound +G:C:r +I:120:48d30:25:80:30 +W:78:2:600:600 +E:0:1:0:2:1:0 +O:0:0:0:0 +B:BITE:FIRE:5d12 +B:BITE:FIRE:5d12 +B:BITE:FIRE:5d12 +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -24688,59 +19718,6 @@ D:A legion of evil undead druj animating the skeleton of a once mighty D:sorcerer. His power is devastating and his speed unmatched in the D:underworld. Flee his wrath! -N:831:Mephistopheles, Lord of Hell -G:U:r -I:140:30d222:20:150:50 -W:84:2:0:42500 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:GAZE:EXP_80:10d5 -B:GAZE:TERRIFY:10d5 -B:TOUCH:FIRE:4d15 -B:TOUCH:UN_POWER:4d15 -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DEMON -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:DROP_GREAT -F:ESCORTS -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_NETH -F:RES_PLAS -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BRAIN_SMASH -S:BR_FIRE -S:BR_NETH -S:HAND_DOOM -S:HOLD -S:SCARE -S:S_DEMON -S:S_HI_DEMON -S:S_HI_UNDEAD -S:S_UNDEAD -S:TELE_TO -D:A duke of hell, in the flesh. - N:832:Godzilla G:R:v I:130:85d100:50:185:20 @@ -24782,1062 +19759,322 @@ S:BR_POIS D:Godzilla rose from the contaminated sea. This terrible creature could D:level whole cities in anger. -N:833:Abhoth, Source of Uncleanness -G:j:G -I:130:80d105:50:150:0 -W:85:3:0:40000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:ACID:11d11 -B:TOUCH:DISEASE:11d11 -B:TOUCH:ACID:11d11 -B:TOUCH:POISON:11d11 -F:CAN_SPEAK -F:CAN_SWIM -F:COLD_BLOOD -F:CTHANGBAND -F:DEMON -F:DROP_1D2 +N:838:The Tarrasque +G:R:v +I:130:130d100:50:185:20 +W:84:2:50000:35000 +E:1:1:1:2:1:1 +O:20:50:25:5 +B:HIT:HURT:10d10 +B:HIT:HURT:10d10 +B:TOUCH:UN_POWER:10d10 +B:TOUCH:UN_POWER:10d10 +F:ATTR_MULTI +F:BASEANGBAND +F:BASH_DOOR +F:DROP_2D2 +F:DROP_4D2 +F:DROP_CORPSE F:DROP_GOOD -F:DROP_GREAT -F:ELDRITCH_HORROR F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:IM_ACID F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR +F:IM_FIRE +F:MOVE_BODY F:NO_SLEEP -F:NO_STUN F:ONLY_ITEM -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_WATE -F:SMART +F:OPEN_DOOR +F:POWERFUL F:UNIQUE -S:1_IN_6 -S:BRAIN_SMASH -S:BR_CHAO -S:BR_NEXU -S:BR_NUKE -S:BR_POIS -S:CAUSE_4 -S:DRAIN_MANA -S:HEAL -S:S_DEMON -S:S_HI_DRAGON -S:S_HI_UNDEAD -S:S_MONSTERS -S:TELE_AWAY -S:TPORT -D:"...in the pool [there was] a grayish, horrid mass that nearly choked -D:it from rim to rim. Here, it seemed, was the ultimate source of all -D:miscreation and abomination. For the gray mass quobbed and quivered, -D:and swelled perpetually; and from it, in manifold fission, were -D:spawned the anatomies that crept away on every side through the -D:grotto." - -N:834:Ymir, the Ice Giant -G:P:w -I:130:86d110:50:160:20 -W:71:2:0:32500 +S:1_IN_2 +S:BR_COLD +S:BR_DISE +S:BR_FIRE +D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable +D:and immune to magic. Fear its anger, for its devastation is unmatched! + +N:839:Lungorthin, the Balrog of White Fire +G:U:v +I:130:80d100:20:125:80 +W:88:2:14000:37000 E:1:1:1:2:1:1 O:0:100:0:0 -B:HIT:COLD:9d11 -B:HIT:HURT:9d11 -B:HIT:COLD:9d11 -B:HIT:HURT:9d11 -F:AURA_COLD +B:HIT:FIRE:8d12 +B:HIT:FIRE:8d12 +B:CRUSH:HURT:8d12 +B:TOUCH:UN_POWER +F:BASEANGBAND F:BASH_DOOR -F:CAN_SPEAK -F:COLD_BLOOD +F:CAN_FLY +F:DEMON F:DROP_2D2 +F:DROP_3D2 F:DROP_4D2 -F:DROP_CORPSE F:DROP_GOOD F:ESCORT -F:EVIL +F:ESCORTS F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:GIANT F:HAS_LITE -F:IM_COLD -F:IM_POIS +F:IM_FIRE F:MALE F:MOVE_BODY -F:NO_CUT +F:NO_CONF +F:NO_SLEEP F:ONLY_ITEM F:OPEN_DOOR F:POWERFUL -F:RES_DISE -F:RES_NETH -F:RES_TELE -F:RES_WATE -F:SUSCEP_FIRE -F:SUSCEP_FIRE -F:TAKE_ITEM F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BO_ICEE -S:BR_COLD -S:DARKNESS -S:HAND_DOOM -S:S_HI_UNDEAD -S:S_KIN -S:TELE_AWAY -S:TELE_TO -D:Ymir is one of the oldest beings in existence. He looks like a giant -D:humanoid made of ice. +S:1_IN_4 +S:BLIND +S:BR_FIRE +S:BR_PLAS +S:CONF +S:SCARE +S:S_HI_DEMON +S:S_UNDEAD +D:A massive form cloaked in flame. Lungorthin stares balefully at you with +D:eyes that smoulder red. The dungeon floor where he stands is scorched by +D:the heat of his body. -N:835:Loki, the Trickster -G:P:D -I:130:110d100:50:160:20 -W:85:2:0:75000 -E:1:1:1:2:1:1 +N:840:Draugluin, Sire of All Werewolves +G:C:v +I:130:80d100:80:90:90 +W:83:2:1000:40000 +E:0:1:0:2:1:0 O:0:0:100:0 -B:HIT:BLIND:6d11 -B:HIT:UN_BONUS:6d11 -B:HIT:UN_POWER:6d11 -F:AURA_FIRE +B:CLAW:HURT:6d8 +B:CLAW:HURT:6d8 +B:BITE:POISON:6d6 +B:BITE:POISON:6d6 +F:ANIMAL +F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK -F:DROP_4D2 +F:DROP_1D2 +F:DROP_CORPSE F:DROP_GOOD -F:DROP_GREAT -F:EVIL +F:ESCORT +F:ESCORTS F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:IM_FIRE F:IM_POIS F:MALE F:MOVE_BODY -F:NO_CONF -F:NO_SLEEP F:ONLY_ITEM F:OPEN_DOOR -F:POWERFUL -F:REGENERATE -F:RES_NETH -F:RES_PLAS -F:RES_TELE -F:SUSCEP_COLD +F:RAND_25 F:TAKE_ITEM F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BA_DARK -S:BA_MANA -S:DRAIN_MANA -S:FORGET -S:HAND_DOOM -S:HASTE -S:HEAL -S:SHRIEK -S:S_HI_DEMON -S:S_HI_DRAGON -S:S_HI_UNDEAD -S:S_UNIQUE -S:TELE_AWAY -S:TELE_LEVEL -S:TELE_TO -S:TPORT -D:Loki, the god of mischief, is a nasty person. He will use every -D:dirty trick in the book, and then some. In the end, his half-giant -D:heritage is bound to show, as he will defect to the side of the -D:giants and fight against the other gods of Asgard. - -N:836:Star-spawn of Cthulhu -G:U:G -I:130:75d100:90:90:90 -W:86:2:0:44000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:CLAW:POISON:1d30 -B:CLAW:ACID:1d30 -B:TOUCH:UN_POWER:1d10 -B:CRUSH:UN_BONUS:2d33 -F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:DROP_2D2 -F:DROP_90 -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_ITEM -F:NONLIVING -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RAND_25 -F:RES_NETH -F:RES_TELE -S:1_IN_3 -S:BA_NUKE -S:BRAIN_SMASH -S:BR_ACID -S:BR_FIRE -S:BR_NETH -S:CONF -S:DRAIN_MANA -S:HEAL -S:MIND_BLAST -S:SCARE -S:S_DEMON -S:S_MONSTERS -S:S_UNDEAD -S:TPORT -D:The last remnants of sanity threaten to leave your brain as you -D:behold this titanic bat-winged, octopus-headed unholy abomination. -D:"They all lay in stone houses in their great city of R'lyeh, -D:preserved by the spells of mighty Cthulhu for a glorious -D:resurrection when the stars and the earth might once more -D:be ready..." - -N:837:Surtur, the Fire Giant -G:P:r -I:130:86d110:50:160:20 -W:71:2:0:32500 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:FIRE:9d11 -B:HIT:HURT:9d11 -B:HIT:FIRE:9d11 -B:HIT:HURT:9d11 -F:AURA_FIRE -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_NETH -F:RES_PLAS -F:RES_TELE -F:SUSCEP_COLD -F:SUSCEP_COLD -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BLIND -S:BR_FIRE -S:BR_PLAS -S:HAND_DOOM -S:S_HI_DEMON -S:S_KIN -S:TELE_AWAY -S:TELE_TO -D:Surtur is another of the most ancient of all creatures. He is a demonic -D:giant of fire, who is destined to set the nine worlds afire with his -D:accursed sword of doom on the day of Ragnarok. - -N:838:The Tarrasque -G:R:v -I:130:130d100:50:185:20 -W:84:2:50000:35000 -E:1:1:1:2:1:1 -O:20:50:25:5 -B:HIT:HURT:10d10 -B:HIT:HURT:10d10 -B:TOUCH:UN_POWER:10d10 -B:TOUCH:UN_POWER:10d10 -F:ATTR_MULTI -F:BASEANGBAND -F:BASH_DOOR -F:DROP_2D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:MOVE_BODY -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:UNIQUE -S:1_IN_2 -S:BR_COLD -S:BR_DISE -S:BR_FIRE -D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable -D:and immune to magic. Fear its anger, for its devastation is unmatched! - -N:839:Lungorthin, the Balrog of White Fire -G:U:v -I:130:80d100:20:125:80 -W:88:2:14000:37000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:FIRE:8d12 -B:HIT:FIRE:8d12 -B:CRUSH:HURT:8d12 -B:TOUCH:UN_POWER -F:BASEANGBAND -F:BASH_DOOR -F:CAN_FLY -F:DEMON -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ESCORT -F:ESCORTS -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:MALE -F:MOVE_BODY -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:UNIQUE -S:1_IN_4 -S:BLIND -S:BR_FIRE -S:BR_PLAS -S:CONF -S:SCARE -S:S_HI_DEMON -S:S_UNDEAD -D:A massive form cloaked in flame. Lungorthin stares balefully at you with -D:eyes that smoulder red. The dungeon floor where he stands is scorched by -D:the heat of his body. - -N:840:Draugluin, Sire of All Werewolves -G:C:v -I:130:80d100:80:90:90 -W:83:2:1000:40000 -E:0:1:0:2:1:0 -O:0:0:100:0 -B:CLAW:HURT:6d8 -B:CLAW:HURT:6d8 -B:BITE:POISON:6d6 -B:BITE:POISON:6d6 -F:ANIMAL -F:BASEANGBAND -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_GOOD -F:ESCORT -F:ESCORTS -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_POIS -F:MALE -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:RAND_25 -F:TAKE_ITEM -F:UNIQUE -S:1_IN_3 -S:SCARE -S:S_HOUND -S:S_MONSTERS -D:Draugluin provides Sauron with a fearsome personal guard. He is an -D:enormous wolf inhabited by a human spirit. He is chief of all his kind. - -N:841:Shuma-Gorath -G:e:G -I:130:85d100:50:150:0 -W:88:3:0:47000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:CRUSH:HURT:12d12 -B:CRUSH:HURT:12d12 -B:GAZE:LOSE_INT:2d12 -B:GAZE:LOSE_WIS:2d12 -F:CAN_SPEAK -F:CAN_SWIM -F:COLD_BLOOD -F:CTHANGBAND -F:DEMON -F:DROP_1D2 -F:DROP_GOOD -F:DROP_GREAT -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:NEVER_MOVE -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_WATE -F:SMART -F:UNIQUE -S:1_IN_2 -S:BA_MANA -S:BLIND -S:BRAIN_SMASH -S:CONF -S:DRAIN_MANA -S:FORGET -S:HAND_DOOM -S:HEAL -S:S_HI_DEMON -S:S_HI_DRAGON -S:S_HI_UNDEAD -S:S_HOUND -S:S_HYDRA -S:S_KIN -S:S_MONSTERS -S:S_UNIQUE -S:TELE_AWAY -S:TELE_LEVEL -S:TPORT -D:Shuma-Gorath is one of the immortal lords of chaos. The true form of -D:this blasphemous horror is a huge, all-seeing eye surrounded by tentacles. - -N:842:Tulzscha, the Green Flame -G:E:G -I:130:100d100:90:100:50 -W:89:4:0:45000 -E:0:0:0:0:0:0 -O:0:100:0:0 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -F:AURA_COLD -F:AURA_FIRE -F:CTHANGBAND -F:DEMON -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:RAND_25 -F:REGENERATE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:RES_TELE -F:UNIQUE -S:1_IN_3 -S:BR_COLD -S:BR_FIRE -S:BR_NETH -S:BR_NEXU -D:"A belching column of sick greenish flame... spouting volcanically -D:from the depths profound and inconceivable, casting no shadows as -D:healthy flame should, and coating the nitrous stone with a nasty, -D:venomous verdigris. For all that seething combustion no warmth -D:lay, but only the clamminess of death and corruption." - -N:843:Oremorj, the Cyberdemon Lord -G:U:u -I:130:90d100:90:90:90 -W:89:4:0:50000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -B:HIT:HURT:2d50 -F:DEMON -F:DROP_2D2 -F:DROP_GOOD -F:DROP_GREAT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:JOKEANGBAND -F:NONLIVING -F:NO_SLEEP -F:ONLY_ITEM -F:RAND_25 -F:RES_TELE -F:SUSCEP_ACID -F:UNIQUE -S:1_IN_3 -S:ROCKET -S:S_HI_DEMON -D:The mightiest of Cyberdemons, their lord and ruler. - -N:844:Vecna, the Emperor Lich -G:L:v -I:130:80d100:100:100:0 -W:92:3:0:45000 -E:1:1:1:2:1:1 -O:0:50:50:0 -B:HIT:EXP_80:7d12 -B:HIT:LOSE_DEX:7d12 -B:HIT:UN_POWER:7d12 -B:HIT:UN_POWER:7d12 -F:BASEANGBAND -F:BASH_DOOR -F:CAN_SPEAK -F:COLD_BLOOD -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:DROP_GREAT -F:ESCORT -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RES_TELE -F:SMART -F:UNDEAD -F:UNIQUE -S:1_IN_3 -S:BA_FIRE -S:BA_MANA -S:BA_NETH -S:BLIND -S:BO_MANA -S:BRAIN_SMASH -S:CAUSE_4 -S:HAND_DOOM -S:SCARE -S:S_HI_DEMON -S:S_HI_UNDEAD -S:S_KIN -S:S_MONSTERS -S:TPORT -D:The greatest of all undead sorcerers, even the gods once feared him. This -D:ancient shadow of death wilts every living thing it passes. - -N:845:Yog-Sothoth, the All-in-One -G:j:v -I:130:66d99:100:100:20 -W:90:3:0:45000 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:TOUCH:HURT:40d5 -B:TOUCH:LOSE_CON:16d2 -B:TOUCH:LOSE_CON:16d2 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:AURA_FIRE -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:COLD_BLOOD -F:CTHANGBAND -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:RES_TELE -F:SMART -F:SMART -F:UNIQUE -S:1_IN_3 -S:BA_CHAO -S:BA_MANA -S:BO_MANA -S:BRAIN_SMASH -S:BR_DISI -S:BR_MANA -S:S_DEMON -S:S_HI_DEMON -S:S_HI_UNDEAD -S:S_HOUND -S:S_MONSTERS -D:"Great globes of light massing towards the opening... the breaking -D:apart of the nearest globes, and the protoplasmic flesh that -D:flowed blackly outward to join together and form that eldritch, -D:hideous horror from outer space... whose mask was a congeries -D:of iridescent globes... who froths as primal slime in nuclear -D:chaos forever beyond the nethermost outposts of space and time!" - -N:846:Fenris Wolf -G:C:D -I:130:70d100:80:90:40 -W:90:2:0:35000 -E:0:1:0:2:1:0 -O:20:0:80:0 -B:BITE:HURT:20d6 -B:CLAW:HURT:8d8 -B:CLAW:HURT:8d8 -B:BITE:HURT:20d6 -F:ANIMAL -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:KILL_BODY -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:RAND_25 -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_8 -S:BR_COLD -S:BR_DARK -S:BR_POIS -D:The immensely huge wolf who would swallow the sun to satisfy its -D:hunger - and leave the gods for dessert. - -N:847:Great Wyrm of Power -G:D:v -I:130:111d111:40:160:70 -W:85:4:220000:47500 -E:0:1:0:6:1:0 -O:50:50:0:0 -B:CLAW:HURT:8d12 -B:CLAW:HURT:8d12 -B:BITE:HURT:10d14 -B:BITE:HURT:10d14 -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:AURA_FIRE -F:BASEANGBAND -F:BASH_DOOR -F:CAN_FLY -F:DRAGON -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GOOD -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:MOVE_BODY -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:REFLECTING -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:RES_TELE -S:1_IN_4 -S:BR_ACID -S:BR_CHAO -S:BR_COLD -S:BR_CONF -S:BR_DARK -S:BR_DISE -S:BR_DISI -S:BR_ELEC -S:BR_FIRE -S:BR_GRAV -S:BR_INER -S:BR_LITE -S:BR_MANA -S:BR_NETH -S:BR_NEXU -S:BR_PLAS -S:BR_POIS -S:BR_SHAR -S:BR_SOUN -S:BR_TIME -S:BR_WALL -S:S_DRAGON -S:S_HI_DRAGON -S:S_KIN -D:The mightiest of all dragonkind, a great wyrm of power is seldom -D:encountered in our world. It can crush stars with its might. +S:1_IN_3 +S:SCARE +S:S_HOUND +S:S_MONSTERS +D:Draugluin provides Sauron with a fearsome personal guard. He is an +D:enormous wolf inhabited by a human spirit. He is chief of all his kind. -N:848:Shub-Niggurath, Black Goat of the Woods -G:U:D -I:130:65d99:100:100:20 -W:91:3:0:47500 -E:0:0:0:0:0:0 -O:0:0:100:0 -B:CRUSH:LOSE_WIS:20d5 -B:CRUSH:LOSE_INT:20d5 -B:BITE:LOSE_STR:10d2 -B:BITE:LOSE_CON:10d2 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:CTHANGBAND +N:843:Oremorj, the Cyberdemon Lord +G:U:u +I:130:90d100:90:90:90 +W:89:4:0:50000 +E:1:1:1:2:1:1 +O:0:100:0:0 +B:HIT:HURT:2d50 +B:HIT:HURT:2d50 +B:HIT:HURT:2d50 +B:HIT:HURT:2d50 F:DEMON -F:DROP_4D2 -F:DROP_90 +F:DROP_2D2 F:DROP_GOOD -F:ELDRITCH_HORROR +F:DROP_GREAT F:EVIL -F:FEMALE F:FORCE_MAXHP F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD +F:HAS_LITE +F:IM_FIRE F:IM_POIS +F:JOKEANGBAND F:NONLIVING -F:NO_CONF F:NO_SLEEP F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:REGENERATE +F:RAND_25 F:RES_TELE -F:SMART +F:SUSCEP_ACID F:UNIQUE S:1_IN_3 -S:BA_CHAO -S:BA_DARK -S:BO_MANA -S:BRAIN_SMASH -S:BR_CHAO -S:BR_CONF -S:BR_NUKE -S:BR_POIS -S:CAUSE_4 -S:HEAL +S:ROCKET S:S_HI_DEMON -S:S_HI_UNDEAD -S:S_MONSTERS -S:S_UNIQUE -D:This horrendous outer god looks like a writhing cloudy mass filled -D:with mouths and tentacles. +D:The mightiest of Cyberdemons, their lord and ruler. -N:849:Nodens, Lord of the Great Abyss -G:P:W -I:130:75d99:100:100:20 -W:81:3:0:48000 +N:844:Vecna, the Emperor Lich +G:L:v +I:130:80d100:100:100:0 +W:92:3:0:45000 E:1:1:1:2:1:1 O:0:50:50:0 -B:HIT:HURT:2d66 -B:HIT:HURT:2d66 -B:HIT:HURT:2d66 -B:HIT:HURT:2d66 -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DROP_4D2 -F:DROP_90 -F:DROP_GOOD -F:DROP_GREAT -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GOOD -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:REGENERATE -F:RES_NETH -F:RES_NEXU -F:RES_WATE -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_1 -S:BA_MANA -S:BO_MANA -S:CAUSE_4 -S:HAND_DOOM -S:HASTE -S:HEAL -S:S_ANGEL -S:S_MONSTERS -S:S_UNIQUE -S:TELE_AWAY -S:TELE_LEVEL -S:TELE_TO -S:TPORT -D:The hoary Lord of the Great Abyss seems a wizened man, -D:but appearances can be deceiving. - -N:850:Carcharoth, the Jaws of Thirst -G:C:D -I:130:90d100:80:110:10 -W:94:1:3400:40000 -E:0:1:0:2:1:0 -O:30:10:60:0 -B:CLAW:POISON:9d12 -B:CLAW:POISON:9d12 -B:BITE:FIRE:9d12 -B:BITE:FIRE:9d12 -F:ANIMAL -F:AURA_FIRE +B:HIT:EXP_80:7d12 +B:HIT:LOSE_DEX:7d12 +B:HIT:UN_POWER:7d12 +B:HIT:UN_POWER:7d12 F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK +F:COLD_BLOOD +F:DROP_2D2 +F:DROP_3D2 F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:SMART -F:UNIQUE -S:1_IN_3 -S:BR_DARK -S:BR_FIRE -S:BR_NETH -S:BR_POIS -S:S_HOUND -D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is -D:the largest wolf to ever walk the earth. He is highly intelligent and a -D:deadly opponent in combat. - -N:851:Nyarlathotep, the Crawling Chaos -G:U:r -I:130:90d99:100:100:20 -W:93:3:0:49000 -E:0:0:0:0:0:0 -O:0:50:50:0 -B:CRUSH:LOSE_CON:30d4 -B:CRUSH:LOSE_STR:30d4 -B:GAZE:LOSE_INT:1d50 -B:GAZE:LOSE_WIS:1d50 -F:ATTR_ANY -F:ATTR_MULTI -F:AURA_COLD -F:AURA_ELEC -F:BASH_DOOR -F:CAN_SPEAK -F:CTHANGBAND -F:DEMON -F:DROP_4D2 -F:DROP_90 F:DROP_GOOD F:DROP_GREAT -F:ELDRITCH_HORROR +F:ESCORT F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP -F:IM_ACID +F:IM_COLD +F:IM_ELEC F:IM_FIRE F:IM_POIS F:MALE -F:NONLIVING -F:NO_CONF +F:NO_CUT F:NO_SLEEP F:ONLY_ITEM F:OPEN_DOOR -F:PASS_WALL -F:REGENERATE -F:RES_NEXU F:RES_TELE -F:SHAPECHANGER F:SMART +F:UNDEAD F:UNIQUE S:1_IN_3 -S:BA_CHAO S:BA_FIRE S:BA_MANA +S:BA_NETH +S:BLIND +S:BO_MANA S:BRAIN_SMASH -S:BR_NEXU S:CAUSE_4 S:HAND_DOOM -S:HASTE -S:HEAL -S:MIND_BLAST -S:S_ANGEL +S:SCARE S:S_HI_DEMON -S:S_HI_DRAGON S:S_HI_UNDEAD -S:S_HOUND +S:S_KIN S:S_MONSTERS -S:S_SPIDER -S:TELE_AWAY -S:TELE_LEVEL -S:TELE_TO S:TPORT -D:Nyarlathothep is the messenger, the heart and the soul of the outer gods. -D:He is a shapechanger capable of assuming thousands of nightmarish forms. -D:One of them looks like this: "A tall, slim figure with the young face of -D:an antique pharaoh, gay with prismatic robes and crowned with a -D:pshent that glowed with inherent light... the fascination of a -D:dark god or fallen archangel, and around whose eyes there lurked -D:the languid sparkle of capricious humor." - -N:852:Azathoth, the Daemon Sultan -G:E:B -I:130:99d99:100:150:100 -W:93:3:0:50000 -E:0:0:0:0:0:0 -O:0:50:0:50 -B:CRUSH:HURT:35d5 -B:CRAWL:ACID:35d5 -B:CRUSH:HURT:35d5 -B:CRAWL:ACID:35d5 -F:ATTR_ANY +D:The greatest of all undead sorcerers, even the gods once feared him. This +D:ancient shadow of death wilts every living thing it passes. + +N:847:Great Wyrm of Power +G:D:v +I:130:111d111:40:160:70 +W:85:4:220000:47500 +E:0:1:0:6:1:0 +O:50:50:0:0 +B:CLAW:HURT:8d12 +B:CLAW:HURT:8d12 +B:BITE:HURT:10d14 +B:BITE:HURT:10d14 F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE +F:BASEANGBAND F:BASH_DOOR -F:CAN_SWIM -F:CTHANGBAND -F:DEMON +F:CAN_FLY +F:DRAGON +F:DROP_2D2 +F:DROP_3D2 F:DROP_4D2 -F:DROP_90 +F:DROP_CORPSE F:DROP_GOOD -F:ELDRITCH_HORROR -F:EMPTY_MIND -F:ESCORT -F:ESCORTS -F:EVIL F:FORCE_MAXHP F:FORCE_SLEEP +F:GOOD F:HAS_LITE F:IM_ACID +F:IM_COLD +F:IM_ELEC F:IM_FIRE F:IM_POIS -F:KILL_ITEM -F:KILL_WALL -F:KILL_WALL -F:NONLIVING +F:MOVE_BODY +F:MOVE_BODY F:NO_CONF F:NO_CUT F:NO_SLEEP -F:NO_STUN F:ONLY_ITEM F:OPEN_DOOR F:POWERFUL -F:REGENERATE +F:REFLECTING F:RES_DISE +F:RES_NETH +F:RES_NEXU +F:RES_PLAS F:RES_TELE -F:STUPID -F:UNIQUE -S:1_IN_5 -S:BA_WATE +S:1_IN_4 +S:BR_ACID S:BR_CHAO +S:BR_COLD +S:BR_CONF +S:BR_DARK S:BR_DISE S:BR_DISI +S:BR_ELEC +S:BR_FIRE +S:BR_GRAV +S:BR_INER +S:BR_LITE S:BR_MANA -S:S_DEMON -D:"That last amorphous blight of nethermost confusion which -D:blasphemes and bubbles at the centre of all infinity -- -D:the boundless daemon sultan Azathoth, whose name no lips -D:dare speak aloud, and who gnaws hungrily in inconceivable, -D:unlighted chambers beyond time amidst the muffled, maddening -D:beating of vile drums and the thin monotonous whine of -D:accursed flutes." +S:BR_NETH +S:BR_NEXU +S:BR_PLAS +S:BR_POIS +S:BR_SHAR +S:BR_SOUN +S:BR_TIME +S:BR_WALL +S:S_DRAGON +S:S_HI_DRAGON +S:S_KIN +D:The mightiest of all dragonkind, a great wyrm of power is seldom +D:encountered in our world. It can crush stars with its might. + +N:850:Carcharoth, the Jaws of Thirst +G:C:D +I:130:90d100:80:110:10 +W:94:1:3400:40000 +E:0:1:0:2:1:0 +O:30:10:60:0 +B:CLAW:POISON:9d12 +B:CLAW:POISON:9d12 +B:BITE:FIRE:9d12 +B:BITE:FIRE:9d12 +F:ANIMAL +F:AURA_FIRE +F:BASEANGBAND +F:BASH_DOOR +F:CAN_SPEAK +F:DROP_4D2 +F:DROP_CORPSE +F:DROP_GOOD +F:EVIL +F:FORCE_MAXHP +F:FORCE_SLEEP +F:IM_FIRE +F:IM_POIS +F:MALE +F:MOVE_BODY +F:ONLY_ITEM +F:OPEN_DOOR +F:SMART +F:UNIQUE +S:1_IN_3 +S:BR_DARK +S:BR_FIRE +S:BR_NETH +S:BR_POIS +S:S_HOUND +D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is +D:the largest wolf to ever walk the earth. He is highly intelligent and a +D:deadly opponent in combat. N:853:Huan, Wolfhound of the Valar G:C:W @@ -25879,93 +20116,6 @@ D:Celegorm son of Feanor to Beren son of Barahir: but now he runs wild and D:acknowledges no master save himself, as he hunts alone for his nemesis - D:Carcharoth, the terrible wolf of Angband. -N:854:Jormungand the Midgard Serpent -G:J:v -I:130:120d120:100:200:0 -W:94:1:3000:45000 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:CRUSH:HURT:20d10 -B:CRUSH:HURT:20d10 -B:BITE:HURT:5d50 -F:COLD_BLOOD -F:DROP_CORPSE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:KILL_WALL -F:MOVE_BODY -F:NO_CONF -F:NO_SLEEP -F:NO_STUN -F:REGENERATE -F:RES_NEXU -F:RES_PLAS -F:RES_WATE -F:UNIQUE -F:WILD_OCEAN -F:WILD_TOO -F:ZANGBAND -S:1_IN_3 -S:BA_WATE -S:BR_DISI -S:BR_MANA -S:BR_NETH -S:BR_POIS -S:S_KIN -D:The Midgard Serpent is so huge that its body surrounds the world of -D:mortal men. It could grind even the gods into lifeless pulp. - -N:855:The Destroyer -G:g:v -I:130:140d140:100:200:0 -W:94:1:0:45000 -E:1:1:1:2:1:1 -O:0:0:0:0 -B:HIT:HURT:30d9 -B:HIT:HURT:30d9 -B:HIT:HURT:30d9 -B:HIT:HURT:30d9 -F:BASH_DOOR -F:CAN_FLY -F:COLD_BLOOD -F:EMPTY_MIND -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_WALL -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN -F:NO_STUN -F:REFLECTING -F:REGENERATE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:RES_WATE -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BO_MANA -S:BR_DISI -D:The Destroyer was built by the Norse deities to be their ultimate weapon -D:against the space gods who had arrived to judge the world. Unfortunately, -D:the Destroyer has gone berserk and is destroying everything it sees. The -D:mystical Destroyer is nearly indestructible, and it is said that when it -D:uses its power of complete disintegration, the day of Ragnarok is near. - N:856:Gothmog, the High Captain of Balrogs G:U:v I:130:120d100:100:140:0 @@ -26017,85 +20167,6 @@ D:for slaying three High Kings of the Noldor Elves, and he has never been D:defeated in combat. With his whip of flame and awesome fiery breath he D:saved his master from Ungoliant's rage. -N:857:Great Cthulhu -G:U:g -I:130:100d100:100:140:100 -W:97:2:4000:62500 -E:0:0:0:0:0:0 -O:0:50:50:0 -B:CRUSH:HURT:50d4 -B:CLAW:UN_POWER:15d2 -B:CLAW:UN_BONUS:15d2 -B:TOUCH:DISEASE:100d1 -F:BASH_DOOR -F:CAN_SPEAK -F:CAN_SWIM -F:CTHANGBAND -F:DEMON -F:DEMON -F:DROP_1D2 -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:DROP_GREAT -F:ELDRITCH_HORROR -F:ESCORT -F:ESCORTS -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_ACID -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:REGENERATE -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:RES_TELE -F:SMART -F:UNIQUE -S:1_IN_3 -S:BLIND -S:BRAIN_SMASH -S:BR_ACID -S:BR_CHAO -S:BR_CONF -S:BR_DARK -S:BR_DISE -S:BR_DISI -S:BR_FIRE -S:BR_NETH -S:BR_NEXU -S:BR_NUKE -S:BR_PLAS -S:BR_POIS -S:CONF -S:DARKNESS -S:DRAIN_MANA -S:FORGET -S:HAND_DOOM -S:MIND_BLAST -S:SCARE -S:S_HI_DEMON -S:S_HI_UNDEAD -S:TPORT -D:This creature is death incarnate. "A monster of vaguely anthropoid -D:outline, but with an octopus-like head whose face was a mass of -D:feelers, a scaly, rubbery-looking body, prodigious claws on hind -D:fore feet, and long, narrow wings behind. This thing... was a -D:somewhat bloated corpulence... It lumbered slobberingly into sight -D:and gropingly squeezed its gelatinous green immensity through the -D:black doorway... A mountain shambled or walked." - N:858:Sarko, rider of gold Foronth G:B:y I:145:99d111:100:165:0 @@ -26123,83 +20194,33 @@ F:FEMALE F:FORCE_MAXHP F:FORCE_SLEEP F:GOOD -F:HAS_LITE -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:PET -F:POWERFUL -F:REFLECTING -F:REGENERATE -F:RES_TELE -F:SMART -F:THUNDERLORD -F:UNIQUE -S:1_IN_4 -S:BR_FIRE -S:BR_TIME -S:S_THUNDERLORD -S:TELE_AWAY -S:TELE_TO -S:TPORT -D:Foronth is the first Eagle queen, and Sarko the first to discover -D:the Firebirds, the ancestor of the Thunderlord eagles. She will try to -D:help you! - -N:859:The Unicorn of Order -G:q:w -I:130:66d100:30:170:150 -W:75:2:0:65000 -E:0:1:0:2:1:0 -O:25:50:25:0 -B:KICK:UN_POWER:13d13 -B:KICK:UN_POWER:12d12 -B:BUTT:UN_BONUS:11d11 -B:BITE:TIME:10d10 -F:ANIMAL -F:AURA_COLD -F:BASH_DOOR -F:CAN_FLY -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:DROP_GREAT -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GOOD -F:IM_ACID +F:HAS_LITE F:IM_COLD F:IM_ELEC -F:KILL_BODY -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:NO_STUN +F:IM_FIRE +F:IM_POIS +F:MORTAL +F:MOVE_BODY F:ONLY_ITEM +F:OPEN_DOOR +F:PET F:POWERFUL F:REFLECTING F:REGENERATE F:RES_TELE F:SMART +F:THUNDERLORD F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BR_LITE -S:BR_MANA -S:BR_SHAR -S:BR_SOUN +S:1_IN_4 +S:BR_FIRE S:BR_TIME -S:HEAL -S:S_ANGEL -S:S_MONSTERS -D:The Unicorn of Order, who once stole an eye from the great Serpent -D:of Chaos, regards you as a mortal meddling in the affairs of immortals, -D:and thus is attempting to eliminate you. +S:S_THUNDERLORD +S:TELE_AWAY +S:TELE_TO +S:TPORT +D:Foronth is the first Eagle queen, and Sarko the first to discover +D:the Firebirds, the ancestor of the Thunderlord eagles. She will try to +D:help you! N:860:Sauron, the Sorcerer G:p:v @@ -26965,28 +20986,6 @@ F:STUPID F:WEIRD_MIND D:A man-sized, heavily armoured fresh-water relative of the lobster. -N:882:Mermaid -G:h:G -I:110:5d8:50:30:0 -W:4:1:1600:20 -E:1:1:1:2:1:0 -O:20:50:10:5 -B:TOUCH:LOSE_WIS -B:TOUCH:INSANITY:2d3 -B:TOUCH:CONFUSE -F:AQUATIC -F:DROP_60 -F:DROP_CORPSE -F:FEMALE -F:MORTAL -F:NO_CONF -F:RAND_25 -F:SMART -F:ZANGBAND -D:A green-skinned humanoid with a fishtail. Beware - there are rumours -D:of adventures losing their minds under the fearsome -D:charms of mermaids. - N:883:Box jellyfish G:~:B I:110:10d10:20:30:75 @@ -27442,91 +21441,6 @@ F:WILD_OCEAN F:WILD_TOO D:A troll of the sea, he reeks of brine. -N:903:Jaws -G:~:w -I:130:100d20:200:80:70 -W:40:2:7000:2000 -E:0:0:0:0:1:0 -O:0:0:0:0 -B:BITE:HURT:11d2 -B:BITE:HURT:22d1 -B:BITE:HURT:11d2 -B:BITE:HURT:22d1 -F:ANIMAL -F:AQUATIC -F:BASH_DOOR -F:COLD_BLOOD -F:FORCE_MAXHP -F:IM_COLD -F:IM_ELEC -F:IM_POIS -F:MORTAL -F:MOVE_BODY -F:NO_CONF -F:NO_SLEEP -F:UNIQUE -F:WILD_OCEAN -F:WILD_TOO -F:ZANGBAND -D:The biggest white shark who has ever lived, it is hunting for you now! - -N:904:Aquatic elf -G:h:b -I:110:14d8:30:30:6 -W:9:1:1400:25 -E:1:1:1:2:1:0 -O:20:20:50:10 -B:HIT:HURT:3d4 -F:AQUATIC -F:DROP_60 -F:DROP_CORPSE -F:FRIENDS -F:HAS_LITE -F:MALE -F:SMART -F:ZANGBAND -D:A sleek form vaguely shaped like a dolphin, except with a humanoid -D:head and arms. The facial features are decidedly elven. - -N:905:Aquatic elven warrior -G:h:b -I:110:20d8:40:35:5 -W:10:1:1500:35 -E:1:1:1:2:1:0 -O:20:60:10:10 -B:HIT:HURT:4d4 -B:HIT:HURT:4d4 -F:AQUATIC -F:DROP_60 -F:DROP_CORPSE -F:FRIENDS -F:HAS_LITE -F:MALE -F:SMART -F:ZANGBAND -D:An aquatic elf trained in all forms of combat. - -N:906:Aquatic elven shaman -G:h:b -I:110:12d8:30:30:6 -W:10:1:1400:35 -E:1:1:1:2:1:0 -O:10:10:70:10 -B:TOUCH:UN_BONUS -F:AQUATIC -F:DROP_2D2 -F:DROP_CORPSE -F:HAS_LITE -F:MALE -F:SMART -F:ZANGBAND -S:1_IN_12 -S:BO_COLD -S:BO_MANA -S:S_MONSTERS -D:A wizened aquatic elf skilled in the magical arts. You can see an -D:iridescent film coating the water around him. - N:907:Stargazer G:~:y I:100:15d9:10:25:30 @@ -27829,50 +21743,6 @@ S:DARKNESS D:A naga adapted to underwater life. She has a fish-like tail and a pair D:of gills. -N:920:Devilfish -G:~:s -I:105:10d5:10:10:5 -W:12:1:900:60 -E:0:0:0:0:1:0 -O:0:0:0:0 -F:AQUATIC -F:ATTR_MULTI -F:DROP_CORPSE -F:MORTAL -F:NEVER_BLOW -F:NO_CONF -F:ZANGBAND -S:1_IN_4 -S:BR_CHAO -S:BR_DISE -S:BR_LITE -S:BR_SOUN -S:BR_TIME -D:A disgusting fish, it has a large gaping mouth and a small lantern dangling -D:from an outgrowth on its head. - -N:921:Undead devilfish -G:~:D -I:105:10d5:10:10:5 -W:15:1:0:75 -E:0:0:0:0:1:0 -O:0:0:0:0 -F:AQUATIC -F:ATTR_MULTI -F:INVISIBLE -F:NEVER_BLOW -F:NO_CONF -F:NO_CUT -F:UNDEAD -F:ZANGBAND -S:1_IN_4 -S:BR_DISE -S:BR_NETH -S:BR_NEXU -S:BR_POIS -S:BR_TIME -D:A devilfish brought back from the dead. - N:922:Moby Dick, the White Whale G:~:w I:120:100d25:200:80:70 @@ -29529,43 +23399,6 @@ S:1_IN_4 S:S_KIN D:It does not look that powerful. -N:975:Death orb -G:E:D -I:130:40d100:255:75:0 -W:80:5:10:5000 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:ENGULF:PARASITE:20d10 -B:ENGULF:ACID:6d5 -B:ENGULF:EXP_80:6d5 -B:ENGULF:LOSE_ALL:6d5 -F:CAN_SWIM -F:COLD_BLOOD -F:DEATH_ORB -F:EMPTY_MIND -F:FORCE_MAXHP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:KILL_BODY -F:KILL_ITEM -F:KILL_WALL -F:NONLIVING -F:NO_CONF -F:NO_CUT -F:NO_SLEEP -F:NO_STUN -F:REGENERATE -F:RES_DISE -F:RES_NETH -F:RES_NEXU -F:RES_PLAS -F:RES_WATE -F:ZANGBAND -D:A small, apparently unassuming orb which spawns death and destruction. - N:976:Bronze dragon worm G:w:U I:100:10d15:10:40:80 @@ -29891,56 +23724,6 @@ S:TELE_TO D:It is even worse than the RNG, coming from Mangband, D:it seeks to crush you to pulp... and surely can. -N:984:Hrungnir, the Stone Giant -G:P:W -I:130:99d110:50:160:20 -W:78:2:0:45000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:SHATTER:9d11 -B:HIT:SHATTER:9d11 -B:HIT:HURT:9d11 -B:HIT:HURT:9d11 -F:BASH_DOOR -F:CAN_SPEAK -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:HURT_ROCK -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:NO_CUT -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_NETH -F:RES_PLAS -F:RES_TELE -F:SUSCEP_ACID -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BLIND -S:BR_GRAV -S:BR_SHAR -S:BR_WALL -S:HAND_DOOM -S:S_KIN -S:S_MONSTERS -S:TELE_AWAY -S:TELE_TO -D:Hrungnir is the strongest of all the Stone Giants: one who would even dare -D:to challenge Thor himself to single combat. - N:985:Bullroarer the Hobbit G:h:U I:120:6d10:16:8:10 @@ -30547,36 +24330,6 @@ D:A dragon of great size and power. Its polished bronze scales reflect the D:light in strange and confusing patterns, and you find it hard to keep your D:mind on the job of fighting for your life. -N:1003:Hound of Tindalos -G:Z:s -I:120:60d15:30:100:0 -W:59:3:600:8000 -E:0:1:0:2:1:0 -O:0:0:0:0 -B:BITE:TIME:2d12 -B:BITE:TIME:2d12 -B:CLAW:HURT:2d12 -B:CLAW:HURT:2d12 -F:ANIMAL -F:CAN_FLY -F:CTHANGBAND -F:EVIL -F:FORCE_SLEEP -F:FRIENDS -F:INVISIBLE -F:NO_CONF -F:NO_SLEEP -F:PASS_WALL -F:RES_NETH -S:1_IN_5 -S:BLINK -S:BR_NETH -S:BR_TIME -S:TELE_TO -D:"They are lean and athirst!... All the evil in the universe -D:was concentrated in their lean, hungry bodies. Or had they -D:bodies? I saw them only for a moment, I cannot be certain." - N:1004:Great Wyrm of Thunder G:D:y I:120:50d100:30:150:80 @@ -30776,53 +24529,11 @@ S:1_IN_4 S:SCARE S:SHRIEK S:TELE_TO -D:Once a powerful adventurer, this poor fighter has seen a few too many -D:software bugs in his time. Any shred of lucidity is long gone, but -D:he still remains dangerous. He wanders aimlessly through the dungeon -D:randomly striking at foes both real and imagined, all the while screaming -D:out at the world that caused his condition. - -N:1011:Glaryssa, Succubus Queen -G:U:W -I:120:12d100:90:60:10 -W:41:3:3000:8000 -E:1:1:1:2:1:1 -O:0:50:50:0 -B:CLAW:HURT:5d5 -B:HIT:LOSE_STR:4d4 -B:TOUCH:EXP_80:8d3 -F:BASH_DOOR -F:CAN_SPEAK -F:COLD_BLOOD -F:DEMON -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:FEMALE -F:FORCE_MAXHP -F:FORCE_SLEEP -F:IM_COLD -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:PASS_WALL -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BLIND -S:BO_ACID -S:BO_NETH -S:CAUSE_3 -S:DARKNESS -S:FORGET -S:HOLD -S:MIND_BLAST -S:S_DEMON -D:Drop dead gorgeous - literally. +D:Once a powerful adventurer, this poor fighter has seen a few too many +D:software bugs in his time. Any shred of lucidity is long gone, but +D:he still remains dangerous. He wanders aimlessly through the dungeon +D:randomly striking at foes both real and imagined, all the while screaming +D:out at the world that caused his condition. N:1012:Vermicious Knid G:j:s @@ -30889,33 +24600,6 @@ S:TELE_TO D:A skeletal form, black as night, constructed from the bones of its D:previous victims. -N:1014:Snake of Yig -G:J:b -I:120:48d10:25:80:30 -W:38:4:2000:600 -E:0:0:0:0:1:0 -O:0:0:0:0 -B:BITE:POISON:3d12 -F:ANIMAL -F:AURA_FIRE -F:BASH_DOOR -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:FRIENDS -F:HAS_EGG -F:IM_FIRE -F:IM_POIS -F:MORTAL -F:MOVE_BODY -F:RAND_25 -F:ZANGBAND -S:1_IN_5 -S:BR_POIS -D:It is a giant snake that drips with poison. - N:1015:Bronze golem G:g:o E:2:1:2:4:1:1 @@ -30952,295 +24636,6 @@ S:S_HI_DEMON S:TELE_TO D:A gigantic four-armed animated bronze statue, glowing with great heat. -N:1016:Dimensional shambler -G:h:B -I:120:40d10:30:68:255 -W:29:6:1100:400 -E:0:0:0:0:0:0 -O:20:40:40:0 -B:HIT:HURT:3d5 -B:HIT:HURT:3d5 -B:HIT:HURT:3d5 -F:BASH_DOOR -F:CTHANGBAND -F:DROP_2D2 -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GOOD -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:NONLIVING -F:NO_CONF -F:NO_FEAR -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_TELE -F:SMART -F:TAKE_ITEM -S:1_IN_3 -S:BLIND -S:BLINK -S:CONF -S:HASTE -S:HEAL -S:SCARE -S:TPORT -D:A shabby humanoid with a wrinkled skin. It seems to shift -D:in and out of existence as you watch. - -N:1017:Cultist -G:p:G -I:110:14d8:20:22:40 -W:17:1:1500:36 -E:1:1:1:2:1:1 -O:10:0:90:0 -B:HIT:HURT:4d3 -F:BASH_DOOR -F:CTHANGBAND -F:DROP_1D2 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FORCE_SLEEP -F:HAS_LITE -F:MALE -F:MORTAL -F:OPEN_DOOR -F:SMART -S:1_IN_3 -S:CAUSE_2 -S:HEAL -S:MIND_BLAST -S:SCARE -S:S_MONSTER -D:A robed humanoid dedicated to a demonic outer god. - -N:1018:Cult leader -G:p:G -I:120:52d14:20:60:10 -W:47:2:1800:1800 -E:1:1:1:2:1:1 -O:20:0:80:0 -B:HIT:HURT:6d4 -B:HIT:HURT:6d4 -F:BASH_DOOR -F:CTHANGBAND -F:DROP_2D2 -F:DROP_90 -F:DROP_CORPSE -F:DROP_SKELETON -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:MALE -F:MORTAL -F:NO_CONF -F:NO_SLEEP -F:ONLY_ITEM -F:OPEN_DOOR -F:SMART -S:1_IN_2 -S:BA_CHAO -S:BLIND -S:BRAIN_SMASH -S:CAUSE_3 -S:CONF -S:HEAL -S:HOLD -S:S_DEMON -S:S_MONSTER -S:S_UNDEAD -D:An evil priest, dressed all in black and devoted to one of the netherworld -D:demons that call themselves "the outer gods". - -N:1019:Servitor of the outer gods -G:H:y -I:130:100d35:30:140:255 -W:41:6:2100:15000 -E:0:0:0:0:0:0 -O:10:20:70:0 -B:GAZE:TERRIFY:4d4 -B:HIT:HURT:8d6 -F:ATTR_MULTI -F:BASH_DOOR -F:CTHANGBAND -F:DROP_3D2 -F:DROP_4D2 -F:DROP_GOOD -F:ELDRITCH_HORROR -F:FORCE_SLEEP -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MOVE_BODY -F:NONLIVING -F:NO_FEAR -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:REFLECTING -F:RES_TELE -F:SHAPECHANGER -F:SMART -F:TAKE_ITEM -S:1_IN_3 -S:BLIND -S:BO_MANA -S:CAUSE_2 -S:CAUSE_4 -S:SCARE -S:S_UNDEAD -S:TELE_TO -D:"Toad-like creatures which seemed constantly to be changing shape and -D:appearance, and from whom emanated, by some means I could not distinguish, -D:a ghostly ululation, a piping." August Derleth - "The Lurker at The -D:Threshold". - -N:1020:Avatar of Nyarlathotep -G:p:R -I:120:25d25:20:70:20 -W:45:2:0:500 -E:0:0:0:0:0:0 -O:0:0:0:0 -B:HIT:HURT:5d5 -F:BASH_DOOR -F:CTHANGBAND -F:ELDRITCH_HORROR -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_ELEC -F:IM_FIRE -F:IM_POIS -F:MALE -F:NONLIVING -F:NO_FEAR -F:NO_SLEEP -F:OPEN_DOOR -F:SHAPECHANGER -D:The Crawling Chaos with a thousand forms. Nyarlathotep is amused at your -D:puny attempts to kill him, and will keep coming back for another go -D:until he gets bored with the game. - -N:1021:Thiazi, the Storm Giant -G:P:B -I:130:99d110:50:160:20 -W:78:2:0:45000 -E:1:1:1:2:1:1 -O:0:100:0:0 -B:HIT:ELEC:9d11 -B:HIT:HURT:9d11 -B:HIT:ELEC:9d11 -B:HIT:HURT:9d11 -F:AURA_ELEC -F:BASH_DOOR -F:CAN_FLY -F:CAN_SPEAK -F:DEMON -F:DROP_2D2 -F:DROP_4D2 -F:DROP_GOOD -F:EVIL -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:GIANT -F:HAS_LITE -F:IM_FIRE -F:IM_POIS -F:MALE -F:MOVE_BODY -F:ONLY_ITEM -F:OPEN_DOOR -F:POWERFUL -F:RES_NETH -F:RES_PLAS -F:RES_TELE -F:SUSCEP_COLD -F:SUSCEP_COLD -F:TAKE_ITEM -F:UNIQUE -F:ZANGBAND -S:1_IN_5 -S:BLIND -S:BR_ELEC -S:BR_MANA -S:BR_PLAS -S:HAND_DOOM -S:S_HI_DRAGON -S:S_KIN -S:TELE_AWAY -S:TELE_TO -D:Thiazi is the greatest of all the Storm Giants: when travelling, he takes -D:the form of a giant eagle. It was he who succeeded in kidnapping Iduna and -D:her apples of youth from Asgard itself. - -N:1022:Hypnos, Lord of Sleep -G:p:G -I:130:51d99:20:150:10 -W:67:2:5000:36000 -E:1:1:1:2:1:1 -O:0:0:100:0 -B:TOUCH:LOSE_ALL:2d25 -B:GAZE:PARALYZE:1d20 -B:GAZE:TERRIFY:1d20 -B:GAZE:BLIND:1d20 -F:ATTR_MULTI -F:CAN_FLY -F:CAN_SPEAK -F:DROP_2D2 -F:DROP_3D2 -F:DROP_4D2 -F:DROP_CORPSE -F:DROP_GOOD -F:EVIL -F:FORCE_MAXHP -F:FORCE_SLEEP -F:HAS_LITE -F:IM_ACID -F:IM_COLD -F:IM_FIRE -F:IM_POIS -F:MALE -F:NO_CONF -F:NO_SLEEP -F:NO_STUN -F:NO_STUN -F:ONLY_ITEM -F:RES_DISE -F:RES_NEXU -F:SMART -F:UNIQUE -F:ZANGBAND -S:1_IN_3 -S:BA_NUKE -S:BLIND -S:BRAIN_SMASH -S:BR_CHAO -S:BR_INER -S:BR_NEXU -S:CONF -S:DRAIN_MANA -S:HEAL -S:HOLD -S:MIND_BLAST -S:SLOW -S:S_DEMON -S:S_UNDEAD -S:TELE_AWAY -S:TELE_LEVEL -S:TELE_TO -S:TPORT -D:"Young with the youth that is outside time, and with a handsome -D:bearded face, curved, smiling lips, Olympian brow; and dense locks -D:waving and poppy-crowned." - N:1023:Blue dragon worm G:w:B I:100:10d15:10:40:80 diff --git a/src/monster2.cc b/src/monster2.cc index 8e866796..56bf0a58 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1024,15 +1024,6 @@ s16b get_mon_num(int level) continue; } - if(in_tome) - { - /* Zangbandish monsters not allowed */ - if (r_ptr->flags & RF_ZANGBAND) continue; - - /* Lovecraftian monsters not allowed */ - if (r_ptr->flags & RF_CTHANGBAND) continue; - } - /* Joke monsters allowed ? or not ? */ if (!options->joke_monsters && (r_ptr->flags & RF_JOKEANGBAND)) continue; diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index 10a36a3f..5179a040 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -136,8 +136,6 @@ RF(5, 8, XXX8X08) RF(5, 9, WILD_MOUNTAIN) RF(5, 10, WILD_GRASS) RF(5, 11, NO_CUT) -RF(5, 12, CTHANGBAND) -RF(5, 14, ZANGBAND) RF(5, 15, JOKEANGBAND) RF(5, 16, BASEANGBAND) RF(5, 31, WILD_TOO) -- cgit v1.2.3 From 0e4dc49ff31f216a4f553f54e0da8b4bc569f8f7 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused UNIQUE_4 monster race flag --- src/birth.cc | 1 - src/monster2.cc | 2 +- src/monster_race_flag_list.hpp | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 77ff56f3..c920854b 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -654,7 +654,6 @@ static void player_wipe() /* Hack -- Reset the max counter */ if (r_ptr->flags & RF_UNIQUE) r_ptr->max_num = 1; - if (r_ptr->flags & RF_UNIQUE_4) r_ptr->max_num = 4; /* Clear player kills */ r_ptr->r_pkills = 0; diff --git a/src/monster2.cc b/src/monster2.cc index 56bf0a58..0cd07c64 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -1706,7 +1706,7 @@ void update_mon(int m_idx, bool_ full) can_esp |= ((p_ptr->computed_flags & ESP_THUNDERLORD) && (r_ptr->flags & RF_THUNDERLORD)); can_esp |= ((p_ptr->computed_flags & ESP_GOOD) && (r_ptr->flags & RF_GOOD)); can_esp |= ((p_ptr->computed_flags & ESP_NONLIVING) && (r_ptr->flags & RF_NONLIVING)); - can_esp |= ((p_ptr->computed_flags & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE) || (r_ptr->flags & RF_UNIQUE_4))); + can_esp |= ((p_ptr->computed_flags & ESP_UNIQUE) && ((r_ptr->flags & RF_UNIQUE))); can_esp |= bool(p_ptr->computed_flags & ESP_ALL); /* Only do this when we can really detect monster */ diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index 5179a040..0484e3af 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -97,7 +97,6 @@ RF(3, 23, RES_WATE) RF(3, 24, RES_PLAS) RF(3, 25, RES_NEXU) RF(3, 26, RES_DISE) -RF(3, 27, UNIQUE_4) RF(3, 28, NO_FEAR) RF(3, 29, NO_STUN) RF(3, 30, NO_CONF) -- cgit v1.2.3 From fe10c22d4ad3fbc84a5c033e96782a8e6da3e1e0 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused DROP_ART monster race flag --- src/monster_race_flag_list.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index 0484e3af..01ad2e8d 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -117,7 +117,6 @@ RF(4, 11, NO_TARGET) RF(4, 12, AI_ANNOY) RF(4, 13, AI_SPECIAL) RF(4, 14, NEUTRAL) -RF(4, 15, DROP_ART) RF(4, 16, DROP_RANDART) RF(4, 17, AI_PLAYER) RF(4, 18, NO_THEFT) -- cgit v1.2.3 From 5cc007ae05746810aebb104b8ec7fd3e32d68131 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused XXX8X02 monster race flag --- src/monster_race_flag_list.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index 01ad2e8d..d1ef367c 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -124,7 +124,6 @@ RF(4, 19, SPIRIT) RF(5, 0, WILD_ONLY) RF(5, 1, WILD_TOWN) -RF(5, 2, XXX8X02) RF(5, 3, WILD_SHORE) RF(5, 4, WILD_OCEAN) RF(5, 5, WILD_WASTE) -- cgit v1.2.3 From ff78c154d2848aa15df9c13026ee9cd75f8b95f1 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused XXX8X08 monster race flag --- src/monster_race_flag_list.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index d1ef367c..4754ce2b 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -129,7 +129,6 @@ RF(5, 4, WILD_OCEAN) RF(5, 5, WILD_WASTE) RF(5, 6, WILD_WOOD) RF(5, 7, WILD_VOLCANO) -RF(5, 8, XXX8X08) RF(5, 9, WILD_MOUNTAIN) RF(5, 10, WILD_GRASS) RF(5, 11, NO_CUT) -- cgit v1.2.3 From ae90af873f4cd3450d5e04a65e84040b4ddad1bd Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused BASEANGBAND flag --- lib/edit/r_info.txt | 828 -------------------------------- lib/edit/re_info.txt | 6 - lib/mods/theme/edit/r_info.txt | 1000 +-------------------------------------- lib/mods/theme/edit/re_info.txt | 6 - src/monster_race_flag_list.hpp | 1 - 5 files changed, 5 insertions(+), 1836 deletions(-) diff --git a/lib/edit/r_info.txt b/lib/edit/r_info.txt index c7c79083..7eebf70c 100644 --- a/lib/edit/r_info.txt +++ b/lib/edit/r_info.txt @@ -200,7 +200,6 @@ E:1:1:1:2:1:1 O:1:1:1:1 B:BEG:* B:TOUCH:EAT_GOLD -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:EVIL @@ -223,7 +222,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -242,7 +240,6 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_SKELETON F:HAS_EGG @@ -261,7 +258,6 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_SKELETON F:HAS_EGG @@ -281,7 +277,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -299,7 +294,6 @@ W:0:1:1000:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -323,7 +317,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -340,7 +333,6 @@ E:0:1:1:2:1:1 O:0:100:0:0 #B:MOAN:* #B:MOAN:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_CORPSE @@ -367,7 +359,6 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -387,7 +378,6 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -409,7 +399,6 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -429,7 +418,6 @@ W:0:1:1300:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -451,7 +439,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* B:TOUCH:DISEASE -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -474,7 +461,6 @@ O:25:50:20:5 B:HIT:HURT:1d6 B:TOUCH:EAT_ITEM B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -499,7 +485,6 @@ W:0:1:1100:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -522,7 +507,6 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -546,7 +530,6 @@ W:0:1:1700:0 E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -571,7 +554,6 @@ W:0:1:1650:0 E:1:1:1:2:1:1 O:25:50:25:0 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -620,7 +602,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 B:SPORE:HURT:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -642,7 +623,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 B:CRUSH:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -659,7 +639,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -680,7 +659,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -702,7 +680,6 @@ O:0:0:0:0 B:BITE:HURT:1d2 B:STING:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -718,7 +695,6 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -734,7 +710,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -751,7 +726,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:MORTAL @@ -770,7 +744,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:CRUSH:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -787,7 +760,6 @@ W:1:1:800:5 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -807,7 +779,6 @@ W:2:1:900:5 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -828,7 +799,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_POIS @@ -849,7 +819,6 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:PARALYZE -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -865,7 +834,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -882,7 +850,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:FRIENDS @@ -900,7 +867,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -918,7 +884,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -935,7 +900,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 B:STING:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:NO_CUT @@ -989,7 +953,6 @@ I:110:1d1:4:1:0 W:2:1:40:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:FORCE_SLEEP @@ -1016,7 +979,6 @@ B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD B:DROOL:* B:DROOL:* -F:BASEANGBAND F:CAN_SWIM F:DROP_90 F:DROP_CORPSE @@ -1035,7 +997,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1052,7 +1013,6 @@ E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1072,7 +1032,6 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1092,7 +1051,6 @@ W:2:1:1500:6 E:1:1:1:2:1:1 O:25:0:50:20 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1117,7 +1075,6 @@ W:2:1:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1142,7 +1099,6 @@ W:2:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d6 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:MORTAL @@ -1162,7 +1118,6 @@ W:2:1:2000:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1183,7 +1138,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1202,7 +1156,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:IM_FIRE @@ -1223,7 +1176,6 @@ B:CLAW:HURT:1d1 B:CLAW:HURT:1d1 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -1242,7 +1194,6 @@ E:1:1:1:2:1:1 O:25:0:0:55 B:HIT:HURT:1d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1259,7 +1210,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1278,7 +1228,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1297,7 +1246,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1316,7 +1264,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -1333,7 +1280,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:ACID:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_ACID @@ -1356,7 +1302,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -1375,7 +1320,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -1395,7 +1339,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -1413,7 +1356,6 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -1429,7 +1371,6 @@ W:3:2:670:16 E:1:1:1:2:1:1 O:50:50:0:0 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -1460,7 +1401,6 @@ W:3:2:300:4 E:0:0:0:0:0:0 O:50:0:25:20 B:CRAWL:ACID:1d3 -F:BASEANGBAND F:CAN_SWIM F:DROP_90 F:EMPTY_MIND @@ -1482,7 +1422,6 @@ W:3:1:0:8 E:0:0:0:0:0:0 O:50:5:30:10 B:TOUCH:TERRIFY -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -1511,7 +1450,6 @@ W:3:1:2000:12 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1534,7 +1472,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1552,7 +1489,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -1569,7 +1505,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -1587,7 +1522,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:STING:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1603,7 +1537,6 @@ W:3:1:1700:20 E:0:0:0:0:1:0 O:0:75:20:5 B:CRUSH:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -1621,7 +1554,6 @@ W:3:1:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:2d4 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:NEVER_MOVE @@ -1641,7 +1573,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:1d3 B:TOUCH:EAT_LITE:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1665,7 +1596,6 @@ E:1:1:1:2:1:1 O:0:50:0:40 B:HIT:HURT:1d4 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1686,7 +1616,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1702,7 +1631,6 @@ W:3:1:30:9 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:NEVER_MOVE @@ -1721,7 +1649,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:CRAWL:HURT:2d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1738,7 +1665,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:LOSE_DEX:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:MORTAL @@ -1760,7 +1686,6 @@ O:0:0:0:0 B:CRAWL:POISON:1d2 F:ANIMAL F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_POIS @@ -1782,7 +1707,6 @@ W:3:1:500:6 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:LOSE_STR:1d6 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_LITE @@ -1800,7 +1724,6 @@ W:4:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:BLIND -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:HAS_LITE @@ -1819,7 +1742,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d5 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -1834,7 +1756,6 @@ E:1:1:1:2:1:1 O:25:45:25:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1858,7 +1779,6 @@ W:4:1:2000:14 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:COLD:1d6 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -1881,7 +1801,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d4 B:TOUCH:POISON:2d4 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -1904,7 +1823,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d3 F:ANIMAL -F:BASEANGBAND F:MORTAL F:RAND_25 S:MULTIPLY @@ -1917,7 +1835,6 @@ W:4:1:900:15 E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1945,7 +1862,6 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -1959,7 +1875,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:COLD:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:HURT_LITE @@ -1984,7 +1899,6 @@ O:0:0:0:0 B:BITE:HURT:1d5 B:CRUSH:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2002,7 +1916,6 @@ W:5:1:800:12 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -2045,7 +1958,6 @@ W:6:2:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2072,7 +1984,6 @@ E:0:0:0:0:1:0 O:0:25:0:65 B:CRUSH:HURT:1d8 B:SPIT:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -2098,7 +2009,6 @@ B:BITE:HURT:3d1 B:BITE:HURT:3d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:RAND_25 F:WEIRD_MIND D:Yech! The disgusting thing only wants your blood! @@ -2113,7 +2023,6 @@ B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -2127,7 +2036,6 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2152,7 +2060,6 @@ W:5:1:300:7 E:0:0:0:0:0:0 O:45:20:20:0 B:CRAWL:COLD:1d4 -F:BASEANGBAND F:CAN_SWIM F:DROP_60 F:EMPTY_MIND @@ -2174,7 +2081,6 @@ W:5:1:0:15 E:0:0:0:0:0:0 O:30:30:30:5 B:TOUCH:EAT_FOOD:1d1 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -2197,7 +2103,6 @@ W:5:1:2500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -2217,7 +2122,6 @@ W:5:1:1000:25 E:1:1:1:2:1:1 O:0:90:0:5 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -2236,7 +2140,6 @@ W:5:1:500:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d5 -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -2252,7 +2155,6 @@ O:0:0:0:0 B:GAZE:UN_BONUS F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -2271,7 +2173,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:FIRE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:EMPTY_MIND @@ -2295,7 +2196,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2317,7 +2217,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:DROP_90 @@ -2348,7 +2247,6 @@ O:0:0:0:0 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:NEVER_MOVE @@ -2366,7 +2264,6 @@ W:6:2:1500:6 E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2393,7 +2290,6 @@ E:1:1:1:2:1:1 O:0:95:0:0 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2413,7 +2309,6 @@ W:6:1:50:20 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -2434,7 +2329,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -2452,7 +2346,6 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2474,7 +2367,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d6 B:TOUCH:POISON:2d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -2497,7 +2389,6 @@ W:6:1:1600:15 E:1:1:1:2:1:1 O:20:50:5:15 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2522,7 +2413,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2544,7 +2434,6 @@ O:0:0:0:0 B:BITE:ACID:2d4 B:BITE:ACID:2d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -2565,7 +2454,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -2582,7 +2470,6 @@ E:1:1:1:2:1:1 O:20:20:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -2608,7 +2495,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d2 B:HIT:HURT:1d2 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -2633,7 +2519,6 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:POISON -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EVIL @@ -2660,7 +2545,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:POISON:1d3 B:CLAW:POISON:1d3 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -2683,7 +2567,6 @@ W:7:1:1900:20 E:1:1:1:2:1:1 O:20:70:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2707,7 +2590,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:STING:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FRIENDS @@ -2726,7 +2608,6 @@ W:7:2:300:16 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -2743,7 +2624,6 @@ W:7:3:550:30 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:BLIND:2d6 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -2762,7 +2642,6 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:1d10 B:BITE:LOSE_STR:1d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -2783,7 +2662,6 @@ W:7:1:2500:26 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:1d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -2802,7 +2680,6 @@ W:7:2:500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:2d5 -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -2818,7 +2695,6 @@ E:0:0:0:0:0:0 O:60:0:25:0 B:HIT:HURT:2d2 B:TOUCH:LOSE_WIS -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -2847,7 +2723,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -2864,7 +2739,6 @@ O:0:100:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -2891,7 +2765,6 @@ W:8:1:1700:26 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -2917,7 +2790,6 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -2952,7 +2824,6 @@ B:HIT:HURT:1d11 B:HIT:HURT:1d11 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -2981,7 +2852,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2998,7 +2868,6 @@ E:1:1:1:2:1:1 O:0:80:0:15 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3022,7 +2891,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:FORCE_SLEEP @@ -3058,7 +2926,6 @@ W:8:1:40:28 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_ACID @@ -3079,7 +2946,6 @@ E:1:1:1:2:1:1 O:30:55:10:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3104,7 +2970,6 @@ W:8:3:1000:16 E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -3121,7 +2986,6 @@ W:8:1:2000:25 E:1:1:1:2:1:1 O:10:70:10:0 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3144,7 +3008,6 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -3169,7 +3032,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -3187,7 +3049,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -3209,7 +3070,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:IM_COLD @@ -3228,7 +3088,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d4 B:CRAWL:ACID:2d4 -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -3246,7 +3105,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:IM_POIS F:MORTAL F:RAND_25 @@ -3263,7 +3121,6 @@ B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -3284,7 +3141,6 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:1d11 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -3307,7 +3163,6 @@ B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -3328,7 +3183,6 @@ O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:KILL_ITEM @@ -3346,7 +3200,6 @@ E:1:1:1:2:1:1 O:30:40:30:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -3380,7 +3233,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3411,7 +3263,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3442,7 +3293,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3472,7 +3322,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3502,7 +3351,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3533,7 +3381,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:STING:LOSE_STR:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:HAS_LITE @@ -3552,7 +3399,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -3579,7 +3425,6 @@ O:0:0:0:0 B:BITE:HURT:1d12 B:BITE:HURT:1d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -3599,7 +3444,6 @@ O:0:0:0:0 B:SPIT:BLIND:1d2 B:BITE:POISON:3d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -3622,7 +3466,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -3643,7 +3486,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -3661,7 +3503,6 @@ O:0:0:0:0 B:STING:POISON:1d4 B:STING:LOSE_STR:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:FRIENDS F:MORTAL @@ -3680,7 +3521,6 @@ B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_POIS @@ -3698,7 +3538,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:IM_POIS @@ -3714,7 +3553,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -3746,7 +3584,6 @@ B:HIT:HURT:1d9 B:INSULT:* B:INSULT:* F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -3782,7 +3619,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -3804,7 +3640,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d1 F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -3851,7 +3686,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d13 B:HIT:HURT:1d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -3884,7 +3718,6 @@ B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -3905,7 +3738,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:CRUSH:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -3920,7 +3752,6 @@ W:10:1:50:32 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -3943,7 +3774,6 @@ B:CLAW:HURT:1d8 B:BITE:HURT:1d12 B:CRUSH:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -3960,7 +3790,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:UN_BONUS:1d6 F:ATTR_MULTI -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -3985,7 +3814,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4010,7 +3838,6 @@ W:10:1:600:40 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -4035,7 +3862,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -4057,7 +3883,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FRIENDS @@ -4077,7 +3902,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -4095,7 +3919,6 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -4114,7 +3937,6 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_ITEM -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_SKELETON @@ -4154,7 +3976,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:1d6 B:TOUCH:LOSE_CON:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -4181,7 +4002,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4220,7 +4040,6 @@ B:TOUCH:PARALYZE:1d14 B:TOUCH:PARALYZE:1d14 B:CRUSH:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_1D2 F:DROP_GOOD @@ -4256,7 +4075,6 @@ B:BITE:HURT:2d5 B:BITE:HURT:2d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:WILD_TOO @@ -4271,7 +4089,6 @@ O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -4296,7 +4113,6 @@ O:0:0:0:0 B:HIT:HURT:2d5 B:BITE:HURT:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -4314,7 +4130,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -4337,7 +4152,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -4358,7 +4172,6 @@ W:12:3:2600:60 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -4381,7 +4194,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:HURT_LITE @@ -4405,7 +4217,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -4438,7 +4249,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4460,7 +4270,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4490,7 +4299,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4519,7 +4327,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:EXP_10 B:GAZE:EXP_10 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -4542,7 +4349,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -4568,7 +4374,6 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4595,7 +4400,6 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:1d9 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4625,7 +4429,6 @@ W:12:2:0:40 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -4649,7 +4452,6 @@ W:12:1:1500:38 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -4672,7 +4474,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -4697,7 +4498,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -4717,7 +4517,6 @@ E:0:0:0:0:0:0 O:45:15:25:0 B:WAIL:TERRIFY B:TOUCH:LOSE_DEX:1d8 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -4747,7 +4546,6 @@ B:BITE:HURT:2d4 B:BITE:HURT:2d4 B:STING:HURT:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -4763,7 +4561,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -4787,7 +4584,6 @@ O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:POISON:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -4813,7 +4609,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:POISON:1d8 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -4834,7 +4629,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -4852,7 +4646,6 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d9 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -4888,7 +4681,6 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -4911,7 +4703,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -4934,7 +4725,6 @@ W:13:2:1500:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d2 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4965,7 +4755,6 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4998,7 +4787,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:DROP_90 @@ -5023,7 +4811,6 @@ E:1:1:1:2:1:1 O:10:50:20:15 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5050,7 +4837,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -5094,7 +4880,6 @@ O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:CHAR_MULTI F:COLD_BLOOD @@ -5117,7 +4902,6 @@ O:0:0:0:0 B:HIT:PARALYZE B:HIT:PARALYZE F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_60 F:EMPTY_MIND @@ -5147,7 +4931,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -5172,7 +4955,6 @@ B:CRAWL:POISON:1d4 B:CRAWL:EAT_FOOD B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -5196,7 +4978,6 @@ W:14:4:2600:20 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5219,7 +5000,6 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5242,7 +5022,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:EMPTY_MIND @@ -5265,7 +5044,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -5286,7 +5064,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_50 @@ -5304,7 +5081,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -5335,7 +5111,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -5358,7 +5133,6 @@ E:1:1:1:2:1:1 O:0:70:0:15 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5381,7 +5155,6 @@ E:1:1:1:2:1:1 O:30:30:30:5 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5406,7 +5179,6 @@ E:0:0:0:0:1:0 O:0:0:80:20 B:STING:HURT:1d10 B:BITE:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -5438,7 +5210,6 @@ O:0:0:0:0 B:HIT:POISON:2d2 B:HIT:POISON:2d2 F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_60 F:EMPTY_MIND @@ -5469,7 +5240,6 @@ B:SPORE:CONFUSE B:SPORE:CONFUSE B:SPORE:HALLU B:SPORE:HALLU -F:BASEANGBAND F:CAN_SWIM F:FORCE_SLEEP F:NEVER_MOVE @@ -5495,7 +5265,6 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -5518,7 +5287,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5546,7 +5314,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -5567,7 +5334,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -5587,7 +5353,6 @@ E:0:0:0:0:1:0 O:90:0:10:0 B:BITE:POISON:1d3 B:BITE:LOSE_STR:1d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -5614,7 +5379,6 @@ B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_POIS @@ -5634,7 +5398,6 @@ B:BITE:HURT:2d4 B:STING:HURT:2d4 F:ANIMAL F:ATTR_CLEAR -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:INVISIBLE @@ -5653,7 +5416,6 @@ B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -5677,7 +5439,6 @@ O:20:80:0:0 B:HIT:COLD:5d8 B:HIT:COLD:5d8 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5704,7 +5465,6 @@ O:0:0:0:0 B:HIT:HURT:3d4 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -5723,7 +5483,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:PARALYZE:1d2 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -5742,7 +5501,6 @@ W:15:2:900:40 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_SKELETON @@ -5771,7 +5529,6 @@ B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:ANIMAL F:ATTR_CLEAR -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -5791,7 +5548,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -5816,7 +5572,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:DROP_CORPSE F:IM_ACID F:IM_POIS @@ -5836,7 +5591,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:2d10 B:HIT:HURT:2d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5858,7 +5612,6 @@ O:40:30:20:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -5891,7 +5644,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -5914,7 +5666,6 @@ O:20:80:0:0 B:HIT:FIRE:6d8 B:HIT:FIRE:6d8 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5939,7 +5690,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:2d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:RAND_25 F:RAND_50 @@ -5955,7 +5705,6 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -5981,7 +5730,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -6008,7 +5756,6 @@ O:0:0:0:0 B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -6038,7 +5785,6 @@ O:20:80:0:0 B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:HIT:HURT:7d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6067,7 +5813,6 @@ O:0:50:30:10 B:BITE:LOSE_DEX:1d6 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -6100,7 +5845,6 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_1D2 @@ -6124,7 +5868,6 @@ E:0:1:1:0:1:0 O:30:20:50:0 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -6159,7 +5902,6 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6185,7 +5927,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:COLD:8d8 F:AURA_COLD -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -6209,7 +5950,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:FIRE:8d8 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -6233,7 +5973,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:ELEC:8d8 F:AURA_ELEC -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -6257,7 +5996,6 @@ O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -6284,7 +6022,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:TERRIFY:2d5 B:CLAW:TERRIFY:5d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:MORTAL @@ -6300,7 +6037,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -6323,7 +6059,6 @@ O:0:0:0:0 B:BITE:HURT:2d4 B:STING:LOSE_STR:1d7 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -6339,7 +6074,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -6365,7 +6099,6 @@ O:0:0:0:0 B:HIT:FIRE:2d6 B:HIT:FIRE:2d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -6392,7 +6125,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:FIRE:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6417,7 +6149,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:COLD:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6441,7 +6172,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:ELEC:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6464,7 +6194,6 @@ O:10:10:10:10 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -6493,7 +6222,6 @@ O:0:0:0:0 B:HIT:POISON:3d4 B:HIT:CONFUSE:2d3 B:HIT:PARALYZE:2d3 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:EMPTY_MIND @@ -6520,7 +6248,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6542,7 +6269,6 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6571,7 +6297,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -6602,7 +6327,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -6630,7 +6354,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:EMPTY_MIND @@ -6678,7 +6401,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -6702,7 +6424,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6725,7 +6446,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -6747,7 +6467,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -6770,7 +6489,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:FIRE:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_FIRE @@ -6793,7 +6511,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -6819,7 +6536,6 @@ B:CLAW:PARALYZE:2d4 B:CLAW:PARALYZE:2d4 B:BITE:LOSE_CON:2d4 B:BITE:LOSE_CHR:2d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -6843,7 +6559,6 @@ I:120:3d2:8:18:10 W:19:4:100:4 B:BITE:POISON:2d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:EVIL F:RAND_25 @@ -6869,7 +6584,6 @@ B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:DROP_60 F:IM_COLD F:NEVER_MOVE @@ -6896,7 +6610,6 @@ B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -6928,7 +6641,6 @@ B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_SKELETON @@ -6955,7 +6667,6 @@ O:50:50:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:WAIL:TERRIFY -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -7006,7 +6717,6 @@ B:BITE:HURT:2d6 B:STING:POISON:1d6 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -7035,7 +6745,6 @@ B:CLAW:HURT:6d3 B:CLAW:HURT:6d3 B:BITE:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:GOOD @@ -7056,7 +6765,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:FRIENDS @@ -7085,7 +6793,6 @@ B:BITE:HURT:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7109,7 +6816,6 @@ B:BITE:POISON:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -7134,7 +6840,6 @@ B:CLAW:HURT:1d10 B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7156,7 +6861,6 @@ B:BITE:ACID:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -7179,7 +6883,6 @@ O:0:0:0:0 B:BUTT:HURT:2d8 B:BITE:HURT:2d10 B:BITE:FIRE:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -7202,7 +6905,6 @@ W:20:1:3000:250 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:INVISIBLE @@ -7226,7 +6928,6 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7247,7 +6948,6 @@ E:1:1:1:2:1:1 O:20:50:20:0 B:HIT:HURT:5d4 B:HIT:HURT:5d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -7275,7 +6975,6 @@ E:1:1:1:2:1:1 O:20:60:0:10 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -7305,7 +7004,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -7323,7 +7021,6 @@ E:1:1:1:2:1:1 O:0:80:20:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -7353,7 +7050,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:8d8 B:HIT:ELEC:8d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -7377,7 +7073,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -7408,7 +7103,6 @@ O:0:0:0:0 B:BITE:ELEC:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -7429,7 +7123,6 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -7460,7 +7153,6 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -7489,7 +7181,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:3d3 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -7517,7 +7208,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ACID:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -7544,7 +7234,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -7572,7 +7261,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:COLD:3d3 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -7599,7 +7287,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ELEC:3d3 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -7627,7 +7314,6 @@ B:BITE:POISON:10d5 B:BITE:POISON:10d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -7646,7 +7332,6 @@ I:120:3d2:8:18:10 W:24:4:100:4 B:BITE:BLIND:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:RAND_25 F:RAND_50 @@ -7663,7 +7348,6 @@ E:1:1:1:2:1:1 O:10:70:0:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -7689,7 +7373,6 @@ B:CLAW:HURT:2d6 B:BITE:HURT:2d10 B:WAIL:TERRIFY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -7715,7 +7398,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_20:1d6 B:ENGULF:EXP_20:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -7740,7 +7422,6 @@ O:0:0:0:0 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -7757,7 +7438,6 @@ W:22:2:3800:160 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -7812,7 +7492,6 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:STING:POISON:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -7827,7 +7506,6 @@ W:23:1:400:7 E:0:0:0:0:0:0 O:30:0:40:15 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -7854,7 +7532,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:6d5 B:HIT:HURT:6d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -7876,7 +7553,6 @@ O:10:90:0:0 B:HIT:HURT:5d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -7907,7 +7583,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -7937,7 +7612,6 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:EAT_GOLD:4d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -7960,7 +7634,6 @@ O:0:0:0:0 B:BITE:FIRE:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -7980,7 +7653,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -7998,7 +7670,6 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:CLAW:COLD:2d3 B:CLAW:COLD:2d3 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -8025,7 +7696,6 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8058,7 +7728,6 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -8090,7 +7759,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8125,7 +7793,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8160,7 +7827,6 @@ B:CLAW:HURT:7d3 B:CLAW:HURT:7d3 B:BITE:HURT:3d7 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -8183,7 +7849,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d33 B:HIT:HURT:2d44 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -8204,7 +7869,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:HAS_LITE @@ -8225,7 +7889,6 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -8281,7 +7944,6 @@ E:1:1:1:2:1:1 O:20:40:20:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -8307,7 +7969,6 @@ O:0:0:0:0 B:BITE:EXP_40:1d4 B:BITE:EXP_40:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EVIL @@ -8332,7 +7993,6 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8364,7 +8024,6 @@ E:0:0:0:0:0:0 O:80:0:0:15 B:WAIL:TERRIFY B:TOUCH:EXP_20 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -8394,7 +8053,6 @@ O:0:0:0:0 B:STING:PARALYZE:2d6 B:STING:PARALYZE:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_POIS @@ -8414,7 +8072,6 @@ B:GAZE:TERRIFY B:GAZE:PARALYZE B:GAZE:LOSE_STR B:GAZE:HALLU -F:BASEANGBAND F:COLD_BLOOD F:COLD_BLOOD F:EMPTY_MIND @@ -8453,7 +8110,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -8482,7 +8138,6 @@ O:10:0:80:10 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -8515,7 +8170,6 @@ O:0:100:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -8540,7 +8194,6 @@ O:30:70:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -8569,7 +8222,6 @@ B:CRAWL:ACID:2d4 B:BITE:HURT:1d10 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -8588,7 +8240,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -8609,7 +8260,6 @@ B:HIT:UN_BONUS F:AI_ANNOY F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -8626,7 +8276,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:KILL_BODY @@ -8644,7 +8293,6 @@ B:GAZE:TERRIFY B:HIT:DISEASE:6d6 B:CLAW:LOSE_CON:4d4 B:CLAW:LOSE_CON:4d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -8685,7 +8333,6 @@ B:CLAW:HURT:15d2 B:CLAW:HURT:15d2 B:BITE:HURT:3d10 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -8709,7 +8356,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:HAS_LITE @@ -8731,7 +8377,6 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:INVISIBLE @@ -8747,7 +8392,6 @@ O:40:60:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -8777,7 +8421,6 @@ B:CLAW:HURT:1d10 B:BITE:HURT:2d8 B:CRUSH:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -8799,7 +8442,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -8820,7 +8462,6 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -8851,7 +8492,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -8888,7 +8528,6 @@ O:0:45:35:10 B:CLAW:DISEASE:1d4 B:CLAW:DISEASE:1d4 B:BITE:PARALYZE:1d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -8918,7 +8557,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:UN_BONUS:3d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -8960,7 +8598,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_20:2d13 B:HIT:EXP_20:2d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -8988,7 +8625,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:FIRE:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -9011,7 +8647,6 @@ B:BITE:POISON:3d4 B:TOUCH:POISON:3d5 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -9036,7 +8671,6 @@ O:10:80:0:10 B:CLAW:POISON:3d3 B:CLAW:POISON:3d3 B:BITE:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -9060,7 +8694,6 @@ B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 -F:BASEANGBAND F:DROP_1D2 F:DROP_2D2 F:DROP_60 @@ -9101,7 +8734,6 @@ B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -9126,7 +8758,6 @@ B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -9149,7 +8780,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -9172,7 +8802,6 @@ O:5:85:0:5 B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:HIT:HURT:6d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -9205,7 +8834,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -9243,7 +8871,6 @@ O:0:0:0:0 B:BUTT:HURT:2d10 B:BITE:FIRE:2d10 B:GAZE:PARALYZE:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -9265,7 +8892,6 @@ O:0:0:0:0 B:HIT:ELEC:3d8 B:HIT:ELEC:3d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -9294,7 +8920,6 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -9361,7 +8986,6 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -9432,7 +9056,6 @@ O:0:90:10:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9462,7 +9085,6 @@ B:BITE:LOSE_DEX:4d5 B:BITE:LOSE_CON:4d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:FORCE_SLEEP F:GOOD F:IM_COLD @@ -9488,7 +9110,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:9d9 B:HIT:HURT:9d9 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9519,7 +9140,6 @@ E:1:1:1:2:1:1 O:0:0:90:10 B:HIT:CONFUSE:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9551,7 +9171,6 @@ B:HIT:HURT:1d8 B:BITE:ACID:2d8 B:STING:POISON:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -9572,7 +9191,6 @@ B:GAZE:BLIND:2d4 B:BUTT:HURT:2d6 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -9593,7 +9211,6 @@ O:0:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -9622,7 +9239,6 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9656,7 +9272,6 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:CRUSH:LOSE_INT:2d6 B:GAZE:INSANITY:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_60 @@ -9723,7 +9338,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -9752,7 +9366,6 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:COLD:2d6 B:BITE:COLD:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -9780,7 +9393,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -9819,7 +9431,6 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -9855,7 +9466,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -9886,7 +9496,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -9917,7 +9526,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -9946,7 +9554,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -9975,7 +9582,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -10002,7 +9608,6 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -10029,7 +9634,6 @@ B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -10062,7 +9666,6 @@ B:CLAW:HURT:16d2 B:CLAW:HURT:16d2 B:BITE:HURT:4d10 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -10085,7 +9688,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:5d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_ELEC @@ -10104,7 +9706,6 @@ O:0:50:50:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -10137,7 +9738,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:EXP_10:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -10172,7 +9772,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10195,7 +9794,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FRIENDS @@ -10215,7 +9813,6 @@ O:0:0:0:0 B:BITE:HURT:5d8 B:BITE:HURT:5d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10237,7 +9834,6 @@ B:BUTT:HURT:3d9 B:BITE:POISON:1d10 B:KICK:HURT:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -10262,7 +9858,6 @@ B:WAIL:TERRIFY B:TOUCH:EXP_20 B:CLAW:LOSE_INT:1d6 B:CLAW:LOSE_WIS:1d6 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -10294,7 +9889,6 @@ O:0:0:0:0 B:BITE:HURT:5d4 B:WAIL:TERRIFY:5d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10311,7 +9905,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10330,7 +9923,6 @@ W:32:1:3000:300 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:INVISIBLE @@ -10357,7 +9949,6 @@ B:CLAW:POISON:5d6 B:BITE:PARALYZE:5d10 B:STING:LOSE_STR:5d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -10406,7 +9997,6 @@ B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FORCE_MAXHP F:IM_ACID @@ -10432,7 +10022,6 @@ B:CLAW:LOSE_STR:3d4 B:CLAW:DISEASE:3d4 B:CLAW:DISEASE:3d4 B:BITE:PARALYZE:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -10470,7 +10059,6 @@ B:BITE:FIRE:5d4 F:AI_ANNOY F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10489,7 +10077,6 @@ O:0:100:0:0 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10511,7 +10098,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:1d4 B:HIT:CONFUSE:1d4 -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:MORTAL @@ -10535,7 +10121,6 @@ O:10:90:0:0 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10570,7 +10155,6 @@ O:0:0:0:0 B:GAZE:PARALYZE:1d4 B:GAZE:CONFUSE:1d4 B:BITE:HURT:1d8 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EMPTY_MIND @@ -10600,7 +10184,6 @@ B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -10624,7 +10207,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10661,7 +10243,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10698,7 +10279,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10736,7 +10316,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10761,7 +10340,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -10794,7 +10372,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:1d5 B:BITE:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -10822,7 +10399,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -10857,7 +10433,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -10892,7 +10467,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -10931,7 +10505,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_3D2 @@ -10962,7 +10535,6 @@ O:0:100:0:0 B:HIT:HURT:7d10 B:HIT:HURT:7d10 B:HIT:EAT_GOLD:2d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -10992,7 +10564,6 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -11027,7 +10598,6 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_WIS:5d5 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -11062,7 +10632,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HURT:2d2 B:HIT:HURT:2d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -11091,7 +10660,6 @@ O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -11125,7 +10693,6 @@ B:HIT:HURT:4d3 B:HIT:HURT:3d8 B:HIT:HURT:4d3 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_1D2 @@ -11170,7 +10737,6 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11204,7 +10770,6 @@ B:BITE:HURT:4d4 B:BITE:HURT:4d4 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -11236,7 +10801,6 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -11264,7 +10828,6 @@ O:0:0:0:0 B:STING:PARALYZE:2d6 B:STING:PARALYZE:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FRIENDS @@ -11285,7 +10848,6 @@ B:HIT:HURT:2d8 B:HIT:HURT:3d4 B:HIT:EAT_GOLD:4d4 B:HIT:EAT_ITEM:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -11313,7 +10875,6 @@ B:CRUSH:POISON:8d8 B:CRUSH:PARALYZE:8d8 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:DROP_1D2 @@ -11354,7 +10915,6 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d8 B:TOUCH:LOSE_DEX:2d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -11390,7 +10950,6 @@ W:34:4:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:DISEASE:30d2 -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -11412,7 +10971,6 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11452,7 +11010,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11494,7 +11051,6 @@ B:CLAW:LOSE_CON:3d6 B:CLAW:DISEASE:3d6 B:GAZE:EXP_40:3d4 B:GAZE:TERRIFY:3d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -11544,7 +11100,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:STING:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -11561,7 +11116,6 @@ O:0:0:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -11591,7 +11145,6 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:CONFUSE:1d4 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11619,7 +11172,6 @@ I:110:32d8:2:24:70 W:27:1:0:140 B:SPORE:ELEC:5d4 B:SPORE:ELEC:5d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_ELEC @@ -11641,7 +11193,6 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:1d6 -F:BASEANGBAND F:DEMON F:DROP_60 F:EVIL @@ -11671,7 +11222,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:HURT_LITE @@ -11699,7 +11249,6 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -11756,7 +11305,6 @@ B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -11780,7 +11328,6 @@ B:TOUCH:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:5d5 B:CLAW:LOSE_WIS:5d5 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -11814,7 +11361,6 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -11852,7 +11398,6 @@ B:GAZE:UN_BONUS:5d2 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_POWER:5d2 B:GAZE:UN_POWER:5d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -11877,7 +11422,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:2d6 B:ENGULF:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -11908,7 +11452,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:HURT:2d3 B:BITE:HURT:2d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -11932,7 +11475,6 @@ E:1:1:1:2:1:1 O:100:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:DROP_90 F:DROP_CORPSE F:DROP_SKELETON @@ -11961,7 +11503,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -11986,7 +11527,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -12019,7 +11559,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -12044,7 +11583,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -12066,7 +11604,6 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -12092,7 +11629,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -12126,7 +11662,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12154,7 +11689,6 @@ B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -12169,7 +11703,6 @@ O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -12191,7 +11724,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12224,7 +11756,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_MAXHP @@ -12251,7 +11782,6 @@ B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:BITE:HURT:4d10 B:SPIT:ACID:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -12282,7 +11812,6 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -12312,7 +11841,6 @@ O:0:50:50:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -12346,7 +11874,6 @@ B:GAZE:PARALYZE B:CLAW:LOSE_CON:1d10 B:CLAW:LOSE_CON:1d10 B:GAZE:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -12382,7 +11909,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:3d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12421,7 +11947,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -12453,7 +11978,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12483,7 +12007,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12514,7 +12037,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12545,7 +12067,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12575,7 +12096,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12608,7 +12128,6 @@ B:HIT:HURT:3d8 B:HIT:PARALYZE:15d1 B:HIT:PARALYZE:15d1 F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:CHAR_MULTI F:COLD_BLOOD @@ -12633,7 +12152,6 @@ B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:GAZE:EXP_20 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -12682,7 +12200,6 @@ E:1:1:1:0:1:1 O:0:0:0:0 B:CLAW:HURT:5d6 B:CLAW:HURT:5d6 -F:BASEANGBAND F:DEMON F:EVIL F:FORCE_SLEEP @@ -12712,7 +12229,6 @@ B:TOUCH:COLD:4d3 B:HIT:HURT:4d6 B:TOUCH:COLD:4d3 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -12742,7 +12258,6 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_SKELETON @@ -12839,7 +12354,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_GOOD @@ -12870,7 +12384,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -12899,7 +12412,6 @@ B:ENGULF:UN_POWER:5d5 B:ENGULF:UN_BONUS:5d5 B:HIT:LOSE_ALL:5d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -12929,7 +12441,6 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d10 B:TOUCH:LOSE_DEX:2d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -12967,7 +12478,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -12998,7 +12508,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HALLU:1d9 B:HIT:HALLU:1d9 -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_MAXHP @@ -13039,7 +12548,6 @@ B:HIT:FIRE:3d7 B:HIT:HURT:4d6 B:HIT:FIRE:3d7 F:AURA_FIRE -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:HAS_LITE @@ -13072,7 +12580,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -13108,7 +12615,6 @@ B:GAZE:PARALYZE F:ANIMAL F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -13126,7 +12632,6 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -13156,7 +12661,6 @@ B:ENGULF:FIRE:4d8 B:ENGULF:ELEC:4d8 F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -13187,7 +12691,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13221,7 +12724,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13252,7 +12754,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13287,7 +12788,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13317,7 +12817,6 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:4d12 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13357,7 +12856,6 @@ B:CLAW:POISON:8d4 B:CLAW:POISON:8d4 B:BITE:HURT:8d8 B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -13403,7 +12901,6 @@ O:0:90:0:10 B:HIT:EXP_20:6d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -13438,7 +12935,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_GOOD @@ -13468,7 +12964,6 @@ W:38:4:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:TIME:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -13493,7 +12988,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:BLIND:4d4 B:ENGULF:BLIND:4d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -13525,7 +13019,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:ELEC:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13559,7 +13052,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13592,7 +13084,6 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -13629,7 +13120,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -13665,7 +13155,6 @@ B:HIT:HURT:4d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_1D2 @@ -13714,7 +13203,6 @@ B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SPEAK @@ -13752,7 +13240,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_40 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -13789,7 +13276,6 @@ B:KICK:HURT:24d1 B:KICK:HURT:24d1 B:CLAW:EXP_80:4d2 B:CLAW:LOSE_DEX:4d2 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -13832,7 +13318,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_4D2 @@ -13871,7 +13356,6 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -13898,7 +13382,6 @@ B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:SPIT:BLIND:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -13927,7 +13410,6 @@ B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -13965,7 +13447,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -14010,7 +13491,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:COLD:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14045,7 +13525,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:POISON:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14079,7 +13558,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:HURT:3d4 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -14109,7 +13587,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 B:BITE:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -14140,7 +13617,6 @@ B:BITE:EXP_80:2d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:CONFUSE:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -14170,7 +13646,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_80:4d6 B:BITE:EXP_80:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -14211,7 +13686,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:ACID:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14272,7 +13746,6 @@ B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:BITE:HURT:6d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -14300,7 +13773,6 @@ O:10:90:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:CAN_FLY F:DROP_90 F:EVIL @@ -14326,7 +13798,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -14353,7 +13824,6 @@ O:0:0:0:0 B:CRAWL:UN_BONUS:1d4 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:HURT_LITE @@ -14374,7 +13844,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -14400,7 +13869,6 @@ B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -14434,7 +13902,6 @@ B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_3D2 @@ -14463,7 +13930,6 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -14494,7 +13960,6 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -14542,7 +14007,6 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_90 @@ -14583,7 +14047,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -14612,7 +14075,6 @@ B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 B:HIT:ELEC:12d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -14635,7 +14097,6 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:2d6 B:BUTT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -14653,7 +14114,6 @@ B:GAZE:EXP_80 B:GAZE:PARALYZE B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -14694,7 +14154,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:EXP_80:7d10 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_2D2 @@ -14731,7 +14190,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:FIRE:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14767,7 +14225,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:HURT:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14801,7 +14258,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14839,7 +14295,6 @@ O:0:50:50:0 B:HIT:HURT:3d4 B:CRUSH:HURT:8d12 B:CRUSH:HURT:8d12 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_60 @@ -14867,7 +14322,6 @@ O:0:50:50:0 B:BITE:LOSE_DEX:3d6 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:BASEANGBAND F:CAN_FLY F:DEMON F:DROP_2D2 @@ -14907,7 +14361,6 @@ B:GAZE:EXP_40:4d4 B:GAZE:EXP_40:4d4 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_3D2 @@ -15049,7 +14502,6 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_90 @@ -15094,7 +14546,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d12 B:TOUCH:LOSE_DEX:2d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -15137,7 +14588,6 @@ A:84:50 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -15192,7 +14642,6 @@ B:GAZE:TERRIFY:4d4 B:GAZE:TERRIFY:4d4 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_3D2 @@ -15237,7 +14686,6 @@ B:GAZE:EXP_40:3d6 B:GAZE:UN_POWER:3d6 B:GAZE:INSANITY:3d6 B:BITE:EXP_40:7d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -15283,7 +14731,6 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -15319,7 +14766,6 @@ O:0:0:100:0 B:BUTT:COLD:3d6 B:BUTT:FIRE:3d6 B:BUTT:ELEC:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -15364,7 +14810,6 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -15403,7 +14848,6 @@ B:GAZE:PARALYZE:3d12 B:BITE:POISON:2d12 B:BITE:POISON:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -15433,7 +14877,6 @@ B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FRIENDS @@ -15496,7 +14939,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15542,7 +14984,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_2D2 @@ -15576,7 +15017,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:SHATTER:10d10 -F:BASEANGBAND F:CAN_SPEAK F:COLD_BLOOD F:EMPTY_MIND @@ -15663,7 +15103,6 @@ B:HIT:CONFUSE:4d4 B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -15703,7 +15142,6 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -15734,7 +15172,6 @@ O:0:10:90:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -15773,7 +15210,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -15817,7 +15253,6 @@ B:CLAW:HURT:3d10 B:BITE:POISON:5d10 B:BITE:POISON:5d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -15856,7 +15291,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:COLD:4d14 B:BITE:COLD:4d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15894,7 +15328,6 @@ B:HIT:UN_BONUS:4d8 B:HIT:UN_BONUS:4d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -15937,7 +15370,6 @@ B:HIT:EAT_ITEM:5d5 B:HIT:EAT_ITEM:5d5 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_GOLD:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -15963,7 +15395,6 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:FIRE:5d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -16004,7 +15435,6 @@ O:0:100:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -16055,7 +15485,6 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:EXP_80:7d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -16096,7 +15525,6 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_4D2 @@ -16134,7 +15562,6 @@ B:BITE:FIRE:7d14 B:GAZE:PARALYZE F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16169,7 +15596,6 @@ B:CLAW:HURT:3d8 B:BITE:EXP_40:4d6 B:BITE:EXP_40:4d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EVIL @@ -16198,7 +15624,6 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_GOOD @@ -16254,7 +15679,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:FIRE:4d14 B:BITE:FIRE:4d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16290,7 +15714,6 @@ B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:EXP_80:5d5 -F:BASEANGBAND F:CAN_SWIM F:EVIL F:FORCE_SLEEP @@ -16318,7 +15741,6 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -16349,7 +15771,6 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:FIRE:8d14 B:BITE:POISON:8d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -16398,7 +15819,6 @@ B:CRUSH:HURT:3d15 B:CRUSH:HURT:3d15 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:FORCE_MAXHP @@ -16424,7 +15844,6 @@ O:0:0:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -16457,7 +15876,6 @@ B:CLAW:HURT:6d6 B:CLAW:HURT:6d6 B:CLAW:HURT:6d6 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:DEMON F:DROP_1D2 @@ -16496,7 +15914,6 @@ B:HIT:HURT:4d10 B:HIT:HURT:4d10 B:HIT:LOSE_CON:10d2 B:STING:POISON:5d5 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -16528,7 +15945,6 @@ B:TOUCH:POISON:6d5 B:TOUCH:POISON:6d5 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -16573,7 +15989,6 @@ B:HIT:SHATTER:8d8 B:HIT:SHATTER:8d8 B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -16603,7 +16018,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -16631,7 +16045,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -16658,7 +16071,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -16686,7 +16098,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -16715,7 +16126,6 @@ B:BITE:ELEC:6d14 B:BITE:ELEC:6d14 F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16752,7 +16162,6 @@ O:0:100:0:0 B:HIT:SHATTER:20d12 B:HIT:SHATTER:20d12 B:BITE:POISON:6d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -16790,7 +16199,6 @@ B:BUTT:HURT:12d13 B:BUTT:HURT:12d13 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -16826,7 +16234,6 @@ B:HIT:HURT:10d5 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -16952,7 +16359,6 @@ O:0:0:100:0 B:HIT:HURT:6d8 B:HIT:HURT:6d8 B:HIT:HURT:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:EVIL @@ -16995,7 +16401,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:FORCE_SLEEP F:FRIENDS F:INVISIBLE @@ -17019,7 +16424,6 @@ B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_3D2 F:DROP_CORPSE @@ -17064,7 +16468,6 @@ B:BITE:COLD:6d14 B:BITE:COLD:6d14 F:ATTR_MULTI F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -17103,7 +16506,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:4d12 B:TOUCH:LOSE_DEX:4d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -17154,7 +16556,6 @@ B:HIT:FIRE:9d12 B:HIT:FIRE:9d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -17195,7 +16596,6 @@ B:STING:LOSE_CON:8d8 B:STING:LOSE_CON:8d8 B:BITE:ACID:10d10 B:BITE:ACID:10d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -17238,7 +16638,6 @@ I:130:60d10:20:110:10 W:57:2:10:18000 E:0:0:0:1:0:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -17276,7 +16675,6 @@ I:130:10d100:20:90:10 W:58:2:2:21000 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -17309,7 +16707,6 @@ I:130:14d100:20:120:10 W:59:2:1000:24000 E:0:0:0:0:1:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -17350,7 +16747,6 @@ B:ENGULF:HURT:5d5 B:ENGULF:HURT:5d5 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -17382,7 +16778,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -17437,7 +16832,6 @@ B:BITE:POISON:8d6 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_3D2 @@ -17484,7 +16878,6 @@ B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 B:HIT:CONFUSE:6d6 B:HIT:CONFUSE:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -17539,7 +16932,6 @@ B:BITE:FIRE:6d14 B:BITE:FIRE:6d14 F:ATTR_MULTI F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -17575,7 +16967,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -17602,7 +16993,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -17651,7 +17041,6 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:CRUSH:ACID:9d9 B:CRUSH:ACID:9d9 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_3D2 @@ -17689,7 +17078,6 @@ B:HIT:FIRE:4d12 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -17741,7 +17129,6 @@ B:HIT:EXP_80:10d5 B:HIT:HURT:10d10 B:HIT:HURT:10d10 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -17794,7 +17181,6 @@ B:CLAW:HURT:10d12 B:CLAW:HURT:10d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -17842,7 +17228,6 @@ B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:7d7 B:HIT:UN_BONUS:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -17889,7 +17274,6 @@ B:HIT:FIRE:6d8 B:HIT:BLIND:10d10 B:HIT:BLIND:10d10 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -17942,7 +17326,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -18002,7 +17385,6 @@ B:TOUCH:EAT_GOLD:5d5 B:TOUCH:EAT_ITEM:5d5 B:HIT:BLIND:10d5 B:HIT:POISON:8d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -18033,7 +17415,6 @@ B:HIT:LOSE_CHR:8d8 B:HIT:LOSE_CHR:8d8 B:BITE:POISON:10d10 B:STING:LOSE_STR:9d9 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_3D2 @@ -18075,7 +17456,6 @@ B:HIT:EXP_40:6d6 B:HIT:EXP_40:6d6 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -18123,7 +17503,6 @@ B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_3D2 F:DROP_CORPSE @@ -18169,7 +17548,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:8d12 B:TOUCH:LOSE_DEX:8d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -18218,7 +17596,6 @@ B:CLAW:CONFUSE:12d12 B:CLAW:LOSE_DEX:2d12 B:CLAW:BLIND:10d5 B:BITE:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_GOOD @@ -18252,7 +17629,6 @@ B:BITE:HURT:10d10 B:BITE:HURT:10d10 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_60 @@ -18283,7 +17659,6 @@ B:CLAW:HURT:2d12 F:ANIMAL F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -18307,7 +17682,6 @@ B:BITE:EXP_80:6d6 B:GAZE:PARALYZE:5d5 B:GAZE:INSANITY:5d5 B:GAZE:UN_POWER:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -18349,7 +17723,6 @@ B:CRUSH:HURT:6d15 B:CRUSH:HURT:6d15 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:FORCE_MAXHP F:FORCE_SLEEP @@ -18387,7 +17760,6 @@ B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18429,7 +17801,6 @@ B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18471,7 +17842,6 @@ B:CLAW:HURT:6d12 B:BITE:HURT:8d14 B:BITE:HURT:8d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18516,7 +17886,6 @@ B:CLAW:COLD:6d10 B:CLAW:COLD:6d10 B:BITE:COLD:9d9 B:HIT:PARALYZE:8d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -18607,7 +17976,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18702,7 +18070,6 @@ B:HIT:HURT:10d10 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 F:AURA_COLD -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:COLD_BLOOD @@ -18751,7 +18118,6 @@ B:BITE:ELEC:8d14 F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18791,7 +18157,6 @@ B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -18834,7 +18199,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -18881,7 +18245,6 @@ O:20:40:40:0 B:HIT:HURT:4d5 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:EVIL @@ -18925,7 +18288,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -18949,7 +18311,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -18974,7 +18335,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -19003,7 +18363,6 @@ B:TOUCH:EXP_80:6d12 B:TOUCH:UN_POWER:6d12 B:TOUCH:LOSE_DEX:6d12 B:TOUCH:LOSE_DEX:6d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -19054,7 +18413,6 @@ B:GAZE:UN_BONUS:6d6 B:GAZE:UN_POWER:6d6 B:GAZE:INSANITY:6d6 B:BITE:EXP_80:8d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -19095,7 +18453,6 @@ B:HIT:FIRE:8d12 B:CRUSH:HURT:7d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -19145,7 +18502,6 @@ B:CLAW:POISON:8d6 B:BITE:PARALYZE:8d10 B:STING:LOSE_STR:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -19196,7 +18552,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -19249,7 +18604,6 @@ B:CLAW:FIRE:8d10 B:CLAW:FIRE:8d10 B:BITE:POISON:7d10 B:BITE:LOSE_CON:7d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -19294,7 +18648,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:TOUCH:UN_POWER B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_4D2 @@ -19339,7 +18692,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_POWER:6d8 B:HIT:BLIND:6d8 B:HIT:CONFUSE:6d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -19438,7 +18790,6 @@ W:76:2:7000:15000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -19467,7 +18818,6 @@ E:0:0:0:0:0:0 O:20:20:20:20 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:DROP_4D2 F:EMPTY_MIND F:FORCE_MAXHP @@ -19561,7 +18911,6 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 F:AI_SPECIAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_3D2 @@ -19610,7 +18959,6 @@ B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 B:HIT:ELEC:12d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -19651,7 +18999,6 @@ B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -19677,7 +19024,6 @@ B:GAZE:EXP_80:5d5 B:GAZE:EXP_80:5d5 B:TOUCH:POISON:5d5 B:TOUCH:POISON:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -19770,7 +19116,6 @@ B:HIT:HURT:10d10 B:TOUCH:UN_POWER:10d10 B:TOUCH:UN_POWER:10d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_4D2 @@ -19804,7 +19149,6 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -19850,7 +19194,6 @@ B:CLAW:HURT:6d8 B:BITE:POISON:6d6 B:BITE:POISON:6d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -19919,7 +19262,6 @@ B:HIT:EXP_80:7d12 B:HIT:LOSE_DEX:7d12 B:HIT:UN_POWER:7d12 B:HIT:UN_POWER:7d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -19977,7 +19319,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -20049,7 +19390,6 @@ B:BITE:FIRE:9d12 B:BITE:FIRE:9d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -20088,7 +19428,6 @@ B:BITE:COLD:9d12 B:BITE:COLD:9d12 F:ANIMAL F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -20128,7 +19467,6 @@ B:HIT:FIRE:9d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -20232,7 +19570,6 @@ B:HIT:UN_BONUS:10d12 B:HIT:UN_BONUS:10d12 B:HIT:UN_POWER:8d12 B:HIT:UN_POWER:8d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -20385,7 +19722,6 @@ B:HIT:SHATTER:24d10 B:HIT:LOSE_ALL:10d12 B:TOUCH:UN_POWER F:AURA_COLD -F:BASEANGBAND F:CAN_SPEAK F:DROP_1D2 F:DROP_2D2 @@ -20455,7 +19791,6 @@ W:0:20:1700:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -20477,7 +19812,6 @@ W:0:20:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -20504,7 +19838,6 @@ W:0:20:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -20527,7 +19860,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -20693,7 +20025,6 @@ B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_2D2 @@ -20740,7 +20071,6 @@ B:CRAWL:POISON:3d4 B:CRAWL:EAT_FOOD:3d4 B:TOUCH:ACID:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -20779,7 +20109,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_FOOD:2d3 B:TOUCH:LOSE_CHR:2d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -20940,7 +20269,6 @@ O:0:0:0:0 B:BITE:HURT:2d3 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:MORTAL @@ -20958,7 +20286,6 @@ B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_ELEC F:MORTAL @@ -20978,7 +20305,6 @@ B:CLAW:HURT:3d4 B:CLAW:HURT:3d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:MORTAL @@ -20996,7 +20322,6 @@ B:TOUCH:PARALYZE:1d6 B:TOUCH:PARALYZE:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_POIS F:MORTAL @@ -21013,7 +20338,6 @@ B:BITE:HURT:5d1 B:BITE:HURT:5d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FRIENDS F:MORTAL @@ -21030,7 +20354,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FRIENDS F:MORTAL @@ -21046,7 +20369,6 @@ O:30:40:10:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_1D2 F:DROP_CORPSE @@ -21068,7 +20390,6 @@ O:15:60:10:10 B:HIT:HURT:2d5 B:HIT:HURT:2d5 F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_1D2 F:DROP_CORPSE @@ -21088,7 +20409,6 @@ O:25:10:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_1D2 F:DROP_CORPSE @@ -21118,7 +20438,6 @@ B:CRUSH:HURT:1d20 B:CRUSH:HURT:1d20 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:FORCE_MAXHP F:MORTAL F:RAND_25 @@ -21138,7 +20457,6 @@ B:BITE:POISON:3d6 F:ANIMAL F:AQUATIC F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:COLD_BLOOD F:DROP_CORPSE @@ -21161,7 +20479,6 @@ B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:MORTAL @@ -21182,7 +20499,6 @@ B:CRUSH:HURT:8d4 B:CRUSH:PARALYZE:8d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:IM_POIS @@ -21211,7 +20527,6 @@ B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -21251,7 +20566,6 @@ B:STING:INSANITY:5d10 B:STING:UN_BONUS F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:EVIL F:FORCE_MAXHP @@ -21286,7 +20600,6 @@ B:TOUCH:BLIND:3d3 B:TOUCH:POISON:2d4 B:WAIL:TERRIFY F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -21314,7 +20627,6 @@ O:0:0:0:0 B:BITE:HURT:4d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:RAND_25 @@ -21332,7 +20644,6 @@ B:BUTT:HURT:3d4 B:BITE:HURT:3d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -21349,7 +20660,6 @@ B:BITE:HURT:4d6 B:BITE:HURT:4d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FORCE_SLEEP F:MORTAL @@ -21364,7 +20674,6 @@ O:0:0:0:0 B:HIT:HURT:3d10 B:HIT:HURT:3d10 F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:IM_COLD @@ -21386,7 +20695,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d10 F:AQUATIC -F:BASEANGBAND F:DROP_90 F:DROP_CORPSE F:EVIL @@ -21405,7 +20713,6 @@ B:BITE:HURT:3d5 B:BITE:HURT:3d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -21423,7 +20730,6 @@ B:HIT:HURT:1d10 B:HIT:HURT:3d2 B:HIT:HURT:3d2 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:EVIL @@ -21450,7 +20756,6 @@ O:0:0:0:0 B:GAZE:PARALYZE F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:RAND_25 @@ -21470,7 +20775,6 @@ B:GAZE:PARALYZE B:GAZE:CONFUSE F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:SMART @@ -21488,7 +20792,6 @@ B:BITE:HURT:2d6 F:ANIMAL F:AQUATIC F:ATTR_CLEAR -F:BASEANGBAND F:DROP_CORPSE F:INVISIBLE F:MORTAL @@ -21506,7 +20809,6 @@ B:BITE:HURT:2d2 B:BITE:HURT:2d2 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL D:A giant turtle with flippers, adapted for life in the ocean. @@ -21522,7 +20824,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_1D2 F:DROP_60 @@ -21546,7 +20847,6 @@ B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_3D2 F:DROP_CORPSE @@ -21571,7 +20871,6 @@ B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_4D2 F:DROP_CORPSE @@ -21597,7 +20896,6 @@ B:CLAW:HURT:4d8 B:BITE:HURT:7d8 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_1D2 F:DROP_4D2 @@ -21630,7 +20928,6 @@ B:CRUSH:POISON:3d10 B:CRUSH:POISON:3d10 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:FORCE_MAXHP F:FORCE_SLEEP @@ -21661,7 +20958,6 @@ B:GAZE:PARALYZE B:GAZE:EXP_20 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:INVISIBLE F:NO_CUT F:SMART @@ -21682,7 +20978,6 @@ B:BITE:HURT:7d4 B:BITE:HURT:7d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:MORTAL F:WILD_OCEAN F:WILD_TOO @@ -21697,7 +20992,6 @@ O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -21725,7 +21019,6 @@ B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:POISON:1d8 F:AQUATIC -F:BASEANGBAND F:DROP_2D2 F:DROP_90 F:DROP_CORPSE @@ -21784,7 +21077,6 @@ B:BITE:HURT:2d8 B:CLAW:POISON:2d8 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:FRIENDS F:MORTAL @@ -21804,7 +21096,6 @@ B:HIT:HURT:3d4 B:GAZE:POISON:8d12 B:CLAW:INSANITY:8d12 F:AQUATIC -F:BASEANGBAND F:DEMON F:DROP_60 F:EVIL @@ -21835,7 +21126,6 @@ B:STING:POISON:2d5 B:STING:POISON:2d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:IM_POIS @@ -21853,7 +21143,6 @@ B:STING:POISON:2d7 B:STING:POISON:2d7 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:IM_POIS @@ -21878,7 +21167,6 @@ B:STING:POISON:3d8 B:STING:EXP_40:3d8 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:IM_POIS @@ -21928,7 +21216,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:3d4 -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:IM_POIS @@ -21951,7 +21238,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:9d4 -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:IM_POIS @@ -21974,7 +21260,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:18d4 -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:IM_POIS @@ -21997,7 +21282,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:20d4 -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:IM_POIS @@ -22020,7 +21304,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:30d4 -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:IM_POIS @@ -22045,7 +21328,6 @@ B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -22078,7 +21360,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:TERRIFY:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -22136,7 +21417,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -22167,7 +21447,6 @@ W:8:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:DROP_SKELETON @@ -22196,7 +21475,6 @@ B:CLAW:HURT:4d12 B:BITE:POISON:6d14 B:BITE:POISON:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -22235,7 +21513,6 @@ B:CLAW:HURT:4d12 B:BITE:ACID:6d14 B:BITE:ACID:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -22406,7 +21683,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -22436,7 +21712,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:EXP_80:4d6 B:HIT:EXP_80:4d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -22471,7 +21746,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:TOUCH:EXP_80:5d6 B:TOUCH:EXP_80:5d6 -F:BASEANGBAND F:COLD_BLOOD F:DROP_4D2 F:DROP_CHOSEN @@ -22517,7 +21791,6 @@ B:HIT:HURT:7d6 B:HIT:HURT:7d6 B:GAZE:EXP_80:6d6 B:WAIL:TERRIFY:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -22564,7 +21837,6 @@ B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -22611,7 +21883,6 @@ B:HIT:HURT:8d7 B:HIT:HURT:8d7 B:TOUCH:EXP_40:6d7 B:TOUCH:EXP_40:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -22659,7 +21930,6 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:BITE:EXP_40:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -22706,7 +21976,6 @@ B:HIT:HURT:9d9 B:HIT:HURT:9d9 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -22754,7 +22023,6 @@ B:HIT:HURT:9d10 B:HIT:HURT:9d10 B:TOUCH:EXP_80:7d7 B:TOUCH:EXP_80:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -22808,7 +22076,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:EXP_80:7d7 B:HIT:EXP_80:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -23048,7 +22315,6 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -23120,7 +22386,6 @@ B:CLAW:POISON:2d8 B:BITE:POISON:2d6 B:BITE:POISON:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -23149,7 +22414,6 @@ B:CLAW:POISON:5d8 B:BITE:HALLU:5d6 B:BITE:HALLU:5d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -23183,7 +22447,6 @@ O:0:0:0:0 B:BITE:POISON:2d6 B:STING:BLIND:1d1 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:IM_POIS @@ -23238,7 +22501,6 @@ I:110:1d1:30:1:10 W:10:3:10:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -23254,7 +22516,6 @@ B:BITE:POISON:1d10 B:CLAW:HURT:1d4 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_60 @@ -23279,7 +22540,6 @@ I:110:1d1:40:250:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:0:1:0 -F:BASEANGBAND F:CAN_SPEAK F:FEMALE F:FORCE_MAXHP @@ -23301,7 +22561,6 @@ I:110:1d1:40:250:3 W:1:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FORCE_MAXHP F:GOOD @@ -23326,7 +22585,6 @@ B:HIT:HURT:2d10 B:WAIL:PARALYZE:2d6 B:TOUCH:EXP_80:4d8 B:TOUCH:EXP_80:4d8 -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -23363,7 +22621,6 @@ O:50:50:0:0 B:HIT:HURT:2d6 B:PUNCH:HURT:1d7 B:KICK:HURT:1d8 -F:BASEANGBAND F:CAN_SWIM F:FORCE_MAXHP F:NO_CONF @@ -23378,7 +22635,6 @@ G:G:D I:120:5d5:30:50:10 W:30:3:10:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -23391,7 +22647,6 @@ G:G:D I:130:10d10:30:100:10 W:95:3:10:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -23409,7 +22664,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -23438,7 +22692,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -23532,7 +22785,6 @@ B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -23565,7 +22817,6 @@ G:@:w I:1:1d1:1:1:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:DOPPLEGANGER F:HAS_LITE F:NEVER_BLOW @@ -23732,7 +22983,6 @@ E:1:1:1:2:1:1 O:25:55:0:20 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -23759,7 +23009,6 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -23786,7 +23035,6 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -23818,7 +23066,6 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -23853,7 +23100,6 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:BITE:EXP_80:5d6 B:BITE:EXP_80:5d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -23899,7 +23145,6 @@ B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -23936,7 +23181,6 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -23967,7 +23211,6 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_2D2 @@ -23995,7 +23238,6 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_90 @@ -24024,7 +23266,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -24056,7 +23297,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -24089,7 +23329,6 @@ B:HIT:FIRE:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -24125,7 +23364,6 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -24164,7 +23402,6 @@ B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -24202,7 +23439,6 @@ E:1:1:1:2:1:1 O:0:50:50:0 B:HIT:HURT:3d4 B:TOUCH:LOSE_STR:1d5 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_60 @@ -24231,7 +23467,6 @@ W:4:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:DROP_SKELETON @@ -24258,7 +23493,6 @@ B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 B:HIT:HURT:11d10 B:HIT:SHATTER:11d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -24302,7 +23536,6 @@ B:CLAW:HURT:4d12 B:BITE:CONFUSE:6d14 B:BITE:CONFUSE:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -24341,7 +23574,6 @@ B:CLAW:HURT:4d12 B:BITE:HURT:6d14 B:BITE:HURT:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -24377,7 +23609,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:MORTAL @@ -24397,7 +23628,6 @@ B:CLAW:HURT:3d2 B:BITE:DISEASE:4d2 B:BITE:DISEASE:4d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -24416,7 +23646,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -24450,7 +23679,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -24466,7 +23694,6 @@ W:34:5:0:1200 E:0:0:0:0:0:0 O:0:0:100:0 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -24571,7 +23798,6 @@ B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 B:HIT:LOSE_STR:6d6 B:HIT:LOSE_STR:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -24610,7 +23836,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -24646,7 +23871,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24674,7 +23898,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24702,7 +23925,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24731,7 +23953,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24759,7 +23980,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24787,7 +24007,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -24824,7 +24043,6 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -24845,7 +24063,6 @@ B:CLAW:POISON:5d4 B:BITE:FIRE:5d4 B:BITE:ELEC:5d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -24883,7 +24100,6 @@ B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:BITE:HURT:5d5 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:EVIL @@ -24909,7 +24125,6 @@ B:GAZE:TIME:10d10 B:GAZE:INSANITY:10d10 B:GAZE:INSANITY:10d5 F:AURA_COLD -F:BASEANGBAND F:COLD_BLOOD F:DROP_3D2 F:DROP_4D2 @@ -24961,7 +24176,6 @@ B:HIT:INSANITY:5d6 B:HIT:INSANITY:6d6 B:HIT:INSANITY:7d6 B:HIT:INSANITY:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -25010,7 +24224,6 @@ B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -25053,7 +24266,6 @@ O:60:0:40:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -25092,7 +24304,6 @@ B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 B:HIT:SHATTER:13d13 B:HIT:CONFUSE:13d13 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -25129,7 +24340,6 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 E:1:1:1:2:1:1 O:0:100:0:0 -F:BASEANGBAND F:BASH_DOOR F:DROP_3D2 F:DROP_4D2 @@ -25175,7 +24385,6 @@ B:CLAW:HURT:1d4 E:0:1:0:2:1:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -25256,7 +24465,6 @@ B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -25295,7 +24503,6 @@ I:110:1d1:40:250:3 W:1:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FEMALE F:FORCE_MAXHP @@ -25316,7 +24523,6 @@ I:110:1d1:40:250:3 W:60:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FORCE_MAXHP F:GOOD @@ -25343,7 +24549,6 @@ B:HIT:FIRE:3d6 B:HIT:FIRE:3d6 F:AI_PLAYER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:HAS_LITE F:IM_FIRE @@ -25370,7 +24575,6 @@ B:HIT:TIME:24d10 B:HIT:INSANITY:24d10 B:HIT:LOSE_ALL:24d10 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_1D2 @@ -25446,7 +24650,6 @@ E:0:1:1:2:0:0 O:25:0:75:0 B:TOUCH:EXP_80:10d10 B:TOUCH:EXP_80:10d10 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:INVISIBLE @@ -25469,7 +24672,6 @@ B:CRAWL:POISON:10d10 B:CRAWL:EAT_ITEM:10d9 B:BITE:UN_BONUS:9d9 F:AI_ANNOY -F:BASEANGBAND F:FRIENDS F:PASS_WALL F:SPIRIT @@ -25487,7 +24689,6 @@ O:0:0:0:0 B:TOUCH:LOSE_DEX:2d3 B:TOUCH:PARALYZE:1d12 B:TOUCH:PARALYZE:1d12 -F:BASEANGBAND F:NO_SLEEP F:PASS_WALL F:SPIRIT @@ -25512,7 +24713,6 @@ B:ENGULF:CONFUSE:16d8 B:ENGULF:CONFUSE:16d8 F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -25542,8 +24742,6 @@ B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 -F:BASEANGBAND -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -25577,7 +24775,6 @@ B:BITE:HURT:14d18 F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -25648,7 +24845,6 @@ O:25:20:25:20 B:BITE:POISON:15d15 B:BITE:POISON:15d15 B:BITE:LOSE_ALL:10d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -25678,7 +24874,6 @@ B:GAZE:UN_BONUS:12d12 B:GAZE:UN_POWER:12d10 B:GAZE:INSANITY:12d14 B:GAZE:LOSE_ALL:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EVIL @@ -25712,7 +24907,6 @@ B:TOUCH:UN_POWER:12d10 B:TOUCH:INSANITY:12d14 B:TOUCH:LOSE_ALL:6d6 F:ATTR_CLEAR -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_CLEAR @@ -25748,7 +24942,6 @@ B:CRAWL:POISON:12d14 B:CRAWL:EAT_FOOD:12d14 B:TOUCH:ACID:13d15 B:HIT:HURT:13d15 -F:BASEANGBAND F:BASH_DOOR F:EMPTY_MIND F:EMPTY_MIND @@ -25780,7 +24973,6 @@ B:BITE:HURT:12d12 B:BITE:HURT:12d12 B:BITE:HURT:12d8 B:BITE:HURT:12d8 -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -25801,7 +24993,6 @@ B:WAIL:TERRIFY:8d9 B:HIT:HURT:10d10 B:HIT:ABOMINATION:6d10 B:HIT:ABOMINATION:6d10 -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:HURT_LITE @@ -25832,7 +25023,6 @@ O:0:100:0:0 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -25859,7 +25049,6 @@ O:0:0:100:0 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -25892,7 +25081,6 @@ O:0:50:50:0 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -25922,7 +25110,6 @@ O:0:50:25:25 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -25947,7 +25134,6 @@ O:0:50:0:50 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -25970,7 +25156,6 @@ O:70:10:10:10 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -26003,7 +25188,6 @@ B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 F:AI_ANNOY F:AURA_FIRE -F:BASEANGBAND F:HAS_LITE F:IM_FIRE F:SPIRIT @@ -26023,7 +25207,6 @@ B:HIT:COLD:10d8 B:HIT:COLD:10d8 B:HIT:COLD:10d8 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:IM_COLD @@ -26043,7 +25226,6 @@ O:25:60:0:15 B:HIT:ACID:10d8 B:HIT:ACID:10d8 B:HIT:ACID:10d8 -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:KILL_TREES @@ -26064,7 +25246,6 @@ B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:IM_ELEC F:SPIRIT @@ -26085,7 +25266,6 @@ B:HIT:FIRE:11d12 B:CRUSH:HURT:10d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -26120,7 +25300,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EXP_80:20d8 B:TOUCH:EXP_40:20d8 -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:IM_COLD @@ -26155,7 +25334,6 @@ B:HIT:HURT:10d9 B:HIT:HURT:9d9 B:BITE:EXP_80:9d9 B:BITE:EXP_80:9d9 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -26198,7 +25376,6 @@ B:HIT:SHATTER:18d10 B:HIT:SHATTER:18d10 B:HIT:LOSE_ALL:8d8 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:IM_COLD @@ -26236,7 +25413,6 @@ B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -26262,7 +25438,6 @@ B:TOUCH:EAT_GOLD:7d15 B:TOUCH:EAT_GOLD:7d15 B:HIT:POISON:6d12 B:HIT:POISON:6d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -26297,7 +25472,6 @@ O:0:10:90:0 B:HIT:HURT:14d14 B:HIT:HURT:14d14 B:HIT:HURT:14d14 -F:BASEANGBAND F:BASH_DOOR F:EVIL F:HAS_LITE @@ -26322,7 +25496,6 @@ E:0:1:0:6:1:0 B:CLAW:HURT:14d10 B:CLAW:HURT:14d10 B:BITE:HURT:17d10 -F:BASEANGBAND F:CAN_FLY F:EVIL F:INVISIBLE @@ -26353,7 +25526,6 @@ O:10:90:0:0 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:EVIL F:HAS_LITE diff --git a/lib/edit/re_info.txt b/lib/edit/re_info.txt index 9b89f19d..f71da68d 100644 --- a/lib/edit/re_info.txt +++ b/lib/edit/re_info.txt @@ -199,7 +199,6 @@ B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 -F:BASEANGBAND F:R_CHAR_k F:R_CHAR_o F:R_CHAR_y @@ -216,7 +215,6 @@ B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_P F:R_CHAR_T @@ -229,7 +227,6 @@ N:7:Shaman G:*:r I:+0:%90d%100:+10:%90:+0 W:+2:1:%90:%120:A -F:BASEANGBAND F:R_CHAR_k F:R_CHAR_n F:R_CHAR_o @@ -247,7 +244,6 @@ N:8:Priest G:*:G I:+0:%90d%100:+10:%90:+0 W:+3:2:%90:%120:A -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_P F:R_CHAR_T @@ -271,7 +267,6 @@ B:*:*:+0d+0 B:*:*:+0d+0 B:HIT:HURT:=2d=8 B:HIT:HURT:=2d=8 -F:BASEANGBAND F:R_CHAR_O M:DROP_1D2 M:FORCE_MAXHP @@ -289,7 +284,6 @@ N:10:Archer G:*:W I:+0:+0d+0:+0:+0:+0 W:+1:1:%100:%110:A -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_k F:R_CHAR_o diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt index 4c83746f..2f6ab2fe 100644 --- a/lib/mods/theme/edit/r_info.txt +++ b/lib/mods/theme/edit/r_info.txt @@ -201,7 +201,6 @@ E:1:1:1:2:1:1 O:1:1:1:1 B:BEG:* B:TOUCH:EAT_GOLD -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:EVIL @@ -224,7 +223,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:CLAW:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -245,7 +243,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_SKELETON F:HAS_EGG @@ -267,7 +264,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_SKELETON F:HAS_EGG @@ -289,7 +285,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -309,7 +304,6 @@ W:0:1:1000:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -335,7 +329,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -352,7 +345,6 @@ I:110:35d10:40:10:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:100:0:0 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_CORPSE @@ -381,7 +373,6 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -403,7 +394,6 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -427,7 +417,6 @@ W:0:1:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:DROOL:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -449,7 +438,6 @@ W:0:1:1300:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -473,7 +461,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* B:TOUCH:DISEASE -F:BASEANGBAND F:DROP_1D2 F:DROP_CORPSE F:DROP_SKELETON @@ -498,7 +485,6 @@ O:25:50:20:5 B:HIT:HURT:1d6 B:TOUCH:EAT_ITEM B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -523,7 +509,6 @@ W:0:1:1100:0 E:1:1:1:2:1:1 O:0:0:0:0 B:BEG:* -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -548,7 +533,6 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -574,7 +558,6 @@ W:0:1:1700:0 E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -599,7 +582,6 @@ W:0:1:1650:0 E:1:1:1:2:1:1 O:25:50:25:0 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -624,7 +606,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:PUNCH:HURT:3d8 B:PUNCH:HURT:3d8 -F:BASEANGBAND F:CAN_SPEAK F:DROP_1D2 F:DROP_CORPSE @@ -652,7 +633,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 B:SPORE:HURT:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -674,7 +654,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 B:CRUSH:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -691,7 +670,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -712,7 +690,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -737,7 +714,6 @@ B:KICK:HURT:10d10 B:BUTT:HURT:10d10 B:BUTT:HURT:10d10 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:FRIEND @@ -768,7 +744,6 @@ B:KICK:HURT:20d20 B:KICK:HURT:20d20 B:KICK:HURT:20d20 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:FRIEND @@ -802,7 +777,6 @@ B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:KICK:HURT:5d5 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:FRIEND @@ -825,7 +799,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:MORTAL @@ -844,7 +817,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:CRUSH:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -866,7 +838,6 @@ B:KICK:HURT:10d12 B:KICK:HURT:10d12 B:KICK:HURT:10d12 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:GOOD @@ -893,7 +864,6 @@ B:KICK:HURT:8d10 B:KICK:HURT:8d10 B:KICK:HURT:8d10 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:MORTAL @@ -916,7 +886,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_POIS @@ -937,7 +906,6 @@ W:1:1:500:1 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:PARALYZE -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -953,7 +921,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -973,7 +940,6 @@ B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:MORTAL @@ -995,7 +961,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:FRIENDS @@ -1013,7 +978,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1031,7 +995,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -1048,7 +1011,6 @@ O:0:0:0:0 B:BITE:HURT:1d1 B:STING:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:NO_CUT @@ -1071,7 +1033,6 @@ O:0:0:0:0 B:BUTT:HURT:3d3 B:BUTT:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:MORTAL @@ -1087,7 +1048,6 @@ I:110:1d1:4:1:0 W:2:1:40:1 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:FORCE_SLEEP @@ -1116,7 +1076,6 @@ B:BUTT:HURT:7d7 B:KICK:HURT:7d7 B:BUTT:HURT:7d7 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:FRIEND @@ -1142,7 +1101,7 @@ D:Utterly harmless, unless angered. #B:KICK:HURT:4d5 #B:KICK:HURT:4d5 #B:KICK:HURT:4d5 -#F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | +#F:ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS | #F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | WILD_TOWN | #D:It's a short, stocky pack animal, related to the horse, but smaller. #D:A common beast of burden in Middle-earth, especially used by Hobbits @@ -1156,7 +1115,6 @@ E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1176,7 +1134,6 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1196,7 +1153,6 @@ W:2:1:1500:6 E:1:1:1:2:1:1 O:25:0:50:20 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1221,7 +1177,6 @@ W:2:1:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1246,7 +1201,6 @@ W:2:1:30:2 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d6 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:MORTAL @@ -1266,7 +1220,6 @@ W:2:1:2000:10 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1287,7 +1240,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1306,7 +1258,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:IM_FIRE @@ -1327,7 +1278,6 @@ B:CLAW:HURT:1d1 B:CLAW:HURT:1d1 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -1350,7 +1300,6 @@ B:BUTT:HURT:8d8 B:KICK:HURT:8d8 B:BUTT:HURT:8d8 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:FORCE_SLEEP F:MORTAL @@ -1374,7 +1323,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1393,7 +1341,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1412,7 +1359,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -1431,7 +1377,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -1451,7 +1396,6 @@ B:BITE:TERRIFY:2d8 B:CLAW:HURT:2d16 B:CLAW:HURT:2d16 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -1471,7 +1415,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:ACID:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_ACID @@ -1494,7 +1437,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -1513,7 +1455,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -1534,7 +1475,6 @@ B:BITE:HURT:1d3 B:BITE:HURT:1d3 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -1552,7 +1492,6 @@ O:0:0:0:0 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -1569,7 +1508,6 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:TOUCH:EAT_GOLD B:BITE:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -1604,7 +1542,6 @@ W:3:2:300:4 E:0:0:0:0:0:0 O:50:0:25:20 B:CRAWL:ACID:1d3 -F:BASEANGBAND F:CAN_SWIM F:DROP_90 F:EMPTY_MIND @@ -1626,7 +1563,6 @@ W:3:1:0:8 E:0:0:0:0:0:0 O:50:5:30:10 B:TOUCH:TERRIFY -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -1655,7 +1591,6 @@ W:3:1:2000:12 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1679,7 +1614,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:DROP_CORPSE F:DROP_SKELETON F:MORTAL @@ -1700,7 +1634,6 @@ B:BITE:HURT:1d4 B:BITE:HURT:1d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -1720,7 +1653,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -1740,7 +1672,6 @@ O:0:0:0:0 B:BITE:HURT:6d1 B:BITE:HURT:7d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -1759,7 +1690,6 @@ W:3:1:1700:20 E:0:0:0:0:1:0 O:0:75:20:5 B:CRUSH:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -1777,7 +1707,6 @@ W:3:1:30:3 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:2d4 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:NEVER_MOVE @@ -1797,7 +1726,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:1d3 B:TOUCH:EAT_LITE:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -1821,7 +1749,6 @@ E:1:1:1:2:1:1 O:0:50:0:40 B:HIT:HURT:1d4 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -1841,7 +1768,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -1857,7 +1783,6 @@ W:3:1:30:9 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d4 -F:BASEANGBAND F:EMPTY_MIND F:IM_POIS F:NEVER_MOVE @@ -1880,7 +1805,6 @@ B:BITE:DISEASE:1d1 B:BITE:EAT_FOOD:1d1 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:MORTAL F:RAND_25 F:RAND_50 @@ -1899,7 +1823,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:LOSE_DEX:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:MORTAL @@ -1921,7 +1844,6 @@ O:0:0:0:0 B:CRAWL:POISON:1d2 F:ANIMAL F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:HURT_LITE F:IM_POIS @@ -1943,7 +1865,6 @@ W:3:1:500:6 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:LOSE_STR:1d6 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_LITE @@ -1961,7 +1882,6 @@ W:4:1:0:4 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:BLIND -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:HAS_LITE @@ -1980,7 +1900,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d5 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -1999,7 +1918,6 @@ E:1:1:1:2:1:1 O:25:45:25:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2023,7 +1941,6 @@ W:4:1:2000:14 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:COLD:1d6 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -2046,7 +1963,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d4 B:TOUCH:POISON:2d4 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -2069,7 +1985,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d3 F:ANIMAL -F:BASEANGBAND F:MORTAL F:RAND_25 S:MULTIPLY @@ -2082,7 +1997,6 @@ W:4:1:900:15 E:1:1:1:2:1:1 O:25:50:0:20 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2110,7 +2024,6 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -2124,7 +2037,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:COLD:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:HURT_LITE @@ -2149,7 +2061,6 @@ O:0:0:0:0 B:BITE:HURT:1d5 B:CRUSH:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2171,7 +2082,6 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -2211,7 +2121,6 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:POISON:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -2236,7 +2145,6 @@ W:6:2:1400:6 E:1:1:1:2:1:1 O:25:0:70:0 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2263,7 +2171,6 @@ E:0:0:0:0:1:0 O:0:25:0:65 B:CRUSH:HURT:1d8 B:SPIT:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -2289,7 +2196,6 @@ B:BITE:HURT:3d1 B:BITE:HURT:3d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:RAND_25 F:WEIRD_MIND D:Yech! The disgusting thing only wants your blood! @@ -2304,7 +2210,6 @@ B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -2318,7 +2223,6 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2346,7 +2250,6 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2370,7 +2273,6 @@ W:5:1:300:7 E:0:0:0:0:0:0 O:45:20:20:0 B:CRAWL:COLD:1d4 -F:BASEANGBAND F:CAN_SWIM F:DROP_60 F:EMPTY_MIND @@ -2392,7 +2294,6 @@ W:5:1:0:15 E:0:0:0:0:0:0 O:30:30:30:5 B:TOUCH:EAT_FOOD:1d1 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -2415,7 +2316,6 @@ W:5:1:2500:18 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ACID:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -2439,7 +2339,6 @@ O:0:50:0:50 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -2527,7 +2426,6 @@ O:0:0:0:0 B:GAZE:UN_BONUS F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -2546,7 +2444,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:FIRE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:EMPTY_MIND @@ -2570,7 +2467,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2592,7 +2488,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:DROP_90 @@ -2623,7 +2518,6 @@ O:0:0:0:0 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 B:SPORE:LOSE_CON:1d2 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:NEVER_MOVE @@ -2641,7 +2535,6 @@ W:6:2:1500:6 E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2668,7 +2561,6 @@ E:1:1:1:2:1:1 O:0:95:0:0 B:HIT:HURT:1d7 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2732,7 +2624,6 @@ W:6:1:50:20 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:CONFUSE:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -2753,7 +2644,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -2771,7 +2661,6 @@ W:3:1:100:1 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:MORTAL F:NEUTRAL F:NEVER_BLOW @@ -2792,7 +2681,6 @@ E:1:1:1:2:1:1 O:50:25:0:20 B:HIT:HURT:1d6 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2814,7 +2702,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d6 B:TOUCH:POISON:2d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -2837,7 +2724,6 @@ W:6:1:1600:15 E:1:1:1:2:1:1 O:20:50:5:15 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -2862,7 +2748,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -2884,7 +2769,6 @@ O:0:0:0:0 B:BITE:ACID:2d4 B:BITE:ACID:2d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -2905,7 +2789,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -2922,7 +2805,6 @@ E:1:1:1:2:1:1 O:20:20:50:10 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -2949,7 +2831,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:EAT_LITE:1d1 F:ANIMAL -F:BASEANGBAND F:HURT_LITE F:MORTAL F:RAND_25 @@ -2970,7 +2851,6 @@ O:0:0:0:0 B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:POISON -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EVIL @@ -2997,7 +2877,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:POISON:1d3 B:CLAW:POISON:1d3 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -3020,7 +2899,6 @@ W:7:1:1900:20 E:1:1:1:2:1:1 O:20:70:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3044,7 +2922,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:STING:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FRIENDS @@ -3063,7 +2940,6 @@ W:7:2:300:16 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -3083,7 +2959,6 @@ W:7:3:550:30 E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:BLIND:2d6 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HURT_LITE @@ -3102,7 +2977,6 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:1d10 B:BITE:LOSE_STR:1d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -3123,7 +2997,6 @@ W:7:1:2500:26 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:1d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -3143,7 +3016,6 @@ W:0:3:80:0 E:0:1:1:0:1:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DG_CURSE F:DROP_SKELETON @@ -3170,7 +3042,6 @@ E:0:0:0:0:0:0 O:60:0:25:0 B:HIT:HURT:2d2 B:TOUCH:LOSE_WIS -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -3199,7 +3070,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -3218,7 +3088,6 @@ B:BITE:HURT:1d4 B:BITE:HURT:1d4 B:BITE:DISEASE:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -3239,7 +3108,6 @@ W:8:1:1700:26 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -3265,7 +3133,6 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -3337,7 +3204,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:MORTAL @@ -3359,7 +3225,6 @@ B:HIT:HURT:1d11 B:HIT:HURT:1d11 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -3388,7 +3253,6 @@ E:0:1:1:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_SKELETON F:HAS_EGG @@ -3410,7 +3274,6 @@ E:1:1:1:2:1:1 O:0:80:0:15 B:HIT:HURT:1d5 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3434,7 +3297,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:FORCE_SLEEP @@ -3493,7 +3355,6 @@ W:8:1:40:28 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:TERRIFY:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_ACID @@ -3514,7 +3375,6 @@ E:1:1:1:2:1:1 O:30:55:10:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3539,7 +3399,6 @@ W:8:3:1000:16 E:0:0:0:0:1:0 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -3559,7 +3418,6 @@ W:8:1:2000:25 E:1:1:1:2:1:1 O:10:70:10:0 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -3582,7 +3440,6 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_GOLD -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -3608,7 +3465,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -3627,7 +3483,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -3649,7 +3504,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -3672,7 +3526,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:IM_COLD @@ -3692,7 +3545,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -3713,7 +3565,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:IM_POIS F:MORTAL F:RAND_25 @@ -3730,7 +3581,6 @@ B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 B:BITE:HURT:1d3 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -3750,7 +3600,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:EVIL F:MORTAL F:RAND_25 @@ -3772,7 +3621,6 @@ O:25:20:25:20 B:BITE:POISON:5d5 B:BITE:POISON:5d5 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -3804,7 +3652,6 @@ B:CLAW:HURT:1d6 B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -3825,7 +3672,6 @@ O:0:0:0:0 B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:KILL_ITEM @@ -3843,7 +3689,6 @@ E:1:1:1:2:1:1 O:30:40:30:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -3877,7 +3722,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3908,7 +3752,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_1D2 @@ -3938,7 +3781,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3968,7 +3810,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -3998,7 +3839,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4029,7 +3869,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:STING:LOSE_STR:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:HAS_LITE @@ -4048,7 +3887,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -4077,7 +3915,6 @@ O:10:90:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -4104,7 +3941,6 @@ O:0:0:0:0 B:SPIT:BLIND:1d2 B:BITE:POISON:3d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -4128,7 +3964,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:HAS_EGG @@ -4152,7 +3987,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -4170,7 +4004,6 @@ O:0:0:0:0 B:STING:POISON:1d4 B:STING:LOSE_STR:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:FRIENDS F:MORTAL @@ -4189,7 +4022,6 @@ B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_POIS @@ -4207,7 +4039,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:IM_POIS @@ -4257,7 +4088,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4357,7 +4187,6 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -4390,7 +4219,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -4412,7 +4240,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:1d1 F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -4459,7 +4286,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d13 B:HIT:HURT:1d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -4493,7 +4319,6 @@ B:CLAW:HURT:1d2 B:CLAW:HURT:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -4514,7 +4339,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:CRUSH:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -4531,7 +4355,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:1d2 F:ATTR_CLEAR -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4548,7 +4371,6 @@ W:10:1:50:32 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -4571,7 +4393,6 @@ B:CLAW:HURT:1d8 B:BITE:HURT:1d12 B:CRUSH:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -4588,7 +4409,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:UN_BONUS:1d6 F:ATTR_MULTI -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -4613,7 +4433,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4638,7 +4457,6 @@ W:10:1:600:40 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -4664,7 +4482,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -4686,7 +4503,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FRIENDS @@ -4706,7 +4522,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -4724,7 +4539,6 @@ O:0:0:0:0 B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -4743,7 +4557,6 @@ E:1:1:1:2:1:1 O:25:60:0:0 B:HIT:HURT:2d4 B:TOUCH:EAT_ITEM -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_SKELETON @@ -4763,7 +4576,6 @@ W:3:1:0:5 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:HURT:2d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4781,7 +4593,6 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:2d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4800,7 +4611,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:1d6 B:TOUCH:LOSE_CON:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -4825,7 +4635,6 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:2d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4846,7 +4655,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -4884,7 +4692,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:2d4 B:TOUCH:CONFUSE:3d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4905,7 +4712,6 @@ B:TOUCH:PARALYZE:1d14 B:TOUCH:PARALYZE:1d14 B:CRUSH:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_1D2 F:DROP_GOOD @@ -4939,7 +4745,6 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:ELEC:3d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -4960,7 +4765,6 @@ O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -4985,7 +4789,6 @@ O:0:0:0:0 B:HIT:HURT:2d5 B:BITE:HURT:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -5003,7 +4806,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:POISON:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -5026,7 +4828,6 @@ O:0:0:0:0 B:BITE:HURT:1d3 B:BITE:HURT:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -5047,7 +4848,6 @@ W:12:3:2600:60 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -5070,7 +4870,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EXP_10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:HURT_LITE @@ -5092,7 +4891,6 @@ W:5:1:0:2 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_CHR:3d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5114,7 +4912,6 @@ B:HIT:HURT:1d13 B:HIT:HURT:1d13 B:HIT:HURT:1d11 B:HIT:HURT:1d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -5148,7 +4945,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -5170,7 +4966,6 @@ O:0:0:0:0 B:TOUCH:HURT:3d5 B:TOUCH:SHATTER:1d1 # Yes, I'm nasty. :P -furiosity -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5193,7 +4988,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -5223,7 +5017,6 @@ B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -5252,7 +5045,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:GAZE:EXP_10 B:GAZE:EXP_10 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -5275,7 +5067,6 @@ W:15:5:0:20 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_LITE:3d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5295,7 +5086,6 @@ W:20:5:0:30 E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:LOSE_STR:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5316,7 +5106,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:5d5 B:TOUCH:LOSE_DEX:5d5 -F:BASEANGBAND F:CAN_FLY F:CAN_SWIM F:EMPTY_MIND @@ -5337,7 +5126,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:POISON:6d6 B:TOUCH:BLIND:6d6 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5357,7 +5145,6 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -5385,7 +5172,6 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:HIT:HURT:1d9 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -5415,7 +5201,6 @@ W:12:2:0:40 E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -5439,7 +5224,6 @@ W:12:1:1500:38 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -5462,7 +5246,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -5487,7 +5270,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -5507,7 +5289,6 @@ E:0:0:0:0:0:0 O:45:15:25:0 B:WAIL:TERRIFY B:TOUCH:LOSE_DEX:1d8 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -5537,7 +5318,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:DISEASE:3d5 B:TOUCH:PARASITE:6d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5558,7 +5338,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EMPTY_MIND @@ -5582,7 +5361,6 @@ O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:POISON:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -5608,7 +5386,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:POISON:1d8 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -5629,7 +5406,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:3d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -5649,7 +5425,6 @@ B:TOUCH:EXP_20:7d5 B:TOUCH:DISEASE:7d5 B:TOUCH:PARASITE:14d10 B:TOUCH:LOSE_ALL:7d5 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -5684,7 +5459,6 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5707,7 +5481,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:TOUCH:POISON:3d5 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -5730,7 +5503,6 @@ W:13:2:1500:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d2 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -5761,7 +5533,6 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -5796,7 +5567,6 @@ E:1:1:1:2:1:1 O:0:40:60:0 B:HIT:HURT:20d5 B:HIT:EXP_80:20d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -5844,7 +5614,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:DROP_90 @@ -5869,7 +5638,6 @@ E:1:1:1:2:1:1 O:10:50:20:15 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -5896,7 +5664,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:2d6 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -5940,7 +5707,6 @@ O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:CHAR_MULTI F:COLD_BLOOD @@ -5963,7 +5729,6 @@ O:0:0:0:0 B:HIT:PARALYZE B:HIT:PARALYZE F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_60 F:EMPTY_MIND @@ -5995,7 +5760,6 @@ O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -6035,7 +5799,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -6058,7 +5821,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:EXPLODE:HURT:20d2 -F:BASEANGBAND F:BASH_DOOR F:EVIL F:HAS_LITE @@ -6084,7 +5846,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6116,7 +5877,6 @@ W:14:4:2600:20 E:0:0:0:0:0:0 O:0:0:0:0 B:CRAWL:POISON:1d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:EVIL @@ -6142,7 +5902,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -6177,7 +5936,6 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6200,7 +5958,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:EMPTY_MIND @@ -6223,7 +5980,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6245,7 +6001,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_FOOD -F:BASEANGBAND F:DROP_60 F:GOOD F:MALE @@ -6267,7 +6022,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_50 @@ -6285,7 +6039,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -6316,7 +6069,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -6339,7 +6091,6 @@ E:1:1:1:2:1:1 O:0:70:0:15 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6365,7 +6116,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -6402,7 +6152,6 @@ E:1:1:1:2:1:1 O:30:30:30:5 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6427,7 +6176,6 @@ E:0:0:0:0:1:0 O:0:0:80:20 B:STING:HURT:1d10 B:BITE:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -6459,7 +6207,6 @@ O:0:0:0:0 B:HIT:POISON:2d2 B:HIT:POISON:2d2 F:ANIMAL -F:BASEANGBAND F:COLD_BLOOD F:DROP_60 F:EMPTY_MIND @@ -6490,7 +6237,6 @@ B:SPORE:CONFUSE B:SPORE:CONFUSE B:SPORE:HALLU B:SPORE:HALLU -F:BASEANGBAND F:CAN_SWIM F:FORCE_SLEEP F:NEVER_MOVE @@ -6518,7 +6264,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -6555,7 +6300,6 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -6578,7 +6322,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6606,7 +6349,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -6627,7 +6369,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -6647,7 +6388,6 @@ E:0:0:0:0:1:0 O:90:0:10:0 B:BITE:POISON:1d3 B:BITE:LOSE_STR:1d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -6675,7 +6415,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EAT_ITEM:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -6708,7 +6447,6 @@ B:BITE:POISON:1d6 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_POIS @@ -6729,7 +6467,6 @@ B:HIT:HURT:10d10 B:HIT:EAT_ITEM:10d10 B:HIT:EAT_ITEM:10d10 B:HIT:EAT_ITEM:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -6765,7 +6502,6 @@ B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -6789,7 +6525,6 @@ O:20:80:0:0 B:HIT:COLD:5d8 B:HIT:COLD:5d8 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6816,7 +6551,6 @@ O:0:0:0:0 B:HIT:HURT:3d4 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -6835,7 +6569,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:PARALYZE:1d2 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -6857,7 +6590,6 @@ W:15:2:900:40 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_SKELETON @@ -6886,7 +6618,6 @@ B:CLAW:HURT:1d6 B:BITE:HURT:1d8 F:ANIMAL F:ATTR_CLEAR -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -6906,7 +6637,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -6931,7 +6661,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:DROP_CORPSE F:IM_ACID F:IM_POIS @@ -6951,7 +6680,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:2d10 B:HIT:HURT:2d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -6973,7 +6701,6 @@ O:40:30:20:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -7006,7 +6733,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -7029,7 +6755,6 @@ O:20:80:0:0 B:HIT:FIRE:6d8 B:HIT:FIRE:6d8 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -7054,7 +6779,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:2d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:RAND_25 F:RAND_50 @@ -7071,7 +6795,6 @@ E:1:1:1:2:1:1 O:50:50:0:0 B:HIT:HURT:4d4 B:HIT:HURT:4d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -7097,7 +6820,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -7127,7 +6849,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -7157,7 +6878,6 @@ O:20:80:0:0 B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:HIT:HURT:7d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7186,7 +6906,6 @@ O:0:50:30:10 B:BITE:LOSE_DEX:1d6 B:CLAW:HURT:1d3 B:CLAW:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -7218,7 +6937,6 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_1D2 @@ -7244,7 +6962,6 @@ E:0:1:1:0:1:0 O:30:20:50:0 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -7280,7 +6997,6 @@ O:30:70:0:0 B:HIT:HURT:1d4 B:HIT:HURT:1d4 B:BITE:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -7306,7 +7022,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:COLD:8d8 F:AURA_COLD -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -7330,7 +7045,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:FIRE:8d8 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -7354,7 +7068,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:ELEC:8d8 F:AURA_ELEC -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -7378,7 +7091,6 @@ O:0:0:0:0 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -7405,7 +7117,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:CLAW:TERRIFY:2d5 B:CLAW:TERRIFY:5d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:MORTAL @@ -7421,7 +7132,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -7444,7 +7154,6 @@ O:0:0:0:0 B:BITE:HURT:2d4 B:STING:LOSE_STR:1d7 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -7460,7 +7169,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -7486,7 +7194,6 @@ O:0:0:0:0 B:HIT:FIRE:2d6 B:HIT:FIRE:2d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -7513,7 +7220,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:FIRE:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7538,7 +7244,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:COLD:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7562,7 +7267,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:ELEC:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7585,7 +7289,6 @@ O:10:10:10:10 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -7614,7 +7317,6 @@ O:0:0:0:0 B:HIT:POISON:3d4 B:HIT:CONFUSE:2d3 B:HIT:PARALYZE:2d3 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:EMPTY_MIND @@ -7641,7 +7343,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -7663,7 +7364,6 @@ E:1:1:1:2:1:1 O:20:80:0:0 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -7692,7 +7392,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -7724,7 +7423,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -7752,7 +7450,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:EMPTY_MIND @@ -7780,7 +7477,6 @@ B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 B:HIT:PARALYZE:3d3 F:ANIMAL -F:BASEANGBAND F:CHAR_CLEAR F:CHAR_MULTI F:EMPTY_MIND @@ -7804,7 +7500,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -7842,7 +7537,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -7882,7 +7576,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -7906,7 +7599,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -7929,7 +7621,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -7951,7 +7642,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -7974,7 +7664,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:FIRE:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_FIRE @@ -7996,7 +7685,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -8056,7 +7744,6 @@ B:CLAW:PARALYZE:2d4 B:CLAW:PARALYZE:2d4 B:BITE:LOSE_CON:2d4 B:BITE:LOSE_CHR:2d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -8080,7 +7767,6 @@ I:120:3d2:8:18:10 W:19:4:100:4 B:BITE:POISON:2d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:EVIL F:RAND_25 @@ -8106,7 +7792,6 @@ B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 B:CRUSH:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:DROP_60 F:IM_COLD F:NEVER_MOVE @@ -8133,7 +7818,6 @@ B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 B:HIT:HURT:3d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -8165,7 +7849,6 @@ B:BITE:HURT:1d8 B:BITE:POISON:1d6 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_SKELETON @@ -8192,7 +7875,6 @@ O:50:50:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:WAIL:TERRIFY -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -8241,7 +7923,6 @@ O:0:0:0:0 B:BITE:HURT:2d4 B:BITE:HURT:2d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -8277,7 +7958,6 @@ B:CLAW:HURT:6d3 B:BITE:HURT:3d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:GOOD @@ -8301,7 +7981,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:BASEANGBAND F:CHAR_MULTI F:COLD_BLOOD F:FRIENDS @@ -8330,7 +8009,6 @@ B:BITE:HURT:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -8354,7 +8032,6 @@ B:BITE:POISON:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -8379,7 +8056,6 @@ B:CLAW:HURT:1d10 B:BITE:HURT:1d10 B:BITE:HURT:1d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -8401,7 +8077,6 @@ B:BITE:ACID:1d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -8424,7 +8099,6 @@ O:0:0:0:0 B:BUTT:HURT:2d8 B:BITE:HURT:2d10 B:BITE:FIRE:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -8447,7 +8121,6 @@ W:20:1:3000:250 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:INVISIBLE @@ -8471,7 +8144,6 @@ B:CLAW:HURT:1d10 B:CLAW:HURT:1d10 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -8494,7 +8166,6 @@ O:0:0:0:0 B:BITE:HURT:4d8 B:BITE:HURT:4d8 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -8526,7 +8197,6 @@ E:1:1:1:2:1:1 O:20:50:20:0 B:HIT:HURT:5d4 B:HIT:HURT:5d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -8554,7 +8224,6 @@ E:1:1:1:2:1:1 O:20:60:0:10 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -8584,7 +8253,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -8602,7 +8270,6 @@ E:1:1:1:2:1:1 O:0:80:20:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -8632,7 +8299,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:ELEC:8d8 B:HIT:ELEC:8d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -8656,7 +8322,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8688,7 +8353,6 @@ O:0:0:0:0 B:BITE:ELEC:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -8709,7 +8373,6 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -8740,7 +8403,6 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BUTT:CONFUSE:4d4 B:SPIT:BLIND:4d4 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -8769,7 +8431,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:FIRE:3d3 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -8797,7 +8458,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ACID:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -8824,7 +8484,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -8853,7 +8512,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:UN_BONUS:8d12 B:HIT:TERRIFY:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -8921,7 +8579,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:COLD:3d3 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -8948,7 +8605,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:ELEC:3d3 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -8976,7 +8632,6 @@ B:BITE:POISON:10d5 B:BITE:POISON:10d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -8995,7 +8650,6 @@ I:120:3d2:8:18:10 W:24:4:100:4 B:BITE:BLIND:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:HAS_LITE F:RAND_25 @@ -9013,7 +8667,6 @@ E:1:1:1:2:1:1 O:10:70:0:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -9039,7 +8692,6 @@ B:CLAW:HURT:2d6 B:BITE:HURT:2d10 B:WAIL:TERRIFY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -9066,7 +8718,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:UN_BONUS:10d14 B:HIT:TERRIFY:9d9 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -9131,7 +8782,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_20:1d6 B:ENGULF:EXP_20:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -9156,7 +8806,6 @@ O:0:0:0:0 B:CLAW:HURT:1d12 B:CLAW:HURT:1d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -9173,7 +8822,6 @@ W:22:2:3800:160 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -9228,7 +8876,6 @@ O:0:0:0:0 B:BITE:HURT:1d8 B:STING:POISON:2d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -9248,7 +8895,6 @@ B:HIT:HURT:3d11 B:HIT:HURT:3d11 B:HIT:HURT:3d10 B:HIT:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SPEAK @@ -9276,7 +8922,6 @@ W:23:1:400:7 E:0:0:0:0:0:0 O:30:0:40:15 B:TOUCH:ACID:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -9303,7 +8948,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:6d5 B:HIT:HURT:6d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9325,7 +8969,6 @@ O:10:90:0:0 B:HIT:HURT:5d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -9358,7 +9001,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:HIT:EAT_GOLD:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -9383,7 +9025,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -9413,7 +9054,6 @@ O:80:10:10:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:EAT_GOLD:4d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -9436,7 +9076,6 @@ O:0:0:0:0 B:BITE:FIRE:1d3 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -9456,7 +9095,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -9474,7 +9112,6 @@ E:1:1:1:2:1:1 O:20:0:80:0 B:CLAW:COLD:2d3 B:CLAW:COLD:2d3 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -9501,7 +9138,6 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -9535,7 +9171,6 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -9568,7 +9203,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -9603,7 +9237,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d7 B:HIT:UN_BONUS -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -9638,7 +9271,6 @@ B:CLAW:HURT:7d3 B:CLAW:HURT:7d3 B:BITE:HURT:3d7 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -9661,7 +9293,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:HURT:2d33 B:HIT:HURT:2d44 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EMPTY_MIND @@ -9682,7 +9313,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:HAS_LITE @@ -9703,7 +9333,6 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -9730,7 +9359,6 @@ B:CLAW:HURT:8d11 B:CLAW:EAT_LITE:8d11 B:CLAW:LOSE_INT:8d11 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:EVIL @@ -9778,7 +9406,6 @@ B:HIT:UN_BONUS:5d10 B:HIT:EXP_80:5d10 B:HIT:ABOMINATION:5d10 B:HIT:DISEASE:5d10 -F:BASEANGBAND F:DROP_4D2 F:DROP_GREAT F:DROP_RANDART @@ -9817,7 +9444,6 @@ E:1:1:1:2:1:1 O:20:40:20:10 B:HIT:HURT:2d4 B:HIT:HURT:2d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_90 @@ -9843,7 +9469,6 @@ O:0:0:0:0 B:BITE:EXP_40:1d4 B:BITE:EXP_40:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:EVIL @@ -9868,7 +9493,6 @@ B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 B:HIT:HURT:4d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -9953,7 +9577,6 @@ E:0:0:0:0:0:0 O:80:0:0:15 B:WAIL:TERRIFY B:TOUCH:EXP_20 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -9984,7 +9607,6 @@ E:1:1:1:2:1:1 O:0:40:60:0 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -10034,7 +9656,6 @@ B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 B:CRUSH:HURT:12d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DG_CURSE @@ -10078,7 +9699,6 @@ B:GAZE:TERRIFY B:GAZE:PARALYZE B:GAZE:LOSE_STR B:GAZE:HALLU -F:BASEANGBAND F:COLD_BLOOD F:COLD_BLOOD F:EMPTY_MIND @@ -10117,7 +9737,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d12 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -10149,7 +9768,6 @@ B:HIT:HURT:4d8 B:HIT:HURT:4d8 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -10178,7 +9796,6 @@ O:10:0:80:10 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10211,7 +9828,6 @@ O:0:100:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10239,7 +9855,6 @@ B:HIT:HURT B:HIT:HURT B:WAIL:TERRIFY B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_3D2 @@ -10282,7 +9897,6 @@ O:30:70:0:0 B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10312,7 +9926,6 @@ B:CRAWL:ACID:2d4 B:BITE:HURT:1d10 B:BITE:POISON:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -10331,7 +9944,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10352,7 +9964,6 @@ B:HIT:UN_BONUS F:AI_ANNOY F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -10406,7 +10017,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:KILL_BODY @@ -10461,7 +10071,6 @@ B:CLAW:HURT:15d2 B:CLAW:HURT:15d2 B:BITE:HURT:3d10 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -10485,7 +10094,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:HAS_LITE @@ -10506,7 +10114,6 @@ E:1:1:1:2:1:1 O:40:60:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -10538,7 +10145,6 @@ O:40:60:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -10570,7 +10176,6 @@ B:CLAW:HURT:1d10 B:BITE:HURT:2d8 B:CRUSH:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -10592,7 +10197,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10613,7 +10217,6 @@ O:0:50:50:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -10646,7 +10249,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 #Force him into Mirkwood: -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -10697,7 +10299,6 @@ O:0:45:35:10 B:CLAW:DISEASE:1d4 B:CLAW:DISEASE:1d4 B:BITE:PARALYZE:1d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -10727,7 +10328,6 @@ B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:HURT:3d9 B:HIT:UN_BONUS:3d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -10768,7 +10368,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_20:2d13 B:HIT:EXP_20:2d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -10796,7 +10395,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:FIRE:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -10819,7 +10417,6 @@ E:1:1:1:2:1:1 O:20:50:10:5 B:HIT:FIRE:9d12 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_3D2 @@ -10874,7 +10471,6 @@ B:BITE:POISON:3d4 B:TOUCH:POISON:3d5 B:HIT:HURT:1d12 B:HIT:HURT:1d12 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -10899,7 +10495,6 @@ O:10:80:0:10 B:CLAW:POISON:3d3 B:CLAW:POISON:3d3 B:BITE:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -10926,7 +10521,6 @@ O:10:80:0:10 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -10958,7 +10552,6 @@ B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 B:CRUSH:PARALYZE:3d5 -F:BASEANGBAND F:DROP_1D2 F:DROP_2D2 F:DROP_60 @@ -10996,7 +10589,6 @@ E:1:1:1:2:0:1 O:0:100:0:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -11022,7 +10614,6 @@ B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -11047,7 +10638,6 @@ B:BITE:HURT:2d8 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -11070,7 +10660,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -11093,7 +10682,6 @@ O:5:85:0:5 B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:HIT:HURT:6d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -11126,7 +10714,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11164,7 +10751,6 @@ O:0:0:0:0 B:BUTT:HURT:2d10 B:BITE:FIRE:2d10 B:GAZE:PARALYZE:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -11188,7 +10774,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -11219,7 +10804,6 @@ O:0:0:0:0 B:HIT:ELEC:3d8 B:HIT:ELEC:3d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -11248,7 +10832,6 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -11283,7 +10866,6 @@ B:GAZE:* B:WAIL:* B:INSULT:* B:CHARGE:HURT:1d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -11314,7 +10896,6 @@ B:GAZE:TERRIFY:5d8 B:GAZE:PARALYZE:5d8 B:GAZE:LOSE_STR:5d8 B:GAZE:HALLU:5d8 -F:BASEANGBAND F:COLD_BLOOD F:COLD_BLOOD F:EMPTY_MIND @@ -11395,7 +10976,6 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -11424,7 +11004,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:SHOW:* F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -11496,7 +11075,6 @@ O:0:90:10:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -11526,7 +11104,6 @@ B:BITE:LOSE_DEX:4d5 B:BITE:LOSE_CON:4d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:FORCE_SLEEP F:GOOD F:IM_COLD @@ -11554,7 +11131,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:9d9 B:HIT:HURT:9d9 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -11585,7 +11161,6 @@ E:1:1:1:2:1:1 O:0:0:90:10 B:HIT:CONFUSE:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -11617,7 +11192,6 @@ B:HIT:HURT:1d8 B:BITE:ACID:2d8 B:STING:POISON:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -11638,7 +11212,6 @@ B:GAZE:BLIND:2d4 B:BUTT:HURT:2d6 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -11658,7 +11231,6 @@ O:0:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -11687,7 +11259,6 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d5 B:HIT:HURT:2d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -11721,7 +11292,6 @@ E:1:1:1:2:1:1 O:0:10:90:0 B:CRUSH:LOSE_INT:2d6 B:GAZE:INSANITY:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_60 @@ -11787,7 +11357,6 @@ E:0:0:0:0:0:0 O:40:30:10:10 B:CRAWL:POISON:5d7 B:CRAWL:EAT_FOOD:5d7 -F:BASEANGBAND F:CAN_SWIM F:DROP_2D2 F:DROP_GREAT @@ -11822,7 +11391,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -11851,7 +11419,6 @@ B:HIT:HURT:1d5 B:HIT:HURT:1d5 B:BITE:COLD:2d6 B:BITE:COLD:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -11983,7 +11550,6 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -12019,7 +11585,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12050,7 +11615,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_2D2 @@ -12080,7 +11644,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12109,7 +11672,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12140,7 +11702,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -12172,7 +11733,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -12199,7 +11759,6 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -12228,7 +11787,6 @@ B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EAT_GOLD B:INSULT:* -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -12265,7 +11823,6 @@ B:CLAW:HURT:2d10 B:BITE:HURT:4d8 B:CRUSH:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -12299,7 +11856,6 @@ B:CLAW:HURT:16d2 B:CLAW:HURT:16d2 B:BITE:HURT:4d10 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_CORPSE @@ -12322,7 +11878,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:5d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:IM_ELEC @@ -12341,7 +11896,6 @@ O:0:50:50:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 B:TOUCH:EXP_20 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -12376,7 +11930,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:EXP_10:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -12411,7 +11964,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -12434,7 +11986,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FRIENDS @@ -12454,7 +12005,6 @@ O:0:0:0:0 B:BITE:HURT:5d8 B:BITE:HURT:5d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -12476,7 +12026,6 @@ B:BUTT:HURT:3d9 B:BITE:POISON:1d10 B:KICK:HURT:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -12501,7 +12050,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:6d4 B:HIT:HURT:6d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -12559,7 +12107,6 @@ B:WAIL:TERRIFY B:TOUCH:EXP_20 B:CLAW:LOSE_INT:1d6 B:CLAW:LOSE_WIS:1d6 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -12591,7 +12138,6 @@ O:0:0:0:0 B:BITE:HURT:5d4 B:WAIL:TERRIFY:5d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -12608,7 +12154,6 @@ E:1:1:1:2:1:1 O:20:70:0:10 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -12627,7 +12172,6 @@ W:32:1:3000:300 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:INVISIBLE @@ -12654,7 +12198,6 @@ B:CLAW:POISON:5d6 B:BITE:PARALYZE:5d10 B:STING:LOSE_STR:5d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -12702,7 +12245,6 @@ B:CRUSH:HURT:8d4 B:CRUSH:HURT:8d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FORCE_MAXHP F:IM_ACID @@ -12728,7 +12270,6 @@ B:CLAW:LOSE_STR:3d4 B:CLAW:DISEASE:3d4 B:CLAW:DISEASE:3d4 B:BITE:PARALYZE:3d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -12766,7 +12307,6 @@ B:BITE:FIRE:5d4 F:AI_ANNOY F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -12785,7 +12325,6 @@ O:0:100:0:0 B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -12809,7 +12348,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:1d4 B:HIT:CONFUSE:1d4 -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:MORTAL @@ -12833,7 +12371,6 @@ O:10:90:0:0 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -12868,7 +12405,6 @@ O:0:0:0:0 B:GAZE:PARALYZE:1d4 B:GAZE:CONFUSE:1d4 B:BITE:HURT:1d8 -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EMPTY_MIND @@ -12945,7 +12481,6 @@ W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -13010,7 +12545,6 @@ B:CLAW:HURT:1d5 B:CLAW:HURT:1d5 B:BITE:HURT:2d6 B:BITE:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -13034,7 +12568,6 @@ W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -13099,7 +12632,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -13136,7 +12668,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -13173,7 +12704,6 @@ O:0:100:0:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:BITE:HURT:3d10 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -13211,7 +12741,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -13236,7 +12765,6 @@ W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -13297,8 +12825,8 @@ D:A lady of the Valar, the spouse of Irmo. #W:0:50:0:0 #E:0:0:0:0:0:0 #O:0:0:0:0 -#F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | +#F:WILD_ONLY | FORCE_DEPTH | WILD_TOWN | +#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | #F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL | #F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | #F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | @@ -13325,7 +12853,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -13359,7 +12886,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:BITE:HURT:1d5 B:BITE:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -13387,7 +12913,6 @@ B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13422,7 +12947,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13457,7 +12981,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -13496,7 +13019,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_3D2 @@ -13555,7 +13077,6 @@ W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -13619,7 +13140,6 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -13654,7 +13174,6 @@ O:0:0:100:0 B:WAIL:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_WIS:5d5 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -13689,7 +13208,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HURT:2d2 B:HIT:HURT:2d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -13719,7 +13237,6 @@ O:0:0:0:0 B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -13750,8 +13267,8 @@ D:It is a towering inferno of flames. #W:0:50:0:0 #E:0:0:0:0:0:0 #O:0:0:0:0 -#F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN | -#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | +#F:WILD_ONLY | FORCE_DEPTH | WILD_TOWN | +#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE | #F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | POWERFUL | #F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK | #F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE | @@ -13774,7 +13291,6 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -13808,7 +13324,6 @@ B:BITE:HURT:4d4 B:BITE:HURT:4d4 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -13840,7 +13355,6 @@ O:0:0:0:0 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -13867,7 +13381,6 @@ W:0:50:0:0 E:0:0:0:0:0:0 O:0:0:0:0 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -13932,7 +13445,6 @@ B:HIT:HURT:2d8 B:HIT:HURT:3d4 B:HIT:EAT_GOLD:4d4 B:HIT:EAT_ITEM:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -13960,7 +13472,6 @@ B:CRUSH:POISON:8d8 B:CRUSH:PARALYZE:8d8 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:DROP_1D2 @@ -14001,7 +13512,6 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d8 B:TOUCH:LOSE_DEX:2d8 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -14037,7 +13547,6 @@ W:34:4:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:EXPLODE:DISEASE:30d2 -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_SLEEP @@ -14059,7 +13568,6 @@ B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -14099,7 +13607,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_40:3d6 B:BITE:EXP_40:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -14141,7 +13648,6 @@ B:CLAW:LOSE_CON:3d6 B:CLAW:DISEASE:3d6 B:GAZE:EXP_40:3d4 B:GAZE:TERRIFY:3d4 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -14290,7 +13796,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 B:STING:POISON:1d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:MORTAL @@ -14307,7 +13812,6 @@ O:0:0:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -14337,7 +13841,6 @@ O:0:0:0:0 B:HIT:HURT:1d10 B:HIT:CONFUSE:1d4 B:HIT:HURT:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -14365,7 +13868,6 @@ I:110:32d8:2:24:70 W:27:1:0:140 B:SPORE:ELEC:5d4 B:SPORE:ELEC:5d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_ELEC @@ -14387,7 +13889,6 @@ O:0:0:0:0 B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:1d6 -F:BASEANGBAND F:DEMON F:DROP_60 F:EVIL @@ -14417,7 +13918,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:TOUCH:EAT_GOLD B:TOUCH:EAT_ITEM -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:HURT_LITE @@ -14445,7 +13945,6 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -14544,7 +14043,6 @@ B:HIT:POISON:3d4 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -14568,7 +14066,6 @@ B:TOUCH:TERRIFY B:TOUCH:EXP_40 B:CLAW:LOSE_INT:5d5 B:CLAW:LOSE_WIS:5d5 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -14602,7 +14099,6 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -14697,7 +14193,6 @@ B:GAZE:UN_BONUS:5d2 B:GAZE:UN_BONUS:5d2 B:GAZE:UN_POWER:5d2 B:GAZE:UN_POWER:5d2 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -14722,7 +14217,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:2d6 B:ENGULF:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -14753,7 +14247,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:BITE:HURT:2d3 B:BITE:HURT:2d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -14778,7 +14271,6 @@ E:1:1:1:2:1:1 O:100:0:0:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:DROP_90 F:DROP_CORPSE F:DROP_SKELETON @@ -14807,7 +14299,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -14832,7 +14323,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -14865,7 +14355,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -14890,7 +14379,6 @@ B:CLAW:HURT:2d8 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -14912,7 +14400,6 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -14937,7 +14424,6 @@ O:0:0:0:0 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -14971,7 +14457,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -14999,7 +14484,6 @@ B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:MORTAL @@ -15014,7 +14498,6 @@ O:0:0:0:0 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -15036,7 +14519,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15069,7 +14551,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:HIT:HURT:1d6 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_MAXHP @@ -15096,7 +14577,6 @@ B:HIT:HURT:6d7 B:HIT:HURT:6d7 B:BITE:HURT:4d10 B:SPIT:ACID:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -15198,7 +14678,6 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -15228,7 +14707,6 @@ O:0:50:50:0 B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -15262,7 +14740,6 @@ B:GAZE:PARALYZE B:CLAW:LOSE_CON:1d10 B:CLAW:LOSE_CON:1d10 B:GAZE:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -15298,7 +14775,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:3d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15390,7 +14866,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:6d6 B:HIT:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -15422,7 +14897,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15452,7 +14926,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15483,7 +14956,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15514,7 +14986,6 @@ B:CLAW:HURT:2d8 B:CLAW:HURT:2d8 B:BITE:HURT:4d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15544,7 +15015,6 @@ B:CLAW:HURT:2d6 B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -15650,7 +15120,6 @@ B:HIT:HURT:3d8 B:HIT:PARALYZE:15d1 B:HIT:PARALYZE:15d1 F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:CHAR_MULTI F:COLD_BLOOD @@ -15675,7 +15144,6 @@ B:HIT:FIRE:4d6 B:HIT:FIRE:4d6 B:GAZE:EXP_20 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:EVIL @@ -15726,7 +15194,6 @@ E:1:1:1:0:1:1 O:0:0:0:0 B:CLAW:HURT:5d6 B:CLAW:HURT:5d6 -F:BASEANGBAND F:DEMON F:EVIL F:FORCE_SLEEP @@ -15829,7 +15296,6 @@ B:TOUCH:COLD:4d3 B:HIT:HURT:4d6 B:TOUCH:COLD:4d3 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -15859,7 +15325,6 @@ E:1:1:1:2:1:1 O:10:0:90:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_SKELETON @@ -15949,7 +15414,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_GOOD @@ -15983,7 +15447,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -16004,7 +15467,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_60 @@ -16033,7 +15495,6 @@ B:ENGULF:UN_POWER:5d5 B:ENGULF:UN_BONUS:5d5 B:HIT:LOSE_ALL:5d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -16063,7 +15524,6 @@ B:TOUCH:EXP_40 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d10 B:TOUCH:LOSE_DEX:2d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -16124,7 +15584,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TIME:3d4 B:TOUCH:TIME:3d4 -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:IM_ACID @@ -16151,7 +15610,6 @@ E:1:1:1:2:1:1 O:25:0:0:55 B:HIT:HURT:1d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -16171,7 +15629,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d8 B:BITE:HURT:2d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -16202,7 +15659,6 @@ B:HIT:HURT:1d9 B:HIT:HURT:1d9 B:HIT:HALLU:1d9 B:HIT:HALLU:1d9 -F:BASEANGBAND F:CAN_FLY F:EMPTY_MIND F:FORCE_MAXHP @@ -16241,7 +15697,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -16260,7 +15715,6 @@ B:HIT:FIRE:3d7 B:HIT:HURT:4d6 B:HIT:FIRE:3d7 F:AURA_FIRE -F:BASEANGBAND F:EMPTY_MIND F:FORCE_SLEEP F:HAS_LITE @@ -16293,7 +15747,6 @@ B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 B:TOUCH:ACID:1d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -16329,7 +15782,6 @@ B:GAZE:PARALYZE F:ANIMAL F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -16347,7 +15799,6 @@ W:37:1:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -16377,7 +15828,6 @@ B:ENGULF:FIRE:4d8 B:ENGULF:ELEC:4d8 F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -16408,7 +15858,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16442,7 +15891,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16473,7 +15921,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:3d6 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16508,7 +15955,6 @@ B:CLAW:HURT:2d10 B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16538,7 +15984,6 @@ B:CLAW:HURT:2d12 B:CLAW:HURT:2d12 B:BITE:HURT:4d12 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16576,7 +16021,6 @@ E:1:1:1:2:1:1 O:0:0:100:0 B:HIT:HURT:1d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -16605,7 +16049,6 @@ B:HIT:HURT:1d9 B:INSULT:* B:INSULT:* F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_90 @@ -16642,7 +16085,6 @@ B:HIT:HURT:1d10 B:HIT:HURT:1d10 B:HIT:HURT:1d9 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -16680,7 +16122,6 @@ O:0:90:0:10 B:HIT:EXP_20:6d6 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -16716,7 +16157,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_GOOD @@ -16746,7 +16186,6 @@ W:38:4:0:800 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:TIME:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -16771,7 +16210,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:BLIND:4d4 B:ENGULF:BLIND:4d4 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -16803,7 +16241,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:ELEC:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16837,7 +16274,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:HURT:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -16870,7 +16306,6 @@ B:GAZE:EXP_20:2d6 B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -16907,7 +16342,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -16943,7 +16377,6 @@ O:0:0:0:0 B:BITE:POISON:3d12 B:BITE:POISON:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -16965,7 +16398,6 @@ B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 B:HIT:FIRE:6d6 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SPEAK @@ -17003,7 +16435,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_40 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -17040,7 +16471,6 @@ O:0:0:0:0 B:BITE:BLIND:3d12 B:BITE:BLIND:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -17060,7 +16490,6 @@ O:0:0:0:0 B:BITE:CONFUSE:3d12 B:BITE:CONFUSE:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -17083,7 +16512,6 @@ B:BITE:HURT:3d12 B:BITE:HURT:3d12 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_SKELETON @@ -17108,7 +16536,6 @@ B:KICK:HURT:24d1 B:KICK:HURT:24d1 B:CLAW:EXP_80:4d2 B:CLAW:LOSE_DEX:4d2 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -17151,7 +16578,6 @@ B:HIT:HURT:1d12 B:HIT:HURT:1d12 B:TOUCH:EXP_80 B:TOUCH:EXP_80 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_4D2 @@ -17190,7 +16616,6 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -17217,7 +16642,6 @@ B:BITE:POISON:3d9 B:BITE:POISON:3d9 B:SPIT:BLIND:1d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -17246,7 +16670,6 @@ B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -17283,7 +16706,6 @@ B:BITE:HURT:1d6 B:BITE:HURT:1d6 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:FORCE_MAXHP @@ -17307,7 +16729,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:COLD:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_3D2 @@ -17341,7 +16762,6 @@ B:CLAW:HURT:4d8 B:CLAW:HURT:4d8 B:BITE:POISON:7d8 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -17377,7 +16797,6 @@ B:CLAW:COLD:1d2 B:CLAW:COLD:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -17400,7 +16819,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:HURT:3d4 B:BITE:HURT:3d4 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -17430,7 +16848,6 @@ B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 B:BITE:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -17460,7 +16877,6 @@ B:BITE:EXP_80:2d6 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:CONFUSE:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -17490,7 +16906,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:BITE:EXP_80:4d6 B:BITE:EXP_80:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -17531,7 +16946,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:ACID:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -17599,7 +17013,6 @@ B:CLAW:PARALYZE:1d2 B:CLAW:HURT:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -17622,7 +17035,6 @@ B:CLAW:HALLU:1d2 B:CLAW:HURT:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -17645,7 +17057,6 @@ B:CLAW:EAT_LITE:1d2 B:CLAW:EAT_LITE:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -17666,7 +17077,6 @@ B:KICK:HURT:5d5 B:KICK:HURT:5d5 B:BITE:HURT:6d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_MAXHP @@ -17699,7 +17109,6 @@ O:10:90:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:CAN_FLY F:DROP_90 F:EVIL @@ -17725,7 +17134,6 @@ B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:BITE:HURT:3d5 B:BITE:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -17753,7 +17161,6 @@ O:0:0:0:0 B:CRAWL:UN_BONUS:1d4 F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:HURT_LITE @@ -17774,7 +17181,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -17800,7 +17206,6 @@ B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 B:HIT:CONFUSE:9d9 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -17834,7 +17239,6 @@ B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 B:BITE:FIRE:3d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_3D2 @@ -17863,7 +17267,6 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -17894,7 +17297,6 @@ O:30:50:20:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -17942,7 +17344,6 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_90 @@ -17983,7 +17384,6 @@ B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d4 -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -18014,7 +17414,6 @@ B:CLAW:LOSE_INT:1d2 B:CLAW:DISEASE:1d2 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:FORCE_SLEEP @@ -18036,7 +17435,6 @@ B:ENGULF:LOSE_ALL:5d5 B:ENGULF:EXP_80:5d5 B:ENGULF:LOSE_ALL:5d5 B:ENGULF:EXP_80:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18073,7 +17471,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:POISON:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18103,7 +17500,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:EXP_80:7d10 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_2D2 @@ -18140,7 +17536,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:FIRE:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18176,7 +17571,6 @@ B:CLAW:HURT:4d9 B:CLAW:HURT:4d9 B:BITE:HURT:7d9 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18210,7 +17604,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -18247,7 +17640,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:LOSE_ALL:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18277,7 +17669,6 @@ B:STING:POISON:3d4 B:SPIT:COLD:3d4 B:HIT:HURT:3d4 B:CRUSH:HURT:8d12 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_60 @@ -18308,7 +17699,6 @@ O:0:50:50:0 B:BITE:LOSE_DEX:3d6 B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 -F:BASEANGBAND F:CAN_FLY F:DEMON F:DROP_2D2 @@ -18346,7 +17736,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:PARALYZE:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18374,7 +17763,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:EXP_40:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18402,7 +17790,6 @@ W:21:1:0:100 E:0:0:0:0:0:0 O:0:0:0:0 B:ENGULF:CONFUSE:3d3 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -18431,7 +17818,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -18503,7 +17889,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -18573,7 +17958,6 @@ O:0:0:100:0 B:HIT:HURT:2d8 B:HIT:HURT:2d8 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_90 @@ -18618,7 +18002,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:2d12 B:TOUCH:LOSE_DEX:2d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -18660,7 +18043,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -18682,7 +18064,6 @@ A:84:50 B:HIT:HURT:3d8 B:HIT:HURT:3d8 B:HIT:HURT:3d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -18736,7 +18117,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -18758,7 +18138,6 @@ E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -18776,7 +18155,6 @@ W:8:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EXP_10:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -18800,7 +18178,6 @@ B:GAZE:EXP_40:3d6 B:GAZE:UN_POWER:3d6 B:GAZE:INSANITY:3d6 B:BITE:EXP_40:7d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -18846,7 +18223,6 @@ B:TOUCH:EXP_80 B:TOUCH:EXP_40 B:CLAW:LOSE_INT:1d10 B:CLAW:LOSE_WIS:1d10 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -18882,7 +18258,6 @@ O:0:0:100:0 B:BUTT:COLD:3d6 B:BUTT:FIRE:3d6 B:BUTT:ELEC:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -18927,7 +18302,6 @@ O:0:50:50:0 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_60 @@ -18965,7 +18339,6 @@ B:GAZE:PARALYZE:3d12 B:BITE:POISON:2d12 B:BITE:POISON:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -18993,7 +18366,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:COLD:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -19013,7 +18385,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:DISEASE:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -19033,7 +18404,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EAT_LITE:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -19053,7 +18423,6 @@ W:1:1:10:1 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:1d4 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:IM_POIS @@ -19075,7 +18444,6 @@ B:BUTT:HURT:8d6 B:BUTT:HURT:8d6 B:CRUSH:HURT:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FRIENDS @@ -19138,7 +18506,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -19184,7 +18551,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:HURT:7d10 F:ATTR_MULTI -F:BASEANGBAND F:CAN_FLY F:DRAGON F:DROP_2D2 @@ -19217,7 +18583,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:BLIND:4d6 B:HIT:EAT_LITE:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -19250,7 +18615,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:PARALYZE:4d6 B:HIT:PARALYZE:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -19284,7 +18648,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:SHATTER:10d10 -F:BASEANGBAND F:CAN_SPEAK F:COLD_BLOOD F:EMPTY_MIND @@ -19352,7 +18715,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:EXP_40:4d6 B:HIT:INSANITY:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:ELDRITCH_HORROR @@ -19386,7 +18748,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:HIT:CONFUSE:4d6 B:HIT:CONFUSE:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -19420,7 +18781,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:ELEC:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -19442,7 +18802,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:EAT_LITE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -19463,7 +18822,6 @@ O:0:0:0:0 B:BITE:LOSE_CON:1d4 B:CRUSH:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -19532,7 +18890,6 @@ B:HIT:CONFUSE:4d4 B:HIT:HURT:4d6 B:HIT:CONFUSE:4d4 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -19572,7 +18929,6 @@ B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 B:BITE:FIRE:3d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -19603,7 +18959,6 @@ O:0:10:90:0 B:HIT:HURT:3d4 B:HIT:HURT:3d4 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -19642,7 +18997,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:LOSE_STR:3d4 B:HIT:LOSE_STR:3d4 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_1D2 @@ -19686,7 +19040,6 @@ B:CLAW:HURT:3d10 B:BITE:POISON:5d10 B:BITE:POISON:5d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -19725,7 +19078,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:COLD:4d14 B:BITE:COLD:4d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -19788,7 +19140,6 @@ B:HIT:UN_BONUS:4d8 B:HIT:UN_BONUS:4d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -19830,7 +19181,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:FIRE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -19851,7 +19201,6 @@ B:HIT:EAT_ITEM:5d5 B:HIT:EAT_ITEM:5d5 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_GOLD:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -19877,7 +19226,6 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:FIRE:5d14 B:BITE:FIRE:5d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -19952,7 +19300,6 @@ O:0:100:0:0 B:HIT:HURT:5d5 B:HIT:HURT:5d5 B:HIT:HURT:5d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -20002,7 +19349,6 @@ O:0:0:0:0 B:BITE:HURT:1d4 B:CRUSH:TERRIFY:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -20027,7 +19373,6 @@ B:CLAW:HURT:4d12 B:CLAW:HURT:4d12 B:BITE:EXP_80:7d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -20068,7 +19413,6 @@ B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 B:HIT:CONFUSE:12d12 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_4D2 @@ -20106,7 +19450,6 @@ B:BITE:FIRE:7d14 B:GAZE:PARALYZE F:ANIMAL F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -20141,7 +19484,6 @@ B:CLAW:HURT:3d8 B:BITE:EXP_40:4d6 B:BITE:EXP_40:4d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EVIL @@ -20170,7 +19512,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:ACID:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20191,7 +19532,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:BLIND:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20211,7 +19551,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:ELEC:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20232,7 +19571,6 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_GOOD @@ -20289,7 +19627,6 @@ B:CLAW:HURT:4d10 B:CLAW:HURT:4d10 B:BITE:FIRE:4d14 B:BITE:FIRE:4d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -20325,7 +19662,6 @@ B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:UN_BONUS:7d7 B:SPORE:EXP_80:5d5 -F:BASEANGBAND F:CAN_SWIM F:EVIL F:FORCE_SLEEP @@ -20353,7 +19689,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:EAT_LITE:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20374,7 +19709,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:CONFUSE:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20395,7 +19729,6 @@ B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 B:CRUSH:HURT:12d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -20426,7 +19759,6 @@ B:CLAW:HURT:5d12 B:CLAW:HURT:5d12 B:BITE:FIRE:8d14 B:BITE:POISON:8d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DRAGON @@ -20476,7 +19808,6 @@ B:CRUSH:HURT:3d15 B:CRUSH:HURT:3d15 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:FORCE_MAXHP @@ -20507,7 +19838,6 @@ B:BITE:HURT:3d4 B:SPIT:COLD:4d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20528,7 +19858,6 @@ O:0:0:0:0 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -20561,7 +19890,6 @@ B:HIT:POISON:6d6 B:SPIT:FIRE:6d6 B:SPIT:ACID:6d6 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:DEMON F:DROP_GOOD @@ -20603,7 +19931,6 @@ B:HIT:HURT:4d10 B:HIT:LOSE_CHR:10d2 B:SPIT:ACID:4d10 B:STING:POISON:5d5 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -20634,7 +19961,6 @@ O:0:0:0:0 B:BITE:HURT:3d4 B:SPIT:HALLU:4d5 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -20656,7 +19982,6 @@ B:TOUCH:POISON:6d5 B:TOUCH:POISON:6d5 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -20704,7 +20029,6 @@ B:BITE:POISON:4d4 B:BITE:POISON:4d4 B:BITE:POISON:4d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_2D2 F:DROP_4D2 @@ -20737,7 +20061,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -20765,7 +20088,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -20792,7 +20114,6 @@ B:CLAW:HURT:2d12 B:BITE:HURT:2d12 B:BITE:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -20820,7 +20141,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -20849,7 +20169,6 @@ B:BITE:ELEC:6d14 B:BITE:ELEC:6d14 F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -20886,7 +20205,6 @@ O:0:100:0:0 B:HIT:SHATTER:20d12 B:HIT:SHATTER:20d12 B:BITE:POISON:6d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -20928,7 +20246,6 @@ B:BITE:ACID:3d8 B:SPIT:ACID:3d4 B:SPIT:ACID:3d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -20958,7 +20275,6 @@ B:HIT:HURT:10d5 B:HIT:HURT:10d5 B:HIT:EXP_80:10d5 B:HIT:EXP_80:10d5 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_1D2 @@ -21003,7 +20319,6 @@ B:BITE:ACID:3d9 B:BITE:ELEC:3d9 B:BITE:COLD:3d9 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -21037,7 +20352,6 @@ B:BITE:FIRE:4d12 B:BITE:POISON:4d12 B:BITE:POISON:4d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -21074,7 +20388,6 @@ B:BITE:POISON:8d6 B:BITE:FIRE:12d6 B:BITE:FIRE:12d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -21114,7 +20427,6 @@ B:BITE:ACID:4d10 B:BITE:ELEC:4d10 B:BITE:COLD:4d10 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_4D2 @@ -21158,7 +20470,6 @@ B:BITE:COLD:5d11 B:BITE:ELEC:5d11 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_4D2 @@ -21207,7 +20518,6 @@ B:BITE:COLD:6d12 B:BITE:ELEC:6d12 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_4D2 @@ -21264,7 +20574,6 @@ O:0:0:100:0 B:HIT:HURT:6d8 B:HIT:HURT:6d8 B:HIT:HURT:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:EVIL @@ -21307,7 +20616,6 @@ B:BITE:HURT:2d12 B:BITE:HURT:2d12 B:CLAW:HURT:2d12 F:ANIMAL -F:BASEANGBAND F:FORCE_SLEEP F:FRIENDS F:INVISIBLE @@ -21331,7 +20639,6 @@ B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 B:CRUSH:HURT:16d12 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_3D2 F:DROP_CORPSE @@ -21376,7 +20683,6 @@ B:BITE:COLD:6d14 B:BITE:COLD:6d14 F:ATTR_MULTI F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_2D2 @@ -21414,7 +20720,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:4d12 B:TOUCH:LOSE_DEX:4d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -21506,7 +20811,6 @@ B:STING:LOSE_CON:8d8 B:STING:LOSE_CON:8d8 B:BITE:ACID:10d10 B:BITE:ACID:10d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -21552,7 +20856,6 @@ E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:3d9 B:BITE:POISON:2d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_60 @@ -21580,7 +20883,6 @@ W:13:2:2100:50 E:1:1:1:2:1:1 O:10:85:0:0 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -21606,7 +20908,6 @@ E:1:1:1:2:1:1 O:20:50:20:5 B:HIT:HURT:4d8 B:HIT:HURT:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -21630,7 +20931,6 @@ I:130:60d10:20:110:10 W:57:2:10:18000 E:0:0:0:1:0:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -21668,7 +20968,6 @@ I:130:10d100:20:90:10 W:58:2:2:21000 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -21701,7 +21000,6 @@ I:130:14d100:20:120:10 W:59:2:1000:24000 E:0:0:0:0:1:0 O:0:0:0:0 -F:BASEANGBAND F:CAN_SWIM F:COLD_BLOOD F:EVIL @@ -21742,7 +21040,6 @@ B:ENGULF:HURT:5d5 B:ENGULF:HURT:5d5 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -21774,7 +21071,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -21826,7 +21122,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -21850,7 +21145,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -21876,7 +21170,6 @@ B:BITE:EXP_80:6d6 B:BITE:EXP_80:6d6 B:HIT:CONFUSE:6d6 B:HIT:CONFUSE:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -21931,7 +21224,6 @@ B:BITE:FIRE:6d14 B:BITE:FIRE:6d14 F:ATTR_MULTI F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -21969,7 +21261,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -21993,7 +21284,6 @@ W:45:3:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -22017,7 +21307,6 @@ W:45:1:3000:3000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -22047,7 +21336,6 @@ B:HIT:HURT:2d6 B:BITE:COLD:3d6 F:ANIMAL F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22076,7 +21364,6 @@ B:HIT:EXP_40:3d8 B:HIT:HURT:3d8 B:BITE:HURT:3d8 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22108,7 +21395,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:HURT:8d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -22157,7 +21443,6 @@ B:HIT:ACID:4d12 B:HIT:ACID:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -22199,7 +21484,6 @@ B:HIT:POISON:2d6 B:HIT:HURT:2d6 B:BITE:POISON:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22227,7 +21511,6 @@ B:HIT:HURT:2d6 B:BITE:FIRE:3d6 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22254,7 +21537,6 @@ B:CLAW:HURT:10d12 B:CLAW:HURT:10d12 B:BITE:HURT:10d14 B:BITE:HURT:10d14 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -22304,7 +21586,6 @@ B:HIT:POISON:2d6 B:HIT:HURT:2d6 B:BITE:PARALYZE:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22328,7 +21609,6 @@ B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:10d10 B:HIT:UN_BONUS:7d7 B:HIT:UN_BONUS:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -22376,7 +21656,6 @@ B:HIT:BLIND:2d6 B:HIT:HURT:2d6 B:BITE:EAT_LITE:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22405,7 +21684,6 @@ B:HIT:HALLU:2d6 B:HIT:HURT:2d6 B:BITE:INSANITY:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22433,7 +21711,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:HURT:5d5 B:HIT:HURT:5d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -22494,7 +21771,6 @@ B:TOUCH:EAT_GOLD:5d5 B:TOUCH:EAT_ITEM:5d5 B:HIT:BLIND:10d5 B:HIT:POISON:8d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -22526,7 +21802,6 @@ B:HIT:ELEC:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -22566,7 +21841,6 @@ B:HIT:EXP_40:6d6 B:HIT:EXP_40:6d6 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:CAN_FLY F:COLD_BLOOD F:DROP_2D2 @@ -22614,7 +21888,6 @@ B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 B:CRUSH:HURT:15d15 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_3D2 F:DROP_CORPSE @@ -22660,7 +21933,6 @@ B:TOUCH:EXP_80 B:TOUCH:UN_POWER B:TOUCH:LOSE_DEX:8d12 B:TOUCH:LOSE_DEX:8d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -22710,7 +21982,6 @@ B:CLAW:CONFUSE:12d12 B:CLAW:LOSE_DEX:2d12 B:CLAW:BLIND:10d5 B:BITE:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_GOOD @@ -22773,7 +22044,6 @@ B:CLAW:HURT:2d12 F:ANIMAL F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -22799,7 +22069,6 @@ B:HIT:HALLU:2d6 B:HIT:LOSE_ALL:2d6 B:BITE:EXP_40:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_SKELETON @@ -22824,7 +22093,6 @@ B:BITE:EXP_80:6d6 B:GAZE:PARALYZE:5d5 B:GAZE:INSANITY:5d5 B:GAZE:UN_POWER:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -22866,7 +22134,6 @@ B:CRUSH:HURT:6d15 B:CRUSH:HURT:6d15 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:FORCE_MAXHP F:FORCE_SLEEP @@ -22904,7 +22171,6 @@ B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_ANY F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -22946,7 +22212,6 @@ B:CLAW:HURT:5d12 B:BITE:HURT:7d14 B:BITE:HURT:7d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -22988,7 +22253,6 @@ B:CLAW:HURT:6d12 B:BITE:HURT:8d14 B:BITE:HURT:8d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -23034,7 +22298,6 @@ B:HIT:ACID:3d4 B:HIT:ACID:3d4 B:HIT:ACID:3d4 B:HIT:ACID:3d4 -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -23065,7 +22328,6 @@ B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -23107,7 +22369,6 @@ B:HIT:FIRE:3d4 B:HIT:FIRE:3d4 B:HIT:FIRE:3d4 F:AURA_FIRE -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -23185,7 +22446,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -23286,7 +22546,6 @@ B:HIT:HURT:10d10 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 F:AURA_COLD -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:COLD_BLOOD @@ -23335,7 +22594,6 @@ B:BITE:ELEC:8d14 F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -23375,7 +22633,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:TOUCH:UN_POWER:3d3 B:TOUCH:UN_BONUS:3d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -23417,7 +22674,6 @@ B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 B:HIT:HURT:11d11 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -23463,7 +22719,6 @@ B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 B:HIT:POISON:3d4 -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -23495,7 +22750,6 @@ B:HIT:ELEC:3d4 B:HIT:ELEC:3d4 B:HIT:ELEC:3d4 F:AURA_ELEC -F:BASEANGBAND F:COLD_BLOOD F:DROP_2D2 F:EMPTY_MIND @@ -23525,7 +22779,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:LOSE_STR:4d6 B:HIT:LOSE_STR:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:COLD_BLOOD @@ -23571,7 +22824,6 @@ O:20:40:40:0 B:HIT:HURT:4d5 B:HIT:HURT:4d5 B:HIT:HURT:4d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:EVIL @@ -23615,7 +22867,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -23639,7 +22890,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -23664,7 +22914,6 @@ W:71:2:5000:10500 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -23733,7 +22982,6 @@ B:TOUCH:EXP_80:6d12 B:TOUCH:UN_POWER:6d12 B:TOUCH:LOSE_DEX:6d12 B:TOUCH:LOSE_DEX:6d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -23784,7 +23032,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:EAT_LITE:1d8 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -23817,7 +23064,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:HURT:1d8 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -23850,7 +23096,6 @@ B:HIT:FIRE:8d12 B:CRUSH:HURT:7d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -23899,7 +23144,6 @@ B:CLAW:POISON:8d6 B:BITE:PARALYZE:8d10 B:STING:LOSE_STR:8d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -23945,7 +23189,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -23987,7 +23230,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24033,7 +23275,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -24086,7 +23327,6 @@ B:CLAW:FIRE:8d10 B:CLAW:FIRE:8d10 B:BITE:POISON:7d10 B:BITE:LOSE_CON:7d10 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -24135,7 +23375,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24178,7 +23417,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24220,7 +23458,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24260,7 +23497,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24301,7 +23537,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24341,7 +23576,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:TOUCH:UN_POWER B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_4D2 @@ -24386,7 +23620,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_POWER:6d8 B:HIT:BLIND:6d8 B:HIT:CONFUSE:6d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -24488,7 +23721,6 @@ W:76:2:7000:15000 E:0:0:0:0:0:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:EMPTY_MIND F:FORCE_MAXHP F:FORCE_SLEEP @@ -24516,7 +23748,6 @@ W:79:3:10000:20000 E:0:0:0:0:0:0 O:20:20:20:20 F:ANIMAL -F:BASEANGBAND F:DROP_4D2 F:EMPTY_MIND F:FORCE_MAXHP @@ -24558,7 +23789,6 @@ B:HIT:HURT:1d6 B:HIT:HURT:1d6 B:BITE:EXP_20:2d6 B:BITE:EXP_20:2d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -24651,7 +23881,6 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:HIT:HURT:8d8 F:AI_SPECIAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_3D2 @@ -24699,7 +23928,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:COLD:2d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:IM_COLD @@ -24720,7 +23948,6 @@ O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:POISON:2d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -24742,7 +23969,6 @@ O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:EAT_LITE:2d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HURT_LITE @@ -24763,7 +23989,6 @@ B:BITE:FIRE:5d12 B:BITE:FIRE:5d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:EVIL @@ -24789,7 +24014,6 @@ B:GAZE:EXP_80:5d5 B:GAZE:EXP_80:5d5 B:TOUCH:POISON:5d5 B:TOUCH:POISON:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -24840,7 +24064,6 @@ O:0:0:0:0 B:BITE:HURT:1d2 B:SPIT:ELEC:2d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:HAS_EGG @@ -24861,7 +24084,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EXP_40:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -24885,7 +24107,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:TERRIFY:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -24908,7 +24129,6 @@ O:0:0:0:0 B:BITE:ACID:1d6 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -24931,7 +24151,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:PARALYZE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -24956,7 +24175,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -24979,7 +24197,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -25005,7 +24222,6 @@ B:HIT:HURT:10d10 B:TOUCH:UN_POWER:10d10 B:TOUCH:UN_POWER:10d10 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_4D2 @@ -25039,7 +24255,6 @@ B:HIT:FIRE:8d12 B:HIT:FIRE:8d12 B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -25085,7 +24300,6 @@ B:CLAW:HURT:6d8 B:BITE:POISON:6d6 B:BITE:POISON:6d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -25120,7 +24334,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -25143,7 +24356,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:CONFUSE:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -25167,7 +24379,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -25192,7 +24403,6 @@ B:HIT:EXP_80:7d12 B:HIT:LOSE_DEX:7d12 B:HIT:UN_POWER:7d12 B:HIT:UN_POWER:7d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -25246,7 +24456,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:FORCE_SLEEP @@ -25270,7 +24479,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:FIRE:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:IM_FIRE @@ -25296,7 +24504,6 @@ F:ATTR_MULTI F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -25366,7 +24573,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ELEC:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:IM_ELEC @@ -25385,7 +24591,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:ACID:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:IM_ACID @@ -25407,7 +24612,6 @@ B:BITE:FIRE:9d12 B:BITE:FIRE:9d12 F:ANIMAL F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -25443,7 +24647,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:LOSE_STR:1d4 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:DROP_SKELETON @@ -25462,7 +24665,6 @@ O:0:0:0:0 B:BITE:POISON:1d4 B:BITE:HURT:2d4 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:CAN_SWIM F:DROP_CORPSE @@ -25485,7 +24687,6 @@ B:BITE:COLD:9d12 B:BITE:COLD:9d12 F:ANIMAL F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -25532,7 +24733,6 @@ B:CLAW:HURT:1d4 B:CLAW:HURT:1d4 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -25553,7 +24753,6 @@ B:CLAW:HURT:2d4 B:CLAW:HURT:2d4 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -25579,7 +24778,6 @@ B:CRUSH:HURT:8d12 B:TOUCH:UN_POWER F:ATTR_MULTI F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SPEAK @@ -25629,7 +24827,6 @@ B:CLAW:HURT:4d4 B:CLAW:HURT:4d4 B:BITE:HURT:4d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -25735,7 +24932,6 @@ B:HIT:UN_BONUS:10d12 B:HIT:UN_BONUS:10d12 B:HIT:UN_POWER:8d12 B:HIT:UN_POWER:8d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -25888,7 +25084,6 @@ B:HIT:SHATTER:24d10 B:HIT:LOSE_ALL:10d12 B:TOUCH:UN_POWER F:AURA_COLD -F:BASEANGBAND F:CAN_SPEAK F:DROP_1D2 F:DROP_2D2 @@ -25957,7 +25152,6 @@ W:0:20:1700:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -25978,7 +25172,6 @@ W:0:20:1400:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:2d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -26004,7 +25197,6 @@ W:0:20:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -26026,7 +25218,6 @@ E:1:1:1:2:1:1 O:10:90:0:0 B:HIT:HURT:8d5 B:HIT:HURT:8d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -26056,7 +25247,6 @@ B:CLAW:HURT:1d4 B:CLAW:FIRE:1d4 B:BITE:HURT:3d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -26174,7 +25364,6 @@ B:HIT:FIRE:6d12 B:HIT:FIRE:6d12 B:CRUSH:HURT:5d12 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_2D2 @@ -26223,7 +25412,6 @@ B:CLAW:CONFUSE:1d4 B:BITE:PARALYZE:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_CORPSE @@ -26242,7 +25430,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:EAT_FOOD:2d3 B:TOUCH:LOSE_CHR:2d3 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:HURT_LITE @@ -26402,7 +25589,6 @@ O:0:0:0:0 B:BITE:HURT:2d3 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:MORTAL @@ -26420,7 +25606,6 @@ B:TOUCH:ELEC:2d7 B:TOUCH:ELEC:2d7 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_ELEC F:MORTAL @@ -26440,7 +25625,6 @@ B:CLAW:HURT:3d4 B:CLAW:HURT:3d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:MORTAL @@ -26458,7 +25642,6 @@ B:TOUCH:LOSE_WIS B:TOUCH:INSANITY:2d3 B:TOUCH:CONFUSE F:AQUATIC -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:FEMALE @@ -26479,7 +25662,6 @@ B:TOUCH:PARALYZE:1d6 B:TOUCH:PARALYZE:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_POIS F:MORTAL @@ -26496,7 +25678,6 @@ B:BITE:HURT:5d1 B:BITE:HURT:5d1 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FRIENDS F:MORTAL @@ -26513,7 +25694,6 @@ O:0:0:0:0 B:BITE:HURT:1d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FRIENDS F:MORTAL @@ -26530,7 +25710,6 @@ O:50:0:50:0 B:CRUSH:HURT:2d10 B:BITE:POISON:2d4 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_90 @@ -26557,7 +25736,6 @@ O:50:0:50:0 B:CRUSH:HURT:4d10 B:BITE:ACID:3d6 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_90 @@ -26586,7 +25764,6 @@ E:0:0:0:0:1:0 O:0:0:0:0 B:BITE:HURT:1d1 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:EMPTY_MIND @@ -26609,7 +25786,6 @@ B:CRUSH:HURT:1d20 B:CRUSH:HURT:1d20 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:FORCE_MAXHP F:MORTAL F:RAND_25 @@ -26629,7 +25805,6 @@ B:BITE:POISON:3d6 F:ANIMAL F:AQUATIC F:ATTR_CLEAR -F:BASEANGBAND F:CHAR_CLEAR F:COLD_BLOOD F:DROP_CORPSE @@ -26652,7 +25827,6 @@ B:CRUSH:HURT:6d3 B:CRUSH:HURT:6d3 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:IM_COLD F:MORTAL @@ -26673,7 +25847,6 @@ B:CRUSH:HURT:8d4 B:CRUSH:PARALYZE:8d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:DROP_CORPSE F:IM_POIS @@ -26702,7 +25875,6 @@ B:GAZE:UN_POWER:2d6 B:GAZE:INSANITY:2d6 B:BITE:HURT:6d6 F:AQUATIC -F:BASEANGBAND F:CAN_FLY F:DROP_CORPSE F:EVIL @@ -26742,7 +25914,6 @@ B:STING:INSANITY:5d10 B:STING:UN_BONUS F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:EVIL F:FORCE_MAXHP @@ -26777,7 +25948,6 @@ B:TOUCH:BLIND:3d3 B:TOUCH:POISON:2d4 B:WAIL:TERRIFY F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:EVIL @@ -26805,7 +25975,6 @@ O:0:0:0:0 B:BITE:HURT:4d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:RAND_25 @@ -26823,7 +25992,6 @@ B:BUTT:HURT:3d4 B:BITE:HURT:3d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -26840,7 +26008,6 @@ B:BITE:HURT:4d6 B:BITE:HURT:4d6 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:FORCE_SLEEP F:MORTAL @@ -26855,7 +26022,6 @@ O:0:0:0:0 B:HIT:HURT:3d10 B:HIT:HURT:3d10 F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:IM_COLD @@ -26878,7 +26044,6 @@ E:0:0:0:0:1:0 O:50:0:50:0 B:CRUSH:HURT:2d10 B:BITE:LOSE_CHR:3d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_60 @@ -26908,7 +26073,6 @@ B:BITE:HURT:3d5 B:BITE:HURT:3d5 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:COLD_BLOOD F:MORTAL F:WILD_TOO @@ -26926,7 +26090,6 @@ B:HIT:HURT:1d10 B:HIT:HURT:3d2 B:HIT:HURT:3d2 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:EVIL @@ -26983,7 +26146,6 @@ O:0:0:80:20 B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:COLD:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_1D2 @@ -27011,7 +26173,6 @@ O:20:60:10:10 B:HIT:HURT:4d4 B:HIT:HURT:4d4 F:AQUATIC -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:FRIENDS @@ -27030,7 +26191,6 @@ E:1:1:1:2:1:0 O:10:10:70:10 B:TOUCH:UN_BONUS F:AQUATIC -F:BASEANGBAND F:DROP_2D2 F:DROP_CORPSE F:GOOD @@ -27054,7 +26214,6 @@ O:0:0:0:0 B:GAZE:PARALYZE F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:RAND_25 @@ -27074,7 +26233,6 @@ B:GAZE:PARALYZE B:GAZE:CONFUSE F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL F:SMART @@ -27092,7 +26250,6 @@ B:BITE:HURT:2d6 F:ANIMAL F:AQUATIC F:ATTR_CLEAR -F:BASEANGBAND F:DROP_CORPSE F:INVISIBLE F:MORTAL @@ -27110,7 +26267,6 @@ B:BITE:HURT:2d2 B:BITE:HURT:2d2 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:MORTAL D:A giant turtle with flippers, adapted for life in the ocean. @@ -27126,7 +26282,6 @@ B:CLAW:HURT:1d3 B:BITE:HURT:1d5 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_1D2 F:DROP_60 @@ -27150,7 +26305,6 @@ B:CLAW:HURT:2d6 B:BITE:HURT:2d8 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_3D2 F:DROP_CORPSE @@ -27175,7 +26329,6 @@ B:CLAW:HURT:2d10 B:BITE:HURT:4d10 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_4D2 F:DROP_CORPSE @@ -27201,7 +26354,6 @@ B:CLAW:HURT:4d8 B:BITE:HURT:7d8 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:DROP_1D2 F:DROP_4D2 @@ -27234,7 +26386,6 @@ B:CRUSH:POISON:3d10 B:CRUSH:POISON:3d10 F:AQUATIC F:ATTR_MULTI -F:BASEANGBAND F:DRAGON F:FORCE_MAXHP F:FORCE_SLEEP @@ -27265,7 +26416,6 @@ B:GAZE:PARALYZE B:GAZE:EXP_20 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:INVISIBLE F:NO_CUT F:SMART @@ -27286,7 +26436,6 @@ B:BITE:HURT:7d4 B:BITE:HURT:7d4 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:MORTAL F:WILD_OCEAN F:WILD_TOO @@ -27301,7 +26450,6 @@ O:20:70:0:10 B:HIT:HURT:3d8 B:HIT:HURT:3d8 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -27329,7 +26477,6 @@ B:CRUSH:HURT:2d8 B:BITE:POISON:1d8 B:BITE:POISON:1d8 F:AQUATIC -F:BASEANGBAND F:DROP_2D2 F:DROP_90 F:DROP_CORPSE @@ -27358,7 +26505,6 @@ B:CRUSH:TERRIFY:2d8 B:CRUSH:HURT:2d8 B:BITE:BLIND:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SWIM @@ -27391,7 +26537,6 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CAN_SWIM @@ -27457,7 +26602,6 @@ B:BITE:HURT:2d8 B:CLAW:POISON:2d8 F:ANIMAL F:AQUATIC -F:BASEANGBAND F:DROP_CORPSE F:FRIENDS F:MORTAL @@ -27477,7 +26621,6 @@ B:HIT:HURT:3d4 B:GAZE:POISON:8d12 B:CLAW:INSANITY:8d12 F:AQUATIC -F:BASEANGBAND F:DEMON F:DROP_60 F:EVIL @@ -27509,7 +26652,6 @@ B:CRUSH:HURT:2d8 B:CRUSH:HURT:2d8 B:BITE:HURT:1d8 B:BITE:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_2D2 @@ -27542,7 +26684,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:COLD:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_COLD @@ -27565,7 +26706,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:EAT_LITE:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -27612,7 +26752,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:3d4 -F:BASEANGBAND F:COLD_BLOOD F:GOOD F:IM_COLD @@ -27636,7 +26775,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:9d4 -F:BASEANGBAND F:COLD_BLOOD F:GOOD F:IM_COLD @@ -27660,7 +26798,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:18d4 -F:BASEANGBAND F:COLD_BLOOD F:GOOD F:IM_COLD @@ -27684,7 +26821,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:20d4 -F:BASEANGBAND F:COLD_BLOOD F:GOOD F:IM_COLD @@ -27708,7 +26844,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:TOUCH:TERRIFY B:TOUCH:HURT:30d4 -F:BASEANGBAND F:COLD_BLOOD F:GOOD F:IM_COLD @@ -27734,7 +26869,6 @@ B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 B:CRUSH:HURT:13d13 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_4D2 @@ -27767,7 +26901,6 @@ B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 B:HIT:TERRIFY:5d5 B:HIT:TERRIFY:5d5 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -27824,7 +26957,6 @@ B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -27855,7 +26987,6 @@ W:8:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:DROP_SKELETON @@ -27884,7 +27015,6 @@ B:CLAW:HURT:4d12 B:BITE:POISON:6d14 B:BITE:POISON:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -27923,7 +27053,6 @@ B:CLAW:HURT:4d12 B:BITE:ACID:6d14 B:BITE:ACID:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -28099,7 +27228,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -28129,7 +27257,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:HIT:EXP_80:4d6 B:HIT:EXP_80:4d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -28165,7 +27292,6 @@ B:HIT:HURT:6d6 B:HIT:HURT:6d6 B:TOUCH:EXP_80:5d6 B:TOUCH:EXP_80:5d6 -F:BASEANGBAND F:COLD_BLOOD F:DROP_4D2 F:DROP_CHOSEN @@ -28211,7 +27337,6 @@ B:HIT:HURT:7d6 B:HIT:HURT:7d6 B:GAZE:EXP_80:6d6 B:WAIL:TERRIFY:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -28257,7 +27382,6 @@ B:HIT:HURT:7d7 B:HIT:HURT:7d7 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -28303,7 +27427,6 @@ B:HIT:HURT:8d7 B:HIT:HURT:8d7 B:TOUCH:EXP_40:6d7 B:TOUCH:EXP_40:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -28350,7 +27473,6 @@ B:HIT:HURT:8d8 B:HIT:HURT:8d8 B:BITE:EXP_40:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -28396,7 +27518,6 @@ B:HIT:HURT:9d9 B:HIT:HURT:9d9 B:TOUCH:EXP_80:6d7 B:WAIL:TERRIFY:6d7 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_2D2 @@ -28445,7 +27566,6 @@ B:HIT:HURT:9d10 B:HIT:HURT:9d10 B:TOUCH:EXP_80:7d7 B:TOUCH:EXP_80:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -28498,7 +27618,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:EXP_80:7d7 B:HIT:EXP_80:7d7 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:COLD_BLOOD @@ -28744,7 +27863,6 @@ B:HIT:HURT:8d6 B:HIT:HURT:8d6 B:HIT:UN_BONUS:6d8 B:HIT:UN_BONUS:6d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_CORPSE @@ -28781,7 +27899,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:LOSE_STR:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -28805,7 +27922,6 @@ B:CLAW:POISON:2d8 B:BITE:POISON:2d6 B:BITE:POISON:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -28834,7 +27950,6 @@ B:CLAW:POISON:5d8 B:BITE:HALLU:5d6 B:BITE:HALLU:5d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_SKELETON F:EVIL @@ -28868,7 +27983,6 @@ O:0:0:0:0 B:BITE:POISON:2d6 B:STING:BLIND:1d1 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:IM_POIS @@ -28923,7 +28037,6 @@ I:110:1d1:30:1:10 W:10:3:10:0 E:0:0:0:0:0:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -28939,7 +28052,6 @@ B:BITE:POISON:1d10 B:CLAW:HURT:1d4 F:AI_ANNOY F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_60 @@ -28964,7 +28076,6 @@ I:110:1d1:40:250:3 W:0:4:730:0 E:0:1:1:2:1:1 O:0:0:1:0 -F:BASEANGBAND F:CAN_SPEAK F:FEMALE F:FORCE_MAXHP @@ -28986,7 +28097,6 @@ I:110:1d1:40:250:3 W:0:0:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FORCE_MAXHP F:GOOD @@ -29013,7 +28123,6 @@ B:HIT:HURT:2d10 B:WAIL:PARALYZE:2d6 B:TOUCH:EXP_80:4d8 B:TOUCH:EXP_80:4d8 -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:CAN_SWIM @@ -29050,7 +28159,6 @@ O:50:50:0:0 B:HIT:HURT:2d6 B:PUNCH:HURT:1d7 B:KICK:HURT:1d8 -F:BASEANGBAND F:CAN_SWIM F:FORCE_MAXHP F:NO_CONF @@ -29065,7 +28173,6 @@ G:G:D I:120:5d5:30:50:10 W:30:3:10:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -29078,7 +28185,6 @@ G:G:D I:130:10d10:30:100:10 W:95:3:10:0 O:0:0:0:0 -F:BASEANGBAND F:NO_CUT F:POSSESSOR F:SMART @@ -29094,7 +28200,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:POISON:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -29117,7 +28222,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -29146,7 +28250,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -29195,7 +28298,6 @@ W:19:1:40:64 E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HALLU:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_POIS @@ -29219,7 +28321,6 @@ B:HIT:HURT:8d12 B:HIT:HURT:8d12 B:HIT:HURT:8d12 F:AQUATIC -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:CAN_SWIM @@ -29360,7 +28461,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:SPORE:HURT:4d4 B:SPORE:HURT:4d4 -F:BASEANGBAND F:CAN_SWIM F:EMPTY_MIND F:IM_FIRE @@ -29384,7 +28484,6 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:1d7 B:HIT:HURT:1d7 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -29411,7 +28510,6 @@ E:1:1:1:2:1:1 O:25:55:0:20 B:HIT:HURT:1d8 B:HIT:HURT:1d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -29438,7 +28536,6 @@ B:BITE:HURT:2d6 B:BITE:HURT:2d6 B:BITE:HURT:2d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -29465,7 +28562,6 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_1D2 @@ -29497,7 +28593,6 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:KICK:HURT:10d2 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -29532,7 +28627,6 @@ B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:BITE:EXP_80:5d6 B:BITE:EXP_80:5d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -29578,7 +28672,6 @@ B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_2D2 @@ -29615,7 +28708,6 @@ O:0:0:100:0 B:HIT:HURT:2d6 B:HIT:HURT:2d6 B:HIT:HURT:2d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -29650,7 +28742,6 @@ B:SPIT:FIRE:3d4 B:SPIT:ELEC:3d4 F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_GREAT @@ -29688,7 +28779,6 @@ B:STING:POISON:3d4 B:SPIT:ELEC:3d4 B:CRUSH:HURT:6d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_90 @@ -29720,7 +28810,6 @@ B:STING:POISON:3d4 B:SPIT:FIRE:3d4 B:HIT:LOSE_STR:3d4 F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -29749,7 +28838,6 @@ B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 B:HIT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -29784,7 +28872,6 @@ B:HIT:FIRE:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_1D2 @@ -29824,7 +28911,6 @@ B:KICK:HURT:10d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_2D2 @@ -29863,7 +28949,6 @@ B:KICK:HURT:20d2 B:KICK:HURT:10d2 B:HIT:POISON:20d1 B:HIT:PARALYZE:15d1 -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -29902,7 +28987,6 @@ O:0:50:50:0 B:HIT:HURT:3d4 B:HIT:UN_BONUS:3d4 B:HIT:UN_POWER:1d5 -F:BASEANGBAND F:BASH_DOOR F:DEMON F:DROP_60 @@ -29939,7 +29023,6 @@ W:4:1:900:18 E:1:1:1:2:1:1 O:0:50:0:30 B:HIT:HURT:1d6 -F:BASEANGBAND F:DROP_60 F:DROP_CORPSE F:DROP_SKELETON @@ -29966,7 +29049,6 @@ E:1:1:1:2:1:1 O:0:70:25:0 B:HIT:HURT:3d8 B:HIT:HURT:3d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -29997,7 +29079,6 @@ B:CLAW:HURT:4d12 B:BITE:CONFUSE:6d14 B:BITE:CONFUSE:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -30037,7 +29118,6 @@ B:KICK:HURT:8d2 B:KICK:HURT:8d2 B:KICK:HURT:8d2 B:KICK:HURT:8d2 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -30071,7 +29151,6 @@ B:CLAW:HURT:4d12 B:BITE:HURT:6d14 B:BITE:HURT:6d14 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -30107,7 +29186,6 @@ E:0:1:0:2:1:0 O:0:0:0:0 B:BITE:EAT_LITE:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_SWIM F:DROP_CORPSE F:MORTAL @@ -30127,7 +29205,6 @@ B:CLAW:HURT:3d2 B:BITE:DISEASE:4d2 B:BITE:DISEASE:4d2 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -30148,7 +29225,6 @@ E:1:1:1:2:1:1 O:0:20:80:0 B:HIT:HURT:2d3 B:HIT:HURT:2d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -30175,7 +29251,6 @@ E:0:0:0:0:0:0 O:0:0:0:0 B:BITE:HURT:1d2 F:ANIMAL -F:BASEANGBAND F:CAN_FLY F:MORTAL F:RAND_25 @@ -30272,7 +29347,6 @@ B:HIT:HURT:1d7 B:HIT:HURT:2d3 B:HIT:EAT_GOLD:5d5 B:HIT:EAT_ITEM:5d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:DROP_90 @@ -30325,7 +29399,6 @@ B:HIT:UN_BONUS:8d8 B:HIT:UN_BONUS:8d8 B:HIT:LOSE_STR:6d6 B:HIT:LOSE_STR:6d6 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -30364,7 +29437,6 @@ E:1:1:1:2:1:1 O:0:100:0:0 B:HIT:HURT:4d3 B:HIT:HURT:4d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_1D2 F:DROP_CORPSE @@ -30388,7 +29460,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:EMPTY_MIND @@ -30423,7 +29494,6 @@ W:14:2:900:50 E:1:1:1:2:1:1 O:20:0:80:0 B:HIT:HURT:1d5 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_SKELETON @@ -30476,7 +29546,6 @@ I:110:9d8:10:10:3 W:15:3:1000:0 B:HIT:HURT:5d8 B:HIT:HURT:5d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:FORCE_SLEEP @@ -30504,7 +29573,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DROP_CORPSE @@ -30530,7 +29598,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -30556,7 +29623,6 @@ B:CLAW:HURT:1d8 B:CLAW:HURT:1d8 B:BITE:HURT:1d6 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -30606,7 +29672,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30634,7 +29699,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30662,7 +29726,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30691,7 +29754,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30719,7 +29781,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30747,7 +29808,6 @@ B:CLAW:HURT:3d3 B:CLAW:HURT:3d3 B:BITE:HURT:3d5 F:ATTR_MULTI -F:BASEANGBAND F:BASH_DOOR F:DRAGON F:DROP_60 @@ -30784,7 +29844,6 @@ B:BUTT:HURT:4d6 B:BUTT:HURT:4d6 B:BUTT:HURT:3d6 B:BUTT:HURT:3d6 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -30806,7 +29865,6 @@ B:CLAW:POISON:5d4 B:BITE:FIRE:5d4 B:BITE:ELEC:5d4 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_60 F:DROP_CORPSE @@ -30844,7 +29902,6 @@ B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:CLAW:POISON:4d4 B:BITE:HURT:5d5 -F:BASEANGBAND F:DROP_CORPSE F:EMPTY_MIND F:EVIL @@ -30869,7 +29926,6 @@ B:GAZE:TIME:10d10 B:GAZE:INSANITY:10d10 B:GAZE:INSANITY:10d5 F:AURA_COLD -F:BASEANGBAND F:COLD_BLOOD F:DROP_3D2 F:DROP_4D2 @@ -30921,7 +29977,6 @@ B:HIT:INSANITY:5d6 B:HIT:INSANITY:6d6 B:HIT:INSANITY:7d6 B:HIT:INSANITY:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_MULTI @@ -30970,7 +30025,6 @@ B:HIT:COLD:4d12 B:CRUSH:HURT:3d12 B:TOUCH:UN_POWER F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -31017,7 +30071,6 @@ O:60:0:40:0 B:HIT:HURT:4d6 B:HIT:HURT:4d6 B:HIT:HURT:4d6 -F:BASEANGBAND F:BASH_DOOR F:CHAR_MULTI F:COLD_BLOOD @@ -31055,7 +30108,6 @@ E:1:1:1:2:1:1 O:0:0:0:0 B:INSULT:* F:AI_ANNOY -F:BASEANGBAND F:BASH_DOOR F:CAN_SPEAK F:DROP_60 @@ -31082,7 +30134,6 @@ W:0:1:1500:0 E:1:1:1:2:1:1 O:0:0:0:0 B:HIT:HURT:1d3 -F:BASEANGBAND F:BASH_DOOR F:DROP_90 F:DROP_CORPSE @@ -31109,7 +30160,6 @@ B:CLAW:HURT:1d4 E:0:1:0:2:1:0 O:0:0:0:0 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:FORCE_SLEEP @@ -31191,7 +30241,6 @@ B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 B:HIT:POISON:5d5 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:FORCE_SLEEP @@ -31230,7 +30279,6 @@ I:110:1d1:40:250:3 W:0:0:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FEMALE F:FORCE_MAXHP @@ -31254,7 +30302,6 @@ I:110:1d1:40:250:3 W:60:1:730:0 E:0:1:1:2:1:1 O:0:0:0:1 -F:BASEANGBAND F:CAN_SPEAK F:FORCE_MAXHP F:GOOD @@ -31282,7 +30329,6 @@ B:HIT:FIRE:3d6 B:HIT:FIRE:3d6 F:AI_PLAYER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:HAS_LITE F:IM_FIRE @@ -31309,7 +30355,6 @@ B:HIT:TIME:24d10 B:HIT:INSANITY:24d10 B:HIT:LOSE_ALL:24d10 F:AURA_FIRE -F:BASEANGBAND F:CAN_FLY F:CAN_SPEAK F:DROP_1D2 @@ -31385,7 +30430,6 @@ E:0:1:1:2:0:0 O:25:0:75:0 B:TOUCH:EXP_80:10d10 B:TOUCH:EXP_80:10d10 -F:BASEANGBAND F:COLD_BLOOD F:EMPTY_MIND F:INVISIBLE @@ -31408,7 +30452,6 @@ B:CRAWL:POISON:10d10 B:CRAWL:EAT_ITEM:10d9 B:BITE:UN_BONUS:9d9 F:AI_ANNOY -F:BASEANGBAND F:FRIENDS F:PASS_WALL F:SPIRIT @@ -31426,7 +30469,6 @@ O:0:0:0:0 B:TOUCH:LOSE_DEX:2d3 B:TOUCH:PARALYZE:1d12 B:TOUCH:PARALYZE:1d12 -F:BASEANGBAND F:NO_SLEEP F:PASS_WALL F:SPIRIT @@ -31451,7 +30493,6 @@ B:ENGULF:CONFUSE:16d8 B:ENGULF:CONFUSE:16d8 F:ATTR_MULTI F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EMPTY_MIND @@ -31482,8 +30523,6 @@ B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 B:HIT:SHATTER:18d18 B:HIT:CONFUSE:18d18 -F:BASEANGBAND -F:BASEANGBAND F:BASH_DOOR F:DROP_4D2 F:DROP_CORPSE @@ -31517,7 +30556,6 @@ B:BITE:HURT:14d18 F:AURA_COLD F:AURA_ELEC F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DRAGON @@ -31589,7 +30627,6 @@ O:25:20:25:20 B:BITE:POISON:15d15 B:BITE:POISON:15d15 B:BITE:LOSE_ALL:10d12 -F:BASEANGBAND F:BASH_DOOR F:CAN_SWIM F:DROP_2D2 @@ -31619,7 +30656,6 @@ B:GAZE:UN_BONUS:12d12 B:GAZE:UN_POWER:12d10 B:GAZE:INSANITY:12d14 B:GAZE:LOSE_ALL:6d6 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:EVIL @@ -31653,7 +30689,6 @@ B:TOUCH:UN_POWER:12d10 B:TOUCH:INSANITY:12d14 B:TOUCH:LOSE_ALL:6d6 F:ATTR_CLEAR -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:CHAR_CLEAR @@ -31689,7 +30724,6 @@ B:CRAWL:POISON:12d14 B:CRAWL:EAT_FOOD:12d14 B:TOUCH:ACID:13d15 B:HIT:HURT:13d15 -F:BASEANGBAND F:BASH_DOOR F:EMPTY_MIND F:EMPTY_MIND @@ -31721,7 +30755,6 @@ B:BITE:HURT:12d12 B:BITE:HURT:12d12 B:BITE:HURT:12d8 B:BITE:HURT:12d8 -F:BASEANGBAND F:BASH_DOOR F:ESCORT F:ESCORTS @@ -31742,7 +30775,6 @@ B:WAIL:TERRIFY:8d9 B:HIT:HURT:10d10 B:HIT:ABOMINATION:6d10 B:HIT:ABOMINATION:6d10 -F:BASEANGBAND F:COLD_BLOOD F:EVIL F:HURT_LITE @@ -31773,7 +30805,6 @@ O:0:100:0:0 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 B:HIT:LOSE_STR:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -31800,7 +30831,6 @@ O:0:0:100:0 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 B:HIT:LOSE_INT:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -31833,7 +30863,6 @@ O:0:50:50:0 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 B:HIT:LOSE_WIS:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -31863,7 +30892,6 @@ O:0:50:25:25 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 B:HIT:LOSE_DEX:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -31888,7 +30916,6 @@ O:0:50:0:50 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 B:HIT:LOSE_CON:4d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_2D2 F:EVIL @@ -31911,7 +30938,6 @@ O:70:10:10:10 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 B:HIT:LOSE_CHR:4d8 -F:BASEANGBAND F:DROP_2D2 F:EVIL F:IM_ACID @@ -31944,7 +30970,6 @@ B:HIT:FIRE:10d8 B:HIT:FIRE:10d8 F:AI_ANNOY F:AURA_FIRE -F:BASEANGBAND F:HAS_LITE F:IM_FIRE F:SPIRIT @@ -31964,7 +30989,6 @@ B:HIT:COLD:10d8 B:HIT:COLD:10d8 B:HIT:COLD:10d8 F:AURA_COLD -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:IM_COLD @@ -31984,7 +31008,6 @@ O:25:60:0:15 B:HIT:ACID:10d8 B:HIT:ACID:10d8 B:HIT:ACID:10d8 -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:KILL_TREES @@ -32005,7 +31028,6 @@ B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 B:HIT:ELEC:10d8 F:AURA_ELEC -F:BASEANGBAND F:BASH_DOOR F:IM_ELEC F:SPIRIT @@ -32026,7 +31048,6 @@ B:HIT:FIRE:11d12 B:CRUSH:HURT:10d12 B:TOUCH:UN_POWER F:AURA_FIRE -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:DEMON @@ -32061,7 +31082,6 @@ B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:TOUCH:EXP_80:20d8 B:TOUCH:EXP_40:20d8 -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:IM_COLD @@ -32096,7 +31116,6 @@ B:HIT:HURT:10d9 B:HIT:HURT:9d9 B:BITE:EXP_80:9d9 B:BITE:EXP_80:9d9 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -32139,7 +31158,6 @@ B:HIT:SHATTER:18d10 B:HIT:SHATTER:18d10 B:HIT:LOSE_ALL:8d8 B:TOUCH:UN_POWER -F:BASEANGBAND F:BASH_DOOR F:IM_ACID F:IM_COLD @@ -32177,7 +31195,6 @@ B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 B:TOUCH:TIME:6d12 F:ANIMAL -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -32203,7 +31220,6 @@ B:TOUCH:EAT_GOLD:7d15 B:TOUCH:EAT_GOLD:7d15 B:HIT:POISON:6d12 B:HIT:POISON:6d12 -F:BASEANGBAND F:BASH_DOOR F:COLD_BLOOD F:DROP_4D2 @@ -32238,7 +31254,6 @@ O:0:10:90:0 B:HIT:HURT:14d14 B:HIT:HURT:14d14 B:HIT:HURT:14d14 -F:BASEANGBAND F:BASH_DOOR F:EVIL F:HAS_LITE @@ -32263,7 +31278,6 @@ E:0:1:0:6:1:0 B:CLAW:HURT:14d10 B:CLAW:HURT:14d10 B:BITE:HURT:17d10 -F:BASEANGBAND F:CAN_FLY F:EVIL F:INVISIBLE @@ -32294,7 +31308,6 @@ O:10:90:0:0 B:HIT:HURT:10d10 B:HIT:HURT:10d10 B:HIT:HURT:10d10 -F:BASEANGBAND F:BASH_DOOR F:EVIL F:HAS_LITE @@ -32369,7 +31382,6 @@ O:0:50:50:0 B:HIT:HURT:1d8 B:HIT:POISON:1d8 B:TOUCH:EXP_40 -F:BASEANGBAND F:BASH_DOOR F:CAN_FLY F:COLD_BLOOD @@ -32403,7 +31415,6 @@ B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 B:HIT:HURT:10d8 -F:BASEANGBAND F:BASH_DOOR F:DROP_CORPSE F:DROP_SKELETON @@ -32435,7 +31446,6 @@ B:EXPLODE:HURT:20d20 B:EXPLODE:HURT:20d20 B:EXPLODE:HURT:20d20 F:AURA_FIRE -F:BASEANGBAND F:EMPTY_MIND F:FORCE_DEPTH F:FORCE_MAXHP diff --git a/lib/mods/theme/edit/re_info.txt b/lib/mods/theme/edit/re_info.txt index 9b89f19d..f71da68d 100644 --- a/lib/mods/theme/edit/re_info.txt +++ b/lib/mods/theme/edit/re_info.txt @@ -199,7 +199,6 @@ B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 B:*:*:+0d+1 -F:BASEANGBAND F:R_CHAR_k F:R_CHAR_o F:R_CHAR_y @@ -216,7 +215,6 @@ B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 B:*:*:+1d+2 -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_P F:R_CHAR_T @@ -229,7 +227,6 @@ N:7:Shaman G:*:r I:+0:%90d%100:+10:%90:+0 W:+2:1:%90:%120:A -F:BASEANGBAND F:R_CHAR_k F:R_CHAR_n F:R_CHAR_o @@ -247,7 +244,6 @@ N:8:Priest G:*:G I:+0:%90d%100:+10:%90:+0 W:+3:2:%90:%120:A -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_P F:R_CHAR_T @@ -271,7 +267,6 @@ B:*:*:+0d+0 B:*:*:+0d+0 B:HIT:HURT:=2d=8 B:HIT:HURT:=2d=8 -F:BASEANGBAND F:R_CHAR_O M:DROP_1D2 M:FORCE_MAXHP @@ -289,7 +284,6 @@ N:10:Archer G:*:W I:+0:+0d+0:+0:+0:+0 W:+1:1:%100:%110:A -F:BASEANGBAND F:R_CHAR_O F:R_CHAR_k F:R_CHAR_o diff --git a/src/monster_race_flag_list.hpp b/src/monster_race_flag_list.hpp index 4754ce2b..b9d2b079 100644 --- a/src/monster_race_flag_list.hpp +++ b/src/monster_race_flag_list.hpp @@ -133,7 +133,6 @@ RF(5, 9, WILD_MOUNTAIN) RF(5, 10, WILD_GRASS) RF(5, 11, NO_CUT) RF(5, 15, JOKEANGBAND) -RF(5, 16, BASEANGBAND) RF(5, 31, WILD_TOO) RF(6, 0, DROP_CORPSE) -- cgit v1.2.3 From c0d3818fa0a3859d5f6cd923488ac3244d3c00d6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Use ANGBAND_TERM_MAX instead of literal 8 (This won't cover nearly all cases, but it helps a little.) --- src/cmd4.cc | 10 +++++----- src/loadsave.cc | 22 +++++++++++++++++----- src/object1.cc | 4 ++-- src/variable.cc | 4 ++-- src/xtra1.cc | 18 +++++++++--------- 5 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/cmd4.cc b/src/cmd4.cc index f7317cb1..7c878ae7 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -834,7 +834,7 @@ static void do_cmd_options_win() /* Memorize old flags */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Acquire current flags */ old_flag[j] = window_flag[j]; @@ -851,7 +851,7 @@ static void do_cmd_options_win() prt("Window Flags (, t, y, n, ESC) ", 0, 0); /* Display the windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { byte a = TERM_WHITE; @@ -881,7 +881,7 @@ static void do_cmd_options_win() Term_putstr(0, i + 5, -1, a, str); /* Display the windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { byte a = TERM_WHITE; @@ -918,7 +918,7 @@ static void do_cmd_options_win() case 't': { /* Clear windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { window_flag[j] &= ~(1L << y); } @@ -968,7 +968,7 @@ static void do_cmd_options_win() } /* Notice changes */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; diff --git a/src/loadsave.cc b/src/loadsave.cc index 2ef44ca8..e98b832c 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1592,13 +1592,19 @@ static void do_options(ls_flag_t flag) /*** Window Options ***/ /* Read the window flags */ - for (n = 0; n < 8; n++) do_u32b(&oflag[n], flag); + for (n = 0; n < ANGBAND_TERM_MAX; n++) + { + do_u32b(&oflag[n], flag); + } /* Read the window masks */ - for (n = 0; n < 8; n++) do_u32b(&mask[n], flag); + for (n = 0; n < ANGBAND_TERM_MAX; n++) + { + do_u32b(&mask[n], flag); + } /* Analyze the options */ - for (n = 0; n < 8; n++) + for (n = 0; n < ANGBAND_TERM_MAX; n++) { /* Analyze the options */ for (i = 0; i < 32; i++) @@ -1633,10 +1639,16 @@ static void do_options(ls_flag_t flag) /*** Window options ***/ /* Dump the flags */ - for (i = 0; i < 8; i++) do_u32b(&window_flag[i], flag); + for (i = 0; i < ANGBAND_TERM_MAX; i++) + { + do_u32b(&window_flag[i], flag); + } /* Dump the masks */ - for (i = 0; i < 8; i++) do_u32b(&window_mask[i], flag); + for (i = 0; i < ANGBAND_TERM_MAX; i++) + { + do_u32b(&window_mask[i], flag); + } } } diff --git a/src/object1.cc b/src/object1.cc index 34c22a4a..3fb2ef26 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -4367,7 +4367,7 @@ void toggle_inven_equip() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Unused */ if (!angband_term[j]) continue; @@ -4855,7 +4855,7 @@ static bool_ get_item_floor(int *cp, cptr pmt, cptr str, int mode, object_filter int ne = 0; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Unused */ if (!angband_term[j]) continue; diff --git a/src/variable.cc b/src/variable.cc index 7aae4187..1bcab738 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -258,8 +258,8 @@ char *macro__buf; /* * The array of window options */ -u32b window_flag[8]; -u32b window_mask[8]; +u32b window_flag[ANGBAND_TERM_MAX]; +u32b window_mask[ANGBAND_TERM_MAX]; /* diff --git a/src/xtra1.cc b/src/xtra1.cc index 7141630e..05bf40b3 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1087,7 +1087,7 @@ static void fix_inven() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1121,7 +1121,7 @@ static void fix_equip() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1153,7 +1153,7 @@ static void fix_player() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1193,7 +1193,7 @@ void fix_message() int x, y; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1246,7 +1246,7 @@ static void fix_overhead() int cy, cx; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1279,7 +1279,7 @@ static void fix_monster() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1315,7 +1315,7 @@ static void fix_object() int j; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1355,7 +1355,7 @@ static void fix_m_list() std::vector(r_info.size(), 0); /* Scan windows */ - for (std::size_t j = 0; j < 8; j++) + for (std::size_t j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -4226,7 +4226,7 @@ void window_stuff() if (!p_ptr->window) return; /* Scan windows */ - for (j = 0; j < 8; j++) + for (j = 0; j < ANGBAND_TERM_MAX; j++) { /* Save usable flags */ if (angband_term[j]) mask |= window_flag[j]; -- cgit v1.2.3 From 3a2f725a7f6f83d1284304d37dc83288d5d61fc6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Extract duplicated code for all the fix_* functions --- src/xtra1.cc | 232 +++++++++++------------------------------------------------ 1 file changed, 43 insertions(+), 189 deletions(-) diff --git a/src/xtra1.cc b/src/xtra1.cc index 05bf40b3..dcfb4b3d 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -1079,15 +1079,16 @@ static void prt_frame() } -/* - * Hack -- display inventory in sub-windows +/** + * Fix up each terminal based on whether a window flag + * is set. */ -static void fix_inven() -{ - int j; +namespace { // anonymous - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) +template +static void fixup_display(u32b mask, F callback) +{ + for (int j = 0; j < ANGBAND_TERM_MAX; j++) { term *old = Term; @@ -1095,13 +1096,13 @@ static void fix_inven() if (!angband_term[j]) continue; /* No relevant flags */ - if (!(window_flag[j] & (PW_INVEN))) continue; + if (!(window_flag[j] & mask)) continue; /* Activate */ Term_activate(angband_term[j]); - /* Display inventory */ - display_inven(); + /* Apply fixup callback */ + callback(); /* Fresh */ Term_fresh(); @@ -1111,38 +1112,23 @@ static void fix_inven() } } +} // namespace anonymous +/* + * Hack -- display inventory in sub-windows + */ +static void fix_inven() +{ + fixup_display(PW_INVEN, display_inven); +} + /* * Hack -- display equipment in sub-windows */ static void fix_equip() { - int j; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_EQUIP))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - - /* Display equipment */ - display_equip(); - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + fixup_display(PW_EQUIP, display_equip); } /* @@ -1150,31 +1136,9 @@ static void fix_equip() */ static void fix_player() { - int j; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_PLAYER))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - - /* Display player */ + fixup_display(PW_PLAYER, [] { display_player(0); - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + }); } @@ -1188,29 +1152,13 @@ void fix_message() { auto const &messages = game->messages; - int j, i; - int w, h; - int x, y; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_MESSAGE))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - + fixup_display(PW_MESSAGE, [&messages] { /* Get size */ + int w, h; Term_get_size(&w, &h); /* Dump messages */ - for (i = 0; i < h; i++) + for (int i = 0; i < h; i++) { auto message = messages.at(i); auto text_with_count = message.text_with_count(); @@ -1219,18 +1167,13 @@ void fix_message() display_message(0, (h - 1) - i, text_with_count.size(), message.color, text_with_count.c_str()); /* Cursor */ + int x, y; Term_locate(&x, &y); /* Clear to end of line */ Term_erase(x, y, 255); } - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + }); } @@ -1241,33 +1184,10 @@ void fix_message() */ static void fix_overhead() { - int j; - - int cy, cx; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_OVERHEAD))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - - /* Redraw map */ + fixup_display(PW_OVERHEAD, [] { + int cy, cx; display_map(&cy, &cx); - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + }); } @@ -1276,34 +1196,13 @@ static void fix_overhead() */ static void fix_monster() { - int j; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_MONSTER))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - + fixup_display(PW_MONSTER, [] { /* Display monster race info */ if (monster_race_idx) { display_roff(monster_race_idx, monster_ego_idx); } - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + }); } @@ -1312,35 +1211,17 @@ static void fix_monster() */ static void fix_object() { - int j; - - /* Scan windows */ - for (j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_OBJECT))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - + fixup_display(PW_OBJECT, [] { /* Clear */ Term_clear(); /* Display object info */ - if (tracked_object) - if (!object_out_desc(tracked_object, NULL, FALSE, FALSE)) text_out("You see nothing special."); - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + if (tracked_object && + !object_out_desc(tracked_object, NULL, FALSE, FALSE)) + { + text_out("You see nothing special."); + } + }); } /* Show the monster list in a window */ @@ -1354,22 +1235,7 @@ static void fix_m_list() static auto r_total_visible = std::vector(r_info.size(), 0); - /* Scan windows */ - for (std::size_t j = 0; j < ANGBAND_TERM_MAX; j++) - { - term *old = Term; - - int c = 0; - - /* No window */ - if (!angband_term[j]) continue; - - /* No relevant flags */ - if (!(window_flag[j] & (PW_M_LIST))) continue; - - /* Activate */ - Term_activate(angband_term[j]); - + fixup_display(PW_M_LIST, [&r_info] { /* Clear */ Term_clear(); @@ -1377,13 +1243,6 @@ static void fix_m_list() if (p_ptr->image) { c_prt(TERM_WHITE, "You can not see clearly", 0, 0); - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - return; } @@ -1394,6 +1253,7 @@ static void fix_m_list() } /* Count up the number visible in each race */ + int c = 0; for (std::size_t i = 1; i < static_cast(m_max); i++) { auto const m_ptr = &m_list[i]; @@ -1490,13 +1350,7 @@ static void fix_m_list() { c_prt(TERM_WHITE, "You see no monsters.", 0, 0); } - - /* Fresh */ - Term_fresh(); - - /* Restore */ - Term_activate(old); - } + }); } -- cgit v1.2.3 From 29f75fd7f5f52b373d714ae9dde6d2c6183694c3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Remove unused PW_SNAPSHOT --- src/defines.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/defines.h b/src/defines.h index fe690e2b..9697129f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -1754,7 +1754,6 @@ #define PW_OVERHEAD 0x00000080L /* Display overhead view */ #define PW_MONSTER 0x00000100L /* Display monster recall */ #define PW_OBJECT 0x00000200L /* Display object recall */ -#define PW_SNAPSHOT 0x00000800L /* Display snap-shot */ /* jk */ -- cgit v1.2.3 From ff8894cc6bec9eeae81b222ec8116e3bb8793174 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Avoid overwriting existing characters for "New Character" Fixes #17 --- src/birth.cc | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/birth.cc b/src/birth.cc index c920854b..7d54d3a3 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -57,6 +57,7 @@ #include "z-rand.hpp" #include +#include #include #include #include @@ -3132,6 +3133,10 @@ savefile_try_again: continue; } + // + // React + // + if (k == 'a') { /* Display prompt */ @@ -3143,7 +3148,34 @@ savefile_try_again: /* Process the player name */ process_player_name(TRUE); - return (TRUE); + // If the savefile already exists, we do *NOT* want to + // create a new game, so we'll need to return FALSE for + // that. + if (boost::filesystem::exists(savefile)) + { + // Show a message so user doesn't get confused. + msg_print(NULL); + + // Prompt for it + prt(fmt::format( + "Character '{}' already exists! Press any key to load.", + game->player_base), + 0, 0); + + // Wait + inkey(); + + // Erase the prompt + prt("", 0, 0); + + // Load character + return FALSE; + } + else + { + // Start new game + return TRUE; + } } if (k == 'b') { -- cgit v1.2.3 From 1eb13ec5a357c43c5366c276dce87fba6f713fc6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:24:42 +0200 Subject: Move alloc_* tables to Game struct We also change the arrays to std::vector<> --- src/alloc.hpp | 29 ++++++++++++++++++++++++++ src/alloc_entry.hpp | 10 ++++----- src/game.hpp | 6 ++++++ src/generate.cc | 3 ++- src/init2.cc | 49 +++++++++++++++++++------------------------- src/monster2.cc | 57 ++++++++++++++++++++++++++++----------------------- src/object2.cc | 59 +++++++++++++++++++++++++++++------------------------ src/store.cc | 5 +++-- src/variable.cc | 28 ------------------------- src/variable.hpp | 5 ----- src/xtra1.cc | 3 ++- 11 files changed, 131 insertions(+), 123 deletions(-) create mode 100644 src/alloc.hpp diff --git a/src/alloc.hpp b/src/alloc.hpp new file mode 100644 index 00000000..1d4ce815 --- /dev/null +++ b/src/alloc.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "h-basic.h" +#include "alloc_entry.hpp" + +#include + +/** + * Allocations of object kinds and monster races. + */ +struct Alloc { + + /* + * The entries in the "kind allocator table" + */ + std::vector kind_table; + + /* + * The flag to tell if kind_table contains valid entries + * for normal (i.e. kind_is_legal) object allocation + */ + bool kind_table_valid = false; + + /* + * The entries in the "race allocator table" + */ + std::vector race_table; + +}; diff --git a/src/alloc_entry.hpp b/src/alloc_entry.hpp index 41ec3b66..5e0e547f 100644 --- a/src/alloc_entry.hpp +++ b/src/alloc_entry.hpp @@ -11,10 +11,10 @@ */ struct alloc_entry { - s16b index; /* The actual index */ + s16b index = -1; /* The actual index */ - byte level; /* Base dungeon level */ - byte prob1; /* Probability, pass 1 */ - byte prob2; /* Probability, pass 2 */ - byte prob3; /* Probability, pass 3 */ + byte level = 0; /* Base dungeon level */ + byte prob1 = 0; /* Probability, pass 1 */ + byte prob2 = 0; /* Probability, pass 2 */ + byte prob3 = 0; /* Probability, pass 3 */ }; diff --git a/src/game.hpp b/src/game.hpp index 37da1cc0..6aaa5d47 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -2,6 +2,7 @@ #include "game_fwd.hpp" +#include "alloc.hpp" #include "birther.hpp" #include "game_edit_data.hpp" #include "grid.hpp" @@ -49,6 +50,11 @@ struct Game { */ std::vector random_artifacts; + /** + * Allocations + */ + Alloc alloc; + /** * Player's un-adjusted HP at every level. * Stored to avoid shenanigans with draininging levels diff --git a/src/generate.cc b/src/generate.cc index 5286532d..3a99a7fa 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -7552,6 +7552,7 @@ static bool_ cave_gen() auto const &r_info = game->edit_data.r_info; auto const &a_info = game->edit_data.a_info; auto &k_info = game->edit_data.k_info; + auto &alloc = game->alloc; auto d_ptr = &d_info[dungeon_type]; @@ -7783,7 +7784,7 @@ static bool_ cave_gen() get_obj_num_hook = kind_is_legal; /* Invalidate the allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; /* Get a local object */ q_ptr = &forge; diff --git a/src/init2.cc b/src/init2.cc index e79ba87c..6e130ac4 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -702,8 +702,7 @@ static errr init_alloc() { auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; - - alloc_entry *table; + auto &alloc = game->alloc; s16b num[MAX_DEPTH_MONSTER]; @@ -717,10 +716,8 @@ static errr init_alloc() /* Clear the "num" array */ memset(num, 0, MAX_DEPTH_MONSTER * sizeof(s16b)); - /* Size of "alloc_kind_table" */ - alloc_kind_size = 0; - /* Scan the objects */ + std::size_t kind_size = 0; for (auto const &k_ref: k_info) { auto k_ptr = &k_ref; @@ -732,7 +729,7 @@ static errr init_alloc() if (k_ptr->chance[j]) { /* Count the entries */ - alloc_kind_size++; + kind_size++; /* Group by level */ num[k_ptr->locale[j]]++; @@ -754,10 +751,8 @@ static errr init_alloc() /*** Initialise object allocation info ***/ /* Allocate the alloc_kind_table */ - alloc_kind_table = make_array(alloc_kind_size); - - /* Access the table entry */ - table = alloc_kind_table; + alloc.kind_table.clear(); + alloc.kind_table.resize(kind_size); /* Scan the objects */ for (std::size_t i = 1; i < k_info.size(); i++) @@ -785,11 +780,12 @@ static errr init_alloc() z = y + aux[x]; /* Load the entry */ - table[z].index = i; - table[z].level = x; - table[z].prob1 = p; - table[z].prob2 = p; - table[z].prob3 = p; + auto &entry = alloc.kind_table[z]; + entry.index = i; + entry.level = x; + entry.prob1 = p; + entry.prob2 = p; + entry.prob3 = p; /* Another entry complete for this locale */ aux[x]++; @@ -806,10 +802,8 @@ static errr init_alloc() /* Clear the "num" array */ memset(num, 0, MAX_DEPTH_MONSTER * sizeof(s16b)); - /* Size of "alloc_race_table" */ - alloc_race_size = 0; - /* Scan the monsters */ + std::size_t race_size = 0; for (auto &r_ref: r_info) { /* Get the i'th race */ @@ -819,7 +813,7 @@ static errr init_alloc() if (r_ptr->rarity) { /* Count the entries */ - alloc_race_size++; + race_size++; /* Group by level */ num[r_ptr->level]++; @@ -840,10 +834,8 @@ static errr init_alloc() /*** Initialise monster allocation info ***/ /* Allocate the alloc_race_table */ - alloc_race_table = make_array(alloc_race_size); - - /* Access the table entry */ - table = alloc_race_table; + alloc.race_table.clear(); + alloc.race_table.resize(race_size); /* Scan the monsters */ for (std::size_t i = 1; i < r_info.size(); i++) @@ -869,11 +861,12 @@ static errr init_alloc() z = y + aux[x]; /* Load the entry */ - table[z].index = i; - table[z].level = x; - table[z].prob1 = p; - table[z].prob2 = p; - table[z].prob3 = p; + auto &entry = alloc.race_table[z]; + entry.index = i; + entry.level = x; + entry.prob1 = p; + entry.prob2 = p; + entry.prob3 = p; /* Another entry complete for this locale */ aux[x]++; diff --git a/src/monster2.cc b/src/monster2.cc index 0cd07c64..624dca53 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -816,27 +816,24 @@ s16b m_pop() */ errr get_mon_num_prep() { - int i; + auto &alloc = game->alloc; /* Scan the allocation table */ - for (i = 0; i < alloc_race_size; i++) + for (auto &&entry: alloc.race_table) { - /* Get the entry */ - alloc_entry *entry = &alloc_race_table[i]; - /* Accept monsters which pass the restriction, if any */ - if ((!get_mon_num_hook || (*get_mon_num_hook)(entry->index)) && - (!get_mon_num2_hook || (*get_mon_num2_hook)(entry->index))) + if ((!get_mon_num_hook || (*get_mon_num_hook)(entry.index)) && + (!get_mon_num2_hook || (*get_mon_num2_hook)(entry.index))) { /* Accept this monster */ - entry->prob2 = entry->prob1; + entry.prob2 = entry.prob1; } /* Do not use this monster */ else { /* Decline this monster */ - entry->prob2 = 0; + entry.prob2 = 0; } } @@ -950,12 +947,12 @@ bool_ summon_hack = FALSE; s16b get_mon_num(int level) { auto const &r_info = game->edit_data.r_info; + auto &alloc = game->alloc; - int i, j, p; - int r_idx; - long value, total; - - alloc_entry *table = alloc_race_table; + std::size_t i, j; + int p; + int r_idx; + long value, total; int in_tome; @@ -991,16 +988,18 @@ s16b get_mon_num(int level) in_tome = strcmp(game_module, "ToME") == 0; /* Process probabilities */ - for (i = 0; i < alloc_race_size; i++) + for (i = 0; i < alloc.race_table.size(); i++) { + auto &entry = alloc.race_table[i]; + /* Monsters are sorted by depth */ - if (table[i].level > level) break; + if (entry.level > level) break; /* Default */ - table[i].prob3 = 0; + entry.prob3 = 0; /* Access the "r_idx" of the chosen monster */ - r_idx = table[i].index; + r_idx = entry.index; /* Access the actual race */ auto r_ptr = &r_info[r_idx]; @@ -1031,10 +1030,10 @@ s16b get_mon_num(int level) if (!summon_hack && !restrict_monster_to_dungeon(r_idx) && dun_level) continue; /* Accept */ - table[i].prob3 = table[i].prob2; + entry.prob3 = entry.prob2; /* Total */ - total += table[i].prob3; + total += entry.prob3; } /* No legal monsters */ @@ -1045,19 +1044,24 @@ s16b get_mon_num(int level) value = rand_int(total); /* Find the monster */ - for (i = 0; i < alloc_race_size; i++) + for (i = 0; i < alloc.race_table.size(); i++) { + auto &entry = alloc.race_table[i]; + /* Found the entry */ - if (value < table[i].prob3) break; + if (value < entry.prob3) break; /* Decrement */ - value = value - table[i].prob3; + value = value - entry.prob3; } /* Power boost */ p = rand_int(100); + /* Shorthand */ + auto &table = alloc.race_table; + /* Try for a "harder" monster once (50%) or twice (10%) */ if (p < 60) { @@ -1068,7 +1072,7 @@ s16b get_mon_num(int level) value = rand_int(total); /* Find the monster */ - for (i = 0; i < alloc_race_size; i++) + for (i = 0; i < table.size(); i++) { /* Found the entry */ if (value < table[i].prob3) break; @@ -1091,7 +1095,7 @@ s16b get_mon_num(int level) value = rand_int(total); /* Find the monster */ - for (i = 0; i < alloc_race_size; i++) + for (i = 0; i < table.size(); i++) { /* Found the entry */ if (value < table[i].prob3) break; @@ -1990,6 +1994,7 @@ static s16b hack_m_idx_ii = 0; s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) { auto &r_info = game->edit_data.r_info; + auto &alloc = game->alloc; int i; char dummy[5]; @@ -2316,7 +2321,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status) } /* Invalidate the cached allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; if (tries) { diff --git a/src/object2.cc b/src/object2.cc index 32ab6de1..2d6ea672 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -512,26 +512,23 @@ s16b o_pop() */ errr get_obj_num_prep() { - int i; - - /* Get the entry */ - alloc_entry *table = alloc_kind_table; + auto &alloc = game->alloc; /* Scan the allocation table */ - for (i = 0; i < alloc_kind_size; i++) + for (auto &&entry: alloc.kind_table) { /* Accept objects which pass the restriction, if any */ - if (!get_obj_num_hook || (*get_obj_num_hook)(table[i].index)) + if (!get_obj_num_hook || (*get_obj_num_hook)(entry.index)) { /* Accept this object */ - table[i].prob2 = table[i].prob1; + entry.prob2 = entry.prob1; } /* Do not use this object */ else { /* Decline this object */ - table[i].prob2 = 0; + entry.prob2 = 0; } } @@ -559,11 +556,12 @@ errr get_obj_num_prep() s16b get_obj_num(int level) { auto const &k_info = game->edit_data.k_info; + auto &alloc = game->alloc; - int i, j, p; + std::size_t i, j; + int p; int k_idx; long value, total; - alloc_entry *table = alloc_kind_table; /* Boost level */ @@ -582,16 +580,18 @@ s16b get_obj_num(int level) total = 0L; /* Process probabilities */ - for (i = 0; i < alloc_kind_size; i++) + for (i = 0; i < alloc.kind_table.size(); i++) { + auto &entry = alloc.kind_table[i]; + /* Objects are sorted by depth */ - if (table[i].level > level) break; + if (entry.level > level) break; /* Default */ - table[i].prob3 = 0; + entry.prob3 = 0; /* Access the index */ - k_idx = table[i].index; + k_idx = entry.index; /* Access the actual kind */ auto k_ptr = &k_info[k_idx]; @@ -600,33 +600,36 @@ s16b get_obj_num(int level) if (opening_chest && (k_ptr->tval == TV_CHEST)) continue; /* Accept */ - table[i].prob3 = table[i].prob2; + entry.prob3 = entry.prob2; /* Total */ - total += table[i].prob3; + total += entry.prob3; } /* No legal objects */ if (total <= 0) return (0); - /* Pick an object */ value = rand_int(total); /* Find the object */ - for (i = 0; i < alloc_kind_size; i++) + for (i = 0; i < alloc.kind_table.size(); i++) { + auto &entry = alloc.kind_table[i]; + /* Found the entry */ - if (value < table[i].prob3) break; + if (value < entry.prob3) break; /* Decrement */ - value = value - table[i].prob3; + value = value - entry.prob3; } - /* Power boost */ p = rand_int(100); + /* Shorthand */ + auto &table = alloc.kind_table; + /* Try for a "better" object once (50%) or twice (10%) */ if (p < 60) { @@ -637,8 +640,9 @@ s16b get_obj_num(int level) value = rand_int(total); /* Find the monster */ - for (i = 0; i < alloc_kind_size; i++) + for (i = 0; i < table.size(); i++) { + /* Found the entry */ if (value < table[i].prob3) break; @@ -660,7 +664,7 @@ s16b get_obj_num(int level) value = rand_int(total); /* Find the object */ - for (i = 0; i < alloc_kind_size; i++) + for (i = 0; i < table.size(); i++) { /* Found the entry */ if (value < table[i].prob3) break; @@ -4631,6 +4635,7 @@ bool_ kind_is_artifactable(int k_idx) bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const &theme) { auto const &k_info = game->edit_data.k_info; + auto &alloc = game->alloc; int invprob, base; @@ -4649,7 +4654,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & if (init_match_theme(theme)) { /* Invalidate the cached allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; } /* Good objects */ @@ -4663,7 +4668,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & } /* Normal objects -- only when the cache is invalidated */ - else if (!alloc_kind_table_valid) + else if (!alloc.kind_table_valid) { /* Activate normal restriction */ get_obj_num_hook = kind_is_legal; @@ -4672,7 +4677,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & get_obj_num_prep(); /* The table is synchronised */ - alloc_kind_table_valid = TRUE; + alloc.kind_table_valid = true; } /* Pick a random object */ @@ -4688,7 +4693,7 @@ bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme const & get_obj_num_prep(); /* The table is synchronised */ - alloc_kind_table_valid = TRUE; + alloc.kind_table_valid = true; } /* Handle failure */ diff --git a/src/store.cc b/src/store.cc index fea51410..a11a3ea8 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1191,6 +1191,7 @@ static void store_create() { auto const &st_info = game->edit_data.st_info; auto const &k_info = game->edit_data.k_info; + auto &alloc = game->alloc; int i = 0, tries, level = 0; @@ -1265,7 +1266,7 @@ static void store_create() i = get_obj_num(level); /* Invalidate the cached allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; /* Handle failure */ if (!i) continue; @@ -1317,7 +1318,7 @@ static void store_create() i = get_obj_num(level); /* Invalidate the cached allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; } if (!i) continue; diff --git a/src/variable.cc b/src/variable.cc index 1bcab738..8a6a71c8 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -340,34 +340,6 @@ u16b max_real_towns; */ town_type *town_info; -/* - * The size of "alloc_kind_table" (at most max_k_idx * ALLOCATIONS_MAX) - */ -s16b alloc_kind_size; - -/* - * The entries in the "kind allocator table" - */ -alloc_entry *alloc_kind_table; - -/* - * The flag to tell if alloc_kind_table contains valid entries - * for normal (i.e. kind_is_legal) object allocation - */ -bool_ alloc_kind_table_valid = FALSE; - - -/* - * The size of "alloc_race_table" (at most max_r_idx) - */ -s16b alloc_race_size; - -/* - * The entries in the "race allocator table" - */ -alloc_entry *alloc_race_table; - - /* * Specify attr/char pairs for visual special effects * Be sure to use "index & 0x7F" to avoid illegal access diff --git a/src/variable.hpp b/src/variable.hpp index 3cb54d3a..734e7773 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -127,11 +127,6 @@ extern monster_type *km_list; extern u16b max_real_towns; extern u16b max_towns; extern town_type *town_info; -extern s16b alloc_kind_size; -extern alloc_entry *alloc_kind_table; -extern bool_ alloc_kind_table_valid; -extern s16b alloc_race_size; -extern alloc_entry *alloc_race_table; extern byte misc_to_attr[256]; extern char misc_to_char[256]; extern byte tval_to_attr[128]; diff --git a/src/xtra1.cc b/src/xtra1.cc index dcfb4b3d..2da31dbb 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -4220,6 +4220,7 @@ static int get_artifact_idx(int level) void gain_fate(byte fate) { auto const &k_info = game->edit_data.k_info; + auto &alloc = game->alloc; int i; int level; @@ -4309,7 +4310,7 @@ void gain_fate(byte fate) fates[i].o_idx = get_obj_num(max_dlv[dungeon_type] + randint(10)); /* Invalidate the cached allocation table */ - alloc_kind_table_valid = FALSE; + alloc.kind_table_valid = false; auto k_ptr = &k_info[fates[i].o_idx]; -- cgit v1.2.3 From 644d50f8f21129100dbe0b5b91b07f80b48ec3c2 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 13 Jun 2017 18:58:48 +0200 Subject: Remove 'duplicated' line adding skill_dev for SKILL_DEVICE Closes #18 --- src/xtra1.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/xtra1.cc b/src/xtra1.cc index 2da31dbb..ae797aa8 100644 --- a/src/xtra1.cc +++ b/src/xtra1.cc @@ -3744,9 +3744,6 @@ void calc_bonuses(bool_ silent) /* Affect Skill -- stealth (bonus one) */ p_ptr->skill_stl += 1; - /* Affect Skill -- magic devices (INT) */ - p_ptr->skill_dev += get_skill_scale(SKILL_DEVICE, 20); - /* Affect Skill -- saving throw (WIS) */ p_ptr->skill_sav += adj_wis_sav[p_ptr->stat_ind[A_WIS]]; -- cgit v1.2.3 From 66cce842a1afc193327c007a8879926c0f84eb91 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Wed, 5 Jul 2017 06:08:18 +0200 Subject: Rename "messages" class to "Messages" Fixes #19 --- src/game.hpp | 2 +- src/messages.cc | 10 +++++----- src/messages.hpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game.hpp b/src/game.hpp index 6aaa5d47..4421d85d 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -65,7 +65,7 @@ struct Game { /** * Message buffer. */ - messages messages { 2048 }; + Messages messages { 2048 }; /** * Game edit data diff --git a/src/messages.cc b/src/messages.cc index ea80451b..071dc66e 100644 --- a/src/messages.cc +++ b/src/messages.cc @@ -5,12 +5,12 @@ #include #include -s16b messages::size() const +s16b Messages::size() const { return buffer.size(); } -message const &messages::at(int age) const +message const &Messages::at(int age) const { assert(age >= 0); assert(age < size()); @@ -22,13 +22,13 @@ message const &messages::at(int age) const return buffer.at(i); } -void messages::add(cptr msg, byte color) +void Messages::add(cptr msg, byte color) { assert(msg != nullptr); add(std::string(msg), color); } -void messages::add(std::string const &msg, byte color) +void Messages::add(std::string const &msg, byte color) { // If the message is the same as the last message, // we just increment the counter instead of adding @@ -47,7 +47,7 @@ void messages::add(std::string const &msg, byte color) buffer.push_back(message); } -void messages::add(message const &m) +void Messages::add(message const &m) { buffer.push_back(m); } diff --git a/src/messages.hpp b/src/messages.hpp index 4c6fb2d3..0443a6c8 100644 --- a/src/messages.hpp +++ b/src/messages.hpp @@ -8,7 +8,7 @@ /** * Game message buffer */ -struct messages final { +class Messages final { private: boost::circular_buffer buffer; @@ -19,7 +19,7 @@ public: * Create message buffer with space for given * number of messages. */ - explicit messages(std::size_t n) + explicit Messages(std::size_t n) : buffer(n) { } -- cgit v1.2.3 From 94080e67843f84cb68e1538990736ab0ee82ab9f Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Move gl_timer to Game struct and change timer_type to class --- src/dungeon.cc | 17 +++---------- src/game.hpp | 6 +++++ src/loadsave.cc | 10 +++----- src/lua_bind.cc | 2 +- src/spells3.cc | 7 +++--- src/timer_type.hpp | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++---- src/util.cc | 15 +++-------- src/variable.cc | 6 ----- src/variable.hpp | 1 - 9 files changed, 89 insertions(+), 48 deletions(-) diff --git a/src/dungeon.cc b/src/dungeon.cc index e7bdf34b..f8671387 100644 --- a/src/dungeon.cc +++ b/src/dungeon.cc @@ -1225,8 +1225,7 @@ static void process_world() auto const &d_info = game->edit_data.d_info; auto const &r_info = game->edit_data.r_info; auto const &f_info = game->edit_data.f_info; - - timer_type *t_ptr; + auto &timers = game->timers; int x, y, i, j; @@ -1269,18 +1268,10 @@ static void process_world() check_music(); } - /* Handle the timers */ - for (t_ptr = gl_timers; t_ptr != NULL; t_ptr = t_ptr->next) + /* Process timers */ + for (auto &&timer: timers) { - if (!t_ptr->enabled) continue; - - t_ptr->countdown--; - if (!t_ptr->countdown) - { - t_ptr->countdown = t_ptr->delay; - assert(t_ptr->callback != NULL); - t_ptr->callback(); - } + timer->count_down(); } /* Check the fate */ diff --git a/src/game.hpp b/src/game.hpp index 4421d85d..9acfc471 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -11,6 +11,7 @@ #include "player_defs.hpp" #include "random_artifact.hpp" #include "skill_type.hpp" +#include "timer_type_fwd.hpp" #include "wilderness_map.hpp" #include @@ -77,4 +78,9 @@ struct Game { */ std::vector s_info; + /** + * Timers + */ + std::vector timers; + }; diff --git a/src/loadsave.cc b/src/loadsave.cc index e98b832c..3d45bf0f 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -1838,13 +1838,11 @@ bool_ load_dungeon(char *ext) */ static void do_timers(ls_flag_t flag) { - timer_type *t_ptr; - - for (t_ptr = gl_timers; t_ptr != NULL; t_ptr = t_ptr->next) + for (auto &&t_ptr: game->timers) { - do_bool(&t_ptr->enabled, flag); - do_s32b(&t_ptr->delay, flag); - do_s32b(&t_ptr->countdown, flag); + do_std_bool(&t_ptr->m_enabled, flag); + do_s32b(&t_ptr->m_delay, flag); + do_s32b(&t_ptr->m_countdown, flag); } } diff --git a/src/lua_bind.cc b/src/lua_bind.cc index c2f924ad..3ca43716 100644 --- a/src/lua_bind.cc +++ b/src/lua_bind.cc @@ -249,7 +249,7 @@ timer_type *TIMER_AGGRAVATE_EVIL = 0; void timer_aggravate_evil_enable() { - TIMER_AGGRAVATE_EVIL->enabled = TRUE; + TIMER_AGGRAVATE_EVIL->enable(); } void timer_aggravate_evil_callback() diff --git a/src/spells3.cc b/src/spells3.cc index 113decf9..58d42cab 100644 --- a/src/spells3.cc +++ b/src/spells3.cc @@ -2447,7 +2447,7 @@ static void stop_inertia_controlled_spell() assert(TIMER_INERTIA_CONTROL != NULL); p_ptr->inertia_controlled_spell = -1; - TIMER_INERTIA_CONTROL->enabled = FALSE; + TIMER_INERTIA_CONTROL->disable(); p_ptr->update = p_ptr->update | PU_MANA; } @@ -2492,9 +2492,8 @@ casting_result meta_inertia_control() } p_ptr->inertia_controlled_spell = s; - TIMER_INERTIA_CONTROL->enabled = TRUE; - TIMER_INERTIA_CONTROL->delay = delay; - TIMER_INERTIA_CONTROL->countdown = delay; + TIMER_INERTIA_CONTROL->set_delay_and_reset(delay); + TIMER_INERTIA_CONTROL->enable(); p_ptr->update |= PU_MANA; msg_format("Inertia flow controlling spell %s.", spell_type_name(spell_at(s))); return CAST_OBVIOUS; diff --git a/src/timer_type.hpp b/src/timer_type.hpp index 0ce6b095..d682b3bd 100644 --- a/src/timer_type.hpp +++ b/src/timer_type.hpp @@ -2,17 +2,80 @@ #include "h-basic.h" +#include + /* * Timer descriptor and runtime data. */ struct timer_type { - timer_type *next; /* The next timer in the list */ +private: + std::function m_callback; + +public: + // + // XXX Currently need public access for loading and saving. + // + bool m_enabled; + s32b m_delay = 0; + s32b m_countdown = 0; + +public: + /** + * Create a new timer + */ + timer_type(std::function callback, s32b delay) + : m_callback(callback) + , m_enabled(false) + , m_delay(delay) + , m_countdown(delay) + { + } + + timer_type(timer_type const &other) = delete; + timer_type &operator =(timer_type const &other) = delete; + + /** + * Enable the timer. + */ + void enable() + { + m_enabled = true; + } + + /** + * Disable the timer. + */ + void disable() + { + m_enabled = false; + } + + /** + * Change delay and reset. + */ + void set_delay_and_reset(s32b delay) + { + m_delay = delay; + m_countdown = delay; + } - bool_ enabled; /* Is it currently counting? */ + /** + * Count down. + */ + void count_down() + { + if (!m_enabled) + { + return; + } - s32b delay; /* Delay between activations */ - s32b countdown; /* The current number of turns passed, when it reaches delay it fires */ + m_countdown--; + if (m_countdown <= 0) + { + m_countdown = m_delay; + m_callback(); + } + } - void (*callback)(); /* The C function to call upon firing */ }; diff --git a/src/util.cc b/src/util.cc index fc8f4080..7d795828 100644 --- a/src/util.cc +++ b/src/util.cc @@ -3642,19 +3642,10 @@ char msg_box_auto(std::string const &text) */ timer_type *new_timer(void (*callback)(), s32b delay) { - timer_type *t_ptr = new timer_type(); - - static_assert(std::is_pod::value, "Cannot memset a non-POD type"); - memset(t_ptr, 0, sizeof(timer_type)); - - t_ptr->next = gl_timers; - gl_timers = t_ptr; - - t_ptr->callback = callback; - t_ptr->delay = delay; - t_ptr->countdown = delay; - t_ptr->enabled = FALSE; + auto &timers = game->timers; + timer_type *t_ptr = new timer_type(callback, delay); + timers.push_back(t_ptr); return t_ptr; } diff --git a/src/variable.cc b/src/variable.cc index 8a6a71c8..7734c26b 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -636,12 +636,6 @@ s32b DUNGEON_ASTRAL = 8; s32b DUNGEON_ASTRAL_WILD_X = 45; s32b DUNGEON_ASTRAL_WILD_Y = 19; -/* - * Timers - */ -timer_type *gl_timers = NULL; - - /** * Get the version string. */ diff --git a/src/variable.hpp b/src/variable.hpp index 734e7773..6dd45d0e 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -190,7 +190,6 @@ extern s32b DUNGEON_ASTRAL; extern s32b DUNGEON_ASTRAL_WILD_X; extern s32b DUNGEON_ASTRAL_WILD_Y; extern deity_type deity_info[MAX_GODS]; -extern timer_type *gl_timers; const char *get_version_string(); extern bool_ arg_wizard; extern bool_ arg_force_original; -- cgit v1.2.3 From d3d6d11eeb74d436c919c480af291d6543606f8e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Remove unnecessary #include --- src/game.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/game.hpp b/src/game.hpp index 9acfc471..f92dbdde 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -14,8 +14,6 @@ #include "timer_type_fwd.hpp" #include "wilderness_map.hpp" -#include - /** * All structures for the game itself. */ -- cgit v1.2.3 From b4dafbb7604b8840c702455022096e8c17c8726b Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: constify EnumStringMap --- src/include/tome/enum_string_map.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/include/tome/enum_string_map.hpp b/src/include/tome/enum_string_map.hpp index 8ae1e115..814827fe 100644 --- a/src/include/tome/enum_string_map.hpp +++ b/src/include/tome/enum_string_map.hpp @@ -29,20 +29,20 @@ public: assert(bimap.size() == in.size()); } - const char *stringify(E e) { + const char *stringify(E e) const { auto i = bimap.left.find(e); assert(i != bimap.left.end() && "Missing mapping for enumerated value"); return i->second.c_str(); } - E parse(const char *s) { + E parse(const char *s) const { E e; bool result = parse(s, &e); assert(result && "Missing string->enum mapping"); return e; } - bool parse(const char *s, E *e) { + bool parse(const char *s, E *e) const { auto i = bimap.right.find(s); if (i == bimap.right.end()) { -- cgit v1.2.3 From 39e1689130e87732cf410aaea7458dfdc399d50e Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Move special_level[] to Game struct Refactor into a multi_array<> to make it more robust. --- src/CMakeLists.txt | 1 + src/birth.cc | 7 ++-- src/cmd4.cc | 2 +- src/game.hpp | 13 +++++++ src/generate.cc | 105 +++++++++++++++++++++++++++++++++------------------ src/init2.cc | 8 ++-- src/level_marker.cc | 12 ++++++ src/level_marker.hpp | 25 ++++++++++++ src/loadsave.cc | 26 ++++++++++++- src/variable.cc | 6 --- src/variable.hpp | 2 - 11 files changed, 152 insertions(+), 55 deletions(-) create mode 100644 src/level_marker.cc create mode 100644 src/level_marker.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4967e826..30ceb76c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,6 +36,7 @@ SET(SRCS_COMMON init1.cc init2.cc joke.cc + level_marker.cc levels.cc loadsave.cc lua_bind.cc diff --git a/src/birth.cc b/src/birth.cc index 7d54d3a3..f677e6e1 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -571,6 +571,7 @@ static void player_wipe() auto &r_info = game->edit_data.r_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &level_markers = game->level_markers; /* Wipe special levels */ wipe_saved(); @@ -585,11 +586,11 @@ static void player_wipe() p_ptr->lives = 0; /* Wipe the towns */ - for (std::size_t i = 0; i < d_info.size(); i++) + for (auto &&i: level_markers) { - for (std::size_t j = 0; j < MAX_DUNGEON_DEPTH; j++) + for (auto &&j: i) { - special_lvl[j][i] = 0; + j = level_marker::NORMAL; } } diff --git a/src/cmd4.cc b/src/cmd4.cc index 7c878ae7..a820da41 100644 --- a/src/cmd4.cc +++ b/src/cmd4.cc @@ -2758,7 +2758,7 @@ void do_cmd_feeling() { char buf[1024]; - if (get_dungeon_save(buf) || generate_special_feeling || (dungeon_flags & DF_DESC_ALWAYS)) + if (get_dungeon_save(buf) || game->generate_special_feeling || (dungeon_flags & DF_DESC_ALWAYS)) { if (!get_level_desc(buf)) msg_print("Someone forgot to describe this level!"); else msg_print(buf); diff --git a/src/game.hpp b/src/game.hpp index f92dbdde..4f84f52c 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -7,6 +7,7 @@ #include "game_edit_data.hpp" #include "grid.hpp" #include "h-basic.h" +#include "level_marker.hpp" #include "messages.hpp" #include "player_defs.hpp" #include "random_artifact.hpp" @@ -14,6 +15,8 @@ #include "timer_type_fwd.hpp" #include "wilderness_map.hpp" +#include + /** * All structures for the game itself. */ @@ -81,4 +84,14 @@ struct Game { */ std::vector timers; + /** + * Level markers for 'special' levels. + */ + boost::multi_array level_markers { }; + + /** + * Generate a special level feeling? + */ + bool generate_special_feeling = false; + }; diff --git a/src/generate.cc b/src/generate.cc index 3a99a7fa..ba485faf 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -8070,17 +8070,27 @@ static bool_ cave_gen() bool_ build_special_level() { auto const &d_info = game->edit_data.d_info; + auto &level_markers = game->level_markers; + + /* No special levels on the surface */ + if (!dun_level) + { + return FALSE; + } + + auto const level = dun_level - d_info[dungeon_type].mindepth; char buf[80]; - int y, x, ystart = 2, xstart = 2; - s16b level; - /* No special levels on the surface */ - if (!dun_level) return FALSE; + if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type])) + { + return FALSE; + } - level = dun_level - d_info[dungeon_type].mindepth; - if ((!get_dungeon_save(buf)) && (special_lvl[level][dungeon_type])) return FALSE; - if (!get_dungeon_special(buf)) return FALSE; + if (!get_dungeon_special(buf)) + { + return FALSE; + } /* Big town */ cur_hgt = MAX_HGT; @@ -8095,9 +8105,9 @@ bool_ build_special_level() panel_col_min = max_panel_cols * (SCREEN_WID / 2); /* Start with perm walls */ - for (y = 0; y < cur_hgt; y++) + for (int y = 0; y < cur_hgt; y++) { - for (x = 0; x < cur_wid; x++) + for (int x = 0; x < cur_wid; x++) { cave_set_feat(y, x, FEAT_PERM_SOLID); } @@ -8109,10 +8119,12 @@ bool_ build_special_level() get_mon_num_prep(); init_flags = INIT_CREATE_DUNGEON | INIT_POSITION; + int ystart = 2; + int xstart = 2; process_dungeon_file(buf, &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE); - special_lvl[level][dungeon_type] = REGEN_HACK; - generate_special_feeling = TRUE; + game->level_markers[level][dungeon_type] = level_marker::REGENERATE; + game->generate_special_feeling = true; /* Special feeling because it's special */ good_item_flag = TRUE; @@ -8133,26 +8145,36 @@ bool_ build_special_level() static void wipe_special_level() { auto const &d_info = game->edit_data.d_info; - - s16b level; - char buf[80]; + auto &level_markers = game->level_markers; /* No special levels on the surface */ - if (!dun_level) return; + if (!dun_level) + { + return; + } + /* Fire off hooks */ process_hooks_new(HOOK_LEVEL_REGEN, NULL, NULL); /* Calculate relative depth */ - level = dun_level - d_info[dungeon_type].mindepth; + auto const level = dun_level - d_info[dungeon_type].mindepth; - /* No special level at this depth */ - if ((!get_dungeon_save(buf)) && - special_lvl[level][dungeon_type]) return; - if (!get_dungeon_special(buf)) return; + /* No special level at this depth? */ + char buf[80]; + if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type])) + { + return; + } + if (!get_dungeon_special(buf)) + { + return; + } /* Clear the Mega-Hack flag */ - if (special_lvl[level][dungeon_type] == REGEN_HACK) - special_lvl[level][dungeon_type] = FALSE; + if (level_markers[level][dungeon_type] == level_marker::REGENERATE) + { + level_markers[level][dungeon_type] = level_marker::NORMAL; + } } /* @@ -8161,26 +8183,36 @@ static void wipe_special_level() static void finalise_special_level() { auto const &d_info = game->edit_data.d_info; - - s16b level; - char buf[80]; + auto &level_markers = game->level_markers; /* No special levels on the surface */ - if (!dun_level) return; + if (!dun_level) + { + return; + } + /* Fire hooks */ process_hooks_new(HOOK_LEVEL_END_GEN, NULL, NULL); /* Calculate relative depth */ - level = dun_level - d_info[dungeon_type].mindepth; + auto const level = dun_level - d_info[dungeon_type].mindepth; - /* No special level at this depth */ - if ((!get_dungeon_save(buf)) && - special_lvl[level][dungeon_type]) return; - if (!get_dungeon_special(buf)) return; + /* No special level at this depth? */ + char buf[80]; + if ((!get_dungeon_save(buf)) && !is_normal_level(level_markers[level][dungeon_type])) + { + return; + } + if (!get_dungeon_special(buf)) + { + return; + } /* Set the "generated" flag */ - if (special_lvl[level][dungeon_type] == REGEN_HACK) - special_lvl[level][dungeon_type] = TRUE; + if (level_markers[level][dungeon_type] == level_marker::REGENERATE) + { + level_markers[level][dungeon_type] = level_marker::SPECIAL; + } } /* @@ -8234,6 +8266,7 @@ void generate_cave() { auto const &d_info = game->edit_data.d_info; auto &a_info = game->edit_data.a_info; + auto const &level_markers = game->level_markers; auto d_ptr = &d_info[dungeon_type]; int tester_1, tester_2; @@ -8244,7 +8277,7 @@ void generate_cave() /* The dungeon is not ready */ character_dungeon = FALSE; - generate_special_feeling = FALSE; + game->generate_special_feeling = false; /* Initialize the flags with the basic dungeon flags */ if (!dun_level) @@ -8302,8 +8335,8 @@ void generate_cave() /* No saved level -- generate new one */ if (!loaded) { - if (!get_dungeon_special(buf) || - !special_lvl[dun_level - d_info[dungeon_type].mindepth][dungeon_type]) + auto const level = dun_level - d_info[dungeon_type].mindepth; + if (!get_dungeon_special(buf) || is_normal_level(level_markers[level][dungeon_type])) { get_level_flags(); } diff --git a/src/init2.cc b/src/init2.cc index 6e130ac4..894e4767 100644 --- a/src/init2.cc +++ b/src/init2.cc @@ -620,6 +620,7 @@ static errr init_other() auto const &r_info = game->edit_data.r_info; auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; + auto &level_markers = game->level_markers; /*** Prepare the "dungeon" information ***/ @@ -647,11 +648,8 @@ static errr init_other() /* Allocate and Wipe the max dungeon level */ max_dlv = make_array(d_info.size()); - /* Allocate and Wipe the special levels */ - for (std::size_t i = 0; i < MAX_DUNGEON_DEPTH; i++) - { - special_lvl[i] = make_array(d_info.size()); - } + /* Allocate level markers */ + level_markers.resize(boost::extents[MAX_DUNGEON_DEPTH][d_info.size()]); /* Allocate and wipe each line of the cave */ cave = new cave_type *[MAX_HGT]; diff --git a/src/level_marker.cc b/src/level_marker.cc new file mode 100644 index 00000000..ee1d8ebe --- /dev/null +++ b/src/level_marker.cc @@ -0,0 +1,12 @@ +#include "level_marker.hpp" + +EnumStringMap const &level_marker_values() +{ + auto static instance = new EnumStringMap { + { level_marker::NORMAL, "normal" }, + { level_marker::SPECIAL, "special" }, + { level_marker::REGENERATE, "regenerate" } + }; + + return *instance; +} diff --git a/src/level_marker.hpp b/src/level_marker.hpp new file mode 100644 index 00000000..07925b70 --- /dev/null +++ b/src/level_marker.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +/** + * Markers for 'special' levels. + */ +enum class level_marker { + NORMAL, + SPECIAL, + REGENERATE +}; + +/** + * Is the level "normal"? + */ +inline bool is_normal_level(level_marker m) +{ + return m == level_marker::NORMAL; +} + +/** + * Bidrectional map between enum and strings. + */ +EnumStringMap const &level_marker_values(); diff --git a/src/loadsave.cc b/src/loadsave.cc index 3d45bf0f..3c843a36 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -454,6 +454,28 @@ static void do_random_spell(random_spell *s_ptr, ls_flag_t flag) do_std_bool(&s_ptr->untried, flag); } +static void do_level_marker(level_marker *marker, ls_flag_t flag) +{ + std::string v; + + if (flag == ls_flag_t::SAVE) + { + v = level_marker_values().stringify(*marker); + } + + do_std_string(v, flag); + + if (flag == ls_flag_t::LOAD) + { + bool valid = level_marker_values().parse(v.c_str(), marker); + if (!valid) + { + note(fmt::format("Bad level marker: {}!", v).c_str()); + abort(); + } + } +} + /* * Misc. other data */ @@ -496,12 +518,12 @@ static bool_ do_extra(ls_flag_t flag) { for (std::size_t j = 0; j < tmp16u; j++) { - do_bool(&special_lvl[j][i], flag); + do_level_marker(&game->level_markers[j][i], flag); } } } - do_bool(&generate_special_feeling, flag); + do_std_bool(&game->generate_special_feeling, flag); /* Load the quick start data */ do_quick_start(flag, game->previous_char); diff --git a/src/variable.cc b/src/variable.cc index 7734c26b..ae40676f 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -576,12 +576,6 @@ s16b plots[MAX_PLOTS]; */ random_quest random_quests[MAX_RANDOM_QUEST]; -/* - * Special levels - */ -bool_ *special_lvl[MAX_DUNGEON_DEPTH]; -bool_ generate_special_feeling = FALSE; - /* * Dungeon flags */ diff --git a/src/variable.hpp b/src/variable.hpp index 6dd45d0e..73d63be7 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -168,8 +168,6 @@ extern bool_ *k_allow_special; extern bool_ *a_allow_special; extern s16b plots[MAX_PLOTS]; extern random_quest random_quests[MAX_RANDOM_QUEST]; -extern bool_ *special_lvl[MAX_DUNGEON_DEPTH]; -extern bool_ generate_special_feeling; DECLARE_FLAG_ZERO_INTF(dungeon_flag_set, dungeon_flags); extern s16b schools_count; extern school_type schools[SCHOOLS_MAX]; -- cgit v1.2.3 From ce584401574381c6bf768893c421045037429dfa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Remove unused birther::god_favor member --- src/birther.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/birther.hpp b/src/birther.hpp index 7b7baa89..0c28b513 100644 --- a/src/birther.hpp +++ b/src/birther.hpp @@ -19,7 +19,6 @@ struct birther byte god; s32b grace; - s32b god_favor; s32b au; -- cgit v1.2.3 From fadfbde89e7fbacf169545d0dcb811b14c3165c8 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 12:53:57 +0200 Subject: Fix Automatizer display bug --- src/squelch/automatizer.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/squelch/automatizer.cc b/src/squelch/automatizer.cc index dbf8fa03..b06367a8 100644 --- a/src/squelch/automatizer.cc +++ b/src/squelch/automatizer.cc @@ -207,7 +207,8 @@ void Automatizer::add_new_condition(std::function ()> std::vector Automatizer::get_rule_names() const { - std::vector names(m_rules.size()); + std::vector names; + names.reserve(m_rules.size()); for (auto const &rule: m_rules) { names.push_back(rule->get_name()); -- cgit v1.2.3 From 0826895cfef9a64b9bafaf12c230aef5087442ee Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 13:01:47 +0200 Subject: Update RELEASE.txt --- doc/RELEASE.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/RELEASE.txt b/doc/RELEASE.txt index ab082315..6a750168 100644 --- a/doc/RELEASE.txt +++ b/doc/RELEASE.txt @@ -1,8 +1,7 @@ Release Checklist: ================== -* Bump version number. +* Bump version number in tables.cc ("modules" variable). * Update changes.txt * Update IS_CVS in defines.h before tagging; undo post-tagging. * Check that system-wide installation succeeds. -* Disable C/C++ compiler sanitization options -- cgit v1.2.3 From 98713a912550668269d072b6dbaf42c8d20889c6 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 13:12:18 +0200 Subject: Update changes.txt --- doc/changes.txt | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/doc/changes.txt b/doc/changes.txt index 7835ab9a..a880e203 100644 --- a/doc/changes.txt +++ b/doc/changes.txt @@ -1,12 +1,38 @@ -T.O.M.E 2.4.x (ah) +T.o.M.E 2.4.0 (ah) Game: -- Removed Alchemist class from ToME module. They were - horribly broken and encouraged only scummy play. They - were also indirectly responsible for a lot of items - that were junk to every other character class. +- Removed traps and related skills. (Thanks to "miramor" for doing + most of the actual work on this.) +- Removed Alchemist class from ToME module. They were horribly broken + and encouraged only scummy play. They were also indirectly + responsible for a lot of items that were junk to every other + character class. +- Remove Runecrafer class. - Increased size of the home drastically. +- Fix "far reaching attack" skill. (Thanks to "miramor".) +- Remove pointless player stats such as "gender", "age", "height", + etc. +- Disallow casting for Posessors when they don't have enought SP. + (aka "Remove system shock".) +- Magic Mapping now maps the whole level instead of only the display + region. +- Summoned monsters appear around summoner instead of player. +- Remove various mostly inconsequential options. +- Use PCG random number generator instead of the old custom one. +- Grant player full monster knowledge. +- Theme: Fix final guardian artifact for Land of Mountains. +- Theme: Remove armor restriction for Eagle/Dragon races. + +Build: + +- Use C++14. +- Use (vendored) "cppformat" for string formatting. +- Use (vendored) "jsoncons" instead of "jansson". +- Produce individual executables for each of the supported platforms + instead of a single executable. + + T.o.M.E 2.3.10 (ah) -- cgit v1.2.3 From 4e9b9c402ed95bf9a17fd6d795bc49bb4128a6fa Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 7 Sep 2017 13:33:19 +0200 Subject: Tag 2.4.0-ah --- src/defines.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/defines.h b/src/defines.h index 9697129f..4a2ad0e0 100644 --- a/src/defines.h +++ b/src/defines.h @@ -37,8 +37,8 @@ */ #ifndef IS_CVS -/* #define IS_CVS " (ah)" */ -#define IS_CVS " (ah, git)" +#define IS_CVS " (ah)" +/* #define IS_CVS " (ah, git)" */ #endif #define USER_PATH_VERSION "/2.4" -- cgit v1.2.3